Plugin Directory

Changeset 3751408


Ignore:
Timestamp:
10/17/2026 04:36:54 AM (17 hours ago)
Author:
printblob
Message:

PrintBlob 1.3.0

Location:
printblob
Files:
36 added
10 deleted
64 edited
1 copied

Legend:

Unmodified
Added
Removed
  • printblob/tags/1.3.0/assets/designer.json

    r3750583 r3751408  
    11{
    2         "$comment": "The designer's fixed numbers, written once: its TypeScript (src/designer/app/sides.ts, host.ts), its PHP and every host of the designer read them here.",
     2        "$comment": "The designer's fixed numbers and the sides PrintBlob prints, written once: its TypeScript (src/designer/app/sides.ts, host.ts), its PHP and every host of the designer read them here. Add-ons add sides (PHP: the printblob_sides filter).",
     3        "sides": [ "front" ],
    34        "stage_width": 1000,
    45        "print_dpi": 300,
  • printblob/tags/1.3.0/build/admin/term-image.asset.php

    r3750583 r3751408  
    33                'jquery'
    44        ),
    5         'version' => 'e08ff7b792227bd5f4fa'
     5        'version' => '26adf56b3d5ffb32e043'
    66);
  • printblob/tags/1.3.0/build/admin/term-image.js

    r3750583 r3751408  
    1 (()=>{"use strict";const t={n:e=>{const i=e&&e.__esModule?()=>e.default:()=>e;return t.d(i,{a:i}),i},d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.hasOwn(t,e)},e=window.jQuery;var i=t.n(e);i()(document).on("click","[data-printblob-term-image] [data-printblob-choose]",function(t){t.preventDefault();const e=i()(this).closest("[data-printblob-term-image]"),n=wp.media({title:window.printblobTermImage.title,button:{text:window.printblobTermImage.button},library:{type:"image"},multiple:!1});n.on("select",function(){const t=n.state().get("selection").first().toJSON(),a=t.sizes?.thumbnail?.url??t.url;e.find('input[name="printblob_image"]').val(t.id),e.find(".printblob-term-image__preview").empty().append(i()("<img>",{src:a,alt:"",width:150})),e.find("[data-printblob-remove]").prop("hidden",!1)}),n.open()}),i()(document).on("click","[data-printblob-term-image] [data-printblob-remove]",function(t){t.preventDefault();const e=i()(this).closest("[data-printblob-term-image]");e.find('input[name="printblob_image"]').val(""),e.find(".printblob-term-image__preview").empty(),i()(this).prop("hidden",!0)}),i()(document).on("ajaxComplete",function(t,e,n){"string"==typeof n.data&&-1!==n.data.indexOf("action=add-tag")&&i()("#addtag [data-printblob-term-image] [data-printblob-remove]").trigger("click")})})();
     1(()=>{"use strict";const t={n:e=>{const i=e&&e.__esModule?()=>e.default:()=>e;return t.d(i,{a:i}),i},d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.hasOwn(t,e)},e=window.jQuery;var i=t.n(e);i()(document).on("click","[data-printblob-term-image] [data-printblob-choose]",function(t){t.preventDefault();const e=i()(this).closest("[data-printblob-term-image]");!function(t){const n=wp.media({title:t.title,button:{text:t.button},library:{type:"image"},multiple:!1});n.on("select",()=>(t=>{const n=t.sizes?.thumbnail?.url??t.url;e.find('input[name="printblob_image"]').val(t.id),e.find(".printblob-term-image__preview").empty().append(i()("<img>",{src:n,alt:"",width:150})),e.find("[data-printblob-remove]").prop("hidden",!1)})(n.state().get("selection").first().toJSON())),n.open()}(printblobTermImage)}),i()(document).on("click","[data-printblob-term-image] [data-printblob-remove]",function(t){t.preventDefault();const e=i()(this).closest("[data-printblob-term-image]");e.find('input[name="printblob_image"]').val(""),e.find(".printblob-term-image__preview").empty(),i()(this).prop("hidden",!0)}),i()(document).on("ajaxComplete",function(t,e,n){"string"==typeof n.data&&-1!==n.data.indexOf("action=add-tag")&&i()("#addtag [data-printblob-term-image] [data-printblob-remove]").trigger("click")})})();
  • printblob/tags/1.3.0/build/designer/render.php

    r3751165 r3751408  
    149149$printblob_config = (array) apply_filters( 'printblob_designer_config', $printblob_config, $printblob_product );
    150150
     151// The "3D · Pro" link, for a shop manager while PrintBlob Pro is not active: decided here, so customers' pages never carry it.
     152$printblob_pro_chip = Pro::storefront_chip();
     153if ( $printblob_pro_chip ) {
     154        $printblob_config['proChip'] = $printblob_pro_chip;
     155}
     156
    151157// A variation that depends on an attribute the designer doesn't offer could only be ordered as the wrong one.
    152158$printblob_offered   = array_merge(
    … …  
    210216                <div class="printblob-designer__stage-column">
    211217                        <div class="printblob-designer__views" aria-hidden="true">
    212                                 <div class="printblob-designer__sides">
    213                                         <?php foreach ( $printblob_sides as $printblob_index => $printblob_entry ) : ?>
    214                                                 <span class="printblob-designer__side<?php echo 0 === $printblob_index ? ' is-current' : ''; ?>"><?php echo esc_html( (string) $printblob_entry['label'] ); ?><span class="printblob-designer__side-dot"></span></span>
    215                                         <?php endforeach; ?>
    216                                 </div>
     218                                <?php if ( count( $printblob_sides ) > 1 ) : ?>
     219                                        <div class="printblob-designer__sides">
     220                                                <?php foreach ( $printblob_sides as $printblob_index => $printblob_entry ) : ?>
     221                                                        <span class="printblob-designer__side<?php echo 0 === $printblob_index ? ' is-current' : ''; ?>"><?php echo esc_html( (string) $printblob_entry['label'] ); ?><span class="printblob-designer__side-dot"></span></span>
     222                                                <?php endforeach; ?>
     223                                        </div>
     224                                <?php endif; ?>
    217225                                <?php foreach ( (array) ( $printblob_config['views'] ?? array() ) as $printblob_view ) : ?>
    218226                                        <span class="printblob-designer__side printblob-designer__side--view printblob-designer__side--<?php echo esc_attr( (string) $printblob_view['key'] ); ?>"><?php echo esc_html( (string) $printblob_view['label'] ); ?></span>
    219227                                <?php endforeach; ?>
     228                                <?php if ( $printblob_pro_chip ) : ?>
     229                                        <a class="printblob-designer__pro-chip" href="<?php echo esc_url( $printblob_pro_chip['href'] ); ?>" title="<?php echo esc_attr( $printblob_pro_chip['title'] ); ?>" target="_blank" rel="noopener" tabindex="-1"><?php echo esc_html( $printblob_pro_chip['label'] ); ?></a>
     230                                <?php endif; ?>
    220231                        </div>
    221232                        <div class="printblob-designer__stage" style="aspect-ratio: <?php echo (int) $printblob_tallest['stage']['width']; ?> / <?php echo (int) $printblob_tallest['stage']['height']; ?>">
  • printblob/tags/1.3.0/build/designer/view-rtl.css

    r3751165 r3751408  
    1 .printblob-designer,.wp-block-printblob-designer{--printblob-ink:var(--wp--preset--color--ink,#1a1d22);--printblob-heather:var(--wp--preset--color--heather,#5f6670);--printblob-seam:var(--wp--preset--color--seam,#e2e4e0);--printblob-cotton:var(--wp--preset--color--cotton,#f6f7f5);--printblob-cobalt:var(--wp--preset--color--cobalt,#2645d6);--printblob-cobalt-deep:var(--wp--preset--color--cobalt-deep,#1b33a6);--printblob-surface:var(--wp--preset--color--white,#fff);--printblob-on-ink:var(--wp--preset--color--white,#fff);--printblob-fill:color-mix(in srgb,var(--printblob-ink) 8%,var(--printblob-surface));--printblob-muted:color-mix(in srgb,var(--printblob-ink) 80%,var(--printblob-surface));--printblob-on-cobalt:#fff;--printblob-radius:var(--wp--custom--printblob--radius,6px);--printblob-field-radius:min(var(--printblob-radius),14px);color:var(--printblob-ink)}.printblob-designer__loading{color:var(--printblob-heather)}.printblob-stack{display:grid}.printblob-stack>*{grid-area:1/1;min-width:0}.printblob-stack>:not(.is-shown){visibility:hidden}.printblob-stack>.printblob-stack__fill{contain:size;overflow:auto;scrollbar-gutter:stable}.printblob-designer__layout{align-items:start;display:grid;gap:clamp(1.5rem,4vw,4rem);grid-template-columns:minmax(0,1.25fr) minmax(320px,.75fr)}@media(max-width:900px){.printblob-designer__layout{grid-template-columns:minmax(0,1fr)}}.printblob-designer__stage-column{position:sticky;top:1.5rem}@media(max-width:900px){.printblob-designer__stage-column{position:static}}.printblob-designer__views{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1rem}.printblob-designer__sides{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);display:inline-flex;gap:.25rem;padding:.25rem}.printblob-designer__side{align-items:center;background:transparent;border:0;border-radius:var(--printblob-radius);color:var(--printblob-muted);cursor:pointer;display:inline-flex;font:inherit;font-weight:560;gap:.45rem;letter-spacing:inherit;padding:.5rem 1.1rem}.printblob-designer__side.is-current,.printblob-designer__side[aria-selected=true]{background:var(--printblob-surface);box-shadow:0 1px 2px rgba(26,29,34,.08);color:var(--printblob-ink)}.printblob-designer__side--view{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);font-weight:640;letter-spacing:.02em;padding:.75rem 1.1rem}.printblob-designer__side--view[aria-pressed=true]{background:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-designer__side--view:disabled{cursor:default;opacity:.6}.printblob-designer__side-dot{background:var(--printblob-cobalt);border-radius:50%;height:7px;width:7px}.printblob-designer__side-dot:not(.is-shown){visibility:hidden}.printblob-designer__stage{align-items:center;background:var(--printblob-cotton);border-radius:10px;display:grid;overflow:hidden;position:relative}.printblob-designer__frame{position:relative}.printblob-designer__canvas,.printblob-designer__shirt{inset:0;position:absolute}.printblob-designer__shirt{display:block;height:100%;width:100%}.printblob-designer__area{border:2px dashed rgba(26,29,34,.35);border-radius:4px;pointer-events:none;position:absolute}.printblob-designer__area.is-on-dark{border-color:hsla(0,0%,100%,.55)}.printblob-designer__canvas .canvas-container,.printblob-designer__canvas canvas{height:100%!important;width:100%!important}.printblob-designer__stage-loading{align-items:center;background:var(--printblob-surface);border-radius:999px;color:var(--printblob-heather);display:flex;font-size:.875rem;gap:.5rem;right:50%;margin:0;padding:.45rem .85rem;position:absolute;top:50%;transform:translate(50%,-50%);white-space:nowrap}.printblob-designer__stage-loading:before{border:2px solid var(--printblob-seam);border-radius:50%;border-top-color:var(--printblob-cobalt);content:"";flex:none;height:.9rem;width:.9rem}@media(prefers-reduced-motion:no-preference){.printblob-designer__stage-loading:before{animation:printblob-turn .8s linear infinite}}@keyframes printblob-turn{to{transform:rotate(-1turn)}}.printblob-designer__hint{color:var(--printblob-heather);font-size:.875rem;margin:.75rem 0 0}.printblob-designer__title{font-size:clamp(1.75rem,3vw,2.5rem);letter-spacing:-.03em;line-height:1.1;margin:0}.printblob-designer__price{font-size:1.375rem;font-weight:560;margin:.5rem 0 0}.printblob-designer__section{border:0;margin:2rem 0 0;padding:0}.printblob-designer__section h2,.printblob-designer__section legend{align-items:baseline;display:flex;font-size:1rem;font-weight:620;gap:.5rem;letter-spacing:-.01em;margin:0 0 .75rem;padding:0}.printblob-designer__choice{color:var(--printblob-heather);font-weight:400}.printblob-designer__row,.printblob-designer__tools{align-items:end;display:flex;flex-wrap:wrap;gap:.6rem}.printblob-designer__workbench{border:1px solid var(--printblob-seam);border-radius:10px;margin-top:1rem}.printblob-designer__items,.printblob-designer__selection,.printblob-designer__tool{align-content:start;display:grid;gap:1rem;padding:1rem}.printblob-designer__items{gap:.6rem}.printblob-designer__items h3{color:var(--printblob-heather);font-size:.875rem;font-weight:560;margin:0}.printblob-designer__items ul{display:grid;gap:.4rem;list-style:none;margin:0;padding:0}.printblob-designer__item{align-items:center;background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);box-sizing:border-box;color:var(--printblob-ink);cursor:pointer;display:flex;font:inherit;gap:.6rem;min-height:2.75rem;padding:.4rem .75rem;text-align:start;width:100%}.printblob-designer__item:hover{outline:1px solid var(--printblob-ink);outline-offset:-1px}.printblob-designer__item img{flex:none;height:1.75rem;object-fit:contain;width:1.75rem}.printblob-designer__item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.printblob-designer__row--actions{gap:1rem}.printblob-button{background:var(--printblob-ink);border:1.5px solid var(--printblob-ink);border-radius:var(--printblob-radius);color:var(--printblob-on-ink);cursor:pointer;font:inherit;font-weight:560;padding:.75rem 1.2rem}.printblob-button:hover:not(:disabled){background:color-mix(in srgb,var(--printblob-ink) 82%,#000)}.printblob-button--quiet{background:transparent;color:var(--printblob-ink)}.printblob-button--quiet:hover:not(:disabled){background:var(--printblob-fill)}.printblob-button--primary{background:var(--printblob-cobalt);border-color:var(--printblob-cobalt);color:var(--printblob-on-cobalt);font-size:1.0625rem;padding:1rem 1.2rem;width:100%}.printblob-button--primary:hover:not(:disabled){background:var(--printblob-cobalt-deep);border-color:var(--printblob-cobalt-deep)}.printblob-button:disabled{cursor:not-allowed;opacity:.55}.printblob-link-button{background:none;border:0;color:var(--printblob-ink);cursor:pointer;font:inherit;font-size:.9375rem;padding:0;text-decoration:underline;text-underline-offset:.18em}.printblob-link-button--danger{color:#b42318}.printblob-field{border:0;color:var(--printblob-heather);display:grid;font-size:.875rem;gap:.35rem;margin:0;padding:0}.printblob-field input[type=number],.printblob-field select,.printblob-field textarea{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-field-radius);box-sizing:border-box;color:var(--printblob-ink);font:inherit;font-size:1rem;max-width:100%;min-width:0;padding:.6rem .75rem;width:100%}.printblob-field textarea{resize:vertical}.printblob-field legend{margin-bottom:.35rem}.printblob-field--qty{max-width:7rem}.printblob-toggle{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:700;padding:.6rem .9rem}.printblob-toggle[aria-pressed=true]{background:var(--printblob-ink);border-color:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-swatches{display:flex;flex-wrap:wrap;gap:.6rem}.printblob-swatch{background:var(--printblob-swatch);border:1px solid color-mix(in srgb,var(--printblob-ink) 22%,transparent);border-radius:50%;cursor:pointer;height:2.25rem;padding:0;position:relative;width:2.25rem}.printblob-swatch[aria-pressed=true]{outline:2px solid var(--printblob-ink);outline-offset:3px}.printblob-swatch--custom{background:conic-gradient(#d7263d,#f4c20d,#1f8a4c,#2645d6,#d7263d);overflow:hidden}.printblob-swatch--custom input{cursor:pointer;inset:0;opacity:0;position:absolute}.printblob-swatches--shirt .printblob-swatch{height:2.6rem;width:2.6rem}.printblob-sizes{display:flex;flex-wrap:wrap;gap:.5rem}.printblob-size{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:560;min-width:3.25rem;padding:.6rem .8rem}.printblob-size[aria-pressed=true]{border-color:var(--printblob-ink);box-shadow:inset 0 0 0 1px var(--printblob-ink)}.printblob-size:disabled{color:var(--printblob-heather);cursor:not-allowed;text-decoration:line-through}.printblob-breakdown{border-top:1px solid var(--printblob-seam);display:grid;gap:.4rem;margin:1.25rem 0;padding:1rem 0 0}.printblob-breakdown div{display:flex;justify-content:space-between}.printblob-breakdown dt{color:var(--printblob-heather)}.printblob-breakdown dd{justify-items:end;margin:0}.printblob-breakdown__none{color:var(--printblob-heather)}.printblob-breakdown__total{font-size:1.125rem;font-weight:620;margin-top:.4rem}.printblob-breakdown__total dt{color:var(--printblob-ink)}.printblob-note{color:var(--printblob-heather);font-size:.9375rem;margin:0}.printblob-note--warn{color:#8a5a00}.printblob-note--error{color:#b42318;margin-top:.75rem}.printblob-note--ok{color:var(--printblob-ink);margin-top:.75rem}:is(.wp-block-printblob-designer,.printblob-designer) :is(button,input,select,textarea,a):focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}
     1.printblob-designer,.wp-block-printblob-designer{--printblob-ink:var(--wp--preset--color--ink,#1a1d22);--printblob-heather:var(--wp--preset--color--heather,#5f6670);--printblob-seam:var(--wp--preset--color--seam,#e2e4e0);--printblob-cotton:var(--wp--preset--color--cotton,#f6f7f5);--printblob-cobalt:var(--wp--preset--color--cobalt,#2645d6);--printblob-cobalt-deep:var(--wp--preset--color--cobalt-deep,#1b33a6);--printblob-surface:var(--wp--preset--color--white,#fff);--printblob-on-ink:var(--wp--preset--color--white,#fff);--printblob-fill:color-mix(in srgb,var(--printblob-ink) 8%,var(--printblob-surface));--printblob-muted:color-mix(in srgb,var(--printblob-ink) 80%,var(--printblob-surface));--printblob-on-cobalt:#fff;--printblob-radius:var(--wp--custom--printblob--radius,6px);--printblob-field-radius:min(var(--printblob-radius),14px);color:var(--printblob-ink)}.printblob-designer__loading{color:var(--printblob-heather)}.printblob-stack{display:grid}.printblob-stack>*{grid-area:1/1;min-width:0}.printblob-stack>:not(.is-shown){visibility:hidden}.printblob-stack>.printblob-stack__fill{contain:size;overflow:auto;scrollbar-gutter:stable}.printblob-designer__layout{align-items:start;display:grid;gap:clamp(1.5rem,4vw,4rem);grid-template-columns:minmax(0,1.25fr) minmax(320px,.75fr)}@media(max-width:900px){.printblob-designer__layout{grid-template-columns:minmax(0,1fr)}}.printblob-designer__stage-column{position:sticky;top:1.5rem}@media(max-width:900px){.printblob-designer__stage-column{position:static}}.printblob-designer__views{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1rem}.printblob-designer__sides{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);display:inline-flex;gap:.25rem;padding:.25rem}.printblob-designer__side{align-items:center;background:transparent;border:0;border-radius:var(--printblob-radius);color:var(--printblob-muted);cursor:pointer;display:inline-flex;font:inherit;font-weight:560;gap:.45rem;letter-spacing:inherit;padding:.5rem 1.1rem}.printblob-designer__side.is-current,.printblob-designer__side[aria-selected=true]{background:var(--printblob-surface);box-shadow:0 1px 2px rgba(26,29,34,.08);color:var(--printblob-ink)}.printblob-designer__side--view{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);font-weight:640;letter-spacing:.02em;padding:.75rem 1.1rem}.printblob-designer__side--view[aria-pressed=true]{background:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-designer__side--view:disabled{cursor:default;opacity:.6}.printblob-designer__pro-chip{align-items:center;border-radius:999px;box-shadow:inset 0 0 0 1px var(--printblob-seam);color:var(--printblob-cobalt);display:inline-flex;font-size:.875em;font-weight:640;letter-spacing:.02em;line-height:1.2;padding:.5rem .9rem;text-decoration:none}.printblob-designer__pro-chip:focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}.printblob-designer__side-dot{background:var(--printblob-cobalt);border-radius:50%;height:7px;width:7px}.printblob-designer__side-dot:not(.is-shown){visibility:hidden}.printblob-designer__stage{align-items:center;background:var(--printblob-cotton);border-radius:10px;display:grid;overflow:hidden;position:relative}.printblob-designer__frame{position:relative}.printblob-designer__canvas,.printblob-designer__shirt{inset:0;position:absolute}.printblob-designer__shirt{display:block;height:100%;width:100%}.printblob-designer__area{border:2px dashed rgba(26,29,34,.35);border-radius:4px;pointer-events:none;position:absolute}.printblob-designer__area.is-on-dark{border-color:hsla(0,0%,100%,.55)}.printblob-designer__canvas .canvas-container,.printblob-designer__canvas canvas{height:100%!important;width:100%!important}.printblob-designer__stage-loading{align-items:center;background:var(--printblob-surface);border-radius:999px;color:var(--printblob-heather);display:flex;font-size:.875rem;gap:.5rem;right:50%;margin:0;padding:.45rem .85rem;position:absolute;top:50%;transform:translate(50%,-50%);white-space:nowrap}.printblob-designer__stage-loading:before{border:2px solid var(--printblob-seam);border-radius:50%;border-top-color:var(--printblob-cobalt);content:"";flex:none;height:.9rem;width:.9rem}@media(prefers-reduced-motion:no-preference){.printblob-designer__stage-loading:before{animation:printblob-turn .8s linear infinite}}@keyframes printblob-turn{to{transform:rotate(-1turn)}}.printblob-designer__hint{color:var(--printblob-heather);font-size:.875rem;margin:.75rem 0 0}.printblob-designer__title{font-size:clamp(1.75rem,3vw,2.5rem);letter-spacing:-.03em;line-height:1.1;margin:0}.printblob-designer__price{font-size:1.375rem;font-weight:560;margin:.5rem 0 0}.printblob-designer__section{border:0;margin:2rem 0 0;padding:0}.printblob-designer__section h2,.printblob-designer__section legend{align-items:baseline;display:flex;font-size:1rem;font-weight:620;gap:.5rem;letter-spacing:-.01em;margin:0 0 .75rem;padding:0}.printblob-designer__choice{color:var(--printblob-heather);font-weight:400}.printblob-designer__row,.printblob-designer__tools{align-items:end;display:flex;flex-wrap:wrap;gap:.6rem}.printblob-designer__workbench{border:1px solid var(--printblob-seam);border-radius:10px;margin-top:1rem}.printblob-designer__items,.printblob-designer__selection,.printblob-designer__tool{align-content:start;display:grid;gap:1rem;padding:1rem}.printblob-designer__items{gap:.6rem}.printblob-designer__items h3{color:var(--printblob-heather);font-size:.875rem;font-weight:560;margin:0}.printblob-designer__items ul{display:grid;gap:.4rem;list-style:none;margin:0;padding:0}.printblob-designer__item{align-items:center;background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);box-sizing:border-box;color:var(--printblob-ink);cursor:pointer;display:flex;font:inherit;gap:.6rem;min-height:2.75rem;padding:.4rem .75rem;text-align:start;width:100%}.printblob-designer__item:hover{outline:1px solid var(--printblob-ink);outline-offset:-1px}.printblob-designer__item img{flex:none;height:1.75rem;object-fit:contain;width:1.75rem}.printblob-designer__item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.printblob-designer__row--actions{gap:1rem}.printblob-button{background:var(--printblob-ink);border:1.5px solid var(--printblob-ink);border-radius:var(--printblob-radius);color:var(--printblob-on-ink);cursor:pointer;font:inherit;font-weight:560;padding:.75rem 1.2rem}.printblob-button:hover:not(:disabled){background:color-mix(in srgb,var(--printblob-ink) 82%,#000)}.printblob-button--quiet{background:transparent;color:var(--printblob-ink)}.printblob-button--quiet:hover:not(:disabled){background:var(--printblob-fill)}.printblob-button--primary{background:var(--printblob-cobalt);border-color:var(--printblob-cobalt);color:var(--printblob-on-cobalt);font-size:1.0625rem;padding:1rem 1.2rem;width:100%}.printblob-button--primary:hover:not(:disabled){background:var(--printblob-cobalt-deep);border-color:var(--printblob-cobalt-deep)}.printblob-button:disabled{cursor:not-allowed;opacity:.55}.printblob-link-button{background:none;border:0;color:var(--printblob-ink);cursor:pointer;font:inherit;font-size:.9375rem;padding:0;text-decoration:underline;text-underline-offset:.18em}.printblob-link-button--danger{color:#b42318}.printblob-field{border:0;color:var(--printblob-heather);display:grid;font-size:.875rem;gap:.35rem;margin:0;padding:0}.printblob-field input[type=number],.printblob-field select,.printblob-field textarea{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-field-radius);box-sizing:border-box;color:var(--printblob-ink);font:inherit;font-size:1rem;max-width:100%;min-width:0;padding:.6rem .75rem;width:100%}.printblob-field textarea{resize:vertical}.printblob-field legend{margin-bottom:.35rem}.printblob-field--qty{max-width:7rem}.printblob-toggle{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:700;padding:.6rem .9rem}.printblob-toggle[aria-pressed=true]{background:var(--printblob-ink);border-color:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-swatches{display:flex;flex-wrap:wrap;gap:.6rem}.printblob-swatch{background:var(--printblob-swatch);border:1px solid color-mix(in srgb,var(--printblob-ink) 22%,transparent);border-radius:50%;cursor:pointer;height:2.25rem;padding:0;position:relative;width:2.25rem}.printblob-swatch[aria-pressed=true]{outline:2px solid var(--printblob-ink);outline-offset:3px}.printblob-swatch--custom{background:conic-gradient(#d7263d,#f4c20d,#1f8a4c,#2645d6,#d7263d);overflow:hidden}.printblob-swatch--custom input{cursor:pointer;inset:0;opacity:0;position:absolute}.printblob-swatches--shirt .printblob-swatch{height:2.6rem;width:2.6rem}.printblob-sizes{display:flex;flex-wrap:wrap;gap:.5rem}.printblob-size{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:560;min-width:3.25rem;padding:.6rem .8rem}.printblob-size[aria-pressed=true]{border-color:var(--printblob-ink);box-shadow:inset 0 0 0 1px var(--printblob-ink)}.printblob-size:disabled{color:var(--printblob-heather);cursor:not-allowed;text-decoration:line-through}.printblob-breakdown{border-top:1px solid var(--printblob-seam);display:grid;gap:.4rem;margin:1.25rem 0;padding:1rem 0 0}.printblob-breakdown div{display:flex;justify-content:space-between}.printblob-breakdown dt{color:var(--printblob-heather)}.printblob-breakdown dd{justify-items:end;margin:0}.printblob-breakdown__none{color:var(--printblob-heather)}.printblob-breakdown__total{font-size:1.125rem;font-weight:620;margin-top:.4rem}.printblob-breakdown__total dt{color:var(--printblob-ink)}.printblob-note{color:var(--printblob-heather);font-size:.9375rem;margin:0}.printblob-note--warn{color:#8a5a00}.printblob-note--error{color:#b42318;margin-top:.75rem}.printblob-note--ok{color:var(--printblob-ink);margin-top:.75rem}:is(.wp-block-printblob-designer,.printblob-designer) :is(button,input,select,textarea,a):focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}
  • printblob/tags/1.3.0/build/designer/view.asset.php

    r3751165 r3751408  
    66                'wp-i18n'
    77        ),
    8         'version' => '60ca96706854fdd0ab81'
     8        'version' => 'da6fbaf91134b31e3aec'
    99);
  • printblob/tags/1.3.0/build/designer/view.css

    r3751165 r3751408  
    1 .printblob-designer,.wp-block-printblob-designer{--printblob-ink:var(--wp--preset--color--ink,#1a1d22);--printblob-heather:var(--wp--preset--color--heather,#5f6670);--printblob-seam:var(--wp--preset--color--seam,#e2e4e0);--printblob-cotton:var(--wp--preset--color--cotton,#f6f7f5);--printblob-cobalt:var(--wp--preset--color--cobalt,#2645d6);--printblob-cobalt-deep:var(--wp--preset--color--cobalt-deep,#1b33a6);--printblob-surface:var(--wp--preset--color--white,#fff);--printblob-on-ink:var(--wp--preset--color--white,#fff);--printblob-fill:color-mix(in srgb,var(--printblob-ink) 8%,var(--printblob-surface));--printblob-muted:color-mix(in srgb,var(--printblob-ink) 80%,var(--printblob-surface));--printblob-on-cobalt:#fff;--printblob-radius:var(--wp--custom--printblob--radius,6px);--printblob-field-radius:min(var(--printblob-radius),14px);color:var(--printblob-ink)}.printblob-designer__loading{color:var(--printblob-heather)}.printblob-stack{display:grid}.printblob-stack>*{grid-area:1/1;min-width:0}.printblob-stack>:not(.is-shown){visibility:hidden}.printblob-stack>.printblob-stack__fill{contain:size;overflow:auto;scrollbar-gutter:stable}.printblob-designer__layout{align-items:start;display:grid;gap:clamp(1.5rem,4vw,4rem);grid-template-columns:minmax(0,1.25fr) minmax(320px,.75fr)}@media(max-width:900px){.printblob-designer__layout{grid-template-columns:minmax(0,1fr)}}.printblob-designer__stage-column{position:sticky;top:1.5rem}@media(max-width:900px){.printblob-designer__stage-column{position:static}}.printblob-designer__views{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1rem}.printblob-designer__sides{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);display:inline-flex;gap:.25rem;padding:.25rem}.printblob-designer__side{align-items:center;background:transparent;border:0;border-radius:var(--printblob-radius);color:var(--printblob-muted);cursor:pointer;display:inline-flex;font:inherit;font-weight:560;gap:.45rem;letter-spacing:inherit;padding:.5rem 1.1rem}.printblob-designer__side.is-current,.printblob-designer__side[aria-selected=true]{background:var(--printblob-surface);box-shadow:0 1px 2px rgba(26,29,34,.08);color:var(--printblob-ink)}.printblob-designer__side--view{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);font-weight:640;letter-spacing:.02em;padding:.75rem 1.1rem}.printblob-designer__side--view[aria-pressed=true]{background:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-designer__side--view:disabled{cursor:default;opacity:.6}.printblob-designer__side-dot{background:var(--printblob-cobalt);border-radius:50%;height:7px;width:7px}.printblob-designer__side-dot:not(.is-shown){visibility:hidden}.printblob-designer__stage{align-items:center;background:var(--printblob-cotton);border-radius:10px;display:grid;overflow:hidden;position:relative}.printblob-designer__frame{position:relative}.printblob-designer__canvas,.printblob-designer__shirt{inset:0;position:absolute}.printblob-designer__shirt{display:block;height:100%;width:100%}.printblob-designer__area{border:2px dashed rgba(26,29,34,.35);border-radius:4px;pointer-events:none;position:absolute}.printblob-designer__area.is-on-dark{border-color:hsla(0,0%,100%,.55)}.printblob-designer__canvas .canvas-container,.printblob-designer__canvas canvas{height:100%!important;width:100%!important}.printblob-designer__stage-loading{align-items:center;background:var(--printblob-surface);border-radius:999px;color:var(--printblob-heather);display:flex;font-size:.875rem;gap:.5rem;left:50%;margin:0;padding:.45rem .85rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap}.printblob-designer__stage-loading:before{border:2px solid var(--printblob-seam);border-radius:50%;border-top-color:var(--printblob-cobalt);content:"";flex:none;height:.9rem;width:.9rem}@media(prefers-reduced-motion:no-preference){.printblob-designer__stage-loading:before{animation:printblob-turn .8s linear infinite}}@keyframes printblob-turn{to{transform:rotate(1turn)}}.printblob-designer__hint{color:var(--printblob-heather);font-size:.875rem;margin:.75rem 0 0}.printblob-designer__title{font-size:clamp(1.75rem,3vw,2.5rem);letter-spacing:-.03em;line-height:1.1;margin:0}.printblob-designer__price{font-size:1.375rem;font-weight:560;margin:.5rem 0 0}.printblob-designer__section{border:0;margin:2rem 0 0;padding:0}.printblob-designer__section h2,.printblob-designer__section legend{align-items:baseline;display:flex;font-size:1rem;font-weight:620;gap:.5rem;letter-spacing:-.01em;margin:0 0 .75rem;padding:0}.printblob-designer__choice{color:var(--printblob-heather);font-weight:400}.printblob-designer__row,.printblob-designer__tools{align-items:end;display:flex;flex-wrap:wrap;gap:.6rem}.printblob-designer__workbench{border:1px solid var(--printblob-seam);border-radius:10px;margin-top:1rem}.printblob-designer__items,.printblob-designer__selection,.printblob-designer__tool{align-content:start;display:grid;gap:1rem;padding:1rem}.printblob-designer__items{gap:.6rem}.printblob-designer__items h3{color:var(--printblob-heather);font-size:.875rem;font-weight:560;margin:0}.printblob-designer__items ul{display:grid;gap:.4rem;list-style:none;margin:0;padding:0}.printblob-designer__item{align-items:center;background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);box-sizing:border-box;color:var(--printblob-ink);cursor:pointer;display:flex;font:inherit;gap:.6rem;min-height:2.75rem;padding:.4rem .75rem;text-align:start;width:100%}.printblob-designer__item:hover{outline:1px solid var(--printblob-ink);outline-offset:-1px}.printblob-designer__item img{flex:none;height:1.75rem;object-fit:contain;width:1.75rem}.printblob-designer__item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.printblob-designer__row--actions{gap:1rem}.printblob-button{background:var(--printblob-ink);border:1.5px solid var(--printblob-ink);border-radius:var(--printblob-radius);color:var(--printblob-on-ink);cursor:pointer;font:inherit;font-weight:560;padding:.75rem 1.2rem}.printblob-button:hover:not(:disabled){background:color-mix(in srgb,var(--printblob-ink) 82%,#000)}.printblob-button--quiet{background:transparent;color:var(--printblob-ink)}.printblob-button--quiet:hover:not(:disabled){background:var(--printblob-fill)}.printblob-button--primary{background:var(--printblob-cobalt);border-color:var(--printblob-cobalt);color:var(--printblob-on-cobalt);font-size:1.0625rem;padding:1rem 1.2rem;width:100%}.printblob-button--primary:hover:not(:disabled){background:var(--printblob-cobalt-deep);border-color:var(--printblob-cobalt-deep)}.printblob-button:disabled{cursor:not-allowed;opacity:.55}.printblob-link-button{background:none;border:0;color:var(--printblob-ink);cursor:pointer;font:inherit;font-size:.9375rem;padding:0;text-decoration:underline;text-underline-offset:.18em}.printblob-link-button--danger{color:#b42318}.printblob-field{border:0;color:var(--printblob-heather);display:grid;font-size:.875rem;gap:.35rem;margin:0;padding:0}.printblob-field input[type=number],.printblob-field select,.printblob-field textarea{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-field-radius);box-sizing:border-box;color:var(--printblob-ink);font:inherit;font-size:1rem;max-width:100%;min-width:0;padding:.6rem .75rem;width:100%}.printblob-field textarea{resize:vertical}.printblob-field legend{margin-bottom:.35rem}.printblob-field--qty{max-width:7rem}.printblob-toggle{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:700;padding:.6rem .9rem}.printblob-toggle[aria-pressed=true]{background:var(--printblob-ink);border-color:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-swatches{display:flex;flex-wrap:wrap;gap:.6rem}.printblob-swatch{background:var(--printblob-swatch);border:1px solid color-mix(in srgb,var(--printblob-ink) 22%,transparent);border-radius:50%;cursor:pointer;height:2.25rem;padding:0;position:relative;width:2.25rem}.printblob-swatch[aria-pressed=true]{outline:2px solid var(--printblob-ink);outline-offset:3px}.printblob-swatch--custom{background:conic-gradient(#d7263d,#f4c20d,#1f8a4c,#2645d6,#d7263d);overflow:hidden}.printblob-swatch--custom input{cursor:pointer;inset:0;opacity:0;position:absolute}.printblob-swatches--shirt .printblob-swatch{height:2.6rem;width:2.6rem}.printblob-sizes{display:flex;flex-wrap:wrap;gap:.5rem}.printblob-size{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:560;min-width:3.25rem;padding:.6rem .8rem}.printblob-size[aria-pressed=true]{border-color:var(--printblob-ink);box-shadow:inset 0 0 0 1px var(--printblob-ink)}.printblob-size:disabled{color:var(--printblob-heather);cursor:not-allowed;text-decoration:line-through}.printblob-breakdown{border-top:1px solid var(--printblob-seam);display:grid;gap:.4rem;margin:1.25rem 0;padding:1rem 0 0}.printblob-breakdown div{display:flex;justify-content:space-between}.printblob-breakdown dt{color:var(--printblob-heather)}.printblob-breakdown dd{justify-items:end;margin:0}.printblob-breakdown__none{color:var(--printblob-heather)}.printblob-breakdown__total{font-size:1.125rem;font-weight:620;margin-top:.4rem}.printblob-breakdown__total dt{color:var(--printblob-ink)}.printblob-note{color:var(--printblob-heather);font-size:.9375rem;margin:0}.printblob-note--warn{color:#8a5a00}.printblob-note--error{color:#b42318;margin-top:.75rem}.printblob-note--ok{color:var(--printblob-ink);margin-top:.75rem}:is(.wp-block-printblob-designer,.printblob-designer) :is(button,input,select,textarea,a):focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}
     1.printblob-designer,.wp-block-printblob-designer{--printblob-ink:var(--wp--preset--color--ink,#1a1d22);--printblob-heather:var(--wp--preset--color--heather,#5f6670);--printblob-seam:var(--wp--preset--color--seam,#e2e4e0);--printblob-cotton:var(--wp--preset--color--cotton,#f6f7f5);--printblob-cobalt:var(--wp--preset--color--cobalt,#2645d6);--printblob-cobalt-deep:var(--wp--preset--color--cobalt-deep,#1b33a6);--printblob-surface:var(--wp--preset--color--white,#fff);--printblob-on-ink:var(--wp--preset--color--white,#fff);--printblob-fill:color-mix(in srgb,var(--printblob-ink) 8%,var(--printblob-surface));--printblob-muted:color-mix(in srgb,var(--printblob-ink) 80%,var(--printblob-surface));--printblob-on-cobalt:#fff;--printblob-radius:var(--wp--custom--printblob--radius,6px);--printblob-field-radius:min(var(--printblob-radius),14px);color:var(--printblob-ink)}.printblob-designer__loading{color:var(--printblob-heather)}.printblob-stack{display:grid}.printblob-stack>*{grid-area:1/1;min-width:0}.printblob-stack>:not(.is-shown){visibility:hidden}.printblob-stack>.printblob-stack__fill{contain:size;overflow:auto;scrollbar-gutter:stable}.printblob-designer__layout{align-items:start;display:grid;gap:clamp(1.5rem,4vw,4rem);grid-template-columns:minmax(0,1.25fr) minmax(320px,.75fr)}@media(max-width:900px){.printblob-designer__layout{grid-template-columns:minmax(0,1fr)}}.printblob-designer__stage-column{position:sticky;top:1.5rem}@media(max-width:900px){.printblob-designer__stage-column{position:static}}.printblob-designer__views{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1rem}.printblob-designer__sides{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);display:inline-flex;gap:.25rem;padding:.25rem}.printblob-designer__side{align-items:center;background:transparent;border:0;border-radius:var(--printblob-radius);color:var(--printblob-muted);cursor:pointer;display:inline-flex;font:inherit;font-weight:560;gap:.45rem;letter-spacing:inherit;padding:.5rem 1.1rem}.printblob-designer__side.is-current,.printblob-designer__side[aria-selected=true]{background:var(--printblob-surface);box-shadow:0 1px 2px rgba(26,29,34,.08);color:var(--printblob-ink)}.printblob-designer__side--view{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);font-weight:640;letter-spacing:.02em;padding:.75rem 1.1rem}.printblob-designer__side--view[aria-pressed=true]{background:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-designer__side--view:disabled{cursor:default;opacity:.6}.printblob-designer__pro-chip{align-items:center;border-radius:999px;box-shadow:inset 0 0 0 1px var(--printblob-seam);color:var(--printblob-cobalt);display:inline-flex;font-size:.875em;font-weight:640;letter-spacing:.02em;line-height:1.2;padding:.5rem .9rem;text-decoration:none}.printblob-designer__pro-chip:focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}.printblob-designer__side-dot{background:var(--printblob-cobalt);border-radius:50%;height:7px;width:7px}.printblob-designer__side-dot:not(.is-shown){visibility:hidden}.printblob-designer__stage{align-items:center;background:var(--printblob-cotton);border-radius:10px;display:grid;overflow:hidden;position:relative}.printblob-designer__frame{position:relative}.printblob-designer__canvas,.printblob-designer__shirt{inset:0;position:absolute}.printblob-designer__shirt{display:block;height:100%;width:100%}.printblob-designer__area{border:2px dashed rgba(26,29,34,.35);border-radius:4px;pointer-events:none;position:absolute}.printblob-designer__area.is-on-dark{border-color:hsla(0,0%,100%,.55)}.printblob-designer__canvas .canvas-container,.printblob-designer__canvas canvas{height:100%!important;width:100%!important}.printblob-designer__stage-loading{align-items:center;background:var(--printblob-surface);border-radius:999px;color:var(--printblob-heather);display:flex;font-size:.875rem;gap:.5rem;left:50%;margin:0;padding:.45rem .85rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap}.printblob-designer__stage-loading:before{border:2px solid var(--printblob-seam);border-radius:50%;border-top-color:var(--printblob-cobalt);content:"";flex:none;height:.9rem;width:.9rem}@media(prefers-reduced-motion:no-preference){.printblob-designer__stage-loading:before{animation:printblob-turn .8s linear infinite}}@keyframes printblob-turn{to{transform:rotate(1turn)}}.printblob-designer__hint{color:var(--printblob-heather);font-size:.875rem;margin:.75rem 0 0}.printblob-designer__title{font-size:clamp(1.75rem,3vw,2.5rem);letter-spacing:-.03em;line-height:1.1;margin:0}.printblob-designer__price{font-size:1.375rem;font-weight:560;margin:.5rem 0 0}.printblob-designer__section{border:0;margin:2rem 0 0;padding:0}.printblob-designer__section h2,.printblob-designer__section legend{align-items:baseline;display:flex;font-size:1rem;font-weight:620;gap:.5rem;letter-spacing:-.01em;margin:0 0 .75rem;padding:0}.printblob-designer__choice{color:var(--printblob-heather);font-weight:400}.printblob-designer__row,.printblob-designer__tools{align-items:end;display:flex;flex-wrap:wrap;gap:.6rem}.printblob-designer__workbench{border:1px solid var(--printblob-seam);border-radius:10px;margin-top:1rem}.printblob-designer__items,.printblob-designer__selection,.printblob-designer__tool{align-content:start;display:grid;gap:1rem;padding:1rem}.printblob-designer__items{gap:.6rem}.printblob-designer__items h3{color:var(--printblob-heather);font-size:.875rem;font-weight:560;margin:0}.printblob-designer__items ul{display:grid;gap:.4rem;list-style:none;margin:0;padding:0}.printblob-designer__item{align-items:center;background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);box-sizing:border-box;color:var(--printblob-ink);cursor:pointer;display:flex;font:inherit;gap:.6rem;min-height:2.75rem;padding:.4rem .75rem;text-align:start;width:100%}.printblob-designer__item:hover{outline:1px solid var(--printblob-ink);outline-offset:-1px}.printblob-designer__item img{flex:none;height:1.75rem;object-fit:contain;width:1.75rem}.printblob-designer__item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.printblob-designer__row--actions{gap:1rem}.printblob-button{background:var(--printblob-ink);border:1.5px solid var(--printblob-ink);border-radius:var(--printblob-radius);color:var(--printblob-on-ink);cursor:pointer;font:inherit;font-weight:560;padding:.75rem 1.2rem}.printblob-button:hover:not(:disabled){background:color-mix(in srgb,var(--printblob-ink) 82%,#000)}.printblob-button--quiet{background:transparent;color:var(--printblob-ink)}.printblob-button--quiet:hover:not(:disabled){background:var(--printblob-fill)}.printblob-button--primary{background:var(--printblob-cobalt);border-color:var(--printblob-cobalt);color:var(--printblob-on-cobalt);font-size:1.0625rem;padding:1rem 1.2rem;width:100%}.printblob-button--primary:hover:not(:disabled){background:var(--printblob-cobalt-deep);border-color:var(--printblob-cobalt-deep)}.printblob-button:disabled{cursor:not-allowed;opacity:.55}.printblob-link-button{background:none;border:0;color:var(--printblob-ink);cursor:pointer;font:inherit;font-size:.9375rem;padding:0;text-decoration:underline;text-underline-offset:.18em}.printblob-link-button--danger{color:#b42318}.printblob-field{border:0;color:var(--printblob-heather);display:grid;font-size:.875rem;gap:.35rem;margin:0;padding:0}.printblob-field input[type=number],.printblob-field select,.printblob-field textarea{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-field-radius);box-sizing:border-box;color:var(--printblob-ink);font:inherit;font-size:1rem;max-width:100%;min-width:0;padding:.6rem .75rem;width:100%}.printblob-field textarea{resize:vertical}.printblob-field legend{margin-bottom:.35rem}.printblob-field--qty{max-width:7rem}.printblob-toggle{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:700;padding:.6rem .9rem}.printblob-toggle[aria-pressed=true]{background:var(--printblob-ink);border-color:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-swatches{display:flex;flex-wrap:wrap;gap:.6rem}.printblob-swatch{background:var(--printblob-swatch);border:1px solid color-mix(in srgb,var(--printblob-ink) 22%,transparent);border-radius:50%;cursor:pointer;height:2.25rem;padding:0;position:relative;width:2.25rem}.printblob-swatch[aria-pressed=true]{outline:2px solid var(--printblob-ink);outline-offset:3px}.printblob-swatch--custom{background:conic-gradient(#d7263d,#f4c20d,#1f8a4c,#2645d6,#d7263d);overflow:hidden}.printblob-swatch--custom input{cursor:pointer;inset:0;opacity:0;position:absolute}.printblob-swatches--shirt .printblob-swatch{height:2.6rem;width:2.6rem}.printblob-sizes{display:flex;flex-wrap:wrap;gap:.5rem}.printblob-size{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:560;min-width:3.25rem;padding:.6rem .8rem}.printblob-size[aria-pressed=true]{border-color:var(--printblob-ink);box-shadow:inset 0 0 0 1px var(--printblob-ink)}.printblob-size:disabled{color:var(--printblob-heather);cursor:not-allowed;text-decoration:line-through}.printblob-breakdown{border-top:1px solid var(--printblob-seam);display:grid;gap:.4rem;margin:1.25rem 0;padding:1rem 0 0}.printblob-breakdown div{display:flex;justify-content:space-between}.printblob-breakdown dt{color:var(--printblob-heather)}.printblob-breakdown dd{justify-items:end;margin:0}.printblob-breakdown__none{color:var(--printblob-heather)}.printblob-breakdown__total{font-size:1.125rem;font-weight:620;margin-top:.4rem}.printblob-breakdown__total dt{color:var(--printblob-ink)}.printblob-note{color:var(--printblob-heather);font-size:.9375rem;margin:0}.printblob-note--warn{color:#8a5a00}.printblob-note--error{color:#b42318;margin-top:.75rem}.printblob-note--ok{color:var(--printblob-ink);margin-top:.75rem}:is(.wp-block-printblob-designer,.printblob-designer) :is(button,input,select,textarea,a):focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}
  • printblob/tags/1.3.0/build/designer/view.js

    r3751165 r3751408  
    22(0,e.__)("That image is over %d MB. Use a smaller file.","printblob"),Math.round(t/1048576)),n=()=>[(0,e.__)("Preparing your print file…","printblob"),(0,e.__)("Saving your design…","printblob"),(0,e.__)("Adding to cart…","printblob")],o=window.ReactJSXRuntime,a=(t,e="")=>[e,t?"is-shown":""].filter(Boolean).join(" ");function l({quantity:t,onQuantity:l,currency:h,shirtPrice:c,sides:u,printed:d,unitPrice:g,status:f,disabled:p,cartUrl:m,maxUploadBytes:y,onAddToCart:b}){const _="busy"===f.state?f.message:(0,e.__)("Add to cart","printblob"),v=(0,e.__)("View cart","printblob"),{added:x,...C}=r();return(0,o.jsxs)("div",{className:"printblob-designer__section printblob-designer__buy",children:[(0,o.jsxs)("label",{className:"printblob-field printblob-field--qty",children:[(0,o.jsx)("span",{children:(0,e.__)("Quantity","printblob")}),(0,o.jsx)("input",{type:"number",min:1,max:500,value:t,onChange:t=>l(Math.max(1,Math.min(500,parseInt(t.target.value,10)||1)))})]}),(0,o.jsxs)("dl",{className:"printblob-breakdown",children:[(0,o.jsxs)("div",{children:[(0,o.jsx)("dt",{children:(0,e.__)("Product","printblob")}),(0,o.jsx)("dd",{children:i(c,h)})]}),u.map(t=>(0,o.jsxs)("div",{children:[(0,o.jsx)("dt",{children:(0,e.sprintf)(/* translators: %s: printed side, e.g. Front. */ /* translators: %s: printed side, e.g. Front. */
    33(0,e.__)("%s print","printblob"),t.label)}),(0,o.jsxs)("dd",{className:"printblob-stack",children:[(0,o.jsx)("span",{className:a(Boolean(d[t.key])),children:i(t.price,h)}),(0,o.jsx)("span",{className:a(!d[t.key],"printblob-breakdown__none"),children:/* translators: in the price breakdown, beside a side (e.g. "Back print") that has no design. */ /* translators: in the price breakdown, beside a side (e.g. "Back print") that has no design. */
    4 (0,e.__)("Not printed","printblob")})]})]},t.key)),(0,o.jsxs)("div",{className:"printblob-breakdown__total",children:[(0,o.jsx)("dt",{children:(0,e.__)("Total","printblob")}),(0,o.jsx)("dd",{children:i(g*t,h)})]})]}),(0,o.jsx)("button",{type:"button",className:"printblob-button printblob-button--primary",onClick:b,disabled:p,children:(0,o.jsx)("span",{className:"printblob-stack",children:[(0,e.__)("Add to cart","printblob"),...n()].map(t=>(0,o.jsx)("span",{className:a(t===_),children:t},t))})}),(0,o.jsxs)("div",{className:"printblob-designer__messages printblob-stack",children:[(0,o.jsxs)("p",{className:"printblob-note printblob-note--ok","aria-hidden":"true",children:[x," ",v]}),[...Object.values(C),s(y)].map(t=>(0,o.jsx)("p",{className:"printblob-note printblob-note--error","aria-hidden":"true",children:t},t)),(0,o.jsxs)("div",{className:"printblob-stack__fill is-shown",children:[(0,o.jsx)("div",{className:"printblob-designer__status",role:"status","aria-live":"polite",children:"added"===f.state&&(0,o.jsxs)("p",{className:"printblob-note printblob-note--ok",children:[f.message," ",(0,o.jsx)("a",{href:m,children:v})]})}),"error"===f.state&&(0,o.jsx)("p",{className:"printblob-note printblob-note--error",role:"alert",children:f.message})]})]})]})}function h({names:t,chosen:e}){return(0,o.jsx)("span",{className:"printblob-designer__choice printblob-stack",children:t.map(t=>(0,o.jsx)("span",{className:t===e?"is-shown":void 0,children:t},t))})}function c({label:t,chosen:e,choices:i}){return(0,o.jsxs)("fieldset",{className:"printblob-designer__section",children:[(0,o.jsxs)("legend",{children:[t,void 0!==e&&(0,o.jsx)(h,{names:i.map(t=>t.name),chosen:e})]}),(0,o.jsx)("div",{className:"printblob-sizes",children:i.map(t=>(0,o.jsx)("button",{type:"button",className:"printblob-size","aria-pressed":t.pressed,onClick:t.onSelect,disabled:t.disabled,children:t.name},t.key))})]})}var u=Object.defineProperty,d=(t,e)=>{let i={};for(var r in t)u(i,r,{get:t[r],enumerable:!0});return e||u(i,Symbol.toStringTag,{value:"Module"}),i};function g(t){return g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},g(t)}function f(t){var e=function(t){if("object"!=g(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,"string");if("object"!=g(i))return i;throw TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==g(e)?e:e+""}function p(t,e,i){return(e=f(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}var m=class{constructor(){p(this,"browserShadowBlurConstant",1),p(this,"DPI",96),p(this,"devicePixelRatio",typeof window<"u"?window.devicePixelRatio:1),p(this,"perfLimitSizeTotal",2097152),p(this,"maxCacheSideLimit",4096),p(this,"minCacheSideLimit",256),p(this,"disableStyleCopyPaste",!1),p(this,"enableGLFiltering",!0),p(this,"textureSize",4096),p(this,"forceGLPutImageData",!1),p(this,"cachesBoundsOfCurve",!1),p(this,"fontPaths",{}),p(this,"NUM_FRACTION_DIGITS",4)}};const y=new class extends m{constructor(t){super(),this.configure(t)}configure(t={}){Object.assign(this,t)}addFonts(t={}){this.fontPaths={...this.fontPaths,...t}}removeFonts(t=[]){t.forEach(t=>{delete this.fontPaths[t]})}clearFonts(){this.fontPaths={}}restoreDefaults(t){let e=new m,i=(null==t?void 0:t.reduce((t,i)=>(t[i]=e[i],t),{}))||e;this.configure(i)}},b=(t,...e)=>console[t]("fabric",...e);var _=class extends Error{constructor(t,e){super(`fabric: ${t}`,e)}},v=class extends _{constructor(t){super(`${t} 'options.signal' is in 'aborted' state`)}},x=class{},C=class extends x{testPrecision(t,e){let i=`precision ${e} float;\nvoid main(){}`,r=t.createShader(t.FRAGMENT_SHADER);return!!r&&(t.shaderSource(r,i),t.compileShader(r),!!t.getShaderParameter(r,t.COMPILE_STATUS))}queryWebGL(t){let e=t.getContext("webgl");e&&(this.maxTextureSize=e.getParameter(e.MAX_TEXTURE_SIZE),this.GLPrecision=["highp","mediump","lowp"].find(t=>this.testPrecision(e,t)),e.getExtension("WEBGL_lose_context").loseContext(),b("log",`WebGL: max texture size ${this.maxTextureSize}`))}isSupported(t){return!!this.maxTextureSize&&this.maxTextureSize>=t}};const w={};let S;const T=()=>S||(S={document,window,isTouchSupported:"ontouchstart"in window||"ontouchstart"in document||window&&window.navigator&&window.navigator.maxTouchPoints>0,WebGLProbe:new C,dispose(){},copyPasteData:w}),O=()=>T().document,k=()=>T().window,D=()=>{var t;return Math.max(null==(t=y.devicePixelRatio)?k().devicePixelRatio:t,1)},M=new class{constructor(){p(this,"boundsOfCurveCache",{}),this.charWidthsCache=new Map}getFontCache({fontFamily:t,fontStyle:e,fontWeight:i}){t=t.toLowerCase();let r=this.charWidthsCache;r.has(t)||r.set(t,new Map);let s=r.get(t),n=`${e.toLowerCase()}_${(i+"").toLowerCase()}`;return s.has(n)||s.set(n,new Map),s.get(n)}clearFontCache(t){t?this.charWidthsCache.delete((t||"").toLowerCase()):this.charWidthsCache=new Map}limitDimsByArea(t){let{perfLimitSizeTotal:e}=y,i=Math.sqrt(e*t);return[Math.floor(i),Math.floor(e/i)]}},j="7.4.0";function E(){}const P=Math.PI/2,A=Math.PI/4,F=2*Math.PI,L=Math.PI/180,I=Object.freeze([1,0,0,1,0,0]),R="center",B="left",$="bottom",X="right",Y="none",W=/\r?\n/,N="moving",V="scaling",z="rotating",H="rotate",G="skewing",U="resizing",q="modifyPoly",K="changed",J="scale",Q="scaleX",Z="scaleY",tt="skewX",et="skewY",it="fill",rt="stroke",st="modified",nt="normal",ot="json",at=new class{constructor(){this[ot]=new Map,this.svg=new Map}has(t){return this[ot].has(t)}getClass(t){let e=this[ot].get(t);if(!e)throw new _(`No class registered for ${t}`);return e}setClass(t,e){e?this[ot].set(e,t):(this[ot].set(t.type,t),this[ot].set(t.type.toLowerCase(),t))}getSVGClass(t){return this.svg.get(t)}setSVGClass(t,e){this.svg.set(e??t.type.toLowerCase(),t)}},lt=new class extends Array{remove(t){let e=this.indexOf(t);e>-1&&this.splice(e,1)}cancelAll(){let t=this.splice(0);return t.forEach(t=>t.abort()),t}cancelByCanvas(t){if(!t)return[];let e=this.filter(e=>{var i;return e.target===t||"object"==typeof e.target&&(null==(i=e.target)?void 0:i.canvas)===t});return e.forEach(t=>t.abort()),e}cancelByTarget(t){if(!t)return[];let e=this.filter(e=>e.target===t);return e.forEach(t=>t.abort()),e}};var ht=class{constructor(){p(this,"__eventListeners",{})}on(t,e){if(this.__eventListeners||(this.__eventListeners={}),"object"==typeof t)return Object.entries(t).forEach(([t,e])=>{this.on(t,e)}),()=>this.off(t);if(e){let i=t;return this.__eventListeners[i]||(this.__eventListeners[i]=[]),this.__eventListeners[i].push(e),()=>this.off(i,e)}return()=>!1}once(t,e){if("object"==typeof t){let e=[];return Object.entries(t).forEach(([t,i])=>{e.push(this.once(t,i))}),()=>e.forEach(t=>t())}if(e){let i=this.on(t,function(...t){e.call(this,...t),i()});return i}return()=>!1}_removeEventListener(t,e){if(this.__eventListeners[t])if(e){let i=this.__eventListeners[t],r=i.indexOf(e);r>-1&&i.splice(r,1)}else this.__eventListeners[t]=[]}off(t,e){if(this.__eventListeners)if(void 0===t)for(let t in this.__eventListeners)this._removeEventListener(t);else"object"==typeof t?Object.entries(t).forEach(([t,e])=>{this._removeEventListener(t,e)}):this._removeEventListener(t,e)}fire(t,e){var i;if(!this.__eventListeners)return;let r=null==(i=this.__eventListeners[t])?void 0:i.concat();if(r)for(let t=0;t<r.length;t++)r[t].call(this,e||{})}};const ct=(t,e)=>{let i=t.indexOf(e);return-1!==i&&t.splice(i,1),t},ut=t=>{if(0===t)return 1;switch(Math.abs(t)/P){case 1:case 3:return 0;case 2:return-1}return Math.cos(t)},dt=t=>{if(0===t)return 0;let e=t/P,i=Math.sign(t);switch(e){case 1:return i;case 2:return 0;case 3:return-i}return Math.sin(t)};var gt=class t{constructor(t=0,e=0){"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e)}add(e){return new t(this.x+e.x,this.y+e.y)}addEquals(t){return this.x+=t.x,this.y+=t.y,this}scalarAdd(e){return new t(this.x+e,this.y+e)}scalarAddEquals(t){return this.x+=t,this.y+=t,this}subtract(e){return new t(this.x-e.x,this.y-e.y)}subtractEquals(t){return this.x-=t.x,this.y-=t.y,this}scalarSubtract(e){return new t(this.x-e,this.y-e)}scalarSubtractEquals(t){return this.x-=t,this.y-=t,this}multiply(e){return new t(this.x*e.x,this.y*e.y)}scalarMultiply(e){return new t(this.x*e,this.y*e)}scalarMultiplyEquals(t){return this.x*=t,this.y*=t,this}divide(e){return new t(this.x/e.x,this.y/e.y)}scalarDivide(e){return new t(this.x/e,this.y/e)}scalarDivideEquals(t){return this.x/=t,this.y/=t,this}eq(t){return this.x===t.x&&this.y===t.y}lt(t){return this.x<t.x&&this.y<t.y}lte(t){return this.x<=t.x&&this.y<=t.y}gt(t){return this.x>t.x&&this.y>t.y}gte(t){return this.x>=t.x&&this.y>=t.y}lerp(e,i=.5){return i=Math.max(Math.min(1,i),0),new t(this.x+(e.x-this.x)*i,this.y+(e.y-this.y)*i)}distanceFrom(t){let e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)}midPointFrom(t){return this.lerp(t)}min(e){return new t(Math.min(this.x,e.x),Math.min(this.y,e.y))}max(e){return new t(Math.max(this.x,e.x),Math.max(this.y,e.y))}toString(){return`${this.x},${this.y}`}setXY(t,e){return this.x=t,this.y=e,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setFromPoint(t){return this.x=t.x,this.y=t.y,this}swap(t){let e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i}clone(){return new t(this.x,this.y)}rotate(e,i=ft){let r=dt(e),s=ut(e),n=this.subtract(i);return new t(n.x*s-n.y*r,n.x*r+n.y*s).add(i)}transform(e,i=!1){return new t(e[0]*this.x+e[2]*this.y+(i?0:e[4]),e[1]*this.x+e[3]*this.y+(i?0:e[5]))}};const ft=new gt(0,0),pt=t=>!!t&&Array.isArray(t._objects);function mt(t){class e extends t{constructor(...t){super(...t),p(this,"_objects",[])}_onObjectAdded(t){}_onObjectRemoved(t){}_onStackOrderChanged(t){}add(...t){let e=this._objects.push(...t);return t.forEach(t=>this._onObjectAdded(t)),e}insertAt(t,...e){return this._objects.splice(t,0,...e),e.forEach(t=>this._onObjectAdded(t)),this._objects.length}remove(...t){let e=this._objects,i=[];return t.forEach(t=>{let r=e.indexOf(t);-1!==r&&(e.splice(r,1),i.push(t),this._onObjectRemoved(t))}),i}forEachObject(t){this.getObjects().forEach((e,i,r)=>t(e,i,r))}getObjects(...t){return 0===t.length?[...this._objects]:this._objects.filter(e=>e.isType(...t))}item(t){return this._objects[t]}isEmpty(){return 0===this._objects.length}size(){return this._objects.length}contains(t,i){return!!this._objects.includes(t)||!!i&&this._objects.some(i=>i instanceof e&&i.contains(t,!0))}complexity(){return this._objects.reduce((t,e)=>t+(e.complexity?e.complexity():0),0)}sendObjectToBack(t){return!(!t||t===this._objects[0]||(ct(this._objects,t),this._objects.unshift(t),this._onStackOrderChanged(t),0))}bringObjectToFront(t){return!(!t||t===this._objects[this._objects.length-1]||(ct(this._objects,t),this._objects.push(t),this._onStackOrderChanged(t),0))}sendObjectBackwards(t,e){if(!t)return!1;let i=this._objects.indexOf(t);if(0!==i){let r=this.findNewLowerIndex(t,i,e);return ct(this._objects,t),this._objects.splice(r,0,t),this._onStackOrderChanged(t),!0}return!1}bringObjectForward(t,e){if(!t)return!1;let i=this._objects.indexOf(t);if(i!==this._objects.length-1){let r=this.findNewUpperIndex(t,i,e);return ct(this._objects,t),this._objects.splice(r,0,t),this._onStackOrderChanged(t),!0}return!1}moveObjectTo(t,e){return t!==this._objects[e]&&(ct(this._objects,t),this._objects.splice(e,0,t),this._onStackOrderChanged(t),!0)}findNewLowerIndex(t,e,i){let r;if(i){r=e;for(let i=e-1;i>=0;--i)if(t.isOverlapping(this._objects[i])){r=i;break}}else r=e-1;return r}findNewUpperIndex(t,e,i){let r;if(i){r=e;for(let i=e+1;i<this._objects.length;++i)if(t.isOverlapping(this._objects[i])){r=i;break}}else r=e+1;return r}collectObjects({left:t,top:e,width:i,height:r},{includeIntersecting:s=!0}={}){let n=[],o=new gt(t,e),a=o.add(new gt(i,r));for(let t=this._objects.length-1;t>=0;t--){let e=this._objects[t];e.selectable&&e.visible&&(s&&e.intersectsWithRect(o,a)||e.isContainedWithinRect(o,a)||s&&e.containsPoint(o)||s&&e.containsPoint(a))&&n.push(e)}return n}}return e}var yt=class extends ht{_setOptions(t={}){for(let e in t)this.set(e,t[e])}_setObject(t){for(let e in t)this._set(e,t[e])}set(t,e){return"object"==typeof t?this._setObject(t):this._set(t,e),this}_set(t,e){this[t]=e}toggle(t){let e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this}get(t){return this[t]}};function bt(t){return k().requestAnimationFrame(t)}function _t(t){return k().cancelAnimationFrame(t)}let vt=0;const xt=()=>vt++,Ct=()=>{let t=O().createElement("canvas");if(!t||void 0===t.getContext)throw new _("Failed to create `canvas` element");return t},wt=()=>O().createElement("img"),St=t=>{var e;let i=Tt(t);return null==(e=i.getContext("2d"))||e.drawImage(t,0,0),i},Tt=t=>{let e=Ct();return e.width=t.width,e.height=t.height,e},Ot=(t,e,i)=>t.toDataURL(`image/${e}`,i),kt=(t,e,i)=>new Promise((r,s)=>{t.toBlob(r,`image/${e}`,i)}),Dt=t=>t*L,Mt=t=>t/L,jt=t=>t.every((t,e)=>t===I[e]),Et=(t,e,i)=>new gt(t).transform(e,i),Pt=t=>{let e=1/(t[0]*t[3]-t[1]*t[2]),i=[e*t[3],-e*t[1],-e*t[2],e*t[0],0,0],{x:r,y:s}=new gt(t[4],t[5]).transform(i,!0);return i[4]=-r,i[5]=-s,i},At=(t,e,i)=>[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],i?0:t[0]*e[4]+t[2]*e[5]+t[4],i?0:t[1]*e[4]+t[3]*e[5]+t[5]],Ft=(t,e)=>t.reduceRight((t,i)=>i&&t?At(i,t,e):i||t,void 0)||I.concat(),Lt=([t,e])=>Math.atan2(e,t),It=([t,e])=>Math.sqrt(t*t+e*e),Rt=([,,t,e])=>Math.sqrt(t*t+e*e),Bt=t=>{let e=Lt(t),i=t[0]**2+t[1]**2,r=Math.sqrt(i),s=(t[0]*t[3]-t[2]*t[1])/r,n=Math.atan2(t[0]*t[2]+t[1]*t[3],i);return{angle:Mt(e),scaleX:r,scaleY:s,skewX:Mt(n),skewY:0,translateX:t[4]||0,translateY:t[5]||0}},$t=(t,e=0)=>[1,0,0,1,t,e];function Xt({angle:t=0}={},{x:e=0,y:i=0}={}){let r=Dt(t),s=ut(r),n=dt(r);return[s,n,-n,s,e?e-(s*e-n*i):0,i?i-(n*e+s*i):0]}const Yt=(t,e=t)=>[t,0,0,e,0,0],Wt=t=>Math.tan(Dt(t)),Nt=t=>[1,0,Wt(t),1,0,0],Vt=t=>[1,Wt(t),0,1,0,0],zt=({scaleX:t=1,scaleY:e=1,flipX:i=!1,flipY:r=!1,skewX:s=0,skewY:n=0})=>{let o=Yt(i?-t:t,r?-e:e);return s&&(o=At(o,Nt(s),!0)),n&&(o=At(o,Vt(n),!0)),o},Ht=t=>{let{translateX:e=0,translateY:i=0,angle:r=0}=t,s=$t(e,i);r&&(s=At(s,Xt({angle:r})));let n=zt(t);return jt(n)||(s=At(s,n)),s},Gt=(t,{signal:e,crossOrigin:i=null}={})=>new Promise(function(r,s){if(e&&e.aborted)return s(new v("loadImage"));let n,o=wt();e&&(n=function(t){o.src="",s(t)},e.addEventListener("abort",n,{once:!0}));let a=function(){o.onload=o.onerror=null,n&&(null==e||e.removeEventListener("abort",n)),r(o)};t?(o.onload=a,o.onerror=function(){n&&(null==e||e.removeEventListener("abort",n)),s(new _(`Error loading ${o.src}`))},i&&(o.crossOrigin=i),o.src=t):a()}),Ut=(t,{signal:e,reviver:i=E}={})=>new Promise((r,s)=>{let n=[];e&&e.addEventListener("abort",s,{once:!0}),Promise.allSettled(t.map(t=>at.getClass(t.type).fromObject(t,{signal:e}))).then(async e=>{for(let[r,s]of e.entries())if("fulfilled"===s.status&&(await i(t[r],s.value),n.push(s.value)),"rejected"===s.status){let e=await i(t[r],void 0,s.reason);e&&n.push(e)}r(n)}).catch(t=>{n.forEach(t=>{t.dispose&&t.dispose()}),s(t)}).finally(()=>{e&&e.removeEventListener("abort",s)})}),qt=(t,{signal:e}={})=>new Promise((i,r)=>{let s=[];e&&e.addEventListener("abort",r,{once:!0});let n=Object.values(t).map(t=>t&&t.type&&at.has(t.type)?Ut([t],{signal:e}).then(([t])=>(s.push(t),t)):t),o=Object.keys(t);Promise.all(n).then(t=>t.reduce((t,e,i)=>(t[o[i]]=e,t),{})).then(i).catch(t=>{s.forEach(t=>{t.dispose&&t.dispose()}),r(t)}).finally(()=>{e&&e.removeEventListener("abort",r)})}),Kt=(t,e=[])=>e.reduce((e,i)=>(i in t&&(e[i]=t[i]),e),{}),Jt=(t,e)=>Object.keys(t).reduce((i,r)=>(e(t[r],r,t)&&(i[r]=t[r]),i),{}),Qt=(t,e)=>parseFloat(Number(t).toFixed(e)),Zt=t=>"matrix("+t.map(t=>Qt(t,y.NUM_FRACTION_DIGITS)).join(" ")+")",te=t=>!!t&&void 0!==t.toLive,ee=t=>!!t&&"function"==typeof t.toObject,ie=t=>!!t&&void 0!==t.offsetX&&"source"in t,re=t=>!!t&&"multiSelectionStacking"in t;function se(t){let e=t&&ne(t),i=0,r=0;if(!t||!e)return{left:i,top:r};let s=t,n=e.documentElement,o=e.body||{scrollLeft:0,scrollTop:0};for(;s&&(s.parentNode||s.host)&&(s=s.parentNode||s.host,s===e?(i=o.scrollLeft||n.scrollLeft||0,r=o.scrollTop||n.scrollTop||0):(i+=s.scrollLeft||0,r+=s.scrollTop||0),1!==s.nodeType||"fixed"!==s.style.position););return{left:i,top:r}}const ne=t=>t.ownerDocument||null,oe=t=>{var e;return(null==(e=t.ownerDocument)?void 0:e.defaultView)||null},ae=(t,e,{width:i,height:r},s=1)=>{t.width=i,t.height=r,s>1&&(t.setAttribute("width",(i*s).toString()),t.setAttribute("height",(r*s).toString()),e.scale(s,s))},le=(t,{width:e,height:i})=>{e&&(t.style.width="number"==typeof e?`${e}px`:e),i&&(t.style.height="number"==typeof i?`${i}px`:i)};function he(t){return void 0!==t.onselectstart&&(t.onselectstart=()=>!1),t.style.userSelect=Y,t}var ce=class{constructor(t){p(this,"_originalCanvasStyle",void 0),p(this,"lower",void 0);let e=this.createLowerCanvas(t);this.lower={el:e,ctx:e.getContext("2d")}}createLowerCanvas(t){let e=(i=t)&&void 0!==i.getContext?t:t&&O().getElementById(t)||Ct();var i;if(e.hasAttribute("data-fabric"))throw new _("Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?");return this._originalCanvasStyle=e.style.cssText,e.setAttribute("data-fabric","main"),e.classList.add("lower-canvas"),e}cleanupDOM({width:t,height:e}){let{el:i}=this.lower;i.classList.remove("lower-canvas"),i.removeAttribute("data-fabric"),i.setAttribute("width",`${t}`),i.setAttribute("height",`${e}`),i.style.cssText=this._originalCanvasStyle||"",this._originalCanvasStyle=void 0}setDimensions(t,e){let{el:i,ctx:r}=this.lower;ae(i,r,t,e)}setCSSDimensions(t){le(this.lower.el,t)}calcOffset(){return function(t){var e;let i=t&&ne(t),r={left:0,top:0};if(!i)return r;let s=(null==(e=oe(t))?void 0:e.getComputedStyle(t,null))||{};r.left+=parseInt(s.borderLeftWidth,10)||0,r.top+=parseInt(s.borderTopWidth,10)||0,r.left+=parseInt(s.paddingLeft,10)||0,r.top+=parseInt(s.paddingTop,10)||0;let n={left:0,top:0},o=i.documentElement;void 0!==t.getBoundingClientRect&&(n=t.getBoundingClientRect());let a=se(t);return{left:n.left+a.left-(o.clientLeft||0)+r.left,top:n.top+a.top-(o.clientTop||0)+r.top}}(this.lower.el)}dispose(){T().dispose(this.lower.el),delete this.lower}};const ue={backgroundVpt:!0,backgroundColor:"",overlayVpt:!0,overlayColor:"",includeDefaultValues:!0,svgViewportTransformation:!0,renderOnAddRemove:!0,skipOffscreen:!0,enableRetinaScaling:!0,imageSmoothingEnabled:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,viewportTransform:[...I],patternQuality:"best"};var de=d({capitalize:()=>ge,escapeXml:()=>fe,graphemeSplit:()=>me});const ge=(t,e=!1)=>`${t.charAt(0).toUpperCase()}${e?t.slice(1):t.slice(1).toLowerCase()}`,fe=t=>t.toString().replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;");let pe;const me=t=>{if(pe||pe||(pe="Intl"in k()&&"Segmenter"in Intl&&new Intl.Segmenter(void 0,{granularity:"grapheme"})),pe){let e=pe.segment(t);return Array.from(e).map(({segment:t})=>t)}return ye(t)},ye=t=>{let e=[];for(let i,r=0;r<t.length;r++)!1!==(i=be(t,r))&&e.push(i);return e},be=(t,e)=>{let i=t.charCodeAt(e);if(isNaN(i))return"";if(i<55296||i>57343)return t.charAt(e);if(55296<=i&&i<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";let i=t.charCodeAt(e+1);if(56320>i||i>57343)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";let r=t.charCodeAt(e-1);if(55296>r||r>56319)throw"Low surrogate without preceding high surrogate";return!1};var _e=class t extends(mt(yt)){get lowerCanvasEl(){var t;return null==(t=this.elements.lower)?void 0:t.el}get contextContainer(){var t;return null==(t=this.elements.lower)?void 0:t.ctx}static getDefaults(){return t.ownDefaults}constructor(t,e={}){super(),Object.assign(this,this.constructor.getDefaults()),this.set(e),this.initElements(t),this._setDimensionsImpl({width:this.width||this.elements.lower.el.width||0,height:this.height||this.elements.lower.el.height||0}),this.skipControlsDrawing=!1,this.viewportTransform=[...this.viewportTransform],this.calcViewportBoundaries()}initElements(t){this.elements=new ce(t)}add(...t){let e=super.add(...t);return t.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),e}insertAt(t,...e){let i=super.insertAt(t,...e);return e.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),i}remove(...t){let e=super.remove(...t);return e.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),e}_onObjectAdded(t){t.canvas&&t.canvas!==this&&(b("warn","Canvas is trying to add an object that belongs to a different canvas.\nResulting to default behavior: removing object from previous canvas and adding to new canvas"),t.canvas.remove(t)),t._set("canvas",this),t.setCoords(),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t){t._set("canvas",void 0),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onStackOrderChanged(){this.renderOnAddRemove&&this.requestRenderAll()}getRetinaScaling(){return this.enableRetinaScaling?D():1}calcOffset(){return this._offset=this.elements.calcOffset()}getWidth(){return this.width}getHeight(){return this.height}_setDimensionsImpl(t,{cssOnly:e=!1,backstoreOnly:i=!1}={}){if(!e){let e={width:this.width,height:this.height,...t};this.elements.setDimensions(e,this.getRetinaScaling()),this.hasLostContext=!0,this.width=e.width,this.height=e.height}i||this.elements.setCSSDimensions(t),this.calcOffset()}setDimensions(t,e){this._setDimensionsImpl(t,e),e&&e.cssOnly||this.requestRenderAll()}getZoom(){return It(this.viewportTransform)}setViewportTransform(t){this.viewportTransform=t,this.calcViewportBoundaries(),this.renderOnAddRemove&&this.requestRenderAll()}zoomToPoint(t,e){let i=t,r=[...this.viewportTransform],s=Et(t,Pt(r));r[0]=e,r[3]=e;let n=Et(s,r);r[4]+=i.x-n.x,r[5]+=i.y-n.y,this.setViewportTransform(r)}setZoom(t){this.zoomToPoint(new gt(0,0),t)}absolutePan(t){let e=[...this.viewportTransform];return e[4]=-t.x,e[5]=-t.y,this.setViewportTransform(e)}relativePan(t){return this.absolutePan(new gt(-t.x-this.viewportTransform[4],-t.y-this.viewportTransform[5]))}getElement(){return this.elements.lower.el}clearContext(t){t.clearRect(0,0,this.width,this.height)}getContext(){return this.elements.lower.ctx}clear(){this.remove(...this.getObjects()),this.backgroundImage=void 0,this.overlayImage=void 0,this.backgroundColor="",this.overlayColor="",this.clearContext(this.getContext()),this.fire("canvas:cleared"),this.renderOnAddRemove&&this.requestRenderAll()}renderAll(){this.cancelRequestedRender(),this.destroyed||this.renderCanvas(this.getContext(),this._objects)}renderAndReset(){this.nextRenderHandle=0,this.renderAll()}requestRenderAll(){this.nextRenderHandle||this.disposed||this.destroyed||(this.nextRenderHandle=bt(()=>this.renderAndReset()))}calcViewportBoundaries(){let t=this.width,e=this.height,i=Pt(this.viewportTransform),r=Et({x:0,y:0},i),s=Et({x:t,y:e},i),n=r.min(s),o=r.max(s);return this.vptCoords={tl:n,tr:new gt(o.x,n.y),bl:new gt(n.x,o.y),br:o}}cancelRequestedRender(){this.nextRenderHandle&&(_t(this.nextRenderHandle),this.nextRenderHandle=0)}drawControls(t){}renderCanvas(t,e){if(this.destroyed)return;let i=this.viewportTransform,r=this.clipPath;this.calcViewportBoundaries(),this.clearContext(t),t.imageSmoothingEnabled=this.imageSmoothingEnabled,t.patternQuality=this.patternQuality,this.fire("before:render",{ctx:t}),this._renderBackground(t),t.save(),t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this._renderObjects(t,e),t.restore(),this.controlsAboveOverlay||this.skipControlsDrawing||this.drawControls(t),r&&(r._set("canvas",this),r.shouldCache(),r._transformDone=!0,r.renderCache({forClipping:!0}),this.drawClipPathOnCanvas(t,r)),this._renderOverlay(t),this.controlsAboveOverlay&&!this.skipControlsDrawing&&this.drawControls(t),this.fire("after:render",{ctx:t}),this.__cleanupTask&&(this.__cleanupTask(),this.__cleanupTask=void 0)}drawClipPathOnCanvas(t,e){let i=this.viewportTransform;t.save(),t.transform(...i),t.globalCompositeOperation="destination-in",e.transform(t),t.scale(1/e.zoomX,1/e.zoomY),t.drawImage(e._cacheCanvas,-e.cacheTranslationX,-e.cacheTranslationY),t.restore()}_renderObjects(t,e){for(let i=0,r=e.length;i<r;++i)e[i]&&e[i].render(t)}_renderBackgroundOrOverlay(t,e){let i=this[`${e}Color`],r=this[`${e}Image`],s=this.viewportTransform,n=this[`${e}Vpt`];if(!i&&!r)return;let o=te(i);if(i){if(t.save(),t.beginPath(),t.moveTo(0,0),t.lineTo(this.width,0),t.lineTo(this.width,this.height),t.lineTo(0,this.height),t.closePath(),t.fillStyle=o?i.toLive(t):i,n&&t.transform(...s),o){t.transform(1,0,0,1,i.offsetX||0,i.offsetY||0);let e=i.gradientTransform||i.patternTransform;e&&t.transform(...e)}t.fill(),t.restore()}if(r){t.save();let{skipOffscreen:e}=this;this.skipOffscreen=n,n&&t.transform(...s),r.render(t),this.skipOffscreen=e,t.restore()}}_renderBackground(t){this._renderBackgroundOrOverlay(t,"background")}_renderOverlay(t){this._renderBackgroundOrOverlay(t,"overlay")}getCenterPoint(){return new gt(this.width/2,this.height/2)}centerObjectH(t){return this._centerObject(t,new gt(this.getCenterPoint().x,t.getCenterPoint().y))}centerObjectV(t){return this._centerObject(t,new gt(t.getCenterPoint().x,this.getCenterPoint().y))}centerObject(t){return this._centerObject(t,this.getCenterPoint())}viewportCenterObject(t){return this._centerObject(t,this.getVpCenter())}viewportCenterObjectH(t){return this._centerObject(t,new gt(this.getVpCenter().x,t.getCenterPoint().y))}viewportCenterObjectV(t){return this._centerObject(t,new gt(t.getCenterPoint().x,this.getVpCenter().y))}getVpCenter(){return Et(this.getCenterPoint(),Pt(this.viewportTransform))}_centerObject(t,e){t.setXY(e,R,R),t.setCoords(),this.renderOnAddRemove&&this.requestRenderAll()}toDatalessJSON(t){return this.toDatalessObject(t)}toObject(t){return this._toObjectMethod("toObject",t)}toJSON(){return this.toObject()}toDatalessObject(t){return this._toObjectMethod("toDatalessObject",t)}_toObjectMethod(t,e){let i=this.clipPath,r=i&&!i.excludeFromExport?this._toObject(i,t,e):null;return{version:j,...Kt(this,e),objects:this._objects.filter(t=>!t.excludeFromExport).map(i=>this._toObject(i,t,e)),...this.__serializeBgOverlay(t,e),...r?{clipPath:r}:null}}_toObject(t,e,i){let r;this.includeDefaultValues||(r=t.includeDefaultValues,t.includeDefaultValues=!1);let s=t[e](i);return this.includeDefaultValues||(t.includeDefaultValues=!!r),s}__serializeBgOverlay(t,e){let i={},r=this.backgroundImage,s=this.overlayImage,n=this.backgroundColor,o=this.overlayColor;return te(n)?n.excludeFromExport||(i.background=n.toObject(e)):n&&(i.background=n),te(o)?o.excludeFromExport||(i.overlay=o.toObject(e)):o&&(i.overlay=o),r&&!r.excludeFromExport&&(i.backgroundImage=this._toObject(r,t,e)),s&&!s.excludeFromExport&&(i.overlayImage=this._toObject(s,t,e)),i}toSVG(t={},e){t.reviver=e;let i=[];var r;return this._setSVGPreamble(i,t),this._setSVGHeader(i,t),this.clipPath&&i.push(`<g clip-path="url(#${fe(null==(r=this.clipPath.clipPathId)?"":r)})" >\n`),this._setSVGBgOverlayColor(i,"background"),this._setSVGBgOverlayImage(i,"backgroundImage",e),this._setSVGObjects(i,e),this.clipPath&&i.push("</g>\n"),this._setSVGBgOverlayColor(i,"overlay"),this._setSVGBgOverlayImage(i,"overlayImage",e),i.push("</svg>"),i.join("")}_setSVGPreamble(t,e){e.suppressPreamble||t.push('<?xml version="1.0" encoding="',e.encoding||"UTF-8",'" standalone="no" ?>\n','<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" ','"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n')}_setSVGHeader(t,e){let i,r=e.width||`${this.width}`,s=e.height||`${this.height}`,n=y.NUM_FRACTION_DIGITS,o=e.viewBox;if(o)i=`viewBox="${o.x} ${o.y} ${o.width} ${o.height}" `;else if(this.svgViewportTransformation){let t=this.viewportTransform;i=`viewBox="${Qt(-t[4]/t[0],n)} ${Qt(-t[5]/t[3],n)} ${Qt(this.width/t[0],n)} ${Qt(this.height/t[3],n)}" `}else i=`viewBox="0 0 ${this.width} ${this.height}" `;t.push("<svg ",'xmlns="http://www.w3.org/2000/svg" ','xmlns:xlink="http://www.w3.org/1999/xlink" ','version="1.1" ','width="',r,'" ','height="',s,'" ',i,'xml:space="preserve">\n',"<desc>Created with Fabric.js ",j,"</desc>\n","<defs>\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"</defs>\n")}createSVGClipPathMarkup(t){let e=this.clipPath;return e?(e.clipPathId=`CLIPPATH_${xt()}`,`<clipPath id="${e.clipPathId}" >\n${e.toClipPathSVG(t.reviver)}</clipPath>\n`):""}createSVGRefElementsMarkup(){return["background","overlay"].map(t=>{let e=this[`${t}Color`];if(te(e)){let i=this[`${t}Vpt`],r=this.viewportTransform,s={isType:()=>!1,width:this.width/(i?r[0]:1),height:this.height/(i?r[3]:1)};return e.toSVG(s,{additionalTransform:i?Zt(r):""})}}).join("")}createSVGFontFacesMarkup(){let t=[],e={},i=y.fontPaths;this._objects.forEach(function e(i){t.push(i),pt(i)&&i._objects.forEach(e)}),t.forEach(t=>{if(!(r=t)||"function"!=typeof r._renderText)return;var r;let{styles:s,fontFamily:n}=t;!e[n]&&i[n]&&(e[n]=!0,s&&Object.values(s).forEach(t=>{Object.values(t).forEach(({fontFamily:t=""})=>{!e[t]&&i[t]&&(e[t]=!0)})}))});let r=Object.keys(e).map(t=>`\t\t@font-face {\n\t\t\tfont-family: '${t}';\n\t\t\tsrc: url('${i[t]}');\n\t\t}\n`).join("");return r?`\t<style type="text/css"><![CDATA[\n${r}]]></style>\n`:""}_setSVGObjects(t,e){this.forEachObject(i=>{i.excludeFromExport||this._setSVGObject(t,i,e)})}_setSVGObject(t,e,i){t.push(e.toSVG(i))}_setSVGBgOverlayImage(t,e,i){let r=this[e];r&&!r.excludeFromExport&&r.toSVG&&t.push(r.toSVG(i))}_setSVGBgOverlayColor(t,e){let i=this[`${e}Color`];if(i)if(te(i)){let r=i.repeat||"",s=this.width,n=this.height,o=this[`${e}Vpt`]?Zt(Pt(this.viewportTransform)):"";t.push(`<rect transform="${o} translate(${s/2},${n/2})" x="${i.offsetX-s/2}" y="${i.offsetY-n/2}" width="${"repeat-y"!==r&&"no-repeat"!==r||!ie(i)?s:i.source.width}" height="${"repeat-x"!==r&&"no-repeat"!==r||!ie(i)?n:i.source.height}" fill="url(#SVGID_${i.id})"></rect>\n`)}else t.push('<rect x="0" y="0" width="100%" height="100%" ','fill="',i,'"',"></rect>\n")}loadFromJSON(t,e,{signal:i}={}){if(!t)return Promise.reject(new _("`json` is undefined"));let{objects:r=[],...s}="string"==typeof t?JSON.parse(t):t,{backgroundImage:n,background:o,overlayImage:a,overlay:l,clipPath:h}=s,c=this.renderOnAddRemove;return this.renderOnAddRemove=!1,Promise.all([Ut(r,{reviver:e,signal:i}),qt({backgroundImage:n,backgroundColor:o,overlayImage:a,overlayColor:l,clipPath:h},{signal:i})]).then(([t,e])=>(this.clear(),this.add(...t),this.set(s),this.set(e),this.renderOnAddRemove=c,this))}clone(t){let e=this.toObject(t);return this.cloneWithoutData().loadFromJSON(e)}cloneWithoutData(){let t=Tt(this);return new this.constructor(t)}toDataURL(t={}){let{format:e="png",quality:i=1,multiplier:r=1,enableRetinaScaling:s=!1}=t,n=r*(s?this.getRetinaScaling():1);return Ot(this.toCanvasElement(n,t),e,i)}toBlob(t={}){let{format:e="png",quality:i=1,multiplier:r=1,enableRetinaScaling:s=!1}=t,n=r*(s?this.getRetinaScaling():1);return kt(this.toCanvasElement(n,t),e,i)}toCanvasElement(t=1,{width:e,height:i,left:r,top:s,filter:n}={}){let o=(e||this.width)*t,a=(i||this.height)*t,l=this.getZoom(),h=this.width,c=this.height,u=this.skipControlsDrawing,d=l*t,g=this.viewportTransform,f=[d,0,0,d,(g[4]-(r||0))*t,(g[5]-(s||0))*t],p=this.enableRetinaScaling,m=Tt({width:o,height:a}),y=n?this._objects.filter(t=>n(t)):this._objects;return this.enableRetinaScaling=!1,this.viewportTransform=f,this.width=o,this.height=a,this.skipControlsDrawing=!0,this.calcViewportBoundaries(),this.renderCanvas(m.getContext("2d"),y),this.viewportTransform=g,this.width=h,this.height=c,this.calcViewportBoundaries(),this.enableRetinaScaling=p,this.skipControlsDrawing=u,m}dispose(){return!this.disposed&&this.elements.cleanupDOM({width:this.width,height:this.height}),lt.cancelByCanvas(this),this.disposed=!0,new Promise((t,e)=>{let i=()=>{this.destroy(),t(!0)};i.kill=e,this.__cleanupTask&&this.__cleanupTask.kill("aborted"),this.destroyed?t(!1):this.nextRenderHandle?this.__cleanupTask=i:i()})}destroy(){this.destroyed=!0,this.cancelRequestedRender(),this.forEachObject(t=>t.dispose()),this._objects=[],this.backgroundImage&&this.backgroundImage.dispose(),this.backgroundImage=void 0,this.overlayImage&&this.overlayImage.dispose(),this.overlayImage=void 0,this.elements.dispose()}toString(){return`#<Canvas (${this.complexity()}): { objects: ${this._objects.length} }>`}};p(_e,"ownDefaults",ue);const ve=["touchstart","touchmove","touchend"],xe=t=>{let e=se(t.target),i=function(t){let e=t.changedTouches;return e&&e[0]?e[0]:t}(t);return new gt(i.clientX+e.left,i.clientY+e.top)},Ce=t=>ve.includes(t.type)||"touch"===t.pointerType,we=t=>{t.preventDefault(),t.stopPropagation()},Se=t=>{let e=0,i=0,r=0,s=0;for(let n=0,o=t.length;n<o;n++){let{x:o,y:a}=t[n];(o>r||!n)&&(r=o),(o<e||!n)&&(e=o),(a>s||!n)&&(s=a),(a<i||!n)&&(i=a)}return{left:e,top:i,width:r-e,height:s-i}},Te=(t,e)=>{ke(t,At(Pt(e),t.calcOwnMatrix()))},Oe=(t,e)=>ke(t,At(e,t.calcOwnMatrix())),ke=(t,e)=>{let{translateX:i,translateY:r,scaleX:s,scaleY:n,...o}=Bt(e),a=new gt(i,r);t.flipX=!1,t.flipY=!1,Object.assign(t,o),t.set({scaleX:s,scaleY:n}),t.setPositionByOrigin(a,R,R)},De=t=>{t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.rotate(0)},Me=t=>({scaleX:t.scaleX,scaleY:t.scaleY,skewX:t.skewX,skewY:t.skewY,angle:t.angle,left:t.left,flipX:t.flipX,flipY:t.flipY,top:t.top}),je=(t,e,i)=>{let r=t/2,s=e/2,n=Se([new gt(-r,-s),new gt(r,-s),new gt(-r,s),new gt(r,s)].map(t=>t.transform(i)));return new gt(n.width,n.height)},Ee=(t=I,e=I)=>At(Pt(e),t),Pe=(t,e=I,i=I)=>t.transform(Ee(e,i)),Ae=(t,e=I,i=I)=>t.transform(Ee(e,i),!0),Fe=(t,e,i)=>{let r=Ee(e,i);return ke(t,At(r,t.calcOwnMatrix())),r},Le={left:-.5,top:-.5,center:0,bottom:.5,right:.5},Ie=t=>"string"==typeof t?Le[t]:t-.5,Re=new gt(1,0),Be=new gt,$e=(t,e)=>t.rotate(e),Xe=(t,e)=>new gt(e).subtract(t),Ye=t=>t.distanceFrom(Be),We=(t,e)=>Math.atan2(He(t,e),Ge(t,e)),Ne=t=>We(Re,t),Ve=t=>t.eq(Be)?t:t.scalarDivide(Ye(t)),ze=(t,e=!0)=>Ve(new gt(-t.y,t.x).scalarMultiply(e?1:-1)),He=(t,e)=>t.x*e.y-t.y*e.x,Ge=(t,e)=>t.x*e.x+t.y*e.y,Ue=(t,e,i)=>{if(t.eq(e)||t.eq(i))return!0;let r=He(e,i),s=He(e,t),n=He(i,t);return r>=0?s>=0&&n<=0:!(s<=0&&n>=0)},qe="not-allowed";function Ke(t){return Ie(t.originX)===Ie("center")&&Ie(t.originY)===Ie("center")}function Je(t){return.5-Ie(t)}const Qe=(t,e)=>t[e],Ze=(t,e,i,r)=>({e:t,transform:e,pointer:new gt(i,r)});function ti(t,e,i){let r=i,s=Ne(Xe(Pe(t.getCenterPoint(),t.canvas.viewportTransform,void 0),r))+F;return Math.round(s%F/A)}function ei({target:t,corner:e},i,r,s,n){var o;let a=t.controls[e],l=(null==(o=t.canvas)?void 0:o.getZoom())||1,h=t.padding/l,c=function(t,e,i,r){let s=t.getRelativeCenterPoint(),n=void 0!==i&&void 0!==r?t.translateToGivenOrigin(s,R,R,i,r):new gt(t.left,t.top);return(t.angle?e.rotate(-Dt(t.angle),s):e).subtract(n)}(t,new gt(s,n),i,r);return c.x>=h&&(c.x-=h),c.x<=-h&&(c.x+=h),c.y>=h&&(c.y-=h),c.y<=h&&(c.y+=h),c.x-=a.offsetX,c.y-=a.offsetY,c}const ii=new RegExp(String.raw`[\0-\x1F\x7F;<>\\]|\/\*|\*\/|url\s*\(|expression\s*\(|(?:java|vb)script\s*:|data\s*:|@import\b`,"iu"),ri=t=>"string"==typeof t&&t.trim().length>0&&!ii.test(t),si=(t,e="")=>{let i=Number(t);return Number.isFinite(i)?`${i}`:e},ni=(t,e="")=>"string"==typeof t&&ri(t)?t:e,oi=t=>t.replace(/\s+/g," "),ai={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#0FF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000",blanchedalmond:"#FFEBCD",blue:"#00F",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#0FF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",darkgreen:"#006400",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#F0F",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",lightgreen:"#90EE90",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#0F0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#F0F",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",rebeccapurple:"#639",red:"#F00",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",white:"#FFF",whitesmoke:"#F5F5F5",yellow:"#FF0",yellowgreen:"#9ACD32"},li=(t,e,i)=>(i<0&&(i+=1),i>1&&--i,i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t),hi=(t,e,i,r)=>{t/=255,e/=255,i/=255;let s,n,o=Math.max(t,e,i),a=Math.min(t,e,i),l=(o+a)/2;if(o===a)s=n=0;else{let r=o-a;switch(n=l>.5?r/(2-o-a):r/(o+a),o){case t:s=(e-i)/r+(e<i?6:0);break;case e:s=(i-t)/r+2;break;case i:s=(t-e)/r+4}s/=6}return[Math.round(360*s),Math.round(100*n),Math.round(100*l),r]},ci=(t="1")=>parseFloat(t)/(t.endsWith("%")?100:1),ui=t=>Math.min(Math.round(t),255).toString(16).toUpperCase().padStart(2,"0"),di=([t,e,i,r=1])=>{let s=Math.round(.3*t+.59*e+.11*i);return[s,s,s,r]};var gi=class t{constructor(e){if(p(this,"isUnrecognised",!1),e)if(e instanceof t)this.setSource([...e._source]);else if(Array.isArray(e)){let[t,i,r,s=1]=e;this.setSource([t,i,r,s])}else this.setSource(this._tryParsingColor(e));else this.setSource([0,0,0,1])}_tryParsingColor(e){return(e=e.toLowerCase())in ai&&(e=ai[e]),"transparent"===e?[255,255,255,0]:t.sourceFromHex(e)||t.sourceFromRgb(e)||t.sourceFromHsl(e)||(this.isUnrecognised=!0)&&[0,0,0,1]}getSource(){return this._source}setSource(t){this._source=t}toRgb(){let[t,e,i]=this.getSource();return`rgb(${t},${e},${i})`}toRgba(){return`rgba(${this.getSource().join(",")})`}toHsl(){let[t,e,i]=hi(...this.getSource());return`hsl(${t},${e}%,${i}%)`}toHsla(){let[t,e,i,r]=hi(...this.getSource());return`hsla(${t},${e}%,${i}%,${r})`}toHex(){return this.toHexa().slice(0,6)}toHexa(){let[t,e,i,r]=this.getSource();return`${ui(t)}${ui(e)}${ui(i)}${ui(Math.round(255*r))}`}getAlpha(){return this.getSource()[3]}setAlpha(t){return this._source[3]=t,this}toGrayscale(){return this.setSource(di(this.getSource())),this}toBlackWhite(t){let[e,,,i]=di(this.getSource()),r=e<(t||127)?0:255;return this.setSource([r,r,r,i]),this}overlayWith(e){e instanceof t||(e=new t(e));let i=this.getSource(),r=e.getSource(),[s,n,o]=i.map((t,e)=>Math.round(.5*t+.5*r[e]));return this.setSource([s,n,o,i[3]]),this}static fromRgb(e){return t.fromRgba(e)}static fromRgba(e){return new t(t.sourceFromRgb(e))}static sourceFromRgb(t){let e=oi(t).match(/^rgba?\(\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?(?:\s?[,/]\s?(\d{0,3}(?:\.\d+)?%?)\s?)?\)$/i);if(e){let[t,i,r]=e.slice(1,4).map(t=>{let e=parseFloat(t);return t.endsWith("%")?Math.round(2.55*e):e});return[t,i,r,ci(e[4])]}}static fromHsl(e){return t.fromHsla(e)}static fromHsla(e){return new t(t.sourceFromHsl(e))}static sourceFromHsl(e){let i=oi(e).match(/^hsla?\(\s?([+-]?\d{0,3}(?:\.\d+)?(?:deg|turn|rad)?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?(?:\s?[,/]\s?(\d*(?:\.\d+)?%?)\s?)?\)$/i);if(!i)return;let r,s,n,o=(t.parseAngletoDegrees(i[1])%360+360)%360/360,a=parseFloat(i[2])/100,l=parseFloat(i[3])/100;if(0===a)r=s=n=l;else{let t=l<=.5?l*(a+1):l+a-l*a,e=2*l-t;r=li(e,t,o+1/3),s=li(e,t,o),n=li(e,t,o-1/3)}return[Math.round(255*r),Math.round(255*s),Math.round(255*n),ci(i[4])]}static fromHex(e){return new t(t.sourceFromHex(e))}static sourceFromHex(t){if(t.match(/^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i)){let e,i=t.slice(t.indexOf("#")+1);e=i.length<=4?i.split("").map(t=>t+t):i.match(/.{2}/g);let[r,s,n,o=255]=e.map(t=>parseInt(t,16));return[r,s,n,o/255]}}static parseAngletoDegrees(t){let e=t.toLowerCase(),i=parseFloat(e);return e.includes("rad")?Mt(i):e.includes("turn")?360*i:i}};const fi=t=>{let e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":return e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);case"radialGradient":return e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);case"stop":return e.concat(["offset","stop-color","stop-opacity"])}return e},pi=(t,e=16)=>{let i=/\D{0,2}$/.exec(t),r=parseFloat(t),s=y.DPI;switch(null==i?void 0:i[0]){case"mm":return r*s/25.4;case"cm":return r*s/2.54;case"in":return r*s;case"pt":return r*s/72;case"pc":return r*s/72*12;case"em":return r*e;default:return r}},mi=t=>{let[e,i]=t.trim().split(" "),[r,s]=(n=e)&&"none"!==n?[n.slice(1,4),n.slice(5,8)]:"none"===n?[n,n]:["Mid","Mid"];var n;return{meetOrSlice:i||"meet",alignX:r,alignY:s}},yi=(t,e,i=!0)=>{let r,s;if(e)if(e.toLive)r=`url(#SVGID_${fe(e.id)})`;else{let t=String(e);if(ri(t)){let e=new gi(t),i=e.getAlpha();r=e.toRgb(),1!==i&&(s=i.toString())}else r=new gi("black").toRgb()}else r="none";return i?`${t}: ${r}; ${s?`${t}-opacity: ${s}; `:""}`:`${t}="${r}" ${s?`${t}-opacity="${s}" `:""}`};var bi=class{getSvgStyles(t){let e=null==this.fillRule?"nonzero":ni(this.fillRule),i=null==this.strokeWidth?"0":si(this.strokeWidth),r=null==this.strokeDashArray?Y:this.strokeDashArray.every(t=>Number.isFinite(Number(t)))?this.strokeDashArray.join(" "):"",s=null==this.strokeDashOffset?"0":si(this.strokeDashOffset),n=null==this.strokeLineCap?"butt":ni(this.strokeLineCap),o=null==this.strokeLineJoin?"miter":ni(this.strokeLineJoin),a=null==this.strokeMiterLimit?"4":si(this.strokeMiterLimit),l=null==this.opacity?"1":si(this.opacity),h=this.visible?"":" visibility: hidden;",c=t?"":this.getSvgFilter(),u=yi(it,this.fill);return[yi(rt,this.stroke),i?`stroke-width: ${i}; `:"",r?`stroke-dasharray: ${r}; `:"",n?`stroke-linecap: ${n}; `:"",s?`stroke-dashoffset: ${s}; `:"",o?`stroke-linejoin: ${o}; `:"",a?`stroke-miterlimit: ${a}; `:"",u,e?`fill-rule: ${e}; `:"",l?`opacity: ${l};`:"",c,h].map(t=>fe(t)).join("")}getSvgFilter(){return this.shadow?`filter: url(#SVGID_${fe(this.shadow.id)});`:""}getSvgCommons(){return[this.id?`id="${fe(String(this.id))}" `:"",this.clipPath?`clip-path="url(#${fe(this.clipPath.clipPathId)})" `:""].join("")}getSvgTransform(t,e=""){return`transform="${Zt(t?this.calcTransformMatrix():this.calcOwnMatrix())}${e}" `}_toSVG(t){return[""]}toSVG(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})}toClipPathSVG(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})}_createBaseClipPathSVGMarkup(t,{reviver:e,additionalTransform:i=""}={}){let r=[this.getSvgTransform(!0,i),this.getSvgCommons()].join(""),s=t.indexOf("COMMON_PARTS");return t[s]=r,e?e(t.join("")):t.join("")}_createBaseSVGMarkup(t,{noStyle:e,reviver:i,withShadow:r,additionalTransform:s}={}){let n,o=e?"":`style="${this.getSvgStyles()}" `,a=r?`style="${this.getSvgFilter()}" `:"",l=this.clipPath,h=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",c=l&&l.absolutePositioned,u=this.stroke,d=this.fill,g=this.shadow,f=[],p=t.indexOf("COMMON_PARTS");return l&&(l.clipPathId=`CLIPPATH_${xt()}`,n=`<clipPath id="${l.clipPathId}" >\n${l.toClipPathSVG(i)}</clipPath>\n`),c&&f.push("<g ",a,this.getSvgCommons()," >\n"),f.push("<g ",this.getSvgTransform(!1),c?"":a+this.getSvgCommons()," >\n"),t[p]=[o,h,e?"":this.addPaintOrder()," ",s?`transform="${s}" `:""].join(""),te(d)&&f.push(d.toSVG(this)),te(u)&&f.push(u.toSVG(this)),g&&f.push(g.toSVG(this)),l&&f.push(n),f.push(t.join("")),f.push("</g>\n"),c&&f.push("</g>\n"),i?i(f.join("")):f.join("")}addPaintOrder(){return"fill"===this.paintFirst?"":` paint-order="${fe(this.paintFirst)}" `}};function _n(t){return RegExp("^("+t.join("|")+")\\b","i")}const _i="textDecorationThickness",vi="textDecorationColor",xi=["fontSize","fontWeight","fontFamily","fontStyle"],Ci=["underline","overline","linethrough"],wi=[...xi,"lineHeight","text","charSpacing","textAlign","styles","path","pathStartOffset","pathSide","pathAlign"],Si=[...wi,...Ci,"textBackgroundColor","direction",_i,vi],Ti=[...xi,...Ci,rt,"strokeWidth",it,"deltaY","textBackgroundColor",_i,vi],Oi={_reNewline:W,_reSpacesAndTabs:/[ \t\r]/g,_reSpaceAndTab:/[ \t\r]/,_reWords:/\S+/g,fontSize:40,fontWeight:nt,fontFamily:"Times New Roman",underline:!1,overline:!1,linethrough:!1,textAlign:B,fontStyle:nt,lineHeight:1.16,textBackgroundColor:"",stroke:null,shadow:null,path:void 0,pathStartOffset:0,pathSide:B,pathAlign:"baseline",charSpacing:0,deltaY:0,direction:"ltr",CACHE_FONT_SIZE:400,MIN_TEXT_WIDTH:2,superscript:{size:.6,baseline:-.35},subscript:{size:.6,baseline:.11},_fontSizeFraction:.222,offsets:{underline:.1,linethrough:-.28167,overline:-.81333},_fontSizeMult:1.13,[_i]:66.667},ki="justify",Di=String.raw`[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?`,Mi=String.raw`(?:\s*,?\s+|\s*,\s*)`,ji=RegExp("(normal|italic)?\\s*(normal|small-caps)?\\s*(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*("+Di+"(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|"+Di+"))?\\s+(.*)"),Ei={cx:B,x:B,r:"radius",cy:"top",y:"top",display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","letter-spacing":"charSpacing","paint-order":"paintFirst","stroke-dasharray":"strokeDashArray","stroke-dashoffset":"strokeDashOffset","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"textAnchor",opacity:"opacity","clip-path":"clipPath","clip-rule":"clipRule","vector-effect":"strokeUniform","image-rendering":"imageSmoothing","text-decoration-thickness":_i,"text-decoration-color":vi},Pi="font-size",Ai="clip-path",Fi=(_n(["path","circle","polygon","polyline","ellipse","rect","line","image","text"]),_n(["symbol","image","marker","pattern","view","svg"]),_n(["symbol","g","a","svg","clipPath","defs"])),Li=(new RegExp(String.raw`^\s*(${Di})${Mi}(${Di})${Mi}(${Di})${Mi}(${Di})\s*$`),"(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?"),Ii=RegExp("(?:\\s|^)"+Li+Li+"("+Di+"?(?:px)?)?(?:\\s?|$)(?:$|\\s)");var Ri=class t{constructor(e={}){let i="string"==typeof e?t.parseShadow(e):e;Object.assign(this,t.ownDefaults,i),this.id=xt()}static parseShadow(t){let e=t.trim(),[,i=0,r=0,s=0]=(Ii.exec(e)||[]).map(t=>parseFloat(t)||0);return{color:(e.replace(Ii,"")||"rgb(0,0,0)").trim(),offsetX:i,offsetY:r,blur:s}}toString(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")}toSVG(t){let e=$e(new gt(this.offsetX,this.offsetY),Dt(-t.angle)),i=y.NUM_FRACTION_DIGITS,r=new gi(this.color),s=40,n=40;return t.width&&t.height&&(s=100*Qt((Math.abs(e.x)+this.blur)/t.width,i)+20,n=100*Qt((Math.abs(e.y)+this.blur)/t.height,i)+20),t.flipX&&(e.x*=-1),t.flipY&&(e.y*=-1),`<filter id="SVGID_${fe(this.id)}" y="-${n}%" height="${100+2*n}%" x="-${s}%" width="${100+2*s}%" >\n\t<feGaussianBlur in="SourceAlpha" stdDeviation="${Qt(this.blur?this.blur/2:0,i)}"></feGaussianBlur>\n\t<feOffset dx="${Qt(e.x,i)}" dy="${Qt(e.y,i)}" result="oBlur" ></feOffset>\n\t<feFlood flood-color="${r.toRgb()}" flood-opacity="${r.getAlpha()}"/>\n\t<feComposite in2="oBlur" operator="in" />\n\t<feMerge>\n\t\t<feMergeNode></feMergeNode>\n\t\t<feMergeNode in="SourceGraphic"></feMergeNode>\n\t</feMerge>\n</filter>\n`}toObject(){let e={color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling,type:this.constructor.type},i=t.ownDefaults;return this.includeDefaultValues?e:Jt(e,(t,e)=>t!==i[e])}static async fromObject(t){return new this(t)}};p(Ri,"ownDefaults",{color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1}),p(Ri,"type","shadow"),at.setClass(Ri,"shadow");const Bi=(t,e,i)=>Math.max(t,Math.min(e,i)),$i=["top",B,Q,Z,"flipX","flipY","originX","originY","angle","opacity","globalCompositeOperation","shadow","visible",tt,et],Xi=[it,rt,"strokeWidth","strokeDashArray","width","height","paintFirst","strokeUniform","strokeLineCap","strokeDashOffset","strokeLineJoin","strokeMiterLimit","backgroundColor","clipPath"],Yi={top:0,left:0,width:0,height:0,angle:0,flipX:!1,flipY:!1,scaleX:1,scaleY:1,minScaleLimit:0,skewX:0,skewY:0,originX:R,originY:R,strokeWidth:1,strokeUniform:!1,padding:0,opacity:1,paintFirst:it,fill:"rgb(0,0,0)",fillRule:"nonzero",stroke:null,strokeDashArray:null,strokeDashOffset:0,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:4,globalCompositeOperation:"source-over",backgroundColor:"",shadow:null,visible:!0,includeDefaultValues:!0,excludeFromExport:!1,objectCaching:!0,clipPath:void 0,inverted:!1,absolutePositioned:!1,centeredRotation:!0,centeredScaling:!1,dirty:!0};var Wi=d({defaultEasing:()=>zi,easeInBack:()=>gr,easeInBounce:()=>yr,easeInCirc:()=>ar,easeInCubic:()=>Hi,easeInElastic:()=>cr,easeInExpo:()=>sr,easeInOutBack:()=>pr,easeInOutBounce:()=>br,easeInOutCirc:()=>hr,easeInOutCubic:()=>Ui,easeInOutElastic:()=>dr,easeInOutExpo:()=>or,easeInOutQuad:()=>xr,easeInOutQuart:()=>Ji,easeInOutQuint:()=>tr,easeInOutSine:()=>rr,easeInQuad:()=>_r,easeInQuart:()=>qi,easeInQuint:()=>Qi,easeInSine:()=>er,easeOutBack:()=>fr,easeOutBounce:()=>mr,easeOutCirc:()=>lr,easeOutCubic:()=>Gi,easeOutElastic:()=>ur,easeOutExpo:()=>nr,easeOutQuad:()=>vr,easeOutQuart:()=>Ki,easeOutQuint:()=>Zi,easeOutSine:()=>ir});const Ni=(t,e,i,r)=>(t<Math.abs(e)?(t=e,r=i/4):r=0===e&&0===t?i/F*Math.asin(1):i/F*Math.asin(e/t),{a:t,c:e,p:i,s:r}),Vi=(t,e,i,r,s)=>t*2**(10*--r)*Math.sin((r*s-e)*F/i),zi=(t,e,i,r)=>-i*Math.cos(t/r*P)+i+e,Hi=(t,e,i,r)=>i*(t/r)**3+e,Gi=(t,e,i,r)=>i*((t/r-1)**3+1)+e,Ui=(t,e,i,r)=>(t/=r/2)<1?i/2*t**3+e:i/2*((t-2)**3+2)+e,qi=(t,e,i,r)=>i*(t/=r)*t**3+e,Ki=(t,e,i,r)=>-i*((t=t/r-1)*t**3-1)+e,Ji=(t,e,i,r)=>(t/=r/2)<1?i/2*t**4+e:-i/2*((t-=2)*t**3-2)+e,Qi=(t,e,i,r)=>i*(t/r)**5+e,Zi=(t,e,i,r)=>i*((t/r-1)**5+1)+e,tr=(t,e,i,r)=>(t/=r/2)<1?i/2*t**5+e:i/2*((t-2)**5+2)+e,er=(t,e,i,r)=>-i*Math.cos(t/r*P)+i+e,ir=(t,e,i,r)=>i*Math.sin(t/r*P)+e,rr=(t,e,i,r)=>-i/2*(Math.cos(Math.PI*t/r)-1)+e,sr=(t,e,i,r)=>0===t?e:i*2**(10*(t/r-1))+e,nr=(t,e,i,r)=>t===r?e+i:i*-(2**(-10*t/r)+1)+e,or=(t,e,i,r)=>0===t?e:t===r?e+i:(t/=r/2)<1?i/2*2**(10*(t-1))+e:i/2*-(2**(-10*(t-1))+2)+e,ar=(t,e,i,r)=>-i*(Math.sqrt(1-(t/=r)*t)-1)+e,lr=(t,e,i,r)=>i*Math.sqrt(1-(t=t/r-1)*t)+e,hr=(t,e,i,r)=>(t/=r/2)<1?-i/2*(Math.sqrt(1-t**2)-1)+e:i/2*(Math.sqrt(1-(t-=2)*t)+1)+e,cr=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(1===(t/=r))return e+i;n||(n=.3*r);let{a:o,s:a,p:l}=Ni(s,i,n,1.70158);return-Vi(o,a,l,t,r)+e},ur=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(1===(t/=r))return e+i;n||(n=.3*r);let{a:o,s:a,p:l,c:h}=Ni(s,i,n,1.70158);return o*2**(-10*t)*Math.sin((t*r-a)*F/l)+h+e},dr=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(2==(t/=r/2))return e+i;n||(n=.3*1.5*r);let{a:o,s:a,p:l,c:h}=Ni(s,i,n,1.70158);return t<1?-.5*Vi(o,a,l,t,r)+e:o*2**(-10*--t)*Math.sin((t*r-a)*F/l)*.5+h+e},gr=(t,e,i,r,s=1.70158)=>i*(t/=r)*t*((s+1)*t-s)+e,fr=(t,e,i,r,s=1.70158)=>i*((t=t/r-1)*t*((s+1)*t+s)+1)+e,pr=(t,e,i,r,s=1.70158)=>(t/=r/2)<1?i/2*(t*t*((1+(s*=1.525))*t-s))+e:i/2*((t-=2)*t*((1+(s*=1.525))*t+s)+2)+e,mr=(t,e,i,r)=>(t/=r)<1/2.75?i*(7.5625*t*t)+e:t<2/2.75?i*(7.5625*(t-=1.5/2.75)*t+.75)+e:t<2.5/2.75?i*(7.5625*(t-=2.25/2.75)*t+.9375)+e:i*(7.5625*(t-=2.625/2.75)*t+.984375)+e,yr=(t,e,i,r)=>i-mr(r-t,0,i,r)+e,br=(t,e,i,r)=>t<r/2?.5*yr(2*t,0,i,r)+e:.5*mr(2*t-r,0,i,r)+.5*i+e,_r=(t,e,i,r)=>i*(t/=r)*t+e,vr=(t,e,i,r)=>-i*(t/=r)*(t-2)+e,xr=(t,e,i,r)=>(t/=r/2)<1?i/2*t**2+e:-i/2*(--t*(t-2)-1)+e,Cr=()=>!1;var wr=class{constructor({startValue:t,byValue:e,duration:i=500,delay:r=0,easing:s=zi,onStart:n=E,onChange:o=E,onComplete:a=E,abort:l=Cr,target:h}){p(this,"_state","pending"),p(this,"durationProgress",0),p(this,"valueProgress",0),this.tick=this.tick.bind(this),this.duration=i,this.delay=r,this.easing=s,this._onStart=n,this._onChange=o,this._onComplete=a,this._abort=l,this.target=h,this.startValue=t,this.byValue=e,this.value=this.startValue,this.endValue=Object.freeze(this.calculate(this.duration).value)}get state(){return this._state}isDone(){return"aborted"===this._state||"completed"===this._state}start(){let t=t=>{"pending"===this._state&&(this.startTime=t||+new Date,this._state="running",this._onStart(),this.tick(this.startTime))};this.register(),this.delay>0?this.timeout=k().setTimeout(()=>bt(t),this.delay):bt(t)}tick(t){let e=(t||+new Date)-this.startTime,i=Math.min(e,this.duration);this.durationProgress=i/this.duration;let{value:r,valueProgress:s}=this.calculate(i);this.value=Object.freeze(r),this.valueProgress=s,"aborted"!==this._state&&(this._abort(this.value,this.valueProgress,this.durationProgress)?(this._state="aborted",this.unregister()):e>=this.duration?(this.durationProgress=this.valueProgress=1,this._onChange(this.endValue,this.valueProgress,this.durationProgress),this._state="completed",this._onComplete(this.endValue,this.valueProgress,this.durationProgress),this.unregister(),this.timeout=null):(this._onChange(this.value,this.valueProgress,this.durationProgress),bt(this.tick)))}register(){lt.push(this)}unregister(){lt.remove(this)}abort(){this._state="aborted",this.unregister(),this.timeout&&k().clearTimeout(this.timeout)}},Sr=class extends wr{constructor({startValue:t=0,endValue:e=100,...i}){super({...i,startValue:t,byValue:e-t})}calculate(t){let e=this.easing(t,this.startValue,this.byValue,this.duration);return{value:e,valueProgress:Math.abs((e-this.startValue)/this.byValue)}}},Tr=class extends wr{constructor({startValue:t=[0],endValue:e=[100],...i}){super({...i,startValue:t,byValue:e.map((e,i)=>e-t[i])})}calculate(t){let e=this.startValue.map((e,i)=>this.easing(t,e,this.byValue[i],this.duration,i));return{value:e,valueProgress:Math.abs((e[0]-this.startValue[0])/this.byValue[0])}}};const Or=(t,e,i,r)=>e+i*(1-Math.cos(t/r*P)),kr=t=>t&&((e,i,r)=>t(new gi(e).toRgba(),i,r));var Dr=class extends wr{constructor({startValue:t,endValue:e,easing:i=Or,onChange:r,onComplete:s,abort:n,...o}){let a=new gi(t).getSource(),l=new gi(e).getSource();super({...o,startValue:a,byValue:l.map((t,e)=>t-a[e]),easing:i,onChange:kr(r),onComplete:kr(s),abort:kr(n)})}calculate(t){let[e,i,r,s]=this.startValue.map((e,i)=>this.easing(t,e,this.byValue[i],this.duration,i)),n=[...[e,i,r].map(Math.round),Bi(0,s,1)];return{value:n,valueProgress:n.map((t,e)=>0===this.byValue[e]?0:Math.abs((t-this.startValue[e])/this.byValue[e])).find(t=>0!==t)||0}}};function Mr(t){let e=(t=>Array.isArray(t.startValue)||Array.isArray(t.endValue))(t)?new Tr(t):new Sr(t);return e.start(),e}function jr(t){let e=new Dr(t);return e.start(),e}var Er=class t{constructor(t){this.status=t,this.points=[]}includes(t){return this.points.some(e=>e.eq(t))}append(...t){return this.points=this.points.concat(t.filter(t=>!this.includes(t))),this}static isPointContained(t,e,i,r=!1){if(e.eq(i))return t.eq(e);if(e.x===i.x)return t.x===e.x&&(r||t.y>=Math.min(e.y,i.y)&&t.y<=Math.max(e.y,i.y));if(e.y===i.y)return t.y===e.y&&(r||t.x>=Math.min(e.x,i.x)&&t.x<=Math.max(e.x,i.x));{let s=Xe(e,i),n=Xe(e,t).divide(s);return r?Math.abs(n.x)===Math.abs(n.y):n.x===n.y&&n.x>=0&&n.x<=1}}static isPointInPolygon(t,e){let i=new gt(t).setX(Math.min(t.x-1,...e.map(t=>t.x))),r=0;for(let s=0;s<e.length;s++){let n=this.intersectSegmentSegment(e[s],e[(s+1)%e.length],t,i);if(n.includes(t))return!0;r+=Number("Intersection"===n.status)}return r%2==1}static intersectLineLine(e,i,r,s,n=!0,o=!0){let a=i.x-e.x,l=i.y-e.y,h=s.x-r.x,c=s.y-r.y,u=e.x-r.x,d=e.y-r.y,g=h*d-c*u,f=a*d-l*u,p=c*a-h*l;if(0!==p){let i=g/p,r=f/p;return(n||0<=i&&i<=1)&&(o||0<=r&&r<=1)?new t("Intersection").append(new gt(e.x+i*a,e.y+i*l)):new t}return new t(0===g||0===f?n||o||t.isPointContained(e,r,s)||t.isPointContained(i,r,s)||t.isPointContained(r,e,i)||t.isPointContained(s,e,i)?"Coincident":void 0:"Parallel")}static intersectSegmentLine(e,i,r,s){return t.intersectLineLine(e,i,r,s,!1,!0)}static intersectSegmentSegment(e,i,r,s){return t.intersectLineLine(e,i,r,s,!1,!1)}static intersectLinePolygon(e,i,r,s=!0){let n=new t,o=r.length;for(let a,l,h,c=0;c<o;c++){if(a=r[c],l=r[(c+1)%o],h=t.intersectLineLine(e,i,a,l,s,!1),"Coincident"===h.status)return h;n.append(...h.points)}return n.points.length>0&&(n.status="Intersection"),n}static intersectSegmentPolygon(e,i,r){return t.intersectLinePolygon(e,i,r,!1)}static intersectPolygonPolygon(e,i){let r=new t,s=e.length,n=[];for(let o=0;o<s;o++){let a=e[o],l=e[(o+1)%s],h=t.intersectSegmentPolygon(a,l,i);"Coincident"===h.status?(n.push(h),r.append(a,l)):r.append(...h.points)}return n.length>0&&n.length===e.length?new t("Coincident"):(r.points.length>0&&(r.status="Intersection"),r)}static intersectPolygonRectangle(e,i,r){let s=i.min(r),n=i.max(r),o=new gt(n.x,s.y),a=new gt(s.x,n.y);return t.intersectPolygonPolygon(e,[s,o,n,a])}},Pr=class extends yt{getX(){return this.getXY().x}setX(t){this.setXY(this.getXY().setX(t))}getY(){return this.getXY().y}setY(t){this.setXY(this.getXY().setY(t))}getRelativeX(){return this.left}setRelativeX(t){this.left=t}getRelativeY(){return this.top}setRelativeY(t){this.top=t}getXY(){let t=this.getRelativeXY();return this.group?Et(t,this.group.calcTransformMatrix()):t}setXY(t,e,i){this.group&&(t=Et(t,Pt(this.group.calcTransformMatrix()))),this.setRelativeXY(t,e,i)}getRelativeXY(){return new gt(this.left,this.top)}setRelativeXY(t,e=this.originX,i=this.originY){this.setPositionByOrigin(t,e,i)}isStrokeAccountedForInDimensions(){return!1}getCoords(){let{tl:t,tr:e,br:i,bl:r}=this.aCoords||(this.aCoords=this.calcACoords()),s=[t,e,i,r];if(this.group){let t=this.group.calcTransformMatrix();return s.map(e=>Et(e,t))}return s}intersectsWithRect(t,e){return"Intersection"===Er.intersectPolygonRectangle(this.getCoords(),t,e).status}intersectsWithObject(t){let e=Er.intersectPolygonPolygon(this.getCoords(),t.getCoords());return"Intersection"===e.status||"Coincident"===e.status||t.isContainedWithinObject(this)||this.isContainedWithinObject(t)}isContainedWithinObject(t){return this.getCoords().every(e=>t.containsPoint(e))}isContainedWithinRect(t,e){let{left:i,top:r,width:s,height:n}=this.getBoundingRect();return i>=t.x&&i+s<=e.x&&r>=t.y&&r+n<=e.y}isOverlapping(t){return this.intersectsWithObject(t)||this.isContainedWithinObject(t)||t.isContainedWithinObject(this)}containsPoint(t){return Er.isPointInPolygon(t,this.getCoords())}isOnScreen(){if(!this.canvas)return!1;let{tl:t,br:e}=this.canvas.vptCoords;return!!this.getCoords().some(i=>i.x<=e.x&&i.x>=t.x&&i.y<=e.y&&i.y>=t.y)||!!this.intersectsWithRect(t,e)||this.containsPoint(t.midPointFrom(e))}isPartiallyOnScreen(){if(!this.canvas)return!1;let{tl:t,br:e}=this.canvas.vptCoords;return!!this.intersectsWithRect(t,e)||this.getCoords().every(i=>(i.x>=e.x||i.x<=t.x)&&(i.y>=e.y||i.y<=t.y))&&this.containsPoint(t.midPointFrom(e))}getBoundingRect(){return Se(this.getCoords())}getScaledWidth(){return this._getTransformedDimensions().x}getScaledHeight(){return this._getTransformedDimensions().y}scale(t){this._set(Q,t),this._set(Z,t),this.setCoords()}scaleToWidth(t){let e=this.getBoundingRect().width/this.getScaledWidth();return this.scale(t/this.width/e)}scaleToHeight(t){let e=this.getBoundingRect().height/this.getScaledHeight();return this.scale(t/this.height/e)}getCanvasRetinaScaling(){var t;return(null==(t=this.canvas)?void 0:t.getRetinaScaling())||1}getTotalAngle(){return this.group?Mt(Lt(this.calcTransformMatrix())):this.angle}getViewportTransform(){var t;return(null==(t=this.canvas)?void 0:t.viewportTransform)||I.concat()}calcACoords(){let t=Xt({angle:this.angle}),{x:e,y:i}=this.getRelativeCenterPoint(),r=At($t(e,i),t),s=this._getTransformedDimensions(),n=s.x/2,o=s.y/2;return{tl:Et({x:-n,y:-o},r),tr:Et({x:n,y:-o},r),bl:Et({x:-n,y:o},r),br:Et({x:n,y:o},r)}}setCoords(){this.aCoords=this.calcACoords()}transformMatrixKey(t=!1){let e=[];return!t&&this.group&&(e=this.group.transformMatrixKey(t)),e.push(this.top,this.left,this.width,this.height,this.scaleX,this.scaleY,this.angle,this.strokeWidth,this.skewX,this.skewY,+this.flipX,+this.flipY,Ie(this.originX),Ie(this.originY)),e}calcTransformMatrix(t=!1){let e=this.calcOwnMatrix();if(t||!this.group)return e;let i=this.transformMatrixKey(t),r=this.matrixCache;return r&&r.key.every((t,e)=>t===i[e])?r.value:(this.group&&(e=At(this.group.calcTransformMatrix(!1),e)),this.matrixCache={key:i,value:e},e)}calcOwnMatrix(){let t=this.transformMatrixKey(!0),e=this.ownMatrixCache;if(e&&e.key.every((e,i)=>e===t[i]))return e.value;let i=this.getRelativeCenterPoint(),r=Ht({angle:this.angle,translateX:i.x,translateY:i.y,scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,flipX:this.flipX,flipY:this.flipY});return this.ownMatrixCache={key:t,value:r},r}_getNonTransformedDimensions(){return new gt(this.width,this.height).scalarAdd(this.strokeWidth)}_calculateCurrentDimensions(t){var e;let i=null==(e=this.canvas)?void 0:e.viewportTransform,r=this._getTransformedDimensions(t);return i?r.multiply(new gt(It(i),Rt(i))).scalarAdd(2*this.padding):r.scalarAdd(2*this.padding)}_getTransformedDimensions(t={}){let e={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,width:this.width,height:this.height,strokeWidth:this.strokeWidth,...t},i=e.strokeWidth,r=i,s=0;this.strokeUniform&&(r=0,s=i);let n,o=e.width+r,a=e.height+r;return n=0===e.skewX&&0===e.skewY?new gt(o*e.scaleX,a*e.scaleY):je(o,a,zt(e)),n.scalarAdd(s)}translateToGivenOrigin(t,e,i,r,s){let n=t.x,o=t.y,a=Ie(r)-Ie(e),l=Ie(s)-Ie(i);if(a||l){let t=this._getTransformedDimensions();n+=a*t.x,o+=l*t.y}return new gt(n,o)}translateToCenterPoint(t,e,i){if("center"===e&&"center"===i)return t;let r=this.translateToGivenOrigin(t,e,i,R,R);return this.angle?r.rotate(Dt(this.angle),t):r}translateToOriginPoint(t,e,i){let r=this.translateToGivenOrigin(t,R,R,e,i);return this.angle?r.rotate(Dt(this.angle),t):r}getCenterPoint(){let t=this.getRelativeCenterPoint();return this.group?Et(t,this.group.calcTransformMatrix()):t}getRelativeCenterPoint(){return this.translateToCenterPoint(new gt(this.left,this.top),this.originX,this.originY)}getPointByOrigin(t,e){return this.getPositionByOrigin(t,e)}getPositionByOrigin(t,e){return this.translateToOriginPoint(this.getRelativeCenterPoint(),t,e)}setPositionByOrigin(t,e,i){let r=this.translateToCenterPoint(t,e,i),s=this.translateToOriginPoint(r,this.originX,this.originY);this.set({left:s.x,top:s.y})}_getLeftTopCoords(){return this.getPositionByOrigin(B,"top")}positionByLeftTop(t){return this.setPositionByOrigin(t,B,"top")}},Ar=class t extends Pr{static getDefaults(){return t.ownDefaults}get type(){let t=this.constructor.type;return"FabricObject"===t?"object":t.toLowerCase()}set type(t){b("warn","Setting type has no effect",t)}constructor(e){super(),p(this,"_cacheContext",null),Object.assign(this,t.ownDefaults),this.setOptions(e)}_createCacheCanvas(){this._cacheCanvas=Ct(),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas(),this.dirty=!0}_limitCacheSize(t){let e=t.width,i=t.height,r=y.maxCacheSideLimit,s=y.minCacheSideLimit;if(e<=r&&i<=r&&e*i<=y.perfLimitSizeTotal)return e<s&&(t.width=s),i<s&&(t.height=s),t;let n=e/i,[o,a]=M.limitDimsByArea(n),l=Bi(s,o,r),h=Bi(s,a,r);return e>l&&(t.zoomX/=e/l,t.width=l,t.capped=!0),i>h&&(t.zoomY/=i/h,t.height=h,t.capped=!0),t}_getCacheCanvasDimensions(){let t=this.getTotalObjectScaling(),e=this._getTransformedDimensions({skewX:0,skewY:0}),i=e.x*t.x/this.scaleX,r=e.y*t.y/this.scaleY;return{width:Math.ceil(i+2),height:Math.ceil(r+2),zoomX:t.x,zoomY:t.y,x:i,y:r}}_updateCacheCanvas(){let t=this._cacheCanvas,e=this._cacheContext,{width:i,height:r,zoomX:s,zoomY:n,x:o,y:a}=this._limitCacheSize(this._getCacheCanvasDimensions()),l=i!==t.width||r!==t.height,h=this.zoomX!==s||this.zoomY!==n;if(!t||!e)return!1;if(l||h){i!==t.width||r!==t.height?(t.width=i,t.height=r):(e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t.width,t.height));let l=o/2,h=a/2;return this.cacheTranslationX=Math.round(t.width/2-l)+l,this.cacheTranslationY=Math.round(t.height/2-h)+h,e.translate(this.cacheTranslationX,this.cacheTranslationY),e.scale(s,n),this.zoomX=s,this.zoomY=n,!0}return!1}setOptions(t={}){this._setOptions(t)}transform(t){let e=this.group&&!this.group._transformDone||this.group&&this.canvas&&t===this.canvas.contextTop,i=this.calcTransformMatrix(!e);t.transform(i[0],i[1],i[2],i[3],i[4],i[5])}getObjectScaling(){if(!this.group)return new gt(Math.abs(this.scaleX),Math.abs(this.scaleY));let t=Bt(this.calcTransformMatrix());return new gt(Math.abs(t.scaleX),Math.abs(t.scaleY))}getTotalObjectScaling(){let t=this.getObjectScaling();if(this.canvas){let e=this.canvas.getZoom(),i=this.getCanvasRetinaScaling();return t.scalarMultiply(e*i)}return t}getObjectOpacity(){let t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t}_constrainScale(t){return Math.abs(t)<this.minScaleLimit?t<0?-this.minScaleLimit:this.minScaleLimit:0===t?1e-4:t}_set(t,e){"scaleX"!==t&&"scaleY"!==t||(e=this._constrainScale(e)),"scaleX"===t&&e<0?(this.flipX=!this.flipX,e*=-1):"scaleY"===t&&e<0?(this.flipY=!this.flipY,e*=-1):"shadow"!==t||!e||e instanceof Ri||(e=new Ri(e));let i=this[t]!==e;return this[t]=e,i&&this.constructor.cacheProperties.includes(t)&&(this.dirty=!0),this.parent&&(this.dirty||i&&this.constructor.stateProperties.includes(t))&&this.parent._set("dirty",!0),this}isNotVisible(){return 0===this.opacity||!this.width&&!this.height&&0===this.strokeWidth||!this.visible}render(t){this.isNotVisible()||this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),this.transform(t),this._setOpacity(t),this._setShadow(t),this.shouldCache()?(this.renderCache(),this.drawCacheOnCanvas(t)):(this._removeCacheCanvas(),this.drawObject(t,!1,{}),this.dirty=!1),t.restore())}drawSelectionBackground(t){}renderCache(t){if(t=t||{},this._cacheCanvas&&this._cacheContext||this._createCacheCanvas(),this.isCacheDirty()&&this._cacheContext){let{zoomX:e,zoomY:i,cacheTranslationX:r,cacheTranslationY:s}=this,{width:n,height:o}=this._cacheCanvas;this.drawObject(this._cacheContext,t.forClipping,{zoomX:e,zoomY:i,cacheTranslationX:r,cacheTranslationY:s,width:n,height:o,parentClipPaths:[]}),this.dirty=!1}}_removeCacheCanvas(){this._cacheCanvas=void 0,this._cacheContext=null}hasStroke(){return!!this.stroke&&"transparent"!==this.stroke&&0!==this.strokeWidth}hasFill(){return!!this.fill&&"transparent"!==this.fill}needsItsOwnCache(){return!!("stroke"===this.paintFirst&&this.hasFill()&&this.hasStroke()&&this.shadow)||!!this.clipPath}shouldCache(){return this.ownCaching=this.objectCaching&&(!this.parent||!this.parent.isOnACache())||this.needsItsOwnCache(),this.ownCaching}willDrawShadow(){return!!this.shadow&&(0!==this.shadow.offsetX||0!==this.shadow.offsetY)}drawClipPathOnCache(t,e,i){t.save(),e.inverted?t.globalCompositeOperation="destination-out":t.globalCompositeOperation="destination-in",t.setTransform(1,0,0,1,0,0),t.drawImage(i,0,0),t.restore()}drawObject(t,e,i){let r=this.fill,s=this.stroke;e?(this.fill="black",this.stroke="",this._setClippingProperties(t)):this._renderBackground(t),this.fire("before:render",{ctx:t}),this._render(t),this._drawClipPath(t,this.clipPath,i),this.fill=r,this.stroke=s}createClipPathLayer(t,e){let i=Tt(e),r=i.getContext("2d");if(r.translate(e.cacheTranslationX,e.cacheTranslationY),r.scale(e.zoomX,e.zoomY),t._cacheCanvas=i,e.parentClipPaths.forEach(t=>{t.transform(r)}),e.parentClipPaths.push(t),t.absolutePositioned){let t=Pt(this.calcTransformMatrix());r.transform(t[0],t[1],t[2],t[3],t[4],t[5])}return t.transform(r),t.drawObject(r,!0,e),i}_drawClipPath(t,e,i){if(!e)return;e._transformDone=!0;let r=this.createClipPathLayer(e,i);this.drawClipPathOnCache(t,e,r)}drawCacheOnCanvas(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)}isCacheDirty(t=!1){if(this.isNotVisible())return!1;let e=this._cacheCanvas,i=this._cacheContext;return!(!e||!i||t||!this._updateCacheCanvas())||!!(this.dirty||this.clipPath&&this.clipPath.absolutePositioned)&&(e&&i&&!t&&(i.save(),i.setTransform(1,0,0,1,0,0),i.clearRect(0,0,e.width,e.height),i.restore()),!0)}_renderBackground(t){if(!this.backgroundColor)return;let e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}_setOpacity(t){this.group&&!this.group._transformDone?t.globalAlpha=this.getObjectOpacity():t.globalAlpha*=this.opacity}_setStrokeStyles(t,e){let i=e.stroke;i&&(t.lineWidth=e.strokeWidth,t.lineCap=e.strokeLineCap,t.lineDashOffset=e.strokeDashOffset,t.lineJoin=e.strokeLineJoin,t.miterLimit=e.strokeMiterLimit,te(i)?"percentage"===i.gradientUnits||i.gradientTransform||i.patternTransform?this._applyPatternForTransformedGradient(t,i):(t.strokeStyle=i.toLive(t),this._applyPatternGradientTransform(t,i)):t.strokeStyle=e.stroke)}_setFillStyles(t,{fill:e}){e&&(te(e)?(t.fillStyle=e.toLive(t),this._applyPatternGradientTransform(t,e)):t.fillStyle=e)}_setClippingProperties(t){t.globalAlpha=1,t.strokeStyle="transparent",t.fillStyle="#000000"}_setLineDash(t,e){e&&0!==e.length&&t.setLineDash(e)}_setShadow(t){if(!this.shadow)return;let e=this.shadow,i=this.canvas,r=this.getCanvasRetinaScaling(),[s,,,n]=(null==i?void 0:i.viewportTransform)||I,o=s*r,a=n*r,l=e.nonScaling?new gt(1,1):this.getObjectScaling();t.shadowColor=e.color,t.shadowBlur=e.blur*y.browserShadowBlurConstant*(o+a)*(l.x+l.y)/4,t.shadowOffsetX=e.offsetX*o*l.x,t.shadowOffsetY=e.offsetY*a*l.y}_removeShadow(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)}_applyPatternGradientTransform(t,e){if(!te(e))return{offsetX:0,offsetY:0};let i=e.gradientTransform||e.patternTransform,r=-this.width/2+e.offsetX||0,s=-this.height/2+e.offsetY||0;return"percentage"===e.gradientUnits?t.transform(this.width,0,0,this.height,r,s):t.transform(1,0,0,1,r,s),i&&t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),{offsetX:r,offsetY:s}}_renderPaintInOrder(t){"stroke"===this.paintFirst?(this._renderStroke(t),this._renderFill(t)):(this._renderFill(t),this._renderStroke(t))}_render(t){}_renderFill(t){this.fill&&(t.save(),this._setFillStyles(t,this),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())}_renderStroke(t){if(this.stroke&&0!==this.strokeWidth){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this.strokeUniform){let e=this.getObjectScaling();t.scale(1/e.x,1/e.y)}this._setLineDash(t,this.strokeDashArray),this._setStrokeStyles(t,this),t.stroke(),t.restore()}}_applyPatternForTransformedGradient(t,e){var i;let r=this._limitCacheSize(this._getCacheCanvasDimensions()),s=this.getCanvasRetinaScaling(),n=r.x/this.scaleX/s,o=r.y/this.scaleY/s,a=Tt({width:Math.ceil(n),height:Math.ceil(o)}),l=a.getContext("2d");l&&(l.beginPath(),l.moveTo(0,0),l.lineTo(n,0),l.lineTo(n,o),l.lineTo(0,o),l.closePath(),l.translate(n/2,o/2),l.scale(r.zoomX/this.scaleX/s,r.zoomY/this.scaleY/s),this._applyPatternGradientTransform(l,e),l.fillStyle=e.toLive(t),l.fill(),t.translate(-this.width/2-this.strokeWidth/2,-this.height/2-this.strokeWidth/2),t.scale(s*this.scaleX/r.zoomX,s*this.scaleY/r.zoomY),t.strokeStyle=null==(i=l.createPattern(a,"no-repeat"))?"":i)}_findCenterFromElement(){return new gt(this.left+this.width/2,this.top+this.height/2)}clone(t){let e=this.toObject(t);return this.constructor.fromObject(e)}cloneAsImage(t){let e=this.toCanvasElement(t);return new(at.getClass("image"))(e)}toCanvasElement(t={}){let e=Me(this),i=this.group,r=this.shadow,s=Math.abs,n=t.enableRetinaScaling?D():1,o=(t.multiplier||1)*n,a=t.canvasProvider||(t=>new _e(t,{enableRetinaScaling:!1,renderOnAddRemove:!1,skipOffscreen:!1}));delete this.group,t.withoutTransform&&De(this),t.withoutShadow&&(this.shadow=null),t.viewportTransform&&Fe(this,this.getViewportTransform()),this.setCoords();let l=Ct(),h=this.getBoundingRect(),c=this.shadow,u=new gt;if(c){let t=c.blur,e=c.nonScaling?new gt(1,1):this.getObjectScaling();u.x=2*Math.round(s(c.offsetX)+t)*s(e.x),u.y=2*Math.round(s(c.offsetY)+t)*s(e.y)}let d=h.width+u.x,g=h.height+u.y;l.width=Math.ceil(d),l.height=Math.ceil(g);let f=a(l);"jpeg"===t.format&&(f.backgroundColor="#fff"),this.setPositionByOrigin(new gt(f.width/2,f.height/2),R,R);let p=this.canvas;f._objects=[this],this.set("canvas",f),this.setCoords();let m=f.toCanvasElement(o||1,t);return this.set("canvas",p),this.shadow=r,i&&(this.group=i),this.set(e),this.setCoords(),f._objects=[],f.destroy(),m}toDataURL(t={}){return Ot(this.toCanvasElement(t),t.format||"png",t.quality||1)}toBlob(t={}){return kt(this.toCanvasElement(t),t.format||"png",t.quality||1)}isType(...t){return t.includes(this.constructor.type)||t.includes(this.type)}complexity(){return 1}toJSON(){return this.toObject()}rotate(t){let{centeredRotation:e,originX:i,originY:r}=this;if(e){let{x:t,y:e}=this.getRelativeCenterPoint();this.originX=R,this.originY=R,this.left=t,this.top=e}if(this.set("angle",t),e){let{x:t,y:e}=this.getPositionByOrigin(i,r);this.left=t,this.top=e,this.originX=i,this.originY=r}}setOnGroup(){}_setupCompositeOperation(t){this.globalCompositeOperation&&(t.globalCompositeOperation=this.globalCompositeOperation)}dispose(){lt.cancelByTarget(this),this.off(),this._set("canvas",void 0),this._cacheCanvas&&T().dispose(this._cacheCanvas),this._cacheCanvas=void 0,this._cacheContext=null}animate(t,e){return Object.entries(t).reduce((t,[i,r])=>(t[i]=this._animate(i,r,e),t),{})}_animate(t,e,i={}){let r=t.split("."),s=this.constructor.colorProperties.includes(r[r.length-1]),{abort:n,startValue:o,onChange:a,onComplete:l}=i,h={...i,target:this,startValue:o??r.reduce((t,e)=>t[e],this),endValue:e,abort:null==n?void 0:n.bind(this),onChange:(t,e,i)=>{r.reduce((e,i,s)=>(s===r.length-1&&(e[i]=t),e[i]),this),a&&a(t,e,i)},onComplete:(t,e,i)=>{this.setCoords(),l&&l(t,e,i)}};return s?jr(h):Mr(h)}isDescendantOf(t){let{parent:e,group:i}=this;return e===t||i===t||!!e&&e.isDescendantOf(t)||!!i&&i!==e&&i.isDescendantOf(t)}getAncestors(){let t=[],e=this;do{e=e.parent,e&&t.push(e)}while(e);return t}findCommonAncestors(t){if(this===t)return{fork:[],otherFork:[],common:[this,...this.getAncestors()]};let e=this.getAncestors(),i=t.getAncestors();if(0===e.length&&i.length>0&&this===i[i.length-1])return{fork:[],otherFork:[t,...i.slice(0,i.length-1)],common:[this]};for(let r,s=0;s<e.length;s++){if(r=e[s],r===t)return{fork:[this,...e.slice(0,s)],otherFork:[],common:e.slice(s)};for(let n=0;n<i.length;n++){if(this===i[n])return{fork:[],otherFork:[t,...i.slice(0,n)],common:[this,...e]};if(r===i[n])return{fork:[this,...e.slice(0,s)],otherFork:[t,...i.slice(0,n)],common:e.slice(s)}}}return{fork:[this,...e],otherFork:[t,...i],common:[]}}hasCommonAncestors(t){let e=this.findCommonAncestors(t);return e&&!!e.common.length}isInFrontOf(t){if(this===t)return;let e=this.findCommonAncestors(t);if(e.fork.includes(t))return!0;if(e.otherFork.includes(this))return!1;let i=e.common[0]||this.canvas;if(!i)return;let r=e.fork.pop(),s=e.otherFork.pop(),n=i._objects.indexOf(r),o=i._objects.indexOf(s);return n>-1&&n>o}toObject(e=[]){let i,r=e.concat(t.customProperties,this.constructor.customProperties||[]),s=y.NUM_FRACTION_DIGITS,{clipPath:n,fill:o,stroke:a,shadow:l,strokeDashArray:h,left:c,top:u,originX:d,originY:g,width:f,height:p,strokeWidth:m,strokeLineCap:b,strokeDashOffset:_,strokeLineJoin:v,strokeUniform:x,strokeMiterLimit:C,scaleX:w,scaleY:S,angle:T,flipX:O,flipY:k,opacity:D,visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:F,skewX:L,skewY:I}=this;n&&!n.excludeFromExport&&(i=n.toObject(r.concat("inverted","absolutePositioned")));let R=t=>Qt(t,s),B={...Kt(this,r),type:this.constructor.type,version:j,originX:d,originY:g,left:R(c),top:R(u),width:R(f),height:R(p),fill:ee(o)?o.toObject():o,stroke:ee(a)?a.toObject():a,strokeWidth:R(m),strokeDashArray:h&&h.concat(),strokeLineCap:b,strokeDashOffset:_,strokeLineJoin:v,strokeUniform:x,strokeMiterLimit:R(C),scaleX:R(w),scaleY:R(S),angle:R(T),flipX:O,flipY:k,opacity:R(D),shadow:l&&l.toObject(),visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:F,skewX:R(L),skewY:R(I),...i?{clipPath:i}:null};return this.includeDefaultValues?B:this._removeDefaultValues(B)}toDatalessObject(t){return this.toObject(t)}_removeDefaultValues(t){let e=this.constructor.getDefaults(),i=Object.keys(e).length>0?e:Object.getPrototypeOf(this);return Jt(t,(t,e)=>{if("left"===e||"top"===e||"type"===e)return!0;let r=i[e];return t!==r&&!(Array.isArray(t)&&Array.isArray(r)&&0===t.length&&0===r.length)})}toString(){return`#<${this.constructor.type}>`}static _fromObject({type:t,...e},{extraParam:i,...r}={}){return qt(e,r).then(t=>i?(delete t[i],new this(e[i],t)):new this(t))}static fromObject(t,e){return this._fromObject(t,e)}};p(Ar,"stateProperties",$i),p(Ar,"cacheProperties",Xi),p(Ar,"ownDefaults",Yi),p(Ar,"type","FabricObject"),p(Ar,"colorProperties",[it,rt,"backgroundColor"]),p(Ar,"customProperties",[]),at.setClass(Ar),at.setClass(Ar,"object");const Fr=(t,e)=>{var i;let{transform:{target:r}}=e;null==(i=r.canvas)||i.fire(`object:${t}`,{...e,target:r}),r.fire(t,e)},Lr=(t,e,i)=>(r,s,n,o)=>{let a=e(r,s,n,o);return a&&Fr(t,{...Ze(r,s,n,o),...i}),a};function Ir(t){return(e,i,r,s)=>{let{target:n,originX:o,originY:a}=i,l=n.getPositionByOrigin(o,a),h=t(e,i,r,s);return n.setPositionByOrigin(l,i.originX,i.originY),h}}const Rr=(t,e,i,r)=>(s,n,o,a)=>{let l=ei(n,n.originX,n.originY,o,a)[i],h=Ie(n[e]);if(0===h||h>0&&l<0||h<0&&l>0){let{target:e}=n,i=e.strokeWidth/(e.strokeUniform?e[r]:1),s=Ke(n)?2:1,o=e[t],a=Math.abs(l*s/e[r])-i;return e.set(t,Math.max(a,1)),o!==e[t]}return!1},Br=Rr("width","originX","x","scaleX"),$r=Rr("height","originY","y","scaleY"),Xr=Lr(U,Ir(Br)),Yr=Lr(U,Ir($r));function Wr(t,e,i,r,s){t.save();let{stroke:n,xSize:o,ySize:a,opName:l}=this.commonRenderProps(t,e,i,s,r),h=o;o>a?t.scale(1,a/o):a>o&&(h=a,t.scale(o/a,1)),t.beginPath(),t.arc(0,0,h/2,0,F,!1),t[l](),n&&t.stroke(),t.restore()}function Nr(t,e,i,r,s){t.save();let{stroke:n,xSize:o,ySize:a,opName:l}=this.commonRenderProps(t,e,i,s,r),h=o/2,c=a/2;t[`${l}Rect`](-h,-c,o,a),n&&t.strokeRect(-h,-c,o,a),t.restore()}var Vr=class{constructor(t){p(this,"visible",!0),p(this,"actionName",J),p(this,"angle",0),p(this,"x",0),p(this,"y",0),p(this,"offsetX",0),p(this,"offsetY",0),p(this,"sizeX",0),p(this,"sizeY",0),p(this,"touchSizeX",0),p(this,"touchSizeY",0),p(this,"cursorStyle","crosshair"),p(this,"withConnection",!1),Object.assign(this,t)}getTransformAnchorPoint(){var t;return null==(t=this.transformAnchorPoint)?new gt(.5-this.x,.5-this.y):t}shouldActivate(t,e,i,{tl:r,tr:s,br:n,bl:o}){var a;return(null==(a=e.canvas)?void 0:a.getActiveObject())===e&&e.isControlVisible(t)&&Er.isPointInPolygon(i,[r,s,n,o])}getActionHandler(t,e,i){return this.actionHandler}getMouseDownHandler(t,e,i){return this.mouseDownHandler}getMouseUpHandler(t,e,i){return this.mouseUpHandler}cursorStyleHandler(t,e,i,r){return e.cursorStyle}getActionName(t,e,i){return e.actionName}getVisibility(t,e){var i,r;return null==(i=null==(r=t._controlsVisibility)?void 0:r[e])?this.visible:i}setVisibility(t,e,i){this.visible=t}positionHandler(t,e,i,r){return new gt(this.x*t.x+this.offsetX,this.y*t.y+this.offsetY).transform(e)}calcCornerCoords(t,e,i,r,s,n){let o=Ft([$t(i,r),Xt({angle:t}),Yt((s?this.touchSizeX:this.sizeX)||e,(s?this.touchSizeY:this.sizeY)||e)]);return{tl:new gt(-.5,-.5).transform(o),tr:new gt(.5,-.5).transform(o),br:new gt(.5,.5).transform(o),bl:new gt(-.5,.5).transform(o)}}commonRenderProps(t,e,i,r,s={}){let{cornerSize:n,cornerColor:o,transparentCorners:a,cornerStrokeColor:l}=s,h=n||r.cornerSize,c=this.sizeX||h,u=this.sizeY||h,d=void 0===a?r.transparentCorners:a,g=d?rt:it,f=l||r.cornerStrokeColor,p=!d&&!!f;return t.fillStyle=o||r.cornerColor||"",t.strokeStyle=f||"",t.translate(e,i),t.rotate(Dt(r.getTotalAngle())),{stroke:p,xSize:c,ySize:u,transparentCorners:d,opName:g}}render(t,e,i,r,s){"circle"===((r=r||{}).cornerStyle||s.cornerStyle)?Wr.call(this,t,e,i,r,s):Nr.call(this,t,e,i,r,s)}};const zr=(t,e,i)=>i.lockRotation?qe:e.cursorStyle,Hr=Lr(z,Ir((t,{target:e,ex:i,ey:r,theta:s,originX:n,originY:o},a,l)=>{let h=e.getPositionByOrigin(n,o);if(Qe(e,"lockRotation"))return!1;let c=Math.atan2(r-h.y,i-h.x),u=Mt(Math.atan2(l-h.y,a-h.x)-c+s);if(e.snapAngle&&e.snapAngle>0){let t=e.snapAngle,i=e.snapThreshold||t,r=Math.ceil(u/t)*t,s=Math.floor(u/t)*t;Math.abs(u-s)<i?u=s:Math.abs(u-r)<i&&(u=r)}u<0&&(u=360+u),u%=360;let d=e.angle!==u;return e.angle=u,d}));function Gr(t,e){let i=e.canvas,r=t[i.uniScaleKey];return i.uniformScaling&&!r||!i.uniformScaling&&r}function Ur(t,e,i){let r=Qe(t,"lockScalingX"),s=Qe(t,"lockScalingY");if(r&&s||!e&&(r||s)&&i||r&&"x"===e||s&&"y"===e)return!0;let{width:n,height:o,strokeWidth:a}=t;return 0===n&&0===a&&"y"!==e||0===o&&0===a&&"x"!==e}const qr=["e","se","s","sw","w","nw","n","ne","e"],Kr=(t,e,i,r)=>{let s=Gr(t,i);return Ur(i,0!==e.x&&0===e.y?"x":0===e.x&&0!==e.y?"y":"",s)?qe:`${qr[ti(i,0,r)]}-resize`};function Jr(t,e,i,r,s={}){let n,o,a,l,h,c,u=e.target,d=s.by,g=Gr(t,u);if(Ur(u,d,g))return!1;if(e.gestureScale)o=e.scaleX*e.gestureScale,a=e.scaleY*e.gestureScale;else{if(n=ei(e,e.originX,e.originY,i,r),h="y"===d?1:Math.sign(n.x||e.signX||1),c="x"===d?1:Math.sign(n.y||e.signY||1),e.signX||(e.signX=h),e.signY||(e.signY=c),Qe(u,"lockScalingFlip")&&(e.signX!==h||e.signY!==c))return!1;if(l=u._getTransformedDimensions(),g&&!d){let t=Math.abs(n.x)+Math.abs(n.y),{original:i}=e,r=t/(Math.abs(l.x*i.scaleX/u.scaleX)+Math.abs(l.y*i.scaleY/u.scaleY));o=i.scaleX*r,a=i.scaleY*r}else o=Math.abs(n.x*u.scaleX/l.x),a=Math.abs(n.y*u.scaleY/l.y);Ke(e)&&(o*=2,a*=2),e.signX!==h&&"y"!==d&&(e.originX=Je(e.originX),o*=-1,e.signX=h),e.signY!==c&&"x"!==d&&(e.originY=Je(e.originY),a*=-1,e.signY=c)}let f=u.scaleX,p=u.scaleY;return d?("x"===d&&u.set("scaleX",o),"y"===d&&u.set("scaleY",a)):(!Qe(u,"lockScalingX")&&u.set("scaleX",o),!Qe(u,"lockScalingY")&&u.set("scaleY",a)),f!==u.scaleX||p!==u.scaleY}const Qr=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r))),Zr=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r,{by:"x"}))),ts=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r,{by:"y"}))),es={x:{counterAxis:"y",scale:Q,skew:tt,lockSkewing:"lockSkewingX",origin:"originX",flip:"flipX"},y:{counterAxis:"x",scale:Z,skew:et,lockSkewing:"lockSkewingY",origin:"originY",flip:"flipY"}},is=["ns","nesw","ew","nwse"],rs=(t,e,i,r)=>0!==e.x&&Qe(i,"lockSkewingY")||0!==e.y&&Qe(i,"lockSkewingX")?qe:`${is[ti(i,0,r)%4]}-resize`;function ss(t,e,i,r,s){let{target:n}=i,{counterAxis:o,origin:a,lockSkewing:l,skew:h,flip:c}=es[t];if(Qe(n,l))return!1;let{origin:u,flip:d}=es[o],g=Ie(i[u])*(n[d]?-1:1),f=-Math.sign(g)*(n[c]?-1:1),p=-(0===n[h]&&ei(i,"center","center",r,s)[t]>0||n[h]>0?1:-1)*f*.5+.5;return Lr(G,Ir((e,i,r,s)=>function(t,{target:e,ex:i,ey:r,skewingSide:s,...n},o){let{skew:a}=es[t],l=o.subtract(new gt(i,r)).divide(new gt(e.scaleX,e.scaleY))[t],h=e[a],c=n[a],u=Math.tan(Dt(c)),d="y"===t?e._getTransformedDimensions({scaleX:1,scaleY:1,skewX:0}).x:e._getTransformedDimensions({scaleX:1,scaleY:1}).y,g=2*l*s/Math.max(d,1)+u,f=Mt(Math.atan(g));e.set(a,f);let p=h!==e[a];if(p&&"y"===t){let{skewX:t,scaleX:i}=e,r=e._getTransformedDimensions({skewY:h}),s=e._getTransformedDimensions(),n=0===t?1:r.x/s.x;1!==n&&e.set("scaleX",n*i)}return p}(t,i,new gt(r,s))))(e,{...i,[a]:p,skewingSide:f},r,s)}const ns=(t,e,i,r)=>ss("x",t,e,i,r),os=(t,e,i,r)=>ss("y",t,e,i,r);function as(t,e){return t[e.canvas.altActionKey]}const ls=(t,e,i)=>{let r=as(t,i);return 0===e.x?r?tt:Z:0===e.y?r?et:Q:""},hs=(t,e,i,r)=>as(t,i)?rs(0,e,i,r):Kr(t,e,i,r),cs=(t,e,i,r)=>as(t,e.target)?os(t,e,i,r):Zr(t,e,i,r),us=(t,e,i,r)=>as(t,e.target)?ns(t,e,i,r):ts(t,e,i,r),ds=()=>({ml:new Vr({x:-.5,y:0,cursorStyleHandler:hs,actionHandler:cs,getActionName:ls}),mr:new Vr({x:.5,y:0,cursorStyleHandler:hs,actionHandler:cs,getActionName:ls}),mb:new Vr({x:0,y:.5,cursorStyleHandler:hs,actionHandler:us,getActionName:ls}),mt:new Vr({x:0,y:-.5,cursorStyleHandler:hs,actionHandler:us,getActionName:ls}),tl:new Vr({x:-.5,y:-.5,cursorStyleHandler:Kr,actionHandler:Qr}),tr:new Vr({x:.5,y:-.5,cursorStyleHandler:Kr,actionHandler:Qr}),bl:new Vr({x:-.5,y:.5,cursorStyleHandler:Kr,actionHandler:Qr}),br:new Vr({x:.5,y:.5,cursorStyleHandler:Kr,actionHandler:Qr}),mtr:new Vr({x:0,y:-.5,actionHandler:Hr,cursorStyleHandler:zr,offsetY:-40,withConnection:!0,actionName:H})}),gs=()=>({mr:new Vr({x:.5,y:0,actionHandler:Xr,cursorStyleHandler:hs,actionName:U}),ml:new Vr({x:-.5,y:0,actionHandler:Xr,cursorStyleHandler:hs,actionName:U})}),fs=()=>({...ds(),...gs()});var ps=class t extends Ar{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,this.constructor.createControls(),t.ownDefaults),this.setOptions(e)}static createControls(){return{controls:ds()}}_updateCacheCanvas(){let t=this.canvas;if(this.noScaleCache&&t&&t._currentTransform){let e=t._currentTransform,i=e.target,r=e.action;if(this===i&&r&&r.startsWith("scale"))return!1}return super._updateCacheCanvas()}getActiveControl(){let t=this.__corner;return t?{key:t,control:this.controls[t],coord:this.oCoords[t]}:void 0}findControl(t,e=!1){if(!this.hasControls||!this.canvas)return;this.__corner=void 0;let i=Object.entries(this.oCoords);for(let r=i.length-1;r>=0;r--){let[s,n]=i[r],o=this.controls[s];if(o.shouldActivate(s,this,t,e?n.touchCorner:n.corner))return this.__corner=s,{key:s,control:o,coord:this.oCoords[s]}}}calcOCoords(){let t=this.getViewportTransform(),e=It(t),i=Rt(t),r=this.getCenterPoint(),s=At(At(t,At($t(r.x,r.y),Xt({angle:this.getTotalAngle()-(this.group&&this.flipX?180:0)}))),[1/e,0,0,1/i,0,0]),n=this.group?Bt(this.calcTransformMatrix()):void 0;n&&(n.scaleX=Math.abs(n.scaleX),n.scaleY=Math.abs(n.scaleY));let o=this._calculateCurrentDimensions(n),a={};return this.forEachControl((t,e)=>{let i=t.positionHandler(o,s,this,t);a[e]=Object.assign(i,this._calcCornerCoords(t,i))}),a}_calcCornerCoords(t,e){let i=this.getTotalAngle();return{corner:t.calcCornerCoords(i,this.cornerSize,e.x,e.y,!1,this),touchCorner:t.calcCornerCoords(i,this.touchCornerSize,e.x,e.y,!0,this)}}setCoords(){super.setCoords(),this.canvas&&(this.oCoords=this.calcOCoords())}forEachControl(t){for(let e in this.controls)t(this.controls[e],e,this)}drawSelectionBackground(t){if(!this.selectionBackgroundColor||this.canvas&&this.canvas._activeObject!==this)return;t.save();let e=this.getRelativeCenterPoint(),i=this._calculateCurrentDimensions(),r=this.getViewportTransform();t.translate(e.x,e.y),t.scale(1/r[0],1/r[3]),t.rotate(Dt(this.angle)),t.fillStyle=this.selectionBackgroundColor,t.fillRect(-i.x/2,-i.y/2,i.x,i.y),t.restore()}strokeBorders(t,e){t.strokeRect(-e.x/2,-e.y/2,e.x,e.y)}_drawBorders(t,e,i={}){let r={hasControls:this.hasControls,borderColor:this.borderColor,borderDashArray:this.borderDashArray,...i};t.save(),t.strokeStyle=r.borderColor,this._setLineDash(t,r.borderDashArray),this.strokeBorders(t,e),r.hasControls&&this.drawControlsConnectingLines(t,e),t.restore()}_renderControls(t,e={}){let{hasBorders:i,hasControls:r}=this,s={hasBorders:i,hasControls:r,...e},n=this.getViewportTransform(),o=s.hasBorders,a=s.hasControls,l=Bt(At(n,this.calcTransformMatrix()));t.save(),t.translate(l.translateX,l.translateY),t.lineWidth=this.borderScaleFactor,this.group===this.parent&&(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),this.flipX&&(l.angle-=180);let h=Lt(n);t.rotate(this.group?Dt(l.angle):Dt(this.angle)+h),o&&this.drawBorders(t,l,e),a&&this.drawControls(t,e),t.restore()}drawBorders(t,e,i){let r;if(i&&i.forActiveSelection||this.group){let t=je(this.width,this.height,zt(e)),i=this.isStrokeAccountedForInDimensions()?ft:(this.strokeUniform?(new gt).scalarAdd(this.canvas?this.canvas.getZoom():1):new gt(e.scaleX,e.scaleY)).scalarMultiply(this.strokeWidth);r=t.add(i).scalarAdd(this.borderScaleFactor).scalarAdd(2*this.padding)}else r=this._calculateCurrentDimensions().scalarAdd(this.borderScaleFactor);this._drawBorders(t,r,i)}drawControlsConnectingLines(t,e){let i=!1;t.beginPath(),this.forEachControl((r,s)=>{r.withConnection&&r.getVisibility(this,s)&&(i=!0,t.moveTo(r.x*e.x,r.y*e.y),t.lineTo(r.x*e.x+r.offsetX,r.y*e.y+r.offsetY))}),i&&t.stroke()}drawControls(t,e={}){t.save();let i=this.getCanvasRetinaScaling(),{cornerStrokeColor:r,cornerDashArray:s,cornerColor:n}=this,o={cornerStrokeColor:r,cornerDashArray:s,cornerColor:n,...e};t.setTransform(i,0,0,i,0,0),t.strokeStyle=t.fillStyle=o.cornerColor,this.transparentCorners||(t.strokeStyle=o.cornerStrokeColor),this._setLineDash(t,o.cornerDashArray),this.forEachControl((e,i)=>{if(e.getVisibility(this,i)){let r=this.oCoords[i];e.render(t,r.x,r.y,o,this)}}),t.restore()}isControlVisible(t){return this.controls[t]&&this.controls[t].getVisibility(this,t)}setControlVisible(t,e){this._controlsVisibility||(this._controlsVisibility={}),this._controlsVisibility[t]=e}setControlsVisibility(t={}){Object.entries(t).forEach(([t,e])=>this.setControlVisible(t,e))}clearContextTop(t){if(!this.canvas)return;let e=this.canvas.contextTop;if(!e)return;let i=this.canvas.viewportTransform;e.save(),e.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this.transform(e);let r=this.width+4,s=this.height+4;return e.clearRect(-r/2,-s/2,r,s),t||e.restore(),e}onDeselect(t){return!1}onSelect(t){return!1}shouldStartDragging(t){return!1}onDragStart(t){return!1}canDrop(t){return!1}renderDragSourceEffect(t){}renderDropTargetEffect(t){}};function ms(t,e){return e.forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(i=>{"constructor"!==i&&Object.defineProperty(t.prototype,i,Object.getOwnPropertyDescriptor(e.prototype,i)||Object.create(null))})}),t}p(ps,"ownDefaults",{noScaleCache:!0,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,cornerSize:13,touchCornerSize:24,transparentCorners:!0,cornerColor:"rgb(178,204,255)",cornerStrokeColor:"",cornerStyle:"rect",cornerDashArray:null,hasControls:!0,borderColor:"rgb(178,204,255)",borderDashArray:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,hasBorders:!0,selectionBackgroundColor:"",selectable:!0,evented:!0,perPixelTargetFind:!1,activeOn:"down",hoverCursor:null,moveCursor:null});var ys=class extends ps{};ms(ys,[bi]),at.setClass(ys),at.setClass(ys,"object");const bs=(t,e,i,r)=>{let s=2*(r=Math.round(r))+1,{data:n}=t.getImageData(e-r,i-r,s,s);for(let t=3;t<n.length;t+=4)if(n[t]>0)return!1;return!0};var _s=class{constructor(t){this.options=t,this.strokeProjectionMagnitude=this.options.strokeWidth/2,this.scale=new gt(this.options.scaleX,this.options.scaleY),this.strokeUniformScalar=this.options.strokeUniform?new gt(1/this.options.scaleX,1/this.options.scaleY):new gt(1,1)}createSideVector(t,e){let i=Xe(t,e);return this.options.strokeUniform?i.multiply(this.scale):i}projectOrthogonally(t,e,i){return this.applySkew(t.add(this.calcOrthogonalProjection(t,e,i)))}isSkewed(){return 0!==this.options.skewX||0!==this.options.skewY}applySkew(t){let e=new gt(t);return e.y+=e.x*Math.tan(Dt(this.options.skewY)),e.x+=e.y*Math.tan(Dt(this.options.skewX)),e}scaleUnitVector(t,e){return t.multiply(this.strokeUniformScalar).scalarMultiply(e)}};const vs=new gt;var xs=class t extends _s{static getOrthogonalRotationFactor(t,e){let i=e?We(t,e):Ne(t);return Math.abs(i)<P?-1:1}constructor(t,e,i,r){super(r),p(this,"AB",void 0),p(this,"AC",void 0),p(this,"alpha",void 0),p(this,"bisector",void 0),this.A=new gt(t),this.B=new gt(e),this.C=new gt(i),this.AB=this.createSideVector(this.A,this.B),this.AC=this.createSideVector(this.A,this.C),this.alpha=We(this.AB,this.AC),this.bisector=Ve($e(this.AB.eq(vs)?this.AC:this.AB,this.alpha/2))}calcOrthogonalProjection(e,i,r=this.strokeProjectionMagnitude){let s=ze(this.createSideVector(e,i)),n=t.getOrthogonalRotationFactor(s,this.bisector);return this.scaleUnitVector(s,r*n)}projectBevel(){let t=[];return(this.alpha%F===0?[this.B]:[this.B,this.C]).forEach(e=>{t.push(this.projectOrthogonally(this.A,e)),t.push(this.projectOrthogonally(this.A,e,-this.strokeProjectionMagnitude))}),t}projectMiter(){let t=[],e=Math.abs(this.alpha),i=1/Math.sin(e/2),r=this.scaleUnitVector(this.bisector,-this.strokeProjectionMagnitude*i),s=this.options.strokeUniform?Ye(this.scaleUnitVector(this.bisector,this.options.strokeMiterLimit)):this.options.strokeMiterLimit;return Ye(r)/this.strokeProjectionMagnitude<=s&&t.push(this.applySkew(this.A.add(r))),t.push(...this.projectBevel()),t}projectRoundNoSkew(e,i){let r=[],s=new gt(t.getOrthogonalRotationFactor(this.bisector),t.getOrthogonalRotationFactor(new gt(this.bisector.y,this.bisector.x)));return[new gt(1,0).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(s),new gt(0,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(s)].forEach(t=>{Ue(t,e,i)&&r.push(this.A.add(t))}),r}projectRoundWithSkew(t,e){let i=[],{skewX:r,skewY:s,scaleX:n,scaleY:o,strokeUniform:a}=this.options,l=new gt(Math.tan(Dt(r)),Math.tan(Dt(s))),h=this.strokeProjectionMagnitude,c=a?h/o/Math.sqrt(1/o**2+1/n**2*l.y**2):h/Math.sqrt(1+l.y**2),u=new gt(Math.sqrt(Math.max(h**2-c**2,0)),c),d=a?h/Math.sqrt(1+l.x**2*(1/o)**2/(1/n+1/n*l.x*l.y)**2):h/Math.sqrt(1+l.x**2/(1+l.x*l.y)**2),g=new gt(d,Math.sqrt(Math.max(h**2-d**2,0)));return[g,g.scalarMultiply(-1),u,u.scalarMultiply(-1)].map(t=>this.applySkew(a?t.multiply(this.strokeUniformScalar):t)).forEach(r=>{Ue(r,t,e)&&i.push(this.applySkew(this.A).add(r))}),i}projectRound(){let t=[];t.push(...this.projectBevel());let e=this.alpha%F===0,i=this.applySkew(this.A),r=t[e?0:2].subtract(i),s=t[+!!e].subtract(i),n=He(r,e?this.applySkew(this.AB.scalarMultiply(-1)):this.applySkew(this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1)))>0,o=n?r:s,a=n?s:r;return this.isSkewed()?t.push(...this.projectRoundWithSkew(o,a)):t.push(...this.projectRoundNoSkew(o,a)),t}projectPoints(){switch(this.options.strokeLineJoin){case"miter":return this.projectMiter();case"round":return this.projectRound();default:return this.projectBevel()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t,angle:this.alpha,bisector:this.bisector}))}},Cs=class extends _s{constructor(t,e,i){super(i),this.A=new gt(t),this.T=new gt(e)}calcOrthogonalProjection(t,e,i=this.strokeProjectionMagnitude){let r=this.createSideVector(t,e);return this.scaleUnitVector(ze(r),i)}projectButt(){return[this.projectOrthogonally(this.A,this.T,this.strokeProjectionMagnitude),this.projectOrthogonally(this.A,this.T,-this.strokeProjectionMagnitude)]}projectRound(){let t=[];if(!this.isSkewed()&&this.A.eq(this.T)){let e=new gt(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.applySkew(this.A.add(e)),this.applySkew(this.A.subtract(e)))}else t.push(...new xs(this.A,this.T,this.T,this.options).projectRound());return t}projectSquare(){let t=[];if(this.A.eq(this.T)){let e=new gt(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.A.add(e),this.A.subtract(e))}else{let e=this.calcOrthogonalProjection(this.A,this.T,this.strokeProjectionMagnitude),i=this.scaleUnitVector(Ve(this.createSideVector(this.A,this.T)),-this.strokeProjectionMagnitude),r=this.A.add(i);t.push(r.add(e),r.subtract(e))}return t.map(t=>this.applySkew(t))}projectPoints(){switch(this.options.strokeLineCap){case"round":return this.projectRound();case"square":return this.projectSquare();default:return this.projectButt()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t}))}};const ws=(t,e,i=!1)=>{let r=[];if(0===t.length)return r;let s=t.reduce((t,e)=>(t[t.length-1].eq(e)||t.push(new gt(e)),t),[new gt(t[0])]);if(1===s.length)i=!0;else if(!i){let t=s[0],e=((t,e)=>{for(let i=t.length-1;i>=0;i--)if(e(t[i]))return i;return-1})(s,e=>!e.eq(t));s.splice(e+1)}return s.forEach((t,s,n)=>{let o,a;0===s?(a=n[1],o=i?t:n[n.length-1]):s===n.length-1?(o=n[s-1],a=i?t:n[0]):(o=n[s-1],a=n[s+1]),i&&1===n.length?r.push(...new Cs(t,t,e).project()):!i||0!==s&&s!==n.length-1?r.push(...new xs(t,o,a,e).project()):r.push(...new Cs(t,0===s?a:o,e).project())}),r},Ss=t=>{let e={};return Object.keys(t).forEach(i=>{e[i]={},Object.keys(t[i]).forEach(r=>{e[i][r]={...t[i][r]}})}),e},Ts=(t,e,i=!1)=>t.fill!==e.fill||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth||t.fontSize!==e.fontSize||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.textDecorationThickness!==e.textDecorationThickness||t.textDecorationColor!==e.textDecorationColor||t.textBackgroundColor!==e.textBackgroundColor||t.deltaY!==e.deltaY||i&&(t.overline!==e.overline||t.underline!==e.underline||t.linethrough!==e.linethrough),Os=(t,e)=>{let i=e.split("\n"),r=[],s=-1,n={};t=Ss(t);for(let e=0;e<i.length;e++){let o=me(i[e]);if(t[e])for(let i=0;i<o.length;i++){s++;let o=t[e][i];o&&Object.keys(o).length>0&&(Ts(n,o,!0)?r.push({start:s,end:s+1,style:o}):r[r.length-1].end++),n=o||{}}else s+=o.length,n={}}return r},ks=(t,e)=>{if(!Array.isArray(t))return Ss(t);let i=e.split(W),r={},s=-1,n=0;for(let e=0;e<i.length;e++){let o=me(i[e]);for(let i=0;i<o.length;i++)s++,t[n]&&t[n].start<=s&&s<t[n].end&&(r[e]=r[e]||{},r[e][i]={...t[n].style},s===t[n].end-1&&n++)}return r},Ds=["display","transform",it,"fill-opacity","fill-rule","opacity",rt,"stroke-dasharray","stroke-linecap","stroke-dashoffset","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","id","paint-order","vector-effect","instantiated_by_use","clip-path"];function Ms(t,e){let i,r=t.nodeName,s=t.getAttribute("class"),n=t.getAttribute("id"),o="(?![a-zA-Z\\-]+)";if(i=RegExp("^"+r,"i"),e=e.replace(i,""),n&&e.length&&(i=RegExp("#"+n+o,"i"),e=e.replace(i,"")),s&&e.length){let t=s.split(" ");for(let r=t.length;r--;)i=RegExp("\\."+t[r]+o,"i"),e=e.replace(i,"")}return 0===e.length}function js(t,e){let i=!0,r=Ms(t,e.pop());return r&&e.length&&(i=function(t,e){let i,r=!0;for(;t.parentElement&&1===t.parentElement.nodeType&&e.length;)r&&(i=e.pop()),r=Ms(t=t.parentElement,i);return 0===e.length}(t,e)),r&&i&&0===e.length}function Es(t,e={}){let i={};for(let r in e)js(t,r.split(" "))&&(i={...i,...e[r]});return i}const Ps=t=>{var e;return null==(e=Ei[t])?t:e},As=RegExp(`(${Di})`,"gi"),Fs=`(${Di})`,Ls=String.raw`(skewX)\(${Fs}\)`,Is=String.raw`(skewY)\(${Fs}\)`,Rs=String.raw`(rotate)\(${Fs}(?: ${Fs} ${Fs})?\)`,Bs=String.raw`(scale)\(${Fs}(?: ${Fs})?\)`,$s=String.raw`(translate)\(${Fs}(?: ${Fs})?\)`,Xs=`(?:${String.raw`(matrix)\(${Fs} ${Fs} ${Fs} ${Fs} ${Fs} ${Fs}\)`}|${$s}|${Rs}|${Bs}|${Ls}|${Is})`,Ys=`(?:${Xs}*)`,Ws=String.raw`^\s*(?:${Ys}?)\s*$`,Ns=new RegExp(Ws),Vs=new RegExp(Xs),zs=new RegExp(Xs,"g");function Hs(t){let e=[];if(!(t=(t=>oi(t.replace(As," $1 ").replace(/,/gi," ")))(t).replace(/\s*([()])\s*/gi,"$1"))||t&&!Ns.test(t))return[...I];for(let i of t.matchAll(zs)){let t=Vs.exec(i[0]);if(!t)continue;let r=I,[,s,...n]=t.filter(t=>!!t),[o,a,l,h,c,u]=n.map(t=>parseFloat(t));switch(s){case"translate":r=$t(o,a);break;case H:r=Xt({angle:o},{x:a,y:l});break;case J:r=Yt(o,a);break;case tt:r=Nt(o);break;case et:r=Vt(o);break;case"matrix":r=[o,a,l,h,c,u]}e.push(r)}return Ft(e)}function Gs(t,e,i,r){let s,n=Array.isArray(e),o=e;if("fill"!==t&&"stroke"!==t||"none"!==e){if("strokeUniform"===t)return"non-scaling-stroke"===e;if("strokeDashArray"===t)o="none"===e?null:e.replace(/,/g," ").split(/\s+/).map(parseFloat);else if("transformMatrix"===t)o=i&&i.transformMatrix?At(i.transformMatrix,Hs(e)):Hs(e);else if("visible"===t)o="none"!==e&&"hidden"!==e,i&&!1===i.visible&&(o=!1);else if("opacity"===t)o=parseFloat(e),i&&void 0!==i.opacity&&(o*=i.opacity);else if("textAnchor"===t)o="start"===e?B:"end"===e?X:R;else if("charSpacing"===t||"textDecorationThickness"===t)s=pi(e,r)/r*1e3;else if("paintFirst"===t){let t=e.indexOf(it),i=e.indexOf(rt);o=it,(t>-1&&i>-1&&i<t||-1===t&&i>-1)&&(o=rt)}else{if("href"===t||"xlink:href"===t||"font"===t||"id"===t)return e;if("imageSmoothing"===t)return"optimizeQuality"===e;s=n?e.map(pi):pi(e,r)}}else o="";return!n&&isNaN(s)?o:s}function Us(t){let e={},i=t.getAttribute("style");return i&&("string"==typeof i?function(t,e){t.replace(/;\s*$/,"").split(";").forEach(t=>{if(!t)return;let[i,r]=t.split(":");e[i.trim().toLowerCase()]=r.trim()})}(i,e):function(t,e){Object.entries(t).forEach(([t,i])=>{void 0!==i&&(e[t.toLowerCase()]=i)})}(i,e)),e}const qs={stroke:"strokeOpacity",fill:"fillOpacity"};function Ks(t,e,i){if(!t)return{};let r,s={},n=16;t.parentNode&&Fi.test(t.parentNode.nodeName)&&(s=Ks(t.parentElement,e,i),s.fontSize&&(r=n=pi(s.fontSize)));let o={...e.reduce((e,i)=>{let r=t.getAttribute(i);return r&&(e[i]=r),e},{}),...Es(t,i),...Us(t)};o["clip-path"]&&t.setAttribute(Ai,o[Ai]),o["font-size"]&&(r=pi(o[Pi],n),o[Pi]=`${r}`);let a={};for(let t in o){let e=Ps(t);a[e]=Gs(e,o[t],s,r)}a&&a.font&&function(t,e){let i=t.match(ji);if(!i)return;let r=i[1],s=i[3],n=i[4],o=i[5],a=i[6];r&&(e.fontStyle=r),s&&(e.fontWeight=isNaN(parseFloat(s))?s:parseFloat(s)),n&&(e.fontSize=pi(n)),a&&(e.fontFamily=a),o&&(e.lineHeight="normal"===o?1:o)}(a.font,a);let l={...s,...a};return Fi.test(t.nodeName)?l:function(t){let e=ys.getDefaults();return Object.entries(qs).forEach(([i,r])=>{if(void 0===t[r]||""===t[i])return;if(void 0===t[i]){if(!e[i])return;t[i]=e[i]}if(0===t[i].indexOf("url("))return;let s=new gi(t[i]);t[i]=s.setAlpha(Qt(s.getAlpha()*t[r],2)).toRgba()}),t}(l)}const Js=["rx","ry"];var Qs=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e),this._initRxRy()}_initRxRy(){let{rx:t,ry:e}=this;t&&!e?this.ry=t:e&&!t&&(this.rx=e)}_render(t){let{width:e,height:i}=this,r=-e/2,s=-i/2,n=this.rx?Math.min(this.rx,e/2):0,o=this.ry?Math.min(this.ry,i/2):0,a=0!==n||0!==o;t.beginPath(),t.moveTo(r+n,s),t.lineTo(r+e-n,s),a&&t.bezierCurveTo(r+e-.4477152502*n,s,r+e,s+.4477152502*o,r+e,s+o),t.lineTo(r+e,s+i-o),a&&t.bezierCurveTo(r+e,s+i-.4477152502*o,r+e-.4477152502*n,s+i,r+e-n,s+i),t.lineTo(r+n,s+i),a&&t.bezierCurveTo(r+.4477152502*n,s+i,r,s+i-.4477152502*o,r,s+i-o),t.lineTo(r,s+o),a&&t.bezierCurveTo(r,s+.4477152502*o,r+.4477152502*n,s,r+n,s),t.closePath(),this._renderPaintInOrder(t)}toObject(t=[]){return super.toObject([...Js,...t])}_toSVG(){let{width:t,height:e,rx:i,ry:r}=this;return["<rect ","COMMON_PARTS",`x="${-t/2}" y="${-e/2}" rx="${fe(i)}" ry="${fe(r)}" width="${fe(t)}" height="${fe(e)}" />\n`]}static async fromElement(t,e,i){let{left:r=0,top:s=0,width:n=0,height:o=0,visible:a=!0,...l}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this({...e,...l,left:r,top:s,width:n,height:o,visible:!!(a&&n&&o)})}};p(Qs,"type","Rect"),p(Qs,"cacheProperties",[...Xi,...Js]),p(Qs,"ownDefaults",{rx:0,ry:0}),p(Qs,"ATTRIBUTE_NAMES",[...Ds,"x","y","rx","ry","width","height"]),at.setClass(Qs),at.setSVGClass(Qs);const Zs="initialization",tn="added",en=(t,e)=>{let{strokeUniform:i,strokeWidth:r,width:s,height:n,group:o}=e,a=o&&o!==t?Ee(o.calcTransformMatrix(),t.calcTransformMatrix()):null,l=a?e.getRelativeCenterPoint().transform(a):e.getRelativeCenterPoint(),h=!e.isStrokeAccountedForInDimensions(),c=i&&h?Ae(new gt(r,r),void 0,t.calcTransformMatrix()):ft,u=!i&&h?r:0,d=je(s+u,n+u,Ft([a,e.calcOwnMatrix()],!0)).add(c).scalarDivide(2);return[l.subtract(d),l.add(d)]};var rn=class{calcLayoutResult(t,e){if(this.shouldPerformLayout(t))return this.calcBoundingBox(e,t)}shouldPerformLayout({type:t,prevStrategy:e,strategy:i}){return"initialization"===t||"imperative"===t||!!e&&i!==e}shouldLayoutClipPath({type:t,target:{clipPath:e}}){return"initialization"!==t&&e&&!e.absolutePositioned}getInitialSize(t,e){return e.size}calcBoundingBox(t,e){let{type:i,target:r}=e;if("imperative"===i&&e.overrides)return e.overrides;if(0===t.length)return;let{left:s,top:n,width:o,height:a}=Se(t.map(t=>en(r,t)).reduce((t,e)=>t.concat(e),[])),l=new gt(o,a),h=new gt(s,n).add(l.scalarDivide(2));if("initialization"===i){let t=this.getInitialSize(e,{size:l,center:h});return{center:h,relativeCorrection:new gt(0,0),size:t}}return{center:h.transform(r.calcOwnMatrix()),size:l}}};p(rn,"type","strategy");var sn=class extends rn{shouldPerformLayout(t){return!0}};p(sn,"type","fit-content"),at.setClass(sn);const nn="layoutManager";var on=class{constructor(t=new sn){p(this,"strategy",void 0),this.strategy=t,this._subscriptions=new Map}performLayout(t){let e={bubbles:!0,strategy:this.strategy,...t,prevStrategy:this._prevLayoutStrategy,stopPropagation(){this.bubbles=!1}};this.onBeforeLayout(e);let i=this.getLayoutResult(e);i&&this.commitLayout(e,i),this.onAfterLayout(e,i),this._prevLayoutStrategy=e.strategy}attachHandlers(t,e){let{target:i}=e;return[st,N,U,z,V,G,K,q,"modifyPath"].map(e=>t.on(e,t=>this.performLayout("modified"===e?{type:"object_modified",trigger:e,e:t,target:i}:{type:"object_modifying",trigger:e,e:t,target:i})))}subscribe(t,e){this.unsubscribe(t,e);let i=this.attachHandlers(t,e);this._subscriptions.set(t,i)}unsubscribe(t,e){(this._subscriptions.get(t)||[]).forEach(t=>t()),this._subscriptions.delete(t)}unsubscribeTargets(t){t.targets.forEach(e=>this.unsubscribe(e,t))}subscribeTargets(t){t.targets.forEach(e=>this.subscribe(e,t))}onBeforeLayout(t){let{target:e,type:i}=t,{canvas:r}=e;if("initialization"===i||"added"===i?this.subscribeTargets(t):"removed"===i&&this.unsubscribeTargets(t),e.fire("layout:before",{context:t}),r&&r.fire("object:layout:before",{target:e,context:t}),"imperative"===i&&t.deep){let{strategy:i,...r}=t;e.forEachObject(t=>t.layoutManager&&t.layoutManager.performLayout({...r,bubbles:!1,target:t}))}}getLayoutResult(t){let{target:e,strategy:i,type:r}=t,s=i.calcLayoutResult(t,e.getObjects());if(!s)return;let n="initialization"===r?new gt:e.getRelativeCenterPoint(),{center:o,correction:a=new gt,relativeCorrection:l=new gt}=s;return{result:s,prevCenter:n,nextCenter:o,offset:n.subtract(o).add(a).transform("initialization"===r?I:Pt(e.calcOwnMatrix()),!0).add(l)}}commitLayout(t,e){let{target:i}=t,{result:{size:r},nextCenter:s}=e;var n,o;i.set({width:r.x,height:r.y}),this.layoutObjects(t,e),"initialization"===t.type?i.set({left:null==(n=t.x)?s.x+r.x*Ie(i.originX):n,top:null==(o=t.y)?s.y+r.y*Ie(i.originY):o}):(i.setPositionByOrigin(s,R,R),i.setCoords(),i.set("dirty",!0))}layoutObjects(t,e){let{target:i}=t;i.forEachObject(r=>{r.group===i&&this.layoutObject(t,e,r)}),t.strategy.shouldLayoutClipPath(t)&&this.layoutObject(t,e,i.clipPath)}layoutObject(t,{offset:e},i){i.set({left:i.left+e.x,top:i.top+e.y})}onAfterLayout(t,e){let{target:i,strategy:r,bubbles:s,prevStrategy:n,...o}=t,{canvas:a}=i;i.fire("layout:after",{context:t,result:e}),a&&a.fire("object:layout:after",{context:t,result:e,target:i});let l=i.parent;s&&null!=l&&l.layoutManager&&((o.path||(o.path=[])).push(i),l.layoutManager.performLayout({...o,target:l})),i.set("dirty",!0)}dispose(){let{_subscriptions:t}=this;t.forEach(t=>t.forEach(t=>t())),t.clear()}toObject(){return{type:nn,strategy:this.strategy.constructor.type}}toJSON(){return this.toObject()}};at.setClass(on,nn);var an=class extends on{performLayout(){}},ln=class t extends(mt(ys)){static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),p(this,"_activeObjects",[]),p(this,"__objectSelectionTracker",void 0),p(this,"__objectSelectionDisposer",void 0),Object.assign(this,t.ownDefaults),this.setOptions(i),this.groupInit(e,i)}groupInit(t,e){var i;this._objects=[...t],this.__objectSelectionTracker=this.__objectSelectionMonitor.bind(this,!0),this.__objectSelectionDisposer=this.__objectSelectionMonitor.bind(this,!1),this.forEachObject(t=>{this.enterGroup(t,!1)}),this.layoutManager=null==(i=e.layoutManager)?new on:i,this.layoutManager.performLayout({type:Zs,target:this,targets:[...t],x:e.left,y:e.top})}canEnterGroup(t){return t===this||this.isDescendantOf(t)?(b("error","Group: circular object trees are not supported, this call has no effect"),!1):-1===this._objects.indexOf(t)||(b("error","Group: duplicate objects are not supported inside group, this call has no effect"),!1)}_filterObjectsBeforeEnteringGroup(t){return t.filter((t,e,i)=>this.canEnterGroup(t)&&i.indexOf(t)===e)}add(...t){let e=this._filterObjectsBeforeEnteringGroup(t),i=super.add(...e);return this._onAfterObjectsChange(tn,e),i}insertAt(t,...e){let i=this._filterObjectsBeforeEnteringGroup(e),r=super.insertAt(t,...i);return this._onAfterObjectsChange(tn,i),r}remove(...t){let e=super.remove(...t);return this._onAfterObjectsChange("removed",e),e}_onObjectAdded(t){this.enterGroup(t,!0),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t,e){this.exitGroup(t,e),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onAfterObjectsChange(t,e){this.layoutManager.performLayout({type:t,targets:e,target:this})}_onStackOrderChanged(){this._set("dirty",!0)}_set(t,e){let i=this[t];return super._set(t,e),"canvas"===t&&i!==e&&(this._objects||[]).forEach(i=>{i._set(t,e)}),this}_shouldSetNestedCoords(){return this.subTargetCheck}removeAll(){return this._activeObjects=[],this.remove(...this._objects)}__objectSelectionMonitor(t,{target:e}){let i=this._activeObjects;if(t)i.push(e),this._set("dirty",!0);else if(i.length>0){let t=i.indexOf(e);t>-1&&(i.splice(t,1),this._set("dirty",!0))}}_watchObject(t,e){t&&this._watchObject(!1,e),t?(e.on("selected",this.__objectSelectionTracker),e.on("deselected",this.__objectSelectionDisposer)):(e.off("selected",this.__objectSelectionTracker),e.off("deselected",this.__objectSelectionDisposer))}enterGroup(t,e){t.group&&t.group.remove(t),t._set("parent",this),this._enterGroup(t,e)}_enterGroup(t,e){e&&ke(t,At(Pt(this.calcTransformMatrix()),t.calcTransformMatrix())),this._shouldSetNestedCoords()&&t.setCoords(),t._set("group",this),t._set("canvas",this.canvas),this._watchObject(!0,t);let i=this.canvas&&this.canvas.getActiveObject&&this.canvas.getActiveObject();i&&(i===t||t.isDescendantOf(i))&&this._activeObjects.push(t)}exitGroup(t,e){this._exitGroup(t,e),t._set("parent",void 0),t._set("canvas",void 0)}_exitGroup(t,e){t._set("group",void 0),e||(ke(t,At(this.calcTransformMatrix(),t.calcTransformMatrix())),t.setCoords()),this._watchObject(!1,t);let i=this._activeObjects.length>0?this._activeObjects.indexOf(t):-1;i>-1&&this._activeObjects.splice(i,1)}shouldCache(){let t=ys.prototype.shouldCache.call(this);if(t)for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow())return this.ownCaching=!1,!1;return t}willDrawShadow(){if(super.willDrawShadow())return!0;for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow())return!0;return!1}isOnACache(){return this.ownCaching||!!this.parent&&this.parent.isOnACache()}drawObject(t,e,i){this._renderBackground(t);for(let e=0;e<this._objects.length;e++){var r;let i=this._objects[e];null!=(r=this.canvas)&&r.preserveObjectStacking&&i.group!==this?(t.save(),t.transform(...Pt(this.calcTransformMatrix())),i.render(t),t.restore()):i.group===this&&i.render(t)}this._drawClipPath(t,this.clipPath,i)}setCoords(){super.setCoords(),this._shouldSetNestedCoords()&&this.forEachObject(t=>t.setCoords())}triggerLayout(t={}){this.layoutManager.performLayout({target:this,type:"imperative",...t})}render(t){this._transformDone=!0,super.render(t),this._transformDone=!1}__serializeObjects(t,e){let i=this.includeDefaultValues;return this._objects.filter(function(t){return!t.excludeFromExport}).map(function(r){let s=r.includeDefaultValues;r.includeDefaultValues=i;let n=r[t||"toObject"](e);return r.includeDefaultValues=s,n})}toObject(t=[]){let e=this.layoutManager.toObject();return{...super.toObject(["subTargetCheck","interactive",...t]),..."fit-content"!==e.strategy||this.includeDefaultValues?{layoutManager:e}:{},objects:this.__serializeObjects("toObject",t)}}toString(){return`#<Group: (${this.complexity()})>`}dispose(){this.layoutManager.unsubscribeTargets({targets:this.getObjects(),target:this}),this._activeObjects=[],this.forEachObject(t=>{this._watchObject(!1,t),t.dispose()}),super.dispose()}_createSVGBgRect(t){if(!this.backgroundColor)return"";let e=Qs.prototype._toSVG.call(this),i=e.indexOf("COMMON_PARTS");e[i]='for="group" ';let r=e.join("");return t?t(r):r}_toSVG(t){let e=["<g ","COMMON_PARTS"," >\n"],i=this._createSVGBgRect(t);i&&e.push("\t\t",i);for(let i=0;i<this._objects.length;i++)e.push("\t\t",this._objects[i].toSVG(t));return e.push("</g>\n"),e}getSvgStyles(){let t=void 0!==this.opacity&&1!==this.opacity?`opacity: ${fe(this.opacity)};`:"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")}toClipPathSVG(t){let e=[],i=this._createSVGBgRect(t);i&&e.push("\t",i);for(let i=0;i<this._objects.length;i++)e.push("\t",this._objects[i].toClipPathSVG(t));return this._createBaseClipPathSVGMarkup(e,{reviver:t})}static fromObject({type:t,objects:e=[],layoutManager:i,...r},s){return Promise.all([Ut(e,s),qt(r,s)]).then(([t,e])=>{let s=new this(t,{...r,...e,layoutManager:new an});return s.layoutManager=i?new(at.getClass(i.type))(new(at.getClass(i.strategy))):new on,s.layoutManager.subscribeTargets({type:Zs,target:s,targets:s.getObjects()}),s.setCoords(),s})}};p(ln,"type","Group"),p(ln,"ownDefaults",{strokeWidth:0,subTargetCheck:!1,interactive:!1}),at.setClass(ln);const hn=(t,e)=>t&&1===t.length?t[0]:new ln(t,e),cn=(t,e)=>Math.min(e.width/t.width,e.height/t.height),un=(t,e)=>Math.max(e.width/t.width,e.height/t.height),dn="\\s*,?\\s*",gn=`${dn}(${Di})`,fn=`${gn}${gn}${gn}${dn}([01])${dn}([01])${gn}${gn}`,pn={m:"l",M:"L"},mn=(t,e,i,r,s,n,o,a,l,h,c)=>{let u=ut(t),d=dt(t),g=ut(e),f=dt(e),p=i*s*g-r*n*f+o,m=r*s*g+i*n*f+a;return["C",h+l*(-i*s*d-r*n*u),c+l*(-r*s*d+i*n*u),p+l*(i*s*f+r*n*g),m+l*(r*s*f-i*n*g),p,m]},yn=(t,e,i,r)=>{let s=Math.atan2(e,t),n=Math.atan2(r,i);return n>=s?n-s:2*Math.PI-(s-n)};function bn(t,e,i,r,s,n,o,a){let l;if(y.cachesBoundsOfCurve&&(l=[...arguments].join(),M.boundsOfCurveCache[l]))return M.boundsOfCurveCache[l];let h=Math.sqrt,c=Math.abs,u=[],d=[[0,0],[0,0]],g=6*t-12*i+6*s,f=-3*t+9*i-9*s+3*o,p=3*i-3*t;for(let t=0;t<2;++t){if(t>0&&(g=6*e-12*r+6*n,f=-3*e+9*r-9*n+3*a,p=3*r-3*e),c(f)<1e-12){if(c(g)<1e-12)continue;let t=-p/g;0<t&&t<1&&u.push(t);continue}let i=g*g-4*p*f;if(i<0)continue;let s=h(i),o=(-g+s)/(2*f);0<o&&o<1&&u.push(o);let l=(-g-s)/(2*f);0<l&&l<1&&u.push(l)}let m=u.length,b=m,_=wn(t,e,i,r,s,n,o,a);for(;m--;){let{x:t,y:e}=_(u[m]);d[0][m]=t,d[1][m]=e}d[0][b]=t,d[1][b]=e,d[0][b+1]=o,d[1][b+1]=a;let v=[new gt(Math.min(...d[0]),Math.min(...d[1])),new gt(Math.max(...d[0]),Math.max(...d[1]))];return y.cachesBoundsOfCurve&&(M.boundsOfCurveCache[l]=v),v}const vn=(t,e,[i,r,s,n,o,a,l,h])=>{let c=((t,e,i,r,s,n,o)=>{if(0===i||0===r)return[];let a=0,l=0,h=0,c=Math.PI,u=o*L,d=dt(u),g=ut(u),f=.5*(-g*t-d*e),p=.5*(-g*e+d*t),m=i**2,y=r**2,b=p**2,_=f**2,v=m*y-m*b-y*_,x=Math.abs(i),C=Math.abs(r);if(v<0){let t=Math.sqrt(1-v/(m*y));x*=t,C*=t}else h=(s===n?-1:1)*Math.sqrt(v/(m*b+y*_));let w=h*x*p/C,S=-h*C*f/x,T=g*w-d*S+.5*t,O=d*w+g*S+.5*e,k=yn(1,0,(f-w)/x,(p-S)/C),D=yn((f-w)/x,(p-S)/C,(-f-w)/x,(-p-S)/C);0===n&&D>0?D-=2*c:1===n&&D<0&&(D+=2*c);let M=Math.ceil(Math.abs(D/c*2)),j=[],E=D/M,P=8/3*Math.sin(E/4)*Math.sin(E/4)/Math.sin(E/2),A=k+E;for(let t=0;t<M;t++)j[t]=mn(k,A,g,d,x,C,T,O,P,a,l),a=j[t][5],l=j[t][6],k=A,A+=E;return j})(l-t,h-e,r,s,o,a,n);for(let i=0,r=c.length;i<r;i++)c[i][1]+=t,c[i][2]+=e,c[i][3]+=t,c[i][4]+=e,c[i][5]+=t,c[i][6]+=e;return c},xn=t=>{let e,i=0,r=0,s=0,n=0,o=[],a=0,l=0;for(let h of t){let t,c=[...h];switch(c[0]){case"l":c[1]+=i,c[2]+=r;case"L":i=c[1],r=c[2],t=["L",i,r];break;case"h":c[1]+=i;case"H":i=c[1],t=["L",i,r];break;case"v":c[1]+=r;case"V":r=c[1],t=["L",i,r];break;case"m":c[1]+=i,c[2]+=r;case"M":i=c[1],r=c[2],s=c[1],n=c[2],t=["M",i,r];break;case"c":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r,c[5]+=i,c[6]+=r;case"C":a=c[3],l=c[4],i=c[5],r=c[6],t=["C",c[1],c[2],a,l,i,r];break;case"s":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r;case"S":"C"===e?(a=2*i-a,l=2*r-l):(a=i,l=r),i=c[3],r=c[4],t=["C",a,l,c[1],c[2],i,r],a=t[3],l=t[4];break;case"q":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r;case"Q":a=c[1],l=c[2],i=c[3],r=c[4],t=["Q",a,l,i,r];break;case"t":c[1]+=i,c[2]+=r;case"T":"Q"===e?(a=2*i-a,l=2*r-l):(a=i,l=r),i=c[1],r=c[2],t=["Q",a,l,i,r];break;case"a":c[6]+=i,c[7]+=r;case"A":vn(i,r,c).forEach(t=>o.push(t)),i=c[6],r=c[7];break;case"z":case"Z":i=s,r=n,t=["Z"]}t?(o.push(t),e=t[0]):e=""}return o},Cn=(t,e,i,r)=>Math.sqrt((i-t)**2+(r-e)**2),wn=(t,e,i,r,s,n,o,a)=>l=>{let h=l**3,c=(t=>3*t**2*(1-t))(l),u=(t=>3*t*(1-t)**2)(l),d=(t=>(1-t)**3)(l);return new gt(o*h+s*c+i*u+t*d,a*h+n*c+r*u+e*d)},Sn=t=>t**2,Tn=t=>2*t*(1-t),On=t=>(1-t)**2,kn=(t,e,i,r,s,n,o,a)=>l=>{let h=Sn(l),c=Tn(l),u=On(l),d=3*(u*(i-t)+c*(s-i)+h*(o-s)),g=3*(u*(r-e)+c*(n-r)+h*(a-n));return Math.atan2(g,d)},Dn=(t,e,i,r,s,n)=>o=>{let a=Sn(o),l=Tn(o),h=On(o);return new gt(s*a+i*l+t*h,n*a+r*l+e*h)},Mn=(t,e,i,r,s,n)=>o=>{let a=1-o,l=2*(a*(i-t)+o*(s-i)),h=2*(a*(r-e)+o*(n-r));return Math.atan2(h,l)},jn=(t,e,i)=>{let r=new gt(e,i),s=0;for(let e=1;e<=100;e+=1){let i=t(e/100);s+=Cn(r.x,r.y,i.x,i.y),r=i}return s},En=t=>{let e,i,r=0,s=0,n=0,o=0,a=0,l=[];for(let h of t){let t={x:s,y:n,command:h[0],length:0};switch(h[0]){case"M":i=t,i.x=o=s=h[1],i.y=a=n=h[2];break;case"L":i=t,i.length=Cn(s,n,h[1],h[2]),s=h[1],n=h[2];break;case"C":e=wn(s,n,h[1],h[2],h[3],h[4],h[5],h[6]),i=t,i.iterator=e,i.angleFinder=kn(s,n,h[1],h[2],h[3],h[4],h[5],h[6]),i.length=jn(e,s,n),s=h[5],n=h[6];break;case"Q":e=Dn(s,n,h[1],h[2],h[3],h[4]),i=t,i.iterator=e,i.angleFinder=Mn(s,n,h[1],h[2],h[3],h[4]),i.length=jn(e,s,n),s=h[3],n=h[4];break;case"Z":i=t,i.destX=o,i.destY=a,i.length=Cn(s,n,o,a),s=o,n=a}r+=i.length,l.push(i)}return l.push({length:r,x:s,y:n}),l},Pn=(t,e,i=En(t))=>{let r=0;for(;e-i[r].length>0&&r<i.length-2;)e-=i[r].length,r++;let s=i[r],n=e/s.length,o=t[r];switch(s.command){case"M":return{x:s.x,y:s.y,angle:0};case"Z":return{...new gt(s.x,s.y).lerp(new gt(s.destX,s.destY),n),angle:Math.atan2(s.destY-s.y,s.destX-s.x)};case"L":return{...new gt(s.x,s.y).lerp(new gt(o[1],o[2]),n),angle:Math.atan2(o[2]-s.y,o[1]-s.x)};case"C":case"Q":return((t,e)=>{let i,r=0,s=0,n={x:t.x,y:t.y},o={...n},a=.01,l=0,h=t.iterator,c=t.angleFinder;for(;s<e&&a>1e-4;)o=h(r),l=r,i=Cn(n.x,n.y,o.x,o.y),i+s>e?(r-=a,a/=2):(n=o,r+=a,s+=i);return{...o,angle:c(l)}})(s,e)}},An=RegExp("[mzlhvcsqta][^mzlhvcsqta]*","gi"),Fn=new RegExp(fn,"g"),Ln=new RegExp(Di,"gi"),In={m:2,l:2,h:1,v:1,c:6,s:4,q:4,t:2,a:7},Rn=t=>{var e;let i=[],r=null==(e=t.match(An))?[]:e;for(let t of r){let e=t[0];if("z"===e||"Z"===e){i.push([e]);continue}let r=In[e.toLowerCase()],s=[];if("a"===e||"A"===e){let e;for(Fn.lastIndex=0;e=Fn.exec(t);)s.push(...e.slice(1))}else s=t.match(Ln)||[];for(let t=0;t<s.length;t+=r){let n=Array(r),o=pn[e];n[0]=t>0&&o?o:e;for(let e=0;e<r;e++)n[e+1]=parseFloat(s[t+e]);i.push(n)}}return i},Bn=(t,e=0)=>{let i,r=new gt(t[0]),s=new gt(t[1]),n=1,o=0,a=[],l=t.length,h=l>2;for(h&&(n=t[2].x<s.x?-1:t[2].x===s.x?0:1,o=t[2].y<s.y?-1:t[2].y===s.y?0:1),a.push(["M",r.x-n*e,r.y-o*e]),i=1;i<l;i++){if(!r.eq(s)){let t=r.midPointFrom(s);a.push(["Q",r.x,r.y,t.x,t.y])}r=t[i],i+1<t.length&&(s=t[i+1])}return h&&(n=r.x>t[i-2].x?1:r.x===t[i-2].x?0:-1,o=r.y>t[i-2].y?1:r.y===t[i-2].y?0:-1),a.push(["L",r.x+n*e,r.y+o*e]),a},$n=(t,e,i)=>(i&&(e=At(e,[1,0,0,1,-i.x,-i.y])),t.map(t=>{let i=[...t];for(let r=1;r<t.length-1;r+=2){let{x:s,y:n}=Et({x:t[r],y:t[r+1]},e);i[r]=s,i[r+1]=n}return i})),Xn=(t,e)=>{let i=2*Math.PI/t,r=-P;t%2==0&&(r+=i/2);let s=Array(t+1);for(let n=0;n<t;n++){let t=n*i+r,{x:o,y:a}=new gt(ut(t),dt(t)).scalarMultiply(e);s[n]=[0===n?"M":"L",o,a]}return s[t]=["Z"],s},Yn=(t,e)=>t.map(t=>t.map((t,i)=>0===i||void 0===e?t:Qt(t,e)).join(" ")).join(" "),Wn=(t,e)=>{var i;let r=t,s=e;r.inverted&&!s.inverted&&(r=e,s=t),Fe(s,null==(i=s.group)?void 0:i.calcTransformMatrix(),r.calcTransformMatrix());let n=r.inverted&&s.inverted;return n&&(r.inverted=s.inverted=!1),new ln([r],{clipPath:s,inverted:n})},Nn=(t,e)=>Math.floor(Math.random()*(e-t+1))+t,Vn=(t,e)=>{let i=t._findCenterFromElement();t.transformMatrix&&((t=>{if(t.transformMatrix){let{scaleX:e,scaleY:i,angle:r,skewX:s}=Bt(t.transformMatrix);t.flipX=!1,t.flipY=!1,t.set(Q,e),t.set(Z,i),t.angle=r,t.skewX=s,t.skewY=0}})(t),i=i.transform(t.transformMatrix)),delete t.transformMatrix,e&&(t.scaleX*=e.scaleX,t.scaleY*=e.scaleY,t.cropX=e.cropX,t.cropY=e.cropY,i.x+=e.offsetLeft,i.y+=e.offsetTop,t.width=e.width,t.height=e.height),t.setPositionByOrigin(i,R,R)};function zn(t,e){let i=t.style;i&&Object.entries(e).forEach(([t,e])=>i.setProperty(t,e))}d({addTransformToObject:()=>Oe,animate:()=>Mr,animateColor:()=>jr,applyTransformToObject:()=>ke,calcAngleBetweenVectors:()=>We,calcDimensionsMatrix:()=>zt,calcPlaneChangeMatrix:()=>Ee,calcVectorRotation:()=>Ne,cancelAnimFrame:()=>_t,capValue:()=>Bi,composeMatrix:()=>Ht,copyCanvasElement:()=>St,cos:()=>ut,createCanvasElement:()=>Ct,createImage:()=>wt,createRotateMatrix:()=>Xt,createScaleMatrix:()=>Yt,createSkewXMatrix:()=>Nt,createSkewYMatrix:()=>Vt,createTranslateMatrix:()=>$t,createVector:()=>Xe,crossProduct:()=>He,degreesToRadians:()=>Dt,dotProduct:()=>Ge,ease:()=>Wi,enlivenObjectEnlivables:()=>qt,enlivenObjects:()=>Ut,findScaleToCover:()=>un,findScaleToFit:()=>cn,getBoundsOfCurve:()=>bn,getOrthonormalVector:()=>ze,getPathSegmentsInfo:()=>En,getPointOnPath:()=>Pn,getPointer:()=>xe,getRandomInt:()=>Nn,getRegularPolygonPath:()=>Xn,getSmoothPathFromPoints:()=>Bn,getSvgAttributes:()=>fi,getUnitVector:()=>Ve,groupSVGElements:()=>hn,hasStyleChanged:()=>Ts,invertTransform:()=>Pt,isBetweenVectors:()=>Ue,isIdentityMatrix:()=>jt,isTouchEvent:()=>Ce,isTransparent:()=>bs,joinPath:()=>Yn,loadImage:()=>Gt,magnitude:()=>Ye,makeBoundingBoxFromPoints:()=>Se,makePathSimpler:()=>xn,matrixToSVG:()=>Zt,mergeClipPaths:()=>Wn,multiplyTransformMatrices:()=>At,multiplyTransformMatrixArray:()=>Ft,parsePath:()=>Rn,parsePreserveAspectRatioAttribute:()=>mi,parseUnit:()=>pi,pick:()=>Kt,projectStrokeOnPoints:()=>ws,qrDecompose:()=>Bt,radiansToDegrees:()=>Mt,removeFromArray:()=>ct,removeTransformFromObject:()=>Te,removeTransformMatrixForSvgParsing:()=>Vn,requestAnimFrame:()=>bt,resetObjectTransform:()=>De,rotateVector:()=>$e,saveObjectTransform:()=>Me,sendObjectToPlane:()=>Fe,sendPointToPlane:()=>Pe,sendVectorToPlane:()=>Ae,sin:()=>dt,sizeAfterTransform:()=>je,string:()=>de,stylesFromArray:()=>ks,stylesToArray:()=>Os,toBlob:()=>kt,toDataURL:()=>Ot,toFixed:()=>Qt,transformPath:()=>$n,transformPoint:()=>Et});var Hn=class extends ce{constructor(t,{allowTouchScrolling:e=!1,containerClass:i=""}={}){super(t),p(this,"upper",void 0),p(this,"container",void 0);let{el:r}=this.lower,s=this.createUpperCanvas();this.upper={el:s,ctx:s.getContext("2d")},this.applyCanvasStyle(r,{allowTouchScrolling:e}),this.applyCanvasStyle(s,{allowTouchScrolling:e,styles:{position:"absolute",left:"0",top:"0"}});let n=this.createContainerElement();n.classList.add(i),r.parentNode&&r.parentNode.replaceChild(n,r),n.append(r,s),this.container=n}createUpperCanvas(){let{el:t}=this.lower,e=Ct();return e.className=t.className,e.classList.remove("lower-canvas"),e.classList.add("upper-canvas"),e.setAttribute("data-fabric","top"),e.style.cssText=t.style.cssText,e.setAttribute("draggable","true"),e}createContainerElement(){let t=O().createElement("div");return t.setAttribute("data-fabric","wrapper"),zn(t,{position:"relative"}),he(t),t}applyCanvasStyle(t,e){let{styles:i,allowTouchScrolling:r}=e;zn(t,{...i,"touch-action":r?"manipulation":Y}),he(t)}setDimensions(t,e){super.setDimensions(t,e);let{el:i,ctx:r}=this.upper;ae(i,r,t,e)}setCSSDimensions(t){super.setCSSDimensions(t),le(this.upper.el,t),le(this.container,t)}cleanupDOM(t){let e=this.container,{el:i}=this.lower,{el:r}=this.upper;super.cleanupDOM(t),e.removeChild(r),e.removeChild(i),e.parentNode&&e.parentNode.replaceChild(i,e)}dispose(){super.dispose(),T().dispose(this.upper.el),delete this.upper,delete this.container}};const Gn=(t,e,i,r)=>{let{target:s,offsetX:n,offsetY:o}=e,a=i-n,l=r-o,h=!Qe(s,"lockMovementX")&&s.left!==a,c=!Qe(s,"lockMovementY")&&s.top!==l;return h&&s.set("left",a),c&&s.set("top",l),(h||c)&&Fr(N,Ze(t,e,i,r)),h||c},Un=q,qn=t=>function(e,i,r){let{points:s,pathOffset:n}=r;return new gt(s[t]).subtract(n).transform(At(r.getViewportTransform(),r.calcTransformMatrix()))},Kn=(t,e,i,r)=>{let{target:s,pointIndex:n}=e,o=s,a=Pe(new gt(i,r),void 0,o.calcOwnMatrix());return o.points[n]=a.add(o.pathOffset),o.setDimensions(),o.set("dirty",!0),!0},Jn=(t,e)=>function(i,r,s,n){let o=r.target,a=new gt(o.points[(t>0?t:o.points.length)-1]),l=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()),h=e(i,{...r,pointIndex:t},s,n),c=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()).subtract(l);return o.left-=c.x,o.top-=c.y,h},Qn=t=>Lr(Un,Jn(t,Kn));function Zn(t,e={}){let i={};for(let r=0;r<("number"==typeof t?t:t.points.length);r++)i[`p${r}`]=new Vr({actionName:Un,positionHandler:qn(r),actionHandler:Qn(r),...e});return i}const to=(t,e,i)=>{let{path:r,pathOffset:s}=t,n=r[e];return new gt(n[i]-s.x,n[i+1]-s.y).transform(At(t.getViewportTransform(),t.calcTransformMatrix()))};function eo(t,e,i){let{commandIndex:r,pointIndex:s}=this;return to(i,r,s)}function io(t,e,i,r){let{target:s}=e,{commandIndex:n,pointIndex:o}=this,a=((t,e,i,r,s)=>{let{path:n,pathOffset:o}=t,a=n[(r>0?r:n.length)-1],l=new gt(a[s],a[s+1]),h=l.subtract(o).transform(t.calcOwnMatrix()),c=Pe(new gt(e,i),void 0,t.calcOwnMatrix());n[r][s]=c.x+o.x,n[r][s+1]=c.y+o.y,t.setDimensions();let u=l.subtract(t.pathOffset).transform(t.calcOwnMatrix()).subtract(h);return t.left-=u.x,t.top-=u.y,t.set("dirty",!0),!0})(s,i,r,n,o);return a&&Fr(this.actionName,{...Ze(t,e,i,r),commandIndex:n,pointIndex:o}),a}var ro=class extends Vr{constructor(t){super(t)}render(t,e,i,r,s){let n={...r,cornerColor:this.controlFill,cornerStrokeColor:this.controlStroke,transparentCorners:!this.controlFill};super.render(t,e,i,n,s)}},so=class extends ro{constructor(t){super(t)}render(t,e,i,r,s){let{path:n}=s,{commandIndex:o,pointIndex:a,connectToCommandIndex:l,connectToPointIndex:h}=this;t.save(),t.strokeStyle=this.controlStroke,this.connectionDashArray&&t.setLineDash(this.connectionDashArray);let[c]=n[o],u=to(s,l,h);if("Q"===c){let r=to(s,o,a+2);t.moveTo(r.x,r.y),t.lineTo(e,i)}else t.moveTo(e,i);t.lineTo(u.x,u.y),t.stroke(),t.restore(),super.render(t,e,i,r,s)}};const no=(t,e,i,r,s,n)=>new(i?so:ro)({commandIndex:t,pointIndex:e,actionName:"modifyPath",positionHandler:eo,actionHandler:io,connectToCommandIndex:s,connectToPointIndex:n,...r,...i?r.controlPointStyle:r.pointStyle});function oo(t,e={}){let i={},r="M";return t.path.forEach((t,s)=>{let n=t[0];switch("Z"!==n&&(i[`c_${s}_${n}`]=no(s,t.length-2,!1,e)),n){case"C":i[`c_${s}_C_CP_1`]=no(s,1,!0,e,s-1,(t=>"C"===t?5:"Q"===t?3:1)(r)),i[`c_${s}_C_CP_2`]=no(s,3,!0,e,s,5);break;case"Q":i[`c_${s}_Q_CP_1`]=no(s,1,!0,e,s,3)}r=n}),i}d({changeHeight:()=>Yr,changeObjectHeight:()=>$r,changeObjectWidth:()=>Br,changeWidth:()=>Xr,createObjectDefaultControls:()=>ds,createPathControls:()=>oo,createPolyActionHandler:()=>Qn,createPolyControls:()=>Zn,createPolyPositionHandler:()=>qn,createResizeControls:()=>gs,createTextboxDefaultControls:()=>fs,dragHandler:()=>Gn,factoryPolyActionHandler:()=>Jn,getLocalPoint:()=>ei,polyActionHandler:()=>Kn,renderCircleControl:()=>Wr,renderSquareControl:()=>Nr,rotationStyleHandler:()=>zr,rotationWithSnapping:()=>Hr,scaleCursorStyleHandler:()=>Kr,scaleOrSkewActionName:()=>ls,scaleSkewCursorStyleHandler:()=>hs,scalingEqually:()=>Qr,scalingX:()=>Zr,scalingXOrSkewingY:()=>cs,scalingY:()=>ts,scalingYOrSkewingX:()=>us,skewCursorStyleHandler:()=>rs,skewHandlerX:()=>ns,skewHandlerY:()=>os,wrapWithFireEvent:()=>Lr,wrapWithFixedAnchor:()=>Ir});var ao=class t extends _e{constructor(...t){super(...t),p(this,"_hoveredTargets",[]),p(this,"_currentTransform",null),p(this,"_groupSelector",null),p(this,"contextTopDirty",!1)}static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}get upperCanvasEl(){var t;return null==(t=this.elements.upper)?void 0:t.el}get contextTop(){var t;return null==(t=this.elements.upper)?void 0:t.ctx}get wrapperEl(){return this.elements.container}initElements(t){this.elements=new Hn(t,{allowTouchScrolling:this.allowTouchScrolling,containerClass:this.containerClass}),this._createCacheCanvas()}_onObjectAdded(t){this._objectsToRender=void 0,super._onObjectAdded(t)}_onObjectRemoved(t){this._objectsToRender=void 0,t===this._activeObject&&(this.fire("before:selection:cleared",{deselected:[t]}),this._discardActiveObject(),this.fire("selection:cleared",{deselected:[t]}),t.fire("deselected",{target:t})),t===this._hoveredTarget&&(this._hoveredTarget=void 0,this._hoveredTargets=[]),super._onObjectRemoved(t)}_onStackOrderChanged(){this._objectsToRender=void 0,super._onStackOrderChanged()}_chooseObjectsToRender(){let t=this._activeObject;return!this.preserveObjectStacking&&t?this._objects.filter(e=>!e.group&&e!==t).concat(t):this._objects}renderAll(){this.cancelRequestedRender(),this.destroyed||(!this.contextTopDirty||this._groupSelector||this.isDrawingMode||(this.clearContext(this.contextTop),this.contextTopDirty=!1),this.hasLostContext&&(this.renderTopLayer(this.contextTop),this.hasLostContext=!1),!this._objectsToRender&&(this._objectsToRender=this._chooseObjectsToRender()),this.renderCanvas(this.getContext(),this._objectsToRender))}renderTopLayer(t){t.save(),this.isDrawingMode&&this._isCurrentlyDrawing&&(this.freeDrawingBrush&&this.freeDrawingBrush._render(),this.contextTopDirty=!0),this.selection&&this._groupSelector&&(this._drawSelection(t),this.contextTopDirty=!0),t.restore()}renderTop(){let t=this.contextTop;this.clearContext(t),this.renderTopLayer(t),this.fire("after:render",{ctx:t})}setTargetFindTolerance(t){t=Math.round(t),this.targetFindTolerance=t;let e=this.getRetinaScaling(),i=Math.ceil((2*t+1)*e);this.pixelFindCanvasEl.width=this.pixelFindCanvasEl.height=i,this.pixelFindContext.scale(e,e)}isTargetTransparent(t,e,i){let r=this.targetFindTolerance,s=this.pixelFindContext;this.clearContext(s),s.save(),s.translate(-e+r,-i+r),s.transform(...this.viewportTransform);let n=t.selectionBackgroundColor;t.selectionBackgroundColor="",t.render(s),t.selectionBackgroundColor=n,s.restore();let o=Math.round(r*this.getRetinaScaling());return bs(s,o,o,o)}_isSelectionKeyPressed(t){let e=this.selectionKey;return!!e&&(Array.isArray(e)?!!e.find(e=>!!e&&!0===t[e]):t[e])}_shouldClearSelection(t,e){let i=this.getActiveObjects(),r=this._activeObject;return!!(!e||e&&r&&i.length>1&&-1===i.indexOf(e)&&r!==e&&!this._isSelectionKeyPressed(t)||e&&!e.evented||e&&!e.selectable&&r&&r!==e)}_shouldCenterTransform(t,e,i){if(!t)return;let r;return"scale"===e||"scaleX"===e||"scaleY"===e||"resizing"===e?r=this.centeredScaling||t.centeredScaling:"rotate"===e&&(r=this.centeredRotation||t.centeredRotation),r?!i:i}_getOriginFromCorner(t,e){let i=e?t.controls[e].getTransformAnchorPoint():{x:t.originX,y:t.originY};return e?(["ml","tl","bl"].includes(e)?i.x=X:["mr","tr","br"].includes(e)&&(i.x=B),["tl","mt","tr"].includes(e)?i.y=$:["bl","mb","br"].includes(e)&&(i.y="top"),i):i}_setupCurrentTransform(t,e,i){var r;let s=e.group?Pe(this.getScenePoint(t),void 0,e.group.calcTransformMatrix()):this.getScenePoint(t),{key:n="",control:o}=e.getActiveControl()||{},a=i&&o?null==(r=o.getActionHandler(t,e,o))?void 0:r.bind(o):Gn,l=((t,e,i,r)=>{if(!e||!t)return"drag";let s=r.controls[e];return s.getActionName(i,s,r)})(i,n,t,e),h=t[this.centeredKey],c=this._shouldCenterTransform(e,l,h)?{x:R,y:R}:this._getOriginFromCorner(e,n),{scaleX:u,scaleY:d,skewX:g,skewY:f,left:p,top:m,angle:y,width:b,height:_,cropX:v,cropY:x}=e,C={target:e,action:l,actionHandler:a,actionPerformed:!1,corner:n,scaleX:u,scaleY:d,skewX:g,skewY:f,offsetX:s.x-p,offsetY:s.y-m,originX:c.x,originY:c.y,ex:s.x,ey:s.y,lastX:s.x,lastY:s.y,theta:Dt(y),width:b,height:_,shiftKey:t.shiftKey,altKey:h,original:{...Me(e),originX:c.x,originY:c.y,cropX:v,cropY:x}};this._currentTransform=C,this.fire("before:transform",{e:t,transform:C})}setCursor(t){this.upperCanvasEl.style.cursor=t}_drawSelection(t){let{x:e,y:i,deltaX:r,deltaY:s}=this._groupSelector,n=new gt(e,i).transform(this.viewportTransform),o=new gt(e+r,i+s).transform(this.viewportTransform),a=this.selectionLineWidth/2,l=Math.min(n.x,o.x),h=Math.min(n.y,o.y),c=Math.max(n.x,o.x),u=Math.max(n.y,o.y);this.selectionColor&&(t.fillStyle=this.selectionColor,t.fillRect(l,h,c-l,u-h)),this.selectionLineWidth&&this.selectionBorderColor&&(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,l+=a,h+=a,c-=a,u-=a,ys.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(l,h,c-l,u-h))}findTarget(t){if(this._targetInfo)return this._targetInfo;if(this.skipTargetFind)return{subTargets:[],currentSubTargets:[]};let e=this.getScenePoint(t),i=this._activeObject,r=this.getActiveObjects(),s=this.searchPossibleTargets(this._objects,e),{subTargets:n,container:o,target:a}=s,l={...s,currentSubTargets:n,currentContainer:o,currentTarget:a};if(!i)return l;let h={...this.searchPossibleTargets([i],e),currentSubTargets:n,currentContainer:o,currentTarget:a};return i.findControl(this.getViewportPoint(t),Ce(t))?{...h,target:i}:h.target&&(r.length>1||!this.preserveObjectStacking||this.preserveObjectStacking&&t[this.altSelectionKey])?h:l}_pointIsInObjectSelectionArea(t,e){let i=t.getCoords(),r=this.getZoom(),s=t.padding/r;if(s){let[t,e,r,n]=i,o=Math.atan2(e.y-t.y,e.x-t.x),a=ut(o)*s,l=dt(o)*s,h=a+l,c=a-l;i=[new gt(t.x-c,t.y-h),new gt(e.x+h,e.y-c),new gt(r.x+c,r.y+h),new gt(n.x-h,n.y+c)]}return Er.isPointInPolygon(e,i)}_checkTarget(t,e){if(t&&t.visible&&t.evented&&this._pointIsInObjectSelectionArea(t,e)){if(!this.perPixelTargetFind&&!t.perPixelTargetFind||t.isEditing)return!0;{let i=e.transform(this.viewportTransform);if(!this.isTargetTransparent(t,i.x,i.y))return!0}}return!1}_searchPossibleTargets(t,e,i){let r=t.length;for(;r--;){let s=t[r];if(this._checkTarget(s,e)){if(pt(s)&&s.subTargetCheck){let{target:t}=this._searchPossibleTargets(s._objects,e,i);t&&i.push(t)}return{target:s,subTargets:i}}}return{subTargets:[]}}searchPossibleTargets(t,e){let i=this._searchPossibleTargets(t,e,[]);i.container=i.target;let{container:r,subTargets:s}=i;if(r&&pt(r)&&r.interactive&&s[0]){for(let t=s.length-1;t>0;t--){let e=s[t];if(!pt(e)||!e.interactive)return i.target=e,i}return i.target=s[0],i}return i}getViewportPoint(t){return this._viewportPoint?this._viewportPoint:this._getPointerImpl(t,!0)}getScenePoint(t){return this._scenePoint?this._scenePoint:this._getPointerImpl(t)}_getPointerImpl(t,e=!1){let i=this.upperCanvasEl,r=i.getBoundingClientRect(),s=xe(t),n=r.width||0,o=r.height||0;n&&o||("top"in r&&"bottom"in r&&(o=Math.abs(r.top-r.bottom)),"right"in r&&"left"in r&&(n=Math.abs(r.right-r.left))),this.calcOffset(),s.x-=this._offset.left,s.y-=this._offset.top,e||(s=Pe(s,void 0,this.viewportTransform));let a=this.getRetinaScaling();1!==a&&(s.x/=a,s.y/=a);let l=0===n||0===o?new gt(1,1):new gt(i.width/n,i.height/o);return s.multiply(l)}_setDimensionsImpl(t,e){this._resetTransformEventData(),super._setDimensionsImpl(t,e),this._isCurrentlyDrawing&&this.freeDrawingBrush&&this.freeDrawingBrush._setBrushStyles(this.contextTop)}_createCacheCanvas(){this.pixelFindCanvasEl=Ct(),this.pixelFindContext=this.pixelFindCanvasEl.getContext("2d",{willReadFrequently:!0}),this.setTargetFindTolerance(this.targetFindTolerance)}getTopContext(){return this.elements.upper.ctx}getSelectionContext(){return this.elements.upper.ctx}getSelectionElement(){return this.elements.upper.el}getActiveObject(){return this._activeObject}getActiveObjects(){let t=this._activeObject;return re(t)?t.getObjects():t?[t]:[]}_fireSelectionEvents(t,e){let i=!1,r=!1,s=this.getActiveObjects(),n=[],o=[];t.forEach(t=>{s.includes(t)||(i=!0,t.fire("deselected",{e,target:t}),o.push(t))}),s.forEach(r=>{t.includes(r)||(i=!0,r.fire("selected",{e,target:r}),n.push(r))}),t.length>0&&s.length>0?(r=!0,i&&this.fire("selection:updated",{e,selected:n,deselected:o})):s.length>0?(r=!0,this.fire("selection:created",{e,selected:n})):t.length>0&&(r=!0,this.fire("selection:cleared",{e,deselected:o})),r&&(this._objectsToRender=void 0)}setActiveObject(t,e){let i=this.getActiveObjects(),r=this._setActiveObject(t,e);return this._fireSelectionEvents(i,e),r}_setActiveObject(t,e){let i=this._activeObject;return!(i===t||!this._discardActiveObject(e,t)&&this._activeObject||t.onSelect({e})||(this._activeObject=t,re(t)&&i!==t&&t.set("canvas",this),t.setCoords(),0))}_discardActiveObject(t,e){let i=this._activeObject;return!!i&&!i.onDeselect({e:t,object:e})&&(this._currentTransform&&this._currentTransform.target===i&&this.endCurrentTransform(t),re(i)&&i===this._hoveredTarget&&(this._hoveredTarget=void 0),this._activeObject=void 0,!0)}discardActiveObject(t){let e=this.getActiveObjects(),i=this.getActiveObject();e.length&&this.fire("before:selection:cleared",{e:t,deselected:[i]});let r=this._discardActiveObject(t);return this._fireSelectionEvents(e,t),r}endCurrentTransform(t){let e=this._currentTransform;this._finalizeCurrentTransform(t),e&&e.target&&(e.target.isMoving=!1),this._currentTransform=null}_finalizeCurrentTransform(t){let e=this._currentTransform,i=e.target,r={e:t,target:i,transform:e,action:e.action};i._scaling&&(i._scaling=!1),i.setCoords(),e.actionPerformed&&(this.fire("object:modified",r),i.fire(st,r))}setViewportTransform(t){super.setViewportTransform(t);let e=this._activeObject;e&&e.setCoords()}destroy(){let t=this._activeObject;re(t)&&(t.removeAll(),t.dispose()),delete this._activeObject,super.destroy(),this.pixelFindContext=null,this.pixelFindCanvasEl=void 0}clear(){this.discardActiveObject(),this._activeObject=void 0,this.clearContext(this.contextTop),super.clear()}drawControls(t){let e=this._activeObject;e&&e._renderControls(t)}_toObject(t,e,i){let r=this._realizeGroupTransformOnObject(t),s=super._toObject(t,e,i);return t.set(r),s}_realizeGroupTransformOnObject(t){let{group:e}=t;if(e&&re(e)&&this._activeObject===e){let i=Kt(t,["angle","flipX","flipY",B,Q,Z,tt,et,"top"]);return Oe(t,e.calcOwnMatrix()),i}return{}}_setSVGObject(t,e,i){let r=this._realizeGroupTransformOnObject(e);super._setSVGObject(t,e,i),e.set(r)}};p(ao,"ownDefaults",{uniformScaling:!0,uniScaleKey:"shiftKey",centeredScaling:!1,centeredRotation:!1,centeredKey:"altKey",altActionKey:"shiftKey",selection:!0,selectionKey:"shiftKey",selectionColor:"rgba(100, 100, 255, 0.3)",selectionDashArray:[],selectionBorderColor:"rgba(255, 255, 255, 0.3)",selectionLineWidth:1,selectionFullyContained:!1,hoverCursor:"move",moveCursor:"move",defaultCursor:"default",freeDrawingCursor:"crosshair",notAllowedCursor:"not-allowed",perPixelTargetFind:!1,targetFindTolerance:0,skipTargetFind:!1,stopContextMenu:!0,fireRightClick:!0,fireMiddleClick:!0,enablePointerEvents:!1,containerClass:"canvas-container",preserveObjectStacking:!0});var lo=class{constructor(t){p(this,"targets",[]),p(this,"__disposer",void 0);let e=()=>{let{hiddenTextarea:e}=t.getActiveObject()||{};e&&e.focus()},i=t.upperCanvasEl;i.addEventListener("click",e),this.__disposer=()=>i.removeEventListener("click",e)}exitTextEditing(){this.target=void 0,this.targets.forEach(t=>{t.isEditing&&t.exitEditing()})}add(t){this.targets.push(t)}remove(t){this.unregister(t),ct(this.targets,t)}register(t){this.target=t}unregister(t){t===this.target&&(this.target=void 0)}onMouseMove(t){var e;null!=(e=this.target)&&e.isEditing&&this.target.updateSelectionOnMouseMove(t)}clear(){this.targets=[],this.target=void 0}dispose(){this.clear(),this.__disposer(),delete this.__disposer}};const ho={passive:!1},co=(t,e)=>({viewportPoint:t.getViewportPoint(e),scenePoint:t.getScenePoint(e)}),uo=(t,...e)=>t.addEventListener(...e),go=(t,...e)=>t.removeEventListener(...e),fo={mouse:{in:"over",out:"out",targetIn:"mouseover",targetOut:"mouseout",canvasIn:"mouse:over",canvasOut:"mouse:out"},drag:{in:"enter",out:"leave",targetIn:"dragenter",targetOut:"dragleave",canvasIn:"drag:enter",canvasOut:"drag:leave"}};var po=class extends ao{constructor(t,e={}){super(t,e),p(this,"_isClick",void 0),p(this,"textEditingManager",new lo(this)),["_onMouseDown","_onTouchStart","_onMouseMove","_onMouseUp","_onTouchEnd","_onResize","_onMouseWheel","_onMouseOut","_onMouseEnter","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragProgress","_onDragOver","_onDragEnter","_onDragLeave","_onDrop"].forEach(t=>{this[t]=this[t].bind(this)}),this.addOrRemove(uo)}_getEventPrefix(){return this.enablePointerEvents?"pointer":"mouse"}addOrRemove(t,e=!1){let i=this.upperCanvasEl,r=this._getEventPrefix();t(oe(i),"resize",this._onResize),t(i,r+"down",this._onMouseDown),t(i,`${r}move`,this._onMouseMove,ho),t(i,`${r}out`,this._onMouseOut),t(i,`${r}enter`,this._onMouseEnter),t(i,"wheel",this._onMouseWheel,{passive:!1}),t(i,"contextmenu",this._onContextMenu),e||(t(i,"click",this._onClick),t(i,"dblclick",this._onClick)),t(i,"dragstart",this._onDragStart),t(i,"dragend",this._onDragEnd),t(i,"dragover",this._onDragOver),t(i,"dragenter",this._onDragEnter),t(i,"dragleave",this._onDragLeave),t(i,"drop",this._onDrop),this.enablePointerEvents||t(i,"touchstart",this._onTouchStart,ho)}removeListeners(){this.addOrRemove(go);let t=this._getEventPrefix(),e=ne(this.upperCanvasEl);go(e,`${t}up`,this._onMouseUp),go(e,"touchend",this._onTouchEnd,ho),go(e,`${t}move`,this._onMouseMove,ho),go(e,"touchmove",this._onMouseMove,ho),clearTimeout(this._willAddMouseDown)}_onMouseWheel(t){this._cacheTransformEventData(t),this._handleEvent(t,"wheel"),this._resetTransformEventData()}_onMouseOut(t){let e=this._hoveredTarget,i={e:t,...co(this,t)};this.fire("mouse:out",{...i,target:e}),this._hoveredTarget=void 0,e&&e.fire("mouseout",{...i}),this._hoveredTargets.forEach(t=>{this.fire("mouse:out",{...i,target:t}),t&&t.fire("mouseout",{...i})}),this._hoveredTargets=[]}_onMouseEnter(t){let{target:e}=this.findTarget(t);this._currentTransform||e||(this.fire("mouse:over",{e:t,...co(this,t)}),this._hoveredTarget=void 0,this._hoveredTargets=[])}_onDragStart(t){this._isClick=!1;let e=this.getActiveObject();if(e&&e.onDragStart(t)){this._dragSource=e;let i={e:t,target:e};return this.fire("dragstart",i),e.fire("dragstart",i),void uo(this.upperCanvasEl,"drag",this._onDragProgress)}we(t)}_renderDragEffects(t,e,i){let r=!1,s=this._dropTarget;s&&s!==e&&s!==i&&(s.clearContextTop(),r=!0),null==e||e.clearContextTop(),i!==e&&(null==i||i.clearContextTop());let n=this.contextTop;n.save(),n.transform(...this.viewportTransform),e&&(n.save(),e.transform(n),e.renderDragSourceEffect(t),n.restore(),r=!0),i&&(n.save(),i.transform(n),i.renderDropTargetEffect(t),n.restore(),r=!0),n.restore(),r&&(this.contextTopDirty=!0)}_onDragEnd(t){let{currentSubTargets:e}=this.findTarget(t),i=!!t.dataTransfer&&"none"!==t.dataTransfer.dropEffect,r=i?this._activeObject:void 0,s={e:t,target:this._dragSource,subTargets:e,dragSource:this._dragSource,didDrop:i,dropTarget:r};go(this.upperCanvasEl,"drag",this._onDragProgress),this.fire("dragend",s),this._dragSource&&this._dragSource.fire("dragend",s),delete this._dragSource,this._onMouseUp(t)}_onDragProgress(t){let e={e:t,target:this._dragSource,dragSource:this._dragSource,dropTarget:this._draggedoverTarget};this.fire("drag",e),this._dragSource&&this._dragSource.fire("drag",e)}_onDragOver(t){let e,i="dragover",{currentContainer:r,currentSubTargets:s}=this.findTarget(t),n=this._dragSource,o={e:t,target:r,subTargets:s,dragSource:n,canDrop:!1,dropTarget:void 0};this.fire(i,o),this._fireEnterLeaveEvents(t,r,o),r&&(r.canDrop(t)&&(e=r),r.fire(i,o));for(let r=0;r<s.length;r++){let n=s[r];n.canDrop(t)&&(e=n),n.fire(i,o)}this._renderDragEffects(t,n,e),this._dropTarget=e}_onDragEnter(t){let{currentContainer:e,currentSubTargets:i}=this.findTarget(t),r={e:t,target:e,subTargets:i,dragSource:this._dragSource};this.fire("dragenter",r),this._fireEnterLeaveEvents(t,e,r)}_onDragLeave(t){let{currentSubTargets:e}=this.findTarget(t),i={e:t,target:this._draggedoverTarget,subTargets:e,dragSource:this._dragSource};this.fire("dragleave",i),this._fireEnterLeaveEvents(t,void 0,i),this._renderDragEffects(t,this._dragSource),this._dropTarget=void 0,this._hoveredTargets=[]}_onDrop(t){let{currentContainer:e,currentSubTargets:i}=this.findTarget(t),r=this._basicEventHandler("drop:before",{e:t,target:e,subTargets:i,dragSource:this._dragSource,...co(this,t)});r.didDrop=!1,r.dropTarget=void 0,this._basicEventHandler("drop",r),this.fire("drop:after",r)}_onContextMenu(t){let{target:e,subTargets:i}=this.findTarget(t),r=this._basicEventHandler("contextmenu:before",{e:t,target:e,subTargets:i});return this.stopContextMenu&&we(t),this._basicEventHandler("contextmenu",r),!1}_onClick(t){let e=t.detail;e>3||e<2||(this._cacheTransformEventData(t),2==e&&"dblclick"===t.type&&this._handleEvent(t,"dblclick"),3==e&&this._handleEvent(t,"tripleclick"),this._resetTransformEventData())}fireEventFromPointerEvent(t,e,i,r={}){this._cacheTransformEventData(t);let{target:s,subTargets:n}=this.findTarget(t),o={e:t,target:s,subTargets:n,...co(this,t),transform:this._currentTransform,...r};this.fire(e,o),s&&s.fire(i,o);for(let t=0;t<n.length;t++)n[t]!==s&&n[t].fire(i,o);this._resetTransformEventData()}getPointerId(t){let e=t.changedTouches;return e?e[0]&&e[0].identifier:this.enablePointerEvents?t.pointerId:-1}_isMainEvent(t){return!0===t.isPrimary||!1!==t.isPrimary&&("touchend"===t.type&&0===t.touches.length||!t.changedTouches||t.changedTouches[0].identifier===this.mainTouchId)}_onTouchStart(t){this._cacheTransformEventData(t);let e=!this.allowTouchScrolling,i=this._activeObject;void 0===this.mainTouchId&&(this.mainTouchId=this.getPointerId(t)),this.__onMouseDown(t);let{target:r}=this.findTarget(t);(this.isDrawingMode||i&&r===i)&&(e=!0),e&&t.preventDefault();let s=this.upperCanvasEl,n=this._getEventPrefix(),o=ne(s);uo(o,"touchend",this._onTouchEnd,ho),e&&uo(o,"touchmove",this._onMouseMove,ho),go(s,`${n}down`,this._onMouseDown),this._resetTransformEventData()}_onMouseDown(t){this._cacheTransformEventData(t),this.__onMouseDown(t);let e=this.upperCanvasEl,i=this._getEventPrefix();go(e,`${i}move`,this._onMouseMove,ho);let r=ne(e);uo(r,`${i}up`,this._onMouseUp),uo(r,`${i}move`,this._onMouseMove,ho),this._resetTransformEventData()}_onTouchEnd(t){if(t.touches.length>0)return;this._cacheTransformEventData(t),this.__onMouseUp(t),this._resetTransformEventData(),delete this.mainTouchId;let e=this._getEventPrefix(),i=ne(this.upperCanvasEl);go(i,"touchend",this._onTouchEnd,ho),go(i,"touchmove",this._onMouseMove,ho),this._willAddMouseDown&&clearTimeout(this._willAddMouseDown),this._willAddMouseDown=setTimeout(()=>{uo(this.upperCanvasEl,`${e}down`,this._onMouseDown),this._willAddMouseDown=0},400)}_onMouseUp(t){this._cacheTransformEventData(t),this.__onMouseUp(t);let e=this.upperCanvasEl,i=this._getEventPrefix();if(this._isMainEvent(t)){let t=ne(this.upperCanvasEl);go(t,`${i}up`,this._onMouseUp),go(t,`${i}move`,this._onMouseMove,ho),uo(e,`${i}move`,this._onMouseMove,ho)}this._resetTransformEventData()}_onMouseMove(t){this._cacheTransformEventData(t);let e=this.getActiveObject();!this.allowTouchScrolling&&(!e||!e.shouldStartDragging(t))&&t.preventDefault&&t.preventDefault(),this.__onMouseMove(t),this._resetTransformEventData()}_onResize(){this.calcOffset(),this._resetTransformEventData()}_shouldRender(t){let e=this.getActiveObject();return!!e!=!!t||e&&t&&e!==t}__onMouseUp(t){var e;this._handleEvent(t,"up:before");let i=this._currentTransform,r=this._isClick,{target:s}=this.findTarget(t),{button:n}=t;if(n)return void((this.fireMiddleClick&&1===n||this.fireRightClick&&2===n)&&this._handleEvent(t,"up"));if(this.isDrawingMode&&this._isCurrentlyDrawing)return void this._onMouseUpInDrawingMode(t);if(!this._isMainEvent(t))return;let o,a,l=!1;if(i&&(this._finalizeCurrentTransform(t),l=i.actionPerformed),!r){let e=s===this._activeObject;this.handleSelection(t),l||(l=this._shouldRender(s)||!e&&s===this._activeObject)}if(s){let{key:e,control:r}=s.findControl(this.getViewportPoint(t),Ce(t))||{};if(a=e,s.selectable&&s!==this._activeObject&&"up"===s.activeOn)this.setActiveObject(s,t),l=!0;else if(r){let e=r.getMouseUpHandler(t,s,r);e&&(o=this.getScenePoint(t),e.call(r,t,i,o.x,o.y))}s.isMoving=!1}if(i&&(i.target!==s||i.corner!==a)){let e=i.target&&i.target.controls[i.corner],r=e&&e.getMouseUpHandler(t,i.target,e);o=o||this.getScenePoint(t),r&&r.call(e,t,i,o.x,o.y)}this._setCursorFromEvent(t,s),this._handleEvent(t,"up"),this._groupSelector=null,this._currentTransform=null,s&&(s.__corner=void 0),l?this.requestRenderAll():r||null!=(e=this._activeObject)&&e.isEditing||this.renderTop()}_basicEventHandler(t,e){let{target:i,subTargets:r=[]}=e;this.fire(t,e),i&&i.fire(t,e);for(let s=0;s<r.length;s++)r[s]!==i&&r[s].fire(t,e);return e}_handleEvent(t,e,i){let{target:r,subTargets:s}=this.findTarget(t),n={e:t,target:r,subTargets:s,...co(this,t),transform:this._currentTransform,..."down:before"===e||"down"===e?i:{}};"up:before"!==e&&"up"!==e||(n.isClick=this._isClick),this.fire(`mouse:${e}`,n),r&&r.fire(`mouse${e}`,n);for(let t=0;t<s.length;t++)s[t]!==r&&s[t].fire(`mouse${e}`,n)}_onMouseDownInDrawingMode(t){this._isCurrentlyDrawing=!0,this.getActiveObject()&&(this.discardActiveObject(t),this.requestRenderAll());let e=this.getScenePoint(t);this.freeDrawingBrush&&this.freeDrawingBrush.onMouseDown(e,{e:t,pointer:e}),this._handleEvent(t,"down",{alreadySelected:!1})}_onMouseMoveInDrawingMode(t){if(this._isCurrentlyDrawing){let e=this.getScenePoint(t);this.freeDrawingBrush&&this.freeDrawingBrush.onMouseMove(e,{e:t,pointer:e})}this.setCursor(this.freeDrawingCursor),this._handleEvent(t,"move")}_onMouseUpInDrawingMode(t){let e=this.getScenePoint(t);this.freeDrawingBrush?this._isCurrentlyDrawing=!!this.freeDrawingBrush.onMouseUp({e:t,pointer:e}):this._isCurrentlyDrawing=!1,this._handleEvent(t,"up")}__onMouseDown(t){this._isClick=!0,this._handleEvent(t,"down:before");let{target:e}=this.findTarget(t),i=!!e&&e===this._activeObject,{button:r}=t;if(r)return void((this.fireMiddleClick&&1===r||this.fireRightClick&&2===r)&&this._handleEvent(t,"down",{alreadySelected:i}));if(this.isDrawingMode)return void this._onMouseDownInDrawingMode(t);if(!this._isMainEvent(t)||this._currentTransform)return;let s=this._shouldRender(e),n=!1;if(this.handleMultiSelection(t,e)?(e=this._activeObject,n=!0,s=!0):this._shouldClearSelection(t,e)&&this.discardActiveObject(t),this.selection&&(!e||!e.selectable&&!e.isEditing&&e!==this._activeObject)){let e=this.getScenePoint(t);this._groupSelector={x:e.x,y:e.y,deltaY:0,deltaX:0}}if(i=!!e&&e===this._activeObject,e){e.selectable&&"down"===e.activeOn&&this.setActiveObject(e,t);let r=e.findControl(this.getViewportPoint(t),Ce(t));if(e===this._activeObject&&(r||!n)){this._setupCurrentTransform(t,e,i);let s=r?r.control:void 0,n=this.getScenePoint(t),o=s&&s.getMouseDownHandler(t,e,s);o&&o.call(s,t,this._currentTransform,n.x,n.y)}}s&&(this._objectsToRender=void 0),this._handleEvent(t,"down",{alreadySelected:i}),s&&this.requestRenderAll()}_resetTransformEventData(){this._targetInfo=this._viewportPoint=this._scenePoint=void 0}_cacheTransformEventData(t){this._resetTransformEventData(),this._viewportPoint=this.getViewportPoint(t),this._scenePoint=Pe(this._viewportPoint,void 0,this.viewportTransform),this._targetInfo=this.findTarget(t),this._currentTransform&&(this._targetInfo.target=this._currentTransform.target)}__onMouseMove(t){if(this._isClick=!1,this._handleEvent(t,"move:before"),this.isDrawingMode)return void this._onMouseMoveInDrawingMode(t);if(!this._isMainEvent(t))return;let e=this._groupSelector;if(e){let i=this.getScenePoint(t);e.deltaX=i.x-e.x,e.deltaY=i.y-e.y,this.renderTop()}else if(this._currentTransform)this._transformObject(t);else{let{target:e}=this.findTarget(t);this._setCursorFromEvent(t,e),this._fireOverOutEvents(t,e)}this.textEditingManager.onMouseMove(t),this._handleEvent(t,"move")}_fireOverOutEvents(t,e){let{_hoveredTarget:i,_hoveredTargets:r}=this,{subTargets:s,currentTarget:n}=this.findTarget(t),o=Math.max(r.length,s.length);this.fireSyntheticInOutEvents("mouse",{e:t,target:e,oldTarget:i,actualTarget:n,oldActualTarget:this._hoveredActualTarget,fireCanvas:!0});for(let n=0;n<o;n++)s[n]===e||r[n]&&r[n]===i||this.fireSyntheticInOutEvents("mouse",{e:t,target:s[n],oldTarget:r[n]});this._hoveredActualTarget=n,this._hoveredTarget=e,this._hoveredTargets=s}_fireEnterLeaveEvents(t,e,i){let r=this._draggedoverTarget,s=this._hoveredTargets,{subTargets:n}=this.findTarget(t),o=Math.max(s.length,n.length);this.fireSyntheticInOutEvents("drag",{...i,target:e,oldTarget:r,fireCanvas:!0});for(let t=0;t<o;t++)this.fireSyntheticInOutEvents("drag",{...i,target:n[t],oldTarget:s[t]});this._draggedoverTarget=e}fireSyntheticInOutEvents(t,{target:e,oldTarget:i,actualTarget:r,oldActualTarget:s,fireCanvas:n,e:o,...a}){let{targetIn:l,targetOut:h,canvasIn:c,canvasOut:u}=fo[t],d=i!==e,g=s!==r,f=e&&d,p=r&&g,m=i&&d,y=s&&g,b={...a,e:o,...co(this,o)},_={...b,target:i,nextTarget:e,actualTarget:s,nextActualTarget:r};(m||y)&&n&&this.fire(u,_),m&&i.fire(h,_),y&&i!==s&&s.fire(h,_);let v={...b,target:e,previousTarget:i,actualTarget:r,previousActualTarget:s};(f||p)&&n&&this.fire(c,v),f&&e.fire(l,v),p&&r!==e&&r.fire(l,v)}_transformObject(t){let e=this.getScenePoint(t),i=this._currentTransform,r=i.target,s=r.group?Pe(e,void 0,r.group.calcTransformMatrix()):e;i.shiftKey=t.shiftKey,i.altKey=!!this.centeredKey&&t[this.centeredKey],this._performTransformAction(t,i,s),i.actionPerformed&&this.requestRenderAll()}_performTransformAction(t,e,i){let{action:r,actionHandler:s,target:n}=e,o=!!s&&s(t,e,i.x,i.y);o&&n.setCoords(),"drag"===r&&o&&(e.target.isMoving=!0,this.setCursor(e.target.moveCursor||this.moveCursor)),e.actionPerformed=e.actionPerformed||o}_setCursorFromEvent(t,e){if(!e)return void this.setCursor(this.defaultCursor);let i=e.hoverCursor||this.hoverCursor,r=re(this._activeObject)?this._activeObject:null,s=(!r||e.group!==r)&&e.findControl(this.getViewportPoint(t));if(s){let{control:i,coord:r}=s;this.setCursor(i.cursorStyleHandler(t,i,e,r))}else{if(e.subTargetCheck){let{subTargets:e}=this.findTarget(t);e.concat().reverse().forEach(t=>{i=t.hoverCursor||i})}this.setCursor(i)}}handleMultiSelection(t,e){let i=this._activeObject,r=re(i);if(i&&this._isSelectionKeyPressed(t)&&this.selection&&e&&e.selectable&&(i!==e||r)&&(r||!e.isDescendantOf(i)&&!i.isDescendantOf(e))&&!e.onSelect({e:t})&&!i.getActiveControl()){if(r){let r=i.getObjects(),s=[];if(e===i){let i=this.getScenePoint(t),n=this.searchPossibleTargets(r,i);if(n.target?(e=n.target,s=n.subTargets):(n=this.searchPossibleTargets(this._objects,i),e=n.target,s=n.subTargets),!e||!e.selectable)return!1}e.group===i?(i.remove(e),this._hoveredTarget=e,this._hoveredTargets=s,1===i.size()&&this._setActiveObject(i.item(0),t)):(i.multiSelectAdd(e),this._hoveredTarget=i,this._hoveredTargets=s),this._fireSelectionEvents(r,t)}else{i.isEditing&&i.exitEditing();let r=new(at.getClass("ActiveSelection"))([],{canvas:this});r.multiSelectAdd(i,e),this._hoveredTarget=r,this._setActiveObject(r,t),this._fireSelectionEvents([i],t)}return!0}return!1}handleSelection(t){if(!this.selection||!this._groupSelector)return!1;let{x:e,y:i,deltaX:r,deltaY:s}=this._groupSelector,n=new gt(e,i),o=n.add(new gt(r,s)),a=n.min(o),l=n.max(o).subtract(a),h=this.collectObjects({left:a.x,top:a.y,width:l.x,height:l.y},{includeIntersecting:!this.selectionFullyContained}),c=n.eq(o)?h[0]?[h[0]]:[]:h.length>1?h.filter(e=>!e.onSelect({e:t})).reverse():h;if(1===c.length)this.setActiveObject(c[0],t);else if(c.length>1){let e=at.getClass("ActiveSelection");this.setActiveObject(new e(c,{canvas:this}),t)}return this._groupSelector=null,!0}toCanvasElement(t=1,e){let{upper:i}=this.elements;i.ctx=void 0;let r=super.toCanvasElement(t,e);return i.ctx=i.el.getContext("2d"),r}clear(){this.textEditingManager.clear(),super.clear()}destroy(){this.removeListeners(),this.textEditingManager.dispose(),super.destroy()}};const mo={x1:0,y1:0,x2:0,y2:0},yo={...mo,r1:0,r2:0},bo=(t,e)=>isNaN(t)&&"number"==typeof e?e:t;function _o(t){return t&&/%$/.test(t)&&Number.isFinite(parseFloat(t))}function vo(t,e){return Bi(0,bo("number"==typeof t?t:"string"==typeof t?parseFloat(t)/(_o(t)?100:1):NaN,e),1)}const xo=/\s*;\s*/,Co=/\s*:\s*/;function wo(t,e){let i,r,s=t.getAttribute("style");if(s){let t=s.split(xo);""===t[t.length-1]&&t.pop();for(let e=t.length;e--;){let[s,n]=t[e].split(Co).map(t=>t.trim());"stop-color"===s?i=n:"stop-opacity"===s&&(r=n)}}i=i||t.getAttribute("stop-color")||"rgb(0,0,0)",r=bo(parseFloat(r||t.getAttribute("stop-opacity")||""),1);let n=new gi(i);return n.setAlpha(n.getAlpha()*r*e),{offset:vo(t.getAttribute("offset"),0),color:n.toRgba()}}function So(t,e){let i=[],r=t.getElementsByTagName("stop"),s=vo(e,1);for(let t=r.length;t--;)i.push(wo(r[t],s));return i}function To(t){return"linearGradient"===t.nodeName||"LINEARGRADIENT"===t.nodeName?"linear":"radial"}function Oo(t){return"userSpaceOnUse"===t.getAttribute("gradientUnits")?"pixels":"percentage"}function ko(t,e){return t.getAttribute(e)}function Do(t,e){return function(t,{width:e,height:i,gradientUnits:r}){let s;return Object.entries(t).reduce((t,[n,o])=>{if("Infinity"===o)s=1;else if("-Infinity"===o)s=0;else{let t="string"==typeof o;s=t?parseFloat(o):o,t&&_o(o)&&(s*=.01,"pixels"===r&&("x1"!==n&&"x2"!==n&&"r2"!==n||(s*=e),"y1"!==n&&"y2"!==n||(s*=i)))}return t[n]=s,t},{})}("linear"===To(t)?function(t){return{x1:ko(t,"x1")||0,y1:ko(t,"y1")||0,x2:ko(t,"x2")||"100%",y2:ko(t,"y2")||0}}(t):function(t){return{x1:ko(t,"fx")||ko(t,"cx")||"50%",y1:ko(t,"fy")||ko(t,"cy")||"50%",r1:0,x2:ko(t,"cx")||"50%",y2:ko(t,"cy")||"50%",r2:ko(t,"r")||"50%"}}(t),{...e,gradientUnits:Oo(t)})}var Mo=class{constructor(t){let{type:e="linear",gradientUnits:i="pixels",coords:r={},colorStops:s=[],offsetX:n=0,offsetY:o=0,gradientTransform:a,id:l}=t||{};Object.assign(this,{type:e,gradientUnits:i,coords:{..."radial"===e?yo:mo,...r},colorStops:s,offsetX:n,offsetY:o,gradientTransform:a,id:l?`${l}_${xt()}`:xt()})}addColorStop(t){for(let e in t)this.colorStops.push({offset:parseFloat(e),color:t[e]});return this}toObject(t){return{...Kt(this,t),type:this.type,coords:{...this.coords},colorStops:this.colorStops.map(t=>({...t})),offsetX:this.offsetX,offsetY:this.offsetY,gradientUnits:this.gradientUnits,gradientTransform:this.gradientTransform?[...this.gradientTransform]:void 0}}toSVG(t,{additionalTransform:e}={}){let i=[],r=this.gradientTransform?this.gradientTransform.concat():I.concat(),s="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox",n=this.colorStops.map(t=>({...t})).sort((t,e)=>t.offset-e.offset),o=-this.offsetX,a=-this.offsetY;var l;"objectBoundingBox"===s?(o/=t.width,a/=t.height):(o+=t.width/2,a+=t.height/2),(l=t)&&"function"==typeof l._renderPathCommands&&"percentage"!==this.gradientUnits&&(o-=t.pathOffset.x,a-=t.pathOffset.y),r[4]-=o,r[5]-=a;let h=[`id="SVGID_${fe(String(this.id))}"`,`gradientUnits="${s}"`,`gradientTransform="${e?e+" ":""}${Zt(r)}"`,""].join(" "),c=t=>parseFloat(String(t));if("linear"===this.type){let{x1:t,y1:e,x2:r,y2:s}=this.coords,n=c(t),o=c(e),a=c(r),l=c(s);i.push("<linearGradient ",h,' x1="',n,'" y1="',o,'" x2="',a,'" y2="',l,'">\n')}else if("radial"===this.type){let{x1:t,y1:e,x2:r,y2:s,r1:o,r2:a}=this.coords,l=c(t),u=c(e),d=c(r),g=c(s),f=c(o),p=c(a),m=f>p;i.push("<radialGradient ",h,' cx="',m?l:d,'" cy="',m?u:g,'" r="',m?f:p,'" fx="',m?d:l,'" fy="',m?g:u,'">\n'),m&&(n.reverse(),n.forEach(t=>{t.offset=1-t.offset}));let y=Math.min(f,p);if(y>0){let t=y/Math.max(f,p);n.forEach(e=>{e.offset+=t*(1-e.offset)})}}return n.forEach(({color:t,offset:e})=>{let r=String(t),s=ri(r)?r:new gi(r).toRgba();i.push(`<stop offset="${100*e}%" style="stop-color:${fe(s)};"/>\n`)}),i.push("linear"===this.type?"</linearGradient>":"</radialGradient>","\n"),i.join("")}toLive(t){let{x1:e,y1:i,x2:r,y2:s,r1:n,r2:o}=this.coords,a="linear"===this.type?t.createLinearGradient(e,i,r,s):t.createRadialGradient(e,i,n,r,s,o);return this.colorStops.forEach(({color:t,offset:e})=>{a.addColorStop(e,t)}),a}static async fromObject(t){let{colorStops:e,gradientTransform:i}=t;return new this({...t,colorStops:e?e.map(t=>({...t})):void 0,gradientTransform:i?[...i]:void 0})}static fromElement(t,e,i){let r=Oo(t),s=e._findCenterFromElement();return new this({id:t.getAttribute("id")||void 0,type:To(t),coords:Do(t,{width:i.viewBoxWidth||i.width,height:i.viewBoxHeight||i.height}),colorStops:So(t,i.opacity),gradientUnits:r,gradientTransform:Hs(t.getAttribute("gradientTransform")||""),..."pixels"===r?{offsetX:e.width/2-s.x,offsetY:e.height/2-s.y}:{offsetX:0,offsetY:0}})}};p(Mo,"type","Gradient"),at.setClass(Mo,"gradient"),at.setClass(Mo,"linear"),at.setClass(Mo,"radial");var jo=class{get type(){return"pattern"}set type(t){b("warn","Setting type has no effect",t)}constructor(t){p(this,"repeat","repeat"),p(this,"offsetX",0),p(this,"offsetY",0),p(this,"crossOrigin",""),this.id=xt(),Object.assign(this,t)}isImageSource(){return!!this.source&&"string"==typeof this.source.src}isCanvasSource(){return!!this.source&&!!this.source.toDataURL}sourceToString(){return this.isImageSource()?this.source.src:this.isCanvasSource()?this.source.toDataURL():""}toLive(t){return this.source&&(!this.isImageSource()||this.source.complete&&0!==this.source.naturalWidth&&0!==this.source.naturalHeight)?t.createPattern(this.source,this.repeat):null}toObject(t=[]){let{repeat:e,crossOrigin:i}=this;return{...Kt(this,t),type:"pattern",source:this.sourceToString(),repeat:e,crossOrigin:i,offsetX:Qt(this.offsetX,y.NUM_FRACTION_DIGITS),offsetY:Qt(this.offsetY,y.NUM_FRACTION_DIGITS),patternTransform:this.patternTransform?[...this.patternTransform]:null}}toSVG({width:t,height:e}){let{source:i,repeat:r,id:s}=this,n=bo(this.offsetX/t,0),o=bo(this.offsetY/e,0),a="repeat-y"===r||"no-repeat"===r?1+Math.abs(n||0):bo(i.width/t,0),l="repeat-x"===r||"no-repeat"===r?1+Math.abs(o||0):bo(i.height/e,0);return[`<pattern id="SVGID_${fe(s)}" x="${n}" y="${o}" width="${a}" height="${l}">`,`<image x="0" y="0" width="${i.width}" height="${i.height}" xlink:href="${fe(this.sourceToString())}"></image>`,"</pattern>",""].join("\n")}static async fromObject({type:t,source:e,patternTransform:i,...r},s){let n=await Gt(e,{...s,crossOrigin:r.crossOrigin});return new this({...r,patternTransform:i&&i.slice(0),source:n})}};p(jo,"type","Pattern"),at.setClass(jo),at.setClass(jo,"pattern");var Eo=class t extends ys{constructor(e,{path:i,left:r,top:s,...n}={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(n),this._setPath(e||[],!0),"number"==typeof r&&this.set("left",r),"number"==typeof s&&this.set("top",s)}_setPath(t,e){this.path=xn(Array.isArray(t)?t:Rn(t)),this.setBoundingBox(e)}_findCenterFromElement(){let t=this._calcBoundsFromPath();return new gt(t.left+t.width/2,t.top+t.height/2)}_renderPathCommands(t){let e=-this.pathOffset.x,i=-this.pathOffset.y;t.beginPath();for(let r of this.path)switch(r[0]){case"L":t.lineTo(r[1]+e,r[2]+i);break;case"M":t.moveTo(r[1]+e,r[2]+i);break;case"C":t.bezierCurveTo(r[1]+e,r[2]+i,r[3]+e,r[4]+i,r[5]+e,r[6]+i);break;case"Q":t.quadraticCurveTo(r[1]+e,r[2]+i,r[3]+e,r[4]+i);break;case"Z":t.closePath()}}_render(t){this._renderPathCommands(t),this._renderPaintInOrder(t)}toString(){return`#<Path (${this.complexity()}): { "top": ${this.top}, "left": ${this.left} }>`}toObject(t=[]){return{...super.toObject(t),path:this.path.map(t=>t.slice())}}toDatalessObject(t=[]){let e=this.toObject(t);return this.sourcePath&&(delete e.path,e.sourcePath=this.sourcePath),e}_toSVG(){return["<path ","COMMON_PARTS",`d="${Yn(this.path,y.NUM_FRACTION_DIGITS)}" stroke-linecap="round" />\n`]}_getOffsetTransform(){let t=y.NUM_FRACTION_DIGITS;return` translate(${Qt(-this.pathOffset.x,t)}, ${Qt(-this.pathOffset.y,t)})`}toClipPathSVG(t){let e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}toSVG(t){let e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}complexity(){return this.path.length}setDimensions(){this.setBoundingBox()}setBoundingBox(t){let{width:e,height:i,pathOffset:r}=this._calcDimensions();this.set({width:e,height:i,pathOffset:r}),t&&this.setPositionByOrigin(r,"center","center")}_calcBoundsFromPath(){let t=[],e=0,i=0,r=0,s=0;for(let n of this.path)switch(n[0]){case"L":r=n[1],s=n[2],t.push({x:e,y:i},{x:r,y:s});break;case"M":r=n[1],s=n[2],e=r,i=s;break;case"C":t.push(...bn(r,s,n[1],n[2],n[3],n[4],n[5],n[6])),r=n[5],s=n[6];break;case"Q":t.push(...bn(r,s,n[1],n[2],n[1],n[2],n[3],n[4])),r=n[3],s=n[4];break;case"Z":r=e,s=i}return Se(t)}_calcDimensions(){let t=this._calcBoundsFromPath();return{...t,pathOffset:new gt(t.left+t.width/2,t.top+t.height/2)}}static fromObject(t){return this._fromObject(t,{extraParam:"path"})}static async fromElement(t,e,i){let{d:r,...s}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this(r,{...s,...e,left:void 0,top:void 0})}};p(Eo,"type","Path"),p(Eo,"cacheProperties",[...Xi,"path","fillRule"]),p(Eo,"ATTRIBUTE_NAMES",[...Ds,"d"]),at.setClass(Eo),at.setSVGClass(Eo);const Po=["radius","startAngle","endAngle","counterClockwise"];var Ao=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_set(t,e){return super._set(t,e),"radius"===t&&this.setRadius(e),this}_render(t){t.beginPath(),t.arc(0,0,this.radius,Dt(this.startAngle),Dt(this.endAngle),this.counterClockwise),this._renderPaintInOrder(t)}getRadiusX(){return this.get("radius")*this.get(Q)}getRadiusY(){return this.get("radius")*this.get(Z)}setRadius(t){this.radius=t,this.set({width:2*t,height:2*t})}toObject(t=[]){return super.toObject([...Po,...t])}_toSVG(){let{radius:t,startAngle:e,endAngle:i}=this,r=(i-e)%360;if(0===r)return["<circle ","COMMON_PARTS",'cx="0" cy="0" ','r="',`${fe(t)}`,'" />\n'];{let s=Dt(e),n=Dt(i),o=ut(s)*t,a=dt(s)*t,l=ut(n)*t,h=dt(n)*t;return[`<path d="M ${o} ${a} A ${t} ${t} 0 ${+(r>180)} ${+!this.counterClockwise} ${l} ${h}" `,"COMMON_PARTS"," />\n"]}}static async fromElement(t,e,i){let{left:r=0,top:s=0,radius:n=0,...o}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this({...o,radius:n,left:r-n,top:s-n})}static fromObject(t){return super._fromObject(t)}};p(Ao,"type","Circle"),p(Ao,"cacheProperties",[...Xi,...Po]),p(Ao,"ownDefaults",{radius:0,startAngle:0,endAngle:360,counterClockwise:!1}),p(Ao,"ATTRIBUTE_NAMES",["cx","cy","r",...Ds]),at.setClass(Ao),at.setSVGClass(Ao);const Fo=["x1","x2","y1","y2"];var Lo=class t extends ys{constructor([e,i,r,s]=[0,0,0,0],n={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(n),this.x1=e,this.x2=r,this.y1=i,this.y2=s,this._setWidthHeight();let{left:o,top:a}=n;"number"==typeof o&&this.set("left",o),"number"==typeof a&&this.set("top",a)}_setWidthHeight(){let{x1:t,y1:e,x2:i,y2:r}=this;this.width=Math.abs(i-t),this.height=Math.abs(r-e);let{left:s,top:n,width:o,height:a}=Se([{x:t,y:e},{x:i,y:r}]),l=new gt(s+o/2,n+a/2);this.setPositionByOrigin(l,R,R)}_set(t,e){return super._set(t,e),Fo.includes(t)&&this._setWidthHeight(),this}_render(t){t.beginPath();let e=this.calcLinePoints();t.moveTo(e.x1,e.y1),t.lineTo(e.x2,e.y2),t.lineWidth=this.strokeWidth;let i=t.strokeStyle;var r;te(this.stroke)?t.strokeStyle=this.stroke.toLive(t):t.strokeStyle=null==(r=this.stroke)?t.fillStyle:r,this.stroke&&this._renderStroke(t),t.strokeStyle=i}_findCenterFromElement(){return new gt((this.x1+this.x2)/2,(this.y1+this.y2)/2)}toObject(t=[]){return{...super.toObject(t),...this.calcLinePoints()}}_getNonTransformedDimensions(){let t=super._getNonTransformedDimensions();return"butt"===this.strokeLineCap&&(0===this.width&&(t.y-=this.strokeWidth),0===this.height&&(t.x-=this.strokeWidth)),t}calcLinePoints(){let{x1:t,x2:e,y1:i,y2:r,width:s,height:n}=this,o=t<=e?-.5:.5,a=i<=r?-.5:.5;return{x1:o*s,x2:o*-s,y1:a*n,y2:a*-n}}_toSVG(){let{x1:t,x2:e,y1:i,y2:r}=this.calcLinePoints();return["<line ","COMMON_PARTS",`x1="${t}" y1="${i}" x2="${e}" y2="${r}" />\n`]}static async fromElement(t,e,i){let{x1:r=0,y1:s=0,x2:n=0,y2:o=0,...a}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this([r,s,n,o],a)}static fromObject({x1:t,y1:e,x2:i,y2:r,...s}){return this._fromObject({...s,points:[t,e,i,r]},{extraParam:"points"})}};p(Lo,"type","Line"),p(Lo,"cacheProperties",[...Xi,...Fo]),p(Lo,"ATTRIBUTE_NAMES",Ds.concat(Fo)),at.setClass(Lo),at.setSVGClass(Lo);var Io=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_render(t){let e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderPaintInOrder(t)}_toSVG(){let t=this.width/2,e=this.height/2;return["<polygon ","COMMON_PARTS",'points="',`${-t} ${e},0 ${-e},${t} ${e}`,'" />']}};p(Io,"type","Triangle"),p(Io,"ownDefaults",{width:100,height:100}),at.setClass(Io),at.setSVGClass(Io);const Ro=["rx","ry"];var Bo=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_set(t,e){switch(super._set(t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this}getRx(){return this.get("rx")*this.get(Q)}getRy(){return this.get("ry")*this.get(Z)}toObject(t=[]){return super.toObject([...Ro,...t])}_toSVG(){return["<ellipse ","COMMON_PARTS",`cx="0" cy="0" rx="${fe(this.rx)}" ry="${fe(this.ry)}" />\n`]}_render(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,F,!1),t.restore(),this._renderPaintInOrder(t)}static async fromElement(t,e,i){let r=Ks(t,this.ATTRIBUTE_NAMES,i);return r.left=(r.left||0)-r.rx,r.top=(r.top||0)-r.ry,new this(r)}};p(Bo,"type","Ellipse"),p(Bo,"cacheProperties",[...Xi,...Ro]),p(Bo,"ownDefaults",{rx:0,ry:0}),p(Bo,"ATTRIBUTE_NAMES",[...Ds,"cx","cy","rx","ry"]),at.setClass(Bo),at.setSVGClass(Bo);const $o={exactBoundingBox:!1};var Xo=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),p(this,"strokeDiff",void 0),Object.assign(this,t.ownDefaults),this.setOptions(i),this.points=e;let{left:r,top:s}=i;this.initialized=!0,this.setBoundingBox(!0),"number"==typeof r&&this.set("left",r),"number"==typeof s&&this.set("top",s)}isOpen(){return!0}_projectStrokeOnPoints(t){return ws(this.points,t,this.isOpen())}_calcDimensions(t){t={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:this.strokeMiterLimit,strokeUniform:this.strokeUniform,strokeWidth:this.strokeWidth,...t||{}};let e=this.exactBoundingBox?this._projectStrokeOnPoints(t).map(t=>t.projectedPoint):this.points;if(0===e.length)return{left:0,top:0,width:0,height:0,pathOffset:new gt,strokeOffset:new gt,strokeDiff:new gt};let i=Se(e),r=zt({...t,scaleX:1,scaleY:1}),s=Se(this.points.map(t=>Et(t,r,!0))),n=new gt(this.scaleX,this.scaleY),o=i.left+i.width/2,a=i.top+i.height/2;return this.exactBoundingBox&&(o-=a*Math.tan(Dt(this.skewX)),a-=o*Math.tan(Dt(this.skewY))),{...i,pathOffset:new gt(o,a),strokeOffset:new gt(s.left,s.top).subtract(new gt(i.left,i.top)).multiply(n),strokeDiff:new gt(i.width,i.height).subtract(new gt(s.width,s.height)).multiply(n)}}_findCenterFromElement(){let t=Se(this.points);return new gt(t.left+t.width/2,t.top+t.height/2)}setDimensions(){this.setBoundingBox()}setBoundingBox(t){let{left:e,top:i,width:r,height:s,pathOffset:n,strokeOffset:o,strokeDiff:a}=this._calcDimensions();this.set({width:r,height:s,pathOffset:n,strokeOffset:o,strokeDiff:a}),t&&this.setPositionByOrigin(new gt(e+r/2,i+s/2),"center","center")}isStrokeAccountedForInDimensions(){return this.exactBoundingBox}_getNonTransformedDimensions(){return this.exactBoundingBox?new gt(this.width,this.height):super._getNonTransformedDimensions()}_getTransformedDimensions(t={}){if(this.exactBoundingBox){let n;if(Object.keys(t).some(t=>this.strokeUniform||this.constructor.layoutProperties.includes(t))){var e,i;let{width:r,height:s}=this._calcDimensions(t);n=new gt(null==(e=t.width)?r:e,null==(i=t.height)?s:i)}else{var r,s;n=new gt(null==(r=t.width)?this.width:r,null==(s=t.height)?this.height:s)}return n.multiply(new gt(t.scaleX||this.scaleX,t.scaleY||this.scaleY))}return super._getTransformedDimensions(t)}_set(t,e){let i=this.initialized&&this[t]!==e,r=super._set(t,e);return this.exactBoundingBox&&i&&(("scaleX"===t||"scaleY"===t)&&this.strokeUniform&&this.constructor.layoutProperties.includes("strokeUniform")||this.constructor.layoutProperties.includes(t))&&this.setDimensions(),r}toObject(t=[]){return{...super.toObject(t),points:this.points.map(({x:t,y:e})=>({x:t,y:e}))}}_toSVG(){let t=this.pathOffset.x,e=this.pathOffset.y,i=y.NUM_FRACTION_DIGITS,r=this.points.map(({x:r,y:s})=>`${Qt(r-t,i)},${Qt(s-e,i)}`).join(" ");return[`<${fe(this.constructor.type).toLowerCase()} `,"COMMON_PARTS",`points="${r}" />\n`]}_render(t){let e=this.points.length,i=this.pathOffset.x,r=this.pathOffset.y;if(e&&!isNaN(this.points[e-1].y)){t.beginPath(),t.moveTo(this.points[0].x-i,this.points[0].y-r);for(let s=0;s<e;s++){let e=this.points[s];t.lineTo(e.x-i,e.y-r)}!this.isOpen()&&t.closePath(),this._renderPaintInOrder(t)}}complexity(){return this.points.length}static async fromElement(t,e,i){let r=function(t){if(!t)return[];let e=t.replace(/,/g," ").trim().split(/\s+/),i=[];for(let t=0;t<e.length;t+=2)i.push({x:parseFloat(e[t]),y:parseFloat(e[t+1])});return i}(t.getAttribute("points")),{left:s,top:n,...o}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this(r,{...o,...e})}static fromObject(t){return this._fromObject(t,{extraParam:"points"})}};p(Xo,"ownDefaults",$o),p(Xo,"type","Polyline"),p(Xo,"layoutProperties",[tt,et,"strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeWidth","strokeUniform","points"]),p(Xo,"cacheProperties",[...Xi,"points"]),p(Xo,"ATTRIBUTE_NAMES",[...Ds]),at.setClass(Xo),at.setSVGClass(Xo);var Yo=class extends Xo{isOpen(){return!1}};p(Yo,"ownDefaults",$o),p(Yo,"type","Polygon"),at.setClass(Yo),at.setSVGClass(Yo);var Wo=class extends ys{isEmptyStyles(t){if(!this.styles||void 0!==t&&!this.styles[t])return!0;let e=void 0===t?this.styles:{line:this.styles[t]};for(let t in e)for(let i in e[t])for(let r in e[t][i])return!1;return!0}styleHas(t,e){if(!this.styles||void 0!==e&&!this.styles[e])return!1;let i=void 0===e?this.styles:{0:this.styles[e]};for(let e in i)for(let r in i[e])if(void 0!==i[e][r][t])return!0;return!1}cleanStyle(t){if(!this.styles)return!1;let e,i,r=this.styles,s=0,n=!0,o=0;for(let o in r){e=0;for(let a in r[o]){let l=r[o][a]||{};s++,void 0===l[t]?n=!1:(i?l[t]!==i&&(n=!1):i=l[t],l[t]===this[t]&&delete l[t]),0===Object.keys(l).length?delete r[o][a]:e++}0===e&&delete r[o]}for(let t=0;t<this._textLines.length;t++)o+=this._textLines[t].length;n&&s===o&&(this[t]=i,this.removeStyle(t))}removeStyle(t){if(!this.styles)return;let e,i,r,s=this.styles;for(i in s){for(r in e=s[i],e)delete e[r][t],0===Object.keys(e[r]).length&&delete e[r];0===Object.keys(e).length&&delete s[i]}}_extendStyles(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t);this._getLineStyle(i)||this._setLineStyle(i);let s=Jt({...this._getStyleDeclaration(i,r),...e},t=>void 0!==t);this._setStyleDeclaration(i,r,s)}getSelectionStyles(t,e,i){let r=[];for(let s=t;s<(e||t);s++)r.push(this.getStyleAtPosition(s,i));return r}getStyleAtPosition(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t);return e?this.getCompleteStyleDeclaration(i,r):this._getStyleDeclaration(i,r)}setSelectionStyles(t,e,i){for(let r=e;r<(i||e);r++)this._extendStyles(r,t);this._forceClearCache=!0}_getStyleDeclaration(t,e){var i;let r=this.styles&&this.styles[t];return r&&null!=(i=r[e])?i:{}}getCompleteStyleDeclaration(t,e){return{...Kt(this,this.constructor._styleProperties),...this._getStyleDeclaration(t,e)}}_setStyleDeclaration(t,e,i){this.styles[t][e]=i}_deleteStyleDeclaration(t,e){delete this.styles[t][e]}_getLineStyle(t){return!!this.styles[t]}_setLineStyle(t){this.styles[t]={}}_deleteLineStyle(t){delete this.styles[t]}};p(Wo,"_styleProperties",Ti);const No=/  +/g,Vo=/"/g;function zo(t,e,i,r,s){return`\t\t${((t,{left:e,top:i,width:r,height:s},n=y.NUM_FRACTION_DIGITS)=>{let o=yi(it,t,!1),[a,l,h,c]=[e,i,r,s].map(t=>Qt(t,n));return`<rect ${o} x="${a}" y="${l}" width="${h}" height="${c}"></rect>`})(t,{left:e,top:i,width:r,height:s})}\n`}let Ho;var Go=class t extends Wo{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(),p(this,"__charBounds",[]),Object.assign(this,t.ownDefaults),this.setOptions(i),this.styles||(this.styles={}),this.text=e,this.initialized=!0,this.path&&this.setPathInfo(),this.initDimensions(),this.setCoords()}setPathInfo(){let t=this.path;t&&(t.segmentsInfo=En(t.path))}_splitText(){let t=this._splitTextIntoLines(this.text);return this.textLines=t.lines,this._textLines=t.graphemeLines,this._unwrappedTextLines=t._unwrappedLines,this._text=t.graphemeText,t}initDimensions(){this._splitText(),this._clearCache(),this.dirty=!0,this.path?(this.width=this.path.width,this.height=this.path.height):(this.width=this.calcTextWidth()||this.cursorWidth||this.MIN_TEXT_WIDTH,this.height=this.calcTextHeight()),this.textAlign.includes("justify")&&this.enlargeSpaces()}enlargeSpaces(){let t,e,i,r,s,n,o;for(let a=0,l=this._textLines.length;a<l;a++)if(("justify"===this.textAlign||a!==l-1&&!this.isEndOfWrapping(a))&&(r=0,s=this._textLines[a],e=this.getLineWidth(a),e<this.width&&(o=this.textLines[a].match(this._reSpacesAndTabs)))){i=o.length,t=(this.width-e)/i;for(let e=0;e<=s.length;e++)n=this.__charBounds[a][e],this._reSpaceAndTab.test(s[e])?(n.width+=t,n.kernedWidth+=t,n.left+=r,r+=t):n.left+=r}}isEndOfWrapping(t){return t===this._textLines.length-1}missingNewlineOffset(t){return 1}get2DCursorLocation(t,e){let i,r=e?this._unwrappedTextLines:this._textLines;for(i=0;i<r.length;i++){if(t<=r[i].length)return{lineIndex:i,charIndex:t};t-=r[i].length+this.missingNewlineOffset(i,e)}return{lineIndex:i-1,charIndex:r[i-1].length<t?r[i-1].length:t}}toString(){return`#<Text (${this.complexity()}): { "text": "${this.text}", "fontFamily": "${this.fontFamily}" }>`}_getCacheCanvasDimensions(){let t=super._getCacheCanvasDimensions(),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t}_render(t){let e=this.path;e&&!e.isNotVisible()&&e._render(t),this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")}_renderText(t){"stroke"===this.paintFirst?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))}_setTextStyles(t,e,i){if(t.textBaseline="alphabetic",this.path)switch(this.pathAlign){case R:t.textBaseline="middle";break;case"ascender":t.textBaseline="top";break;case"descender":t.textBaseline=$}t.font=this._getFontDeclaration(e,i)}calcTextWidth(){let t=this.getLineWidth(0);for(let e=1,i=this._textLines.length;e<i;e++){let i=this.getLineWidth(e);i>t&&(t=i)}return t}_renderTextLine(t,e,i,r,s,n){this._renderChars(t,e,i,r,s,n)}_renderTextLinesBackground(t){if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor"))return;let e=t.fillStyle,i=this._getLeftOffset(),r=this._getTopOffset();for(let e=0,s=this._textLines.length;e<s;e++){let s=this.getHeightOfLine(e);if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor",e)){r+=s;continue}let n,o,a=this._textLines[e].length,l=this._getLineLeftOffset(e),h=0,c=0,u=this.getValueOfPropertyAt(e,0,"textBackgroundColor"),d=this.getHeightOfLineImpl(e);for(let s=0;s<a;s++){let a=this.__charBounds[e][s];o=this.getValueOfPropertyAt(e,s,"textBackgroundColor"),this.path?(t.save(),t.translate(a.renderLeft,a.renderTop),t.rotate(a.angle),t.fillStyle=o,o&&t.fillRect(-a.width/2,-d*(1-this._fontSizeFraction),a.width,d),t.restore()):o===u?h+=a.kernedWidth:(n=i+l+c,"rtl"===this.direction&&(n=this.width-n-h),t.fillStyle=u,u&&t.fillRect(n,r,h,d),c=a.left,h=a.width,u=o)}o&&!this.path&&(n=i+l+c,"rtl"===this.direction&&(n=this.width-n-h),t.fillStyle=o,t.fillRect(n,r,h,d)),r+=s}t.fillStyle=e,this._removeShadow(t)}_measureChar(t,e,i,r){let s,n,o,a,l=M.getFontCache(e),h=this._getFontDeclaration(e),c=i?i+t:t,u=i&&h===this._getFontDeclaration(r),d=e.fontSize/this.CACHE_FONT_SIZE;if(i&&l.has(i)&&(o=l.get(i)),l.has(t)&&(a=s=l.get(t)),u&&l.has(c)&&(n=l.get(c),a=n-o),void 0===s||void 0===o||void 0===n){let r=(Ho||(Ho=Tt({width:0,height:0}).getContext("2d")),Ho);this._setTextStyles(r,e,!0),void 0===s&&(a=s=r.measureText(t).width,l.set(t,s)),void 0===o&&u&&i&&(o=r.measureText(i).width,l.set(i,o)),u&&void 0===n&&(n=r.measureText(c).width,l.set(c,n),a=n-o)}return{width:s*d,kernedWidth:a*d}}getHeightOfChar(t,e){return this.getValueOfPropertyAt(t,e,"fontSize")}measureLine(t){let e=this._measureLine(t);return 0!==this.charSpacing&&(e.width-=this._getWidthOfCharSpacing()),e.width<0&&(e.width=0),e}_measureLine(t){let e,i,r=0,s=this.pathSide===X,n=this.path,o=this._textLines[t],a=o.length,l=Array(a);this.__charBounds[t]=l;for(let s=0;s<a;s++){let n=o[s];i=this._getGraphemeBox(n,t,s,e),l[s]=i,r+=i.kernedWidth,e=n}if(l[a]={left:i?i.left+i.width:0,width:0,kernedWidth:0,height:this.fontSize,deltaY:0},n&&n.segmentsInfo){let t=0,e=n.segmentsInfo[n.segmentsInfo.length-1].length;switch(this.textAlign){case B:t=s?e-r:0;break;case R:t=(e-r)/2;break;case X:t=s?0:e-r}t+=this.pathStartOffset*(s?-1:1);for(let r=s?a-1:0;s?r>=0:r<a;s?r--:r++)i=l[r],t>e?t%=e:t<0&&(t+=e),this._setGraphemeOnPath(t,i),t+=i.kernedWidth}return{width:r,numOfSpaces:0}}_setGraphemeOnPath(t,e){let i=t+e.kernedWidth/2,r=this.path,s=Pn(r.path,i,r.segmentsInfo);e.renderLeft=s.x-r.pathOffset.x,e.renderTop=s.y-r.pathOffset.y,e.angle=s.angle+("right"===this.pathSide?Math.PI:0)}_getGraphemeBox(t,e,i,r,s){let n,o=this.getCompleteStyleDeclaration(e,i),a=r?this.getCompleteStyleDeclaration(e,i-1):{},l=this._measureChar(t,o,r,a),h=l.kernedWidth,c=l.width;0!==this.charSpacing&&(n=this._getWidthOfCharSpacing(),c+=n,h+=n);let u={width:c,left:0,height:o.fontSize,kernedWidth:h,deltaY:o.deltaY};if(i>0&&!s){let t=this.__charBounds[e][i-1];u.left=t.left+t.width+l.kernedWidth-l.width}return u}getHeightOfLineImpl(t){let e=this.__lineHeights;if(e[t])return e[t];let i=this.getHeightOfChar(t,0);for(let e=1,r=this._textLines[t].length;e<r;e++)i=Math.max(this.getHeightOfChar(t,e),i);return e[t]=i*this._fontSizeMult}getHeightOfLine(t){return this.getHeightOfLineImpl(t)*this.lineHeight}calcTextHeight(){let t=0;for(let e=0,i=this._textLines.length;e<i;e++)t+=e===i-1?this.getHeightOfLineImpl(e):this.getHeightOfLine(e);return t}_getLeftOffset(){return"ltr"===this.direction?-this.width/2:this.width/2}_getTopOffset(){return-this.height/2}_renderTextCommon(t,e){t.save();let i=0,r=this._getLeftOffset(),s=this._getTopOffset();for(let n=0,o=this._textLines.length;n<o;n++)this._renderTextLine(e,t,this._textLines[n],r+this._getLineLeftOffset(n),s+i+this.getHeightOfLineImpl(n),n),i+=this.getHeightOfLine(n);t.restore()}_renderTextFill(t){(this.fill||this.styleHas("fill"))&&this._renderTextCommon(t,"fillText")}_renderTextStroke(t){(this.stroke&&0!==this.strokeWidth||!this.isEmptyStyles())&&(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray),t.beginPath(),this._renderTextCommon(t,"strokeText"),t.closePath(),t.restore())}_renderChars(t,e,i,r,s,n){let o,a,l,h,c,u=this.textAlign.includes(ki),d=this.path,g=!u&&0===this.charSpacing&&this.isEmptyStyles(n)&&!d,f="ltr"===this.direction,p="ltr"===this.direction?1:-1,m=e.direction,y="",b=0;if(e.save(),m!==this.direction&&(e.canvas.setAttribute("dir",f?"ltr":"rtl"),e.direction=f?"ltr":"rtl",e.textAlign=f?B:X),s-=this.getHeightOfLineImpl(n)*this._fontSizeFraction,g)return this._renderChar(t,e,n,0,i.join(""),r,s),void e.restore();for(let g=0,f=i.length-1;g<=f;g++)h=g===f||this.charSpacing||d,y+=i[g],l=this.__charBounds[n][g],0===b?(r+=p*(l.kernedWidth-l.width),b+=l.width):b+=l.kernedWidth,u&&!h&&this._reSpaceAndTab.test(i[g])&&(h=!0),h||(o=o||this.getCompleteStyleDeclaration(n,g),a=this.getCompleteStyleDeclaration(n,g+1),h=Ts(o,a,!1)),h&&(d?(e.save(),e.translate(l.renderLeft,l.renderTop),e.rotate(l.angle),this._renderChar(t,e,n,g,y,-b/2,0),e.restore()):(c=r,this._renderChar(t,e,n,g,y,c,s)),y="",o=a,r+=p*b,b=0);e.restore()}_applyPatternGradientTransformText(t){let e=this.width+this.strokeWidth,i=this.height+this.strokeWidth,r=Tt({width:e,height:i}),s=r.getContext("2d");return r.width=e,r.height=i,s.beginPath(),s.moveTo(0,0),s.lineTo(e,0),s.lineTo(e,i),s.lineTo(0,i),s.closePath(),s.translate(e/2,i/2),s.fillStyle=t.toLive(s),this._applyPatternGradientTransform(s,t),s.fill(),s.createPattern(r,"no-repeat")}handleFiller(t,e,i){let r,s;return te(i)?"percentage"===i.gradientUnits||i.gradientTransform||i.patternTransform?(r=-this.width/2,s=-this.height/2,t.translate(r,s),t[e]=this._applyPatternGradientTransformText(i),{offsetX:r,offsetY:s}):(t[e]=i.toLive(t),this._applyPatternGradientTransform(t,i)):(t[e]=i,{offsetX:0,offsetY:0})}_setStrokeStyles(t,{stroke:e,strokeWidth:i}){return t.lineWidth=i,t.lineCap=this.strokeLineCap,t.lineDashOffset=this.strokeDashOffset,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,this.handleFiller(t,"strokeStyle",e)}_setFillStyles(t,{fill:e}){return this.handleFiller(t,"fillStyle",e)}_renderChar(t,e,i,r,s,n,o){let a=this._getStyleDeclaration(i,r),l=this.getCompleteStyleDeclaration(i,r),h="fillText"===t&&l.fill,c="strokeText"===t&&l.stroke&&l.strokeWidth;if(c||h){if(e.save(),e.font=this._getFontDeclaration(l),a.textBackgroundColor&&this._removeShadow(e),a.deltaY&&(o+=a.deltaY),h){let t=this._setFillStyles(e,l);e.fillText(s,n-t.offsetX,o-t.offsetY)}if(c){let t=this._setStrokeStyles(e,l);e.strokeText(s,n-t.offsetX,o-t.offsetY)}e.restore()}}setSuperscript(t,e){this._setScript(t,e,this.superscript)}setSubscript(t,e){this._setScript(t,e,this.subscript)}_setScript(t,e,i){let r=this.get2DCursorLocation(t,!0),s=this.getValueOfPropertyAt(r.lineIndex,r.charIndex,"fontSize"),n=this.getValueOfPropertyAt(r.lineIndex,r.charIndex,"deltaY"),o={fontSize:s*i.size,deltaY:n+s*i.baseline};this.setSelectionStyles(o,t,e)}_getLineLeftOffset(t){let e=this.getLineWidth(t),i=this.width-e,r=this.textAlign,s=this.direction,n=this.isEndOfWrapping(t),o=0;return"justify"===r||"justify-center"===r&&!n||"justify-right"===r&&!n||"justify-left"===r&&!n?0:("center"===r&&(o=i/2),"right"===r&&(o=i),"justify-center"===r&&(o=i/2),"justify-right"===r&&(o=i),"rtl"===s&&("right"===r||"justify-right"===r?o=0:"left"===r||"justify-left"===r?o=-i:"center"!==r&&"justify-center"!==r||(o=-i/2)),o)}_clearCache(){this._forceClearCache=!1,this.__lineWidths=[],this.__lineHeights=[],this.__charBounds=[]}getLineWidth(t){if(void 0!==this.__lineWidths[t])return this.__lineWidths[t];let{width:e}=this.measureLine(t);return this.__lineWidths[t]=e,e}_getWidthOfCharSpacing(){return 0===this.charSpacing?0:this.fontSize*this.charSpacing/1e3}getValueOfPropertyAt(t,e,i){var r;return null==(r=this._getStyleDeclaration(t,e)[i])?this[i]:r}_renderTextDecoration(t,e){if(!this[e]&&!this.styleHas(e))return;let i=this._getTopOffset(),r=this._getLeftOffset(),s=this.path,n=this._getWidthOfCharSpacing(),o="linethrough"===e?.5:+("overline"===e),a=this.offsets[e];for(let l=0,h=this._textLines.length;l<h;l++){let h=this.getHeightOfLine(l);if(!this[e]&&!this.styleHas(e,l)){i+=h;continue}let c,u=this._textLines[l],d=h/this.lineHeight,g=this._getLineLeftOffset(l),f=0,p=0,m=this.getValueOfPropertyAt(l,0,e),y=this.getValueOfPropertyAt(l,0,it),b=this.getValueOfPropertyAt(l,0,"textDecorationColor")||y,_=this.getValueOfPropertyAt(l,0,_i),v=m,x=b,C=_,w=i+d*(1-this._fontSizeFraction),S=this.getHeightOfChar(l,0),T=this.getValueOfPropertyAt(l,0,"deltaY");for(let i=0,n=u.length;i<n;i++){let n=this.__charBounds[l][i];v=this.getValueOfPropertyAt(l,i,e),c=this.getValueOfPropertyAt(l,i,it),x=this.getValueOfPropertyAt(l,i,"textDecorationColor")||c,C=this.getValueOfPropertyAt(l,i,_i);let h=this.getHeightOfChar(l,i),u=this.getValueOfPropertyAt(l,i,"deltaY");if(s&&v&&c){let e=this.fontSize*C/1e3;t.save(),t.fillStyle=x,t.translate(n.renderLeft,n.renderTop),t.rotate(n.angle),t.fillRect(-n.kernedWidth/2,a*h+u-o*e,n.kernedWidth,e),t.restore()}else if((v!==m||c!==y||x!==b||h!==S||C!==_||u!==T)&&p>0){let e=this.fontSize*_/1e3,i=r+g+f;"rtl"===this.direction&&(i=this.width-i-p),m&&b&&_&&(t.fillStyle=b,t.fillRect(i,w+a*S+T-o*e,p,e)),f=n.left,p=n.width,m=v,b=x,_=C,y=c,S=h,T=u}else p+=n.kernedWidth}let O=r+g+f;"rtl"===this.direction&&(O=this.width-O-p),t.fillStyle=x;let k=this.fontSize*C/1e3;v&&x&&C&&t.fillRect(O,w+a*S+T-o*k,p-n,k),i+=h}this._removeShadow(t)}_getFontDeclaration({fontFamily:e=this.fontFamily,fontStyle:i=this.fontStyle,fontWeight:r=this.fontWeight,fontSize:s=this.fontSize}={},n){let o=e.includes("'")||e.includes('"')||e.includes(",")||t.genericFonts.includes(e.toLowerCase())?e:`"${e}"`;return[i,r,`${n?this.CACHE_FONT_SIZE:s}px`,o].join(" ")}render(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._forceClearCache&&this.initDimensions(),super.render(t)))}graphemeSplit(t){return me(t)}_splitTextIntoLines(t){let e=t.split(this._reNewline),i=Array(e.length),r=["\n"],s=[];for(let t=0;t<e.length;t++)i[t]=this.graphemeSplit(e[t]),s=s.concat(i[t],r);return s.pop(),{_unwrappedLines:i,lines:e,graphemeText:s,graphemeLines:i}}toObject(t=[]){return{...super.toObject([...Si,...t]),styles:Os(this.styles,this.text),...this.path?{path:this.path.toObject()}:{}}}set(t,e){let{textLayoutProperties:i}=this.constructor;super.set(t,e);let r=!1,s=!1;if("object"==typeof t)for(let e in t)"path"===e&&this.setPathInfo(),r=r||i.includes(e),s=s||"path"===e;else r=i.includes(t),s="path"===t;return s&&this.setPathInfo(),r&&this.initialized&&(this.initDimensions(),this.setCoords()),this}complexity(){return 1}static async fromElement(e,i,r){let s=Ks(e,t.ATTRIBUTE_NAMES,r),{textAnchor:n=B,textDecoration:o="",dx:a=0,dy:l=0,top:h=0,left:c=0,fontSize:u=16,strokeWidth:d=1,...g}={...i,...s},f=new this(oi(e.textContent||"").trim(),{left:c+a,top:h+l,underline:o.includes("underline"),overline:o.includes("overline"),linethrough:o.includes("line-through"),strokeWidth:0,fontSize:u,...g}),p=f.getScaledHeight()/f.height,m=((f.height+f.strokeWidth)*f.lineHeight-f.height)*p,y=f.getScaledHeight()+m,b=0;return"center"===n&&(b=f.getScaledWidth()/2),"right"===n&&(b=f.getScaledWidth()),f.set({left:f.left-b,top:f.top-(y-f.fontSize*(.07+f._fontSizeFraction))/f.lineHeight,strokeWidth:d}),f}static fromObject(t){return this._fromObject({...t,styles:ks(t.styles||{},t.text)},{extraParam:"text"})}};p(Go,"textLayoutProperties",wi),p(Go,"cacheProperties",[...Xi,...Si]),p(Go,"ownDefaults",Oi),p(Go,"type","Text"),p(Go,"genericFonts",["serif","sans-serif","monospace","cursive","fantasy","system-ui","ui-serif","ui-sans-serif","ui-monospace","ui-rounded","math","emoji","fangsong"]),p(Go,"ATTRIBUTE_NAMES",Ds.concat("x","y","dx","dy","font-family","font-style","font-weight","font-size","letter-spacing","text-decoration","text-decoration-thickness","text-decoration-color","text-anchor")),ms(Go,[class extends bi{_toSVG(){let t=this._getSVGLeftTopOffsets(),e=this._getSVGTextAndBg(t.textTop,t.textLeft);return this._wrapSVGTextAndBg(e)}toSVG(t){let e=this._createBaseSVGMarkup(this._toSVG(),{reviver:t,noStyle:!0,withShadow:!0}),i=this.path;return i?e+i._createBaseSVGMarkup(i._toSVG(),{reviver:t,withShadow:!0,additionalTransform:Zt(this.calcOwnMatrix())}):e}_getSVGLeftTopOffsets(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}}_wrapSVGTextAndBg({textBgRects:t,textSpans:e}){let i=this.getSvgTextDecoration(this);return[t.join(""),'\t\t<text xml:space="preserve" ',`font-family="${fe(this.fontFamily.replace(Vo,"'"))}" `,`font-size="${fe(this.fontSize)}" `,this.fontStyle?`font-style="${fe(this.fontStyle)}" `:"",this.fontWeight?`font-weight="${fe(this.fontWeight)}" `:"",i?`text-decoration="${i}" `:"","rtl"===this.direction?'direction="rtl" ':"",'style="',this.getSvgStyles(!0),'"',this.addPaintOrder()," >",e.join(""),"</text>\n"]}_getSVGTextAndBg(t,e){let i,r=[],s=[],n=t;this.backgroundColor&&s.push(zo(this.backgroundColor,-this.width/2,-this.height/2,this.width,this.height));for(let t=0,o=this._textLines.length;t<o;t++)i=this._getLineLeftOffset(t),"rtl"===this.direction&&(i+=this.width),(this.textBackgroundColor||this.styleHas("textBackgroundColor",t))&&this._setSVGTextLineBg(s,t,e+i,n),this._setSVGTextLineText(r,t,e+i,n),n+=this.getHeightOfLine(t);return{textSpans:r,textBgRects:s}}_createTextCharSpan(t,e,i,r,s){let n=y.NUM_FRACTION_DIGITS,o=this.getSvgSpanStyles(e,t!==t.trim()||!!t.match(No)),a=o?`style="${o}"`:"",l=e.deltaY,h=l?` dy="${Qt(l,n)}" `:"",{angle:c,renderLeft:u,renderTop:d,width:g}=s,f="";if(void 0!==u){let t=g/2;c&&(f=` rotate="${Qt(Mt(c),n)}"`);let e=Xt({angle:Mt(c)});e[4]=u,e[5]=d;let s=new gt(-t,0).transform(e);i=s.x,r=s.y}return`<tspan x="${Qt(i,n)}" y="${Qt(r,n)}" ${h}${f}${a}>${fe(t)}</tspan>`}_setSVGTextLineText(t,e,i,r){let s,n,o,a,l,h=this.getHeightOfLine(e),c=this.textAlign.includes(ki),u=this._textLines[e],d="",g=0;r+=h*(1-this._fontSizeFraction)/this.lineHeight;for(let h=0,f=u.length-1;h<=f;h++)l=h===f||this.charSpacing||this.path,d+=u[h],o=this.__charBounds[e][h],0===g?(i+=o.kernedWidth-o.width,g+=o.width):g+=o.kernedWidth,c&&!l&&this._reSpaceAndTab.test(u[h])&&(l=!0),l||(s=s||this.getCompleteStyleDeclaration(e,h),n=this.getCompleteStyleDeclaration(e,h+1),l=Ts(s,n,!0)),l&&(a=this._getStyleDeclaration(e,h),t.push(this._createTextCharSpan(d,a,i,r,o)),d="",s=n,"rtl"===this.direction?i-=g:i+=g,g=0)}_setSVGTextLineBg(t,e,i,r){let s,n=this._textLines[e],o=this.getHeightOfLine(e)/this.lineHeight,a=0,l=0,h=this.getValueOfPropertyAt(e,0,"textBackgroundColor");for(let c=0;c<n.length;c++){let{left:n,width:u,kernedWidth:d}=this.__charBounds[e][c];s=this.getValueOfPropertyAt(e,c,"textBackgroundColor"),s===h?a+=d:(h&&t.push(zo(h,i+l,r,a,o)),l=n,a=u,h=s)}s&&t.push(zo(h,i+l,r,a,o))}getSvgStyles(t){let e=ri(this.textDecorationColor)?` text-decoration-color: ${fe(this[vi])};`:"";return`${super.getSvgStyles(t)} text-decoration-thickness: ${Qt(this.textDecorationThickness*this.getObjectScaling().y/10,y.NUM_FRACTION_DIGITS)}%;${e} white-space: pre;`}getSvgSpanStyles(t,e){let{fontFamily:i,strokeWidth:r,stroke:s,fill:n,fontSize:o,fontStyle:a,fontWeight:l,textDecorationThickness:h,textDecorationColor:c,linethrough:u,overline:d,underline:g}=t,f=this.getSvgTextDecoration({underline:g??this.underline,overline:d??this.overline,linethrough:u??this.linethrough}),p=h||this.textDecorationThickness,m=c||this.textDecorationColor,b=si(r),_=ni(i),v=si(o),x=ni(a),C=si(l)||ni(l),w=ni(m);return[s?yi(rt,s):"",b?`stroke-width: ${fe(b)}; `:"",_?`font-family: ${_.includes("'")||_.includes('"')?fe(_):`'${fe(_)}'`}; `:"",v?`font-size: ${fe(v)}px; `:"",x?`font-style: ${fe(x)}; `:"",C?`font-weight: ${fe(C)}; `:"",f?`text-decoration: ${f}; text-decoration-thickness: ${Qt(p*this.getObjectScaling().y/10,y.NUM_FRACTION_DIGITS)}%;${w?` text-decoration-color: ${fe(w)};`:""} `:"",n?yi(it,n):"",e?"white-space: pre; ":""].join("")}getSvgTextDecoration(t){return["overline","underline","line-through"].filter(e=>t[e.replace("-","")]).join(" ")}}]),at.setClass(Go),at.setSVGClass(Go);var Uo=class{constructor(t){p(this,"target",void 0),p(this,"__mouseDownInPlace",!1),p(this,"__dragStartFired",!1),p(this,"__isDraggingOver",!1),p(this,"__dragStartSelection",void 0),p(this,"__dragImageDisposer",void 0),p(this,"_dispose",void 0),this.target=t;let e=[this.target.on("dragenter",this.dragEnterHandler.bind(this)),this.target.on("dragover",this.dragOverHandler.bind(this)),this.target.on("dragleave",this.dragLeaveHandler.bind(this)),this.target.on("dragend",this.dragEndHandler.bind(this)),this.target.on("drop",this.dropHandler.bind(this))];this._dispose=()=>{e.forEach(t=>t()),this._dispose=void 0}}isPointerOverSelection(t){let e=this.target,i=e.getSelectionStartFromPointer(t);return e.isEditing&&i>=e.selectionStart&&i<=e.selectionEnd&&e.selectionStart<e.selectionEnd}start(t){return this.__mouseDownInPlace=this.isPointerOverSelection(t)}isActive(){return this.__mouseDownInPlace}end(t){let e=this.isActive();return e&&!this.__dragStartFired&&(this.target.setCursorByClick(t),this.target.initDelayedCursor(!0)),this.__mouseDownInPlace=!1,this.__dragStartFired=!1,this.__isDraggingOver=!1,e}getDragStartSelection(){return this.__dragStartSelection}setDragImage(t,{selectionStart:e,selectionEnd:i}){var r;let s=this.target,n=s.canvas,o=new gt(s.flipX?-1:1,s.flipY?-1:1),a=s._getCursorBoundaries(e),l=new gt(a.left+a.leftOffset,a.top+a.topOffset).multiply(o).transform(s.calcTransformMatrix()),h=n.getScenePoint(t).subtract(l),c=s.getCanvasRetinaScaling(),u=s.getBoundingRect(),d=l.subtract(new gt(u.left,u.top)),g=n.viewportTransform,f=d.add(h).transform(g,!0),p=s.backgroundColor,m=Ss(s.styles);s.backgroundColor="";let y={stroke:"transparent",fill:"transparent",textBackgroundColor:"transparent"};s.setSelectionStyles(y,0,e),s.setSelectionStyles(y,i,s.text.length),s.dirty=!0;let b=s.toCanvasElement({enableRetinaScaling:n.enableRetinaScaling,viewportTransform:!0});s.backgroundColor=p,s.styles=m,s.dirty=!0,zn(b,{position:"fixed",left:-b.width+"px",border:Y,width:b.width/c+"px",height:b.height/c+"px"}),this.__dragImageDisposer&&this.__dragImageDisposer(),this.__dragImageDisposer=()=>{b.remove()},ne(t.target||this.target.hiddenTextarea).body.appendChild(b),null==(r=t.dataTransfer)||r.setDragImage(b,f.x,f.y)}onDragStart(t){this.__dragStartFired=!0;let e=this.target,i=this.isActive();if(i&&t.dataTransfer){let i=this.__dragStartSelection={selectionStart:e.selectionStart,selectionEnd:e.selectionEnd},r=e._text.slice(i.selectionStart,i.selectionEnd).join(""),s={text:e.text,value:r,...i};t.dataTransfer.setData("text/plain",r),t.dataTransfer.setData("application/fabric",JSON.stringify({value:r,styles:e.getSelectionStyles(i.selectionStart,i.selectionEnd,!0)})),t.dataTransfer.effectAllowed="copyMove",this.setDragImage(t,s)}return e.abortCursorAnimation(),i}canDrop(t){if(this.target.editable&&!this.target.getActiveControl()&&!t.defaultPrevented){if(this.isActive()&&this.__dragStartSelection){let e=this.target.getSelectionStartFromPointer(t),i=this.__dragStartSelection;return e<i.selectionStart||e>i.selectionEnd}return!0}return!1}targetCanDrop(t){return this.target.canDrop(t)}dragEnterHandler({e:t}){let e=this.targetCanDrop(t);!this.__isDraggingOver&&e&&(this.__isDraggingOver=!0)}dragOverHandler(t){let{e}=t,i=this.targetCanDrop(e);!this.__isDraggingOver&&i?this.__isDraggingOver=!0:this.__isDraggingOver&&!i&&(this.__isDraggingOver=!1),this.__isDraggingOver&&(e.preventDefault(),t.canDrop=!0,t.dropTarget=this.target)}dragLeaveHandler(){(this.__isDraggingOver||this.isActive())&&(this.__isDraggingOver=!1)}dropHandler(t){var e;let{e:i}=t,r=i.defaultPrevented;this.__isDraggingOver=!1,i.preventDefault();let s=null==(e=i.dataTransfer)?void 0:e.getData("text/plain");if(s&&!r){let e=this.target,r=e.canvas,n=e.getSelectionStartFromPointer(i),{styles:o}=i.dataTransfer.types.includes("application/fabric")?JSON.parse(i.dataTransfer.getData("application/fabric")):{},a=s[Math.max(0,s.length-1)];if(this.__dragStartSelection){let t=this.__dragStartSelection.selectionStart,i=this.__dragStartSelection.selectionEnd;n>t&&n<=i?n=t:n>i&&(n-=i-t),e.removeChars(t,i),delete this.__dragStartSelection}e._reNewline.test(a)&&(e._reNewline.test(e._text[n])||n===e._text.length)&&(s=s.trimEnd()),t.didDrop=!0,t.dropTarget=e,e.insertChars(s,o,n),r.setActiveObject(e),e.enterEditing(i),e.selectionStart=Math.min(n+0,e._text.length),e.selectionEnd=Math.min(e.selectionStart+s.length,e._text.length),e.hiddenTextarea.value=e.text,e._updateTextarea(),e.hiddenTextarea.focus(),e.fire(K,{index:n+0,action:"drop"}),r.fire("text:changed",{target:e}),r.contextTopDirty=!0,r.requestRenderAll()}}dragEndHandler({e:t}){if(this.isActive()&&this.__dragStartFired&&this.__dragStartSelection){var e;let i=this.target,r=this.target.canvas,{selectionStart:s,selectionEnd:n}=this.__dragStartSelection,o=(null==(e=t.dataTransfer)?void 0:e.dropEffect)||"none";"none"===o?(i.selectionStart=s,i.selectionEnd=n,i._updateTextarea(),i.hiddenTextarea.focus()):(i.clearContextTop(),"move"===o&&(i.removeChars(s,n),i.selectionStart=i.selectionEnd=s,i.hiddenTextarea&&(i.hiddenTextarea.value=i.text),i._updateTextarea(),i.fire(K,{index:s,action:"dragend"}),r.fire("text:changed",{target:i}),r.requestRenderAll()),i.exitEditing())}this.__dragImageDisposer&&this.__dragImageDisposer(),delete this.__dragImageDisposer,delete this.__dragStartSelection,this.__isDraggingOver=!1}dispose(){this._dispose&&this._dispose()}};const qo=/[ \n\.,;!\?\-]/;var Ko=class extends Go{constructor(...t){super(...t),p(this,"_currentCursorOpacity",1)}initBehavior(){this._tick=this._tick.bind(this),this._onTickComplete=this._onTickComplete.bind(this),this.updateSelectionOnMouseMove=this.updateSelectionOnMouseMove.bind(this)}onDeselect(t){return this.isEditing&&this.exitEditing(),this.selected=!1,super.onDeselect(t)}_animateCursor({toValue:t,duration:e,delay:i,onComplete:r}){return Mr({startValue:this._currentCursorOpacity,endValue:t,duration:e,delay:i,onComplete:r,abort:()=>!this.canvas||this.selectionStart!==this.selectionEnd,onChange:t=>{this._currentCursorOpacity=t,this.renderCursorOrSelection()}})}_tick(t){this._currentTickState=this._animateCursor({toValue:0,duration:this.cursorDuration/2,delay:Math.max(t||0,100),onComplete:this._onTickComplete})}_onTickComplete(){var t;null==(t=this._currentTickCompleteState)||t.abort(),this._currentTickCompleteState=this._animateCursor({toValue:1,duration:this.cursorDuration,onComplete:this._tick})}initDelayedCursor(t){this.abortCursorAnimation(),this._tick(t?0:this.cursorDelay)}abortCursorAnimation(){let t=!1;[this._currentTickState,this._currentTickCompleteState].forEach(e=>{e&&!e.isDone()&&(t=!0,e.abort())}),this._currentCursorOpacity=1,t&&this.clearContextTop()}restartCursorIfNeeded(){[this._currentTickState,this._currentTickCompleteState].some(t=>!t||t.isDone())&&this.initDelayedCursor()}selectAll(){return this.selectionStart=0,this.selectionEnd=this._text.length,this._fireSelectionChanged(),this._updateTextarea(),this}cmdAll(){this.selectAll(),this.renderCursorOrSelection()}getSelectedText(){return this._text.slice(this.selectionStart,this.selectionEnd).join("")}findWordBoundaryLeft(t){let e=0,i=t-1;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i--;for(;/\S/.test(this._text[i])&&i>-1;)e++,i--;return t-e}findWordBoundaryRight(t){let e=0,i=t;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i++;for(;/\S/.test(this._text[i])&&i<this._text.length;)e++,i++;return t+e}findLineBoundaryLeft(t){let e=0,i=t-1;for(;!/\n/.test(this._text[i])&&i>-1;)e++,i--;return t-e}findLineBoundaryRight(t){let e=0,i=t;for(;!/\n/.test(this._text[i])&&i<this._text.length;)e++,i++;return t+e}searchWordBoundary(t,e){let i=this._text,r=t>0&&this._reSpace.test(i[t])&&(-1===e||!W.test(i[t-1]))?t-1:t,s=i[r];for(;r>0&&r<i.length&&!qo.test(s);)r+=e,s=i[r];return-1===e&&qo.test(s)&&r++,r}selectWord(t){var e;t=null==(e=t)?this.selectionStart:e;let i=this.searchWordBoundary(t,-1),r=Math.max(i,this.searchWordBoundary(t,1));this.selectionStart=i,this.selectionEnd=r,this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()}selectLine(t){var e;t=null==(e=t)?this.selectionStart:e;let i=this.findLineBoundaryLeft(t),r=this.findLineBoundaryRight(t);this.selectionStart=i,this.selectionEnd=r,this._fireSelectionChanged(),this._updateTextarea()}enterEditing(t){!this.isEditing&&this.editable&&(this.enterEditingImpl(),this.fire("editing:entered",t?{e:t}:void 0),this._fireSelectionChanged(),this.canvas&&(this.canvas.fire("text:editing:entered",{target:this,e:t}),this.canvas.requestRenderAll()))}enterEditingImpl(){this.canvas&&(this.canvas.calcOffset(),this.canvas.textEditingManager.exitTextEditing()),this.isEditing=!0,this.initHiddenTextarea(),this.hiddenTextarea.focus(),this.hiddenTextarea.value=this.text,this._updateTextarea(),this._saveEditingProps(),this._setEditingProps(),this._textBeforeEdit=this.text,this._tick()}updateSelectionOnMouseMove(t){if(this.getActiveControl())return;let e=this.hiddenTextarea;ne(e).activeElement!==e&&e.focus();let i=this.getSelectionStartFromPointer(t),r=this.selectionStart,s=this.selectionEnd;(i===this.__selectionStartOnMouseDown&&r!==s||r!==i&&s!==i)&&(i>this.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=i):(this.selectionStart=i,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===r&&this.selectionEnd===s||(this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}_setEditingProps(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0}fromStringToGraphemeSelection(t,e,i){let r=i.slice(0,t),s=this.graphemeSplit(r).length;if(t===e)return{selectionStart:s,selectionEnd:s};let n=i.slice(t,e);return{selectionStart:s,selectionEnd:s+this.graphemeSplit(n).length}}fromGraphemeToStringSelection(t,e,i){let r=i.slice(0,t).join("").length;return t===e?{selectionStart:r,selectionEnd:r}:{selectionStart:r,selectionEnd:r+i.slice(t,e).join("").length}}_updateTextarea(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){let t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}}updateFromTextArea(){let{hiddenTextarea:t,direction:e,textAlign:i,inCompositionMode:r}=this;if(!t)return;let s="justify"===i?"ltr"===e?B:X:i.replace("justify-",""),n=this.getPositionByOrigin(s,"top");this.cursorOffsetCache={},this.text=t.value,this.set("dirty",!0),this.initDimensions(),this.setPositionByOrigin(n,s,"top"),this.setCoords();let o=this.fromStringToGraphemeSelection(t.selectionStart,t.selectionEnd,t.value);this.selectionEnd=this.selectionStart=o.selectionEnd,r||(this.selectionStart=o.selectionStart),this.updateTextareaPosition()}updateTextareaPosition(){if(this.selectionStart===this.selectionEnd){let t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}}_calcTextareaPosition(){if(!this.canvas)return{left:"1px",top:"1px"};let t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),i=this.get2DCursorLocation(t),r=i.lineIndex,s=i.charIndex,n=this.getValueOfPropertyAt(r,s,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.getCanvasRetinaScaling(),l=this.canvas.upperCanvasEl,h=l.width/a,c=l.height/a,u=h-n,d=c-n,g=new gt(e.left+o,e.top+e.topOffset+n).transform(this.calcTransformMatrix()).transform(this.canvas.viewportTransform).multiply(new gt(l.clientWidth/h,l.clientHeight/c));return g.x<0&&(g.x=0),g.x>u&&(g.x=u),g.y<0&&(g.y=0),g.y>d&&(g.y=d),g.x+=this.canvas._offset.left,g.y+=this.canvas._offset.top,{left:`${g.x}px`,top:`${g.y}px`,fontSize:`${n}px`,charHeight:n}}_saveEditingProps(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}}_restoreEditingProps(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor||this.canvas.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor||this.canvas.moveCursor),delete this._savedProps)}exitEditingImpl(){let t=this.hiddenTextarea;this.selected=!1,this.isEditing=!1,t&&(t.blur&&t.blur(),t.parentNode&&t.parentNode.removeChild(t)),this.hiddenTextarea=null,this.abortCursorAnimation(),this.selectionStart!==this.selectionEnd&&this.clearContextTop(),this.selectionEnd=this.selectionStart,this._restoreEditingProps(),this._forceClearCache&&(this.initDimensions(),this.setCoords())}exitEditing(){let t=this._textBeforeEdit!==this.text;return this.exitEditingImpl(),this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this}_removeExtraneousStyles(){for(let t in this.styles)this._textLines[t]||delete this.styles[t]}removeStyleFromTo(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t,!0),{lineIndex:s,charIndex:n}=this.get2DCursorLocation(e,!0);if(i!==s){if(this.styles[i])for(let t=r;t<this._unwrappedTextLines[i].length;t++)delete this.styles[i][t];if(this.styles[s])for(let t=n;t<this._unwrappedTextLines[s].length;t++){let e=this.styles[s][t];e&&(this.styles[i]||(this.styles[i]={}),this.styles[i][r+t-n]=e)}for(let t=i+1;t<=s;t++)delete this.styles[t];this.shiftLineStyles(s,i-s)}else if(this.styles[i]){let t=this.styles[i],e=n-r;for(let e=r;e<n;e++)delete t[e];for(let r in this.styles[i]){let i=parseInt(r,10);i>=n&&(t[i-e]=t[r],delete t[r])}}}shiftLineStyles(t,e){let i=Object.assign({},this.styles);for(let r in this.styles){let s=parseInt(r,10);s>t&&(this.styles[s+e]=i[s],i[s-e]||delete this.styles[s])}}insertNewlineStyleObject(t,e,i,r){let s={},n=this._unwrappedTextLines[t].length,o=n===e,a=!1;i||(i=1),this.shiftLineStyles(t,i);let l=this.styles[t]?this.styles[t][0===e?e:e-1]:void 0;for(let i in this.styles[t]){let r=parseInt(i,10);r>=e&&(a=!0,s[r-e]=this.styles[t][i],o&&0===e||delete this.styles[t][i])}let h=!1;for(a&&!o&&(this.styles[t+i]=s,h=!0),(h||n>e)&&i--;i>0;)r&&r[i-1]?this.styles[t+i]={0:{...r[i-1]}}:l?this.styles[t+i]={0:{...l}}:delete this.styles[t+i],i--;this._forceClearCache=!0}insertCharStyleObject(t,e,i,r){this.styles||(this.styles={});let s=this.styles[t],n=s?{...s}:{};i||(i=1);for(let t in n){let r=parseInt(t,10);r>=e&&(s[r+i]=n[r],n[r-i]||delete s[r])}if(this._forceClearCache=!0,r){for(;i--;)Object.keys(r[i]).length&&(this.styles[t]||(this.styles[t]={}),this.styles[t][e+i]={...r[i]});return}if(!s)return;let o=s[e?e-1:1];for(;o&&i--;)this.styles[t][e+i]={...o}}insertNewStyleBlock(t,e,i){let r,s=this.get2DCursorLocation(e,!0),n=[0],o=0;for(let e=0;e<t.length;e++)"\n"===t[e]?(o++,n[o]=0):n[o]++;for(n[0]>0&&(this.insertCharStyleObject(s.lineIndex,s.charIndex,n[0],i),i=i&&i.slice(n[0]+1)),o&&this.insertNewlineStyleObject(s.lineIndex,s.charIndex+n[0],o),r=1;r<o;r++)n[r]>0?this.insertCharStyleObject(s.lineIndex+r,0,n[r],i):i&&this.styles[s.lineIndex+r]&&i[0]&&(this.styles[s.lineIndex+r][0]=i[0]),i=i&&i.slice(n[r]+1);n[r]>0&&this.insertCharStyleObject(s.lineIndex+r,0,n[r],i)}removeChars(t,e=t+1){this.removeStyleFromTo(t,e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}insertChars(t,e,i,r=i){r>i&&this.removeStyleFromTo(i,r);let s=this.graphemeSplit(t);this.insertNewStyleBlock(s,i,e),this._text=[...this._text.slice(0,i),...s,...this._text.slice(r)],this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}setSelectionStartEndWithShift(t,e,i){i<=t?(e===t?this._selectionDirection=B:"right"===this._selectionDirection&&(this._selectionDirection=B,this.selectionEnd=t),this.selectionStart=i):i>t&&i<e?"right"===this._selectionDirection?this.selectionEnd=i:this.selectionStart=i:(e===t?this._selectionDirection=X:"left"===this._selectionDirection&&(this._selectionDirection=X,this.selectionStart=e),this.selectionEnd=i)}},Jo=class extends Ko{initHiddenTextarea(){let t=this.canvas&&ne(this.canvas.getElement())||O(),e=t.createElement("textarea");Object.entries({autocapitalize:"off",autocorrect:"off",autocomplete:"off",spellcheck:"false","data-fabric":"textarea",wrap:"off",name:"fabricTextarea"}).map(([t,i])=>e.setAttribute(t,i));let{top:i,left:r,fontSize:s}=this._calcTextareaPosition();e.style.cssText=`position: absolute; top: ${i}; left: ${r}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${s};`,(this.hiddenTextareaContainer||t.body).appendChild(e),Object.entries({blur:"blur",keydown:"onKeyDown",keyup:"onKeyUp",input:"onInput",copy:"copy",cut:"copy",paste:"paste",compositionstart:"onCompositionStart",compositionupdate:"onCompositionUpdate",compositionend:"onCompositionEnd"}).map(([t,i])=>e.addEventListener(t,this[i].bind(this))),this.hiddenTextarea=e}blur(){this.abortCursorAnimation()}onKeyDown(t){if(!this.isEditing)return;let e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown)||!t.ctrlKey&&!t.metaKey)return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}onKeyUp(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())}onInput(t){let e=this.fromPaste,{value:i,selectionStart:r,selectionEnd:s}=this.hiddenTextarea;if(this.fromPaste=!1,t&&t.stopPropagation(),!this.isEditing)return;let n=()=>{this.updateFromTextArea(),this.fire(K),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())};if(""===this.hiddenTextarea.value)return this.styles={},void n();let o,a,l,h,c=this._splitTextIntoLines(i).graphemeText,u=this._text.length,d=c.length,g=this.selectionStart,f=this.selectionEnd,p=g!==f,m=d-u,b=this.fromStringToGraphemeSelection(r,s,i),_=g>b.selectionStart;p?(a=this._text.slice(g,f),m+=f-g):d<u&&(a=_?this._text.slice(f+m,f):this._text.slice(g,g-m));let v=c.slice(b.selectionEnd-m,b.selectionEnd);if(a&&a.length&&(v.length&&(o=this.getSelectionStyles(g,g+1,!1),o=v.map(()=>o[0])),p?(l=g,h=f):_?(l=f-a.length,h=f):(l=f,h=f+a.length),this.removeStyleFromTo(l,h)),v.length){let{copyPasteData:t}=T();e&&v.join("")===t.copiedText&&!y.disableStyleCopyPaste&&(o=t.copiedTextStyle),this.insertNewStyleBlock(v,g,o)}n()}onCompositionStart(){this.inCompositionMode=!0}onCompositionEnd(){this.inCompositionMode=!1}onCompositionUpdate({target:t}){let{selectionStart:e,selectionEnd:i}=t;this.compositionStart=e,this.compositionEnd=i,this.updateTextareaPosition()}copy(){if(this.selectionStart===this.selectionEnd)return;let{copyPasteData:t}=T();t.copiedText=this.getSelectedText(),y.disableStyleCopyPaste?t.copiedTextStyle=void 0:t.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd,!0),this._copyDone=!0}paste(){this.fromPaste=!0}_getWidthBeforeCursor(t,e){let i,r=this._getLineLeftOffset(t);return e>0&&(i=this.__charBounds[t][e-1],r+=i.left+i.width),r}getDownCursorOffset(t,e){let i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),s=r.lineIndex;if(s===this._textLines.length-1||t.metaKey||34===t.keyCode)return this._text.length-i;let n=r.charIndex,o=this._getWidthBeforeCursor(s,n),a=this._getIndexOnLine(s+1,o);return this._textLines[s].slice(n).length+a+1+this.missingNewlineOffset(s)}_getSelectionForOffset(t,e){return t.shiftKey&&this.selectionStart!==this.selectionEnd&&e?this.selectionEnd:this.selectionStart}getUpCursorOffset(t,e){let i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),s=r.lineIndex;if(0===s||t.metaKey||33===t.keyCode)return-i;let n=r.charIndex,o=this._getWidthBeforeCursor(s,n),a=this._getIndexOnLine(s-1,o),l=this._textLines[s].slice(0,n),h=this.missingNewlineOffset(s-1);return-this._textLines[s-1].length+a-l.length+(1-h)}_getIndexOnLine(t,e){let i,r,s=this._textLines[t],n=this._getLineLeftOffset(t),o=0;for(let a=0,l=s.length;a<l;a++)if(i=this.__charBounds[t][a].width,n+=i,n>e){r=!0;let t=n-i,s=n,l=Math.abs(t-e);o=Math.abs(s-e)<l?a:a-1;break}return r||(o=s.length-1),o}moveCursorDown(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)}moveCursorUp(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)}_moveCursorUpOrDown(t,e){let i=this[`get${t}CursorOffset`](e,this._selectionDirection===X);if(e.shiftKey?this.moveCursorWithShift(i):this.moveCursorWithoutShift(i),0!==i){let t=this.text.length;this.selectionStart=Bi(0,this.selectionStart,t),this.selectionEnd=Bi(0,this.selectionEnd,t),this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea()}}moveCursorWithShift(t){let e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t}moveCursorWithoutShift(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t}moveCursorLeft(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)}_move(t,e,i){let r;if(t.altKey)r=this[`findWordBoundary${i}`](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this[`findLineBoundary${i}`](this[e])}return void 0!==r&&this[e]!==r&&(this[e]=r,!0)}_moveLeft(t,e){return this._move(t,e,"Left")}_moveRight(t,e){return this._move(t,e,"Right")}moveCursorLeftWithoutShift(t){let e=!0;return this._selectionDirection=B,this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e}moveCursorLeftWithShift(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0===this.selectionStart?void 0:(this._selectionDirection=B,this._moveLeft(t,"selectionStart"))}moveCursorRight(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)}_moveCursorLeftOrRight(t,e){let i=`moveCursor${t}${e.shiftKey?"WithShift":"WithoutShift"}`;this._currentCursorOpacity=1,this[i](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())}moveCursorRightWithShift(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd===this._text.length?void 0:(this._selectionDirection=X,this._moveRight(t,"selectionEnd"))}moveCursorRightWithoutShift(t){let e=!0;return this._selectionDirection=X,this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e}};const Qo=t=>!!t.button;var Zo=class extends Jo{constructor(...t){super(...t),p(this,"draggableTextDelegate",void 0)}initBehavior(){this.on("mousedown",this._mouseDownHandler),this.on("mouseup",this.mouseUpHandler),this.on("mousedblclick",this.doubleClickHandler),this.on("mousetripleclick",this.tripleClickHandler),this.draggableTextDelegate=new Uo(this),super.initBehavior()}shouldStartDragging(){return this.draggableTextDelegate.isActive()}onDragStart(t){return this.draggableTextDelegate.onDragStart(t)}canDrop(t){return this.draggableTextDelegate.canDrop(t)}doubleClickHandler(t){this.isEditing&&(this.selectWord(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}tripleClickHandler(t){this.isEditing&&(this.selectLine(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}_mouseDownHandler({e:t,alreadySelected:e}){this.canvas&&this.editable&&!Qo(t)&&!this.getActiveControl()&&(this.draggableTextDelegate.start(t)||(this.canvas.textEditingManager.register(this),e&&(this.inCompositionMode=!1,this.setCursorByClick(t)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()),this.selected||(this.selected=e||this.isEditing)))}mouseUpHandler({e:t,transform:e}){let i=this.draggableTextDelegate.end(t);if(this.canvas){this.canvas.textEditingManager.unregister(this);let t=this.canvas._activeObject;if(t&&t!==this)return}!this.editable||this.group&&!this.group.interactive||e&&e.actionPerformed||Qo(t)||i||this.selected&&!this.getActiveControl()&&(this.enterEditing(t),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection())}setCursorByClick(t){let e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())}getSelectionStartFromPointer(t){let e=this.canvas.getScenePoint(t).transform(Pt(this.calcTransformMatrix())).add(new gt(-this._getLeftOffset(),-this._getTopOffset())),i=0,r=0,s=0;for(let t=0;t<this._textLines.length&&i<=e.y;t++)i+=this.getHeightOfLine(t),s=t,t>0&&(r+=this._textLines[t-1].length+this.missingNewlineOffset(t-1));let n=Math.abs(this._getLineLeftOffset(s)),o=this._textLines[s].length,a=this.__charBounds[s];for(let t=0;t<o;t++){let i=n+a[t].kernedWidth;if(e.x<=i){Math.abs(e.x-i)<=Math.abs(e.x-n)&&r++;break}n=i,r++}return Math.min(this.flipX?o-r:r,this._text.length)}};const ta="moveCursorUp",ea="moveCursorDown",ia="moveCursorLeft",ra="moveCursorRight",sa="exitEditing",na=(t,e)=>{let i=e.getRetinaScaling();t.setTransform(i,0,0,i,0,0);let r=e.viewportTransform;t.transform(r[0],r[1],r[2],r[3],r[4],r[5])},oa={selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"",cursorDelay:1e3,cursorDuration:600,caching:!0,hiddenTextareaContainer:null,keysMap:{9:sa,27:sa,33:ta,34:ea,35:ra,36:ia,37:ia,38:ta,39:ra,40:ea},keysMapRtl:{9:sa,27:sa,33:ta,34:ea,35:ia,36:ra,37:ra,38:ta,39:ia,40:ea},ctrlKeysMapDown:{65:"cmdAll"},ctrlKeysMapUp:{67:"copy",88:"cut"},_selectionDirection:null,_reSpace:/\s|\r?\n/,inCompositionMode:!1};var aa=class t extends Zo{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}get type(){let t=super.type;return"itext"===t?"i-text":t}constructor(e,i){super(e,{...t.ownDefaults,...i}),this.initBehavior()}_set(t,e){return this.isEditing&&this._savedProps&&t in this._savedProps?(this._savedProps[t]=e,this):("canvas"===t&&(this.canvas instanceof po&&this.canvas.textEditingManager.remove(this),e instanceof po&&e.textEditingManager.add(this)),super._set(t,e))}setSelectionStart(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)}setSelectionEnd(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)}_updateAndFire(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()}_fireSelectionChanged(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})}initDimensions(){this.isEditing&&this.initDelayedCursor(),super.initDimensions()}getSelectionStyles(t=this.selectionStart||0,e=this.selectionEnd,i){return super.getSelectionStyles(t,e,i)}setSelectionStyles(t,e=this.selectionStart||0,i=this.selectionEnd){return super.setSelectionStyles(t,e,i)}get2DCursorLocation(t=this.selectionStart,e){return super.get2DCursorLocation(t,e)}render(t){super.render(t),this.cursorOffsetCache={},this.renderCursorOrSelection()}toCanvasElement(t){let e=this.isEditing;this.isEditing=!1;let i=super.toCanvasElement(t);return this.isEditing=e,i}renderCursorOrSelection(){if(!this.isEditing||!this.canvas)return;let t=this.clearContextTop(!0);if(!t)return;let e,i=this._getCursorBoundaries(),r=this.findAncestorsWithClipPath(),s=r.length>0,n=t;if(s){e=Tt(t.canvas),n=e.getContext("2d"),na(n,this.canvas);let i=this.calcTransformMatrix();n.transform(i[0],i[1],i[2],i[3],i[4],i[5])}if(this.selectionStart!==this.selectionEnd||this.inCompositionMode?this.renderSelection(n,i):this.renderCursor(n,i),s)for(let e of r){let i=e.clipPath,r=Tt(t.canvas),s=r.getContext("2d");if(na(s,this.canvas),!i.absolutePositioned){let t=e.calcTransformMatrix();s.transform(t[0],t[1],t[2],t[3],t[4],t[5])}i.transform(s),i.drawObject(s,!0,{}),this.drawClipPathOnCache(n,i,r)}s&&(t.setTransform(1,0,0,1,0,0),t.drawImage(e,0,0)),this.canvas.contextTopDirty=!0,t.restore()}findAncestorsWithClipPath(){let t=[],e=this;for(;e;)e.clipPath&&t.push(e),e=e.parent;return t}_getCursorBoundaries(t=this.selectionStart,e){let i=this._getLeftOffset(),r=this._getTopOffset(),s=this._getCursorBoundariesOffsets(t,e);return{left:i,top:r,leftOffset:s.left,topOffset:s.top}}_getCursorBoundariesOffsets(t,e){return e?this.__getCursorBoundariesOffsets(t):this.cursorOffsetCache&&"top"in this.cursorOffsetCache?this.cursorOffsetCache:this.cursorOffsetCache=this.__getCursorBoundariesOffsets(t)}__getCursorBoundariesOffsets(t){let e=0,i=0,{charIndex:r,lineIndex:s}=this.get2DCursorLocation(t),{textAlign:n,direction:o}=this;for(let t=0;t<s;t++)e+=this.getHeightOfLine(t);let a=this._getLineLeftOffset(s),l=this.__charBounds[s][r];l&&(i=l.left),0!==this.charSpacing&&r===this._textLines[s].length&&(i-=this._getWidthOfCharSpacing());let h=a+(i>0?i:0);return"rtl"===o&&("right"===n||"justify"===n||"justify-right"===n?h*=-1:"left"===n||"justify-left"===n?h=a-(i>0?i:0):"center"!==n&&"justify-center"!==n||(h=a-(i>0?i:0))),{top:e,left:h}}renderCursorAt(t){this._renderCursor(this.canvas.contextTop,this._getCursorBoundaries(t,!0),t)}renderCursor(t,e){this._renderCursor(t,e,this.selectionStart)}getCursorRenderingData(t=this.selectionStart,e=this._getCursorBoundaries(t)){let i=this.get2DCursorLocation(t),r=i.lineIndex,s=i.charIndex>0?i.charIndex-1:0,n=this.getValueOfPropertyAt(r,s,"fontSize"),o=this.getObjectScaling().x*this.canvas.getZoom(),a=this.cursorWidth/o,l=this.getValueOfPropertyAt(r,s,"deltaY"),h=e.topOffset+(1-this._fontSizeFraction)*this.getHeightOfLine(r)/this.lineHeight-n*(1-this._fontSizeFraction);return{color:this.cursorColor||this.getValueOfPropertyAt(r,s,"fill"),opacity:this._currentCursorOpacity,left:e.left+e.leftOffset-a/2,top:h+e.top+l,width:a,height:n}}_renderCursor(t,e,i){let{color:r,opacity:s,left:n,top:o,width:a,height:l}=this.getCursorRenderingData(i,e);t.fillStyle=r,t.globalAlpha=s,t.fillRect(n,o,a,l)}renderSelection(t,e){let i={selectionStart:this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,selectionEnd:this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd};this._renderSelection(t,i,e)}renderDragSourceEffect(){let t=this.draggableTextDelegate.getDragStartSelection();this._renderSelection(this.canvas.contextTop,t,this._getCursorBoundaries(t.selectionStart,!0))}renderDropTargetEffect(t){let e=this.getSelectionStartFromPointer(t);this.renderCursorAt(e)}_renderSelection(t,e,i){let{textAlign:r,direction:s}=this,n=e.selectionStart,o=e.selectionEnd,a=r.includes(ki),l=this.get2DCursorLocation(n),h=this.get2DCursorLocation(o),c=l.lineIndex,u=h.lineIndex,d=l.charIndex<0?0:l.charIndex,g=h.charIndex<0?0:h.charIndex;for(let e=c;e<=u;e++){let n=this._getLineLeftOffset(e)||0,o=this.getHeightOfLine(e),l=0,h=0;if(e===c&&(l=this.__charBounds[c][d].left),e>=c&&e<u)h=a&&!this.isEndOfWrapping(e)?this.width:this.getLineWidth(e)||5;else if(e===u)if(0===g)h=this.__charBounds[u][g].left;else{let t=this._getWidthOfCharSpacing();h=this.__charBounds[u][g-1].left+this.__charBounds[u][g-1].width-t}let f=o;(this.lineHeight<1||e===u&&this.lineHeight>1)&&(o/=this.lineHeight);let p=i.left+n+l,m=o,y=0,b=h-l;this.inCompositionMode?(t.fillStyle=this.compositionColor||"black",m=1,y=o):t.fillStyle=this.selectionColor,"rtl"===s&&("right"===r||"justify"===r||"justify-right"===r?p=this.width-p-b:"left"===r||"justify-left"===r?p=i.left+n-h:"center"!==r&&"justify-center"!==r||(p=i.left+n-h)),t.fillRect(p,i.top+i.topOffset+y,b,m),i.topOffset+=f}}getCurrentCharFontSize(){let t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")}getCurrentCharColor(){let t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,it)}_getCurrentCharIndex(){let t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}dispose(){this.exitEditingImpl(),this.draggableTextDelegate.dispose(),super.dispose()}};p(aa,"ownDefaults",oa),p(aa,"type","IText"),at.setClass(aa),at.setClass(aa,"i-text");var la=class t extends aa{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(e,{...t.ownDefaults,...i})}static createControls(){return{controls:fs()}}initDimensions(){this.initialized&&(this.isEditing&&this.initDelayedCursor(),this._clearCache(),this.dynamicMinWidth=0,this._styleMap=this._generateStyleMap(this._splitText()),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this.textAlign.includes("justify")&&this.enlargeSpaces(),this.height=this.calcTextHeight())}_generateStyleMap(t){let e=0,i=0,r=0,s={};for(let n=0;n<t.graphemeLines.length;n++)"\n"===t.graphemeText[r]&&n>0?(i=0,r++,e++):!this.splitByGrapheme&&this._reSpaceAndTab.test(t.graphemeText[r])&&n>0&&(i++,r++),s[n]={line:e,offset:i},r+=t.graphemeLines[n].length,i+=t.graphemeLines[n].length;return s}styleHas(t,e){if(this._styleMap&&!this.isWrapping){let t=this._styleMap[e];t&&(e=t.line)}return super.styleHas(t,e)}isEmptyStyles(t){if(!this.styles)return!0;let e,i,r=0,s=!1,n=this._styleMap[t],o=this._styleMap[t+1];n&&(t=n.line,r=n.offset),o&&(e=o.line,s=e===t,i=o.offset);let a=void 0===t?this.styles:{line:this.styles[t]};for(let t in a)for(let e in a[t]){let n=parseInt(e,10);if(n>=r&&(!s||n<i))for(let i in a[t][e])return!1}return!0}_getStyleDeclaration(t,e){if(this._styleMap&&!this.isWrapping){let i=this._styleMap[t];if(!i)return{};t=i.line,e=i.offset+e}return super._getStyleDeclaration(t,e)}_setStyleDeclaration(t,e,i){let r=this._styleMap[t];super._setStyleDeclaration(r.line,r.offset+e,i)}_deleteStyleDeclaration(t,e){let i=this._styleMap[t];super._deleteStyleDeclaration(i.line,i.offset+e)}_getLineStyle(t){let e=this._styleMap[t];return!!this.styles[e.line]}_setLineStyle(t){let e=this._styleMap[t];super._setLineStyle(e.line)}_wrapText(t,e){this.isWrapping=!0;let i=this.getGraphemeDataForRender(t),r=[];for(let t=0;t<i.wordsData.length;t++)r.push(...this._wrapLine(t,e,i));return this.isWrapping=!1,r}getGraphemeDataForRender(t){let e=this.splitByGrapheme,i=e?"":" ",r=0;return{wordsData:t.map((t,s)=>{let n=0,o=e?this.graphemeSplit(t):this.wordSplit(t);return 0===o.length?[{word:[],width:0}]:o.map(t=>{let o=e?[t]:this.graphemeSplit(t),a=this._measureWord(o,s,n);return r=Math.max(a,r),n+=o.length+i.length,{word:o,width:a}})}),largestWordWidth:r}}_measureWord(t,e,i=0){let r,s=0;for(let n=0,o=t.length;n<o;n++)s+=this._getGraphemeBox(t[n],e,n+i,r,!0).kernedWidth,r=t[n];return s}wordSplit(t){return t.split(this._wordJoiners)}_wrapLine(t,e,{largestWordWidth:i,wordsData:r},s=0){let n=this._getWidthOfCharSpacing(),o=this.splitByGrapheme,a=[],l=o?"":" ",h=0,c=[],u=0,d=0,g=!0;e-=s;let f,p=Math.max(e,i,this.dynamicMinWidth),m=r[t];for(f=0;f<m.length;f++){let{word:e,width:i}=m[f];u+=e.length,h+=d+i-n,h>p&&!g?(a.push(c),c=[],h=i,g=!0):h+=n,g||o||c.push(l),c=c.concat(e),d=o?0:this._measureWord([l],t,u),u++,g=!1}return f&&a.push(c),i+s>this.dynamicMinWidth&&(this.dynamicMinWidth=i-n+s),a}isEndOfWrapping(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line}missingNewlineOffset(t,e){return this.splitByGrapheme&&!e?+!!this.isEndOfWrapping(t):1}_splitTextIntoLines(t){let e=super._splitTextIntoLines(t),i=this._wrapText(e.lines,this.width),r=Array(i.length);for(let t=0;t<i.length;t++)r[t]=i[t].join("");return e.lines=r,e.graphemeLines=i,e}getMinWidth(){return Math.max(this.minWidth,this.dynamicMinWidth)}_removeExtraneousStyles(){let t=new Map;for(let e in this._styleMap){let i=parseInt(e,10);if(this._textLines[i]){let i=this._styleMap[e].line;t.set(`${i}`,!0)}}for(let e in this.styles)t.has(e)||delete this.styles[e]}toObject(t=[]){return super.toObject(["minWidth","splitByGrapheme",...t])}};p(la,"type","Textbox"),p(la,"textLayoutProperties",[...aa.textLayoutProperties,"width"]),p(la,"ownDefaults",{minWidth:20,dynamicMinWidth:2,lockScalingFlip:!0,noScaleCache:!1,_wordJoiners:/[ \t\r]/,splitByGrapheme:!1}),at.setClass(la);var ha=class extends rn{shouldPerformLayout(t){return!!t.target.clipPath&&super.shouldPerformLayout(t)}shouldLayoutClipPath(){return!1}calcLayoutResult(t,e){let{target:i}=t,{clipPath:r,group:s}=i;if(!r||!this.shouldPerformLayout(t))return;let{width:n,height:o}=Se(en(i,r)),a=new gt(n,o);if(r.absolutePositioned)return{center:Pe(r.getRelativeCenterPoint(),void 0,s?s.calcTransformMatrix():void 0),size:a};{let s=r.getRelativeCenterPoint().transform(i.calcOwnMatrix(),!0);if(this.shouldPerformLayout(t)){let{center:i=new gt,correction:r=new gt}=this.calcBoundingBox(e,t)||{};return{center:i.add(s),correction:r.subtract(s),size:a}}return{center:i.getRelativeCenterPoint().add(s),size:a}}}};p(ha,"type","clip-path"),at.setClass(ha);var ca=class extends rn{getInitialSize({target:t},{size:e}){return new gt(t.width||e.x,t.height||e.y)}};p(ca,"type","fixed"),at.setClass(ca);var ua=class extends on{subscribeTargets(t){let e=t.target;t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{t.layoutManager.subscribeTargets({target:t,targets:[e]})})}unsubscribeTargets(t){let e=t.target,i=e.getObjects();t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{!i.some(e=>e.parent===t)&&t.layoutManager.unsubscribeTargets({target:t,targets:[e]})})}},da=class t extends ln{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(i);let{left:r,top:s,layoutManager:n}=i;this.groupInit(e,{left:r,top:s,layoutManager:n??new ua})}_shouldSetNestedCoords(){return!0}__objectSelectionMonitor(){}multiSelectAdd(...t){"selection-order"===this.multiSelectionStacking?this.add(...t):t.forEach(t=>{let e=this._objects.findIndex(e=>e.isInFrontOf(t)),i=-1===e?this.size():e;this.insertAt(i,t)})}canEnterGroup(t){return this.getObjects().some(e=>e.isDescendantOf(t)||t.isDescendantOf(e))?(b("error","ActiveSelection: circular object trees are not supported, this call has no effect"),!1):super.canEnterGroup(t)}enterGroup(t,e){t.parent&&t.parent===t.group?t.parent._exitGroup(t):t.group&&t.parent!==t.group&&t.group.remove(t),this._enterGroup(t,e)}exitGroup(t,e){this._exitGroup(t,e),t.parent&&t.parent._enterGroup(t,!0)}_onAfterObjectsChange(t,e){super._onAfterObjectsChange(t,e);let i=new Set;e.forEach(t=>{let{parent:e}=t;e&&i.add(e)}),"removed"===t?i.forEach(t=>{t._onAfterObjectsChange(tn,e)}):i.forEach(t=>{t._set("dirty",!0)})}onDeselect(){return this.removeAll(),!1}toString(){return`#<ActiveSelection: (${this.complexity()})>`}shouldCache(){return!1}isOnACache(){return!1}_renderControls(t,e,i){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;let r={hasControls:!1,...i,forActiveSelection:!0};for(let e=0;e<this._objects.length;e++)this._objects[e]._renderControls(t,r);super._renderControls(t,e),t.restore()}};p(da,"type","ActiveSelection"),p(da,"ownDefaults",{multiSelectionStacking:"canvas-stacking"}),at.setClass(da),at.setClass(da,"activeSelection");var ga=class{constructor(){p(this,"resources",{})}applyFilters(t,e,i,r,s){let n=s.getContext("2d",{willReadFrequently:!0,desynchronized:!0});if(!n)return;n.drawImage(e,0,0,i,r);let o={sourceWidth:i,sourceHeight:r,imageData:n.getImageData(0,0,i,r),originalEl:e,originalImageData:n.getImageData(0,0,i,r),canvasEl:s,ctx:n,filterBackend:this};t.forEach(t=>{t.applyTo(o)});let{imageData:a}=o;return a.width===i&&a.height===r||(s.width=a.width,s.height=a.height),n.putImageData(a,0,0),o}},fa=class{constructor({tileSize:t=y.textureSize}={}){p(this,"aPosition",new Float32Array([0,0,0,1,1,0,1,1])),p(this,"resources",{}),this.tileSize=t,this.setupGLContext(t,t),this.captureGPUInfo()}setupGLContext(t,e){this.dispose(),this.createWebGLCanvas(t,e)}createWebGLCanvas(t,e){let i=Tt({width:t,height:e}),r=i.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,depth:!1,stencil:!1,antialias:!1});r&&(r.clearColor(0,0,0,0),this.canvas=i,this.gl=r)}applyFilters(t,e,i,r,s,n){let o,a=this.gl,l=s.getContext("2d");if(!a||!l)return;n&&(o=this.getCachedTexture(n,e));let h={originalWidth:e.width||e.naturalWidth||0,originalHeight:e.height||e.naturalHeight||0,sourceWidth:i,sourceHeight:r,destinationWidth:i,destinationHeight:r,context:a,sourceTexture:this.createTexture(a,i,r,o?void 0:e),targetTexture:this.createTexture(a,i,r),originalTexture:o||this.createTexture(a,i,r,o?void 0:e),passes:t.length,webgl:!0,aPosition:this.aPosition,programCache:this.programCache,pass:0,filterBackend:this,targetCanvas:s},c=a.createFramebuffer();return a.bindFramebuffer(a.FRAMEBUFFER,c),t.forEach(t=>{t&&t.applyTo(h)}),function(t){let e=t.targetCanvas,i=e.width,r=e.height,s=t.destinationWidth,n=t.destinationHeight;i===s&&r===n||(e.width=s,e.height=n)}(h),this.copyGLTo2D(a,h),a.bindTexture(a.TEXTURE_2D,null),a.deleteTexture(h.sourceTexture),a.deleteTexture(h.targetTexture),a.deleteFramebuffer(c),l.setTransform(1,0,0,1,0,0),h}dispose(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()}clearWebGLCaches(){this.programCache={},this.textureCache={}}createTexture(t,e,i,r,s){let{NEAREST:n,TEXTURE_2D:o,RGBA:a,UNSIGNED_BYTE:l,CLAMP_TO_EDGE:h,TEXTURE_MAG_FILTER:c,TEXTURE_MIN_FILTER:u,TEXTURE_WRAP_S:d,TEXTURE_WRAP_T:g}=t,f=t.createTexture();return t.bindTexture(o,f),t.texParameteri(o,c,s||n),t.texParameteri(o,u,s||n),t.texParameteri(o,d,h),t.texParameteri(o,g,h),r?t.texImage2D(o,0,a,a,l,r):t.texImage2D(o,0,a,e,i,0,a,l,null),f}getCachedTexture(t,e,i){let{textureCache:r}=this;if(r[t])return r[t];{let s=this.createTexture(this.gl,e.width,e.height,e,i);return s&&(r[t]=s),s}}evictCachesForKey(t){this.textureCache[t]&&(this.gl.deleteTexture(this.textureCache[t]),delete this.textureCache[t])}copyGLTo2D(t,e){let i=t.canvas,r=e.targetCanvas,s=r.getContext("2d");if(!s)return;s.translate(0,r.height),s.scale(1,-1);let n=i.height-r.height;s.drawImage(i,0,n,r.width,r.height,0,0,r.width,r.height)}copyGLTo2DPutImageData(t,e){let i=e.targetCanvas.getContext("2d"),r=e.destinationWidth,s=e.destinationHeight,n=r*s*4;if(!i)return;let o=new Uint8Array(this.imageBuffer,0,n),a=new Uint8ClampedArray(this.imageBuffer,0,n);t.readPixels(0,0,r,s,t.RGBA,t.UNSIGNED_BYTE,o);let l=new ImageData(a,r,s);i.putImageData(l,0,0)}captureGPUInfo(){if(this.gpuInfo)return this.gpuInfo;let t=this.gl,e={renderer:"",vendor:""};if(!t)return e;let i=t.getExtension("WEBGL_debug_renderer_info");if(i){let r=t.getParameter(i.UNMASKED_RENDERER_WEBGL),s=t.getParameter(i.UNMASKED_VENDOR_WEBGL);r&&(e.renderer=r.toLowerCase()),s&&(e.vendor=s.toLowerCase())}return this.gpuInfo=e,e}};let pa;function ma(t=!0){return!pa&&t&&(pa=function(){let{WebGLProbe:t}=T();return t.queryWebGL(Ct()),y.enableGLFiltering&&t.isSupported(y.textureSize)?new fa({tileSize:y.textureSize}):new ga}()),pa}const ya=["cropX","cropY"];var ba=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(),p(this,"_lastScaleX",1),p(this,"_lastScaleY",1),p(this,"_filterScalingX",1),p(this,"_filterScalingY",1),this.filters=[],Object.assign(this,t.ownDefaults),this.setOptions(i),this.cacheKey=`texture${xt()}`,this.setElement("string"==typeof e?(this.canvas&&ne(this.canvas.getElement())||O()).getElementById(e):e,i)}getElement(){return this._element}setElement(t,e={}){this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(e),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){let e=ma(!1);e instanceof fa&&e.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach(t=>{let e=this[t];e&&T().dispose(e),this[t]=void 0})}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){let t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;let e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,-i),t.lineTo(e,-i),t.lineTo(e,i),t.lineTo(-e,i),t.lineTo(-e,-i),t.closePath()}toObject(t=[]){let e=[];return this.filters.forEach(t=>{t&&e.push(t.toObject())}),{...super.toObject([...ya,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:e,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width<this._element.width||this.height<this._element.height}_toSVG(){let t=[],e=this._element,i=-this.width/2,r=-this.height/2,s=[],n=[],o="",a="";if(!e)return[];if(this.hasCrop()){let t=xt();s.push('<clipPath id="imageCrop_'+t+'">\n','\t<rect x="'+i+'" y="'+r+'" width="'+fe(this.width)+'" height="'+fe(this.height)+'" />\n',"</clipPath>\n"),o=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t<image ","COMMON_PARTS",`xlink:href="${fe(this.getSrc(!0))}" x="${i-this.cropX}" y="${r-this.cropY}" width="${e.width||e.naturalWidth}" height="${e.height||e.naturalHeight}"${a}${o}></image>\n`),this.stroke||this.strokeDashArray){let t=this.fill;this.fill=null,n=[`\t<rect x="${i}" y="${r}" width="${fe(this.width)}" height="${fe(this.height)}" style="${this.getSvgStyles()}" />\n`],this.fill=t}return s="fill"===this.paintFirst?s.concat(t,n):s.concat(n,t),s}getSrc(t){let e=t?this._element:this._originalElement;return e?e.toDataURL?e.toDataURL():this.srcFromAttribute?e.getAttribute("src")||"":e.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t,{crossOrigin:e,signal:i}={}){return Gt(t,{crossOrigin:e,signal:i}).then(t=>{void 0!==e&&this.set({crossOrigin:e}),this.setElement(t)})}toString(){return`#<Image: { src: "${this.getSrc()}" }>`}applyResizeFilters(){let t=this.resizeFilter,e=this.minimumScaleTrigger,i=this.getTotalObjectScaling(),r=i.x,s=i.y,n=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||r>e&&s>e)return this._element=n,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=r,void(this._lastScaleY=s);let o=Tt(n),{width:a,height:l}=n;this._element=o,this._lastScaleX=t.scaleX=r,this._lastScaleY=t.scaleY=s,ma().applyFilters([t],n,a,l,this._element),this._filterScalingX=o.width/this._originalElement.width,this._filterScalingY=o.height/this._originalElement.height}applyFilters(t=this.filters||[]){if(t=t.filter(t=>t&&!t.isNeutralState()),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);let e=this._originalElement,i=e.naturalWidth||e.width,r=e.naturalHeight||e.height;if(this._element===this._originalElement){let t=Tt({width:i,height:r});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,i,r),this._lastScaleX=1,this._lastScaleY=1);ma().applyFilters(t,this._originalElement,i,r,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){let e=this._element;if(!e)return;let i=this._filterScalingX,r=this._filterScalingY,s=this.width,n=this.height,o=Math.max(this.cropX,0),a=Math.max(this.cropY,0),l=e.naturalWidth||e.width,h=e.naturalHeight||e.height,c=o*i,u=a*r,d=Math.min(s*i,l-c),g=Math.min(n*r,h-u),f=-s/2,p=-n/2,m=Math.min(s,l/i-o),y=Math.min(n,h/r-a);e&&t.drawImage(e,c,u,d,g,f,p,m,y)}_needsResize(){let t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight({width:t,height:e}={}){let i=this.getOriginalSize();this.width=t||i.width,this.height=e||i.height}parsePreserveAspectRatioAttribute(){let t,e=mi(this.preserveAspectRatio||""),i=this.width,r=this.height,s={width:i,height:r},n=this._element.width,o=this._element.height,a=1,l=1,h=0,c=0,u=0,d=0;return!e||"none"===e.alignX&&"none"===e.alignY?(a=i/n,l=r/o):("meet"===e.meetOrSlice&&(a=l=cn(this._element,s),t=(i-n*a)/2,"Min"===e.alignX&&(h=-t),"Max"===e.alignX&&(h=t),t=(r-o*l)/2,"Min"===e.alignY&&(c=-t),"Max"===e.alignY&&(c=t)),"slice"===e.meetOrSlice&&(a=l=un(this._element,s),t=n-i/a,"Mid"===e.alignX&&(u=t/2),"Max"===e.alignX&&(u=t),t=o-r/l,"Mid"===e.alignY&&(d=t/2),"Max"===e.alignY&&(d=t),n=i/a,o=r/l)),{width:n,height:o,scaleX:a,scaleY:l,offsetLeft:h,offsetTop:c,cropX:u,cropY:d}}static fromObject({filters:t,resizeFilter:e,src:i,crossOrigin:r,type:s,...n},o){return Promise.all([Gt(i,{...o,crossOrigin:r}),t&&Ut(t,o),e?Ut([e],o):[],qt(n,o)]).then(([t,e=[],[r],s={}])=>new this(t,{...n,src:i,filters:e,resizeFilter:r,...s}))}static fromURL(t,{crossOrigin:e=null,signal:i}={},r){return Gt(t,{crossOrigin:e,signal:i}).then(t=>new this(t,r))}static async fromElement(t,e={},i){let r=Ks(t,this.ATTRIBUTE_NAMES,i);return this.fromURL(r["xlink:href"]||r.href,e,r).catch(t=>(b("log","Unable to parse Image",t),null))}};p(ba,"type","Image"),p(ba,"cacheProperties",[...Xi,...ya]),p(ba,"ownDefaults",{strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0}),p(ba,"ATTRIBUTE_NAMES",[...Ds,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),at.setClass(ba),at.setSVGClass(ba),_n(["pattern","defs","symbol","metadata","clipPath","mask","desc"]);const _a=t=>void 0!==t.webgl,va="precision highp float",xa=`\n    ${va};\n    varying vec2 vTexCoord;\n    uniform sampler2D uTexture;\n    void main() {\n      gl_FragColor = texture2D(uTexture, vTexCoord);\n    }`,Ca=new RegExp(va,"g");var wa=class{get type(){return this.constructor.type}constructor({type:t,...e}={}){Object.assign(this,this.constructor.defaults,e)}getFragmentSource(){return xa}getVertexSource(){return"\n    attribute vec2 aPosition;\n    varying vec2 vTexCoord;\n    void main() {\n      vTexCoord = aPosition;\n      gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n    }"}createProgram(t,e=this.getFragmentSource(),i=this.getVertexSource()){let{WebGLProbe:{GLPrecision:r="highp"}}=T();"highp"!==r&&(e=e.replace(Ca,va.replace("highp",r)));let s=t.createShader(t.VERTEX_SHADER),n=t.createShader(t.FRAGMENT_SHADER),o=t.createProgram();if(!s||!n||!o)throw new _("Vertex, fragment shader or program creation error");if(t.shaderSource(s,i),t.compileShader(s),!t.getShaderParameter(s,t.COMPILE_STATUS))throw new _(`Vertex shader compile error for ${this.type}: ${t.getShaderInfoLog(s)}`);if(t.shaderSource(n,e),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new _(`Fragment shader compile error for ${this.type}: ${t.getShaderInfoLog(n)}`);if(t.attachShader(o,s),t.attachShader(o,n),t.linkProgram(o),!t.getProgramParameter(o,t.LINK_STATUS))throw new _(`Shader link error for "${this.type}" ${t.getProgramInfoLog(o)}`);let a=this.getUniformLocations(t,o)||{};return a.uStepW=t.getUniformLocation(o,"uStepW"),a.uStepH=t.getUniformLocation(o,"uStepH"),{program:o,attributeLocations:this.getAttributeLocations(t,o),uniformLocations:a}}getAttributeLocations(t,e){return{aPosition:t.getAttribLocation(e,"aPosition")}}getUniformLocations(t,e){let i=this.constructor.uniformLocations,r={};for(let s=0;s<i.length;s++)r[i[s]]=t.getUniformLocation(e,i[s]);return r}sendAttributeData(t,e,i){let r=e.aPosition,s=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,s),t.enableVertexAttribArray(r),t.vertexAttribPointer(r,2,t.FLOAT,!1,0,0),t.bufferData(t.ARRAY_BUFFER,i,t.STATIC_DRAW)}_setupFrameBuffer(t){let e=t.context;if(t.passes>1){let i=t.destinationWidth,r=t.destinationHeight;t.sourceWidth===i&&t.sourceHeight===r||(e.deleteTexture(t.targetTexture),t.targetTexture=t.filterBackend.createTexture(e,i,r)),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.targetTexture,0)}else e.bindFramebuffer(e.FRAMEBUFFER,null),e.finish()}_swapTextures(t){t.passes--,t.pass++;let e=t.targetTexture;t.targetTexture=t.sourceTexture,t.sourceTexture=e}isNeutralState(t){return!1}applyTo(t){_a(t)?(this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){}getCacheKey(){return this.type}retrieveShader(t){let e=this.getCacheKey();return t.programCache[e]||(t.programCache[e]=this.createProgram(t.context)),t.programCache[e]}applyToWebGL(t){let e=t.context,i=this.retrieveShader(t);0===t.pass&&t.originalTexture?e.bindTexture(e.TEXTURE_2D,t.originalTexture):e.bindTexture(e.TEXTURE_2D,t.sourceTexture),e.useProgram(i.program),this.sendAttributeData(e,i.attributeLocations,t.aPosition),e.uniform1f(i.uniformLocations.uStepW,1/t.sourceWidth),e.uniform1f(i.uniformLocations.uStepH,1/t.sourceHeight),this.sendUniformData(e,i.uniformLocations),e.viewport(0,0,t.destinationWidth,t.destinationHeight),e.drawArrays(e.TRIANGLE_STRIP,0,4)}bindAdditionalTexture(t,e,i){t.activeTexture(i),t.bindTexture(t.TEXTURE_2D,e),t.activeTexture(t.TEXTURE0)}unbindAdditionalTexture(t,e){t.activeTexture(e),t.bindTexture(t.TEXTURE_2D,null),t.activeTexture(t.TEXTURE0)}sendUniformData(t,e){}createHelpLayer(t){if(!t.helpLayer){let{sourceWidth:e,sourceHeight:i}=t;t.helpLayer=Tt({width:e,height:i})}}toObject(){let t=Object.keys(this.constructor.defaults||{});return{type:this.type,...t.reduce((t,e)=>(t[e]=this[e],t),{})}}toJSON(){return this.toObject()}static async fromObject({type:t,...e},i){return new this(e)}};p(wa,"type","BaseFilter"),p(wa,"uniformLocations",[]);const Sa={multiply:"gl_FragColor.rgb *= uColor.rgb;\n",screen:"gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n",add:"gl_FragColor.rgb += uColor.rgb;\n",difference:"gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n",subtract:"gl_FragColor.rgb -= uColor.rgb;\n",lighten:"gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n",darken:"gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n",exclusion:"gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n",overlay:"\n    if (uColor.r < 0.5) {\n      gl_FragColor.r *= 2.0 * uColor.r;\n    } else {\n      gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n    }\n    if (uColor.g < 0.5) {\n      gl_FragColor.g *= 2.0 * uColor.g;\n    } else {\n      gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n    }\n    if (uColor.b < 0.5) {\n      gl_FragColor.b *= 2.0 * uColor.b;\n    } else {\n      gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n    }\n    ",tint:"\n    gl_FragColor.rgb *= (1.0 - uColor.a);\n    gl_FragColor.rgb += uColor.rgb;\n    "};var Ta=class extends wa{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return`\n      precision highp float;\n      uniform sampler2D uTexture;\n      uniform vec4 uColor;\n      varying vec2 vTexCoord;\n      void main() {\n        vec4 color = texture2D(uTexture, vTexCoord);\n        gl_FragColor = color;\n        if (color.a > 0.0) {\n          ${Sa[this.mode]}\n        }\n      }\n      `}applyTo2d({imageData:{data:t}}){let e=new gi(this.color).getSource(),i=this.alpha,r=e[0]*i,s=e[1]*i,n=e[2]*i,o=1-i;for(let e=0;e<t.length;e+=4){let i,a,l,h=t[e],c=t[e+1],u=t[e+2];switch(this.mode){case"multiply":i=h*r/255,a=c*s/255,l=u*n/255;break;case"screen":i=255-(255-h)*(255-r)/255,a=255-(255-c)*(255-s)/255,l=255-(255-u)*(255-n)/255;break;case"add":i=h+r,a=c+s,l=u+n;break;case"difference":i=Math.abs(h-r),a=Math.abs(c-s),l=Math.abs(u-n);break;case"subtract":i=h-r,a=c-s,l=u-n;break;case"darken":i=Math.min(h,r),a=Math.min(c,s),l=Math.min(u,n);break;case"lighten":i=Math.max(h,r),a=Math.max(c,s),l=Math.max(u,n);break;case"overlay":i=r<128?2*h*r/255:255-2*(255-h)*(255-r)/255,a=s<128?2*c*s/255:255-2*(255-c)*(255-s)/255,l=n<128?2*u*n/255:255-2*(255-u)*(255-n)/255;break;case"exclusion":i=r+h-2*r*h/255,a=s+c-2*s*c/255,l=n+u-2*n*u/255;break;case"tint":i=r+h*o,a=s+c*o,l=n+u*o}t[e]=i,t[e+1]=a,t[e+2]=l}}sendUniformData(t,e){let i=new gi(this.color).getSource();i[0]=this.alpha*i[0]/255,i[1]=this.alpha*i[1]/255,i[2]=this.alpha*i[2]/255,i[3]=this.alpha,t.uniform4fv(e.uColor,i)}};p(Ta,"defaults",{color:"#F95C63",mode:"multiply",alpha:1}),p(Ta,"type","BlendColor"),p(Ta,"uniformLocations",["uColor"]),at.setClass(Ta);const Oa={multiply:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform sampler2D uImage;\n    uniform vec4 uColor;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      vec4 color2 = texture2D(uImage, vTexCoord2);\n      color.rgba *= color2.rgba;\n      gl_FragColor = color;\n    }\n    ",mask:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform sampler2D uImage;\n    uniform vec4 uColor;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      vec4 color2 = texture2D(uImage, vTexCoord2);\n      color.a = color2.a;\n      gl_FragColor = color;\n    }\n    "};var ka=class extends wa{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return Oa[this.mode]}getVertexSource(){return"\n    attribute vec2 aPosition;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    uniform mat3 uTransformMatrix;\n    void main() {\n      vTexCoord = aPosition;\n      vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n      gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n    }\n    "}applyToWebGL(t){let e=t.context,i=this.createTexture(t.filterBackend,this.image);this.bindAdditionalTexture(e,i,e.TEXTURE1),super.applyToWebGL(t),this.unbindAdditionalTexture(e,e.TEXTURE1)}createTexture(t,e){return t.getCachedTexture(e.cacheKey,e.getElement())}calculateMatrix(){let t=this.image,{width:e,height:i}=t.getElement();return[1/t.scaleX,0,0,0,1/t.scaleY,0,-t.left/e,-t.top/i,1]}applyTo2d({imageData:{data:t,width:e,height:i},filterBackend:{resources:r}}){let s=this.image;r.blendImage||(r.blendImage=Ct());let n=r.blendImage,o=n.getContext("2d");n.width!==e||n.height!==i?(n.width=e,n.height=i):o.clearRect(0,0,e,i),o.setTransform(s.scaleX,0,0,s.scaleY,s.left,s.top),o.drawImage(s.getElement(),0,0,e,i);let a=o.getImageData(0,0,e,i).data;for(let e=0;e<t.length;e+=4){let i=t[e],r=t[e+1],s=t[e+2],n=t[e+3],o=a[e],l=a[e+1],h=a[e+2],c=a[e+3];switch(this.mode){case"multiply":t[e]=i*o/255,t[e+1]=r*l/255,t[e+2]=s*h/255,t[e+3]=n*c/255;break;case"mask":t[e+3]=c}}}sendUniformData(t,e){let i=this.calculateMatrix();t.uniform1i(e.uImage,1),t.uniformMatrix3fv(e.uTransformMatrix,!1,i)}toObject(){return{...super.toObject(),image:this.image&&this.image.toObject()}}static async fromObject({type:t,image:e,...i},r){return ba.fromObject(e,r).then(t=>new this({...i,image:t}))}};p(ka,"type","BlendImage"),p(ka,"defaults",{mode:"multiply",alpha:1}),p(ka,"uniformLocations",["uTransformMatrix","uImage"]),at.setClass(ka);var Da=class extends wa{getFragmentSource(){return"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform vec2 uDelta;\n    varying vec2 vTexCoord;\n    const float nSamples = 15.0;\n    vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n    float random(vec3 scale) {\n      /* use the fragment position for a different seed per-pixel */\n      return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n    }\n    void main() {\n      vec4 color = vec4(0.0);\n      float totalC = 0.0;\n      float totalA = 0.0;\n      float offset = random(v3offset);\n      for (float t = -nSamples; t <= nSamples; t++) {\n        float percent = (t + offset - 0.5) / nSamples;\n        vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n        float weight = 1.0 - abs(percent);\n        float alpha = weight * sample.a;\n        color.rgb += sample.rgb * alpha;\n        color.a += alpha;\n        totalA += weight;\n        totalC += alpha;\n      }\n      gl_FragColor.rgb = color.rgb / totalC;\n      gl_FragColor.a = color.a / totalA;\n    }\n  "}applyTo(t){_a(t)?(this.aspectRatio=t.sourceWidth/t.sourceHeight,t.passes++,this._setupFrameBuffer(t),this.horizontal=!0,this.applyToWebGL(t),this._swapTextures(t),this._setupFrameBuffer(t),this.horizontal=!1,this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d({imageData:{data:t,width:e,height:i}}){this.aspectRatio=e/i,this.horizontal=!0;let r=this.getBlurValue()*e,s=new Uint8ClampedArray(t),n=4*e;for(let e=0;e<t.length;e+=4){let i=0,o=0,a=0,l=0,h=0,c=e-e%n,u=c+n;for(let s=-14;s<15;s++){let n=s/15,d=4*Math.floor(r*n),g=1-Math.abs(n),f=e+d;f<c?f=c:f>u&&(f=u);let p=t[f+3]*g;i+=t[f]*p,o+=t[f+1]*p,a+=t[f+2]*p,l+=p,h+=g}s[e]=i/l,s[e+1]=o/l,s[e+2]=a/l,s[e+3]=l/h}this.horizontal=!1,r=this.getBlurValue()*i;for(let e=0;e<s.length;e+=4){let i=0,o=0,a=0,l=0,h=0,c=e%n,u=s.length-n+c;for(let t=-14;t<15;t++){let d=t/15,g=Math.floor(r*d)*n,f=1-Math.abs(d),p=e+g;p<c?p=c:p>u&&(p=u);let m=s[p+3]*f;i+=s[p]*m,o+=s[p+1]*m,a+=s[p+2]*m,l+=m,h+=f}t[e]=i/l,t[e+1]=o/l,t[e+2]=a/l,t[e+3]=l/h}}sendUniformData(t,e){let i=this.chooseRightDelta();t.uniform2fv(e.uDelta,i)}isNeutralState(){return 0===this.blur}getBlurValue(){let t=1,{horizontal:e,aspectRatio:i}=this;return e?i>1&&(t=1/i):i<1&&(t=i),t*this.blur*.12}chooseRightDelta(){let t=this.getBlurValue();return this.horizontal?[t,0]:[0,t]}};p(Da,"type","Blur"),p(Da,"defaults",{blur:0}),p(Da,"uniformLocations",["uDelta"]),at.setClass(Da);var Ma=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uBrightness;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color.rgb += uBrightness;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=Math.round(255*this.brightness);for(let i=0;i<t.length;i+=4)t[i]+=e,t[i+1]+=e,t[i+2]+=e}isNeutralState(){return 0===this.brightness}sendUniformData(t,e){t.uniform1f(e.uBrightness,this.brightness)}};p(Ma,"type","Brightness"),p(Ma,"defaults",{brightness:0}),p(Ma,"uniformLocations",["uBrightness"]),at.setClass(Ma);const ja={matrix:[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],colorsOnly:!0};var Ea=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  varying vec2 vTexCoord;\n  uniform mat4 uColorMatrix;\n  uniform vec4 uConstants;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color *= uColorMatrix;\n    color += uConstants;\n    gl_FragColor = color;\n  }"}applyTo2d(t){let e=t.imageData.data,i=this.matrix,r=this.colorsOnly;for(let t=0;t<e.length;t+=4){let s=e[t],n=e[t+1],o=e[t+2];if(e[t]=s*i[0]+n*i[1]+o*i[2]+255*i[4],e[t+1]=s*i[5]+n*i[6]+o*i[7]+255*i[9],e[t+2]=s*i[10]+n*i[11]+o*i[12]+255*i[14],!r){let r=e[t+3];e[t]+=r*i[3],e[t+1]+=r*i[8],e[t+2]+=r*i[13],e[t+3]=s*i[15]+n*i[16]+o*i[17]+r*i[18]+255*i[19]}}}sendUniformData(t,e){let i=this.matrix,r=[i[0],i[1],i[2],i[3],i[5],i[6],i[7],i[8],i[10],i[11],i[12],i[13],i[15],i[16],i[17],i[18]],s=[i[4],i[9],i[14],i[19]];t.uniformMatrix4fv(e.uColorMatrix,!1,r),t.uniform4fv(e.uConstants,s)}toObject(){return{...super.toObject(),matrix:[...this.matrix]}}};function Pa(t,e){var i;let r=(p(i=class extends Ea{toObject(){return{type:this.type,colorsOnly:this.colorsOnly}}},"type",t),p(i,"defaults",{colorsOnly:!1,matrix:e}),i);return at.setClass(r,t),r}p(Ea,"type","ColorMatrix"),p(Ea,"defaults",ja),p(Ea,"uniformLocations",["uColorMatrix","uConstants"]),at.setClass(Ea);const Aa=Pa("Brownie",[.5997,.34553,-.27082,0,.186,-.0377,.86095,.15059,0,-.1449,.24113,-.07441,.44972,0,-.02965,0,0,0,1,0]),Fa=Pa("Vintage",[.62793,.32021,-.03965,0,.03784,.02578,.64411,.03259,0,.02926,.0466,-.08512,.52416,0,.02023,0,0,0,1,0]),La=Pa("Kodachrome",[1.12855,-.39673,-.03992,0,.24991,-.16404,1.08352,-.05498,0,.09698,-.16786,-.56034,1.60148,0,.13972,0,0,0,1,0]),Ia=Pa("Technicolor",[1.91252,-.85453,-.09155,0,.04624,-.30878,1.76589,-.10601,0,-.27589,-.2311,-.75018,1.84759,0,.12137,0,0,0,1,0]),Ra=Pa("Polaroid",[1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0]),Ba=Pa("Sepia",[.393,.769,.189,0,0,.349,.686,.168,0,0,.272,.534,.131,0,0,0,0,0,1,0]),$a=Pa("BlackWhite",[1.5,1.5,1.5,0,-1,1.5,1.5,1.5,0,-1,1.5,1.5,1.5,0,-1,0,0,0,1,0]);var Xa=class extends wa{constructor(t={}){super(t),this.subFilters=t.subFilters||[]}applyTo(t){_a(t)&&(t.passes+=this.subFilters.length-1),this.subFilters.forEach(e=>{e.applyTo(t)})}toObject(){return{type:this.type,subFilters:this.subFilters.map(t=>t.toObject())}}isNeutralState(){return!this.subFilters.some(t=>!t.isNeutralState())}static fromObject(t,e){return Promise.all((t.subFilters||[]).map(t=>at.getClass(t.type).fromObject(t,e))).then(t=>new this({subFilters:t}))}};p(Xa,"type","Composed"),at.setClass(Xa);var Ya=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uContrast;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n    color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n    gl_FragColor = color;\n  }"}isNeutralState(){return 0===this.contrast}applyTo2d({imageData:{data:t}}){let e=Math.floor(255*this.contrast),i=259*(e+255)/(255*(259-e));for(let e=0;e<t.length;e+=4)t[e]=i*(t[e]-128)+128,t[e+1]=i*(t[e+1]-128)+128,t[e+2]=i*(t[e+2]-128)+128}sendUniformData(t,e){t.uniform1f(e.uContrast,this.contrast)}};p(Ya,"type","Contrast"),p(Ya,"defaults",{contrast:0}),p(Ya,"uniformLocations",["uContrast"]),at.setClass(Ya);const Wa={Convolute_3_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[9];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 3.0; h+=1.0) {\n        for (float w = 0.0; w < 3.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_3_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[9];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 3.0; h+=1.0) {\n        for (float w = 0.0; w < 3.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_5_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[25];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 5.0; h+=1.0) {\n        for (float w = 0.0; w < 5.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_5_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[25];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 5.0; h+=1.0) {\n        for (float w = 0.0; w < 5.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_7_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[49];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 7.0; h+=1.0) {\n        for (float w = 0.0; w < 7.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_7_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[49];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 7.0; h+=1.0) {\n        for (float w = 0.0; w < 7.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_9_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[81];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 9.0; h+=1.0) {\n        for (float w = 0.0; w < 9.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_9_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[81];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 9.0; h+=1.0) {\n        for (float w = 0.0; w < 9.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    "};var Na=class extends wa{getCacheKey(){return`${this.type}_${Math.sqrt(this.matrix.length)}_${+!!this.opaque}`}getFragmentSource(){return Wa[this.getCacheKey()]}applyTo2d(t){let e,i,r,s,n,o,a,l,h,c,u,d,g,f=t.imageData,p=f.data,m=this.matrix,y=Math.round(Math.sqrt(m.length)),b=Math.floor(y/2),_=f.width,v=f.height,x=t.ctx.createImageData(_,v),C=x.data,w=+!!this.opaque;for(u=0;u<v;u++)for(c=0;c<_;c++){for(n=4*(u*_+c),e=0,i=0,r=0,s=0,g=0;g<y;g++)for(d=0;d<y;d++)a=u+g-b,o=c+d-b,a<0||a>=v||o<0||o>=_||(l=4*(a*_+o),h=m[g*y+d],e+=p[l]*h,i+=p[l+1]*h,r+=p[l+2]*h,w||(s+=p[l+3]*h));C[n]=e,C[n+1]=i,C[n+2]=r,C[n+3]=w?p[n+3]:s}t.imageData=x}sendUniformData(t,e){t.uniform1fv(e.uMatrix,this.matrix)}toObject(){return{...super.toObject(),opaque:this.opaque,matrix:[...this.matrix]}}};p(Na,"type","Convolute"),p(Na,"defaults",{opaque:!1,matrix:[0,0,0,0,1,0,0,0,0]}),p(Na,"uniformLocations",["uMatrix","uOpaque","uHalfSize","uSize"]),at.setClass(Na);const Va="Gamma";var za=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform vec3 uGamma;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    vec3 correction = (1.0 / uGamma);\n    color.r = pow(color.r, correction.r);\n    color.g = pow(color.g, correction.g);\n    color.b = pow(color.b, correction.b);\n    gl_FragColor = color;\n    gl_FragColor.rgb *= color.a;\n  }\n"}constructor(t={}){super(t),this.gamma=t.gamma||this.constructor.defaults.gamma.concat()}applyTo2d({imageData:{data:t}}){let e=this.gamma,i=1/e[0],r=1/e[1],s=1/e[2];this.rgbValues||(this.rgbValues={r:new Uint8Array(256),g:new Uint8Array(256),b:new Uint8Array(256)});let n=this.rgbValues;for(let t=0;t<256;t++)n.r[t]=255*(t/255)**i,n.g[t]=255*(t/255)**r,n.b[t]=255*(t/255)**s;for(let e=0;e<t.length;e+=4)t[e]=n.r[t[e]],t[e+1]=n.g[t[e+1]],t[e+2]=n.b[t[e+2]]}sendUniformData(t,e){t.uniform3fv(e.uGamma,this.gamma)}isNeutralState(){let{gamma:t}=this;return 1===t[0]&&1===t[1]&&1===t[2]}toObject(){return{type:Va,gamma:this.gamma.concat()}}};p(za,"type",Va),p(za,"defaults",{gamma:[1,1,1]}),p(za,"uniformLocations",["uGamma"]),at.setClass(za);const Ha={average:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      float average = (color.r + color.b + color.g) / 3.0;\n      gl_FragColor = vec4(average, average, average, color.a);\n    }\n    ",lightness:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform int uMode;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 col = texture2D(uTexture, vTexCoord);\n      float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n      gl_FragColor = vec4(average, average, average, col.a);\n    }\n    ",luminosity:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform int uMode;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 col = texture2D(uTexture, vTexCoord);\n      float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n      gl_FragColor = vec4(average, average, average, col.a);\n    }\n    "};var Ga=class extends wa{applyTo2d({imageData:{data:t}}){for(let e,i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2];switch(this.mode){case"average":e=(r+s+n)/3;break;case"lightness":e=(Math.min(r,s,n)+Math.max(r,s,n))/2;break;case"luminosity":e=.21*r+.72*s+.07*n}t[i+2]=t[i+1]=t[i]=e}}getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return Ha[this.mode]}sendUniformData(t,e){t.uniform1i(e.uMode,1)}isNeutralState(){return!1}};p(Ga,"type","Grayscale"),p(Ga,"defaults",{mode:"average"}),p(Ga,"uniformLocations",["uMode"]),at.setClass(Ga);const Ua={...ja,rotation:0};var qa=class extends Ea{calculateMatrix(){let t=this.rotation*Math.PI,e=ut(t),i=dt(t),r=1/3,s=Math.sqrt(r)*i,n=1-e;this.matrix=[e+n/3,r*n-s,r*n+s,0,0,r*n+s,e+r*n,r*n-s,0,0,r*n-s,r*n+s,e+r*n,0,0,0,0,0,1,0]}isNeutralState(){return 0===this.rotation}applyTo(t){this.calculateMatrix(),super.applyTo(t)}toObject(){return{type:this.type,rotation:this.rotation}}};p(qa,"type","HueRotation"),p(qa,"defaults",Ua),at.setClass(qa);var Ka=class extends wa{applyTo2d({imageData:{data:t}}){for(let e=0;e<t.length;e+=4)t[e]=255-t[e],t[e+1]=255-t[e+1],t[e+2]=255-t[e+2],this.alpha&&(t[e+3]=255-t[e+3])}getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform int uInvert;\n  uniform int uAlpha;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    if (uInvert == 1) {\n      if (uAlpha == 1) {\n        gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n      } else {\n        gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n      }\n    } else {\n      gl_FragColor = color;\n    }\n  }\n"}isNeutralState(){return!this.invert}sendUniformData(t,e){t.uniform1i(e.uInvert,Number(this.invert)),t.uniform1i(e.uAlpha,Number(this.alpha))}};p(Ka,"type","Invert"),p(Ka,"defaults",{alpha:!1,invert:!0}),p(Ka,"uniformLocations",["uInvert","uAlpha"]),at.setClass(Ka);var Ja=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uStepH;\n  uniform float uNoise;\n  uniform float uSeed;\n  varying vec2 vTexCoord;\n  float rand(vec2 co, float seed, float vScale) {\n    return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n  }\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=this.noise;for(let i=0;i<t.length;i+=4){let r=(.5-Math.random())*e;t[i]+=r,t[i+1]+=r,t[i+2]+=r}}sendUniformData(t,e){t.uniform1f(e.uNoise,this.noise/255),t.uniform1f(e.uSeed,Math.random())}isNeutralState(){return 0===this.noise}};p(Ja,"type","Noise"),p(Ja,"defaults",{noise:0}),p(Ja,"uniformLocations",["uNoise","uSeed"]),at.setClass(Ja);var Qa=class extends wa{applyTo2d({imageData:{data:t,width:e,height:i}}){for(let r=0;r<i;r+=this.blocksize)for(let s=0;s<e;s+=this.blocksize){let n=4*r*e+4*s,o=t[n],a=t[n+1],l=t[n+2],h=t[n+3];for(let n=r;n<Math.min(r+this.blocksize,i);n++)for(let i=s;i<Math.min(s+this.blocksize,e);i++){let r=4*n*e+4*i;t[r]=o,t[r+1]=a,t[r+2]=l,t[r+3]=h}}}isNeutralState(){return 1===this.blocksize}getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uBlocksize;\n  uniform float uStepW;\n  uniform float uStepH;\n  varying vec2 vTexCoord;\n  void main() {\n    float blockW = uBlocksize * uStepW;\n    float blockH = uBlocksize * uStepH;\n    int posX = int(vTexCoord.x / blockW);\n    int posY = int(vTexCoord.y / blockH);\n    float fposX = float(posX);\n    float fposY = float(posY);\n    vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n    vec4 color = texture2D(uTexture, squareCoords);\n    gl_FragColor = color;\n  }\n"}sendUniformData(t,e){t.uniform1f(e.uBlocksize,this.blocksize)}};p(Qa,"type","Pixelate"),p(Qa,"defaults",{blocksize:4}),p(Qa,"uniformLocations",["uBlocksize"]),at.setClass(Qa);var Za=class extends wa{getFragmentSource(){return"\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n  gl_FragColor = texture2D(uTexture, vTexCoord);\n  if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n    gl_FragColor.a = 0.0;\n  }\n}\n"}applyTo2d({imageData:{data:t}}){let e=255*this.distance,i=new gi(this.color).getSource(),r=[i[0]-e,i[1]-e,i[2]-e],s=[i[0]+e,i[1]+e,i[2]+e];for(let e=0;e<t.length;e+=4){let i=t[e],n=t[e+1],o=t[e+2];i>r[0]&&n>r[1]&&o>r[2]&&i<s[0]&&n<s[1]&&o<s[2]&&(t[e+3]=0)}}sendUniformData(t,e){let i=new gi(this.color).getSource(),r=this.distance,s=[0+i[0]/255-r,0+i[1]/255-r,0+i[2]/255-r,1],n=[i[0]/255+r,i[1]/255+r,i[2]/255+r,1];t.uniform4fv(e.uLow,s),t.uniform4fv(e.uHigh,n)}};p(Za,"type","RemoveColor"),p(Za,"defaults",{color:"#FFFFFF",distance:.02,useAlpha:!1}),p(Za,"uniformLocations",["uLow","uHigh"]),at.setClass(Za);var tl=class extends wa{sendUniformData(t,e){t.uniform2fv(e.uDelta,this.horizontal?[1/this.width,0]:[0,1/this.height]),t.uniform1fv(e.uTaps,this.taps)}getFilterWindow(){let t=this.tempScale;return Math.ceil(this.lanczosLobes/t)}getCacheKey(){let t=this.getFilterWindow();return`${this.type}_${t}`}getFragmentSource(){let t=this.getFilterWindow();return this.generateShader(t)}getTaps(){let t=this.lanczosCreate(this.lanczosLobes),e=this.tempScale,i=this.getFilterWindow(),r=Array(i);for(let s=1;s<=i;s++)r[s-1]=t(s*e);return r}generateShader(t){let e=Array(t);for(let i=1;i<=t;i++)e[i-1]=`${i}.0 * uDelta`;return`\n      precision highp float;\n      uniform sampler2D uTexture;\n      uniform vec2 uDelta;\n      varying vec2 vTexCoord;\n      uniform float uTaps[${t}];\n      void main() {\n        vec4 color = texture2D(uTexture, vTexCoord);\n        float sum = 1.0;\n        ${e.map((t,e)=>`\n              color += texture2D(uTexture, vTexCoord + ${t}) * uTaps[${e}] + texture2D(uTexture, vTexCoord - ${t}) * uTaps[${e}];\n              sum += 2.0 * uTaps[${e}];\n            `).join("\n")}\n        gl_FragColor = color / sum;\n      }\n    `}applyToForWebgl(t){t.passes++,this.width=t.sourceWidth,this.horizontal=!0,this.dW=Math.round(this.width*this.scaleX),this.dH=t.sourceHeight,this.tempScale=this.dW/this.width,this.taps=this.getTaps(),t.destinationWidth=this.dW,super.applyTo(t),t.sourceWidth=t.destinationWidth,this.height=t.sourceHeight,this.horizontal=!1,this.dH=Math.round(this.height*this.scaleY),this.tempScale=this.dH/this.height,this.taps=this.getTaps(),t.destinationHeight=this.dH,super.applyTo(t),t.sourceHeight=t.destinationHeight}applyTo(t){_a(t)?this.applyToForWebgl(t):this.applyTo2d(t)}isNeutralState(){return 1===this.scaleX&&1===this.scaleY}lanczosCreate(t){return e=>{if(e>=t||e<=-t)return 0;if(e<1.1920929e-7&&e>-1.1920929e-7)return 1;let i=(e*=Math.PI)/t;return Math.sin(e)/e*Math.sin(i)/i}}applyTo2d(t){let e=t.imageData,i=this.scaleX,r=this.scaleY;this.rcpScaleX=1/i,this.rcpScaleY=1/r;let s,n=e.width,o=e.height,a=Math.round(n*i),l=Math.round(o*r);s="sliceHack"===this.resizeType?this.sliceByTwo(t,n,o,a,l):"hermite"===this.resizeType?this.hermiteFastResize(t,n,o,a,l):"bilinear"===this.resizeType?this.bilinearFiltering(t,n,o,a,l):"lanczos"===this.resizeType?this.lanczosResize(t,n,o,a,l):new ImageData(a,l),t.imageData=s}sliceByTwo(t,e,i,r,s){let n=t.imageData,o=.5,a=!1,l=!1,h=e*o,c=i*o,u=t.filterBackend.resources,d=0,g=0,f=e,p=0;u.sliceByTwo||(u.sliceByTwo=Ct());let m=u.sliceByTwo;(m.width<1.5*e||m.height<i)&&(m.width=1.5*e,m.height=i);let y=m.getContext("2d");for(y.clearRect(0,0,1.5*e,i),y.putImageData(n,0,0),r=Math.floor(r),s=Math.floor(s);!a||!l;)e=h,i=c,r<Math.floor(h*o)?h=Math.floor(h*o):(h=r,a=!0),s<Math.floor(c*o)?c=Math.floor(c*o):(c=s,l=!0),y.drawImage(m,d,g,e,i,f,p,h,c),d=f,g=p,p+=c;return y.getImageData(d,g,r,s)}lanczosResize(t,e,i,r,s){let n=t.imageData.data,o=t.ctx.createImageData(r,s),a=o.data,l=this.lanczosCreate(this.lanczosLobes),h=this.rcpScaleX,c=this.rcpScaleY,u=2/this.rcpScaleX,d=2/this.rcpScaleY,g=Math.ceil(h*this.lanczosLobes/2),f=Math.ceil(c*this.lanczosLobes/2),p={},m={x:0,y:0},y={x:0,y:0};return function t(b){let _,v,x,C,w,S,T,O,k,D,M;for(m.x=(b+.5)*h,y.x=Math.floor(m.x),_=0;_<s;_++){for(m.y=(_+.5)*c,y.y=Math.floor(m.y),w=0,S=0,T=0,O=0,k=0,v=y.x-g;v<=y.x+g;v++)if(!(v<0||v>=e)){D=Math.floor(1e3*Math.abs(v-m.x)),p[D]||(p[D]={});for(let t=y.y-f;t<=y.y+f;t++)t<0||t>=i||(M=Math.floor(1e3*Math.abs(t-m.y)),p[D][M]||(p[D][M]=l(Math.sqrt((D*u)**2+(M*d)**2)/1e3)),x=p[D][M],x>0&&(C=4*(t*e+v),w+=x,S+=x*n[C],T+=x*n[C+1],O+=x*n[C+2],k+=x*n[C+3]))}C=4*(_*r+b),a[C]=S/w,a[C+1]=T/w,a[C+2]=O/w,a[C+3]=k/w}return++b<r?t(b):o}(0)}bilinearFiltering(t,e,i,r,s){let n,o,a,l,h,c,u,d,g,f,p,m,y,b=0,_=this.rcpScaleX,v=this.rcpScaleY,x=4*(e-1),C=t.imageData.data,w=t.ctx.createImageData(r,s),S=w.data;for(u=0;u<s;u++)for(d=0;d<r;d++)for(h=Math.floor(_*d),c=Math.floor(v*u),g=_*d-h,f=v*u-c,y=4*(c*e+h),p=0;p<4;p++)n=C[y+p],o=C[y+4+p],a=C[y+x+p],l=C[y+x+4+p],m=n*(1-g)*(1-f)+o*g*(1-f)+a*f*(1-g)+l*g*f,S[b++]=m;return w}hermiteFastResize(t,e,i,r,s){let n=this.rcpScaleX,o=this.rcpScaleY,a=Math.ceil(n/2),l=Math.ceil(o/2),h=t.imageData.data,c=t.ctx.createImageData(r,s),u=c.data;for(let t=0;t<s;t++)for(let i=0;i<r;i++){let s,c=4*(i+t*r),d=0,g=0,f=0,p=0,m=0,y=0,b=(t+.5)*o;for(let r=Math.floor(t*o);r<(t+1)*o;r++){let t=Math.abs(b-(r+.5))/l,o=(i+.5)*n,c=t*t;for(let t=Math.floor(i*n);t<(i+1)*n;t++){let i=Math.abs(o-(t+.5))/a,n=Math.sqrt(c+i*i);n>1&&n<-1||(s=2*n*n*n-3*n*n+1,s>0&&(i=4*(t+r*e),y+=s*h[i+3],g+=s,h[i+3]<255&&(s=s*h[i+3]/250),f+=s*h[i],p+=s*h[i+1],m+=s*h[i+2],d+=s))}}u[c]=f/d,u[c+1]=p/d,u[c+2]=m/d,u[c+3]=y/g}return c}};p(tl,"type","Resize"),p(tl,"defaults",{resizeType:"hermite",scaleX:1,scaleY:1,lanczosLobes:3}),p(tl,"uniformLocations",["uDelta","uTaps"]),at.setClass(tl);var el=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uSaturation;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float rgMax = max(color.r, color.g);\n    float rgbMax = max(rgMax, color.b);\n    color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n    color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n    color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=-this.saturation;for(let i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2],o=Math.max(r,s,n);t[i]+=o===r?0:(o-r)*e,t[i+1]+=o===s?0:(o-s)*e,t[i+2]+=o===n?0:(o-n)*e}}sendUniformData(t,e){t.uniform1f(e.uSaturation,-this.saturation)}isNeutralState(){return 0===this.saturation}};p(el,"type","Saturation"),p(el,"defaults",{saturation:0}),p(el,"uniformLocations",["uSaturation"]),at.setClass(el);var il=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uVibrance;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float max = max(color.r, max(color.g, color.b));\n    float avg = (color.r + color.g + color.b) / 3.0;\n    float amt = (abs(max - avg) * 2.0) * uVibrance;\n    color.r += max != color.r ? (max - color.r) * amt : 0.00;\n    color.g += max != color.g ? (max - color.g) * amt : 0.00;\n    color.b += max != color.b ? (max - color.b) * amt : 0.00;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=-this.vibrance;for(let i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2],o=Math.max(r,s,n),a=(r+s+n)/3,l=2*Math.abs(o-a)/255*e;t[i]+=o===r?0:(o-r)*l,t[i+1]+=o===s?0:(o-s)*l,t[i+2]+=o===n?0:(o-n)*l}}sendUniformData(t,e){t.uniform1f(e.uVibrance,-this.vibrance)}isNeutralState(){return 0===this.vibrance}};function rl(t,e){const i=document.createElement("canvas");return i.width=t,i.height=e,i}function sl(t){const e=t.getContext("2d");if(!e)throw new Error("The browser gave no 2D canvas.");return e}function nl(t){const e=new Map;return t.forEach(t=>{e.has(t.family)||e.set(t.family,{family:t.family,label:t.label||t.family})}),[...e.values()]}p(il,"type","Vibrance"),p(il,"defaults",{vibrance:0}),p(il,"uniformLocations",["uVibrance"]),at.setClass(il),d({BaseFilter:()=>wa,BlackWhite:()=>$a,BlendColor:()=>Ta,BlendImage:()=>ka,Blur:()=>Da,Brightness:()=>Ma,Brownie:()=>Aa,ColorMatrix:()=>Ea,Composed:()=>Xa,Contrast:()=>Ya,Convolute:()=>Na,Gamma:()=>za,Grayscale:()=>Ga,HueRotation:()=>qa,Invert:()=>Ka,Kodachrome:()=>La,Noise:()=>Ja,Pixelate:()=>Qa,Polaroid:()=>Ra,RemoveColor:()=>Za,Resize:()=>tl,Saturation:()=>el,Sepia:()=>Ba,Technicolor:()=>Ia,Vibrance:()=>il,Vintage:()=>Fa});const ol={woff2:"woff2",woff:"woff",ttf:"truetype",otf:"opentype"},al=t=>`"PrintBlob ${t}"`,ll=new Map;async function hl(t){const e=[...new Set(t.filter(t=>ll.has(t)))];await Promise.all(e.flatMap(t=>(ll.get(t)??[]).map(t=>t.load()))),await Promise.all(e.flatMap(t=>[document.fonts.load(`400 40px ${al(t)}`,"Aа"),document.fonts.load(`700 40px ${al(t)}`,"Aа")]))}function cl(t){const e=new Set,i=t=>{if(t&&"string"==typeof t.fontFamily){const i=t.fontFamily.match(/^"PrintBlob (.+)"$/);i?.[1]&&e.add(i[1])}(t?.objects??[]).forEach(i)};return Object.values(t??{}).forEach(i),[...e]}const ul="#1A1D22",dl="#FFFFFF",gl="#2645D6",fl=[{name:(0,e.__)("Black","printblob"),hex:ul},{name:(0,e.__)("White","printblob"),hex:dl},{name:(0,e.__)("Cobalt","printblob"),hex:gl},{name:(0,e.__)("Red","printblob"),hex:"#D7263D"},{name:(0,e.__)("Yellow","printblob"),hex:"#F4C20D"},{name:(0,e.__)("Green","printblob"),hex:"#1F8A4C"}],pl=t=>({"--printblob-swatch":t}),ml=JSON.parse('{"Ee":1000,"uQ":300,"LH":{"area":{"x":0.3,"y":0.3,"w":0.4,"h":0.4},"print_cm":{"w":28,"h":36}}}');ml.Ee;const yl=ml.uQ;ml.LH;const bl=["printblobKind","printblobAutoInk","printblobVector"];function _l(t){return new Qs({left:t.left+t.width/2,top:t.top+t.height/2,width:t.width,height:t.height,absolutePositioned:!0})}function vl(t){return{x:t.left+t.width/2,y:t.top+t.height/2}}async function xl(t,e,i,{vector:r=!1}={}){const s=await ba.fromURL(e),n=Math.min(.8*i.width/s.width,.8*i.height/s.height),o=vl(i);return s.set({left:o.x,top:o.y,scaleX:n,scaleY:n,printblobKind:"image",printblobVector:r}),t.add(s),t.setActiveObject(s),t.requestRenderAll(),s}function Cl(t,e,i,{family:r="Onest",color:s=ul}={}){const n=vl(i),o=new la(e,{left:n.x,top:n.y,width:.9*i.width,fontSize:56,lineHeight:1.1,fontFamily:al(r),fontWeight:700,fill:s,textAlign:"center",printblobKind:"text",printblobAutoInk:!0});return t.add(o),t.setActiveObject(o),t.requestRenderAll(),o}function wl(t){return"text"===t.printblobKind&&t instanceof la}function Sl(t,e){t.setActiveObject(e),e.enterEditing(),e.selectAll(),t.requestRenderAll()}function Tl(t,e){t.remove(e),t.discardActiveObject(),t.requestRenderAll()}function Ol(t){return t.toObject(bl)}function kl(t){return Boolean(t?.objects?.length)}async function Dl(t,e,i){t.discardActiveObject(),t.clear(),t.getWidth()===i.stage.width&&t.getHeight()===i.stage.height||t.setDimensions({width:i.stage.width,height:i.stage.height},{backstoreOnly:!0}),e&&await t.loadFromJSON(e),t.clipPath=_l(i.area),t.requestRenderAll()}function Ml(t,e){return t?{...t,objects:t.objects.map(t=>t.printblobAutoInk?{...t,fill:e}:t)}:t}function jl(t,e){if("image"!==t?.printblobKind||t.printblobVector)return null;const i=t.getScaledWidth()/e.area.width*e.printCm.width;return Math.round(t.width/(i/2.54))}Object.assign(ps.ownDefaults,{cornerColor:gl,cornerStrokeColor:"#FFFFFF",borderColor:gl,cornerStyle:"circle",cornerSize:22,touchCornerSize:36,transparentCorners:!1,borderScaleFactor:2,padding:6});const El=t=>("Image"===t.type||"image"===t.printblobKind)&&Boolean(t.src?.startsWith("data:"));function Pl(t){const e=t=>t?{...t,objects:t.objects.map(t=>El(t)?{...t,src:""}:t)}:null;return Object.fromEntries(Object.entries(t).map(([t,i])=>[t,e(i)]))}function Al(t){const e=(t?.objects||[]).filter(El).map(t=>t.src);return[...new Set(e)]}async function Fl(t,e){const i=new _e(document.createElement("canvas"),{width:e.stage.width,height:e.stage.height,enableRetinaScaling:!1,renderOnAddRemove:!1});return await i.loadFromJSON(t),i.getObjects().forEach(t=>t.set({objectCaching:!1})),i.clipPath=_l(e.area),i.renderAll(),i}const Ll=t=>new Promise((e,i)=>t.toBlob(t=>t?e(t):i(new Error("Export failed")),"image/png")),Il=Uint32Array.from({length:256},(t,e)=>{let i=e;for(let t=0;t<8;t++)i=1&i?3988292384^i>>>1:i>>>1;return i>>>0});async function Rl(t,e){const i=new Uint8Array(await t.arrayBuffer()),r=Math.round(e/.0254),s=new Uint8Array(21),n=new DataView(s.buffer);return n.setUint32(0,9),s.set([112,72,89,115],4),n.setUint32(8,r),n.setUint32(12,r),s[16]=1,n.setUint32(17,function(t){let e=4294967295;for(const i of t)e=Il[255&(e^i)]^e>>>8;return(4294967295^e)>>>0}(s.subarray(4,17))),new Blob([i.subarray(0,33),s,i.subarray(33)],{type:"image/png"})}function Bl(t,e,i,r){const s=t.toCanvasElement(i/e.area.width,{left:e.area.left,top:e.area.top,width:e.area.width,height:e.area.height}),n=rl(i,r);return sl(n).drawImage(s,0,0,i,r),n}async function $l(t,e,i){const r=Math.round(i*e.area.height/e.area.width);if(!t||!kl(t))return rl(i,r);const s=await Fl(t,e),n=Bl(s,e,i,r);return s.dispose(),n}async function Xl(t,e,i){const r=await Fl(t,e),s=Bl(r,e,e.printPx.width,e.printPx.height),n=rl(.8*e.stage.width,.8*e.stage.height),o=sl(n);return o.drawImage(i,0,0,n.width,n.height),o.drawImage(r.toCanvasElement(.8),0,0),r.dispose(),{print:await Rl(await Ll(s),yl),preview:await Ll(n)}}const Yl=(t,e)=>e?`${t} is-shown`:t;function Wl({selected:t,items:i,tool:r,printFonts:s,dpi:n,onChoose:a,onDone:l,onChange:h,onCentre:c,onLayer:u,onRemove:d}){const g=t&&wl(t)?t:null,f="image"===t?.printblobKind?t:null,p=(0,o.jsxs)("div",{className:"printblob-designer__row printblob-designer__row--actions",children:[(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:c,children:(0,e.__)("Centre","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:()=>u("up"),children:(0,e.__)("Bring forward","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:()=>u("down"),children:(0,e.__)("Send back","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button printblob-link-button--danger",onClick:d,children:(0,e.__)("Remove","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:l,children:/* translators: closes the controls of the chosen image or text, back to the list of what is on the side. */ /* translators: closes the controls of the chosen image or text, back to the list of what is on the side. */
     4(0,e.__)("Not printed","printblob")})]})]},t.key)),(0,o.jsxs)("div",{className:"printblob-breakdown__total",children:[(0,o.jsx)("dt",{children:(0,e.__)("Total","printblob")}),(0,o.jsx)("dd",{children:i(g*t,h)})]})]}),(0,o.jsx)("button",{type:"button",className:"printblob-button printblob-button--primary",onClick:b,disabled:p,children:(0,o.jsx)("span",{className:"printblob-stack",children:[(0,e.__)("Add to cart","printblob"),...n()].map(t=>(0,o.jsx)("span",{className:a(t===_),children:t},t))})}),(0,o.jsxs)("div",{className:"printblob-designer__messages printblob-stack",children:[(0,o.jsxs)("p",{className:"printblob-note printblob-note--ok","aria-hidden":"true",children:[x," ",v]}),[...Object.values(C),s(y)].map(t=>(0,o.jsx)("p",{className:"printblob-note printblob-note--error","aria-hidden":"true",children:t},t)),(0,o.jsxs)("div",{className:"printblob-stack__fill is-shown",children:[(0,o.jsx)("div",{className:"printblob-designer__status",role:"status","aria-live":"polite",children:"added"===f.state&&(0,o.jsxs)("p",{className:"printblob-note printblob-note--ok",children:[f.message," ",(0,o.jsx)("a",{href:m,children:v})]})}),"error"===f.state&&(0,o.jsx)("p",{className:"printblob-note printblob-note--error",role:"alert",children:f.message})]})]})]})}function h({names:t,chosen:e}){return(0,o.jsx)("span",{className:"printblob-designer__choice printblob-stack",children:t.map(t=>(0,o.jsx)("span",{className:t===e?"is-shown":void 0,children:t},t))})}function c({label:t,chosen:e,choices:i}){return(0,o.jsxs)("fieldset",{className:"printblob-designer__section",children:[(0,o.jsxs)("legend",{children:[t,void 0!==e&&(0,o.jsx)(h,{names:i.map(t=>t.name),chosen:e})]}),(0,o.jsx)("div",{className:"printblob-sizes",children:i.map(t=>(0,o.jsx)("button",{type:"button",className:"printblob-size","aria-pressed":t.pressed,onClick:t.onSelect,disabled:t.disabled,children:t.name},t.key))})]})}var u=Object.defineProperty,d=(t,e)=>{let i={};for(var r in t)u(i,r,{get:t[r],enumerable:!0});return e||u(i,Symbol.toStringTag,{value:"Module"}),i};function g(t){return g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},g(t)}function f(t){var e=function(t){if("object"!=g(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,"string");if("object"!=g(i))return i;throw TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==g(e)?e:e+""}function p(t,e,i){return(e=f(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}var m=class{constructor(){p(this,"browserShadowBlurConstant",1),p(this,"DPI",96),p(this,"devicePixelRatio",typeof window<"u"?window.devicePixelRatio:1),p(this,"perfLimitSizeTotal",2097152),p(this,"maxCacheSideLimit",4096),p(this,"minCacheSideLimit",256),p(this,"disableStyleCopyPaste",!1),p(this,"enableGLFiltering",!0),p(this,"textureSize",4096),p(this,"forceGLPutImageData",!1),p(this,"cachesBoundsOfCurve",!1),p(this,"fontPaths",{}),p(this,"NUM_FRACTION_DIGITS",4)}};const y=new class extends m{constructor(t){super(),this.configure(t)}configure(t={}){Object.assign(this,t)}addFonts(t={}){this.fontPaths={...this.fontPaths,...t}}removeFonts(t=[]){t.forEach(t=>{delete this.fontPaths[t]})}clearFonts(){this.fontPaths={}}restoreDefaults(t){let e=new m,i=(null==t?void 0:t.reduce((t,i)=>(t[i]=e[i],t),{}))||e;this.configure(i)}},b=(t,...e)=>console[t]("fabric",...e);var _=class extends Error{constructor(t,e){super(`fabric: ${t}`,e)}},v=class extends _{constructor(t){super(`${t} 'options.signal' is in 'aborted' state`)}},x=class{},C=class extends x{testPrecision(t,e){let i=`precision ${e} float;\nvoid main(){}`,r=t.createShader(t.FRAGMENT_SHADER);return!!r&&(t.shaderSource(r,i),t.compileShader(r),!!t.getShaderParameter(r,t.COMPILE_STATUS))}queryWebGL(t){let e=t.getContext("webgl");e&&(this.maxTextureSize=e.getParameter(e.MAX_TEXTURE_SIZE),this.GLPrecision=["highp","mediump","lowp"].find(t=>this.testPrecision(e,t)),e.getExtension("WEBGL_lose_context").loseContext(),b("log",`WebGL: max texture size ${this.maxTextureSize}`))}isSupported(t){return!!this.maxTextureSize&&this.maxTextureSize>=t}};const w={};let S;const T=()=>S||(S={document,window,isTouchSupported:"ontouchstart"in window||"ontouchstart"in document||window&&window.navigator&&window.navigator.maxTouchPoints>0,WebGLProbe:new C,dispose(){},copyPasteData:w}),O=()=>T().document,k=()=>T().window,D=()=>{var t;return Math.max(null==(t=y.devicePixelRatio)?k().devicePixelRatio:t,1)},M=new class{constructor(){p(this,"boundsOfCurveCache",{}),this.charWidthsCache=new Map}getFontCache({fontFamily:t,fontStyle:e,fontWeight:i}){t=t.toLowerCase();let r=this.charWidthsCache;r.has(t)||r.set(t,new Map);let s=r.get(t),n=`${e.toLowerCase()}_${(i+"").toLowerCase()}`;return s.has(n)||s.set(n,new Map),s.get(n)}clearFontCache(t){t?this.charWidthsCache.delete((t||"").toLowerCase()):this.charWidthsCache=new Map}limitDimsByArea(t){let{perfLimitSizeTotal:e}=y,i=Math.sqrt(e*t);return[Math.floor(i),Math.floor(e/i)]}},j="7.4.0";function E(){}const P=Math.PI/2,A=Math.PI/4,F=2*Math.PI,L=Math.PI/180,I=Object.freeze([1,0,0,1,0,0]),R="center",B="left",$="bottom",X="right",Y="none",W=/\r?\n/,N="moving",V="scaling",z="rotating",H="rotate",G="skewing",U="resizing",q="modifyPoly",K="changed",J="scale",Q="scaleX",Z="scaleY",tt="skewX",et="skewY",it="fill",rt="stroke",st="modified",nt="normal",ot="json",at=new class{constructor(){this[ot]=new Map,this.svg=new Map}has(t){return this[ot].has(t)}getClass(t){let e=this[ot].get(t);if(!e)throw new _(`No class registered for ${t}`);return e}setClass(t,e){e?this[ot].set(e,t):(this[ot].set(t.type,t),this[ot].set(t.type.toLowerCase(),t))}getSVGClass(t){return this.svg.get(t)}setSVGClass(t,e){this.svg.set(e??t.type.toLowerCase(),t)}},lt=new class extends Array{remove(t){let e=this.indexOf(t);e>-1&&this.splice(e,1)}cancelAll(){let t=this.splice(0);return t.forEach(t=>t.abort()),t}cancelByCanvas(t){if(!t)return[];let e=this.filter(e=>{var i;return e.target===t||"object"==typeof e.target&&(null==(i=e.target)?void 0:i.canvas)===t});return e.forEach(t=>t.abort()),e}cancelByTarget(t){if(!t)return[];let e=this.filter(e=>e.target===t);return e.forEach(t=>t.abort()),e}};var ht=class{constructor(){p(this,"__eventListeners",{})}on(t,e){if(this.__eventListeners||(this.__eventListeners={}),"object"==typeof t)return Object.entries(t).forEach(([t,e])=>{this.on(t,e)}),()=>this.off(t);if(e){let i=t;return this.__eventListeners[i]||(this.__eventListeners[i]=[]),this.__eventListeners[i].push(e),()=>this.off(i,e)}return()=>!1}once(t,e){if("object"==typeof t){let e=[];return Object.entries(t).forEach(([t,i])=>{e.push(this.once(t,i))}),()=>e.forEach(t=>t())}if(e){let i=this.on(t,function(...t){e.call(this,...t),i()});return i}return()=>!1}_removeEventListener(t,e){if(this.__eventListeners[t])if(e){let i=this.__eventListeners[t],r=i.indexOf(e);r>-1&&i.splice(r,1)}else this.__eventListeners[t]=[]}off(t,e){if(this.__eventListeners)if(void 0===t)for(let t in this.__eventListeners)this._removeEventListener(t);else"object"==typeof t?Object.entries(t).forEach(([t,e])=>{this._removeEventListener(t,e)}):this._removeEventListener(t,e)}fire(t,e){var i;if(!this.__eventListeners)return;let r=null==(i=this.__eventListeners[t])?void 0:i.concat();if(r)for(let t=0;t<r.length;t++)r[t].call(this,e||{})}};const ct=(t,e)=>{let i=t.indexOf(e);return-1!==i&&t.splice(i,1),t},ut=t=>{if(0===t)return 1;switch(Math.abs(t)/P){case 1:case 3:return 0;case 2:return-1}return Math.cos(t)},dt=t=>{if(0===t)return 0;let e=t/P,i=Math.sign(t);switch(e){case 1:return i;case 2:return 0;case 3:return-i}return Math.sin(t)};var gt=class t{constructor(t=0,e=0){"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e)}add(e){return new t(this.x+e.x,this.y+e.y)}addEquals(t){return this.x+=t.x,this.y+=t.y,this}scalarAdd(e){return new t(this.x+e,this.y+e)}scalarAddEquals(t){return this.x+=t,this.y+=t,this}subtract(e){return new t(this.x-e.x,this.y-e.y)}subtractEquals(t){return this.x-=t.x,this.y-=t.y,this}scalarSubtract(e){return new t(this.x-e,this.y-e)}scalarSubtractEquals(t){return this.x-=t,this.y-=t,this}multiply(e){return new t(this.x*e.x,this.y*e.y)}scalarMultiply(e){return new t(this.x*e,this.y*e)}scalarMultiplyEquals(t){return this.x*=t,this.y*=t,this}divide(e){return new t(this.x/e.x,this.y/e.y)}scalarDivide(e){return new t(this.x/e,this.y/e)}scalarDivideEquals(t){return this.x/=t,this.y/=t,this}eq(t){return this.x===t.x&&this.y===t.y}lt(t){return this.x<t.x&&this.y<t.y}lte(t){return this.x<=t.x&&this.y<=t.y}gt(t){return this.x>t.x&&this.y>t.y}gte(t){return this.x>=t.x&&this.y>=t.y}lerp(e,i=.5){return i=Math.max(Math.min(1,i),0),new t(this.x+(e.x-this.x)*i,this.y+(e.y-this.y)*i)}distanceFrom(t){let e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)}midPointFrom(t){return this.lerp(t)}min(e){return new t(Math.min(this.x,e.x),Math.min(this.y,e.y))}max(e){return new t(Math.max(this.x,e.x),Math.max(this.y,e.y))}toString(){return`${this.x},${this.y}`}setXY(t,e){return this.x=t,this.y=e,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setFromPoint(t){return this.x=t.x,this.y=t.y,this}swap(t){let e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i}clone(){return new t(this.x,this.y)}rotate(e,i=ft){let r=dt(e),s=ut(e),n=this.subtract(i);return new t(n.x*s-n.y*r,n.x*r+n.y*s).add(i)}transform(e,i=!1){return new t(e[0]*this.x+e[2]*this.y+(i?0:e[4]),e[1]*this.x+e[3]*this.y+(i?0:e[5]))}};const ft=new gt(0,0),pt=t=>!!t&&Array.isArray(t._objects);function mt(t){class e extends t{constructor(...t){super(...t),p(this,"_objects",[])}_onObjectAdded(t){}_onObjectRemoved(t){}_onStackOrderChanged(t){}add(...t){let e=this._objects.push(...t);return t.forEach(t=>this._onObjectAdded(t)),e}insertAt(t,...e){return this._objects.splice(t,0,...e),e.forEach(t=>this._onObjectAdded(t)),this._objects.length}remove(...t){let e=this._objects,i=[];return t.forEach(t=>{let r=e.indexOf(t);-1!==r&&(e.splice(r,1),i.push(t),this._onObjectRemoved(t))}),i}forEachObject(t){this.getObjects().forEach((e,i,r)=>t(e,i,r))}getObjects(...t){return 0===t.length?[...this._objects]:this._objects.filter(e=>e.isType(...t))}item(t){return this._objects[t]}isEmpty(){return 0===this._objects.length}size(){return this._objects.length}contains(t,i){return!!this._objects.includes(t)||!!i&&this._objects.some(i=>i instanceof e&&i.contains(t,!0))}complexity(){return this._objects.reduce((t,e)=>t+(e.complexity?e.complexity():0),0)}sendObjectToBack(t){return!(!t||t===this._objects[0]||(ct(this._objects,t),this._objects.unshift(t),this._onStackOrderChanged(t),0))}bringObjectToFront(t){return!(!t||t===this._objects[this._objects.length-1]||(ct(this._objects,t),this._objects.push(t),this._onStackOrderChanged(t),0))}sendObjectBackwards(t,e){if(!t)return!1;let i=this._objects.indexOf(t);if(0!==i){let r=this.findNewLowerIndex(t,i,e);return ct(this._objects,t),this._objects.splice(r,0,t),this._onStackOrderChanged(t),!0}return!1}bringObjectForward(t,e){if(!t)return!1;let i=this._objects.indexOf(t);if(i!==this._objects.length-1){let r=this.findNewUpperIndex(t,i,e);return ct(this._objects,t),this._objects.splice(r,0,t),this._onStackOrderChanged(t),!0}return!1}moveObjectTo(t,e){return t!==this._objects[e]&&(ct(this._objects,t),this._objects.splice(e,0,t),this._onStackOrderChanged(t),!0)}findNewLowerIndex(t,e,i){let r;if(i){r=e;for(let i=e-1;i>=0;--i)if(t.isOverlapping(this._objects[i])){r=i;break}}else r=e-1;return r}findNewUpperIndex(t,e,i){let r;if(i){r=e;for(let i=e+1;i<this._objects.length;++i)if(t.isOverlapping(this._objects[i])){r=i;break}}else r=e+1;return r}collectObjects({left:t,top:e,width:i,height:r},{includeIntersecting:s=!0}={}){let n=[],o=new gt(t,e),a=o.add(new gt(i,r));for(let t=this._objects.length-1;t>=0;t--){let e=this._objects[t];e.selectable&&e.visible&&(s&&e.intersectsWithRect(o,a)||e.isContainedWithinRect(o,a)||s&&e.containsPoint(o)||s&&e.containsPoint(a))&&n.push(e)}return n}}return e}var yt=class extends ht{_setOptions(t={}){for(let e in t)this.set(e,t[e])}_setObject(t){for(let e in t)this._set(e,t[e])}set(t,e){return"object"==typeof t?this._setObject(t):this._set(t,e),this}_set(t,e){this[t]=e}toggle(t){let e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this}get(t){return this[t]}};function bt(t){return k().requestAnimationFrame(t)}function _t(t){return k().cancelAnimationFrame(t)}let vt=0;const xt=()=>vt++,Ct=()=>{let t=O().createElement("canvas");if(!t||void 0===t.getContext)throw new _("Failed to create `canvas` element");return t},wt=()=>O().createElement("img"),St=t=>{var e;let i=Tt(t);return null==(e=i.getContext("2d"))||e.drawImage(t,0,0),i},Tt=t=>{let e=Ct();return e.width=t.width,e.height=t.height,e},Ot=(t,e,i)=>t.toDataURL(`image/${e}`,i),kt=(t,e,i)=>new Promise((r,s)=>{t.toBlob(r,`image/${e}`,i)}),Dt=t=>t*L,Mt=t=>t/L,jt=t=>t.every((t,e)=>t===I[e]),Et=(t,e,i)=>new gt(t).transform(e,i),Pt=t=>{let e=1/(t[0]*t[3]-t[1]*t[2]),i=[e*t[3],-e*t[1],-e*t[2],e*t[0],0,0],{x:r,y:s}=new gt(t[4],t[5]).transform(i,!0);return i[4]=-r,i[5]=-s,i},At=(t,e,i)=>[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],i?0:t[0]*e[4]+t[2]*e[5]+t[4],i?0:t[1]*e[4]+t[3]*e[5]+t[5]],Ft=(t,e)=>t.reduceRight((t,i)=>i&&t?At(i,t,e):i||t,void 0)||I.concat(),Lt=([t,e])=>Math.atan2(e,t),It=([t,e])=>Math.sqrt(t*t+e*e),Rt=([,,t,e])=>Math.sqrt(t*t+e*e),Bt=t=>{let e=Lt(t),i=t[0]**2+t[1]**2,r=Math.sqrt(i),s=(t[0]*t[3]-t[2]*t[1])/r,n=Math.atan2(t[0]*t[2]+t[1]*t[3],i);return{angle:Mt(e),scaleX:r,scaleY:s,skewX:Mt(n),skewY:0,translateX:t[4]||0,translateY:t[5]||0}},$t=(t,e=0)=>[1,0,0,1,t,e];function Xt({angle:t=0}={},{x:e=0,y:i=0}={}){let r=Dt(t),s=ut(r),n=dt(r);return[s,n,-n,s,e?e-(s*e-n*i):0,i?i-(n*e+s*i):0]}const Yt=(t,e=t)=>[t,0,0,e,0,0],Wt=t=>Math.tan(Dt(t)),Nt=t=>[1,0,Wt(t),1,0,0],Vt=t=>[1,Wt(t),0,1,0,0],zt=({scaleX:t=1,scaleY:e=1,flipX:i=!1,flipY:r=!1,skewX:s=0,skewY:n=0})=>{let o=Yt(i?-t:t,r?-e:e);return s&&(o=At(o,Nt(s),!0)),n&&(o=At(o,Vt(n),!0)),o},Ht=t=>{let{translateX:e=0,translateY:i=0,angle:r=0}=t,s=$t(e,i);r&&(s=At(s,Xt({angle:r})));let n=zt(t);return jt(n)||(s=At(s,n)),s},Gt=(t,{signal:e,crossOrigin:i=null}={})=>new Promise(function(r,s){if(e&&e.aborted)return s(new v("loadImage"));let n,o=wt();e&&(n=function(t){o.src="",s(t)},e.addEventListener("abort",n,{once:!0}));let a=function(){o.onload=o.onerror=null,n&&(null==e||e.removeEventListener("abort",n)),r(o)};t?(o.onload=a,o.onerror=function(){n&&(null==e||e.removeEventListener("abort",n)),s(new _(`Error loading ${o.src}`))},i&&(o.crossOrigin=i),o.src=t):a()}),Ut=(t,{signal:e,reviver:i=E}={})=>new Promise((r,s)=>{let n=[];e&&e.addEventListener("abort",s,{once:!0}),Promise.allSettled(t.map(t=>at.getClass(t.type).fromObject(t,{signal:e}))).then(async e=>{for(let[r,s]of e.entries())if("fulfilled"===s.status&&(await i(t[r],s.value),n.push(s.value)),"rejected"===s.status){let e=await i(t[r],void 0,s.reason);e&&n.push(e)}r(n)}).catch(t=>{n.forEach(t=>{t.dispose&&t.dispose()}),s(t)}).finally(()=>{e&&e.removeEventListener("abort",s)})}),qt=(t,{signal:e}={})=>new Promise((i,r)=>{let s=[];e&&e.addEventListener("abort",r,{once:!0});let n=Object.values(t).map(t=>t&&t.type&&at.has(t.type)?Ut([t],{signal:e}).then(([t])=>(s.push(t),t)):t),o=Object.keys(t);Promise.all(n).then(t=>t.reduce((t,e,i)=>(t[o[i]]=e,t),{})).then(i).catch(t=>{s.forEach(t=>{t.dispose&&t.dispose()}),r(t)}).finally(()=>{e&&e.removeEventListener("abort",r)})}),Kt=(t,e=[])=>e.reduce((e,i)=>(i in t&&(e[i]=t[i]),e),{}),Jt=(t,e)=>Object.keys(t).reduce((i,r)=>(e(t[r],r,t)&&(i[r]=t[r]),i),{}),Qt=(t,e)=>parseFloat(Number(t).toFixed(e)),Zt=t=>"matrix("+t.map(t=>Qt(t,y.NUM_FRACTION_DIGITS)).join(" ")+")",te=t=>!!t&&void 0!==t.toLive,ee=t=>!!t&&"function"==typeof t.toObject,ie=t=>!!t&&void 0!==t.offsetX&&"source"in t,re=t=>!!t&&"multiSelectionStacking"in t;function se(t){let e=t&&ne(t),i=0,r=0;if(!t||!e)return{left:i,top:r};let s=t,n=e.documentElement,o=e.body||{scrollLeft:0,scrollTop:0};for(;s&&(s.parentNode||s.host)&&(s=s.parentNode||s.host,s===e?(i=o.scrollLeft||n.scrollLeft||0,r=o.scrollTop||n.scrollTop||0):(i+=s.scrollLeft||0,r+=s.scrollTop||0),1!==s.nodeType||"fixed"!==s.style.position););return{left:i,top:r}}const ne=t=>t.ownerDocument||null,oe=t=>{var e;return(null==(e=t.ownerDocument)?void 0:e.defaultView)||null},ae=(t,e,{width:i,height:r},s=1)=>{t.width=i,t.height=r,s>1&&(t.setAttribute("width",(i*s).toString()),t.setAttribute("height",(r*s).toString()),e.scale(s,s))},le=(t,{width:e,height:i})=>{e&&(t.style.width="number"==typeof e?`${e}px`:e),i&&(t.style.height="number"==typeof i?`${i}px`:i)};function he(t){return void 0!==t.onselectstart&&(t.onselectstart=()=>!1),t.style.userSelect=Y,t}var ce=class{constructor(t){p(this,"_originalCanvasStyle",void 0),p(this,"lower",void 0);let e=this.createLowerCanvas(t);this.lower={el:e,ctx:e.getContext("2d")}}createLowerCanvas(t){let e=(i=t)&&void 0!==i.getContext?t:t&&O().getElementById(t)||Ct();var i;if(e.hasAttribute("data-fabric"))throw new _("Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?");return this._originalCanvasStyle=e.style.cssText,e.setAttribute("data-fabric","main"),e.classList.add("lower-canvas"),e}cleanupDOM({width:t,height:e}){let{el:i}=this.lower;i.classList.remove("lower-canvas"),i.removeAttribute("data-fabric"),i.setAttribute("width",`${t}`),i.setAttribute("height",`${e}`),i.style.cssText=this._originalCanvasStyle||"",this._originalCanvasStyle=void 0}setDimensions(t,e){let{el:i,ctx:r}=this.lower;ae(i,r,t,e)}setCSSDimensions(t){le(this.lower.el,t)}calcOffset(){return function(t){var e;let i=t&&ne(t),r={left:0,top:0};if(!i)return r;let s=(null==(e=oe(t))?void 0:e.getComputedStyle(t,null))||{};r.left+=parseInt(s.borderLeftWidth,10)||0,r.top+=parseInt(s.borderTopWidth,10)||0,r.left+=parseInt(s.paddingLeft,10)||0,r.top+=parseInt(s.paddingTop,10)||0;let n={left:0,top:0},o=i.documentElement;void 0!==t.getBoundingClientRect&&(n=t.getBoundingClientRect());let a=se(t);return{left:n.left+a.left-(o.clientLeft||0)+r.left,top:n.top+a.top-(o.clientTop||0)+r.top}}(this.lower.el)}dispose(){T().dispose(this.lower.el),delete this.lower}};const ue={backgroundVpt:!0,backgroundColor:"",overlayVpt:!0,overlayColor:"",includeDefaultValues:!0,svgViewportTransformation:!0,renderOnAddRemove:!0,skipOffscreen:!0,enableRetinaScaling:!0,imageSmoothingEnabled:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,viewportTransform:[...I],patternQuality:"best"};var de=d({capitalize:()=>ge,escapeXml:()=>fe,graphemeSplit:()=>me});const ge=(t,e=!1)=>`${t.charAt(0).toUpperCase()}${e?t.slice(1):t.slice(1).toLowerCase()}`,fe=t=>t.toString().replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;");let pe;const me=t=>{if(pe||pe||(pe="Intl"in k()&&"Segmenter"in Intl&&new Intl.Segmenter(void 0,{granularity:"grapheme"})),pe){let e=pe.segment(t);return Array.from(e).map(({segment:t})=>t)}return ye(t)},ye=t=>{let e=[];for(let i,r=0;r<t.length;r++)!1!==(i=be(t,r))&&e.push(i);return e},be=(t,e)=>{let i=t.charCodeAt(e);if(isNaN(i))return"";if(i<55296||i>57343)return t.charAt(e);if(55296<=i&&i<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";let i=t.charCodeAt(e+1);if(56320>i||i>57343)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";let r=t.charCodeAt(e-1);if(55296>r||r>56319)throw"Low surrogate without preceding high surrogate";return!1};var _e=class t extends(mt(yt)){get lowerCanvasEl(){var t;return null==(t=this.elements.lower)?void 0:t.el}get contextContainer(){var t;return null==(t=this.elements.lower)?void 0:t.ctx}static getDefaults(){return t.ownDefaults}constructor(t,e={}){super(),Object.assign(this,this.constructor.getDefaults()),this.set(e),this.initElements(t),this._setDimensionsImpl({width:this.width||this.elements.lower.el.width||0,height:this.height||this.elements.lower.el.height||0}),this.skipControlsDrawing=!1,this.viewportTransform=[...this.viewportTransform],this.calcViewportBoundaries()}initElements(t){this.elements=new ce(t)}add(...t){let e=super.add(...t);return t.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),e}insertAt(t,...e){let i=super.insertAt(t,...e);return e.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),i}remove(...t){let e=super.remove(...t);return e.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),e}_onObjectAdded(t){t.canvas&&t.canvas!==this&&(b("warn","Canvas is trying to add an object that belongs to a different canvas.\nResulting to default behavior: removing object from previous canvas and adding to new canvas"),t.canvas.remove(t)),t._set("canvas",this),t.setCoords(),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t){t._set("canvas",void 0),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onStackOrderChanged(){this.renderOnAddRemove&&this.requestRenderAll()}getRetinaScaling(){return this.enableRetinaScaling?D():1}calcOffset(){return this._offset=this.elements.calcOffset()}getWidth(){return this.width}getHeight(){return this.height}_setDimensionsImpl(t,{cssOnly:e=!1,backstoreOnly:i=!1}={}){if(!e){let e={width:this.width,height:this.height,...t};this.elements.setDimensions(e,this.getRetinaScaling()),this.hasLostContext=!0,this.width=e.width,this.height=e.height}i||this.elements.setCSSDimensions(t),this.calcOffset()}setDimensions(t,e){this._setDimensionsImpl(t,e),e&&e.cssOnly||this.requestRenderAll()}getZoom(){return It(this.viewportTransform)}setViewportTransform(t){this.viewportTransform=t,this.calcViewportBoundaries(),this.renderOnAddRemove&&this.requestRenderAll()}zoomToPoint(t,e){let i=t,r=[...this.viewportTransform],s=Et(t,Pt(r));r[0]=e,r[3]=e;let n=Et(s,r);r[4]+=i.x-n.x,r[5]+=i.y-n.y,this.setViewportTransform(r)}setZoom(t){this.zoomToPoint(new gt(0,0),t)}absolutePan(t){let e=[...this.viewportTransform];return e[4]=-t.x,e[5]=-t.y,this.setViewportTransform(e)}relativePan(t){return this.absolutePan(new gt(-t.x-this.viewportTransform[4],-t.y-this.viewportTransform[5]))}getElement(){return this.elements.lower.el}clearContext(t){t.clearRect(0,0,this.width,this.height)}getContext(){return this.elements.lower.ctx}clear(){this.remove(...this.getObjects()),this.backgroundImage=void 0,this.overlayImage=void 0,this.backgroundColor="",this.overlayColor="",this.clearContext(this.getContext()),this.fire("canvas:cleared"),this.renderOnAddRemove&&this.requestRenderAll()}renderAll(){this.cancelRequestedRender(),this.destroyed||this.renderCanvas(this.getContext(),this._objects)}renderAndReset(){this.nextRenderHandle=0,this.renderAll()}requestRenderAll(){this.nextRenderHandle||this.disposed||this.destroyed||(this.nextRenderHandle=bt(()=>this.renderAndReset()))}calcViewportBoundaries(){let t=this.width,e=this.height,i=Pt(this.viewportTransform),r=Et({x:0,y:0},i),s=Et({x:t,y:e},i),n=r.min(s),o=r.max(s);return this.vptCoords={tl:n,tr:new gt(o.x,n.y),bl:new gt(n.x,o.y),br:o}}cancelRequestedRender(){this.nextRenderHandle&&(_t(this.nextRenderHandle),this.nextRenderHandle=0)}drawControls(t){}renderCanvas(t,e){if(this.destroyed)return;let i=this.viewportTransform,r=this.clipPath;this.calcViewportBoundaries(),this.clearContext(t),t.imageSmoothingEnabled=this.imageSmoothingEnabled,t.patternQuality=this.patternQuality,this.fire("before:render",{ctx:t}),this._renderBackground(t),t.save(),t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this._renderObjects(t,e),t.restore(),this.controlsAboveOverlay||this.skipControlsDrawing||this.drawControls(t),r&&(r._set("canvas",this),r.shouldCache(),r._transformDone=!0,r.renderCache({forClipping:!0}),this.drawClipPathOnCanvas(t,r)),this._renderOverlay(t),this.controlsAboveOverlay&&!this.skipControlsDrawing&&this.drawControls(t),this.fire("after:render",{ctx:t}),this.__cleanupTask&&(this.__cleanupTask(),this.__cleanupTask=void 0)}drawClipPathOnCanvas(t,e){let i=this.viewportTransform;t.save(),t.transform(...i),t.globalCompositeOperation="destination-in",e.transform(t),t.scale(1/e.zoomX,1/e.zoomY),t.drawImage(e._cacheCanvas,-e.cacheTranslationX,-e.cacheTranslationY),t.restore()}_renderObjects(t,e){for(let i=0,r=e.length;i<r;++i)e[i]&&e[i].render(t)}_renderBackgroundOrOverlay(t,e){let i=this[`${e}Color`],r=this[`${e}Image`],s=this.viewportTransform,n=this[`${e}Vpt`];if(!i&&!r)return;let o=te(i);if(i){if(t.save(),t.beginPath(),t.moveTo(0,0),t.lineTo(this.width,0),t.lineTo(this.width,this.height),t.lineTo(0,this.height),t.closePath(),t.fillStyle=o?i.toLive(t):i,n&&t.transform(...s),o){t.transform(1,0,0,1,i.offsetX||0,i.offsetY||0);let e=i.gradientTransform||i.patternTransform;e&&t.transform(...e)}t.fill(),t.restore()}if(r){t.save();let{skipOffscreen:e}=this;this.skipOffscreen=n,n&&t.transform(...s),r.render(t),this.skipOffscreen=e,t.restore()}}_renderBackground(t){this._renderBackgroundOrOverlay(t,"background")}_renderOverlay(t){this._renderBackgroundOrOverlay(t,"overlay")}getCenterPoint(){return new gt(this.width/2,this.height/2)}centerObjectH(t){return this._centerObject(t,new gt(this.getCenterPoint().x,t.getCenterPoint().y))}centerObjectV(t){return this._centerObject(t,new gt(t.getCenterPoint().x,this.getCenterPoint().y))}centerObject(t){return this._centerObject(t,this.getCenterPoint())}viewportCenterObject(t){return this._centerObject(t,this.getVpCenter())}viewportCenterObjectH(t){return this._centerObject(t,new gt(this.getVpCenter().x,t.getCenterPoint().y))}viewportCenterObjectV(t){return this._centerObject(t,new gt(t.getCenterPoint().x,this.getVpCenter().y))}getVpCenter(){return Et(this.getCenterPoint(),Pt(this.viewportTransform))}_centerObject(t,e){t.setXY(e,R,R),t.setCoords(),this.renderOnAddRemove&&this.requestRenderAll()}toDatalessJSON(t){return this.toDatalessObject(t)}toObject(t){return this._toObjectMethod("toObject",t)}toJSON(){return this.toObject()}toDatalessObject(t){return this._toObjectMethod("toDatalessObject",t)}_toObjectMethod(t,e){let i=this.clipPath,r=i&&!i.excludeFromExport?this._toObject(i,t,e):null;return{version:j,...Kt(this,e),objects:this._objects.filter(t=>!t.excludeFromExport).map(i=>this._toObject(i,t,e)),...this.__serializeBgOverlay(t,e),...r?{clipPath:r}:null}}_toObject(t,e,i){let r;this.includeDefaultValues||(r=t.includeDefaultValues,t.includeDefaultValues=!1);let s=t[e](i);return this.includeDefaultValues||(t.includeDefaultValues=!!r),s}__serializeBgOverlay(t,e){let i={},r=this.backgroundImage,s=this.overlayImage,n=this.backgroundColor,o=this.overlayColor;return te(n)?n.excludeFromExport||(i.background=n.toObject(e)):n&&(i.background=n),te(o)?o.excludeFromExport||(i.overlay=o.toObject(e)):o&&(i.overlay=o),r&&!r.excludeFromExport&&(i.backgroundImage=this._toObject(r,t,e)),s&&!s.excludeFromExport&&(i.overlayImage=this._toObject(s,t,e)),i}toSVG(t={},e){t.reviver=e;let i=[];var r;return this._setSVGPreamble(i,t),this._setSVGHeader(i,t),this.clipPath&&i.push(`<g clip-path="url(#${fe(null==(r=this.clipPath.clipPathId)?"":r)})" >\n`),this._setSVGBgOverlayColor(i,"background"),this._setSVGBgOverlayImage(i,"backgroundImage",e),this._setSVGObjects(i,e),this.clipPath&&i.push("</g>\n"),this._setSVGBgOverlayColor(i,"overlay"),this._setSVGBgOverlayImage(i,"overlayImage",e),i.push("</svg>"),i.join("")}_setSVGPreamble(t,e){e.suppressPreamble||t.push('<?xml version="1.0" encoding="',e.encoding||"UTF-8",'" standalone="no" ?>\n','<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" ','"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n')}_setSVGHeader(t,e){let i,r=e.width||`${this.width}`,s=e.height||`${this.height}`,n=y.NUM_FRACTION_DIGITS,o=e.viewBox;if(o)i=`viewBox="${o.x} ${o.y} ${o.width} ${o.height}" `;else if(this.svgViewportTransformation){let t=this.viewportTransform;i=`viewBox="${Qt(-t[4]/t[0],n)} ${Qt(-t[5]/t[3],n)} ${Qt(this.width/t[0],n)} ${Qt(this.height/t[3],n)}" `}else i=`viewBox="0 0 ${this.width} ${this.height}" `;t.push("<svg ",'xmlns="http://www.w3.org/2000/svg" ','xmlns:xlink="http://www.w3.org/1999/xlink" ','version="1.1" ','width="',r,'" ','height="',s,'" ',i,'xml:space="preserve">\n',"<desc>Created with Fabric.js ",j,"</desc>\n","<defs>\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"</defs>\n")}createSVGClipPathMarkup(t){let e=this.clipPath;return e?(e.clipPathId=`CLIPPATH_${xt()}`,`<clipPath id="${e.clipPathId}" >\n${e.toClipPathSVG(t.reviver)}</clipPath>\n`):""}createSVGRefElementsMarkup(){return["background","overlay"].map(t=>{let e=this[`${t}Color`];if(te(e)){let i=this[`${t}Vpt`],r=this.viewportTransform,s={isType:()=>!1,width:this.width/(i?r[0]:1),height:this.height/(i?r[3]:1)};return e.toSVG(s,{additionalTransform:i?Zt(r):""})}}).join("")}createSVGFontFacesMarkup(){let t=[],e={},i=y.fontPaths;this._objects.forEach(function e(i){t.push(i),pt(i)&&i._objects.forEach(e)}),t.forEach(t=>{if(!(r=t)||"function"!=typeof r._renderText)return;var r;let{styles:s,fontFamily:n}=t;!e[n]&&i[n]&&(e[n]=!0,s&&Object.values(s).forEach(t=>{Object.values(t).forEach(({fontFamily:t=""})=>{!e[t]&&i[t]&&(e[t]=!0)})}))});let r=Object.keys(e).map(t=>`\t\t@font-face {\n\t\t\tfont-family: '${t}';\n\t\t\tsrc: url('${i[t]}');\n\t\t}\n`).join("");return r?`\t<style type="text/css"><![CDATA[\n${r}]]></style>\n`:""}_setSVGObjects(t,e){this.forEachObject(i=>{i.excludeFromExport||this._setSVGObject(t,i,e)})}_setSVGObject(t,e,i){t.push(e.toSVG(i))}_setSVGBgOverlayImage(t,e,i){let r=this[e];r&&!r.excludeFromExport&&r.toSVG&&t.push(r.toSVG(i))}_setSVGBgOverlayColor(t,e){let i=this[`${e}Color`];if(i)if(te(i)){let r=i.repeat||"",s=this.width,n=this.height,o=this[`${e}Vpt`]?Zt(Pt(this.viewportTransform)):"";t.push(`<rect transform="${o} translate(${s/2},${n/2})" x="${i.offsetX-s/2}" y="${i.offsetY-n/2}" width="${"repeat-y"!==r&&"no-repeat"!==r||!ie(i)?s:i.source.width}" height="${"repeat-x"!==r&&"no-repeat"!==r||!ie(i)?n:i.source.height}" fill="url(#SVGID_${i.id})"></rect>\n`)}else t.push('<rect x="0" y="0" width="100%" height="100%" ','fill="',i,'"',"></rect>\n")}loadFromJSON(t,e,{signal:i}={}){if(!t)return Promise.reject(new _("`json` is undefined"));let{objects:r=[],...s}="string"==typeof t?JSON.parse(t):t,{backgroundImage:n,background:o,overlayImage:a,overlay:l,clipPath:h}=s,c=this.renderOnAddRemove;return this.renderOnAddRemove=!1,Promise.all([Ut(r,{reviver:e,signal:i}),qt({backgroundImage:n,backgroundColor:o,overlayImage:a,overlayColor:l,clipPath:h},{signal:i})]).then(([t,e])=>(this.clear(),this.add(...t),this.set(s),this.set(e),this.renderOnAddRemove=c,this))}clone(t){let e=this.toObject(t);return this.cloneWithoutData().loadFromJSON(e)}cloneWithoutData(){let t=Tt(this);return new this.constructor(t)}toDataURL(t={}){let{format:e="png",quality:i=1,multiplier:r=1,enableRetinaScaling:s=!1}=t,n=r*(s?this.getRetinaScaling():1);return Ot(this.toCanvasElement(n,t),e,i)}toBlob(t={}){let{format:e="png",quality:i=1,multiplier:r=1,enableRetinaScaling:s=!1}=t,n=r*(s?this.getRetinaScaling():1);return kt(this.toCanvasElement(n,t),e,i)}toCanvasElement(t=1,{width:e,height:i,left:r,top:s,filter:n}={}){let o=(e||this.width)*t,a=(i||this.height)*t,l=this.getZoom(),h=this.width,c=this.height,u=this.skipControlsDrawing,d=l*t,g=this.viewportTransform,f=[d,0,0,d,(g[4]-(r||0))*t,(g[5]-(s||0))*t],p=this.enableRetinaScaling,m=Tt({width:o,height:a}),y=n?this._objects.filter(t=>n(t)):this._objects;return this.enableRetinaScaling=!1,this.viewportTransform=f,this.width=o,this.height=a,this.skipControlsDrawing=!0,this.calcViewportBoundaries(),this.renderCanvas(m.getContext("2d"),y),this.viewportTransform=g,this.width=h,this.height=c,this.calcViewportBoundaries(),this.enableRetinaScaling=p,this.skipControlsDrawing=u,m}dispose(){return!this.disposed&&this.elements.cleanupDOM({width:this.width,height:this.height}),lt.cancelByCanvas(this),this.disposed=!0,new Promise((t,e)=>{let i=()=>{this.destroy(),t(!0)};i.kill=e,this.__cleanupTask&&this.__cleanupTask.kill("aborted"),this.destroyed?t(!1):this.nextRenderHandle?this.__cleanupTask=i:i()})}destroy(){this.destroyed=!0,this.cancelRequestedRender(),this.forEachObject(t=>t.dispose()),this._objects=[],this.backgroundImage&&this.backgroundImage.dispose(),this.backgroundImage=void 0,this.overlayImage&&this.overlayImage.dispose(),this.overlayImage=void 0,this.elements.dispose()}toString(){return`#<Canvas (${this.complexity()}): { objects: ${this._objects.length} }>`}};p(_e,"ownDefaults",ue);const ve=["touchstart","touchmove","touchend"],xe=t=>{let e=se(t.target),i=function(t){let e=t.changedTouches;return e&&e[0]?e[0]:t}(t);return new gt(i.clientX+e.left,i.clientY+e.top)},Ce=t=>ve.includes(t.type)||"touch"===t.pointerType,we=t=>{t.preventDefault(),t.stopPropagation()},Se=t=>{let e=0,i=0,r=0,s=0;for(let n=0,o=t.length;n<o;n++){let{x:o,y:a}=t[n];(o>r||!n)&&(r=o),(o<e||!n)&&(e=o),(a>s||!n)&&(s=a),(a<i||!n)&&(i=a)}return{left:e,top:i,width:r-e,height:s-i}},Te=(t,e)=>{ke(t,At(Pt(e),t.calcOwnMatrix()))},Oe=(t,e)=>ke(t,At(e,t.calcOwnMatrix())),ke=(t,e)=>{let{translateX:i,translateY:r,scaleX:s,scaleY:n,...o}=Bt(e),a=new gt(i,r);t.flipX=!1,t.flipY=!1,Object.assign(t,o),t.set({scaleX:s,scaleY:n}),t.setPositionByOrigin(a,R,R)},De=t=>{t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.rotate(0)},Me=t=>({scaleX:t.scaleX,scaleY:t.scaleY,skewX:t.skewX,skewY:t.skewY,angle:t.angle,left:t.left,flipX:t.flipX,flipY:t.flipY,top:t.top}),je=(t,e,i)=>{let r=t/2,s=e/2,n=Se([new gt(-r,-s),new gt(r,-s),new gt(-r,s),new gt(r,s)].map(t=>t.transform(i)));return new gt(n.width,n.height)},Ee=(t=I,e=I)=>At(Pt(e),t),Pe=(t,e=I,i=I)=>t.transform(Ee(e,i)),Ae=(t,e=I,i=I)=>t.transform(Ee(e,i),!0),Fe=(t,e,i)=>{let r=Ee(e,i);return ke(t,At(r,t.calcOwnMatrix())),r},Le={left:-.5,top:-.5,center:0,bottom:.5,right:.5},Ie=t=>"string"==typeof t?Le[t]:t-.5,Re=new gt(1,0),Be=new gt,$e=(t,e)=>t.rotate(e),Xe=(t,e)=>new gt(e).subtract(t),Ye=t=>t.distanceFrom(Be),We=(t,e)=>Math.atan2(He(t,e),Ge(t,e)),Ne=t=>We(Re,t),Ve=t=>t.eq(Be)?t:t.scalarDivide(Ye(t)),ze=(t,e=!0)=>Ve(new gt(-t.y,t.x).scalarMultiply(e?1:-1)),He=(t,e)=>t.x*e.y-t.y*e.x,Ge=(t,e)=>t.x*e.x+t.y*e.y,Ue=(t,e,i)=>{if(t.eq(e)||t.eq(i))return!0;let r=He(e,i),s=He(e,t),n=He(i,t);return r>=0?s>=0&&n<=0:!(s<=0&&n>=0)},qe="not-allowed";function Ke(t){return Ie(t.originX)===Ie("center")&&Ie(t.originY)===Ie("center")}function Je(t){return.5-Ie(t)}const Qe=(t,e)=>t[e],Ze=(t,e,i,r)=>({e:t,transform:e,pointer:new gt(i,r)});function ti(t,e,i){let r=i,s=Ne(Xe(Pe(t.getCenterPoint(),t.canvas.viewportTransform,void 0),r))+F;return Math.round(s%F/A)}function ei({target:t,corner:e},i,r,s,n){var o;let a=t.controls[e],l=(null==(o=t.canvas)?void 0:o.getZoom())||1,h=t.padding/l,c=function(t,e,i,r){let s=t.getRelativeCenterPoint(),n=void 0!==i&&void 0!==r?t.translateToGivenOrigin(s,R,R,i,r):new gt(t.left,t.top);return(t.angle?e.rotate(-Dt(t.angle),s):e).subtract(n)}(t,new gt(s,n),i,r);return c.x>=h&&(c.x-=h),c.x<=-h&&(c.x+=h),c.y>=h&&(c.y-=h),c.y<=h&&(c.y+=h),c.x-=a.offsetX,c.y-=a.offsetY,c}const ii=new RegExp(String.raw`[\0-\x1F\x7F;<>\\]|\/\*|\*\/|url\s*\(|expression\s*\(|(?:java|vb)script\s*:|data\s*:|@import\b`,"iu"),ri=t=>"string"==typeof t&&t.trim().length>0&&!ii.test(t),si=(t,e="")=>{let i=Number(t);return Number.isFinite(i)?`${i}`:e},ni=(t,e="")=>"string"==typeof t&&ri(t)?t:e,oi=t=>t.replace(/\s+/g," "),ai={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#0FF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000",blanchedalmond:"#FFEBCD",blue:"#00F",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#0FF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",darkgreen:"#006400",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#F0F",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",lightgreen:"#90EE90",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#0F0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#F0F",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",rebeccapurple:"#639",red:"#F00",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",white:"#FFF",whitesmoke:"#F5F5F5",yellow:"#FF0",yellowgreen:"#9ACD32"},li=(t,e,i)=>(i<0&&(i+=1),i>1&&--i,i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t),hi=(t,e,i,r)=>{t/=255,e/=255,i/=255;let s,n,o=Math.max(t,e,i),a=Math.min(t,e,i),l=(o+a)/2;if(o===a)s=n=0;else{let r=o-a;switch(n=l>.5?r/(2-o-a):r/(o+a),o){case t:s=(e-i)/r+(e<i?6:0);break;case e:s=(i-t)/r+2;break;case i:s=(t-e)/r+4}s/=6}return[Math.round(360*s),Math.round(100*n),Math.round(100*l),r]},ci=(t="1")=>parseFloat(t)/(t.endsWith("%")?100:1),ui=t=>Math.min(Math.round(t),255).toString(16).toUpperCase().padStart(2,"0"),di=([t,e,i,r=1])=>{let s=Math.round(.3*t+.59*e+.11*i);return[s,s,s,r]};var gi=class t{constructor(e){if(p(this,"isUnrecognised",!1),e)if(e instanceof t)this.setSource([...e._source]);else if(Array.isArray(e)){let[t,i,r,s=1]=e;this.setSource([t,i,r,s])}else this.setSource(this._tryParsingColor(e));else this.setSource([0,0,0,1])}_tryParsingColor(e){return(e=e.toLowerCase())in ai&&(e=ai[e]),"transparent"===e?[255,255,255,0]:t.sourceFromHex(e)||t.sourceFromRgb(e)||t.sourceFromHsl(e)||(this.isUnrecognised=!0)&&[0,0,0,1]}getSource(){return this._source}setSource(t){this._source=t}toRgb(){let[t,e,i]=this.getSource();return`rgb(${t},${e},${i})`}toRgba(){return`rgba(${this.getSource().join(",")})`}toHsl(){let[t,e,i]=hi(...this.getSource());return`hsl(${t},${e}%,${i}%)`}toHsla(){let[t,e,i,r]=hi(...this.getSource());return`hsla(${t},${e}%,${i}%,${r})`}toHex(){return this.toHexa().slice(0,6)}toHexa(){let[t,e,i,r]=this.getSource();return`${ui(t)}${ui(e)}${ui(i)}${ui(Math.round(255*r))}`}getAlpha(){return this.getSource()[3]}setAlpha(t){return this._source[3]=t,this}toGrayscale(){return this.setSource(di(this.getSource())),this}toBlackWhite(t){let[e,,,i]=di(this.getSource()),r=e<(t||127)?0:255;return this.setSource([r,r,r,i]),this}overlayWith(e){e instanceof t||(e=new t(e));let i=this.getSource(),r=e.getSource(),[s,n,o]=i.map((t,e)=>Math.round(.5*t+.5*r[e]));return this.setSource([s,n,o,i[3]]),this}static fromRgb(e){return t.fromRgba(e)}static fromRgba(e){return new t(t.sourceFromRgb(e))}static sourceFromRgb(t){let e=oi(t).match(/^rgba?\(\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?(?:\s?[,/]\s?(\d{0,3}(?:\.\d+)?%?)\s?)?\)$/i);if(e){let[t,i,r]=e.slice(1,4).map(t=>{let e=parseFloat(t);return t.endsWith("%")?Math.round(2.55*e):e});return[t,i,r,ci(e[4])]}}static fromHsl(e){return t.fromHsla(e)}static fromHsla(e){return new t(t.sourceFromHsl(e))}static sourceFromHsl(e){let i=oi(e).match(/^hsla?\(\s?([+-]?\d{0,3}(?:\.\d+)?(?:deg|turn|rad)?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?(?:\s?[,/]\s?(\d*(?:\.\d+)?%?)\s?)?\)$/i);if(!i)return;let r,s,n,o=(t.parseAngletoDegrees(i[1])%360+360)%360/360,a=parseFloat(i[2])/100,l=parseFloat(i[3])/100;if(0===a)r=s=n=l;else{let t=l<=.5?l*(a+1):l+a-l*a,e=2*l-t;r=li(e,t,o+1/3),s=li(e,t,o),n=li(e,t,o-1/3)}return[Math.round(255*r),Math.round(255*s),Math.round(255*n),ci(i[4])]}static fromHex(e){return new t(t.sourceFromHex(e))}static sourceFromHex(t){if(t.match(/^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i)){let e,i=t.slice(t.indexOf("#")+1);e=i.length<=4?i.split("").map(t=>t+t):i.match(/.{2}/g);let[r,s,n,o=255]=e.map(t=>parseInt(t,16));return[r,s,n,o/255]}}static parseAngletoDegrees(t){let e=t.toLowerCase(),i=parseFloat(e);return e.includes("rad")?Mt(i):e.includes("turn")?360*i:i}};const fi=t=>{let e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":return e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);case"radialGradient":return e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);case"stop":return e.concat(["offset","stop-color","stop-opacity"])}return e},pi=(t,e=16)=>{let i=/\D{0,2}$/.exec(t),r=parseFloat(t),s=y.DPI;switch(null==i?void 0:i[0]){case"mm":return r*s/25.4;case"cm":return r*s/2.54;case"in":return r*s;case"pt":return r*s/72;case"pc":return r*s/72*12;case"em":return r*e;default:return r}},mi=t=>{let[e,i]=t.trim().split(" "),[r,s]=(n=e)&&"none"!==n?[n.slice(1,4),n.slice(5,8)]:"none"===n?[n,n]:["Mid","Mid"];var n;return{meetOrSlice:i||"meet",alignX:r,alignY:s}},yi=(t,e,i=!0)=>{let r,s;if(e)if(e.toLive)r=`url(#SVGID_${fe(e.id)})`;else{let t=String(e);if(ri(t)){let e=new gi(t),i=e.getAlpha();r=e.toRgb(),1!==i&&(s=i.toString())}else r=new gi("black").toRgb()}else r="none";return i?`${t}: ${r}; ${s?`${t}-opacity: ${s}; `:""}`:`${t}="${r}" ${s?`${t}-opacity="${s}" `:""}`};var bi=class{getSvgStyles(t){let e=null==this.fillRule?"nonzero":ni(this.fillRule),i=null==this.strokeWidth?"0":si(this.strokeWidth),r=null==this.strokeDashArray?Y:this.strokeDashArray.every(t=>Number.isFinite(Number(t)))?this.strokeDashArray.join(" "):"",s=null==this.strokeDashOffset?"0":si(this.strokeDashOffset),n=null==this.strokeLineCap?"butt":ni(this.strokeLineCap),o=null==this.strokeLineJoin?"miter":ni(this.strokeLineJoin),a=null==this.strokeMiterLimit?"4":si(this.strokeMiterLimit),l=null==this.opacity?"1":si(this.opacity),h=this.visible?"":" visibility: hidden;",c=t?"":this.getSvgFilter(),u=yi(it,this.fill);return[yi(rt,this.stroke),i?`stroke-width: ${i}; `:"",r?`stroke-dasharray: ${r}; `:"",n?`stroke-linecap: ${n}; `:"",s?`stroke-dashoffset: ${s}; `:"",o?`stroke-linejoin: ${o}; `:"",a?`stroke-miterlimit: ${a}; `:"",u,e?`fill-rule: ${e}; `:"",l?`opacity: ${l};`:"",c,h].map(t=>fe(t)).join("")}getSvgFilter(){return this.shadow?`filter: url(#SVGID_${fe(this.shadow.id)});`:""}getSvgCommons(){return[this.id?`id="${fe(String(this.id))}" `:"",this.clipPath?`clip-path="url(#${fe(this.clipPath.clipPathId)})" `:""].join("")}getSvgTransform(t,e=""){return`transform="${Zt(t?this.calcTransformMatrix():this.calcOwnMatrix())}${e}" `}_toSVG(t){return[""]}toSVG(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})}toClipPathSVG(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})}_createBaseClipPathSVGMarkup(t,{reviver:e,additionalTransform:i=""}={}){let r=[this.getSvgTransform(!0,i),this.getSvgCommons()].join(""),s=t.indexOf("COMMON_PARTS");return t[s]=r,e?e(t.join("")):t.join("")}_createBaseSVGMarkup(t,{noStyle:e,reviver:i,withShadow:r,additionalTransform:s}={}){let n,o=e?"":`style="${this.getSvgStyles()}" `,a=r?`style="${this.getSvgFilter()}" `:"",l=this.clipPath,h=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",c=l&&l.absolutePositioned,u=this.stroke,d=this.fill,g=this.shadow,f=[],p=t.indexOf("COMMON_PARTS");return l&&(l.clipPathId=`CLIPPATH_${xt()}`,n=`<clipPath id="${l.clipPathId}" >\n${l.toClipPathSVG(i)}</clipPath>\n`),c&&f.push("<g ",a,this.getSvgCommons()," >\n"),f.push("<g ",this.getSvgTransform(!1),c?"":a+this.getSvgCommons()," >\n"),t[p]=[o,h,e?"":this.addPaintOrder()," ",s?`transform="${s}" `:""].join(""),te(d)&&f.push(d.toSVG(this)),te(u)&&f.push(u.toSVG(this)),g&&f.push(g.toSVG(this)),l&&f.push(n),f.push(t.join("")),f.push("</g>\n"),c&&f.push("</g>\n"),i?i(f.join("")):f.join("")}addPaintOrder(){return"fill"===this.paintFirst?"":` paint-order="${fe(this.paintFirst)}" `}};function _n(t){return RegExp("^("+t.join("|")+")\\b","i")}const _i="textDecorationThickness",vi="textDecorationColor",xi=["fontSize","fontWeight","fontFamily","fontStyle"],Ci=["underline","overline","linethrough"],wi=[...xi,"lineHeight","text","charSpacing","textAlign","styles","path","pathStartOffset","pathSide","pathAlign"],Si=[...wi,...Ci,"textBackgroundColor","direction",_i,vi],Ti=[...xi,...Ci,rt,"strokeWidth",it,"deltaY","textBackgroundColor",_i,vi],Oi={_reNewline:W,_reSpacesAndTabs:/[ \t\r]/g,_reSpaceAndTab:/[ \t\r]/,_reWords:/\S+/g,fontSize:40,fontWeight:nt,fontFamily:"Times New Roman",underline:!1,overline:!1,linethrough:!1,textAlign:B,fontStyle:nt,lineHeight:1.16,textBackgroundColor:"",stroke:null,shadow:null,path:void 0,pathStartOffset:0,pathSide:B,pathAlign:"baseline",charSpacing:0,deltaY:0,direction:"ltr",CACHE_FONT_SIZE:400,MIN_TEXT_WIDTH:2,superscript:{size:.6,baseline:-.35},subscript:{size:.6,baseline:.11},_fontSizeFraction:.222,offsets:{underline:.1,linethrough:-.28167,overline:-.81333},_fontSizeMult:1.13,[_i]:66.667},ki="justify",Di=String.raw`[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?`,Mi=String.raw`(?:\s*,?\s+|\s*,\s*)`,ji=RegExp("(normal|italic)?\\s*(normal|small-caps)?\\s*(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*("+Di+"(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|"+Di+"))?\\s+(.*)"),Ei={cx:B,x:B,r:"radius",cy:"top",y:"top",display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","letter-spacing":"charSpacing","paint-order":"paintFirst","stroke-dasharray":"strokeDashArray","stroke-dashoffset":"strokeDashOffset","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"textAnchor",opacity:"opacity","clip-path":"clipPath","clip-rule":"clipRule","vector-effect":"strokeUniform","image-rendering":"imageSmoothing","text-decoration-thickness":_i,"text-decoration-color":vi},Pi="font-size",Ai="clip-path",Fi=(_n(["path","circle","polygon","polyline","ellipse","rect","line","image","text"]),_n(["symbol","image","marker","pattern","view","svg"]),_n(["symbol","g","a","svg","clipPath","defs"])),Li=(new RegExp(String.raw`^\s*(${Di})${Mi}(${Di})${Mi}(${Di})${Mi}(${Di})\s*$`),"(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?"),Ii=RegExp("(?:\\s|^)"+Li+Li+"("+Di+"?(?:px)?)?(?:\\s?|$)(?:$|\\s)");var Ri=class t{constructor(e={}){let i="string"==typeof e?t.parseShadow(e):e;Object.assign(this,t.ownDefaults,i),this.id=xt()}static parseShadow(t){let e=t.trim(),[,i=0,r=0,s=0]=(Ii.exec(e)||[]).map(t=>parseFloat(t)||0);return{color:(e.replace(Ii,"")||"rgb(0,0,0)").trim(),offsetX:i,offsetY:r,blur:s}}toString(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")}toSVG(t){let e=$e(new gt(this.offsetX,this.offsetY),Dt(-t.angle)),i=y.NUM_FRACTION_DIGITS,r=new gi(this.color),s=40,n=40;return t.width&&t.height&&(s=100*Qt((Math.abs(e.x)+this.blur)/t.width,i)+20,n=100*Qt((Math.abs(e.y)+this.blur)/t.height,i)+20),t.flipX&&(e.x*=-1),t.flipY&&(e.y*=-1),`<filter id="SVGID_${fe(this.id)}" y="-${n}%" height="${100+2*n}%" x="-${s}%" width="${100+2*s}%" >\n\t<feGaussianBlur in="SourceAlpha" stdDeviation="${Qt(this.blur?this.blur/2:0,i)}"></feGaussianBlur>\n\t<feOffset dx="${Qt(e.x,i)}" dy="${Qt(e.y,i)}" result="oBlur" ></feOffset>\n\t<feFlood flood-color="${r.toRgb()}" flood-opacity="${r.getAlpha()}"/>\n\t<feComposite in2="oBlur" operator="in" />\n\t<feMerge>\n\t\t<feMergeNode></feMergeNode>\n\t\t<feMergeNode in="SourceGraphic"></feMergeNode>\n\t</feMerge>\n</filter>\n`}toObject(){let e={color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling,type:this.constructor.type},i=t.ownDefaults;return this.includeDefaultValues?e:Jt(e,(t,e)=>t!==i[e])}static async fromObject(t){return new this(t)}};p(Ri,"ownDefaults",{color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1}),p(Ri,"type","shadow"),at.setClass(Ri,"shadow");const Bi=(t,e,i)=>Math.max(t,Math.min(e,i)),$i=["top",B,Q,Z,"flipX","flipY","originX","originY","angle","opacity","globalCompositeOperation","shadow","visible",tt,et],Xi=[it,rt,"strokeWidth","strokeDashArray","width","height","paintFirst","strokeUniform","strokeLineCap","strokeDashOffset","strokeLineJoin","strokeMiterLimit","backgroundColor","clipPath"],Yi={top:0,left:0,width:0,height:0,angle:0,flipX:!1,flipY:!1,scaleX:1,scaleY:1,minScaleLimit:0,skewX:0,skewY:0,originX:R,originY:R,strokeWidth:1,strokeUniform:!1,padding:0,opacity:1,paintFirst:it,fill:"rgb(0,0,0)",fillRule:"nonzero",stroke:null,strokeDashArray:null,strokeDashOffset:0,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:4,globalCompositeOperation:"source-over",backgroundColor:"",shadow:null,visible:!0,includeDefaultValues:!0,excludeFromExport:!1,objectCaching:!0,clipPath:void 0,inverted:!1,absolutePositioned:!1,centeredRotation:!0,centeredScaling:!1,dirty:!0};var Wi=d({defaultEasing:()=>zi,easeInBack:()=>gr,easeInBounce:()=>yr,easeInCirc:()=>ar,easeInCubic:()=>Hi,easeInElastic:()=>cr,easeInExpo:()=>sr,easeInOutBack:()=>pr,easeInOutBounce:()=>br,easeInOutCirc:()=>hr,easeInOutCubic:()=>Ui,easeInOutElastic:()=>dr,easeInOutExpo:()=>or,easeInOutQuad:()=>xr,easeInOutQuart:()=>Ji,easeInOutQuint:()=>tr,easeInOutSine:()=>rr,easeInQuad:()=>_r,easeInQuart:()=>qi,easeInQuint:()=>Qi,easeInSine:()=>er,easeOutBack:()=>fr,easeOutBounce:()=>mr,easeOutCirc:()=>lr,easeOutCubic:()=>Gi,easeOutElastic:()=>ur,easeOutExpo:()=>nr,easeOutQuad:()=>vr,easeOutQuart:()=>Ki,easeOutQuint:()=>Zi,easeOutSine:()=>ir});const Ni=(t,e,i,r)=>(t<Math.abs(e)?(t=e,r=i/4):r=0===e&&0===t?i/F*Math.asin(1):i/F*Math.asin(e/t),{a:t,c:e,p:i,s:r}),Vi=(t,e,i,r,s)=>t*2**(10*--r)*Math.sin((r*s-e)*F/i),zi=(t,e,i,r)=>-i*Math.cos(t/r*P)+i+e,Hi=(t,e,i,r)=>i*(t/r)**3+e,Gi=(t,e,i,r)=>i*((t/r-1)**3+1)+e,Ui=(t,e,i,r)=>(t/=r/2)<1?i/2*t**3+e:i/2*((t-2)**3+2)+e,qi=(t,e,i,r)=>i*(t/=r)*t**3+e,Ki=(t,e,i,r)=>-i*((t=t/r-1)*t**3-1)+e,Ji=(t,e,i,r)=>(t/=r/2)<1?i/2*t**4+e:-i/2*((t-=2)*t**3-2)+e,Qi=(t,e,i,r)=>i*(t/r)**5+e,Zi=(t,e,i,r)=>i*((t/r-1)**5+1)+e,tr=(t,e,i,r)=>(t/=r/2)<1?i/2*t**5+e:i/2*((t-2)**5+2)+e,er=(t,e,i,r)=>-i*Math.cos(t/r*P)+i+e,ir=(t,e,i,r)=>i*Math.sin(t/r*P)+e,rr=(t,e,i,r)=>-i/2*(Math.cos(Math.PI*t/r)-1)+e,sr=(t,e,i,r)=>0===t?e:i*2**(10*(t/r-1))+e,nr=(t,e,i,r)=>t===r?e+i:i*-(2**(-10*t/r)+1)+e,or=(t,e,i,r)=>0===t?e:t===r?e+i:(t/=r/2)<1?i/2*2**(10*(t-1))+e:i/2*-(2**(-10*(t-1))+2)+e,ar=(t,e,i,r)=>-i*(Math.sqrt(1-(t/=r)*t)-1)+e,lr=(t,e,i,r)=>i*Math.sqrt(1-(t=t/r-1)*t)+e,hr=(t,e,i,r)=>(t/=r/2)<1?-i/2*(Math.sqrt(1-t**2)-1)+e:i/2*(Math.sqrt(1-(t-=2)*t)+1)+e,cr=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(1===(t/=r))return e+i;n||(n=.3*r);let{a:o,s:a,p:l}=Ni(s,i,n,1.70158);return-Vi(o,a,l,t,r)+e},ur=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(1===(t/=r))return e+i;n||(n=.3*r);let{a:o,s:a,p:l,c:h}=Ni(s,i,n,1.70158);return o*2**(-10*t)*Math.sin((t*r-a)*F/l)+h+e},dr=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(2==(t/=r/2))return e+i;n||(n=.3*1.5*r);let{a:o,s:a,p:l,c:h}=Ni(s,i,n,1.70158);return t<1?-.5*Vi(o,a,l,t,r)+e:o*2**(-10*--t)*Math.sin((t*r-a)*F/l)*.5+h+e},gr=(t,e,i,r,s=1.70158)=>i*(t/=r)*t*((s+1)*t-s)+e,fr=(t,e,i,r,s=1.70158)=>i*((t=t/r-1)*t*((s+1)*t+s)+1)+e,pr=(t,e,i,r,s=1.70158)=>(t/=r/2)<1?i/2*(t*t*((1+(s*=1.525))*t-s))+e:i/2*((t-=2)*t*((1+(s*=1.525))*t+s)+2)+e,mr=(t,e,i,r)=>(t/=r)<1/2.75?i*(7.5625*t*t)+e:t<2/2.75?i*(7.5625*(t-=1.5/2.75)*t+.75)+e:t<2.5/2.75?i*(7.5625*(t-=2.25/2.75)*t+.9375)+e:i*(7.5625*(t-=2.625/2.75)*t+.984375)+e,yr=(t,e,i,r)=>i-mr(r-t,0,i,r)+e,br=(t,e,i,r)=>t<r/2?.5*yr(2*t,0,i,r)+e:.5*mr(2*t-r,0,i,r)+.5*i+e,_r=(t,e,i,r)=>i*(t/=r)*t+e,vr=(t,e,i,r)=>-i*(t/=r)*(t-2)+e,xr=(t,e,i,r)=>(t/=r/2)<1?i/2*t**2+e:-i/2*(--t*(t-2)-1)+e,Cr=()=>!1;var wr=class{constructor({startValue:t,byValue:e,duration:i=500,delay:r=0,easing:s=zi,onStart:n=E,onChange:o=E,onComplete:a=E,abort:l=Cr,target:h}){p(this,"_state","pending"),p(this,"durationProgress",0),p(this,"valueProgress",0),this.tick=this.tick.bind(this),this.duration=i,this.delay=r,this.easing=s,this._onStart=n,this._onChange=o,this._onComplete=a,this._abort=l,this.target=h,this.startValue=t,this.byValue=e,this.value=this.startValue,this.endValue=Object.freeze(this.calculate(this.duration).value)}get state(){return this._state}isDone(){return"aborted"===this._state||"completed"===this._state}start(){let t=t=>{"pending"===this._state&&(this.startTime=t||+new Date,this._state="running",this._onStart(),this.tick(this.startTime))};this.register(),this.delay>0?this.timeout=k().setTimeout(()=>bt(t),this.delay):bt(t)}tick(t){let e=(t||+new Date)-this.startTime,i=Math.min(e,this.duration);this.durationProgress=i/this.duration;let{value:r,valueProgress:s}=this.calculate(i);this.value=Object.freeze(r),this.valueProgress=s,"aborted"!==this._state&&(this._abort(this.value,this.valueProgress,this.durationProgress)?(this._state="aborted",this.unregister()):e>=this.duration?(this.durationProgress=this.valueProgress=1,this._onChange(this.endValue,this.valueProgress,this.durationProgress),this._state="completed",this._onComplete(this.endValue,this.valueProgress,this.durationProgress),this.unregister(),this.timeout=null):(this._onChange(this.value,this.valueProgress,this.durationProgress),bt(this.tick)))}register(){lt.push(this)}unregister(){lt.remove(this)}abort(){this._state="aborted",this.unregister(),this.timeout&&k().clearTimeout(this.timeout)}},Sr=class extends wr{constructor({startValue:t=0,endValue:e=100,...i}){super({...i,startValue:t,byValue:e-t})}calculate(t){let e=this.easing(t,this.startValue,this.byValue,this.duration);return{value:e,valueProgress:Math.abs((e-this.startValue)/this.byValue)}}},Tr=class extends wr{constructor({startValue:t=[0],endValue:e=[100],...i}){super({...i,startValue:t,byValue:e.map((e,i)=>e-t[i])})}calculate(t){let e=this.startValue.map((e,i)=>this.easing(t,e,this.byValue[i],this.duration,i));return{value:e,valueProgress:Math.abs((e[0]-this.startValue[0])/this.byValue[0])}}};const Or=(t,e,i,r)=>e+i*(1-Math.cos(t/r*P)),kr=t=>t&&((e,i,r)=>t(new gi(e).toRgba(),i,r));var Dr=class extends wr{constructor({startValue:t,endValue:e,easing:i=Or,onChange:r,onComplete:s,abort:n,...o}){let a=new gi(t).getSource(),l=new gi(e).getSource();super({...o,startValue:a,byValue:l.map((t,e)=>t-a[e]),easing:i,onChange:kr(r),onComplete:kr(s),abort:kr(n)})}calculate(t){let[e,i,r,s]=this.startValue.map((e,i)=>this.easing(t,e,this.byValue[i],this.duration,i)),n=[...[e,i,r].map(Math.round),Bi(0,s,1)];return{value:n,valueProgress:n.map((t,e)=>0===this.byValue[e]?0:Math.abs((t-this.startValue[e])/this.byValue[e])).find(t=>0!==t)||0}}};function Mr(t){let e=(t=>Array.isArray(t.startValue)||Array.isArray(t.endValue))(t)?new Tr(t):new Sr(t);return e.start(),e}function jr(t){let e=new Dr(t);return e.start(),e}var Er=class t{constructor(t){this.status=t,this.points=[]}includes(t){return this.points.some(e=>e.eq(t))}append(...t){return this.points=this.points.concat(t.filter(t=>!this.includes(t))),this}static isPointContained(t,e,i,r=!1){if(e.eq(i))return t.eq(e);if(e.x===i.x)return t.x===e.x&&(r||t.y>=Math.min(e.y,i.y)&&t.y<=Math.max(e.y,i.y));if(e.y===i.y)return t.y===e.y&&(r||t.x>=Math.min(e.x,i.x)&&t.x<=Math.max(e.x,i.x));{let s=Xe(e,i),n=Xe(e,t).divide(s);return r?Math.abs(n.x)===Math.abs(n.y):n.x===n.y&&n.x>=0&&n.x<=1}}static isPointInPolygon(t,e){let i=new gt(t).setX(Math.min(t.x-1,...e.map(t=>t.x))),r=0;for(let s=0;s<e.length;s++){let n=this.intersectSegmentSegment(e[s],e[(s+1)%e.length],t,i);if(n.includes(t))return!0;r+=Number("Intersection"===n.status)}return r%2==1}static intersectLineLine(e,i,r,s,n=!0,o=!0){let a=i.x-e.x,l=i.y-e.y,h=s.x-r.x,c=s.y-r.y,u=e.x-r.x,d=e.y-r.y,g=h*d-c*u,f=a*d-l*u,p=c*a-h*l;if(0!==p){let i=g/p,r=f/p;return(n||0<=i&&i<=1)&&(o||0<=r&&r<=1)?new t("Intersection").append(new gt(e.x+i*a,e.y+i*l)):new t}return new t(0===g||0===f?n||o||t.isPointContained(e,r,s)||t.isPointContained(i,r,s)||t.isPointContained(r,e,i)||t.isPointContained(s,e,i)?"Coincident":void 0:"Parallel")}static intersectSegmentLine(e,i,r,s){return t.intersectLineLine(e,i,r,s,!1,!0)}static intersectSegmentSegment(e,i,r,s){return t.intersectLineLine(e,i,r,s,!1,!1)}static intersectLinePolygon(e,i,r,s=!0){let n=new t,o=r.length;for(let a,l,h,c=0;c<o;c++){if(a=r[c],l=r[(c+1)%o],h=t.intersectLineLine(e,i,a,l,s,!1),"Coincident"===h.status)return h;n.append(...h.points)}return n.points.length>0&&(n.status="Intersection"),n}static intersectSegmentPolygon(e,i,r){return t.intersectLinePolygon(e,i,r,!1)}static intersectPolygonPolygon(e,i){let r=new t,s=e.length,n=[];for(let o=0;o<s;o++){let a=e[o],l=e[(o+1)%s],h=t.intersectSegmentPolygon(a,l,i);"Coincident"===h.status?(n.push(h),r.append(a,l)):r.append(...h.points)}return n.length>0&&n.length===e.length?new t("Coincident"):(r.points.length>0&&(r.status="Intersection"),r)}static intersectPolygonRectangle(e,i,r){let s=i.min(r),n=i.max(r),o=new gt(n.x,s.y),a=new gt(s.x,n.y);return t.intersectPolygonPolygon(e,[s,o,n,a])}},Pr=class extends yt{getX(){return this.getXY().x}setX(t){this.setXY(this.getXY().setX(t))}getY(){return this.getXY().y}setY(t){this.setXY(this.getXY().setY(t))}getRelativeX(){return this.left}setRelativeX(t){this.left=t}getRelativeY(){return this.top}setRelativeY(t){this.top=t}getXY(){let t=this.getRelativeXY();return this.group?Et(t,this.group.calcTransformMatrix()):t}setXY(t,e,i){this.group&&(t=Et(t,Pt(this.group.calcTransformMatrix()))),this.setRelativeXY(t,e,i)}getRelativeXY(){return new gt(this.left,this.top)}setRelativeXY(t,e=this.originX,i=this.originY){this.setPositionByOrigin(t,e,i)}isStrokeAccountedForInDimensions(){return!1}getCoords(){let{tl:t,tr:e,br:i,bl:r}=this.aCoords||(this.aCoords=this.calcACoords()),s=[t,e,i,r];if(this.group){let t=this.group.calcTransformMatrix();return s.map(e=>Et(e,t))}return s}intersectsWithRect(t,e){return"Intersection"===Er.intersectPolygonRectangle(this.getCoords(),t,e).status}intersectsWithObject(t){let e=Er.intersectPolygonPolygon(this.getCoords(),t.getCoords());return"Intersection"===e.status||"Coincident"===e.status||t.isContainedWithinObject(this)||this.isContainedWithinObject(t)}isContainedWithinObject(t){return this.getCoords().every(e=>t.containsPoint(e))}isContainedWithinRect(t,e){let{left:i,top:r,width:s,height:n}=this.getBoundingRect();return i>=t.x&&i+s<=e.x&&r>=t.y&&r+n<=e.y}isOverlapping(t){return this.intersectsWithObject(t)||this.isContainedWithinObject(t)||t.isContainedWithinObject(this)}containsPoint(t){return Er.isPointInPolygon(t,this.getCoords())}isOnScreen(){if(!this.canvas)return!1;let{tl:t,br:e}=this.canvas.vptCoords;return!!this.getCoords().some(i=>i.x<=e.x&&i.x>=t.x&&i.y<=e.y&&i.y>=t.y)||!!this.intersectsWithRect(t,e)||this.containsPoint(t.midPointFrom(e))}isPartiallyOnScreen(){if(!this.canvas)return!1;let{tl:t,br:e}=this.canvas.vptCoords;return!!this.intersectsWithRect(t,e)||this.getCoords().every(i=>(i.x>=e.x||i.x<=t.x)&&(i.y>=e.y||i.y<=t.y))&&this.containsPoint(t.midPointFrom(e))}getBoundingRect(){return Se(this.getCoords())}getScaledWidth(){return this._getTransformedDimensions().x}getScaledHeight(){return this._getTransformedDimensions().y}scale(t){this._set(Q,t),this._set(Z,t),this.setCoords()}scaleToWidth(t){let e=this.getBoundingRect().width/this.getScaledWidth();return this.scale(t/this.width/e)}scaleToHeight(t){let e=this.getBoundingRect().height/this.getScaledHeight();return this.scale(t/this.height/e)}getCanvasRetinaScaling(){var t;return(null==(t=this.canvas)?void 0:t.getRetinaScaling())||1}getTotalAngle(){return this.group?Mt(Lt(this.calcTransformMatrix())):this.angle}getViewportTransform(){var t;return(null==(t=this.canvas)?void 0:t.viewportTransform)||I.concat()}calcACoords(){let t=Xt({angle:this.angle}),{x:e,y:i}=this.getRelativeCenterPoint(),r=At($t(e,i),t),s=this._getTransformedDimensions(),n=s.x/2,o=s.y/2;return{tl:Et({x:-n,y:-o},r),tr:Et({x:n,y:-o},r),bl:Et({x:-n,y:o},r),br:Et({x:n,y:o},r)}}setCoords(){this.aCoords=this.calcACoords()}transformMatrixKey(t=!1){let e=[];return!t&&this.group&&(e=this.group.transformMatrixKey(t)),e.push(this.top,this.left,this.width,this.height,this.scaleX,this.scaleY,this.angle,this.strokeWidth,this.skewX,this.skewY,+this.flipX,+this.flipY,Ie(this.originX),Ie(this.originY)),e}calcTransformMatrix(t=!1){let e=this.calcOwnMatrix();if(t||!this.group)return e;let i=this.transformMatrixKey(t),r=this.matrixCache;return r&&r.key.every((t,e)=>t===i[e])?r.value:(this.group&&(e=At(this.group.calcTransformMatrix(!1),e)),this.matrixCache={key:i,value:e},e)}calcOwnMatrix(){let t=this.transformMatrixKey(!0),e=this.ownMatrixCache;if(e&&e.key.every((e,i)=>e===t[i]))return e.value;let i=this.getRelativeCenterPoint(),r=Ht({angle:this.angle,translateX:i.x,translateY:i.y,scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,flipX:this.flipX,flipY:this.flipY});return this.ownMatrixCache={key:t,value:r},r}_getNonTransformedDimensions(){return new gt(this.width,this.height).scalarAdd(this.strokeWidth)}_calculateCurrentDimensions(t){var e;let i=null==(e=this.canvas)?void 0:e.viewportTransform,r=this._getTransformedDimensions(t);return i?r.multiply(new gt(It(i),Rt(i))).scalarAdd(2*this.padding):r.scalarAdd(2*this.padding)}_getTransformedDimensions(t={}){let e={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,width:this.width,height:this.height,strokeWidth:this.strokeWidth,...t},i=e.strokeWidth,r=i,s=0;this.strokeUniform&&(r=0,s=i);let n,o=e.width+r,a=e.height+r;return n=0===e.skewX&&0===e.skewY?new gt(o*e.scaleX,a*e.scaleY):je(o,a,zt(e)),n.scalarAdd(s)}translateToGivenOrigin(t,e,i,r,s){let n=t.x,o=t.y,a=Ie(r)-Ie(e),l=Ie(s)-Ie(i);if(a||l){let t=this._getTransformedDimensions();n+=a*t.x,o+=l*t.y}return new gt(n,o)}translateToCenterPoint(t,e,i){if("center"===e&&"center"===i)return t;let r=this.translateToGivenOrigin(t,e,i,R,R);return this.angle?r.rotate(Dt(this.angle),t):r}translateToOriginPoint(t,e,i){let r=this.translateToGivenOrigin(t,R,R,e,i);return this.angle?r.rotate(Dt(this.angle),t):r}getCenterPoint(){let t=this.getRelativeCenterPoint();return this.group?Et(t,this.group.calcTransformMatrix()):t}getRelativeCenterPoint(){return this.translateToCenterPoint(new gt(this.left,this.top),this.originX,this.originY)}getPointByOrigin(t,e){return this.getPositionByOrigin(t,e)}getPositionByOrigin(t,e){return this.translateToOriginPoint(this.getRelativeCenterPoint(),t,e)}setPositionByOrigin(t,e,i){let r=this.translateToCenterPoint(t,e,i),s=this.translateToOriginPoint(r,this.originX,this.originY);this.set({left:s.x,top:s.y})}_getLeftTopCoords(){return this.getPositionByOrigin(B,"top")}positionByLeftTop(t){return this.setPositionByOrigin(t,B,"top")}},Ar=class t extends Pr{static getDefaults(){return t.ownDefaults}get type(){let t=this.constructor.type;return"FabricObject"===t?"object":t.toLowerCase()}set type(t){b("warn","Setting type has no effect",t)}constructor(e){super(),p(this,"_cacheContext",null),Object.assign(this,t.ownDefaults),this.setOptions(e)}_createCacheCanvas(){this._cacheCanvas=Ct(),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas(),this.dirty=!0}_limitCacheSize(t){let e=t.width,i=t.height,r=y.maxCacheSideLimit,s=y.minCacheSideLimit;if(e<=r&&i<=r&&e*i<=y.perfLimitSizeTotal)return e<s&&(t.width=s),i<s&&(t.height=s),t;let n=e/i,[o,a]=M.limitDimsByArea(n),l=Bi(s,o,r),h=Bi(s,a,r);return e>l&&(t.zoomX/=e/l,t.width=l,t.capped=!0),i>h&&(t.zoomY/=i/h,t.height=h,t.capped=!0),t}_getCacheCanvasDimensions(){let t=this.getTotalObjectScaling(),e=this._getTransformedDimensions({skewX:0,skewY:0}),i=e.x*t.x/this.scaleX,r=e.y*t.y/this.scaleY;return{width:Math.ceil(i+2),height:Math.ceil(r+2),zoomX:t.x,zoomY:t.y,x:i,y:r}}_updateCacheCanvas(){let t=this._cacheCanvas,e=this._cacheContext,{width:i,height:r,zoomX:s,zoomY:n,x:o,y:a}=this._limitCacheSize(this._getCacheCanvasDimensions()),l=i!==t.width||r!==t.height,h=this.zoomX!==s||this.zoomY!==n;if(!t||!e)return!1;if(l||h){i!==t.width||r!==t.height?(t.width=i,t.height=r):(e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t.width,t.height));let l=o/2,h=a/2;return this.cacheTranslationX=Math.round(t.width/2-l)+l,this.cacheTranslationY=Math.round(t.height/2-h)+h,e.translate(this.cacheTranslationX,this.cacheTranslationY),e.scale(s,n),this.zoomX=s,this.zoomY=n,!0}return!1}setOptions(t={}){this._setOptions(t)}transform(t){let e=this.group&&!this.group._transformDone||this.group&&this.canvas&&t===this.canvas.contextTop,i=this.calcTransformMatrix(!e);t.transform(i[0],i[1],i[2],i[3],i[4],i[5])}getObjectScaling(){if(!this.group)return new gt(Math.abs(this.scaleX),Math.abs(this.scaleY));let t=Bt(this.calcTransformMatrix());return new gt(Math.abs(t.scaleX),Math.abs(t.scaleY))}getTotalObjectScaling(){let t=this.getObjectScaling();if(this.canvas){let e=this.canvas.getZoom(),i=this.getCanvasRetinaScaling();return t.scalarMultiply(e*i)}return t}getObjectOpacity(){let t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t}_constrainScale(t){return Math.abs(t)<this.minScaleLimit?t<0?-this.minScaleLimit:this.minScaleLimit:0===t?1e-4:t}_set(t,e){"scaleX"!==t&&"scaleY"!==t||(e=this._constrainScale(e)),"scaleX"===t&&e<0?(this.flipX=!this.flipX,e*=-1):"scaleY"===t&&e<0?(this.flipY=!this.flipY,e*=-1):"shadow"!==t||!e||e instanceof Ri||(e=new Ri(e));let i=this[t]!==e;return this[t]=e,i&&this.constructor.cacheProperties.includes(t)&&(this.dirty=!0),this.parent&&(this.dirty||i&&this.constructor.stateProperties.includes(t))&&this.parent._set("dirty",!0),this}isNotVisible(){return 0===this.opacity||!this.width&&!this.height&&0===this.strokeWidth||!this.visible}render(t){this.isNotVisible()||this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),this.transform(t),this._setOpacity(t),this._setShadow(t),this.shouldCache()?(this.renderCache(),this.drawCacheOnCanvas(t)):(this._removeCacheCanvas(),this.drawObject(t,!1,{}),this.dirty=!1),t.restore())}drawSelectionBackground(t){}renderCache(t){if(t=t||{},this._cacheCanvas&&this._cacheContext||this._createCacheCanvas(),this.isCacheDirty()&&this._cacheContext){let{zoomX:e,zoomY:i,cacheTranslationX:r,cacheTranslationY:s}=this,{width:n,height:o}=this._cacheCanvas;this.drawObject(this._cacheContext,t.forClipping,{zoomX:e,zoomY:i,cacheTranslationX:r,cacheTranslationY:s,width:n,height:o,parentClipPaths:[]}),this.dirty=!1}}_removeCacheCanvas(){this._cacheCanvas=void 0,this._cacheContext=null}hasStroke(){return!!this.stroke&&"transparent"!==this.stroke&&0!==this.strokeWidth}hasFill(){return!!this.fill&&"transparent"!==this.fill}needsItsOwnCache(){return!!("stroke"===this.paintFirst&&this.hasFill()&&this.hasStroke()&&this.shadow)||!!this.clipPath}shouldCache(){return this.ownCaching=this.objectCaching&&(!this.parent||!this.parent.isOnACache())||this.needsItsOwnCache(),this.ownCaching}willDrawShadow(){return!!this.shadow&&(0!==this.shadow.offsetX||0!==this.shadow.offsetY)}drawClipPathOnCache(t,e,i){t.save(),e.inverted?t.globalCompositeOperation="destination-out":t.globalCompositeOperation="destination-in",t.setTransform(1,0,0,1,0,0),t.drawImage(i,0,0),t.restore()}drawObject(t,e,i){let r=this.fill,s=this.stroke;e?(this.fill="black",this.stroke="",this._setClippingProperties(t)):this._renderBackground(t),this.fire("before:render",{ctx:t}),this._render(t),this._drawClipPath(t,this.clipPath,i),this.fill=r,this.stroke=s}createClipPathLayer(t,e){let i=Tt(e),r=i.getContext("2d");if(r.translate(e.cacheTranslationX,e.cacheTranslationY),r.scale(e.zoomX,e.zoomY),t._cacheCanvas=i,e.parentClipPaths.forEach(t=>{t.transform(r)}),e.parentClipPaths.push(t),t.absolutePositioned){let t=Pt(this.calcTransformMatrix());r.transform(t[0],t[1],t[2],t[3],t[4],t[5])}return t.transform(r),t.drawObject(r,!0,e),i}_drawClipPath(t,e,i){if(!e)return;e._transformDone=!0;let r=this.createClipPathLayer(e,i);this.drawClipPathOnCache(t,e,r)}drawCacheOnCanvas(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)}isCacheDirty(t=!1){if(this.isNotVisible())return!1;let e=this._cacheCanvas,i=this._cacheContext;return!(!e||!i||t||!this._updateCacheCanvas())||!!(this.dirty||this.clipPath&&this.clipPath.absolutePositioned)&&(e&&i&&!t&&(i.save(),i.setTransform(1,0,0,1,0,0),i.clearRect(0,0,e.width,e.height),i.restore()),!0)}_renderBackground(t){if(!this.backgroundColor)return;let e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}_setOpacity(t){this.group&&!this.group._transformDone?t.globalAlpha=this.getObjectOpacity():t.globalAlpha*=this.opacity}_setStrokeStyles(t,e){let i=e.stroke;i&&(t.lineWidth=e.strokeWidth,t.lineCap=e.strokeLineCap,t.lineDashOffset=e.strokeDashOffset,t.lineJoin=e.strokeLineJoin,t.miterLimit=e.strokeMiterLimit,te(i)?"percentage"===i.gradientUnits||i.gradientTransform||i.patternTransform?this._applyPatternForTransformedGradient(t,i):(t.strokeStyle=i.toLive(t),this._applyPatternGradientTransform(t,i)):t.strokeStyle=e.stroke)}_setFillStyles(t,{fill:e}){e&&(te(e)?(t.fillStyle=e.toLive(t),this._applyPatternGradientTransform(t,e)):t.fillStyle=e)}_setClippingProperties(t){t.globalAlpha=1,t.strokeStyle="transparent",t.fillStyle="#000000"}_setLineDash(t,e){e&&0!==e.length&&t.setLineDash(e)}_setShadow(t){if(!this.shadow)return;let e=this.shadow,i=this.canvas,r=this.getCanvasRetinaScaling(),[s,,,n]=(null==i?void 0:i.viewportTransform)||I,o=s*r,a=n*r,l=e.nonScaling?new gt(1,1):this.getObjectScaling();t.shadowColor=e.color,t.shadowBlur=e.blur*y.browserShadowBlurConstant*(o+a)*(l.x+l.y)/4,t.shadowOffsetX=e.offsetX*o*l.x,t.shadowOffsetY=e.offsetY*a*l.y}_removeShadow(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)}_applyPatternGradientTransform(t,e){if(!te(e))return{offsetX:0,offsetY:0};let i=e.gradientTransform||e.patternTransform,r=-this.width/2+e.offsetX||0,s=-this.height/2+e.offsetY||0;return"percentage"===e.gradientUnits?t.transform(this.width,0,0,this.height,r,s):t.transform(1,0,0,1,r,s),i&&t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),{offsetX:r,offsetY:s}}_renderPaintInOrder(t){"stroke"===this.paintFirst?(this._renderStroke(t),this._renderFill(t)):(this._renderFill(t),this._renderStroke(t))}_render(t){}_renderFill(t){this.fill&&(t.save(),this._setFillStyles(t,this),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())}_renderStroke(t){if(this.stroke&&0!==this.strokeWidth){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this.strokeUniform){let e=this.getObjectScaling();t.scale(1/e.x,1/e.y)}this._setLineDash(t,this.strokeDashArray),this._setStrokeStyles(t,this),t.stroke(),t.restore()}}_applyPatternForTransformedGradient(t,e){var i;let r=this._limitCacheSize(this._getCacheCanvasDimensions()),s=this.getCanvasRetinaScaling(),n=r.x/this.scaleX/s,o=r.y/this.scaleY/s,a=Tt({width:Math.ceil(n),height:Math.ceil(o)}),l=a.getContext("2d");l&&(l.beginPath(),l.moveTo(0,0),l.lineTo(n,0),l.lineTo(n,o),l.lineTo(0,o),l.closePath(),l.translate(n/2,o/2),l.scale(r.zoomX/this.scaleX/s,r.zoomY/this.scaleY/s),this._applyPatternGradientTransform(l,e),l.fillStyle=e.toLive(t),l.fill(),t.translate(-this.width/2-this.strokeWidth/2,-this.height/2-this.strokeWidth/2),t.scale(s*this.scaleX/r.zoomX,s*this.scaleY/r.zoomY),t.strokeStyle=null==(i=l.createPattern(a,"no-repeat"))?"":i)}_findCenterFromElement(){return new gt(this.left+this.width/2,this.top+this.height/2)}clone(t){let e=this.toObject(t);return this.constructor.fromObject(e)}cloneAsImage(t){let e=this.toCanvasElement(t);return new(at.getClass("image"))(e)}toCanvasElement(t={}){let e=Me(this),i=this.group,r=this.shadow,s=Math.abs,n=t.enableRetinaScaling?D():1,o=(t.multiplier||1)*n,a=t.canvasProvider||(t=>new _e(t,{enableRetinaScaling:!1,renderOnAddRemove:!1,skipOffscreen:!1}));delete this.group,t.withoutTransform&&De(this),t.withoutShadow&&(this.shadow=null),t.viewportTransform&&Fe(this,this.getViewportTransform()),this.setCoords();let l=Ct(),h=this.getBoundingRect(),c=this.shadow,u=new gt;if(c){let t=c.blur,e=c.nonScaling?new gt(1,1):this.getObjectScaling();u.x=2*Math.round(s(c.offsetX)+t)*s(e.x),u.y=2*Math.round(s(c.offsetY)+t)*s(e.y)}let d=h.width+u.x,g=h.height+u.y;l.width=Math.ceil(d),l.height=Math.ceil(g);let f=a(l);"jpeg"===t.format&&(f.backgroundColor="#fff"),this.setPositionByOrigin(new gt(f.width/2,f.height/2),R,R);let p=this.canvas;f._objects=[this],this.set("canvas",f),this.setCoords();let m=f.toCanvasElement(o||1,t);return this.set("canvas",p),this.shadow=r,i&&(this.group=i),this.set(e),this.setCoords(),f._objects=[],f.destroy(),m}toDataURL(t={}){return Ot(this.toCanvasElement(t),t.format||"png",t.quality||1)}toBlob(t={}){return kt(this.toCanvasElement(t),t.format||"png",t.quality||1)}isType(...t){return t.includes(this.constructor.type)||t.includes(this.type)}complexity(){return 1}toJSON(){return this.toObject()}rotate(t){let{centeredRotation:e,originX:i,originY:r}=this;if(e){let{x:t,y:e}=this.getRelativeCenterPoint();this.originX=R,this.originY=R,this.left=t,this.top=e}if(this.set("angle",t),e){let{x:t,y:e}=this.getPositionByOrigin(i,r);this.left=t,this.top=e,this.originX=i,this.originY=r}}setOnGroup(){}_setupCompositeOperation(t){this.globalCompositeOperation&&(t.globalCompositeOperation=this.globalCompositeOperation)}dispose(){lt.cancelByTarget(this),this.off(),this._set("canvas",void 0),this._cacheCanvas&&T().dispose(this._cacheCanvas),this._cacheCanvas=void 0,this._cacheContext=null}animate(t,e){return Object.entries(t).reduce((t,[i,r])=>(t[i]=this._animate(i,r,e),t),{})}_animate(t,e,i={}){let r=t.split("."),s=this.constructor.colorProperties.includes(r[r.length-1]),{abort:n,startValue:o,onChange:a,onComplete:l}=i,h={...i,target:this,startValue:o??r.reduce((t,e)=>t[e],this),endValue:e,abort:null==n?void 0:n.bind(this),onChange:(t,e,i)=>{r.reduce((e,i,s)=>(s===r.length-1&&(e[i]=t),e[i]),this),a&&a(t,e,i)},onComplete:(t,e,i)=>{this.setCoords(),l&&l(t,e,i)}};return s?jr(h):Mr(h)}isDescendantOf(t){let{parent:e,group:i}=this;return e===t||i===t||!!e&&e.isDescendantOf(t)||!!i&&i!==e&&i.isDescendantOf(t)}getAncestors(){let t=[],e=this;do{e=e.parent,e&&t.push(e)}while(e);return t}findCommonAncestors(t){if(this===t)return{fork:[],otherFork:[],common:[this,...this.getAncestors()]};let e=this.getAncestors(),i=t.getAncestors();if(0===e.length&&i.length>0&&this===i[i.length-1])return{fork:[],otherFork:[t,...i.slice(0,i.length-1)],common:[this]};for(let r,s=0;s<e.length;s++){if(r=e[s],r===t)return{fork:[this,...e.slice(0,s)],otherFork:[],common:e.slice(s)};for(let n=0;n<i.length;n++){if(this===i[n])return{fork:[],otherFork:[t,...i.slice(0,n)],common:[this,...e]};if(r===i[n])return{fork:[this,...e.slice(0,s)],otherFork:[t,...i.slice(0,n)],common:e.slice(s)}}}return{fork:[this,...e],otherFork:[t,...i],common:[]}}hasCommonAncestors(t){let e=this.findCommonAncestors(t);return e&&!!e.common.length}isInFrontOf(t){if(this===t)return;let e=this.findCommonAncestors(t);if(e.fork.includes(t))return!0;if(e.otherFork.includes(this))return!1;let i=e.common[0]||this.canvas;if(!i)return;let r=e.fork.pop(),s=e.otherFork.pop(),n=i._objects.indexOf(r),o=i._objects.indexOf(s);return n>-1&&n>o}toObject(e=[]){let i,r=e.concat(t.customProperties,this.constructor.customProperties||[]),s=y.NUM_FRACTION_DIGITS,{clipPath:n,fill:o,stroke:a,shadow:l,strokeDashArray:h,left:c,top:u,originX:d,originY:g,width:f,height:p,strokeWidth:m,strokeLineCap:b,strokeDashOffset:_,strokeLineJoin:v,strokeUniform:x,strokeMiterLimit:C,scaleX:w,scaleY:S,angle:T,flipX:O,flipY:k,opacity:D,visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:F,skewX:L,skewY:I}=this;n&&!n.excludeFromExport&&(i=n.toObject(r.concat("inverted","absolutePositioned")));let R=t=>Qt(t,s),B={...Kt(this,r),type:this.constructor.type,version:j,originX:d,originY:g,left:R(c),top:R(u),width:R(f),height:R(p),fill:ee(o)?o.toObject():o,stroke:ee(a)?a.toObject():a,strokeWidth:R(m),strokeDashArray:h&&h.concat(),strokeLineCap:b,strokeDashOffset:_,strokeLineJoin:v,strokeUniform:x,strokeMiterLimit:R(C),scaleX:R(w),scaleY:R(S),angle:R(T),flipX:O,flipY:k,opacity:R(D),shadow:l&&l.toObject(),visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:F,skewX:R(L),skewY:R(I),...i?{clipPath:i}:null};return this.includeDefaultValues?B:this._removeDefaultValues(B)}toDatalessObject(t){return this.toObject(t)}_removeDefaultValues(t){let e=this.constructor.getDefaults(),i=Object.keys(e).length>0?e:Object.getPrototypeOf(this);return Jt(t,(t,e)=>{if("left"===e||"top"===e||"type"===e)return!0;let r=i[e];return t!==r&&!(Array.isArray(t)&&Array.isArray(r)&&0===t.length&&0===r.length)})}toString(){return`#<${this.constructor.type}>`}static _fromObject({type:t,...e},{extraParam:i,...r}={}){return qt(e,r).then(t=>i?(delete t[i],new this(e[i],t)):new this(t))}static fromObject(t,e){return this._fromObject(t,e)}};p(Ar,"stateProperties",$i),p(Ar,"cacheProperties",Xi),p(Ar,"ownDefaults",Yi),p(Ar,"type","FabricObject"),p(Ar,"colorProperties",[it,rt,"backgroundColor"]),p(Ar,"customProperties",[]),at.setClass(Ar),at.setClass(Ar,"object");const Fr=(t,e)=>{var i;let{transform:{target:r}}=e;null==(i=r.canvas)||i.fire(`object:${t}`,{...e,target:r}),r.fire(t,e)},Lr=(t,e,i)=>(r,s,n,o)=>{let a=e(r,s,n,o);return a&&Fr(t,{...Ze(r,s,n,o),...i}),a};function Ir(t){return(e,i,r,s)=>{let{target:n,originX:o,originY:a}=i,l=n.getPositionByOrigin(o,a),h=t(e,i,r,s);return n.setPositionByOrigin(l,i.originX,i.originY),h}}const Rr=(t,e,i,r)=>(s,n,o,a)=>{let l=ei(n,n.originX,n.originY,o,a)[i],h=Ie(n[e]);if(0===h||h>0&&l<0||h<0&&l>0){let{target:e}=n,i=e.strokeWidth/(e.strokeUniform?e[r]:1),s=Ke(n)?2:1,o=e[t],a=Math.abs(l*s/e[r])-i;return e.set(t,Math.max(a,1)),o!==e[t]}return!1},Br=Rr("width","originX","x","scaleX"),$r=Rr("height","originY","y","scaleY"),Xr=Lr(U,Ir(Br)),Yr=Lr(U,Ir($r));function Wr(t,e,i,r,s){t.save();let{stroke:n,xSize:o,ySize:a,opName:l}=this.commonRenderProps(t,e,i,s,r),h=o;o>a?t.scale(1,a/o):a>o&&(h=a,t.scale(o/a,1)),t.beginPath(),t.arc(0,0,h/2,0,F,!1),t[l](),n&&t.stroke(),t.restore()}function Nr(t,e,i,r,s){t.save();let{stroke:n,xSize:o,ySize:a,opName:l}=this.commonRenderProps(t,e,i,s,r),h=o/2,c=a/2;t[`${l}Rect`](-h,-c,o,a),n&&t.strokeRect(-h,-c,o,a),t.restore()}var Vr=class{constructor(t){p(this,"visible",!0),p(this,"actionName",J),p(this,"angle",0),p(this,"x",0),p(this,"y",0),p(this,"offsetX",0),p(this,"offsetY",0),p(this,"sizeX",0),p(this,"sizeY",0),p(this,"touchSizeX",0),p(this,"touchSizeY",0),p(this,"cursorStyle","crosshair"),p(this,"withConnection",!1),Object.assign(this,t)}getTransformAnchorPoint(){var t;return null==(t=this.transformAnchorPoint)?new gt(.5-this.x,.5-this.y):t}shouldActivate(t,e,i,{tl:r,tr:s,br:n,bl:o}){var a;return(null==(a=e.canvas)?void 0:a.getActiveObject())===e&&e.isControlVisible(t)&&Er.isPointInPolygon(i,[r,s,n,o])}getActionHandler(t,e,i){return this.actionHandler}getMouseDownHandler(t,e,i){return this.mouseDownHandler}getMouseUpHandler(t,e,i){return this.mouseUpHandler}cursorStyleHandler(t,e,i,r){return e.cursorStyle}getActionName(t,e,i){return e.actionName}getVisibility(t,e){var i,r;return null==(i=null==(r=t._controlsVisibility)?void 0:r[e])?this.visible:i}setVisibility(t,e,i){this.visible=t}positionHandler(t,e,i,r){return new gt(this.x*t.x+this.offsetX,this.y*t.y+this.offsetY).transform(e)}calcCornerCoords(t,e,i,r,s,n){let o=Ft([$t(i,r),Xt({angle:t}),Yt((s?this.touchSizeX:this.sizeX)||e,(s?this.touchSizeY:this.sizeY)||e)]);return{tl:new gt(-.5,-.5).transform(o),tr:new gt(.5,-.5).transform(o),br:new gt(.5,.5).transform(o),bl:new gt(-.5,.5).transform(o)}}commonRenderProps(t,e,i,r,s={}){let{cornerSize:n,cornerColor:o,transparentCorners:a,cornerStrokeColor:l}=s,h=n||r.cornerSize,c=this.sizeX||h,u=this.sizeY||h,d=void 0===a?r.transparentCorners:a,g=d?rt:it,f=l||r.cornerStrokeColor,p=!d&&!!f;return t.fillStyle=o||r.cornerColor||"",t.strokeStyle=f||"",t.translate(e,i),t.rotate(Dt(r.getTotalAngle())),{stroke:p,xSize:c,ySize:u,transparentCorners:d,opName:g}}render(t,e,i,r,s){"circle"===((r=r||{}).cornerStyle||s.cornerStyle)?Wr.call(this,t,e,i,r,s):Nr.call(this,t,e,i,r,s)}};const zr=(t,e,i)=>i.lockRotation?qe:e.cursorStyle,Hr=Lr(z,Ir((t,{target:e,ex:i,ey:r,theta:s,originX:n,originY:o},a,l)=>{let h=e.getPositionByOrigin(n,o);if(Qe(e,"lockRotation"))return!1;let c=Math.atan2(r-h.y,i-h.x),u=Mt(Math.atan2(l-h.y,a-h.x)-c+s);if(e.snapAngle&&e.snapAngle>0){let t=e.snapAngle,i=e.snapThreshold||t,r=Math.ceil(u/t)*t,s=Math.floor(u/t)*t;Math.abs(u-s)<i?u=s:Math.abs(u-r)<i&&(u=r)}u<0&&(u=360+u),u%=360;let d=e.angle!==u;return e.angle=u,d}));function Gr(t,e){let i=e.canvas,r=t[i.uniScaleKey];return i.uniformScaling&&!r||!i.uniformScaling&&r}function Ur(t,e,i){let r=Qe(t,"lockScalingX"),s=Qe(t,"lockScalingY");if(r&&s||!e&&(r||s)&&i||r&&"x"===e||s&&"y"===e)return!0;let{width:n,height:o,strokeWidth:a}=t;return 0===n&&0===a&&"y"!==e||0===o&&0===a&&"x"!==e}const qr=["e","se","s","sw","w","nw","n","ne","e"],Kr=(t,e,i,r)=>{let s=Gr(t,i);return Ur(i,0!==e.x&&0===e.y?"x":0===e.x&&0!==e.y?"y":"",s)?qe:`${qr[ti(i,0,r)]}-resize`};function Jr(t,e,i,r,s={}){let n,o,a,l,h,c,u=e.target,d=s.by,g=Gr(t,u);if(Ur(u,d,g))return!1;if(e.gestureScale)o=e.scaleX*e.gestureScale,a=e.scaleY*e.gestureScale;else{if(n=ei(e,e.originX,e.originY,i,r),h="y"===d?1:Math.sign(n.x||e.signX||1),c="x"===d?1:Math.sign(n.y||e.signY||1),e.signX||(e.signX=h),e.signY||(e.signY=c),Qe(u,"lockScalingFlip")&&(e.signX!==h||e.signY!==c))return!1;if(l=u._getTransformedDimensions(),g&&!d){let t=Math.abs(n.x)+Math.abs(n.y),{original:i}=e,r=t/(Math.abs(l.x*i.scaleX/u.scaleX)+Math.abs(l.y*i.scaleY/u.scaleY));o=i.scaleX*r,a=i.scaleY*r}else o=Math.abs(n.x*u.scaleX/l.x),a=Math.abs(n.y*u.scaleY/l.y);Ke(e)&&(o*=2,a*=2),e.signX!==h&&"y"!==d&&(e.originX=Je(e.originX),o*=-1,e.signX=h),e.signY!==c&&"x"!==d&&(e.originY=Je(e.originY),a*=-1,e.signY=c)}let f=u.scaleX,p=u.scaleY;return d?("x"===d&&u.set("scaleX",o),"y"===d&&u.set("scaleY",a)):(!Qe(u,"lockScalingX")&&u.set("scaleX",o),!Qe(u,"lockScalingY")&&u.set("scaleY",a)),f!==u.scaleX||p!==u.scaleY}const Qr=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r))),Zr=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r,{by:"x"}))),ts=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r,{by:"y"}))),es={x:{counterAxis:"y",scale:Q,skew:tt,lockSkewing:"lockSkewingX",origin:"originX",flip:"flipX"},y:{counterAxis:"x",scale:Z,skew:et,lockSkewing:"lockSkewingY",origin:"originY",flip:"flipY"}},is=["ns","nesw","ew","nwse"],rs=(t,e,i,r)=>0!==e.x&&Qe(i,"lockSkewingY")||0!==e.y&&Qe(i,"lockSkewingX")?qe:`${is[ti(i,0,r)%4]}-resize`;function ss(t,e,i,r,s){let{target:n}=i,{counterAxis:o,origin:a,lockSkewing:l,skew:h,flip:c}=es[t];if(Qe(n,l))return!1;let{origin:u,flip:d}=es[o],g=Ie(i[u])*(n[d]?-1:1),f=-Math.sign(g)*(n[c]?-1:1),p=-(0===n[h]&&ei(i,"center","center",r,s)[t]>0||n[h]>0?1:-1)*f*.5+.5;return Lr(G,Ir((e,i,r,s)=>function(t,{target:e,ex:i,ey:r,skewingSide:s,...n},o){let{skew:a}=es[t],l=o.subtract(new gt(i,r)).divide(new gt(e.scaleX,e.scaleY))[t],h=e[a],c=n[a],u=Math.tan(Dt(c)),d="y"===t?e._getTransformedDimensions({scaleX:1,scaleY:1,skewX:0}).x:e._getTransformedDimensions({scaleX:1,scaleY:1}).y,g=2*l*s/Math.max(d,1)+u,f=Mt(Math.atan(g));e.set(a,f);let p=h!==e[a];if(p&&"y"===t){let{skewX:t,scaleX:i}=e,r=e._getTransformedDimensions({skewY:h}),s=e._getTransformedDimensions(),n=0===t?1:r.x/s.x;1!==n&&e.set("scaleX",n*i)}return p}(t,i,new gt(r,s))))(e,{...i,[a]:p,skewingSide:f},r,s)}const ns=(t,e,i,r)=>ss("x",t,e,i,r),os=(t,e,i,r)=>ss("y",t,e,i,r);function as(t,e){return t[e.canvas.altActionKey]}const ls=(t,e,i)=>{let r=as(t,i);return 0===e.x?r?tt:Z:0===e.y?r?et:Q:""},hs=(t,e,i,r)=>as(t,i)?rs(0,e,i,r):Kr(t,e,i,r),cs=(t,e,i,r)=>as(t,e.target)?os(t,e,i,r):Zr(t,e,i,r),us=(t,e,i,r)=>as(t,e.target)?ns(t,e,i,r):ts(t,e,i,r),ds=()=>({ml:new Vr({x:-.5,y:0,cursorStyleHandler:hs,actionHandler:cs,getActionName:ls}),mr:new Vr({x:.5,y:0,cursorStyleHandler:hs,actionHandler:cs,getActionName:ls}),mb:new Vr({x:0,y:.5,cursorStyleHandler:hs,actionHandler:us,getActionName:ls}),mt:new Vr({x:0,y:-.5,cursorStyleHandler:hs,actionHandler:us,getActionName:ls}),tl:new Vr({x:-.5,y:-.5,cursorStyleHandler:Kr,actionHandler:Qr}),tr:new Vr({x:.5,y:-.5,cursorStyleHandler:Kr,actionHandler:Qr}),bl:new Vr({x:-.5,y:.5,cursorStyleHandler:Kr,actionHandler:Qr}),br:new Vr({x:.5,y:.5,cursorStyleHandler:Kr,actionHandler:Qr}),mtr:new Vr({x:0,y:-.5,actionHandler:Hr,cursorStyleHandler:zr,offsetY:-40,withConnection:!0,actionName:H})}),gs=()=>({mr:new Vr({x:.5,y:0,actionHandler:Xr,cursorStyleHandler:hs,actionName:U}),ml:new Vr({x:-.5,y:0,actionHandler:Xr,cursorStyleHandler:hs,actionName:U})}),fs=()=>({...ds(),...gs()});var ps=class t extends Ar{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,this.constructor.createControls(),t.ownDefaults),this.setOptions(e)}static createControls(){return{controls:ds()}}_updateCacheCanvas(){let t=this.canvas;if(this.noScaleCache&&t&&t._currentTransform){let e=t._currentTransform,i=e.target,r=e.action;if(this===i&&r&&r.startsWith("scale"))return!1}return super._updateCacheCanvas()}getActiveControl(){let t=this.__corner;return t?{key:t,control:this.controls[t],coord:this.oCoords[t]}:void 0}findControl(t,e=!1){if(!this.hasControls||!this.canvas)return;this.__corner=void 0;let i=Object.entries(this.oCoords);for(let r=i.length-1;r>=0;r--){let[s,n]=i[r],o=this.controls[s];if(o.shouldActivate(s,this,t,e?n.touchCorner:n.corner))return this.__corner=s,{key:s,control:o,coord:this.oCoords[s]}}}calcOCoords(){let t=this.getViewportTransform(),e=It(t),i=Rt(t),r=this.getCenterPoint(),s=At(At(t,At($t(r.x,r.y),Xt({angle:this.getTotalAngle()-(this.group&&this.flipX?180:0)}))),[1/e,0,0,1/i,0,0]),n=this.group?Bt(this.calcTransformMatrix()):void 0;n&&(n.scaleX=Math.abs(n.scaleX),n.scaleY=Math.abs(n.scaleY));let o=this._calculateCurrentDimensions(n),a={};return this.forEachControl((t,e)=>{let i=t.positionHandler(o,s,this,t);a[e]=Object.assign(i,this._calcCornerCoords(t,i))}),a}_calcCornerCoords(t,e){let i=this.getTotalAngle();return{corner:t.calcCornerCoords(i,this.cornerSize,e.x,e.y,!1,this),touchCorner:t.calcCornerCoords(i,this.touchCornerSize,e.x,e.y,!0,this)}}setCoords(){super.setCoords(),this.canvas&&(this.oCoords=this.calcOCoords())}forEachControl(t){for(let e in this.controls)t(this.controls[e],e,this)}drawSelectionBackground(t){if(!this.selectionBackgroundColor||this.canvas&&this.canvas._activeObject!==this)return;t.save();let e=this.getRelativeCenterPoint(),i=this._calculateCurrentDimensions(),r=this.getViewportTransform();t.translate(e.x,e.y),t.scale(1/r[0],1/r[3]),t.rotate(Dt(this.angle)),t.fillStyle=this.selectionBackgroundColor,t.fillRect(-i.x/2,-i.y/2,i.x,i.y),t.restore()}strokeBorders(t,e){t.strokeRect(-e.x/2,-e.y/2,e.x,e.y)}_drawBorders(t,e,i={}){let r={hasControls:this.hasControls,borderColor:this.borderColor,borderDashArray:this.borderDashArray,...i};t.save(),t.strokeStyle=r.borderColor,this._setLineDash(t,r.borderDashArray),this.strokeBorders(t,e),r.hasControls&&this.drawControlsConnectingLines(t,e),t.restore()}_renderControls(t,e={}){let{hasBorders:i,hasControls:r}=this,s={hasBorders:i,hasControls:r,...e},n=this.getViewportTransform(),o=s.hasBorders,a=s.hasControls,l=Bt(At(n,this.calcTransformMatrix()));t.save(),t.translate(l.translateX,l.translateY),t.lineWidth=this.borderScaleFactor,this.group===this.parent&&(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),this.flipX&&(l.angle-=180);let h=Lt(n);t.rotate(this.group?Dt(l.angle):Dt(this.angle)+h),o&&this.drawBorders(t,l,e),a&&this.drawControls(t,e),t.restore()}drawBorders(t,e,i){let r;if(i&&i.forActiveSelection||this.group){let t=je(this.width,this.height,zt(e)),i=this.isStrokeAccountedForInDimensions()?ft:(this.strokeUniform?(new gt).scalarAdd(this.canvas?this.canvas.getZoom():1):new gt(e.scaleX,e.scaleY)).scalarMultiply(this.strokeWidth);r=t.add(i).scalarAdd(this.borderScaleFactor).scalarAdd(2*this.padding)}else r=this._calculateCurrentDimensions().scalarAdd(this.borderScaleFactor);this._drawBorders(t,r,i)}drawControlsConnectingLines(t,e){let i=!1;t.beginPath(),this.forEachControl((r,s)=>{r.withConnection&&r.getVisibility(this,s)&&(i=!0,t.moveTo(r.x*e.x,r.y*e.y),t.lineTo(r.x*e.x+r.offsetX,r.y*e.y+r.offsetY))}),i&&t.stroke()}drawControls(t,e={}){t.save();let i=this.getCanvasRetinaScaling(),{cornerStrokeColor:r,cornerDashArray:s,cornerColor:n}=this,o={cornerStrokeColor:r,cornerDashArray:s,cornerColor:n,...e};t.setTransform(i,0,0,i,0,0),t.strokeStyle=t.fillStyle=o.cornerColor,this.transparentCorners||(t.strokeStyle=o.cornerStrokeColor),this._setLineDash(t,o.cornerDashArray),this.forEachControl((e,i)=>{if(e.getVisibility(this,i)){let r=this.oCoords[i];e.render(t,r.x,r.y,o,this)}}),t.restore()}isControlVisible(t){return this.controls[t]&&this.controls[t].getVisibility(this,t)}setControlVisible(t,e){this._controlsVisibility||(this._controlsVisibility={}),this._controlsVisibility[t]=e}setControlsVisibility(t={}){Object.entries(t).forEach(([t,e])=>this.setControlVisible(t,e))}clearContextTop(t){if(!this.canvas)return;let e=this.canvas.contextTop;if(!e)return;let i=this.canvas.viewportTransform;e.save(),e.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this.transform(e);let r=this.width+4,s=this.height+4;return e.clearRect(-r/2,-s/2,r,s),t||e.restore(),e}onDeselect(t){return!1}onSelect(t){return!1}shouldStartDragging(t){return!1}onDragStart(t){return!1}canDrop(t){return!1}renderDragSourceEffect(t){}renderDropTargetEffect(t){}};function ms(t,e){return e.forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(i=>{"constructor"!==i&&Object.defineProperty(t.prototype,i,Object.getOwnPropertyDescriptor(e.prototype,i)||Object.create(null))})}),t}p(ps,"ownDefaults",{noScaleCache:!0,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,cornerSize:13,touchCornerSize:24,transparentCorners:!0,cornerColor:"rgb(178,204,255)",cornerStrokeColor:"",cornerStyle:"rect",cornerDashArray:null,hasControls:!0,borderColor:"rgb(178,204,255)",borderDashArray:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,hasBorders:!0,selectionBackgroundColor:"",selectable:!0,evented:!0,perPixelTargetFind:!1,activeOn:"down",hoverCursor:null,moveCursor:null});var ys=class extends ps{};ms(ys,[bi]),at.setClass(ys),at.setClass(ys,"object");const bs=(t,e,i,r)=>{let s=2*(r=Math.round(r))+1,{data:n}=t.getImageData(e-r,i-r,s,s);for(let t=3;t<n.length;t+=4)if(n[t]>0)return!1;return!0};var _s=class{constructor(t){this.options=t,this.strokeProjectionMagnitude=this.options.strokeWidth/2,this.scale=new gt(this.options.scaleX,this.options.scaleY),this.strokeUniformScalar=this.options.strokeUniform?new gt(1/this.options.scaleX,1/this.options.scaleY):new gt(1,1)}createSideVector(t,e){let i=Xe(t,e);return this.options.strokeUniform?i.multiply(this.scale):i}projectOrthogonally(t,e,i){return this.applySkew(t.add(this.calcOrthogonalProjection(t,e,i)))}isSkewed(){return 0!==this.options.skewX||0!==this.options.skewY}applySkew(t){let e=new gt(t);return e.y+=e.x*Math.tan(Dt(this.options.skewY)),e.x+=e.y*Math.tan(Dt(this.options.skewX)),e}scaleUnitVector(t,e){return t.multiply(this.strokeUniformScalar).scalarMultiply(e)}};const vs=new gt;var xs=class t extends _s{static getOrthogonalRotationFactor(t,e){let i=e?We(t,e):Ne(t);return Math.abs(i)<P?-1:1}constructor(t,e,i,r){super(r),p(this,"AB",void 0),p(this,"AC",void 0),p(this,"alpha",void 0),p(this,"bisector",void 0),this.A=new gt(t),this.B=new gt(e),this.C=new gt(i),this.AB=this.createSideVector(this.A,this.B),this.AC=this.createSideVector(this.A,this.C),this.alpha=We(this.AB,this.AC),this.bisector=Ve($e(this.AB.eq(vs)?this.AC:this.AB,this.alpha/2))}calcOrthogonalProjection(e,i,r=this.strokeProjectionMagnitude){let s=ze(this.createSideVector(e,i)),n=t.getOrthogonalRotationFactor(s,this.bisector);return this.scaleUnitVector(s,r*n)}projectBevel(){let t=[];return(this.alpha%F===0?[this.B]:[this.B,this.C]).forEach(e=>{t.push(this.projectOrthogonally(this.A,e)),t.push(this.projectOrthogonally(this.A,e,-this.strokeProjectionMagnitude))}),t}projectMiter(){let t=[],e=Math.abs(this.alpha),i=1/Math.sin(e/2),r=this.scaleUnitVector(this.bisector,-this.strokeProjectionMagnitude*i),s=this.options.strokeUniform?Ye(this.scaleUnitVector(this.bisector,this.options.strokeMiterLimit)):this.options.strokeMiterLimit;return Ye(r)/this.strokeProjectionMagnitude<=s&&t.push(this.applySkew(this.A.add(r))),t.push(...this.projectBevel()),t}projectRoundNoSkew(e,i){let r=[],s=new gt(t.getOrthogonalRotationFactor(this.bisector),t.getOrthogonalRotationFactor(new gt(this.bisector.y,this.bisector.x)));return[new gt(1,0).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(s),new gt(0,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(s)].forEach(t=>{Ue(t,e,i)&&r.push(this.A.add(t))}),r}projectRoundWithSkew(t,e){let i=[],{skewX:r,skewY:s,scaleX:n,scaleY:o,strokeUniform:a}=this.options,l=new gt(Math.tan(Dt(r)),Math.tan(Dt(s))),h=this.strokeProjectionMagnitude,c=a?h/o/Math.sqrt(1/o**2+1/n**2*l.y**2):h/Math.sqrt(1+l.y**2),u=new gt(Math.sqrt(Math.max(h**2-c**2,0)),c),d=a?h/Math.sqrt(1+l.x**2*(1/o)**2/(1/n+1/n*l.x*l.y)**2):h/Math.sqrt(1+l.x**2/(1+l.x*l.y)**2),g=new gt(d,Math.sqrt(Math.max(h**2-d**2,0)));return[g,g.scalarMultiply(-1),u,u.scalarMultiply(-1)].map(t=>this.applySkew(a?t.multiply(this.strokeUniformScalar):t)).forEach(r=>{Ue(r,t,e)&&i.push(this.applySkew(this.A).add(r))}),i}projectRound(){let t=[];t.push(...this.projectBevel());let e=this.alpha%F===0,i=this.applySkew(this.A),r=t[e?0:2].subtract(i),s=t[+!!e].subtract(i),n=He(r,e?this.applySkew(this.AB.scalarMultiply(-1)):this.applySkew(this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1)))>0,o=n?r:s,a=n?s:r;return this.isSkewed()?t.push(...this.projectRoundWithSkew(o,a)):t.push(...this.projectRoundNoSkew(o,a)),t}projectPoints(){switch(this.options.strokeLineJoin){case"miter":return this.projectMiter();case"round":return this.projectRound();default:return this.projectBevel()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t,angle:this.alpha,bisector:this.bisector}))}},Cs=class extends _s{constructor(t,e,i){super(i),this.A=new gt(t),this.T=new gt(e)}calcOrthogonalProjection(t,e,i=this.strokeProjectionMagnitude){let r=this.createSideVector(t,e);return this.scaleUnitVector(ze(r),i)}projectButt(){return[this.projectOrthogonally(this.A,this.T,this.strokeProjectionMagnitude),this.projectOrthogonally(this.A,this.T,-this.strokeProjectionMagnitude)]}projectRound(){let t=[];if(!this.isSkewed()&&this.A.eq(this.T)){let e=new gt(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.applySkew(this.A.add(e)),this.applySkew(this.A.subtract(e)))}else t.push(...new xs(this.A,this.T,this.T,this.options).projectRound());return t}projectSquare(){let t=[];if(this.A.eq(this.T)){let e=new gt(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.A.add(e),this.A.subtract(e))}else{let e=this.calcOrthogonalProjection(this.A,this.T,this.strokeProjectionMagnitude),i=this.scaleUnitVector(Ve(this.createSideVector(this.A,this.T)),-this.strokeProjectionMagnitude),r=this.A.add(i);t.push(r.add(e),r.subtract(e))}return t.map(t=>this.applySkew(t))}projectPoints(){switch(this.options.strokeLineCap){case"round":return this.projectRound();case"square":return this.projectSquare();default:return this.projectButt()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t}))}};const ws=(t,e,i=!1)=>{let r=[];if(0===t.length)return r;let s=t.reduce((t,e)=>(t[t.length-1].eq(e)||t.push(new gt(e)),t),[new gt(t[0])]);if(1===s.length)i=!0;else if(!i){let t=s[0],e=((t,e)=>{for(let i=t.length-1;i>=0;i--)if(e(t[i]))return i;return-1})(s,e=>!e.eq(t));s.splice(e+1)}return s.forEach((t,s,n)=>{let o,a;0===s?(a=n[1],o=i?t:n[n.length-1]):s===n.length-1?(o=n[s-1],a=i?t:n[0]):(o=n[s-1],a=n[s+1]),i&&1===n.length?r.push(...new Cs(t,t,e).project()):!i||0!==s&&s!==n.length-1?r.push(...new xs(t,o,a,e).project()):r.push(...new Cs(t,0===s?a:o,e).project())}),r},Ss=t=>{let e={};return Object.keys(t).forEach(i=>{e[i]={},Object.keys(t[i]).forEach(r=>{e[i][r]={...t[i][r]}})}),e},Ts=(t,e,i=!1)=>t.fill!==e.fill||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth||t.fontSize!==e.fontSize||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.textDecorationThickness!==e.textDecorationThickness||t.textDecorationColor!==e.textDecorationColor||t.textBackgroundColor!==e.textBackgroundColor||t.deltaY!==e.deltaY||i&&(t.overline!==e.overline||t.underline!==e.underline||t.linethrough!==e.linethrough),Os=(t,e)=>{let i=e.split("\n"),r=[],s=-1,n={};t=Ss(t);for(let e=0;e<i.length;e++){let o=me(i[e]);if(t[e])for(let i=0;i<o.length;i++){s++;let o=t[e][i];o&&Object.keys(o).length>0&&(Ts(n,o,!0)?r.push({start:s,end:s+1,style:o}):r[r.length-1].end++),n=o||{}}else s+=o.length,n={}}return r},ks=(t,e)=>{if(!Array.isArray(t))return Ss(t);let i=e.split(W),r={},s=-1,n=0;for(let e=0;e<i.length;e++){let o=me(i[e]);for(let i=0;i<o.length;i++)s++,t[n]&&t[n].start<=s&&s<t[n].end&&(r[e]=r[e]||{},r[e][i]={...t[n].style},s===t[n].end-1&&n++)}return r},Ds=["display","transform",it,"fill-opacity","fill-rule","opacity",rt,"stroke-dasharray","stroke-linecap","stroke-dashoffset","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","id","paint-order","vector-effect","instantiated_by_use","clip-path"];function Ms(t,e){let i,r=t.nodeName,s=t.getAttribute("class"),n=t.getAttribute("id"),o="(?![a-zA-Z\\-]+)";if(i=RegExp("^"+r,"i"),e=e.replace(i,""),n&&e.length&&(i=RegExp("#"+n+o,"i"),e=e.replace(i,"")),s&&e.length){let t=s.split(" ");for(let r=t.length;r--;)i=RegExp("\\."+t[r]+o,"i"),e=e.replace(i,"")}return 0===e.length}function js(t,e){let i=!0,r=Ms(t,e.pop());return r&&e.length&&(i=function(t,e){let i,r=!0;for(;t.parentElement&&1===t.parentElement.nodeType&&e.length;)r&&(i=e.pop()),r=Ms(t=t.parentElement,i);return 0===e.length}(t,e)),r&&i&&0===e.length}function Es(t,e={}){let i={};for(let r in e)js(t,r.split(" "))&&(i={...i,...e[r]});return i}const Ps=t=>{var e;return null==(e=Ei[t])?t:e},As=RegExp(`(${Di})`,"gi"),Fs=`(${Di})`,Ls=String.raw`(skewX)\(${Fs}\)`,Is=String.raw`(skewY)\(${Fs}\)`,Rs=String.raw`(rotate)\(${Fs}(?: ${Fs} ${Fs})?\)`,Bs=String.raw`(scale)\(${Fs}(?: ${Fs})?\)`,$s=String.raw`(translate)\(${Fs}(?: ${Fs})?\)`,Xs=`(?:${String.raw`(matrix)\(${Fs} ${Fs} ${Fs} ${Fs} ${Fs} ${Fs}\)`}|${$s}|${Rs}|${Bs}|${Ls}|${Is})`,Ys=`(?:${Xs}*)`,Ws=String.raw`^\s*(?:${Ys}?)\s*$`,Ns=new RegExp(Ws),Vs=new RegExp(Xs),zs=new RegExp(Xs,"g");function Hs(t){let e=[];if(!(t=(t=>oi(t.replace(As," $1 ").replace(/,/gi," ")))(t).replace(/\s*([()])\s*/gi,"$1"))||t&&!Ns.test(t))return[...I];for(let i of t.matchAll(zs)){let t=Vs.exec(i[0]);if(!t)continue;let r=I,[,s,...n]=t.filter(t=>!!t),[o,a,l,h,c,u]=n.map(t=>parseFloat(t));switch(s){case"translate":r=$t(o,a);break;case H:r=Xt({angle:o},{x:a,y:l});break;case J:r=Yt(o,a);break;case tt:r=Nt(o);break;case et:r=Vt(o);break;case"matrix":r=[o,a,l,h,c,u]}e.push(r)}return Ft(e)}function Gs(t,e,i,r){let s,n=Array.isArray(e),o=e;if("fill"!==t&&"stroke"!==t||"none"!==e){if("strokeUniform"===t)return"non-scaling-stroke"===e;if("strokeDashArray"===t)o="none"===e?null:e.replace(/,/g," ").split(/\s+/).map(parseFloat);else if("transformMatrix"===t)o=i&&i.transformMatrix?At(i.transformMatrix,Hs(e)):Hs(e);else if("visible"===t)o="none"!==e&&"hidden"!==e,i&&!1===i.visible&&(o=!1);else if("opacity"===t)o=parseFloat(e),i&&void 0!==i.opacity&&(o*=i.opacity);else if("textAnchor"===t)o="start"===e?B:"end"===e?X:R;else if("charSpacing"===t||"textDecorationThickness"===t)s=pi(e,r)/r*1e3;else if("paintFirst"===t){let t=e.indexOf(it),i=e.indexOf(rt);o=it,(t>-1&&i>-1&&i<t||-1===t&&i>-1)&&(o=rt)}else{if("href"===t||"xlink:href"===t||"font"===t||"id"===t)return e;if("imageSmoothing"===t)return"optimizeQuality"===e;s=n?e.map(pi):pi(e,r)}}else o="";return!n&&isNaN(s)?o:s}function Us(t){let e={},i=t.getAttribute("style");return i&&("string"==typeof i?function(t,e){t.replace(/;\s*$/,"").split(";").forEach(t=>{if(!t)return;let[i,r]=t.split(":");e[i.trim().toLowerCase()]=r.trim()})}(i,e):function(t,e){Object.entries(t).forEach(([t,i])=>{void 0!==i&&(e[t.toLowerCase()]=i)})}(i,e)),e}const qs={stroke:"strokeOpacity",fill:"fillOpacity"};function Ks(t,e,i){if(!t)return{};let r,s={},n=16;t.parentNode&&Fi.test(t.parentNode.nodeName)&&(s=Ks(t.parentElement,e,i),s.fontSize&&(r=n=pi(s.fontSize)));let o={...e.reduce((e,i)=>{let r=t.getAttribute(i);return r&&(e[i]=r),e},{}),...Es(t,i),...Us(t)};o["clip-path"]&&t.setAttribute(Ai,o[Ai]),o["font-size"]&&(r=pi(o[Pi],n),o[Pi]=`${r}`);let a={};for(let t in o){let e=Ps(t);a[e]=Gs(e,o[t],s,r)}a&&a.font&&function(t,e){let i=t.match(ji);if(!i)return;let r=i[1],s=i[3],n=i[4],o=i[5],a=i[6];r&&(e.fontStyle=r),s&&(e.fontWeight=isNaN(parseFloat(s))?s:parseFloat(s)),n&&(e.fontSize=pi(n)),a&&(e.fontFamily=a),o&&(e.lineHeight="normal"===o?1:o)}(a.font,a);let l={...s,...a};return Fi.test(t.nodeName)?l:function(t){let e=ys.getDefaults();return Object.entries(qs).forEach(([i,r])=>{if(void 0===t[r]||""===t[i])return;if(void 0===t[i]){if(!e[i])return;t[i]=e[i]}if(0===t[i].indexOf("url("))return;let s=new gi(t[i]);t[i]=s.setAlpha(Qt(s.getAlpha()*t[r],2)).toRgba()}),t}(l)}const Js=["rx","ry"];var Qs=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e),this._initRxRy()}_initRxRy(){let{rx:t,ry:e}=this;t&&!e?this.ry=t:e&&!t&&(this.rx=e)}_render(t){let{width:e,height:i}=this,r=-e/2,s=-i/2,n=this.rx?Math.min(this.rx,e/2):0,o=this.ry?Math.min(this.ry,i/2):0,a=0!==n||0!==o;t.beginPath(),t.moveTo(r+n,s),t.lineTo(r+e-n,s),a&&t.bezierCurveTo(r+e-.4477152502*n,s,r+e,s+.4477152502*o,r+e,s+o),t.lineTo(r+e,s+i-o),a&&t.bezierCurveTo(r+e,s+i-.4477152502*o,r+e-.4477152502*n,s+i,r+e-n,s+i),t.lineTo(r+n,s+i),a&&t.bezierCurveTo(r+.4477152502*n,s+i,r,s+i-.4477152502*o,r,s+i-o),t.lineTo(r,s+o),a&&t.bezierCurveTo(r,s+.4477152502*o,r+.4477152502*n,s,r+n,s),t.closePath(),this._renderPaintInOrder(t)}toObject(t=[]){return super.toObject([...Js,...t])}_toSVG(){let{width:t,height:e,rx:i,ry:r}=this;return["<rect ","COMMON_PARTS",`x="${-t/2}" y="${-e/2}" rx="${fe(i)}" ry="${fe(r)}" width="${fe(t)}" height="${fe(e)}" />\n`]}static async fromElement(t,e,i){let{left:r=0,top:s=0,width:n=0,height:o=0,visible:a=!0,...l}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this({...e,...l,left:r,top:s,width:n,height:o,visible:!!(a&&n&&o)})}};p(Qs,"type","Rect"),p(Qs,"cacheProperties",[...Xi,...Js]),p(Qs,"ownDefaults",{rx:0,ry:0}),p(Qs,"ATTRIBUTE_NAMES",[...Ds,"x","y","rx","ry","width","height"]),at.setClass(Qs),at.setSVGClass(Qs);const Zs="initialization",tn="added",en=(t,e)=>{let{strokeUniform:i,strokeWidth:r,width:s,height:n,group:o}=e,a=o&&o!==t?Ee(o.calcTransformMatrix(),t.calcTransformMatrix()):null,l=a?e.getRelativeCenterPoint().transform(a):e.getRelativeCenterPoint(),h=!e.isStrokeAccountedForInDimensions(),c=i&&h?Ae(new gt(r,r),void 0,t.calcTransformMatrix()):ft,u=!i&&h?r:0,d=je(s+u,n+u,Ft([a,e.calcOwnMatrix()],!0)).add(c).scalarDivide(2);return[l.subtract(d),l.add(d)]};var rn=class{calcLayoutResult(t,e){if(this.shouldPerformLayout(t))return this.calcBoundingBox(e,t)}shouldPerformLayout({type:t,prevStrategy:e,strategy:i}){return"initialization"===t||"imperative"===t||!!e&&i!==e}shouldLayoutClipPath({type:t,target:{clipPath:e}}){return"initialization"!==t&&e&&!e.absolutePositioned}getInitialSize(t,e){return e.size}calcBoundingBox(t,e){let{type:i,target:r}=e;if("imperative"===i&&e.overrides)return e.overrides;if(0===t.length)return;let{left:s,top:n,width:o,height:a}=Se(t.map(t=>en(r,t)).reduce((t,e)=>t.concat(e),[])),l=new gt(o,a),h=new gt(s,n).add(l.scalarDivide(2));if("initialization"===i){let t=this.getInitialSize(e,{size:l,center:h});return{center:h,relativeCorrection:new gt(0,0),size:t}}return{center:h.transform(r.calcOwnMatrix()),size:l}}};p(rn,"type","strategy");var sn=class extends rn{shouldPerformLayout(t){return!0}};p(sn,"type","fit-content"),at.setClass(sn);const nn="layoutManager";var on=class{constructor(t=new sn){p(this,"strategy",void 0),this.strategy=t,this._subscriptions=new Map}performLayout(t){let e={bubbles:!0,strategy:this.strategy,...t,prevStrategy:this._prevLayoutStrategy,stopPropagation(){this.bubbles=!1}};this.onBeforeLayout(e);let i=this.getLayoutResult(e);i&&this.commitLayout(e,i),this.onAfterLayout(e,i),this._prevLayoutStrategy=e.strategy}attachHandlers(t,e){let{target:i}=e;return[st,N,U,z,V,G,K,q,"modifyPath"].map(e=>t.on(e,t=>this.performLayout("modified"===e?{type:"object_modified",trigger:e,e:t,target:i}:{type:"object_modifying",trigger:e,e:t,target:i})))}subscribe(t,e){this.unsubscribe(t,e);let i=this.attachHandlers(t,e);this._subscriptions.set(t,i)}unsubscribe(t,e){(this._subscriptions.get(t)||[]).forEach(t=>t()),this._subscriptions.delete(t)}unsubscribeTargets(t){t.targets.forEach(e=>this.unsubscribe(e,t))}subscribeTargets(t){t.targets.forEach(e=>this.subscribe(e,t))}onBeforeLayout(t){let{target:e,type:i}=t,{canvas:r}=e;if("initialization"===i||"added"===i?this.subscribeTargets(t):"removed"===i&&this.unsubscribeTargets(t),e.fire("layout:before",{context:t}),r&&r.fire("object:layout:before",{target:e,context:t}),"imperative"===i&&t.deep){let{strategy:i,...r}=t;e.forEachObject(t=>t.layoutManager&&t.layoutManager.performLayout({...r,bubbles:!1,target:t}))}}getLayoutResult(t){let{target:e,strategy:i,type:r}=t,s=i.calcLayoutResult(t,e.getObjects());if(!s)return;let n="initialization"===r?new gt:e.getRelativeCenterPoint(),{center:o,correction:a=new gt,relativeCorrection:l=new gt}=s;return{result:s,prevCenter:n,nextCenter:o,offset:n.subtract(o).add(a).transform("initialization"===r?I:Pt(e.calcOwnMatrix()),!0).add(l)}}commitLayout(t,e){let{target:i}=t,{result:{size:r},nextCenter:s}=e;var n,o;i.set({width:r.x,height:r.y}),this.layoutObjects(t,e),"initialization"===t.type?i.set({left:null==(n=t.x)?s.x+r.x*Ie(i.originX):n,top:null==(o=t.y)?s.y+r.y*Ie(i.originY):o}):(i.setPositionByOrigin(s,R,R),i.setCoords(),i.set("dirty",!0))}layoutObjects(t,e){let{target:i}=t;i.forEachObject(r=>{r.group===i&&this.layoutObject(t,e,r)}),t.strategy.shouldLayoutClipPath(t)&&this.layoutObject(t,e,i.clipPath)}layoutObject(t,{offset:e},i){i.set({left:i.left+e.x,top:i.top+e.y})}onAfterLayout(t,e){let{target:i,strategy:r,bubbles:s,prevStrategy:n,...o}=t,{canvas:a}=i;i.fire("layout:after",{context:t,result:e}),a&&a.fire("object:layout:after",{context:t,result:e,target:i});let l=i.parent;s&&null!=l&&l.layoutManager&&((o.path||(o.path=[])).push(i),l.layoutManager.performLayout({...o,target:l})),i.set("dirty",!0)}dispose(){let{_subscriptions:t}=this;t.forEach(t=>t.forEach(t=>t())),t.clear()}toObject(){return{type:nn,strategy:this.strategy.constructor.type}}toJSON(){return this.toObject()}};at.setClass(on,nn);var an=class extends on{performLayout(){}},ln=class t extends(mt(ys)){static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),p(this,"_activeObjects",[]),p(this,"__objectSelectionTracker",void 0),p(this,"__objectSelectionDisposer",void 0),Object.assign(this,t.ownDefaults),this.setOptions(i),this.groupInit(e,i)}groupInit(t,e){var i;this._objects=[...t],this.__objectSelectionTracker=this.__objectSelectionMonitor.bind(this,!0),this.__objectSelectionDisposer=this.__objectSelectionMonitor.bind(this,!1),this.forEachObject(t=>{this.enterGroup(t,!1)}),this.layoutManager=null==(i=e.layoutManager)?new on:i,this.layoutManager.performLayout({type:Zs,target:this,targets:[...t],x:e.left,y:e.top})}canEnterGroup(t){return t===this||this.isDescendantOf(t)?(b("error","Group: circular object trees are not supported, this call has no effect"),!1):-1===this._objects.indexOf(t)||(b("error","Group: duplicate objects are not supported inside group, this call has no effect"),!1)}_filterObjectsBeforeEnteringGroup(t){return t.filter((t,e,i)=>this.canEnterGroup(t)&&i.indexOf(t)===e)}add(...t){let e=this._filterObjectsBeforeEnteringGroup(t),i=super.add(...e);return this._onAfterObjectsChange(tn,e),i}insertAt(t,...e){let i=this._filterObjectsBeforeEnteringGroup(e),r=super.insertAt(t,...i);return this._onAfterObjectsChange(tn,i),r}remove(...t){let e=super.remove(...t);return this._onAfterObjectsChange("removed",e),e}_onObjectAdded(t){this.enterGroup(t,!0),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t,e){this.exitGroup(t,e),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onAfterObjectsChange(t,e){this.layoutManager.performLayout({type:t,targets:e,target:this})}_onStackOrderChanged(){this._set("dirty",!0)}_set(t,e){let i=this[t];return super._set(t,e),"canvas"===t&&i!==e&&(this._objects||[]).forEach(i=>{i._set(t,e)}),this}_shouldSetNestedCoords(){return this.subTargetCheck}removeAll(){return this._activeObjects=[],this.remove(...this._objects)}__objectSelectionMonitor(t,{target:e}){let i=this._activeObjects;if(t)i.push(e),this._set("dirty",!0);else if(i.length>0){let t=i.indexOf(e);t>-1&&(i.splice(t,1),this._set("dirty",!0))}}_watchObject(t,e){t&&this._watchObject(!1,e),t?(e.on("selected",this.__objectSelectionTracker),e.on("deselected",this.__objectSelectionDisposer)):(e.off("selected",this.__objectSelectionTracker),e.off("deselected",this.__objectSelectionDisposer))}enterGroup(t,e){t.group&&t.group.remove(t),t._set("parent",this),this._enterGroup(t,e)}_enterGroup(t,e){e&&ke(t,At(Pt(this.calcTransformMatrix()),t.calcTransformMatrix())),this._shouldSetNestedCoords()&&t.setCoords(),t._set("group",this),t._set("canvas",this.canvas),this._watchObject(!0,t);let i=this.canvas&&this.canvas.getActiveObject&&this.canvas.getActiveObject();i&&(i===t||t.isDescendantOf(i))&&this._activeObjects.push(t)}exitGroup(t,e){this._exitGroup(t,e),t._set("parent",void 0),t._set("canvas",void 0)}_exitGroup(t,e){t._set("group",void 0),e||(ke(t,At(this.calcTransformMatrix(),t.calcTransformMatrix())),t.setCoords()),this._watchObject(!1,t);let i=this._activeObjects.length>0?this._activeObjects.indexOf(t):-1;i>-1&&this._activeObjects.splice(i,1)}shouldCache(){let t=ys.prototype.shouldCache.call(this);if(t)for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow())return this.ownCaching=!1,!1;return t}willDrawShadow(){if(super.willDrawShadow())return!0;for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow())return!0;return!1}isOnACache(){return this.ownCaching||!!this.parent&&this.parent.isOnACache()}drawObject(t,e,i){this._renderBackground(t);for(let e=0;e<this._objects.length;e++){var r;let i=this._objects[e];null!=(r=this.canvas)&&r.preserveObjectStacking&&i.group!==this?(t.save(),t.transform(...Pt(this.calcTransformMatrix())),i.render(t),t.restore()):i.group===this&&i.render(t)}this._drawClipPath(t,this.clipPath,i)}setCoords(){super.setCoords(),this._shouldSetNestedCoords()&&this.forEachObject(t=>t.setCoords())}triggerLayout(t={}){this.layoutManager.performLayout({target:this,type:"imperative",...t})}render(t){this._transformDone=!0,super.render(t),this._transformDone=!1}__serializeObjects(t,e){let i=this.includeDefaultValues;return this._objects.filter(function(t){return!t.excludeFromExport}).map(function(r){let s=r.includeDefaultValues;r.includeDefaultValues=i;let n=r[t||"toObject"](e);return r.includeDefaultValues=s,n})}toObject(t=[]){let e=this.layoutManager.toObject();return{...super.toObject(["subTargetCheck","interactive",...t]),..."fit-content"!==e.strategy||this.includeDefaultValues?{layoutManager:e}:{},objects:this.__serializeObjects("toObject",t)}}toString(){return`#<Group: (${this.complexity()})>`}dispose(){this.layoutManager.unsubscribeTargets({targets:this.getObjects(),target:this}),this._activeObjects=[],this.forEachObject(t=>{this._watchObject(!1,t),t.dispose()}),super.dispose()}_createSVGBgRect(t){if(!this.backgroundColor)return"";let e=Qs.prototype._toSVG.call(this),i=e.indexOf("COMMON_PARTS");e[i]='for="group" ';let r=e.join("");return t?t(r):r}_toSVG(t){let e=["<g ","COMMON_PARTS"," >\n"],i=this._createSVGBgRect(t);i&&e.push("\t\t",i);for(let i=0;i<this._objects.length;i++)e.push("\t\t",this._objects[i].toSVG(t));return e.push("</g>\n"),e}getSvgStyles(){let t=void 0!==this.opacity&&1!==this.opacity?`opacity: ${fe(this.opacity)};`:"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")}toClipPathSVG(t){let e=[],i=this._createSVGBgRect(t);i&&e.push("\t",i);for(let i=0;i<this._objects.length;i++)e.push("\t",this._objects[i].toClipPathSVG(t));return this._createBaseClipPathSVGMarkup(e,{reviver:t})}static fromObject({type:t,objects:e=[],layoutManager:i,...r},s){return Promise.all([Ut(e,s),qt(r,s)]).then(([t,e])=>{let s=new this(t,{...r,...e,layoutManager:new an});return s.layoutManager=i?new(at.getClass(i.type))(new(at.getClass(i.strategy))):new on,s.layoutManager.subscribeTargets({type:Zs,target:s,targets:s.getObjects()}),s.setCoords(),s})}};p(ln,"type","Group"),p(ln,"ownDefaults",{strokeWidth:0,subTargetCheck:!1,interactive:!1}),at.setClass(ln);const hn=(t,e)=>t&&1===t.length?t[0]:new ln(t,e),cn=(t,e)=>Math.min(e.width/t.width,e.height/t.height),un=(t,e)=>Math.max(e.width/t.width,e.height/t.height),dn="\\s*,?\\s*",gn=`${dn}(${Di})`,fn=`${gn}${gn}${gn}${dn}([01])${dn}([01])${gn}${gn}`,pn={m:"l",M:"L"},mn=(t,e,i,r,s,n,o,a,l,h,c)=>{let u=ut(t),d=dt(t),g=ut(e),f=dt(e),p=i*s*g-r*n*f+o,m=r*s*g+i*n*f+a;return["C",h+l*(-i*s*d-r*n*u),c+l*(-r*s*d+i*n*u),p+l*(i*s*f+r*n*g),m+l*(r*s*f-i*n*g),p,m]},yn=(t,e,i,r)=>{let s=Math.atan2(e,t),n=Math.atan2(r,i);return n>=s?n-s:2*Math.PI-(s-n)};function bn(t,e,i,r,s,n,o,a){let l;if(y.cachesBoundsOfCurve&&(l=[...arguments].join(),M.boundsOfCurveCache[l]))return M.boundsOfCurveCache[l];let h=Math.sqrt,c=Math.abs,u=[],d=[[0,0],[0,0]],g=6*t-12*i+6*s,f=-3*t+9*i-9*s+3*o,p=3*i-3*t;for(let t=0;t<2;++t){if(t>0&&(g=6*e-12*r+6*n,f=-3*e+9*r-9*n+3*a,p=3*r-3*e),c(f)<1e-12){if(c(g)<1e-12)continue;let t=-p/g;0<t&&t<1&&u.push(t);continue}let i=g*g-4*p*f;if(i<0)continue;let s=h(i),o=(-g+s)/(2*f);0<o&&o<1&&u.push(o);let l=(-g-s)/(2*f);0<l&&l<1&&u.push(l)}let m=u.length,b=m,_=wn(t,e,i,r,s,n,o,a);for(;m--;){let{x:t,y:e}=_(u[m]);d[0][m]=t,d[1][m]=e}d[0][b]=t,d[1][b]=e,d[0][b+1]=o,d[1][b+1]=a;let v=[new gt(Math.min(...d[0]),Math.min(...d[1])),new gt(Math.max(...d[0]),Math.max(...d[1]))];return y.cachesBoundsOfCurve&&(M.boundsOfCurveCache[l]=v),v}const vn=(t,e,[i,r,s,n,o,a,l,h])=>{let c=((t,e,i,r,s,n,o)=>{if(0===i||0===r)return[];let a=0,l=0,h=0,c=Math.PI,u=o*L,d=dt(u),g=ut(u),f=.5*(-g*t-d*e),p=.5*(-g*e+d*t),m=i**2,y=r**2,b=p**2,_=f**2,v=m*y-m*b-y*_,x=Math.abs(i),C=Math.abs(r);if(v<0){let t=Math.sqrt(1-v/(m*y));x*=t,C*=t}else h=(s===n?-1:1)*Math.sqrt(v/(m*b+y*_));let w=h*x*p/C,S=-h*C*f/x,T=g*w-d*S+.5*t,O=d*w+g*S+.5*e,k=yn(1,0,(f-w)/x,(p-S)/C),D=yn((f-w)/x,(p-S)/C,(-f-w)/x,(-p-S)/C);0===n&&D>0?D-=2*c:1===n&&D<0&&(D+=2*c);let M=Math.ceil(Math.abs(D/c*2)),j=[],E=D/M,P=8/3*Math.sin(E/4)*Math.sin(E/4)/Math.sin(E/2),A=k+E;for(let t=0;t<M;t++)j[t]=mn(k,A,g,d,x,C,T,O,P,a,l),a=j[t][5],l=j[t][6],k=A,A+=E;return j})(l-t,h-e,r,s,o,a,n);for(let i=0,r=c.length;i<r;i++)c[i][1]+=t,c[i][2]+=e,c[i][3]+=t,c[i][4]+=e,c[i][5]+=t,c[i][6]+=e;return c},xn=t=>{let e,i=0,r=0,s=0,n=0,o=[],a=0,l=0;for(let h of t){let t,c=[...h];switch(c[0]){case"l":c[1]+=i,c[2]+=r;case"L":i=c[1],r=c[2],t=["L",i,r];break;case"h":c[1]+=i;case"H":i=c[1],t=["L",i,r];break;case"v":c[1]+=r;case"V":r=c[1],t=["L",i,r];break;case"m":c[1]+=i,c[2]+=r;case"M":i=c[1],r=c[2],s=c[1],n=c[2],t=["M",i,r];break;case"c":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r,c[5]+=i,c[6]+=r;case"C":a=c[3],l=c[4],i=c[5],r=c[6],t=["C",c[1],c[2],a,l,i,r];break;case"s":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r;case"S":"C"===e?(a=2*i-a,l=2*r-l):(a=i,l=r),i=c[3],r=c[4],t=["C",a,l,c[1],c[2],i,r],a=t[3],l=t[4];break;case"q":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r;case"Q":a=c[1],l=c[2],i=c[3],r=c[4],t=["Q",a,l,i,r];break;case"t":c[1]+=i,c[2]+=r;case"T":"Q"===e?(a=2*i-a,l=2*r-l):(a=i,l=r),i=c[1],r=c[2],t=["Q",a,l,i,r];break;case"a":c[6]+=i,c[7]+=r;case"A":vn(i,r,c).forEach(t=>o.push(t)),i=c[6],r=c[7];break;case"z":case"Z":i=s,r=n,t=["Z"]}t?(o.push(t),e=t[0]):e=""}return o},Cn=(t,e,i,r)=>Math.sqrt((i-t)**2+(r-e)**2),wn=(t,e,i,r,s,n,o,a)=>l=>{let h=l**3,c=(t=>3*t**2*(1-t))(l),u=(t=>3*t*(1-t)**2)(l),d=(t=>(1-t)**3)(l);return new gt(o*h+s*c+i*u+t*d,a*h+n*c+r*u+e*d)},Sn=t=>t**2,Tn=t=>2*t*(1-t),On=t=>(1-t)**2,kn=(t,e,i,r,s,n,o,a)=>l=>{let h=Sn(l),c=Tn(l),u=On(l),d=3*(u*(i-t)+c*(s-i)+h*(o-s)),g=3*(u*(r-e)+c*(n-r)+h*(a-n));return Math.atan2(g,d)},Dn=(t,e,i,r,s,n)=>o=>{let a=Sn(o),l=Tn(o),h=On(o);return new gt(s*a+i*l+t*h,n*a+r*l+e*h)},Mn=(t,e,i,r,s,n)=>o=>{let a=1-o,l=2*(a*(i-t)+o*(s-i)),h=2*(a*(r-e)+o*(n-r));return Math.atan2(h,l)},jn=(t,e,i)=>{let r=new gt(e,i),s=0;for(let e=1;e<=100;e+=1){let i=t(e/100);s+=Cn(r.x,r.y,i.x,i.y),r=i}return s},En=t=>{let e,i,r=0,s=0,n=0,o=0,a=0,l=[];for(let h of t){let t={x:s,y:n,command:h[0],length:0};switch(h[0]){case"M":i=t,i.x=o=s=h[1],i.y=a=n=h[2];break;case"L":i=t,i.length=Cn(s,n,h[1],h[2]),s=h[1],n=h[2];break;case"C":e=wn(s,n,h[1],h[2],h[3],h[4],h[5],h[6]),i=t,i.iterator=e,i.angleFinder=kn(s,n,h[1],h[2],h[3],h[4],h[5],h[6]),i.length=jn(e,s,n),s=h[5],n=h[6];break;case"Q":e=Dn(s,n,h[1],h[2],h[3],h[4]),i=t,i.iterator=e,i.angleFinder=Mn(s,n,h[1],h[2],h[3],h[4]),i.length=jn(e,s,n),s=h[3],n=h[4];break;case"Z":i=t,i.destX=o,i.destY=a,i.length=Cn(s,n,o,a),s=o,n=a}r+=i.length,l.push(i)}return l.push({length:r,x:s,y:n}),l},Pn=(t,e,i=En(t))=>{let r=0;for(;e-i[r].length>0&&r<i.length-2;)e-=i[r].length,r++;let s=i[r],n=e/s.length,o=t[r];switch(s.command){case"M":return{x:s.x,y:s.y,angle:0};case"Z":return{...new gt(s.x,s.y).lerp(new gt(s.destX,s.destY),n),angle:Math.atan2(s.destY-s.y,s.destX-s.x)};case"L":return{...new gt(s.x,s.y).lerp(new gt(o[1],o[2]),n),angle:Math.atan2(o[2]-s.y,o[1]-s.x)};case"C":case"Q":return((t,e)=>{let i,r=0,s=0,n={x:t.x,y:t.y},o={...n},a=.01,l=0,h=t.iterator,c=t.angleFinder;for(;s<e&&a>1e-4;)o=h(r),l=r,i=Cn(n.x,n.y,o.x,o.y),i+s>e?(r-=a,a/=2):(n=o,r+=a,s+=i);return{...o,angle:c(l)}})(s,e)}},An=RegExp("[mzlhvcsqta][^mzlhvcsqta]*","gi"),Fn=new RegExp(fn,"g"),Ln=new RegExp(Di,"gi"),In={m:2,l:2,h:1,v:1,c:6,s:4,q:4,t:2,a:7},Rn=t=>{var e;let i=[],r=null==(e=t.match(An))?[]:e;for(let t of r){let e=t[0];if("z"===e||"Z"===e){i.push([e]);continue}let r=In[e.toLowerCase()],s=[];if("a"===e||"A"===e){let e;for(Fn.lastIndex=0;e=Fn.exec(t);)s.push(...e.slice(1))}else s=t.match(Ln)||[];for(let t=0;t<s.length;t+=r){let n=Array(r),o=pn[e];n[0]=t>0&&o?o:e;for(let e=0;e<r;e++)n[e+1]=parseFloat(s[t+e]);i.push(n)}}return i},Bn=(t,e=0)=>{let i,r=new gt(t[0]),s=new gt(t[1]),n=1,o=0,a=[],l=t.length,h=l>2;for(h&&(n=t[2].x<s.x?-1:t[2].x===s.x?0:1,o=t[2].y<s.y?-1:t[2].y===s.y?0:1),a.push(["M",r.x-n*e,r.y-o*e]),i=1;i<l;i++){if(!r.eq(s)){let t=r.midPointFrom(s);a.push(["Q",r.x,r.y,t.x,t.y])}r=t[i],i+1<t.length&&(s=t[i+1])}return h&&(n=r.x>t[i-2].x?1:r.x===t[i-2].x?0:-1,o=r.y>t[i-2].y?1:r.y===t[i-2].y?0:-1),a.push(["L",r.x+n*e,r.y+o*e]),a},$n=(t,e,i)=>(i&&(e=At(e,[1,0,0,1,-i.x,-i.y])),t.map(t=>{let i=[...t];for(let r=1;r<t.length-1;r+=2){let{x:s,y:n}=Et({x:t[r],y:t[r+1]},e);i[r]=s,i[r+1]=n}return i})),Xn=(t,e)=>{let i=2*Math.PI/t,r=-P;t%2==0&&(r+=i/2);let s=Array(t+1);for(let n=0;n<t;n++){let t=n*i+r,{x:o,y:a}=new gt(ut(t),dt(t)).scalarMultiply(e);s[n]=[0===n?"M":"L",o,a]}return s[t]=["Z"],s},Yn=(t,e)=>t.map(t=>t.map((t,i)=>0===i||void 0===e?t:Qt(t,e)).join(" ")).join(" "),Wn=(t,e)=>{var i;let r=t,s=e;r.inverted&&!s.inverted&&(r=e,s=t),Fe(s,null==(i=s.group)?void 0:i.calcTransformMatrix(),r.calcTransformMatrix());let n=r.inverted&&s.inverted;return n&&(r.inverted=s.inverted=!1),new ln([r],{clipPath:s,inverted:n})},Nn=(t,e)=>Math.floor(Math.random()*(e-t+1))+t,Vn=(t,e)=>{let i=t._findCenterFromElement();t.transformMatrix&&((t=>{if(t.transformMatrix){let{scaleX:e,scaleY:i,angle:r,skewX:s}=Bt(t.transformMatrix);t.flipX=!1,t.flipY=!1,t.set(Q,e),t.set(Z,i),t.angle=r,t.skewX=s,t.skewY=0}})(t),i=i.transform(t.transformMatrix)),delete t.transformMatrix,e&&(t.scaleX*=e.scaleX,t.scaleY*=e.scaleY,t.cropX=e.cropX,t.cropY=e.cropY,i.x+=e.offsetLeft,i.y+=e.offsetTop,t.width=e.width,t.height=e.height),t.setPositionByOrigin(i,R,R)};function zn(t,e){let i=t.style;i&&Object.entries(e).forEach(([t,e])=>i.setProperty(t,e))}d({addTransformToObject:()=>Oe,animate:()=>Mr,animateColor:()=>jr,applyTransformToObject:()=>ke,calcAngleBetweenVectors:()=>We,calcDimensionsMatrix:()=>zt,calcPlaneChangeMatrix:()=>Ee,calcVectorRotation:()=>Ne,cancelAnimFrame:()=>_t,capValue:()=>Bi,composeMatrix:()=>Ht,copyCanvasElement:()=>St,cos:()=>ut,createCanvasElement:()=>Ct,createImage:()=>wt,createRotateMatrix:()=>Xt,createScaleMatrix:()=>Yt,createSkewXMatrix:()=>Nt,createSkewYMatrix:()=>Vt,createTranslateMatrix:()=>$t,createVector:()=>Xe,crossProduct:()=>He,degreesToRadians:()=>Dt,dotProduct:()=>Ge,ease:()=>Wi,enlivenObjectEnlivables:()=>qt,enlivenObjects:()=>Ut,findScaleToCover:()=>un,findScaleToFit:()=>cn,getBoundsOfCurve:()=>bn,getOrthonormalVector:()=>ze,getPathSegmentsInfo:()=>En,getPointOnPath:()=>Pn,getPointer:()=>xe,getRandomInt:()=>Nn,getRegularPolygonPath:()=>Xn,getSmoothPathFromPoints:()=>Bn,getSvgAttributes:()=>fi,getUnitVector:()=>Ve,groupSVGElements:()=>hn,hasStyleChanged:()=>Ts,invertTransform:()=>Pt,isBetweenVectors:()=>Ue,isIdentityMatrix:()=>jt,isTouchEvent:()=>Ce,isTransparent:()=>bs,joinPath:()=>Yn,loadImage:()=>Gt,magnitude:()=>Ye,makeBoundingBoxFromPoints:()=>Se,makePathSimpler:()=>xn,matrixToSVG:()=>Zt,mergeClipPaths:()=>Wn,multiplyTransformMatrices:()=>At,multiplyTransformMatrixArray:()=>Ft,parsePath:()=>Rn,parsePreserveAspectRatioAttribute:()=>mi,parseUnit:()=>pi,pick:()=>Kt,projectStrokeOnPoints:()=>ws,qrDecompose:()=>Bt,radiansToDegrees:()=>Mt,removeFromArray:()=>ct,removeTransformFromObject:()=>Te,removeTransformMatrixForSvgParsing:()=>Vn,requestAnimFrame:()=>bt,resetObjectTransform:()=>De,rotateVector:()=>$e,saveObjectTransform:()=>Me,sendObjectToPlane:()=>Fe,sendPointToPlane:()=>Pe,sendVectorToPlane:()=>Ae,sin:()=>dt,sizeAfterTransform:()=>je,string:()=>de,stylesFromArray:()=>ks,stylesToArray:()=>Os,toBlob:()=>kt,toDataURL:()=>Ot,toFixed:()=>Qt,transformPath:()=>$n,transformPoint:()=>Et});var Hn=class extends ce{constructor(t,{allowTouchScrolling:e=!1,containerClass:i=""}={}){super(t),p(this,"upper",void 0),p(this,"container",void 0);let{el:r}=this.lower,s=this.createUpperCanvas();this.upper={el:s,ctx:s.getContext("2d")},this.applyCanvasStyle(r,{allowTouchScrolling:e}),this.applyCanvasStyle(s,{allowTouchScrolling:e,styles:{position:"absolute",left:"0",top:"0"}});let n=this.createContainerElement();n.classList.add(i),r.parentNode&&r.parentNode.replaceChild(n,r),n.append(r,s),this.container=n}createUpperCanvas(){let{el:t}=this.lower,e=Ct();return e.className=t.className,e.classList.remove("lower-canvas"),e.classList.add("upper-canvas"),e.setAttribute("data-fabric","top"),e.style.cssText=t.style.cssText,e.setAttribute("draggable","true"),e}createContainerElement(){let t=O().createElement("div");return t.setAttribute("data-fabric","wrapper"),zn(t,{position:"relative"}),he(t),t}applyCanvasStyle(t,e){let{styles:i,allowTouchScrolling:r}=e;zn(t,{...i,"touch-action":r?"manipulation":Y}),he(t)}setDimensions(t,e){super.setDimensions(t,e);let{el:i,ctx:r}=this.upper;ae(i,r,t,e)}setCSSDimensions(t){super.setCSSDimensions(t),le(this.upper.el,t),le(this.container,t)}cleanupDOM(t){let e=this.container,{el:i}=this.lower,{el:r}=this.upper;super.cleanupDOM(t),e.removeChild(r),e.removeChild(i),e.parentNode&&e.parentNode.replaceChild(i,e)}dispose(){super.dispose(),T().dispose(this.upper.el),delete this.upper,delete this.container}};const Gn=(t,e,i,r)=>{let{target:s,offsetX:n,offsetY:o}=e,a=i-n,l=r-o,h=!Qe(s,"lockMovementX")&&s.left!==a,c=!Qe(s,"lockMovementY")&&s.top!==l;return h&&s.set("left",a),c&&s.set("top",l),(h||c)&&Fr(N,Ze(t,e,i,r)),h||c},Un=q,qn=t=>function(e,i,r){let{points:s,pathOffset:n}=r;return new gt(s[t]).subtract(n).transform(At(r.getViewportTransform(),r.calcTransformMatrix()))},Kn=(t,e,i,r)=>{let{target:s,pointIndex:n}=e,o=s,a=Pe(new gt(i,r),void 0,o.calcOwnMatrix());return o.points[n]=a.add(o.pathOffset),o.setDimensions(),o.set("dirty",!0),!0},Jn=(t,e)=>function(i,r,s,n){let o=r.target,a=new gt(o.points[(t>0?t:o.points.length)-1]),l=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()),h=e(i,{...r,pointIndex:t},s,n),c=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()).subtract(l);return o.left-=c.x,o.top-=c.y,h},Qn=t=>Lr(Un,Jn(t,Kn));function Zn(t,e={}){let i={};for(let r=0;r<("number"==typeof t?t:t.points.length);r++)i[`p${r}`]=new Vr({actionName:Un,positionHandler:qn(r),actionHandler:Qn(r),...e});return i}const to=(t,e,i)=>{let{path:r,pathOffset:s}=t,n=r[e];return new gt(n[i]-s.x,n[i+1]-s.y).transform(At(t.getViewportTransform(),t.calcTransformMatrix()))};function eo(t,e,i){let{commandIndex:r,pointIndex:s}=this;return to(i,r,s)}function io(t,e,i,r){let{target:s}=e,{commandIndex:n,pointIndex:o}=this,a=((t,e,i,r,s)=>{let{path:n,pathOffset:o}=t,a=n[(r>0?r:n.length)-1],l=new gt(a[s],a[s+1]),h=l.subtract(o).transform(t.calcOwnMatrix()),c=Pe(new gt(e,i),void 0,t.calcOwnMatrix());n[r][s]=c.x+o.x,n[r][s+1]=c.y+o.y,t.setDimensions();let u=l.subtract(t.pathOffset).transform(t.calcOwnMatrix()).subtract(h);return t.left-=u.x,t.top-=u.y,t.set("dirty",!0),!0})(s,i,r,n,o);return a&&Fr(this.actionName,{...Ze(t,e,i,r),commandIndex:n,pointIndex:o}),a}var ro=class extends Vr{constructor(t){super(t)}render(t,e,i,r,s){let n={...r,cornerColor:this.controlFill,cornerStrokeColor:this.controlStroke,transparentCorners:!this.controlFill};super.render(t,e,i,n,s)}},so=class extends ro{constructor(t){super(t)}render(t,e,i,r,s){let{path:n}=s,{commandIndex:o,pointIndex:a,connectToCommandIndex:l,connectToPointIndex:h}=this;t.save(),t.strokeStyle=this.controlStroke,this.connectionDashArray&&t.setLineDash(this.connectionDashArray);let[c]=n[o],u=to(s,l,h);if("Q"===c){let r=to(s,o,a+2);t.moveTo(r.x,r.y),t.lineTo(e,i)}else t.moveTo(e,i);t.lineTo(u.x,u.y),t.stroke(),t.restore(),super.render(t,e,i,r,s)}};const no=(t,e,i,r,s,n)=>new(i?so:ro)({commandIndex:t,pointIndex:e,actionName:"modifyPath",positionHandler:eo,actionHandler:io,connectToCommandIndex:s,connectToPointIndex:n,...r,...i?r.controlPointStyle:r.pointStyle});function oo(t,e={}){let i={},r="M";return t.path.forEach((t,s)=>{let n=t[0];switch("Z"!==n&&(i[`c_${s}_${n}`]=no(s,t.length-2,!1,e)),n){case"C":i[`c_${s}_C_CP_1`]=no(s,1,!0,e,s-1,(t=>"C"===t?5:"Q"===t?3:1)(r)),i[`c_${s}_C_CP_2`]=no(s,3,!0,e,s,5);break;case"Q":i[`c_${s}_Q_CP_1`]=no(s,1,!0,e,s,3)}r=n}),i}d({changeHeight:()=>Yr,changeObjectHeight:()=>$r,changeObjectWidth:()=>Br,changeWidth:()=>Xr,createObjectDefaultControls:()=>ds,createPathControls:()=>oo,createPolyActionHandler:()=>Qn,createPolyControls:()=>Zn,createPolyPositionHandler:()=>qn,createResizeControls:()=>gs,createTextboxDefaultControls:()=>fs,dragHandler:()=>Gn,factoryPolyActionHandler:()=>Jn,getLocalPoint:()=>ei,polyActionHandler:()=>Kn,renderCircleControl:()=>Wr,renderSquareControl:()=>Nr,rotationStyleHandler:()=>zr,rotationWithSnapping:()=>Hr,scaleCursorStyleHandler:()=>Kr,scaleOrSkewActionName:()=>ls,scaleSkewCursorStyleHandler:()=>hs,scalingEqually:()=>Qr,scalingX:()=>Zr,scalingXOrSkewingY:()=>cs,scalingY:()=>ts,scalingYOrSkewingX:()=>us,skewCursorStyleHandler:()=>rs,skewHandlerX:()=>ns,skewHandlerY:()=>os,wrapWithFireEvent:()=>Lr,wrapWithFixedAnchor:()=>Ir});var ao=class t extends _e{constructor(...t){super(...t),p(this,"_hoveredTargets",[]),p(this,"_currentTransform",null),p(this,"_groupSelector",null),p(this,"contextTopDirty",!1)}static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}get upperCanvasEl(){var t;return null==(t=this.elements.upper)?void 0:t.el}get contextTop(){var t;return null==(t=this.elements.upper)?void 0:t.ctx}get wrapperEl(){return this.elements.container}initElements(t){this.elements=new Hn(t,{allowTouchScrolling:this.allowTouchScrolling,containerClass:this.containerClass}),this._createCacheCanvas()}_onObjectAdded(t){this._objectsToRender=void 0,super._onObjectAdded(t)}_onObjectRemoved(t){this._objectsToRender=void 0,t===this._activeObject&&(this.fire("before:selection:cleared",{deselected:[t]}),this._discardActiveObject(),this.fire("selection:cleared",{deselected:[t]}),t.fire("deselected",{target:t})),t===this._hoveredTarget&&(this._hoveredTarget=void 0,this._hoveredTargets=[]),super._onObjectRemoved(t)}_onStackOrderChanged(){this._objectsToRender=void 0,super._onStackOrderChanged()}_chooseObjectsToRender(){let t=this._activeObject;return!this.preserveObjectStacking&&t?this._objects.filter(e=>!e.group&&e!==t).concat(t):this._objects}renderAll(){this.cancelRequestedRender(),this.destroyed||(!this.contextTopDirty||this._groupSelector||this.isDrawingMode||(this.clearContext(this.contextTop),this.contextTopDirty=!1),this.hasLostContext&&(this.renderTopLayer(this.contextTop),this.hasLostContext=!1),!this._objectsToRender&&(this._objectsToRender=this._chooseObjectsToRender()),this.renderCanvas(this.getContext(),this._objectsToRender))}renderTopLayer(t){t.save(),this.isDrawingMode&&this._isCurrentlyDrawing&&(this.freeDrawingBrush&&this.freeDrawingBrush._render(),this.contextTopDirty=!0),this.selection&&this._groupSelector&&(this._drawSelection(t),this.contextTopDirty=!0),t.restore()}renderTop(){let t=this.contextTop;this.clearContext(t),this.renderTopLayer(t),this.fire("after:render",{ctx:t})}setTargetFindTolerance(t){t=Math.round(t),this.targetFindTolerance=t;let e=this.getRetinaScaling(),i=Math.ceil((2*t+1)*e);this.pixelFindCanvasEl.width=this.pixelFindCanvasEl.height=i,this.pixelFindContext.scale(e,e)}isTargetTransparent(t,e,i){let r=this.targetFindTolerance,s=this.pixelFindContext;this.clearContext(s),s.save(),s.translate(-e+r,-i+r),s.transform(...this.viewportTransform);let n=t.selectionBackgroundColor;t.selectionBackgroundColor="",t.render(s),t.selectionBackgroundColor=n,s.restore();let o=Math.round(r*this.getRetinaScaling());return bs(s,o,o,o)}_isSelectionKeyPressed(t){let e=this.selectionKey;return!!e&&(Array.isArray(e)?!!e.find(e=>!!e&&!0===t[e]):t[e])}_shouldClearSelection(t,e){let i=this.getActiveObjects(),r=this._activeObject;return!!(!e||e&&r&&i.length>1&&-1===i.indexOf(e)&&r!==e&&!this._isSelectionKeyPressed(t)||e&&!e.evented||e&&!e.selectable&&r&&r!==e)}_shouldCenterTransform(t,e,i){if(!t)return;let r;return"scale"===e||"scaleX"===e||"scaleY"===e||"resizing"===e?r=this.centeredScaling||t.centeredScaling:"rotate"===e&&(r=this.centeredRotation||t.centeredRotation),r?!i:i}_getOriginFromCorner(t,e){let i=e?t.controls[e].getTransformAnchorPoint():{x:t.originX,y:t.originY};return e?(["ml","tl","bl"].includes(e)?i.x=X:["mr","tr","br"].includes(e)&&(i.x=B),["tl","mt","tr"].includes(e)?i.y=$:["bl","mb","br"].includes(e)&&(i.y="top"),i):i}_setupCurrentTransform(t,e,i){var r;let s=e.group?Pe(this.getScenePoint(t),void 0,e.group.calcTransformMatrix()):this.getScenePoint(t),{key:n="",control:o}=e.getActiveControl()||{},a=i&&o?null==(r=o.getActionHandler(t,e,o))?void 0:r.bind(o):Gn,l=((t,e,i,r)=>{if(!e||!t)return"drag";let s=r.controls[e];return s.getActionName(i,s,r)})(i,n,t,e),h=t[this.centeredKey],c=this._shouldCenterTransform(e,l,h)?{x:R,y:R}:this._getOriginFromCorner(e,n),{scaleX:u,scaleY:d,skewX:g,skewY:f,left:p,top:m,angle:y,width:b,height:_,cropX:v,cropY:x}=e,C={target:e,action:l,actionHandler:a,actionPerformed:!1,corner:n,scaleX:u,scaleY:d,skewX:g,skewY:f,offsetX:s.x-p,offsetY:s.y-m,originX:c.x,originY:c.y,ex:s.x,ey:s.y,lastX:s.x,lastY:s.y,theta:Dt(y),width:b,height:_,shiftKey:t.shiftKey,altKey:h,original:{...Me(e),originX:c.x,originY:c.y,cropX:v,cropY:x}};this._currentTransform=C,this.fire("before:transform",{e:t,transform:C})}setCursor(t){this.upperCanvasEl.style.cursor=t}_drawSelection(t){let{x:e,y:i,deltaX:r,deltaY:s}=this._groupSelector,n=new gt(e,i).transform(this.viewportTransform),o=new gt(e+r,i+s).transform(this.viewportTransform),a=this.selectionLineWidth/2,l=Math.min(n.x,o.x),h=Math.min(n.y,o.y),c=Math.max(n.x,o.x),u=Math.max(n.y,o.y);this.selectionColor&&(t.fillStyle=this.selectionColor,t.fillRect(l,h,c-l,u-h)),this.selectionLineWidth&&this.selectionBorderColor&&(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,l+=a,h+=a,c-=a,u-=a,ys.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(l,h,c-l,u-h))}findTarget(t){if(this._targetInfo)return this._targetInfo;if(this.skipTargetFind)return{subTargets:[],currentSubTargets:[]};let e=this.getScenePoint(t),i=this._activeObject,r=this.getActiveObjects(),s=this.searchPossibleTargets(this._objects,e),{subTargets:n,container:o,target:a}=s,l={...s,currentSubTargets:n,currentContainer:o,currentTarget:a};if(!i)return l;let h={...this.searchPossibleTargets([i],e),currentSubTargets:n,currentContainer:o,currentTarget:a};return i.findControl(this.getViewportPoint(t),Ce(t))?{...h,target:i}:h.target&&(r.length>1||!this.preserveObjectStacking||this.preserveObjectStacking&&t[this.altSelectionKey])?h:l}_pointIsInObjectSelectionArea(t,e){let i=t.getCoords(),r=this.getZoom(),s=t.padding/r;if(s){let[t,e,r,n]=i,o=Math.atan2(e.y-t.y,e.x-t.x),a=ut(o)*s,l=dt(o)*s,h=a+l,c=a-l;i=[new gt(t.x-c,t.y-h),new gt(e.x+h,e.y-c),new gt(r.x+c,r.y+h),new gt(n.x-h,n.y+c)]}return Er.isPointInPolygon(e,i)}_checkTarget(t,e){if(t&&t.visible&&t.evented&&this._pointIsInObjectSelectionArea(t,e)){if(!this.perPixelTargetFind&&!t.perPixelTargetFind||t.isEditing)return!0;{let i=e.transform(this.viewportTransform);if(!this.isTargetTransparent(t,i.x,i.y))return!0}}return!1}_searchPossibleTargets(t,e,i){let r=t.length;for(;r--;){let s=t[r];if(this._checkTarget(s,e)){if(pt(s)&&s.subTargetCheck){let{target:t}=this._searchPossibleTargets(s._objects,e,i);t&&i.push(t)}return{target:s,subTargets:i}}}return{subTargets:[]}}searchPossibleTargets(t,e){let i=this._searchPossibleTargets(t,e,[]);i.container=i.target;let{container:r,subTargets:s}=i;if(r&&pt(r)&&r.interactive&&s[0]){for(let t=s.length-1;t>0;t--){let e=s[t];if(!pt(e)||!e.interactive)return i.target=e,i}return i.target=s[0],i}return i}getViewportPoint(t){return this._viewportPoint?this._viewportPoint:this._getPointerImpl(t,!0)}getScenePoint(t){return this._scenePoint?this._scenePoint:this._getPointerImpl(t)}_getPointerImpl(t,e=!1){let i=this.upperCanvasEl,r=i.getBoundingClientRect(),s=xe(t),n=r.width||0,o=r.height||0;n&&o||("top"in r&&"bottom"in r&&(o=Math.abs(r.top-r.bottom)),"right"in r&&"left"in r&&(n=Math.abs(r.right-r.left))),this.calcOffset(),s.x-=this._offset.left,s.y-=this._offset.top,e||(s=Pe(s,void 0,this.viewportTransform));let a=this.getRetinaScaling();1!==a&&(s.x/=a,s.y/=a);let l=0===n||0===o?new gt(1,1):new gt(i.width/n,i.height/o);return s.multiply(l)}_setDimensionsImpl(t,e){this._resetTransformEventData(),super._setDimensionsImpl(t,e),this._isCurrentlyDrawing&&this.freeDrawingBrush&&this.freeDrawingBrush._setBrushStyles(this.contextTop)}_createCacheCanvas(){this.pixelFindCanvasEl=Ct(),this.pixelFindContext=this.pixelFindCanvasEl.getContext("2d",{willReadFrequently:!0}),this.setTargetFindTolerance(this.targetFindTolerance)}getTopContext(){return this.elements.upper.ctx}getSelectionContext(){return this.elements.upper.ctx}getSelectionElement(){return this.elements.upper.el}getActiveObject(){return this._activeObject}getActiveObjects(){let t=this._activeObject;return re(t)?t.getObjects():t?[t]:[]}_fireSelectionEvents(t,e){let i=!1,r=!1,s=this.getActiveObjects(),n=[],o=[];t.forEach(t=>{s.includes(t)||(i=!0,t.fire("deselected",{e,target:t}),o.push(t))}),s.forEach(r=>{t.includes(r)||(i=!0,r.fire("selected",{e,target:r}),n.push(r))}),t.length>0&&s.length>0?(r=!0,i&&this.fire("selection:updated",{e,selected:n,deselected:o})):s.length>0?(r=!0,this.fire("selection:created",{e,selected:n})):t.length>0&&(r=!0,this.fire("selection:cleared",{e,deselected:o})),r&&(this._objectsToRender=void 0)}setActiveObject(t,e){let i=this.getActiveObjects(),r=this._setActiveObject(t,e);return this._fireSelectionEvents(i,e),r}_setActiveObject(t,e){let i=this._activeObject;return!(i===t||!this._discardActiveObject(e,t)&&this._activeObject||t.onSelect({e})||(this._activeObject=t,re(t)&&i!==t&&t.set("canvas",this),t.setCoords(),0))}_discardActiveObject(t,e){let i=this._activeObject;return!!i&&!i.onDeselect({e:t,object:e})&&(this._currentTransform&&this._currentTransform.target===i&&this.endCurrentTransform(t),re(i)&&i===this._hoveredTarget&&(this._hoveredTarget=void 0),this._activeObject=void 0,!0)}discardActiveObject(t){let e=this.getActiveObjects(),i=this.getActiveObject();e.length&&this.fire("before:selection:cleared",{e:t,deselected:[i]});let r=this._discardActiveObject(t);return this._fireSelectionEvents(e,t),r}endCurrentTransform(t){let e=this._currentTransform;this._finalizeCurrentTransform(t),e&&e.target&&(e.target.isMoving=!1),this._currentTransform=null}_finalizeCurrentTransform(t){let e=this._currentTransform,i=e.target,r={e:t,target:i,transform:e,action:e.action};i._scaling&&(i._scaling=!1),i.setCoords(),e.actionPerformed&&(this.fire("object:modified",r),i.fire(st,r))}setViewportTransform(t){super.setViewportTransform(t);let e=this._activeObject;e&&e.setCoords()}destroy(){let t=this._activeObject;re(t)&&(t.removeAll(),t.dispose()),delete this._activeObject,super.destroy(),this.pixelFindContext=null,this.pixelFindCanvasEl=void 0}clear(){this.discardActiveObject(),this._activeObject=void 0,this.clearContext(this.contextTop),super.clear()}drawControls(t){let e=this._activeObject;e&&e._renderControls(t)}_toObject(t,e,i){let r=this._realizeGroupTransformOnObject(t),s=super._toObject(t,e,i);return t.set(r),s}_realizeGroupTransformOnObject(t){let{group:e}=t;if(e&&re(e)&&this._activeObject===e){let i=Kt(t,["angle","flipX","flipY",B,Q,Z,tt,et,"top"]);return Oe(t,e.calcOwnMatrix()),i}return{}}_setSVGObject(t,e,i){let r=this._realizeGroupTransformOnObject(e);super._setSVGObject(t,e,i),e.set(r)}};p(ao,"ownDefaults",{uniformScaling:!0,uniScaleKey:"shiftKey",centeredScaling:!1,centeredRotation:!1,centeredKey:"altKey",altActionKey:"shiftKey",selection:!0,selectionKey:"shiftKey",selectionColor:"rgba(100, 100, 255, 0.3)",selectionDashArray:[],selectionBorderColor:"rgba(255, 255, 255, 0.3)",selectionLineWidth:1,selectionFullyContained:!1,hoverCursor:"move",moveCursor:"move",defaultCursor:"default",freeDrawingCursor:"crosshair",notAllowedCursor:"not-allowed",perPixelTargetFind:!1,targetFindTolerance:0,skipTargetFind:!1,stopContextMenu:!0,fireRightClick:!0,fireMiddleClick:!0,enablePointerEvents:!1,containerClass:"canvas-container",preserveObjectStacking:!0});var lo=class{constructor(t){p(this,"targets",[]),p(this,"__disposer",void 0);let e=()=>{let{hiddenTextarea:e}=t.getActiveObject()||{};e&&e.focus()},i=t.upperCanvasEl;i.addEventListener("click",e),this.__disposer=()=>i.removeEventListener("click",e)}exitTextEditing(){this.target=void 0,this.targets.forEach(t=>{t.isEditing&&t.exitEditing()})}add(t){this.targets.push(t)}remove(t){this.unregister(t),ct(this.targets,t)}register(t){this.target=t}unregister(t){t===this.target&&(this.target=void 0)}onMouseMove(t){var e;null!=(e=this.target)&&e.isEditing&&this.target.updateSelectionOnMouseMove(t)}clear(){this.targets=[],this.target=void 0}dispose(){this.clear(),this.__disposer(),delete this.__disposer}};const ho={passive:!1},co=(t,e)=>({viewportPoint:t.getViewportPoint(e),scenePoint:t.getScenePoint(e)}),uo=(t,...e)=>t.addEventListener(...e),go=(t,...e)=>t.removeEventListener(...e),fo={mouse:{in:"over",out:"out",targetIn:"mouseover",targetOut:"mouseout",canvasIn:"mouse:over",canvasOut:"mouse:out"},drag:{in:"enter",out:"leave",targetIn:"dragenter",targetOut:"dragleave",canvasIn:"drag:enter",canvasOut:"drag:leave"}};var po=class extends ao{constructor(t,e={}){super(t,e),p(this,"_isClick",void 0),p(this,"textEditingManager",new lo(this)),["_onMouseDown","_onTouchStart","_onMouseMove","_onMouseUp","_onTouchEnd","_onResize","_onMouseWheel","_onMouseOut","_onMouseEnter","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragProgress","_onDragOver","_onDragEnter","_onDragLeave","_onDrop"].forEach(t=>{this[t]=this[t].bind(this)}),this.addOrRemove(uo)}_getEventPrefix(){return this.enablePointerEvents?"pointer":"mouse"}addOrRemove(t,e=!1){let i=this.upperCanvasEl,r=this._getEventPrefix();t(oe(i),"resize",this._onResize),t(i,r+"down",this._onMouseDown),t(i,`${r}move`,this._onMouseMove,ho),t(i,`${r}out`,this._onMouseOut),t(i,`${r}enter`,this._onMouseEnter),t(i,"wheel",this._onMouseWheel,{passive:!1}),t(i,"contextmenu",this._onContextMenu),e||(t(i,"click",this._onClick),t(i,"dblclick",this._onClick)),t(i,"dragstart",this._onDragStart),t(i,"dragend",this._onDragEnd),t(i,"dragover",this._onDragOver),t(i,"dragenter",this._onDragEnter),t(i,"dragleave",this._onDragLeave),t(i,"drop",this._onDrop),this.enablePointerEvents||t(i,"touchstart",this._onTouchStart,ho)}removeListeners(){this.addOrRemove(go);let t=this._getEventPrefix(),e=ne(this.upperCanvasEl);go(e,`${t}up`,this._onMouseUp),go(e,"touchend",this._onTouchEnd,ho),go(e,`${t}move`,this._onMouseMove,ho),go(e,"touchmove",this._onMouseMove,ho),clearTimeout(this._willAddMouseDown)}_onMouseWheel(t){this._cacheTransformEventData(t),this._handleEvent(t,"wheel"),this._resetTransformEventData()}_onMouseOut(t){let e=this._hoveredTarget,i={e:t,...co(this,t)};this.fire("mouse:out",{...i,target:e}),this._hoveredTarget=void 0,e&&e.fire("mouseout",{...i}),this._hoveredTargets.forEach(t=>{this.fire("mouse:out",{...i,target:t}),t&&t.fire("mouseout",{...i})}),this._hoveredTargets=[]}_onMouseEnter(t){let{target:e}=this.findTarget(t);this._currentTransform||e||(this.fire("mouse:over",{e:t,...co(this,t)}),this._hoveredTarget=void 0,this._hoveredTargets=[])}_onDragStart(t){this._isClick=!1;let e=this.getActiveObject();if(e&&e.onDragStart(t)){this._dragSource=e;let i={e:t,target:e};return this.fire("dragstart",i),e.fire("dragstart",i),void uo(this.upperCanvasEl,"drag",this._onDragProgress)}we(t)}_renderDragEffects(t,e,i){let r=!1,s=this._dropTarget;s&&s!==e&&s!==i&&(s.clearContextTop(),r=!0),null==e||e.clearContextTop(),i!==e&&(null==i||i.clearContextTop());let n=this.contextTop;n.save(),n.transform(...this.viewportTransform),e&&(n.save(),e.transform(n),e.renderDragSourceEffect(t),n.restore(),r=!0),i&&(n.save(),i.transform(n),i.renderDropTargetEffect(t),n.restore(),r=!0),n.restore(),r&&(this.contextTopDirty=!0)}_onDragEnd(t){let{currentSubTargets:e}=this.findTarget(t),i=!!t.dataTransfer&&"none"!==t.dataTransfer.dropEffect,r=i?this._activeObject:void 0,s={e:t,target:this._dragSource,subTargets:e,dragSource:this._dragSource,didDrop:i,dropTarget:r};go(this.upperCanvasEl,"drag",this._onDragProgress),this.fire("dragend",s),this._dragSource&&this._dragSource.fire("dragend",s),delete this._dragSource,this._onMouseUp(t)}_onDragProgress(t){let e={e:t,target:this._dragSource,dragSource:this._dragSource,dropTarget:this._draggedoverTarget};this.fire("drag",e),this._dragSource&&this._dragSource.fire("drag",e)}_onDragOver(t){let e,i="dragover",{currentContainer:r,currentSubTargets:s}=this.findTarget(t),n=this._dragSource,o={e:t,target:r,subTargets:s,dragSource:n,canDrop:!1,dropTarget:void 0};this.fire(i,o),this._fireEnterLeaveEvents(t,r,o),r&&(r.canDrop(t)&&(e=r),r.fire(i,o));for(let r=0;r<s.length;r++){let n=s[r];n.canDrop(t)&&(e=n),n.fire(i,o)}this._renderDragEffects(t,n,e),this._dropTarget=e}_onDragEnter(t){let{currentContainer:e,currentSubTargets:i}=this.findTarget(t),r={e:t,target:e,subTargets:i,dragSource:this._dragSource};this.fire("dragenter",r),this._fireEnterLeaveEvents(t,e,r)}_onDragLeave(t){let{currentSubTargets:e}=this.findTarget(t),i={e:t,target:this._draggedoverTarget,subTargets:e,dragSource:this._dragSource};this.fire("dragleave",i),this._fireEnterLeaveEvents(t,void 0,i),this._renderDragEffects(t,this._dragSource),this._dropTarget=void 0,this._hoveredTargets=[]}_onDrop(t){let{currentContainer:e,currentSubTargets:i}=this.findTarget(t),r=this._basicEventHandler("drop:before",{e:t,target:e,subTargets:i,dragSource:this._dragSource,...co(this,t)});r.didDrop=!1,r.dropTarget=void 0,this._basicEventHandler("drop",r),this.fire("drop:after",r)}_onContextMenu(t){let{target:e,subTargets:i}=this.findTarget(t),r=this._basicEventHandler("contextmenu:before",{e:t,target:e,subTargets:i});return this.stopContextMenu&&we(t),this._basicEventHandler("contextmenu",r),!1}_onClick(t){let e=t.detail;e>3||e<2||(this._cacheTransformEventData(t),2==e&&"dblclick"===t.type&&this._handleEvent(t,"dblclick"),3==e&&this._handleEvent(t,"tripleclick"),this._resetTransformEventData())}fireEventFromPointerEvent(t,e,i,r={}){this._cacheTransformEventData(t);let{target:s,subTargets:n}=this.findTarget(t),o={e:t,target:s,subTargets:n,...co(this,t),transform:this._currentTransform,...r};this.fire(e,o),s&&s.fire(i,o);for(let t=0;t<n.length;t++)n[t]!==s&&n[t].fire(i,o);this._resetTransformEventData()}getPointerId(t){let e=t.changedTouches;return e?e[0]&&e[0].identifier:this.enablePointerEvents?t.pointerId:-1}_isMainEvent(t){return!0===t.isPrimary||!1!==t.isPrimary&&("touchend"===t.type&&0===t.touches.length||!t.changedTouches||t.changedTouches[0].identifier===this.mainTouchId)}_onTouchStart(t){this._cacheTransformEventData(t);let e=!this.allowTouchScrolling,i=this._activeObject;void 0===this.mainTouchId&&(this.mainTouchId=this.getPointerId(t)),this.__onMouseDown(t);let{target:r}=this.findTarget(t);(this.isDrawingMode||i&&r===i)&&(e=!0),e&&t.preventDefault();let s=this.upperCanvasEl,n=this._getEventPrefix(),o=ne(s);uo(o,"touchend",this._onTouchEnd,ho),e&&uo(o,"touchmove",this._onMouseMove,ho),go(s,`${n}down`,this._onMouseDown),this._resetTransformEventData()}_onMouseDown(t){this._cacheTransformEventData(t),this.__onMouseDown(t);let e=this.upperCanvasEl,i=this._getEventPrefix();go(e,`${i}move`,this._onMouseMove,ho);let r=ne(e);uo(r,`${i}up`,this._onMouseUp),uo(r,`${i}move`,this._onMouseMove,ho),this._resetTransformEventData()}_onTouchEnd(t){if(t.touches.length>0)return;this._cacheTransformEventData(t),this.__onMouseUp(t),this._resetTransformEventData(),delete this.mainTouchId;let e=this._getEventPrefix(),i=ne(this.upperCanvasEl);go(i,"touchend",this._onTouchEnd,ho),go(i,"touchmove",this._onMouseMove,ho),this._willAddMouseDown&&clearTimeout(this._willAddMouseDown),this._willAddMouseDown=setTimeout(()=>{uo(this.upperCanvasEl,`${e}down`,this._onMouseDown),this._willAddMouseDown=0},400)}_onMouseUp(t){this._cacheTransformEventData(t),this.__onMouseUp(t);let e=this.upperCanvasEl,i=this._getEventPrefix();if(this._isMainEvent(t)){let t=ne(this.upperCanvasEl);go(t,`${i}up`,this._onMouseUp),go(t,`${i}move`,this._onMouseMove,ho),uo(e,`${i}move`,this._onMouseMove,ho)}this._resetTransformEventData()}_onMouseMove(t){this._cacheTransformEventData(t);let e=this.getActiveObject();!this.allowTouchScrolling&&(!e||!e.shouldStartDragging(t))&&t.preventDefault&&t.preventDefault(),this.__onMouseMove(t),this._resetTransformEventData()}_onResize(){this.calcOffset(),this._resetTransformEventData()}_shouldRender(t){let e=this.getActiveObject();return!!e!=!!t||e&&t&&e!==t}__onMouseUp(t){var e;this._handleEvent(t,"up:before");let i=this._currentTransform,r=this._isClick,{target:s}=this.findTarget(t),{button:n}=t;if(n)return void((this.fireMiddleClick&&1===n||this.fireRightClick&&2===n)&&this._handleEvent(t,"up"));if(this.isDrawingMode&&this._isCurrentlyDrawing)return void this._onMouseUpInDrawingMode(t);if(!this._isMainEvent(t))return;let o,a,l=!1;if(i&&(this._finalizeCurrentTransform(t),l=i.actionPerformed),!r){let e=s===this._activeObject;this.handleSelection(t),l||(l=this._shouldRender(s)||!e&&s===this._activeObject)}if(s){let{key:e,control:r}=s.findControl(this.getViewportPoint(t),Ce(t))||{};if(a=e,s.selectable&&s!==this._activeObject&&"up"===s.activeOn)this.setActiveObject(s,t),l=!0;else if(r){let e=r.getMouseUpHandler(t,s,r);e&&(o=this.getScenePoint(t),e.call(r,t,i,o.x,o.y))}s.isMoving=!1}if(i&&(i.target!==s||i.corner!==a)){let e=i.target&&i.target.controls[i.corner],r=e&&e.getMouseUpHandler(t,i.target,e);o=o||this.getScenePoint(t),r&&r.call(e,t,i,o.x,o.y)}this._setCursorFromEvent(t,s),this._handleEvent(t,"up"),this._groupSelector=null,this._currentTransform=null,s&&(s.__corner=void 0),l?this.requestRenderAll():r||null!=(e=this._activeObject)&&e.isEditing||this.renderTop()}_basicEventHandler(t,e){let{target:i,subTargets:r=[]}=e;this.fire(t,e),i&&i.fire(t,e);for(let s=0;s<r.length;s++)r[s]!==i&&r[s].fire(t,e);return e}_handleEvent(t,e,i){let{target:r,subTargets:s}=this.findTarget(t),n={e:t,target:r,subTargets:s,...co(this,t),transform:this._currentTransform,..."down:before"===e||"down"===e?i:{}};"up:before"!==e&&"up"!==e||(n.isClick=this._isClick),this.fire(`mouse:${e}`,n),r&&r.fire(`mouse${e}`,n);for(let t=0;t<s.length;t++)s[t]!==r&&s[t].fire(`mouse${e}`,n)}_onMouseDownInDrawingMode(t){this._isCurrentlyDrawing=!0,this.getActiveObject()&&(this.discardActiveObject(t),this.requestRenderAll());let e=this.getScenePoint(t);this.freeDrawingBrush&&this.freeDrawingBrush.onMouseDown(e,{e:t,pointer:e}),this._handleEvent(t,"down",{alreadySelected:!1})}_onMouseMoveInDrawingMode(t){if(this._isCurrentlyDrawing){let e=this.getScenePoint(t);this.freeDrawingBrush&&this.freeDrawingBrush.onMouseMove(e,{e:t,pointer:e})}this.setCursor(this.freeDrawingCursor),this._handleEvent(t,"move")}_onMouseUpInDrawingMode(t){let e=this.getScenePoint(t);this.freeDrawingBrush?this._isCurrentlyDrawing=!!this.freeDrawingBrush.onMouseUp({e:t,pointer:e}):this._isCurrentlyDrawing=!1,this._handleEvent(t,"up")}__onMouseDown(t){this._isClick=!0,this._handleEvent(t,"down:before");let{target:e}=this.findTarget(t),i=!!e&&e===this._activeObject,{button:r}=t;if(r)return void((this.fireMiddleClick&&1===r||this.fireRightClick&&2===r)&&this._handleEvent(t,"down",{alreadySelected:i}));if(this.isDrawingMode)return void this._onMouseDownInDrawingMode(t);if(!this._isMainEvent(t)||this._currentTransform)return;let s=this._shouldRender(e),n=!1;if(this.handleMultiSelection(t,e)?(e=this._activeObject,n=!0,s=!0):this._shouldClearSelection(t,e)&&this.discardActiveObject(t),this.selection&&(!e||!e.selectable&&!e.isEditing&&e!==this._activeObject)){let e=this.getScenePoint(t);this._groupSelector={x:e.x,y:e.y,deltaY:0,deltaX:0}}if(i=!!e&&e===this._activeObject,e){e.selectable&&"down"===e.activeOn&&this.setActiveObject(e,t);let r=e.findControl(this.getViewportPoint(t),Ce(t));if(e===this._activeObject&&(r||!n)){this._setupCurrentTransform(t,e,i);let s=r?r.control:void 0,n=this.getScenePoint(t),o=s&&s.getMouseDownHandler(t,e,s);o&&o.call(s,t,this._currentTransform,n.x,n.y)}}s&&(this._objectsToRender=void 0),this._handleEvent(t,"down",{alreadySelected:i}),s&&this.requestRenderAll()}_resetTransformEventData(){this._targetInfo=this._viewportPoint=this._scenePoint=void 0}_cacheTransformEventData(t){this._resetTransformEventData(),this._viewportPoint=this.getViewportPoint(t),this._scenePoint=Pe(this._viewportPoint,void 0,this.viewportTransform),this._targetInfo=this.findTarget(t),this._currentTransform&&(this._targetInfo.target=this._currentTransform.target)}__onMouseMove(t){if(this._isClick=!1,this._handleEvent(t,"move:before"),this.isDrawingMode)return void this._onMouseMoveInDrawingMode(t);if(!this._isMainEvent(t))return;let e=this._groupSelector;if(e){let i=this.getScenePoint(t);e.deltaX=i.x-e.x,e.deltaY=i.y-e.y,this.renderTop()}else if(this._currentTransform)this._transformObject(t);else{let{target:e}=this.findTarget(t);this._setCursorFromEvent(t,e),this._fireOverOutEvents(t,e)}this.textEditingManager.onMouseMove(t),this._handleEvent(t,"move")}_fireOverOutEvents(t,e){let{_hoveredTarget:i,_hoveredTargets:r}=this,{subTargets:s,currentTarget:n}=this.findTarget(t),o=Math.max(r.length,s.length);this.fireSyntheticInOutEvents("mouse",{e:t,target:e,oldTarget:i,actualTarget:n,oldActualTarget:this._hoveredActualTarget,fireCanvas:!0});for(let n=0;n<o;n++)s[n]===e||r[n]&&r[n]===i||this.fireSyntheticInOutEvents("mouse",{e:t,target:s[n],oldTarget:r[n]});this._hoveredActualTarget=n,this._hoveredTarget=e,this._hoveredTargets=s}_fireEnterLeaveEvents(t,e,i){let r=this._draggedoverTarget,s=this._hoveredTargets,{subTargets:n}=this.findTarget(t),o=Math.max(s.length,n.length);this.fireSyntheticInOutEvents("drag",{...i,target:e,oldTarget:r,fireCanvas:!0});for(let t=0;t<o;t++)this.fireSyntheticInOutEvents("drag",{...i,target:n[t],oldTarget:s[t]});this._draggedoverTarget=e}fireSyntheticInOutEvents(t,{target:e,oldTarget:i,actualTarget:r,oldActualTarget:s,fireCanvas:n,e:o,...a}){let{targetIn:l,targetOut:h,canvasIn:c,canvasOut:u}=fo[t],d=i!==e,g=s!==r,f=e&&d,p=r&&g,m=i&&d,y=s&&g,b={...a,e:o,...co(this,o)},_={...b,target:i,nextTarget:e,actualTarget:s,nextActualTarget:r};(m||y)&&n&&this.fire(u,_),m&&i.fire(h,_),y&&i!==s&&s.fire(h,_);let v={...b,target:e,previousTarget:i,actualTarget:r,previousActualTarget:s};(f||p)&&n&&this.fire(c,v),f&&e.fire(l,v),p&&r!==e&&r.fire(l,v)}_transformObject(t){let e=this.getScenePoint(t),i=this._currentTransform,r=i.target,s=r.group?Pe(e,void 0,r.group.calcTransformMatrix()):e;i.shiftKey=t.shiftKey,i.altKey=!!this.centeredKey&&t[this.centeredKey],this._performTransformAction(t,i,s),i.actionPerformed&&this.requestRenderAll()}_performTransformAction(t,e,i){let{action:r,actionHandler:s,target:n}=e,o=!!s&&s(t,e,i.x,i.y);o&&n.setCoords(),"drag"===r&&o&&(e.target.isMoving=!0,this.setCursor(e.target.moveCursor||this.moveCursor)),e.actionPerformed=e.actionPerformed||o}_setCursorFromEvent(t,e){if(!e)return void this.setCursor(this.defaultCursor);let i=e.hoverCursor||this.hoverCursor,r=re(this._activeObject)?this._activeObject:null,s=(!r||e.group!==r)&&e.findControl(this.getViewportPoint(t));if(s){let{control:i,coord:r}=s;this.setCursor(i.cursorStyleHandler(t,i,e,r))}else{if(e.subTargetCheck){let{subTargets:e}=this.findTarget(t);e.concat().reverse().forEach(t=>{i=t.hoverCursor||i})}this.setCursor(i)}}handleMultiSelection(t,e){let i=this._activeObject,r=re(i);if(i&&this._isSelectionKeyPressed(t)&&this.selection&&e&&e.selectable&&(i!==e||r)&&(r||!e.isDescendantOf(i)&&!i.isDescendantOf(e))&&!e.onSelect({e:t})&&!i.getActiveControl()){if(r){let r=i.getObjects(),s=[];if(e===i){let i=this.getScenePoint(t),n=this.searchPossibleTargets(r,i);if(n.target?(e=n.target,s=n.subTargets):(n=this.searchPossibleTargets(this._objects,i),e=n.target,s=n.subTargets),!e||!e.selectable)return!1}e.group===i?(i.remove(e),this._hoveredTarget=e,this._hoveredTargets=s,1===i.size()&&this._setActiveObject(i.item(0),t)):(i.multiSelectAdd(e),this._hoveredTarget=i,this._hoveredTargets=s),this._fireSelectionEvents(r,t)}else{i.isEditing&&i.exitEditing();let r=new(at.getClass("ActiveSelection"))([],{canvas:this});r.multiSelectAdd(i,e),this._hoveredTarget=r,this._setActiveObject(r,t),this._fireSelectionEvents([i],t)}return!0}return!1}handleSelection(t){if(!this.selection||!this._groupSelector)return!1;let{x:e,y:i,deltaX:r,deltaY:s}=this._groupSelector,n=new gt(e,i),o=n.add(new gt(r,s)),a=n.min(o),l=n.max(o).subtract(a),h=this.collectObjects({left:a.x,top:a.y,width:l.x,height:l.y},{includeIntersecting:!this.selectionFullyContained}),c=n.eq(o)?h[0]?[h[0]]:[]:h.length>1?h.filter(e=>!e.onSelect({e:t})).reverse():h;if(1===c.length)this.setActiveObject(c[0],t);else if(c.length>1){let e=at.getClass("ActiveSelection");this.setActiveObject(new e(c,{canvas:this}),t)}return this._groupSelector=null,!0}toCanvasElement(t=1,e){let{upper:i}=this.elements;i.ctx=void 0;let r=super.toCanvasElement(t,e);return i.ctx=i.el.getContext("2d"),r}clear(){this.textEditingManager.clear(),super.clear()}destroy(){this.removeListeners(),this.textEditingManager.dispose(),super.destroy()}};const mo={x1:0,y1:0,x2:0,y2:0},yo={...mo,r1:0,r2:0},bo=(t,e)=>isNaN(t)&&"number"==typeof e?e:t;function _o(t){return t&&/%$/.test(t)&&Number.isFinite(parseFloat(t))}function vo(t,e){return Bi(0,bo("number"==typeof t?t:"string"==typeof t?parseFloat(t)/(_o(t)?100:1):NaN,e),1)}const xo=/\s*;\s*/,Co=/\s*:\s*/;function wo(t,e){let i,r,s=t.getAttribute("style");if(s){let t=s.split(xo);""===t[t.length-1]&&t.pop();for(let e=t.length;e--;){let[s,n]=t[e].split(Co).map(t=>t.trim());"stop-color"===s?i=n:"stop-opacity"===s&&(r=n)}}i=i||t.getAttribute("stop-color")||"rgb(0,0,0)",r=bo(parseFloat(r||t.getAttribute("stop-opacity")||""),1);let n=new gi(i);return n.setAlpha(n.getAlpha()*r*e),{offset:vo(t.getAttribute("offset"),0),color:n.toRgba()}}function So(t,e){let i=[],r=t.getElementsByTagName("stop"),s=vo(e,1);for(let t=r.length;t--;)i.push(wo(r[t],s));return i}function To(t){return"linearGradient"===t.nodeName||"LINEARGRADIENT"===t.nodeName?"linear":"radial"}function Oo(t){return"userSpaceOnUse"===t.getAttribute("gradientUnits")?"pixels":"percentage"}function ko(t,e){return t.getAttribute(e)}function Do(t,e){return function(t,{width:e,height:i,gradientUnits:r}){let s;return Object.entries(t).reduce((t,[n,o])=>{if("Infinity"===o)s=1;else if("-Infinity"===o)s=0;else{let t="string"==typeof o;s=t?parseFloat(o):o,t&&_o(o)&&(s*=.01,"pixels"===r&&("x1"!==n&&"x2"!==n&&"r2"!==n||(s*=e),"y1"!==n&&"y2"!==n||(s*=i)))}return t[n]=s,t},{})}("linear"===To(t)?function(t){return{x1:ko(t,"x1")||0,y1:ko(t,"y1")||0,x2:ko(t,"x2")||"100%",y2:ko(t,"y2")||0}}(t):function(t){return{x1:ko(t,"fx")||ko(t,"cx")||"50%",y1:ko(t,"fy")||ko(t,"cy")||"50%",r1:0,x2:ko(t,"cx")||"50%",y2:ko(t,"cy")||"50%",r2:ko(t,"r")||"50%"}}(t),{...e,gradientUnits:Oo(t)})}var Mo=class{constructor(t){let{type:e="linear",gradientUnits:i="pixels",coords:r={},colorStops:s=[],offsetX:n=0,offsetY:o=0,gradientTransform:a,id:l}=t||{};Object.assign(this,{type:e,gradientUnits:i,coords:{..."radial"===e?yo:mo,...r},colorStops:s,offsetX:n,offsetY:o,gradientTransform:a,id:l?`${l}_${xt()}`:xt()})}addColorStop(t){for(let e in t)this.colorStops.push({offset:parseFloat(e),color:t[e]});return this}toObject(t){return{...Kt(this,t),type:this.type,coords:{...this.coords},colorStops:this.colorStops.map(t=>({...t})),offsetX:this.offsetX,offsetY:this.offsetY,gradientUnits:this.gradientUnits,gradientTransform:this.gradientTransform?[...this.gradientTransform]:void 0}}toSVG(t,{additionalTransform:e}={}){let i=[],r=this.gradientTransform?this.gradientTransform.concat():I.concat(),s="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox",n=this.colorStops.map(t=>({...t})).sort((t,e)=>t.offset-e.offset),o=-this.offsetX,a=-this.offsetY;var l;"objectBoundingBox"===s?(o/=t.width,a/=t.height):(o+=t.width/2,a+=t.height/2),(l=t)&&"function"==typeof l._renderPathCommands&&"percentage"!==this.gradientUnits&&(o-=t.pathOffset.x,a-=t.pathOffset.y),r[4]-=o,r[5]-=a;let h=[`id="SVGID_${fe(String(this.id))}"`,`gradientUnits="${s}"`,`gradientTransform="${e?e+" ":""}${Zt(r)}"`,""].join(" "),c=t=>parseFloat(String(t));if("linear"===this.type){let{x1:t,y1:e,x2:r,y2:s}=this.coords,n=c(t),o=c(e),a=c(r),l=c(s);i.push("<linearGradient ",h,' x1="',n,'" y1="',o,'" x2="',a,'" y2="',l,'">\n')}else if("radial"===this.type){let{x1:t,y1:e,x2:r,y2:s,r1:o,r2:a}=this.coords,l=c(t),u=c(e),d=c(r),g=c(s),f=c(o),p=c(a),m=f>p;i.push("<radialGradient ",h,' cx="',m?l:d,'" cy="',m?u:g,'" r="',m?f:p,'" fx="',m?d:l,'" fy="',m?g:u,'">\n'),m&&(n.reverse(),n.forEach(t=>{t.offset=1-t.offset}));let y=Math.min(f,p);if(y>0){let t=y/Math.max(f,p);n.forEach(e=>{e.offset+=t*(1-e.offset)})}}return n.forEach(({color:t,offset:e})=>{let r=String(t),s=ri(r)?r:new gi(r).toRgba();i.push(`<stop offset="${100*e}%" style="stop-color:${fe(s)};"/>\n`)}),i.push("linear"===this.type?"</linearGradient>":"</radialGradient>","\n"),i.join("")}toLive(t){let{x1:e,y1:i,x2:r,y2:s,r1:n,r2:o}=this.coords,a="linear"===this.type?t.createLinearGradient(e,i,r,s):t.createRadialGradient(e,i,n,r,s,o);return this.colorStops.forEach(({color:t,offset:e})=>{a.addColorStop(e,t)}),a}static async fromObject(t){let{colorStops:e,gradientTransform:i}=t;return new this({...t,colorStops:e?e.map(t=>({...t})):void 0,gradientTransform:i?[...i]:void 0})}static fromElement(t,e,i){let r=Oo(t),s=e._findCenterFromElement();return new this({id:t.getAttribute("id")||void 0,type:To(t),coords:Do(t,{width:i.viewBoxWidth||i.width,height:i.viewBoxHeight||i.height}),colorStops:So(t,i.opacity),gradientUnits:r,gradientTransform:Hs(t.getAttribute("gradientTransform")||""),..."pixels"===r?{offsetX:e.width/2-s.x,offsetY:e.height/2-s.y}:{offsetX:0,offsetY:0}})}};p(Mo,"type","Gradient"),at.setClass(Mo,"gradient"),at.setClass(Mo,"linear"),at.setClass(Mo,"radial");var jo=class{get type(){return"pattern"}set type(t){b("warn","Setting type has no effect",t)}constructor(t){p(this,"repeat","repeat"),p(this,"offsetX",0),p(this,"offsetY",0),p(this,"crossOrigin",""),this.id=xt(),Object.assign(this,t)}isImageSource(){return!!this.source&&"string"==typeof this.source.src}isCanvasSource(){return!!this.source&&!!this.source.toDataURL}sourceToString(){return this.isImageSource()?this.source.src:this.isCanvasSource()?this.source.toDataURL():""}toLive(t){return this.source&&(!this.isImageSource()||this.source.complete&&0!==this.source.naturalWidth&&0!==this.source.naturalHeight)?t.createPattern(this.source,this.repeat):null}toObject(t=[]){let{repeat:e,crossOrigin:i}=this;return{...Kt(this,t),type:"pattern",source:this.sourceToString(),repeat:e,crossOrigin:i,offsetX:Qt(this.offsetX,y.NUM_FRACTION_DIGITS),offsetY:Qt(this.offsetY,y.NUM_FRACTION_DIGITS),patternTransform:this.patternTransform?[...this.patternTransform]:null}}toSVG({width:t,height:e}){let{source:i,repeat:r,id:s}=this,n=bo(this.offsetX/t,0),o=bo(this.offsetY/e,0),a="repeat-y"===r||"no-repeat"===r?1+Math.abs(n||0):bo(i.width/t,0),l="repeat-x"===r||"no-repeat"===r?1+Math.abs(o||0):bo(i.height/e,0);return[`<pattern id="SVGID_${fe(s)}" x="${n}" y="${o}" width="${a}" height="${l}">`,`<image x="0" y="0" width="${i.width}" height="${i.height}" xlink:href="${fe(this.sourceToString())}"></image>`,"</pattern>",""].join("\n")}static async fromObject({type:t,source:e,patternTransform:i,...r},s){let n=await Gt(e,{...s,crossOrigin:r.crossOrigin});return new this({...r,patternTransform:i&&i.slice(0),source:n})}};p(jo,"type","Pattern"),at.setClass(jo),at.setClass(jo,"pattern");var Eo=class t extends ys{constructor(e,{path:i,left:r,top:s,...n}={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(n),this._setPath(e||[],!0),"number"==typeof r&&this.set("left",r),"number"==typeof s&&this.set("top",s)}_setPath(t,e){this.path=xn(Array.isArray(t)?t:Rn(t)),this.setBoundingBox(e)}_findCenterFromElement(){let t=this._calcBoundsFromPath();return new gt(t.left+t.width/2,t.top+t.height/2)}_renderPathCommands(t){let e=-this.pathOffset.x,i=-this.pathOffset.y;t.beginPath();for(let r of this.path)switch(r[0]){case"L":t.lineTo(r[1]+e,r[2]+i);break;case"M":t.moveTo(r[1]+e,r[2]+i);break;case"C":t.bezierCurveTo(r[1]+e,r[2]+i,r[3]+e,r[4]+i,r[5]+e,r[6]+i);break;case"Q":t.quadraticCurveTo(r[1]+e,r[2]+i,r[3]+e,r[4]+i);break;case"Z":t.closePath()}}_render(t){this._renderPathCommands(t),this._renderPaintInOrder(t)}toString(){return`#<Path (${this.complexity()}): { "top": ${this.top}, "left": ${this.left} }>`}toObject(t=[]){return{...super.toObject(t),path:this.path.map(t=>t.slice())}}toDatalessObject(t=[]){let e=this.toObject(t);return this.sourcePath&&(delete e.path,e.sourcePath=this.sourcePath),e}_toSVG(){return["<path ","COMMON_PARTS",`d="${Yn(this.path,y.NUM_FRACTION_DIGITS)}" stroke-linecap="round" />\n`]}_getOffsetTransform(){let t=y.NUM_FRACTION_DIGITS;return` translate(${Qt(-this.pathOffset.x,t)}, ${Qt(-this.pathOffset.y,t)})`}toClipPathSVG(t){let e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}toSVG(t){let e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}complexity(){return this.path.length}setDimensions(){this.setBoundingBox()}setBoundingBox(t){let{width:e,height:i,pathOffset:r}=this._calcDimensions();this.set({width:e,height:i,pathOffset:r}),t&&this.setPositionByOrigin(r,"center","center")}_calcBoundsFromPath(){let t=[],e=0,i=0,r=0,s=0;for(let n of this.path)switch(n[0]){case"L":r=n[1],s=n[2],t.push({x:e,y:i},{x:r,y:s});break;case"M":r=n[1],s=n[2],e=r,i=s;break;case"C":t.push(...bn(r,s,n[1],n[2],n[3],n[4],n[5],n[6])),r=n[5],s=n[6];break;case"Q":t.push(...bn(r,s,n[1],n[2],n[1],n[2],n[3],n[4])),r=n[3],s=n[4];break;case"Z":r=e,s=i}return Se(t)}_calcDimensions(){let t=this._calcBoundsFromPath();return{...t,pathOffset:new gt(t.left+t.width/2,t.top+t.height/2)}}static fromObject(t){return this._fromObject(t,{extraParam:"path"})}static async fromElement(t,e,i){let{d:r,...s}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this(r,{...s,...e,left:void 0,top:void 0})}};p(Eo,"type","Path"),p(Eo,"cacheProperties",[...Xi,"path","fillRule"]),p(Eo,"ATTRIBUTE_NAMES",[...Ds,"d"]),at.setClass(Eo),at.setSVGClass(Eo);const Po=["radius","startAngle","endAngle","counterClockwise"];var Ao=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_set(t,e){return super._set(t,e),"radius"===t&&this.setRadius(e),this}_render(t){t.beginPath(),t.arc(0,0,this.radius,Dt(this.startAngle),Dt(this.endAngle),this.counterClockwise),this._renderPaintInOrder(t)}getRadiusX(){return this.get("radius")*this.get(Q)}getRadiusY(){return this.get("radius")*this.get(Z)}setRadius(t){this.radius=t,this.set({width:2*t,height:2*t})}toObject(t=[]){return super.toObject([...Po,...t])}_toSVG(){let{radius:t,startAngle:e,endAngle:i}=this,r=(i-e)%360;if(0===r)return["<circle ","COMMON_PARTS",'cx="0" cy="0" ','r="',`${fe(t)}`,'" />\n'];{let s=Dt(e),n=Dt(i),o=ut(s)*t,a=dt(s)*t,l=ut(n)*t,h=dt(n)*t;return[`<path d="M ${o} ${a} A ${t} ${t} 0 ${+(r>180)} ${+!this.counterClockwise} ${l} ${h}" `,"COMMON_PARTS"," />\n"]}}static async fromElement(t,e,i){let{left:r=0,top:s=0,radius:n=0,...o}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this({...o,radius:n,left:r-n,top:s-n})}static fromObject(t){return super._fromObject(t)}};p(Ao,"type","Circle"),p(Ao,"cacheProperties",[...Xi,...Po]),p(Ao,"ownDefaults",{radius:0,startAngle:0,endAngle:360,counterClockwise:!1}),p(Ao,"ATTRIBUTE_NAMES",["cx","cy","r",...Ds]),at.setClass(Ao),at.setSVGClass(Ao);const Fo=["x1","x2","y1","y2"];var Lo=class t extends ys{constructor([e,i,r,s]=[0,0,0,0],n={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(n),this.x1=e,this.x2=r,this.y1=i,this.y2=s,this._setWidthHeight();let{left:o,top:a}=n;"number"==typeof o&&this.set("left",o),"number"==typeof a&&this.set("top",a)}_setWidthHeight(){let{x1:t,y1:e,x2:i,y2:r}=this;this.width=Math.abs(i-t),this.height=Math.abs(r-e);let{left:s,top:n,width:o,height:a}=Se([{x:t,y:e},{x:i,y:r}]),l=new gt(s+o/2,n+a/2);this.setPositionByOrigin(l,R,R)}_set(t,e){return super._set(t,e),Fo.includes(t)&&this._setWidthHeight(),this}_render(t){t.beginPath();let e=this.calcLinePoints();t.moveTo(e.x1,e.y1),t.lineTo(e.x2,e.y2),t.lineWidth=this.strokeWidth;let i=t.strokeStyle;var r;te(this.stroke)?t.strokeStyle=this.stroke.toLive(t):t.strokeStyle=null==(r=this.stroke)?t.fillStyle:r,this.stroke&&this._renderStroke(t),t.strokeStyle=i}_findCenterFromElement(){return new gt((this.x1+this.x2)/2,(this.y1+this.y2)/2)}toObject(t=[]){return{...super.toObject(t),...this.calcLinePoints()}}_getNonTransformedDimensions(){let t=super._getNonTransformedDimensions();return"butt"===this.strokeLineCap&&(0===this.width&&(t.y-=this.strokeWidth),0===this.height&&(t.x-=this.strokeWidth)),t}calcLinePoints(){let{x1:t,x2:e,y1:i,y2:r,width:s,height:n}=this,o=t<=e?-.5:.5,a=i<=r?-.5:.5;return{x1:o*s,x2:o*-s,y1:a*n,y2:a*-n}}_toSVG(){let{x1:t,x2:e,y1:i,y2:r}=this.calcLinePoints();return["<line ","COMMON_PARTS",`x1="${t}" y1="${i}" x2="${e}" y2="${r}" />\n`]}static async fromElement(t,e,i){let{x1:r=0,y1:s=0,x2:n=0,y2:o=0,...a}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this([r,s,n,o],a)}static fromObject({x1:t,y1:e,x2:i,y2:r,...s}){return this._fromObject({...s,points:[t,e,i,r]},{extraParam:"points"})}};p(Lo,"type","Line"),p(Lo,"cacheProperties",[...Xi,...Fo]),p(Lo,"ATTRIBUTE_NAMES",Ds.concat(Fo)),at.setClass(Lo),at.setSVGClass(Lo);var Io=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_render(t){let e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderPaintInOrder(t)}_toSVG(){let t=this.width/2,e=this.height/2;return["<polygon ","COMMON_PARTS",'points="',`${-t} ${e},0 ${-e},${t} ${e}`,'" />']}};p(Io,"type","Triangle"),p(Io,"ownDefaults",{width:100,height:100}),at.setClass(Io),at.setSVGClass(Io);const Ro=["rx","ry"];var Bo=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_set(t,e){switch(super._set(t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this}getRx(){return this.get("rx")*this.get(Q)}getRy(){return this.get("ry")*this.get(Z)}toObject(t=[]){return super.toObject([...Ro,...t])}_toSVG(){return["<ellipse ","COMMON_PARTS",`cx="0" cy="0" rx="${fe(this.rx)}" ry="${fe(this.ry)}" />\n`]}_render(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,F,!1),t.restore(),this._renderPaintInOrder(t)}static async fromElement(t,e,i){let r=Ks(t,this.ATTRIBUTE_NAMES,i);return r.left=(r.left||0)-r.rx,r.top=(r.top||0)-r.ry,new this(r)}};p(Bo,"type","Ellipse"),p(Bo,"cacheProperties",[...Xi,...Ro]),p(Bo,"ownDefaults",{rx:0,ry:0}),p(Bo,"ATTRIBUTE_NAMES",[...Ds,"cx","cy","rx","ry"]),at.setClass(Bo),at.setSVGClass(Bo);const $o={exactBoundingBox:!1};var Xo=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),p(this,"strokeDiff",void 0),Object.assign(this,t.ownDefaults),this.setOptions(i),this.points=e;let{left:r,top:s}=i;this.initialized=!0,this.setBoundingBox(!0),"number"==typeof r&&this.set("left",r),"number"==typeof s&&this.set("top",s)}isOpen(){return!0}_projectStrokeOnPoints(t){return ws(this.points,t,this.isOpen())}_calcDimensions(t){t={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:this.strokeMiterLimit,strokeUniform:this.strokeUniform,strokeWidth:this.strokeWidth,...t||{}};let e=this.exactBoundingBox?this._projectStrokeOnPoints(t).map(t=>t.projectedPoint):this.points;if(0===e.length)return{left:0,top:0,width:0,height:0,pathOffset:new gt,strokeOffset:new gt,strokeDiff:new gt};let i=Se(e),r=zt({...t,scaleX:1,scaleY:1}),s=Se(this.points.map(t=>Et(t,r,!0))),n=new gt(this.scaleX,this.scaleY),o=i.left+i.width/2,a=i.top+i.height/2;return this.exactBoundingBox&&(o-=a*Math.tan(Dt(this.skewX)),a-=o*Math.tan(Dt(this.skewY))),{...i,pathOffset:new gt(o,a),strokeOffset:new gt(s.left,s.top).subtract(new gt(i.left,i.top)).multiply(n),strokeDiff:new gt(i.width,i.height).subtract(new gt(s.width,s.height)).multiply(n)}}_findCenterFromElement(){let t=Se(this.points);return new gt(t.left+t.width/2,t.top+t.height/2)}setDimensions(){this.setBoundingBox()}setBoundingBox(t){let{left:e,top:i,width:r,height:s,pathOffset:n,strokeOffset:o,strokeDiff:a}=this._calcDimensions();this.set({width:r,height:s,pathOffset:n,strokeOffset:o,strokeDiff:a}),t&&this.setPositionByOrigin(new gt(e+r/2,i+s/2),"center","center")}isStrokeAccountedForInDimensions(){return this.exactBoundingBox}_getNonTransformedDimensions(){return this.exactBoundingBox?new gt(this.width,this.height):super._getNonTransformedDimensions()}_getTransformedDimensions(t={}){if(this.exactBoundingBox){let n;if(Object.keys(t).some(t=>this.strokeUniform||this.constructor.layoutProperties.includes(t))){var e,i;let{width:r,height:s}=this._calcDimensions(t);n=new gt(null==(e=t.width)?r:e,null==(i=t.height)?s:i)}else{var r,s;n=new gt(null==(r=t.width)?this.width:r,null==(s=t.height)?this.height:s)}return n.multiply(new gt(t.scaleX||this.scaleX,t.scaleY||this.scaleY))}return super._getTransformedDimensions(t)}_set(t,e){let i=this.initialized&&this[t]!==e,r=super._set(t,e);return this.exactBoundingBox&&i&&(("scaleX"===t||"scaleY"===t)&&this.strokeUniform&&this.constructor.layoutProperties.includes("strokeUniform")||this.constructor.layoutProperties.includes(t))&&this.setDimensions(),r}toObject(t=[]){return{...super.toObject(t),points:this.points.map(({x:t,y:e})=>({x:t,y:e}))}}_toSVG(){let t=this.pathOffset.x,e=this.pathOffset.y,i=y.NUM_FRACTION_DIGITS,r=this.points.map(({x:r,y:s})=>`${Qt(r-t,i)},${Qt(s-e,i)}`).join(" ");return[`<${fe(this.constructor.type).toLowerCase()} `,"COMMON_PARTS",`points="${r}" />\n`]}_render(t){let e=this.points.length,i=this.pathOffset.x,r=this.pathOffset.y;if(e&&!isNaN(this.points[e-1].y)){t.beginPath(),t.moveTo(this.points[0].x-i,this.points[0].y-r);for(let s=0;s<e;s++){let e=this.points[s];t.lineTo(e.x-i,e.y-r)}!this.isOpen()&&t.closePath(),this._renderPaintInOrder(t)}}complexity(){return this.points.length}static async fromElement(t,e,i){let r=function(t){if(!t)return[];let e=t.replace(/,/g," ").trim().split(/\s+/),i=[];for(let t=0;t<e.length;t+=2)i.push({x:parseFloat(e[t]),y:parseFloat(e[t+1])});return i}(t.getAttribute("points")),{left:s,top:n,...o}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this(r,{...o,...e})}static fromObject(t){return this._fromObject(t,{extraParam:"points"})}};p(Xo,"ownDefaults",$o),p(Xo,"type","Polyline"),p(Xo,"layoutProperties",[tt,et,"strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeWidth","strokeUniform","points"]),p(Xo,"cacheProperties",[...Xi,"points"]),p(Xo,"ATTRIBUTE_NAMES",[...Ds]),at.setClass(Xo),at.setSVGClass(Xo);var Yo=class extends Xo{isOpen(){return!1}};p(Yo,"ownDefaults",$o),p(Yo,"type","Polygon"),at.setClass(Yo),at.setSVGClass(Yo);var Wo=class extends ys{isEmptyStyles(t){if(!this.styles||void 0!==t&&!this.styles[t])return!0;let e=void 0===t?this.styles:{line:this.styles[t]};for(let t in e)for(let i in e[t])for(let r in e[t][i])return!1;return!0}styleHas(t,e){if(!this.styles||void 0!==e&&!this.styles[e])return!1;let i=void 0===e?this.styles:{0:this.styles[e]};for(let e in i)for(let r in i[e])if(void 0!==i[e][r][t])return!0;return!1}cleanStyle(t){if(!this.styles)return!1;let e,i,r=this.styles,s=0,n=!0,o=0;for(let o in r){e=0;for(let a in r[o]){let l=r[o][a]||{};s++,void 0===l[t]?n=!1:(i?l[t]!==i&&(n=!1):i=l[t],l[t]===this[t]&&delete l[t]),0===Object.keys(l).length?delete r[o][a]:e++}0===e&&delete r[o]}for(let t=0;t<this._textLines.length;t++)o+=this._textLines[t].length;n&&s===o&&(this[t]=i,this.removeStyle(t))}removeStyle(t){if(!this.styles)return;let e,i,r,s=this.styles;for(i in s){for(r in e=s[i],e)delete e[r][t],0===Object.keys(e[r]).length&&delete e[r];0===Object.keys(e).length&&delete s[i]}}_extendStyles(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t);this._getLineStyle(i)||this._setLineStyle(i);let s=Jt({...this._getStyleDeclaration(i,r),...e},t=>void 0!==t);this._setStyleDeclaration(i,r,s)}getSelectionStyles(t,e,i){let r=[];for(let s=t;s<(e||t);s++)r.push(this.getStyleAtPosition(s,i));return r}getStyleAtPosition(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t);return e?this.getCompleteStyleDeclaration(i,r):this._getStyleDeclaration(i,r)}setSelectionStyles(t,e,i){for(let r=e;r<(i||e);r++)this._extendStyles(r,t);this._forceClearCache=!0}_getStyleDeclaration(t,e){var i;let r=this.styles&&this.styles[t];return r&&null!=(i=r[e])?i:{}}getCompleteStyleDeclaration(t,e){return{...Kt(this,this.constructor._styleProperties),...this._getStyleDeclaration(t,e)}}_setStyleDeclaration(t,e,i){this.styles[t][e]=i}_deleteStyleDeclaration(t,e){delete this.styles[t][e]}_getLineStyle(t){return!!this.styles[t]}_setLineStyle(t){this.styles[t]={}}_deleteLineStyle(t){delete this.styles[t]}};p(Wo,"_styleProperties",Ti);const No=/  +/g,Vo=/"/g;function zo(t,e,i,r,s){return`\t\t${((t,{left:e,top:i,width:r,height:s},n=y.NUM_FRACTION_DIGITS)=>{let o=yi(it,t,!1),[a,l,h,c]=[e,i,r,s].map(t=>Qt(t,n));return`<rect ${o} x="${a}" y="${l}" width="${h}" height="${c}"></rect>`})(t,{left:e,top:i,width:r,height:s})}\n`}let Ho;var Go=class t extends Wo{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(),p(this,"__charBounds",[]),Object.assign(this,t.ownDefaults),this.setOptions(i),this.styles||(this.styles={}),this.text=e,this.initialized=!0,this.path&&this.setPathInfo(),this.initDimensions(),this.setCoords()}setPathInfo(){let t=this.path;t&&(t.segmentsInfo=En(t.path))}_splitText(){let t=this._splitTextIntoLines(this.text);return this.textLines=t.lines,this._textLines=t.graphemeLines,this._unwrappedTextLines=t._unwrappedLines,this._text=t.graphemeText,t}initDimensions(){this._splitText(),this._clearCache(),this.dirty=!0,this.path?(this.width=this.path.width,this.height=this.path.height):(this.width=this.calcTextWidth()||this.cursorWidth||this.MIN_TEXT_WIDTH,this.height=this.calcTextHeight()),this.textAlign.includes("justify")&&this.enlargeSpaces()}enlargeSpaces(){let t,e,i,r,s,n,o;for(let a=0,l=this._textLines.length;a<l;a++)if(("justify"===this.textAlign||a!==l-1&&!this.isEndOfWrapping(a))&&(r=0,s=this._textLines[a],e=this.getLineWidth(a),e<this.width&&(o=this.textLines[a].match(this._reSpacesAndTabs)))){i=o.length,t=(this.width-e)/i;for(let e=0;e<=s.length;e++)n=this.__charBounds[a][e],this._reSpaceAndTab.test(s[e])?(n.width+=t,n.kernedWidth+=t,n.left+=r,r+=t):n.left+=r}}isEndOfWrapping(t){return t===this._textLines.length-1}missingNewlineOffset(t){return 1}get2DCursorLocation(t,e){let i,r=e?this._unwrappedTextLines:this._textLines;for(i=0;i<r.length;i++){if(t<=r[i].length)return{lineIndex:i,charIndex:t};t-=r[i].length+this.missingNewlineOffset(i,e)}return{lineIndex:i-1,charIndex:r[i-1].length<t?r[i-1].length:t}}toString(){return`#<Text (${this.complexity()}): { "text": "${this.text}", "fontFamily": "${this.fontFamily}" }>`}_getCacheCanvasDimensions(){let t=super._getCacheCanvasDimensions(),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t}_render(t){let e=this.path;e&&!e.isNotVisible()&&e._render(t),this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")}_renderText(t){"stroke"===this.paintFirst?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))}_setTextStyles(t,e,i){if(t.textBaseline="alphabetic",this.path)switch(this.pathAlign){case R:t.textBaseline="middle";break;case"ascender":t.textBaseline="top";break;case"descender":t.textBaseline=$}t.font=this._getFontDeclaration(e,i)}calcTextWidth(){let t=this.getLineWidth(0);for(let e=1,i=this._textLines.length;e<i;e++){let i=this.getLineWidth(e);i>t&&(t=i)}return t}_renderTextLine(t,e,i,r,s,n){this._renderChars(t,e,i,r,s,n)}_renderTextLinesBackground(t){if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor"))return;let e=t.fillStyle,i=this._getLeftOffset(),r=this._getTopOffset();for(let e=0,s=this._textLines.length;e<s;e++){let s=this.getHeightOfLine(e);if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor",e)){r+=s;continue}let n,o,a=this._textLines[e].length,l=this._getLineLeftOffset(e),h=0,c=0,u=this.getValueOfPropertyAt(e,0,"textBackgroundColor"),d=this.getHeightOfLineImpl(e);for(let s=0;s<a;s++){let a=this.__charBounds[e][s];o=this.getValueOfPropertyAt(e,s,"textBackgroundColor"),this.path?(t.save(),t.translate(a.renderLeft,a.renderTop),t.rotate(a.angle),t.fillStyle=o,o&&t.fillRect(-a.width/2,-d*(1-this._fontSizeFraction),a.width,d),t.restore()):o===u?h+=a.kernedWidth:(n=i+l+c,"rtl"===this.direction&&(n=this.width-n-h),t.fillStyle=u,u&&t.fillRect(n,r,h,d),c=a.left,h=a.width,u=o)}o&&!this.path&&(n=i+l+c,"rtl"===this.direction&&(n=this.width-n-h),t.fillStyle=o,t.fillRect(n,r,h,d)),r+=s}t.fillStyle=e,this._removeShadow(t)}_measureChar(t,e,i,r){let s,n,o,a,l=M.getFontCache(e),h=this._getFontDeclaration(e),c=i?i+t:t,u=i&&h===this._getFontDeclaration(r),d=e.fontSize/this.CACHE_FONT_SIZE;if(i&&l.has(i)&&(o=l.get(i)),l.has(t)&&(a=s=l.get(t)),u&&l.has(c)&&(n=l.get(c),a=n-o),void 0===s||void 0===o||void 0===n){let r=(Ho||(Ho=Tt({width:0,height:0}).getContext("2d")),Ho);this._setTextStyles(r,e,!0),void 0===s&&(a=s=r.measureText(t).width,l.set(t,s)),void 0===o&&u&&i&&(o=r.measureText(i).width,l.set(i,o)),u&&void 0===n&&(n=r.measureText(c).width,l.set(c,n),a=n-o)}return{width:s*d,kernedWidth:a*d}}getHeightOfChar(t,e){return this.getValueOfPropertyAt(t,e,"fontSize")}measureLine(t){let e=this._measureLine(t);return 0!==this.charSpacing&&(e.width-=this._getWidthOfCharSpacing()),e.width<0&&(e.width=0),e}_measureLine(t){let e,i,r=0,s=this.pathSide===X,n=this.path,o=this._textLines[t],a=o.length,l=Array(a);this.__charBounds[t]=l;for(let s=0;s<a;s++){let n=o[s];i=this._getGraphemeBox(n,t,s,e),l[s]=i,r+=i.kernedWidth,e=n}if(l[a]={left:i?i.left+i.width:0,width:0,kernedWidth:0,height:this.fontSize,deltaY:0},n&&n.segmentsInfo){let t=0,e=n.segmentsInfo[n.segmentsInfo.length-1].length;switch(this.textAlign){case B:t=s?e-r:0;break;case R:t=(e-r)/2;break;case X:t=s?0:e-r}t+=this.pathStartOffset*(s?-1:1);for(let r=s?a-1:0;s?r>=0:r<a;s?r--:r++)i=l[r],t>e?t%=e:t<0&&(t+=e),this._setGraphemeOnPath(t,i),t+=i.kernedWidth}return{width:r,numOfSpaces:0}}_setGraphemeOnPath(t,e){let i=t+e.kernedWidth/2,r=this.path,s=Pn(r.path,i,r.segmentsInfo);e.renderLeft=s.x-r.pathOffset.x,e.renderTop=s.y-r.pathOffset.y,e.angle=s.angle+("right"===this.pathSide?Math.PI:0)}_getGraphemeBox(t,e,i,r,s){let n,o=this.getCompleteStyleDeclaration(e,i),a=r?this.getCompleteStyleDeclaration(e,i-1):{},l=this._measureChar(t,o,r,a),h=l.kernedWidth,c=l.width;0!==this.charSpacing&&(n=this._getWidthOfCharSpacing(),c+=n,h+=n);let u={width:c,left:0,height:o.fontSize,kernedWidth:h,deltaY:o.deltaY};if(i>0&&!s){let t=this.__charBounds[e][i-1];u.left=t.left+t.width+l.kernedWidth-l.width}return u}getHeightOfLineImpl(t){let e=this.__lineHeights;if(e[t])return e[t];let i=this.getHeightOfChar(t,0);for(let e=1,r=this._textLines[t].length;e<r;e++)i=Math.max(this.getHeightOfChar(t,e),i);return e[t]=i*this._fontSizeMult}getHeightOfLine(t){return this.getHeightOfLineImpl(t)*this.lineHeight}calcTextHeight(){let t=0;for(let e=0,i=this._textLines.length;e<i;e++)t+=e===i-1?this.getHeightOfLineImpl(e):this.getHeightOfLine(e);return t}_getLeftOffset(){return"ltr"===this.direction?-this.width/2:this.width/2}_getTopOffset(){return-this.height/2}_renderTextCommon(t,e){t.save();let i=0,r=this._getLeftOffset(),s=this._getTopOffset();for(let n=0,o=this._textLines.length;n<o;n++)this._renderTextLine(e,t,this._textLines[n],r+this._getLineLeftOffset(n),s+i+this.getHeightOfLineImpl(n),n),i+=this.getHeightOfLine(n);t.restore()}_renderTextFill(t){(this.fill||this.styleHas("fill"))&&this._renderTextCommon(t,"fillText")}_renderTextStroke(t){(this.stroke&&0!==this.strokeWidth||!this.isEmptyStyles())&&(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray),t.beginPath(),this._renderTextCommon(t,"strokeText"),t.closePath(),t.restore())}_renderChars(t,e,i,r,s,n){let o,a,l,h,c,u=this.textAlign.includes(ki),d=this.path,g=!u&&0===this.charSpacing&&this.isEmptyStyles(n)&&!d,f="ltr"===this.direction,p="ltr"===this.direction?1:-1,m=e.direction,y="",b=0;if(e.save(),m!==this.direction&&(e.canvas.setAttribute("dir",f?"ltr":"rtl"),e.direction=f?"ltr":"rtl",e.textAlign=f?B:X),s-=this.getHeightOfLineImpl(n)*this._fontSizeFraction,g)return this._renderChar(t,e,n,0,i.join(""),r,s),void e.restore();for(let g=0,f=i.length-1;g<=f;g++)h=g===f||this.charSpacing||d,y+=i[g],l=this.__charBounds[n][g],0===b?(r+=p*(l.kernedWidth-l.width),b+=l.width):b+=l.kernedWidth,u&&!h&&this._reSpaceAndTab.test(i[g])&&(h=!0),h||(o=o||this.getCompleteStyleDeclaration(n,g),a=this.getCompleteStyleDeclaration(n,g+1),h=Ts(o,a,!1)),h&&(d?(e.save(),e.translate(l.renderLeft,l.renderTop),e.rotate(l.angle),this._renderChar(t,e,n,g,y,-b/2,0),e.restore()):(c=r,this._renderChar(t,e,n,g,y,c,s)),y="",o=a,r+=p*b,b=0);e.restore()}_applyPatternGradientTransformText(t){let e=this.width+this.strokeWidth,i=this.height+this.strokeWidth,r=Tt({width:e,height:i}),s=r.getContext("2d");return r.width=e,r.height=i,s.beginPath(),s.moveTo(0,0),s.lineTo(e,0),s.lineTo(e,i),s.lineTo(0,i),s.closePath(),s.translate(e/2,i/2),s.fillStyle=t.toLive(s),this._applyPatternGradientTransform(s,t),s.fill(),s.createPattern(r,"no-repeat")}handleFiller(t,e,i){let r,s;return te(i)?"percentage"===i.gradientUnits||i.gradientTransform||i.patternTransform?(r=-this.width/2,s=-this.height/2,t.translate(r,s),t[e]=this._applyPatternGradientTransformText(i),{offsetX:r,offsetY:s}):(t[e]=i.toLive(t),this._applyPatternGradientTransform(t,i)):(t[e]=i,{offsetX:0,offsetY:0})}_setStrokeStyles(t,{stroke:e,strokeWidth:i}){return t.lineWidth=i,t.lineCap=this.strokeLineCap,t.lineDashOffset=this.strokeDashOffset,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,this.handleFiller(t,"strokeStyle",e)}_setFillStyles(t,{fill:e}){return this.handleFiller(t,"fillStyle",e)}_renderChar(t,e,i,r,s,n,o){let a=this._getStyleDeclaration(i,r),l=this.getCompleteStyleDeclaration(i,r),h="fillText"===t&&l.fill,c="strokeText"===t&&l.stroke&&l.strokeWidth;if(c||h){if(e.save(),e.font=this._getFontDeclaration(l),a.textBackgroundColor&&this._removeShadow(e),a.deltaY&&(o+=a.deltaY),h){let t=this._setFillStyles(e,l);e.fillText(s,n-t.offsetX,o-t.offsetY)}if(c){let t=this._setStrokeStyles(e,l);e.strokeText(s,n-t.offsetX,o-t.offsetY)}e.restore()}}setSuperscript(t,e){this._setScript(t,e,this.superscript)}setSubscript(t,e){this._setScript(t,e,this.subscript)}_setScript(t,e,i){let r=this.get2DCursorLocation(t,!0),s=this.getValueOfPropertyAt(r.lineIndex,r.charIndex,"fontSize"),n=this.getValueOfPropertyAt(r.lineIndex,r.charIndex,"deltaY"),o={fontSize:s*i.size,deltaY:n+s*i.baseline};this.setSelectionStyles(o,t,e)}_getLineLeftOffset(t){let e=this.getLineWidth(t),i=this.width-e,r=this.textAlign,s=this.direction,n=this.isEndOfWrapping(t),o=0;return"justify"===r||"justify-center"===r&&!n||"justify-right"===r&&!n||"justify-left"===r&&!n?0:("center"===r&&(o=i/2),"right"===r&&(o=i),"justify-center"===r&&(o=i/2),"justify-right"===r&&(o=i),"rtl"===s&&("right"===r||"justify-right"===r?o=0:"left"===r||"justify-left"===r?o=-i:"center"!==r&&"justify-center"!==r||(o=-i/2)),o)}_clearCache(){this._forceClearCache=!1,this.__lineWidths=[],this.__lineHeights=[],this.__charBounds=[]}getLineWidth(t){if(void 0!==this.__lineWidths[t])return this.__lineWidths[t];let{width:e}=this.measureLine(t);return this.__lineWidths[t]=e,e}_getWidthOfCharSpacing(){return 0===this.charSpacing?0:this.fontSize*this.charSpacing/1e3}getValueOfPropertyAt(t,e,i){var r;return null==(r=this._getStyleDeclaration(t,e)[i])?this[i]:r}_renderTextDecoration(t,e){if(!this[e]&&!this.styleHas(e))return;let i=this._getTopOffset(),r=this._getLeftOffset(),s=this.path,n=this._getWidthOfCharSpacing(),o="linethrough"===e?.5:+("overline"===e),a=this.offsets[e];for(let l=0,h=this._textLines.length;l<h;l++){let h=this.getHeightOfLine(l);if(!this[e]&&!this.styleHas(e,l)){i+=h;continue}let c,u=this._textLines[l],d=h/this.lineHeight,g=this._getLineLeftOffset(l),f=0,p=0,m=this.getValueOfPropertyAt(l,0,e),y=this.getValueOfPropertyAt(l,0,it),b=this.getValueOfPropertyAt(l,0,"textDecorationColor")||y,_=this.getValueOfPropertyAt(l,0,_i),v=m,x=b,C=_,w=i+d*(1-this._fontSizeFraction),S=this.getHeightOfChar(l,0),T=this.getValueOfPropertyAt(l,0,"deltaY");for(let i=0,n=u.length;i<n;i++){let n=this.__charBounds[l][i];v=this.getValueOfPropertyAt(l,i,e),c=this.getValueOfPropertyAt(l,i,it),x=this.getValueOfPropertyAt(l,i,"textDecorationColor")||c,C=this.getValueOfPropertyAt(l,i,_i);let h=this.getHeightOfChar(l,i),u=this.getValueOfPropertyAt(l,i,"deltaY");if(s&&v&&c){let e=this.fontSize*C/1e3;t.save(),t.fillStyle=x,t.translate(n.renderLeft,n.renderTop),t.rotate(n.angle),t.fillRect(-n.kernedWidth/2,a*h+u-o*e,n.kernedWidth,e),t.restore()}else if((v!==m||c!==y||x!==b||h!==S||C!==_||u!==T)&&p>0){let e=this.fontSize*_/1e3,i=r+g+f;"rtl"===this.direction&&(i=this.width-i-p),m&&b&&_&&(t.fillStyle=b,t.fillRect(i,w+a*S+T-o*e,p,e)),f=n.left,p=n.width,m=v,b=x,_=C,y=c,S=h,T=u}else p+=n.kernedWidth}let O=r+g+f;"rtl"===this.direction&&(O=this.width-O-p),t.fillStyle=x;let k=this.fontSize*C/1e3;v&&x&&C&&t.fillRect(O,w+a*S+T-o*k,p-n,k),i+=h}this._removeShadow(t)}_getFontDeclaration({fontFamily:e=this.fontFamily,fontStyle:i=this.fontStyle,fontWeight:r=this.fontWeight,fontSize:s=this.fontSize}={},n){let o=e.includes("'")||e.includes('"')||e.includes(",")||t.genericFonts.includes(e.toLowerCase())?e:`"${e}"`;return[i,r,`${n?this.CACHE_FONT_SIZE:s}px`,o].join(" ")}render(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._forceClearCache&&this.initDimensions(),super.render(t)))}graphemeSplit(t){return me(t)}_splitTextIntoLines(t){let e=t.split(this._reNewline),i=Array(e.length),r=["\n"],s=[];for(let t=0;t<e.length;t++)i[t]=this.graphemeSplit(e[t]),s=s.concat(i[t],r);return s.pop(),{_unwrappedLines:i,lines:e,graphemeText:s,graphemeLines:i}}toObject(t=[]){return{...super.toObject([...Si,...t]),styles:Os(this.styles,this.text),...this.path?{path:this.path.toObject()}:{}}}set(t,e){let{textLayoutProperties:i}=this.constructor;super.set(t,e);let r=!1,s=!1;if("object"==typeof t)for(let e in t)"path"===e&&this.setPathInfo(),r=r||i.includes(e),s=s||"path"===e;else r=i.includes(t),s="path"===t;return s&&this.setPathInfo(),r&&this.initialized&&(this.initDimensions(),this.setCoords()),this}complexity(){return 1}static async fromElement(e,i,r){let s=Ks(e,t.ATTRIBUTE_NAMES,r),{textAnchor:n=B,textDecoration:o="",dx:a=0,dy:l=0,top:h=0,left:c=0,fontSize:u=16,strokeWidth:d=1,...g}={...i,...s},f=new this(oi(e.textContent||"").trim(),{left:c+a,top:h+l,underline:o.includes("underline"),overline:o.includes("overline"),linethrough:o.includes("line-through"),strokeWidth:0,fontSize:u,...g}),p=f.getScaledHeight()/f.height,m=((f.height+f.strokeWidth)*f.lineHeight-f.height)*p,y=f.getScaledHeight()+m,b=0;return"center"===n&&(b=f.getScaledWidth()/2),"right"===n&&(b=f.getScaledWidth()),f.set({left:f.left-b,top:f.top-(y-f.fontSize*(.07+f._fontSizeFraction))/f.lineHeight,strokeWidth:d}),f}static fromObject(t){return this._fromObject({...t,styles:ks(t.styles||{},t.text)},{extraParam:"text"})}};p(Go,"textLayoutProperties",wi),p(Go,"cacheProperties",[...Xi,...Si]),p(Go,"ownDefaults",Oi),p(Go,"type","Text"),p(Go,"genericFonts",["serif","sans-serif","monospace","cursive","fantasy","system-ui","ui-serif","ui-sans-serif","ui-monospace","ui-rounded","math","emoji","fangsong"]),p(Go,"ATTRIBUTE_NAMES",Ds.concat("x","y","dx","dy","font-family","font-style","font-weight","font-size","letter-spacing","text-decoration","text-decoration-thickness","text-decoration-color","text-anchor")),ms(Go,[class extends bi{_toSVG(){let t=this._getSVGLeftTopOffsets(),e=this._getSVGTextAndBg(t.textTop,t.textLeft);return this._wrapSVGTextAndBg(e)}toSVG(t){let e=this._createBaseSVGMarkup(this._toSVG(),{reviver:t,noStyle:!0,withShadow:!0}),i=this.path;return i?e+i._createBaseSVGMarkup(i._toSVG(),{reviver:t,withShadow:!0,additionalTransform:Zt(this.calcOwnMatrix())}):e}_getSVGLeftTopOffsets(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}}_wrapSVGTextAndBg({textBgRects:t,textSpans:e}){let i=this.getSvgTextDecoration(this);return[t.join(""),'\t\t<text xml:space="preserve" ',`font-family="${fe(this.fontFamily.replace(Vo,"'"))}" `,`font-size="${fe(this.fontSize)}" `,this.fontStyle?`font-style="${fe(this.fontStyle)}" `:"",this.fontWeight?`font-weight="${fe(this.fontWeight)}" `:"",i?`text-decoration="${i}" `:"","rtl"===this.direction?'direction="rtl" ':"",'style="',this.getSvgStyles(!0),'"',this.addPaintOrder()," >",e.join(""),"</text>\n"]}_getSVGTextAndBg(t,e){let i,r=[],s=[],n=t;this.backgroundColor&&s.push(zo(this.backgroundColor,-this.width/2,-this.height/2,this.width,this.height));for(let t=0,o=this._textLines.length;t<o;t++)i=this._getLineLeftOffset(t),"rtl"===this.direction&&(i+=this.width),(this.textBackgroundColor||this.styleHas("textBackgroundColor",t))&&this._setSVGTextLineBg(s,t,e+i,n),this._setSVGTextLineText(r,t,e+i,n),n+=this.getHeightOfLine(t);return{textSpans:r,textBgRects:s}}_createTextCharSpan(t,e,i,r,s){let n=y.NUM_FRACTION_DIGITS,o=this.getSvgSpanStyles(e,t!==t.trim()||!!t.match(No)),a=o?`style="${o}"`:"",l=e.deltaY,h=l?` dy="${Qt(l,n)}" `:"",{angle:c,renderLeft:u,renderTop:d,width:g}=s,f="";if(void 0!==u){let t=g/2;c&&(f=` rotate="${Qt(Mt(c),n)}"`);let e=Xt({angle:Mt(c)});e[4]=u,e[5]=d;let s=new gt(-t,0).transform(e);i=s.x,r=s.y}return`<tspan x="${Qt(i,n)}" y="${Qt(r,n)}" ${h}${f}${a}>${fe(t)}</tspan>`}_setSVGTextLineText(t,e,i,r){let s,n,o,a,l,h=this.getHeightOfLine(e),c=this.textAlign.includes(ki),u=this._textLines[e],d="",g=0;r+=h*(1-this._fontSizeFraction)/this.lineHeight;for(let h=0,f=u.length-1;h<=f;h++)l=h===f||this.charSpacing||this.path,d+=u[h],o=this.__charBounds[e][h],0===g?(i+=o.kernedWidth-o.width,g+=o.width):g+=o.kernedWidth,c&&!l&&this._reSpaceAndTab.test(u[h])&&(l=!0),l||(s=s||this.getCompleteStyleDeclaration(e,h),n=this.getCompleteStyleDeclaration(e,h+1),l=Ts(s,n,!0)),l&&(a=this._getStyleDeclaration(e,h),t.push(this._createTextCharSpan(d,a,i,r,o)),d="",s=n,"rtl"===this.direction?i-=g:i+=g,g=0)}_setSVGTextLineBg(t,e,i,r){let s,n=this._textLines[e],o=this.getHeightOfLine(e)/this.lineHeight,a=0,l=0,h=this.getValueOfPropertyAt(e,0,"textBackgroundColor");for(let c=0;c<n.length;c++){let{left:n,width:u,kernedWidth:d}=this.__charBounds[e][c];s=this.getValueOfPropertyAt(e,c,"textBackgroundColor"),s===h?a+=d:(h&&t.push(zo(h,i+l,r,a,o)),l=n,a=u,h=s)}s&&t.push(zo(h,i+l,r,a,o))}getSvgStyles(t){let e=ri(this.textDecorationColor)?` text-decoration-color: ${fe(this[vi])};`:"";return`${super.getSvgStyles(t)} text-decoration-thickness: ${Qt(this.textDecorationThickness*this.getObjectScaling().y/10,y.NUM_FRACTION_DIGITS)}%;${e} white-space: pre;`}getSvgSpanStyles(t,e){let{fontFamily:i,strokeWidth:r,stroke:s,fill:n,fontSize:o,fontStyle:a,fontWeight:l,textDecorationThickness:h,textDecorationColor:c,linethrough:u,overline:d,underline:g}=t,f=this.getSvgTextDecoration({underline:g??this.underline,overline:d??this.overline,linethrough:u??this.linethrough}),p=h||this.textDecorationThickness,m=c||this.textDecorationColor,b=si(r),_=ni(i),v=si(o),x=ni(a),C=si(l)||ni(l),w=ni(m);return[s?yi(rt,s):"",b?`stroke-width: ${fe(b)}; `:"",_?`font-family: ${_.includes("'")||_.includes('"')?fe(_):`'${fe(_)}'`}; `:"",v?`font-size: ${fe(v)}px; `:"",x?`font-style: ${fe(x)}; `:"",C?`font-weight: ${fe(C)}; `:"",f?`text-decoration: ${f}; text-decoration-thickness: ${Qt(p*this.getObjectScaling().y/10,y.NUM_FRACTION_DIGITS)}%;${w?` text-decoration-color: ${fe(w)};`:""} `:"",n?yi(it,n):"",e?"white-space: pre; ":""].join("")}getSvgTextDecoration(t){return["overline","underline","line-through"].filter(e=>t[e.replace("-","")]).join(" ")}}]),at.setClass(Go),at.setSVGClass(Go);var Uo=class{constructor(t){p(this,"target",void 0),p(this,"__mouseDownInPlace",!1),p(this,"__dragStartFired",!1),p(this,"__isDraggingOver",!1),p(this,"__dragStartSelection",void 0),p(this,"__dragImageDisposer",void 0),p(this,"_dispose",void 0),this.target=t;let e=[this.target.on("dragenter",this.dragEnterHandler.bind(this)),this.target.on("dragover",this.dragOverHandler.bind(this)),this.target.on("dragleave",this.dragLeaveHandler.bind(this)),this.target.on("dragend",this.dragEndHandler.bind(this)),this.target.on("drop",this.dropHandler.bind(this))];this._dispose=()=>{e.forEach(t=>t()),this._dispose=void 0}}isPointerOverSelection(t){let e=this.target,i=e.getSelectionStartFromPointer(t);return e.isEditing&&i>=e.selectionStart&&i<=e.selectionEnd&&e.selectionStart<e.selectionEnd}start(t){return this.__mouseDownInPlace=this.isPointerOverSelection(t)}isActive(){return this.__mouseDownInPlace}end(t){let e=this.isActive();return e&&!this.__dragStartFired&&(this.target.setCursorByClick(t),this.target.initDelayedCursor(!0)),this.__mouseDownInPlace=!1,this.__dragStartFired=!1,this.__isDraggingOver=!1,e}getDragStartSelection(){return this.__dragStartSelection}setDragImage(t,{selectionStart:e,selectionEnd:i}){var r;let s=this.target,n=s.canvas,o=new gt(s.flipX?-1:1,s.flipY?-1:1),a=s._getCursorBoundaries(e),l=new gt(a.left+a.leftOffset,a.top+a.topOffset).multiply(o).transform(s.calcTransformMatrix()),h=n.getScenePoint(t).subtract(l),c=s.getCanvasRetinaScaling(),u=s.getBoundingRect(),d=l.subtract(new gt(u.left,u.top)),g=n.viewportTransform,f=d.add(h).transform(g,!0),p=s.backgroundColor,m=Ss(s.styles);s.backgroundColor="";let y={stroke:"transparent",fill:"transparent",textBackgroundColor:"transparent"};s.setSelectionStyles(y,0,e),s.setSelectionStyles(y,i,s.text.length),s.dirty=!0;let b=s.toCanvasElement({enableRetinaScaling:n.enableRetinaScaling,viewportTransform:!0});s.backgroundColor=p,s.styles=m,s.dirty=!0,zn(b,{position:"fixed",left:-b.width+"px",border:Y,width:b.width/c+"px",height:b.height/c+"px"}),this.__dragImageDisposer&&this.__dragImageDisposer(),this.__dragImageDisposer=()=>{b.remove()},ne(t.target||this.target.hiddenTextarea).body.appendChild(b),null==(r=t.dataTransfer)||r.setDragImage(b,f.x,f.y)}onDragStart(t){this.__dragStartFired=!0;let e=this.target,i=this.isActive();if(i&&t.dataTransfer){let i=this.__dragStartSelection={selectionStart:e.selectionStart,selectionEnd:e.selectionEnd},r=e._text.slice(i.selectionStart,i.selectionEnd).join(""),s={text:e.text,value:r,...i};t.dataTransfer.setData("text/plain",r),t.dataTransfer.setData("application/fabric",JSON.stringify({value:r,styles:e.getSelectionStyles(i.selectionStart,i.selectionEnd,!0)})),t.dataTransfer.effectAllowed="copyMove",this.setDragImage(t,s)}return e.abortCursorAnimation(),i}canDrop(t){if(this.target.editable&&!this.target.getActiveControl()&&!t.defaultPrevented){if(this.isActive()&&this.__dragStartSelection){let e=this.target.getSelectionStartFromPointer(t),i=this.__dragStartSelection;return e<i.selectionStart||e>i.selectionEnd}return!0}return!1}targetCanDrop(t){return this.target.canDrop(t)}dragEnterHandler({e:t}){let e=this.targetCanDrop(t);!this.__isDraggingOver&&e&&(this.__isDraggingOver=!0)}dragOverHandler(t){let{e}=t,i=this.targetCanDrop(e);!this.__isDraggingOver&&i?this.__isDraggingOver=!0:this.__isDraggingOver&&!i&&(this.__isDraggingOver=!1),this.__isDraggingOver&&(e.preventDefault(),t.canDrop=!0,t.dropTarget=this.target)}dragLeaveHandler(){(this.__isDraggingOver||this.isActive())&&(this.__isDraggingOver=!1)}dropHandler(t){var e;let{e:i}=t,r=i.defaultPrevented;this.__isDraggingOver=!1,i.preventDefault();let s=null==(e=i.dataTransfer)?void 0:e.getData("text/plain");if(s&&!r){let e=this.target,r=e.canvas,n=e.getSelectionStartFromPointer(i),{styles:o}=i.dataTransfer.types.includes("application/fabric")?JSON.parse(i.dataTransfer.getData("application/fabric")):{},a=s[Math.max(0,s.length-1)];if(this.__dragStartSelection){let t=this.__dragStartSelection.selectionStart,i=this.__dragStartSelection.selectionEnd;n>t&&n<=i?n=t:n>i&&(n-=i-t),e.removeChars(t,i),delete this.__dragStartSelection}e._reNewline.test(a)&&(e._reNewline.test(e._text[n])||n===e._text.length)&&(s=s.trimEnd()),t.didDrop=!0,t.dropTarget=e,e.insertChars(s,o,n),r.setActiveObject(e),e.enterEditing(i),e.selectionStart=Math.min(n+0,e._text.length),e.selectionEnd=Math.min(e.selectionStart+s.length,e._text.length),e.hiddenTextarea.value=e.text,e._updateTextarea(),e.hiddenTextarea.focus(),e.fire(K,{index:n+0,action:"drop"}),r.fire("text:changed",{target:e}),r.contextTopDirty=!0,r.requestRenderAll()}}dragEndHandler({e:t}){if(this.isActive()&&this.__dragStartFired&&this.__dragStartSelection){var e;let i=this.target,r=this.target.canvas,{selectionStart:s,selectionEnd:n}=this.__dragStartSelection,o=(null==(e=t.dataTransfer)?void 0:e.dropEffect)||"none";"none"===o?(i.selectionStart=s,i.selectionEnd=n,i._updateTextarea(),i.hiddenTextarea.focus()):(i.clearContextTop(),"move"===o&&(i.removeChars(s,n),i.selectionStart=i.selectionEnd=s,i.hiddenTextarea&&(i.hiddenTextarea.value=i.text),i._updateTextarea(),i.fire(K,{index:s,action:"dragend"}),r.fire("text:changed",{target:i}),r.requestRenderAll()),i.exitEditing())}this.__dragImageDisposer&&this.__dragImageDisposer(),delete this.__dragImageDisposer,delete this.__dragStartSelection,this.__isDraggingOver=!1}dispose(){this._dispose&&this._dispose()}};const qo=/[ \n\.,;!\?\-]/;var Ko=class extends Go{constructor(...t){super(...t),p(this,"_currentCursorOpacity",1)}initBehavior(){this._tick=this._tick.bind(this),this._onTickComplete=this._onTickComplete.bind(this),this.updateSelectionOnMouseMove=this.updateSelectionOnMouseMove.bind(this)}onDeselect(t){return this.isEditing&&this.exitEditing(),this.selected=!1,super.onDeselect(t)}_animateCursor({toValue:t,duration:e,delay:i,onComplete:r}){return Mr({startValue:this._currentCursorOpacity,endValue:t,duration:e,delay:i,onComplete:r,abort:()=>!this.canvas||this.selectionStart!==this.selectionEnd,onChange:t=>{this._currentCursorOpacity=t,this.renderCursorOrSelection()}})}_tick(t){this._currentTickState=this._animateCursor({toValue:0,duration:this.cursorDuration/2,delay:Math.max(t||0,100),onComplete:this._onTickComplete})}_onTickComplete(){var t;null==(t=this._currentTickCompleteState)||t.abort(),this._currentTickCompleteState=this._animateCursor({toValue:1,duration:this.cursorDuration,onComplete:this._tick})}initDelayedCursor(t){this.abortCursorAnimation(),this._tick(t?0:this.cursorDelay)}abortCursorAnimation(){let t=!1;[this._currentTickState,this._currentTickCompleteState].forEach(e=>{e&&!e.isDone()&&(t=!0,e.abort())}),this._currentCursorOpacity=1,t&&this.clearContextTop()}restartCursorIfNeeded(){[this._currentTickState,this._currentTickCompleteState].some(t=>!t||t.isDone())&&this.initDelayedCursor()}selectAll(){return this.selectionStart=0,this.selectionEnd=this._text.length,this._fireSelectionChanged(),this._updateTextarea(),this}cmdAll(){this.selectAll(),this.renderCursorOrSelection()}getSelectedText(){return this._text.slice(this.selectionStart,this.selectionEnd).join("")}findWordBoundaryLeft(t){let e=0,i=t-1;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i--;for(;/\S/.test(this._text[i])&&i>-1;)e++,i--;return t-e}findWordBoundaryRight(t){let e=0,i=t;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i++;for(;/\S/.test(this._text[i])&&i<this._text.length;)e++,i++;return t+e}findLineBoundaryLeft(t){let e=0,i=t-1;for(;!/\n/.test(this._text[i])&&i>-1;)e++,i--;return t-e}findLineBoundaryRight(t){let e=0,i=t;for(;!/\n/.test(this._text[i])&&i<this._text.length;)e++,i++;return t+e}searchWordBoundary(t,e){let i=this._text,r=t>0&&this._reSpace.test(i[t])&&(-1===e||!W.test(i[t-1]))?t-1:t,s=i[r];for(;r>0&&r<i.length&&!qo.test(s);)r+=e,s=i[r];return-1===e&&qo.test(s)&&r++,r}selectWord(t){var e;t=null==(e=t)?this.selectionStart:e;let i=this.searchWordBoundary(t,-1),r=Math.max(i,this.searchWordBoundary(t,1));this.selectionStart=i,this.selectionEnd=r,this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()}selectLine(t){var e;t=null==(e=t)?this.selectionStart:e;let i=this.findLineBoundaryLeft(t),r=this.findLineBoundaryRight(t);this.selectionStart=i,this.selectionEnd=r,this._fireSelectionChanged(),this._updateTextarea()}enterEditing(t){!this.isEditing&&this.editable&&(this.enterEditingImpl(),this.fire("editing:entered",t?{e:t}:void 0),this._fireSelectionChanged(),this.canvas&&(this.canvas.fire("text:editing:entered",{target:this,e:t}),this.canvas.requestRenderAll()))}enterEditingImpl(){this.canvas&&(this.canvas.calcOffset(),this.canvas.textEditingManager.exitTextEditing()),this.isEditing=!0,this.initHiddenTextarea(),this.hiddenTextarea.focus(),this.hiddenTextarea.value=this.text,this._updateTextarea(),this._saveEditingProps(),this._setEditingProps(),this._textBeforeEdit=this.text,this._tick()}updateSelectionOnMouseMove(t){if(this.getActiveControl())return;let e=this.hiddenTextarea;ne(e).activeElement!==e&&e.focus();let i=this.getSelectionStartFromPointer(t),r=this.selectionStart,s=this.selectionEnd;(i===this.__selectionStartOnMouseDown&&r!==s||r!==i&&s!==i)&&(i>this.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=i):(this.selectionStart=i,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===r&&this.selectionEnd===s||(this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}_setEditingProps(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0}fromStringToGraphemeSelection(t,e,i){let r=i.slice(0,t),s=this.graphemeSplit(r).length;if(t===e)return{selectionStart:s,selectionEnd:s};let n=i.slice(t,e);return{selectionStart:s,selectionEnd:s+this.graphemeSplit(n).length}}fromGraphemeToStringSelection(t,e,i){let r=i.slice(0,t).join("").length;return t===e?{selectionStart:r,selectionEnd:r}:{selectionStart:r,selectionEnd:r+i.slice(t,e).join("").length}}_updateTextarea(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){let t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}}updateFromTextArea(){let{hiddenTextarea:t,direction:e,textAlign:i,inCompositionMode:r}=this;if(!t)return;let s="justify"===i?"ltr"===e?B:X:i.replace("justify-",""),n=this.getPositionByOrigin(s,"top");this.cursorOffsetCache={},this.text=t.value,this.set("dirty",!0),this.initDimensions(),this.setPositionByOrigin(n,s,"top"),this.setCoords();let o=this.fromStringToGraphemeSelection(t.selectionStart,t.selectionEnd,t.value);this.selectionEnd=this.selectionStart=o.selectionEnd,r||(this.selectionStart=o.selectionStart),this.updateTextareaPosition()}updateTextareaPosition(){if(this.selectionStart===this.selectionEnd){let t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}}_calcTextareaPosition(){if(!this.canvas)return{left:"1px",top:"1px"};let t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),i=this.get2DCursorLocation(t),r=i.lineIndex,s=i.charIndex,n=this.getValueOfPropertyAt(r,s,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.getCanvasRetinaScaling(),l=this.canvas.upperCanvasEl,h=l.width/a,c=l.height/a,u=h-n,d=c-n,g=new gt(e.left+o,e.top+e.topOffset+n).transform(this.calcTransformMatrix()).transform(this.canvas.viewportTransform).multiply(new gt(l.clientWidth/h,l.clientHeight/c));return g.x<0&&(g.x=0),g.x>u&&(g.x=u),g.y<0&&(g.y=0),g.y>d&&(g.y=d),g.x+=this.canvas._offset.left,g.y+=this.canvas._offset.top,{left:`${g.x}px`,top:`${g.y}px`,fontSize:`${n}px`,charHeight:n}}_saveEditingProps(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}}_restoreEditingProps(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor||this.canvas.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor||this.canvas.moveCursor),delete this._savedProps)}exitEditingImpl(){let t=this.hiddenTextarea;this.selected=!1,this.isEditing=!1,t&&(t.blur&&t.blur(),t.parentNode&&t.parentNode.removeChild(t)),this.hiddenTextarea=null,this.abortCursorAnimation(),this.selectionStart!==this.selectionEnd&&this.clearContextTop(),this.selectionEnd=this.selectionStart,this._restoreEditingProps(),this._forceClearCache&&(this.initDimensions(),this.setCoords())}exitEditing(){let t=this._textBeforeEdit!==this.text;return this.exitEditingImpl(),this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this}_removeExtraneousStyles(){for(let t in this.styles)this._textLines[t]||delete this.styles[t]}removeStyleFromTo(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t,!0),{lineIndex:s,charIndex:n}=this.get2DCursorLocation(e,!0);if(i!==s){if(this.styles[i])for(let t=r;t<this._unwrappedTextLines[i].length;t++)delete this.styles[i][t];if(this.styles[s])for(let t=n;t<this._unwrappedTextLines[s].length;t++){let e=this.styles[s][t];e&&(this.styles[i]||(this.styles[i]={}),this.styles[i][r+t-n]=e)}for(let t=i+1;t<=s;t++)delete this.styles[t];this.shiftLineStyles(s,i-s)}else if(this.styles[i]){let t=this.styles[i],e=n-r;for(let e=r;e<n;e++)delete t[e];for(let r in this.styles[i]){let i=parseInt(r,10);i>=n&&(t[i-e]=t[r],delete t[r])}}}shiftLineStyles(t,e){let i=Object.assign({},this.styles);for(let r in this.styles){let s=parseInt(r,10);s>t&&(this.styles[s+e]=i[s],i[s-e]||delete this.styles[s])}}insertNewlineStyleObject(t,e,i,r){let s={},n=this._unwrappedTextLines[t].length,o=n===e,a=!1;i||(i=1),this.shiftLineStyles(t,i);let l=this.styles[t]?this.styles[t][0===e?e:e-1]:void 0;for(let i in this.styles[t]){let r=parseInt(i,10);r>=e&&(a=!0,s[r-e]=this.styles[t][i],o&&0===e||delete this.styles[t][i])}let h=!1;for(a&&!o&&(this.styles[t+i]=s,h=!0),(h||n>e)&&i--;i>0;)r&&r[i-1]?this.styles[t+i]={0:{...r[i-1]}}:l?this.styles[t+i]={0:{...l}}:delete this.styles[t+i],i--;this._forceClearCache=!0}insertCharStyleObject(t,e,i,r){this.styles||(this.styles={});let s=this.styles[t],n=s?{...s}:{};i||(i=1);for(let t in n){let r=parseInt(t,10);r>=e&&(s[r+i]=n[r],n[r-i]||delete s[r])}if(this._forceClearCache=!0,r){for(;i--;)Object.keys(r[i]).length&&(this.styles[t]||(this.styles[t]={}),this.styles[t][e+i]={...r[i]});return}if(!s)return;let o=s[e?e-1:1];for(;o&&i--;)this.styles[t][e+i]={...o}}insertNewStyleBlock(t,e,i){let r,s=this.get2DCursorLocation(e,!0),n=[0],o=0;for(let e=0;e<t.length;e++)"\n"===t[e]?(o++,n[o]=0):n[o]++;for(n[0]>0&&(this.insertCharStyleObject(s.lineIndex,s.charIndex,n[0],i),i=i&&i.slice(n[0]+1)),o&&this.insertNewlineStyleObject(s.lineIndex,s.charIndex+n[0],o),r=1;r<o;r++)n[r]>0?this.insertCharStyleObject(s.lineIndex+r,0,n[r],i):i&&this.styles[s.lineIndex+r]&&i[0]&&(this.styles[s.lineIndex+r][0]=i[0]),i=i&&i.slice(n[r]+1);n[r]>0&&this.insertCharStyleObject(s.lineIndex+r,0,n[r],i)}removeChars(t,e=t+1){this.removeStyleFromTo(t,e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}insertChars(t,e,i,r=i){r>i&&this.removeStyleFromTo(i,r);let s=this.graphemeSplit(t);this.insertNewStyleBlock(s,i,e),this._text=[...this._text.slice(0,i),...s,...this._text.slice(r)],this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}setSelectionStartEndWithShift(t,e,i){i<=t?(e===t?this._selectionDirection=B:"right"===this._selectionDirection&&(this._selectionDirection=B,this.selectionEnd=t),this.selectionStart=i):i>t&&i<e?"right"===this._selectionDirection?this.selectionEnd=i:this.selectionStart=i:(e===t?this._selectionDirection=X:"left"===this._selectionDirection&&(this._selectionDirection=X,this.selectionStart=e),this.selectionEnd=i)}},Jo=class extends Ko{initHiddenTextarea(){let t=this.canvas&&ne(this.canvas.getElement())||O(),e=t.createElement("textarea");Object.entries({autocapitalize:"off",autocorrect:"off",autocomplete:"off",spellcheck:"false","data-fabric":"textarea",wrap:"off",name:"fabricTextarea"}).map(([t,i])=>e.setAttribute(t,i));let{top:i,left:r,fontSize:s}=this._calcTextareaPosition();e.style.cssText=`position: absolute; top: ${i}; left: ${r}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${s};`,(this.hiddenTextareaContainer||t.body).appendChild(e),Object.entries({blur:"blur",keydown:"onKeyDown",keyup:"onKeyUp",input:"onInput",copy:"copy",cut:"copy",paste:"paste",compositionstart:"onCompositionStart",compositionupdate:"onCompositionUpdate",compositionend:"onCompositionEnd"}).map(([t,i])=>e.addEventListener(t,this[i].bind(this))),this.hiddenTextarea=e}blur(){this.abortCursorAnimation()}onKeyDown(t){if(!this.isEditing)return;let e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown)||!t.ctrlKey&&!t.metaKey)return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}onKeyUp(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())}onInput(t){let e=this.fromPaste,{value:i,selectionStart:r,selectionEnd:s}=this.hiddenTextarea;if(this.fromPaste=!1,t&&t.stopPropagation(),!this.isEditing)return;let n=()=>{this.updateFromTextArea(),this.fire(K),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())};if(""===this.hiddenTextarea.value)return this.styles={},void n();let o,a,l,h,c=this._splitTextIntoLines(i).graphemeText,u=this._text.length,d=c.length,g=this.selectionStart,f=this.selectionEnd,p=g!==f,m=d-u,b=this.fromStringToGraphemeSelection(r,s,i),_=g>b.selectionStart;p?(a=this._text.slice(g,f),m+=f-g):d<u&&(a=_?this._text.slice(f+m,f):this._text.slice(g,g-m));let v=c.slice(b.selectionEnd-m,b.selectionEnd);if(a&&a.length&&(v.length&&(o=this.getSelectionStyles(g,g+1,!1),o=v.map(()=>o[0])),p?(l=g,h=f):_?(l=f-a.length,h=f):(l=f,h=f+a.length),this.removeStyleFromTo(l,h)),v.length){let{copyPasteData:t}=T();e&&v.join("")===t.copiedText&&!y.disableStyleCopyPaste&&(o=t.copiedTextStyle),this.insertNewStyleBlock(v,g,o)}n()}onCompositionStart(){this.inCompositionMode=!0}onCompositionEnd(){this.inCompositionMode=!1}onCompositionUpdate({target:t}){let{selectionStart:e,selectionEnd:i}=t;this.compositionStart=e,this.compositionEnd=i,this.updateTextareaPosition()}copy(){if(this.selectionStart===this.selectionEnd)return;let{copyPasteData:t}=T();t.copiedText=this.getSelectedText(),y.disableStyleCopyPaste?t.copiedTextStyle=void 0:t.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd,!0),this._copyDone=!0}paste(){this.fromPaste=!0}_getWidthBeforeCursor(t,e){let i,r=this._getLineLeftOffset(t);return e>0&&(i=this.__charBounds[t][e-1],r+=i.left+i.width),r}getDownCursorOffset(t,e){let i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),s=r.lineIndex;if(s===this._textLines.length-1||t.metaKey||34===t.keyCode)return this._text.length-i;let n=r.charIndex,o=this._getWidthBeforeCursor(s,n),a=this._getIndexOnLine(s+1,o);return this._textLines[s].slice(n).length+a+1+this.missingNewlineOffset(s)}_getSelectionForOffset(t,e){return t.shiftKey&&this.selectionStart!==this.selectionEnd&&e?this.selectionEnd:this.selectionStart}getUpCursorOffset(t,e){let i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),s=r.lineIndex;if(0===s||t.metaKey||33===t.keyCode)return-i;let n=r.charIndex,o=this._getWidthBeforeCursor(s,n),a=this._getIndexOnLine(s-1,o),l=this._textLines[s].slice(0,n),h=this.missingNewlineOffset(s-1);return-this._textLines[s-1].length+a-l.length+(1-h)}_getIndexOnLine(t,e){let i,r,s=this._textLines[t],n=this._getLineLeftOffset(t),o=0;for(let a=0,l=s.length;a<l;a++)if(i=this.__charBounds[t][a].width,n+=i,n>e){r=!0;let t=n-i,s=n,l=Math.abs(t-e);o=Math.abs(s-e)<l?a:a-1;break}return r||(o=s.length-1),o}moveCursorDown(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)}moveCursorUp(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)}_moveCursorUpOrDown(t,e){let i=this[`get${t}CursorOffset`](e,this._selectionDirection===X);if(e.shiftKey?this.moveCursorWithShift(i):this.moveCursorWithoutShift(i),0!==i){let t=this.text.length;this.selectionStart=Bi(0,this.selectionStart,t),this.selectionEnd=Bi(0,this.selectionEnd,t),this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea()}}moveCursorWithShift(t){let e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t}moveCursorWithoutShift(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t}moveCursorLeft(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)}_move(t,e,i){let r;if(t.altKey)r=this[`findWordBoundary${i}`](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this[`findLineBoundary${i}`](this[e])}return void 0!==r&&this[e]!==r&&(this[e]=r,!0)}_moveLeft(t,e){return this._move(t,e,"Left")}_moveRight(t,e){return this._move(t,e,"Right")}moveCursorLeftWithoutShift(t){let e=!0;return this._selectionDirection=B,this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e}moveCursorLeftWithShift(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0===this.selectionStart?void 0:(this._selectionDirection=B,this._moveLeft(t,"selectionStart"))}moveCursorRight(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)}_moveCursorLeftOrRight(t,e){let i=`moveCursor${t}${e.shiftKey?"WithShift":"WithoutShift"}`;this._currentCursorOpacity=1,this[i](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())}moveCursorRightWithShift(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd===this._text.length?void 0:(this._selectionDirection=X,this._moveRight(t,"selectionEnd"))}moveCursorRightWithoutShift(t){let e=!0;return this._selectionDirection=X,this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e}};const Qo=t=>!!t.button;var Zo=class extends Jo{constructor(...t){super(...t),p(this,"draggableTextDelegate",void 0)}initBehavior(){this.on("mousedown",this._mouseDownHandler),this.on("mouseup",this.mouseUpHandler),this.on("mousedblclick",this.doubleClickHandler),this.on("mousetripleclick",this.tripleClickHandler),this.draggableTextDelegate=new Uo(this),super.initBehavior()}shouldStartDragging(){return this.draggableTextDelegate.isActive()}onDragStart(t){return this.draggableTextDelegate.onDragStart(t)}canDrop(t){return this.draggableTextDelegate.canDrop(t)}doubleClickHandler(t){this.isEditing&&(this.selectWord(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}tripleClickHandler(t){this.isEditing&&(this.selectLine(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}_mouseDownHandler({e:t,alreadySelected:e}){this.canvas&&this.editable&&!Qo(t)&&!this.getActiveControl()&&(this.draggableTextDelegate.start(t)||(this.canvas.textEditingManager.register(this),e&&(this.inCompositionMode=!1,this.setCursorByClick(t)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()),this.selected||(this.selected=e||this.isEditing)))}mouseUpHandler({e:t,transform:e}){let i=this.draggableTextDelegate.end(t);if(this.canvas){this.canvas.textEditingManager.unregister(this);let t=this.canvas._activeObject;if(t&&t!==this)return}!this.editable||this.group&&!this.group.interactive||e&&e.actionPerformed||Qo(t)||i||this.selected&&!this.getActiveControl()&&(this.enterEditing(t),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection())}setCursorByClick(t){let e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())}getSelectionStartFromPointer(t){let e=this.canvas.getScenePoint(t).transform(Pt(this.calcTransformMatrix())).add(new gt(-this._getLeftOffset(),-this._getTopOffset())),i=0,r=0,s=0;for(let t=0;t<this._textLines.length&&i<=e.y;t++)i+=this.getHeightOfLine(t),s=t,t>0&&(r+=this._textLines[t-1].length+this.missingNewlineOffset(t-1));let n=Math.abs(this._getLineLeftOffset(s)),o=this._textLines[s].length,a=this.__charBounds[s];for(let t=0;t<o;t++){let i=n+a[t].kernedWidth;if(e.x<=i){Math.abs(e.x-i)<=Math.abs(e.x-n)&&r++;break}n=i,r++}return Math.min(this.flipX?o-r:r,this._text.length)}};const ta="moveCursorUp",ea="moveCursorDown",ia="moveCursorLeft",ra="moveCursorRight",sa="exitEditing",na=(t,e)=>{let i=e.getRetinaScaling();t.setTransform(i,0,0,i,0,0);let r=e.viewportTransform;t.transform(r[0],r[1],r[2],r[3],r[4],r[5])},oa={selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"",cursorDelay:1e3,cursorDuration:600,caching:!0,hiddenTextareaContainer:null,keysMap:{9:sa,27:sa,33:ta,34:ea,35:ra,36:ia,37:ia,38:ta,39:ra,40:ea},keysMapRtl:{9:sa,27:sa,33:ta,34:ea,35:ia,36:ra,37:ra,38:ta,39:ia,40:ea},ctrlKeysMapDown:{65:"cmdAll"},ctrlKeysMapUp:{67:"copy",88:"cut"},_selectionDirection:null,_reSpace:/\s|\r?\n/,inCompositionMode:!1};var aa=class t extends Zo{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}get type(){let t=super.type;return"itext"===t?"i-text":t}constructor(e,i){super(e,{...t.ownDefaults,...i}),this.initBehavior()}_set(t,e){return this.isEditing&&this._savedProps&&t in this._savedProps?(this._savedProps[t]=e,this):("canvas"===t&&(this.canvas instanceof po&&this.canvas.textEditingManager.remove(this),e instanceof po&&e.textEditingManager.add(this)),super._set(t,e))}setSelectionStart(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)}setSelectionEnd(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)}_updateAndFire(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()}_fireSelectionChanged(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})}initDimensions(){this.isEditing&&this.initDelayedCursor(),super.initDimensions()}getSelectionStyles(t=this.selectionStart||0,e=this.selectionEnd,i){return super.getSelectionStyles(t,e,i)}setSelectionStyles(t,e=this.selectionStart||0,i=this.selectionEnd){return super.setSelectionStyles(t,e,i)}get2DCursorLocation(t=this.selectionStart,e){return super.get2DCursorLocation(t,e)}render(t){super.render(t),this.cursorOffsetCache={},this.renderCursorOrSelection()}toCanvasElement(t){let e=this.isEditing;this.isEditing=!1;let i=super.toCanvasElement(t);return this.isEditing=e,i}renderCursorOrSelection(){if(!this.isEditing||!this.canvas)return;let t=this.clearContextTop(!0);if(!t)return;let e,i=this._getCursorBoundaries(),r=this.findAncestorsWithClipPath(),s=r.length>0,n=t;if(s){e=Tt(t.canvas),n=e.getContext("2d"),na(n,this.canvas);let i=this.calcTransformMatrix();n.transform(i[0],i[1],i[2],i[3],i[4],i[5])}if(this.selectionStart!==this.selectionEnd||this.inCompositionMode?this.renderSelection(n,i):this.renderCursor(n,i),s)for(let e of r){let i=e.clipPath,r=Tt(t.canvas),s=r.getContext("2d");if(na(s,this.canvas),!i.absolutePositioned){let t=e.calcTransformMatrix();s.transform(t[0],t[1],t[2],t[3],t[4],t[5])}i.transform(s),i.drawObject(s,!0,{}),this.drawClipPathOnCache(n,i,r)}s&&(t.setTransform(1,0,0,1,0,0),t.drawImage(e,0,0)),this.canvas.contextTopDirty=!0,t.restore()}findAncestorsWithClipPath(){let t=[],e=this;for(;e;)e.clipPath&&t.push(e),e=e.parent;return t}_getCursorBoundaries(t=this.selectionStart,e){let i=this._getLeftOffset(),r=this._getTopOffset(),s=this._getCursorBoundariesOffsets(t,e);return{left:i,top:r,leftOffset:s.left,topOffset:s.top}}_getCursorBoundariesOffsets(t,e){return e?this.__getCursorBoundariesOffsets(t):this.cursorOffsetCache&&"top"in this.cursorOffsetCache?this.cursorOffsetCache:this.cursorOffsetCache=this.__getCursorBoundariesOffsets(t)}__getCursorBoundariesOffsets(t){let e=0,i=0,{charIndex:r,lineIndex:s}=this.get2DCursorLocation(t),{textAlign:n,direction:o}=this;for(let t=0;t<s;t++)e+=this.getHeightOfLine(t);let a=this._getLineLeftOffset(s),l=this.__charBounds[s][r];l&&(i=l.left),0!==this.charSpacing&&r===this._textLines[s].length&&(i-=this._getWidthOfCharSpacing());let h=a+(i>0?i:0);return"rtl"===o&&("right"===n||"justify"===n||"justify-right"===n?h*=-1:"left"===n||"justify-left"===n?h=a-(i>0?i:0):"center"!==n&&"justify-center"!==n||(h=a-(i>0?i:0))),{top:e,left:h}}renderCursorAt(t){this._renderCursor(this.canvas.contextTop,this._getCursorBoundaries(t,!0),t)}renderCursor(t,e){this._renderCursor(t,e,this.selectionStart)}getCursorRenderingData(t=this.selectionStart,e=this._getCursorBoundaries(t)){let i=this.get2DCursorLocation(t),r=i.lineIndex,s=i.charIndex>0?i.charIndex-1:0,n=this.getValueOfPropertyAt(r,s,"fontSize"),o=this.getObjectScaling().x*this.canvas.getZoom(),a=this.cursorWidth/o,l=this.getValueOfPropertyAt(r,s,"deltaY"),h=e.topOffset+(1-this._fontSizeFraction)*this.getHeightOfLine(r)/this.lineHeight-n*(1-this._fontSizeFraction);return{color:this.cursorColor||this.getValueOfPropertyAt(r,s,"fill"),opacity:this._currentCursorOpacity,left:e.left+e.leftOffset-a/2,top:h+e.top+l,width:a,height:n}}_renderCursor(t,e,i){let{color:r,opacity:s,left:n,top:o,width:a,height:l}=this.getCursorRenderingData(i,e);t.fillStyle=r,t.globalAlpha=s,t.fillRect(n,o,a,l)}renderSelection(t,e){let i={selectionStart:this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,selectionEnd:this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd};this._renderSelection(t,i,e)}renderDragSourceEffect(){let t=this.draggableTextDelegate.getDragStartSelection();this._renderSelection(this.canvas.contextTop,t,this._getCursorBoundaries(t.selectionStart,!0))}renderDropTargetEffect(t){let e=this.getSelectionStartFromPointer(t);this.renderCursorAt(e)}_renderSelection(t,e,i){let{textAlign:r,direction:s}=this,n=e.selectionStart,o=e.selectionEnd,a=r.includes(ki),l=this.get2DCursorLocation(n),h=this.get2DCursorLocation(o),c=l.lineIndex,u=h.lineIndex,d=l.charIndex<0?0:l.charIndex,g=h.charIndex<0?0:h.charIndex;for(let e=c;e<=u;e++){let n=this._getLineLeftOffset(e)||0,o=this.getHeightOfLine(e),l=0,h=0;if(e===c&&(l=this.__charBounds[c][d].left),e>=c&&e<u)h=a&&!this.isEndOfWrapping(e)?this.width:this.getLineWidth(e)||5;else if(e===u)if(0===g)h=this.__charBounds[u][g].left;else{let t=this._getWidthOfCharSpacing();h=this.__charBounds[u][g-1].left+this.__charBounds[u][g-1].width-t}let f=o;(this.lineHeight<1||e===u&&this.lineHeight>1)&&(o/=this.lineHeight);let p=i.left+n+l,m=o,y=0,b=h-l;this.inCompositionMode?(t.fillStyle=this.compositionColor||"black",m=1,y=o):t.fillStyle=this.selectionColor,"rtl"===s&&("right"===r||"justify"===r||"justify-right"===r?p=this.width-p-b:"left"===r||"justify-left"===r?p=i.left+n-h:"center"!==r&&"justify-center"!==r||(p=i.left+n-h)),t.fillRect(p,i.top+i.topOffset+y,b,m),i.topOffset+=f}}getCurrentCharFontSize(){let t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")}getCurrentCharColor(){let t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,it)}_getCurrentCharIndex(){let t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}dispose(){this.exitEditingImpl(),this.draggableTextDelegate.dispose(),super.dispose()}};p(aa,"ownDefaults",oa),p(aa,"type","IText"),at.setClass(aa),at.setClass(aa,"i-text");var la=class t extends aa{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(e,{...t.ownDefaults,...i})}static createControls(){return{controls:fs()}}initDimensions(){this.initialized&&(this.isEditing&&this.initDelayedCursor(),this._clearCache(),this.dynamicMinWidth=0,this._styleMap=this._generateStyleMap(this._splitText()),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this.textAlign.includes("justify")&&this.enlargeSpaces(),this.height=this.calcTextHeight())}_generateStyleMap(t){let e=0,i=0,r=0,s={};for(let n=0;n<t.graphemeLines.length;n++)"\n"===t.graphemeText[r]&&n>0?(i=0,r++,e++):!this.splitByGrapheme&&this._reSpaceAndTab.test(t.graphemeText[r])&&n>0&&(i++,r++),s[n]={line:e,offset:i},r+=t.graphemeLines[n].length,i+=t.graphemeLines[n].length;return s}styleHas(t,e){if(this._styleMap&&!this.isWrapping){let t=this._styleMap[e];t&&(e=t.line)}return super.styleHas(t,e)}isEmptyStyles(t){if(!this.styles)return!0;let e,i,r=0,s=!1,n=this._styleMap[t],o=this._styleMap[t+1];n&&(t=n.line,r=n.offset),o&&(e=o.line,s=e===t,i=o.offset);let a=void 0===t?this.styles:{line:this.styles[t]};for(let t in a)for(let e in a[t]){let n=parseInt(e,10);if(n>=r&&(!s||n<i))for(let i in a[t][e])return!1}return!0}_getStyleDeclaration(t,e){if(this._styleMap&&!this.isWrapping){let i=this._styleMap[t];if(!i)return{};t=i.line,e=i.offset+e}return super._getStyleDeclaration(t,e)}_setStyleDeclaration(t,e,i){let r=this._styleMap[t];super._setStyleDeclaration(r.line,r.offset+e,i)}_deleteStyleDeclaration(t,e){let i=this._styleMap[t];super._deleteStyleDeclaration(i.line,i.offset+e)}_getLineStyle(t){let e=this._styleMap[t];return!!this.styles[e.line]}_setLineStyle(t){let e=this._styleMap[t];super._setLineStyle(e.line)}_wrapText(t,e){this.isWrapping=!0;let i=this.getGraphemeDataForRender(t),r=[];for(let t=0;t<i.wordsData.length;t++)r.push(...this._wrapLine(t,e,i));return this.isWrapping=!1,r}getGraphemeDataForRender(t){let e=this.splitByGrapheme,i=e?"":" ",r=0;return{wordsData:t.map((t,s)=>{let n=0,o=e?this.graphemeSplit(t):this.wordSplit(t);return 0===o.length?[{word:[],width:0}]:o.map(t=>{let o=e?[t]:this.graphemeSplit(t),a=this._measureWord(o,s,n);return r=Math.max(a,r),n+=o.length+i.length,{word:o,width:a}})}),largestWordWidth:r}}_measureWord(t,e,i=0){let r,s=0;for(let n=0,o=t.length;n<o;n++)s+=this._getGraphemeBox(t[n],e,n+i,r,!0).kernedWidth,r=t[n];return s}wordSplit(t){return t.split(this._wordJoiners)}_wrapLine(t,e,{largestWordWidth:i,wordsData:r},s=0){let n=this._getWidthOfCharSpacing(),o=this.splitByGrapheme,a=[],l=o?"":" ",h=0,c=[],u=0,d=0,g=!0;e-=s;let f,p=Math.max(e,i,this.dynamicMinWidth),m=r[t];for(f=0;f<m.length;f++){let{word:e,width:i}=m[f];u+=e.length,h+=d+i-n,h>p&&!g?(a.push(c),c=[],h=i,g=!0):h+=n,g||o||c.push(l),c=c.concat(e),d=o?0:this._measureWord([l],t,u),u++,g=!1}return f&&a.push(c),i+s>this.dynamicMinWidth&&(this.dynamicMinWidth=i-n+s),a}isEndOfWrapping(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line}missingNewlineOffset(t,e){return this.splitByGrapheme&&!e?+!!this.isEndOfWrapping(t):1}_splitTextIntoLines(t){let e=super._splitTextIntoLines(t),i=this._wrapText(e.lines,this.width),r=Array(i.length);for(let t=0;t<i.length;t++)r[t]=i[t].join("");return e.lines=r,e.graphemeLines=i,e}getMinWidth(){return Math.max(this.minWidth,this.dynamicMinWidth)}_removeExtraneousStyles(){let t=new Map;for(let e in this._styleMap){let i=parseInt(e,10);if(this._textLines[i]){let i=this._styleMap[e].line;t.set(`${i}`,!0)}}for(let e in this.styles)t.has(e)||delete this.styles[e]}toObject(t=[]){return super.toObject(["minWidth","splitByGrapheme",...t])}};p(la,"type","Textbox"),p(la,"textLayoutProperties",[...aa.textLayoutProperties,"width"]),p(la,"ownDefaults",{minWidth:20,dynamicMinWidth:2,lockScalingFlip:!0,noScaleCache:!1,_wordJoiners:/[ \t\r]/,splitByGrapheme:!1}),at.setClass(la);var ha=class extends rn{shouldPerformLayout(t){return!!t.target.clipPath&&super.shouldPerformLayout(t)}shouldLayoutClipPath(){return!1}calcLayoutResult(t,e){let{target:i}=t,{clipPath:r,group:s}=i;if(!r||!this.shouldPerformLayout(t))return;let{width:n,height:o}=Se(en(i,r)),a=new gt(n,o);if(r.absolutePositioned)return{center:Pe(r.getRelativeCenterPoint(),void 0,s?s.calcTransformMatrix():void 0),size:a};{let s=r.getRelativeCenterPoint().transform(i.calcOwnMatrix(),!0);if(this.shouldPerformLayout(t)){let{center:i=new gt,correction:r=new gt}=this.calcBoundingBox(e,t)||{};return{center:i.add(s),correction:r.subtract(s),size:a}}return{center:i.getRelativeCenterPoint().add(s),size:a}}}};p(ha,"type","clip-path"),at.setClass(ha);var ca=class extends rn{getInitialSize({target:t},{size:e}){return new gt(t.width||e.x,t.height||e.y)}};p(ca,"type","fixed"),at.setClass(ca);var ua=class extends on{subscribeTargets(t){let e=t.target;t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{t.layoutManager.subscribeTargets({target:t,targets:[e]})})}unsubscribeTargets(t){let e=t.target,i=e.getObjects();t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{!i.some(e=>e.parent===t)&&t.layoutManager.unsubscribeTargets({target:t,targets:[e]})})}},da=class t extends ln{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(i);let{left:r,top:s,layoutManager:n}=i;this.groupInit(e,{left:r,top:s,layoutManager:n??new ua})}_shouldSetNestedCoords(){return!0}__objectSelectionMonitor(){}multiSelectAdd(...t){"selection-order"===this.multiSelectionStacking?this.add(...t):t.forEach(t=>{let e=this._objects.findIndex(e=>e.isInFrontOf(t)),i=-1===e?this.size():e;this.insertAt(i,t)})}canEnterGroup(t){return this.getObjects().some(e=>e.isDescendantOf(t)||t.isDescendantOf(e))?(b("error","ActiveSelection: circular object trees are not supported, this call has no effect"),!1):super.canEnterGroup(t)}enterGroup(t,e){t.parent&&t.parent===t.group?t.parent._exitGroup(t):t.group&&t.parent!==t.group&&t.group.remove(t),this._enterGroup(t,e)}exitGroup(t,e){this._exitGroup(t,e),t.parent&&t.parent._enterGroup(t,!0)}_onAfterObjectsChange(t,e){super._onAfterObjectsChange(t,e);let i=new Set;e.forEach(t=>{let{parent:e}=t;e&&i.add(e)}),"removed"===t?i.forEach(t=>{t._onAfterObjectsChange(tn,e)}):i.forEach(t=>{t._set("dirty",!0)})}onDeselect(){return this.removeAll(),!1}toString(){return`#<ActiveSelection: (${this.complexity()})>`}shouldCache(){return!1}isOnACache(){return!1}_renderControls(t,e,i){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;let r={hasControls:!1,...i,forActiveSelection:!0};for(let e=0;e<this._objects.length;e++)this._objects[e]._renderControls(t,r);super._renderControls(t,e),t.restore()}};p(da,"type","ActiveSelection"),p(da,"ownDefaults",{multiSelectionStacking:"canvas-stacking"}),at.setClass(da),at.setClass(da,"activeSelection");var ga=class{constructor(){p(this,"resources",{})}applyFilters(t,e,i,r,s){let n=s.getContext("2d",{willReadFrequently:!0,desynchronized:!0});if(!n)return;n.drawImage(e,0,0,i,r);let o={sourceWidth:i,sourceHeight:r,imageData:n.getImageData(0,0,i,r),originalEl:e,originalImageData:n.getImageData(0,0,i,r),canvasEl:s,ctx:n,filterBackend:this};t.forEach(t=>{t.applyTo(o)});let{imageData:a}=o;return a.width===i&&a.height===r||(s.width=a.width,s.height=a.height),n.putImageData(a,0,0),o}},fa=class{constructor({tileSize:t=y.textureSize}={}){p(this,"aPosition",new Float32Array([0,0,0,1,1,0,1,1])),p(this,"resources",{}),this.tileSize=t,this.setupGLContext(t,t),this.captureGPUInfo()}setupGLContext(t,e){this.dispose(),this.createWebGLCanvas(t,e)}createWebGLCanvas(t,e){let i=Tt({width:t,height:e}),r=i.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,depth:!1,stencil:!1,antialias:!1});r&&(r.clearColor(0,0,0,0),this.canvas=i,this.gl=r)}applyFilters(t,e,i,r,s,n){let o,a=this.gl,l=s.getContext("2d");if(!a||!l)return;n&&(o=this.getCachedTexture(n,e));let h={originalWidth:e.width||e.naturalWidth||0,originalHeight:e.height||e.naturalHeight||0,sourceWidth:i,sourceHeight:r,destinationWidth:i,destinationHeight:r,context:a,sourceTexture:this.createTexture(a,i,r,o?void 0:e),targetTexture:this.createTexture(a,i,r),originalTexture:o||this.createTexture(a,i,r,o?void 0:e),passes:t.length,webgl:!0,aPosition:this.aPosition,programCache:this.programCache,pass:0,filterBackend:this,targetCanvas:s},c=a.createFramebuffer();return a.bindFramebuffer(a.FRAMEBUFFER,c),t.forEach(t=>{t&&t.applyTo(h)}),function(t){let e=t.targetCanvas,i=e.width,r=e.height,s=t.destinationWidth,n=t.destinationHeight;i===s&&r===n||(e.width=s,e.height=n)}(h),this.copyGLTo2D(a,h),a.bindTexture(a.TEXTURE_2D,null),a.deleteTexture(h.sourceTexture),a.deleteTexture(h.targetTexture),a.deleteFramebuffer(c),l.setTransform(1,0,0,1,0,0),h}dispose(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()}clearWebGLCaches(){this.programCache={},this.textureCache={}}createTexture(t,e,i,r,s){let{NEAREST:n,TEXTURE_2D:o,RGBA:a,UNSIGNED_BYTE:l,CLAMP_TO_EDGE:h,TEXTURE_MAG_FILTER:c,TEXTURE_MIN_FILTER:u,TEXTURE_WRAP_S:d,TEXTURE_WRAP_T:g}=t,f=t.createTexture();return t.bindTexture(o,f),t.texParameteri(o,c,s||n),t.texParameteri(o,u,s||n),t.texParameteri(o,d,h),t.texParameteri(o,g,h),r?t.texImage2D(o,0,a,a,l,r):t.texImage2D(o,0,a,e,i,0,a,l,null),f}getCachedTexture(t,e,i){let{textureCache:r}=this;if(r[t])return r[t];{let s=this.createTexture(this.gl,e.width,e.height,e,i);return s&&(r[t]=s),s}}evictCachesForKey(t){this.textureCache[t]&&(this.gl.deleteTexture(this.textureCache[t]),delete this.textureCache[t])}copyGLTo2D(t,e){let i=t.canvas,r=e.targetCanvas,s=r.getContext("2d");if(!s)return;s.translate(0,r.height),s.scale(1,-1);let n=i.height-r.height;s.drawImage(i,0,n,r.width,r.height,0,0,r.width,r.height)}copyGLTo2DPutImageData(t,e){let i=e.targetCanvas.getContext("2d"),r=e.destinationWidth,s=e.destinationHeight,n=r*s*4;if(!i)return;let o=new Uint8Array(this.imageBuffer,0,n),a=new Uint8ClampedArray(this.imageBuffer,0,n);t.readPixels(0,0,r,s,t.RGBA,t.UNSIGNED_BYTE,o);let l=new ImageData(a,r,s);i.putImageData(l,0,0)}captureGPUInfo(){if(this.gpuInfo)return this.gpuInfo;let t=this.gl,e={renderer:"",vendor:""};if(!t)return e;let i=t.getExtension("WEBGL_debug_renderer_info");if(i){let r=t.getParameter(i.UNMASKED_RENDERER_WEBGL),s=t.getParameter(i.UNMASKED_VENDOR_WEBGL);r&&(e.renderer=r.toLowerCase()),s&&(e.vendor=s.toLowerCase())}return this.gpuInfo=e,e}};let pa;function ma(t=!0){return!pa&&t&&(pa=function(){let{WebGLProbe:t}=T();return t.queryWebGL(Ct()),y.enableGLFiltering&&t.isSupported(y.textureSize)?new fa({tileSize:y.textureSize}):new ga}()),pa}const ya=["cropX","cropY"];var ba=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(),p(this,"_lastScaleX",1),p(this,"_lastScaleY",1),p(this,"_filterScalingX",1),p(this,"_filterScalingY",1),this.filters=[],Object.assign(this,t.ownDefaults),this.setOptions(i),this.cacheKey=`texture${xt()}`,this.setElement("string"==typeof e?(this.canvas&&ne(this.canvas.getElement())||O()).getElementById(e):e,i)}getElement(){return this._element}setElement(t,e={}){this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(e),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){let e=ma(!1);e instanceof fa&&e.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach(t=>{let e=this[t];e&&T().dispose(e),this[t]=void 0})}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){let t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;let e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,-i),t.lineTo(e,-i),t.lineTo(e,i),t.lineTo(-e,i),t.lineTo(-e,-i),t.closePath()}toObject(t=[]){let e=[];return this.filters.forEach(t=>{t&&e.push(t.toObject())}),{...super.toObject([...ya,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:e,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width<this._element.width||this.height<this._element.height}_toSVG(){let t=[],e=this._element,i=-this.width/2,r=-this.height/2,s=[],n=[],o="",a="";if(!e)return[];if(this.hasCrop()){let t=xt();s.push('<clipPath id="imageCrop_'+t+'">\n','\t<rect x="'+i+'" y="'+r+'" width="'+fe(this.width)+'" height="'+fe(this.height)+'" />\n',"</clipPath>\n"),o=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t<image ","COMMON_PARTS",`xlink:href="${fe(this.getSrc(!0))}" x="${i-this.cropX}" y="${r-this.cropY}" width="${e.width||e.naturalWidth}" height="${e.height||e.naturalHeight}"${a}${o}></image>\n`),this.stroke||this.strokeDashArray){let t=this.fill;this.fill=null,n=[`\t<rect x="${i}" y="${r}" width="${fe(this.width)}" height="${fe(this.height)}" style="${this.getSvgStyles()}" />\n`],this.fill=t}return s="fill"===this.paintFirst?s.concat(t,n):s.concat(n,t),s}getSrc(t){let e=t?this._element:this._originalElement;return e?e.toDataURL?e.toDataURL():this.srcFromAttribute?e.getAttribute("src")||"":e.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t,{crossOrigin:e,signal:i}={}){return Gt(t,{crossOrigin:e,signal:i}).then(t=>{void 0!==e&&this.set({crossOrigin:e}),this.setElement(t)})}toString(){return`#<Image: { src: "${this.getSrc()}" }>`}applyResizeFilters(){let t=this.resizeFilter,e=this.minimumScaleTrigger,i=this.getTotalObjectScaling(),r=i.x,s=i.y,n=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||r>e&&s>e)return this._element=n,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=r,void(this._lastScaleY=s);let o=Tt(n),{width:a,height:l}=n;this._element=o,this._lastScaleX=t.scaleX=r,this._lastScaleY=t.scaleY=s,ma().applyFilters([t],n,a,l,this._element),this._filterScalingX=o.width/this._originalElement.width,this._filterScalingY=o.height/this._originalElement.height}applyFilters(t=this.filters||[]){if(t=t.filter(t=>t&&!t.isNeutralState()),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);let e=this._originalElement,i=e.naturalWidth||e.width,r=e.naturalHeight||e.height;if(this._element===this._originalElement){let t=Tt({width:i,height:r});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,i,r),this._lastScaleX=1,this._lastScaleY=1);ma().applyFilters(t,this._originalElement,i,r,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){let e=this._element;if(!e)return;let i=this._filterScalingX,r=this._filterScalingY,s=this.width,n=this.height,o=Math.max(this.cropX,0),a=Math.max(this.cropY,0),l=e.naturalWidth||e.width,h=e.naturalHeight||e.height,c=o*i,u=a*r,d=Math.min(s*i,l-c),g=Math.min(n*r,h-u),f=-s/2,p=-n/2,m=Math.min(s,l/i-o),y=Math.min(n,h/r-a);e&&t.drawImage(e,c,u,d,g,f,p,m,y)}_needsResize(){let t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight({width:t,height:e}={}){let i=this.getOriginalSize();this.width=t||i.width,this.height=e||i.height}parsePreserveAspectRatioAttribute(){let t,e=mi(this.preserveAspectRatio||""),i=this.width,r=this.height,s={width:i,height:r},n=this._element.width,o=this._element.height,a=1,l=1,h=0,c=0,u=0,d=0;return!e||"none"===e.alignX&&"none"===e.alignY?(a=i/n,l=r/o):("meet"===e.meetOrSlice&&(a=l=cn(this._element,s),t=(i-n*a)/2,"Min"===e.alignX&&(h=-t),"Max"===e.alignX&&(h=t),t=(r-o*l)/2,"Min"===e.alignY&&(c=-t),"Max"===e.alignY&&(c=t)),"slice"===e.meetOrSlice&&(a=l=un(this._element,s),t=n-i/a,"Mid"===e.alignX&&(u=t/2),"Max"===e.alignX&&(u=t),t=o-r/l,"Mid"===e.alignY&&(d=t/2),"Max"===e.alignY&&(d=t),n=i/a,o=r/l)),{width:n,height:o,scaleX:a,scaleY:l,offsetLeft:h,offsetTop:c,cropX:u,cropY:d}}static fromObject({filters:t,resizeFilter:e,src:i,crossOrigin:r,type:s,...n},o){return Promise.all([Gt(i,{...o,crossOrigin:r}),t&&Ut(t,o),e?Ut([e],o):[],qt(n,o)]).then(([t,e=[],[r],s={}])=>new this(t,{...n,src:i,filters:e,resizeFilter:r,...s}))}static fromURL(t,{crossOrigin:e=null,signal:i}={},r){return Gt(t,{crossOrigin:e,signal:i}).then(t=>new this(t,r))}static async fromElement(t,e={},i){let r=Ks(t,this.ATTRIBUTE_NAMES,i);return this.fromURL(r["xlink:href"]||r.href,e,r).catch(t=>(b("log","Unable to parse Image",t),null))}};p(ba,"type","Image"),p(ba,"cacheProperties",[...Xi,...ya]),p(ba,"ownDefaults",{strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0}),p(ba,"ATTRIBUTE_NAMES",[...Ds,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),at.setClass(ba),at.setSVGClass(ba),_n(["pattern","defs","symbol","metadata","clipPath","mask","desc"]);const _a=t=>void 0!==t.webgl,va="precision highp float",xa=`\n    ${va};\n    varying vec2 vTexCoord;\n    uniform sampler2D uTexture;\n    void main() {\n      gl_FragColor = texture2D(uTexture, vTexCoord);\n    }`,Ca=new RegExp(va,"g");var wa=class{get type(){return this.constructor.type}constructor({type:t,...e}={}){Object.assign(this,this.constructor.defaults,e)}getFragmentSource(){return xa}getVertexSource(){return"\n    attribute vec2 aPosition;\n    varying vec2 vTexCoord;\n    void main() {\n      vTexCoord = aPosition;\n      gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n    }"}createProgram(t,e=this.getFragmentSource(),i=this.getVertexSource()){let{WebGLProbe:{GLPrecision:r="highp"}}=T();"highp"!==r&&(e=e.replace(Ca,va.replace("highp",r)));let s=t.createShader(t.VERTEX_SHADER),n=t.createShader(t.FRAGMENT_SHADER),o=t.createProgram();if(!s||!n||!o)throw new _("Vertex, fragment shader or program creation error");if(t.shaderSource(s,i),t.compileShader(s),!t.getShaderParameter(s,t.COMPILE_STATUS))throw new _(`Vertex shader compile error for ${this.type}: ${t.getShaderInfoLog(s)}`);if(t.shaderSource(n,e),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new _(`Fragment shader compile error for ${this.type}: ${t.getShaderInfoLog(n)}`);if(t.attachShader(o,s),t.attachShader(o,n),t.linkProgram(o),!t.getProgramParameter(o,t.LINK_STATUS))throw new _(`Shader link error for "${this.type}" ${t.getProgramInfoLog(o)}`);let a=this.getUniformLocations(t,o)||{};return a.uStepW=t.getUniformLocation(o,"uStepW"),a.uStepH=t.getUniformLocation(o,"uStepH"),{program:o,attributeLocations:this.getAttributeLocations(t,o),uniformLocations:a}}getAttributeLocations(t,e){return{aPosition:t.getAttribLocation(e,"aPosition")}}getUniformLocations(t,e){let i=this.constructor.uniformLocations,r={};for(let s=0;s<i.length;s++)r[i[s]]=t.getUniformLocation(e,i[s]);return r}sendAttributeData(t,e,i){let r=e.aPosition,s=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,s),t.enableVertexAttribArray(r),t.vertexAttribPointer(r,2,t.FLOAT,!1,0,0),t.bufferData(t.ARRAY_BUFFER,i,t.STATIC_DRAW)}_setupFrameBuffer(t){let e=t.context;if(t.passes>1){let i=t.destinationWidth,r=t.destinationHeight;t.sourceWidth===i&&t.sourceHeight===r||(e.deleteTexture(t.targetTexture),t.targetTexture=t.filterBackend.createTexture(e,i,r)),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.targetTexture,0)}else e.bindFramebuffer(e.FRAMEBUFFER,null),e.finish()}_swapTextures(t){t.passes--,t.pass++;let e=t.targetTexture;t.targetTexture=t.sourceTexture,t.sourceTexture=e}isNeutralState(t){return!1}applyTo(t){_a(t)?(this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){}getCacheKey(){return this.type}retrieveShader(t){let e=this.getCacheKey();return t.programCache[e]||(t.programCache[e]=this.createProgram(t.context)),t.programCache[e]}applyToWebGL(t){let e=t.context,i=this.retrieveShader(t);0===t.pass&&t.originalTexture?e.bindTexture(e.TEXTURE_2D,t.originalTexture):e.bindTexture(e.TEXTURE_2D,t.sourceTexture),e.useProgram(i.program),this.sendAttributeData(e,i.attributeLocations,t.aPosition),e.uniform1f(i.uniformLocations.uStepW,1/t.sourceWidth),e.uniform1f(i.uniformLocations.uStepH,1/t.sourceHeight),this.sendUniformData(e,i.uniformLocations),e.viewport(0,0,t.destinationWidth,t.destinationHeight),e.drawArrays(e.TRIANGLE_STRIP,0,4)}bindAdditionalTexture(t,e,i){t.activeTexture(i),t.bindTexture(t.TEXTURE_2D,e),t.activeTexture(t.TEXTURE0)}unbindAdditionalTexture(t,e){t.activeTexture(e),t.bindTexture(t.TEXTURE_2D,null),t.activeTexture(t.TEXTURE0)}sendUniformData(t,e){}createHelpLayer(t){if(!t.helpLayer){let{sourceWidth:e,sourceHeight:i}=t;t.helpLayer=Tt({width:e,height:i})}}toObject(){let t=Object.keys(this.constructor.defaults||{});return{type:this.type,...t.reduce((t,e)=>(t[e]=this[e],t),{})}}toJSON(){return this.toObject()}static async fromObject({type:t,...e},i){return new this(e)}};p(wa,"type","BaseFilter"),p(wa,"uniformLocations",[]);const Sa={multiply:"gl_FragColor.rgb *= uColor.rgb;\n",screen:"gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n",add:"gl_FragColor.rgb += uColor.rgb;\n",difference:"gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n",subtract:"gl_FragColor.rgb -= uColor.rgb;\n",lighten:"gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n",darken:"gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n",exclusion:"gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n",overlay:"\n    if (uColor.r < 0.5) {\n      gl_FragColor.r *= 2.0 * uColor.r;\n    } else {\n      gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n    }\n    if (uColor.g < 0.5) {\n      gl_FragColor.g *= 2.0 * uColor.g;\n    } else {\n      gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n    }\n    if (uColor.b < 0.5) {\n      gl_FragColor.b *= 2.0 * uColor.b;\n    } else {\n      gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n    }\n    ",tint:"\n    gl_FragColor.rgb *= (1.0 - uColor.a);\n    gl_FragColor.rgb += uColor.rgb;\n    "};var Ta=class extends wa{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return`\n      precision highp float;\n      uniform sampler2D uTexture;\n      uniform vec4 uColor;\n      varying vec2 vTexCoord;\n      void main() {\n        vec4 color = texture2D(uTexture, vTexCoord);\n        gl_FragColor = color;\n        if (color.a > 0.0) {\n          ${Sa[this.mode]}\n        }\n      }\n      `}applyTo2d({imageData:{data:t}}){let e=new gi(this.color).getSource(),i=this.alpha,r=e[0]*i,s=e[1]*i,n=e[2]*i,o=1-i;for(let e=0;e<t.length;e+=4){let i,a,l,h=t[e],c=t[e+1],u=t[e+2];switch(this.mode){case"multiply":i=h*r/255,a=c*s/255,l=u*n/255;break;case"screen":i=255-(255-h)*(255-r)/255,a=255-(255-c)*(255-s)/255,l=255-(255-u)*(255-n)/255;break;case"add":i=h+r,a=c+s,l=u+n;break;case"difference":i=Math.abs(h-r),a=Math.abs(c-s),l=Math.abs(u-n);break;case"subtract":i=h-r,a=c-s,l=u-n;break;case"darken":i=Math.min(h,r),a=Math.min(c,s),l=Math.min(u,n);break;case"lighten":i=Math.max(h,r),a=Math.max(c,s),l=Math.max(u,n);break;case"overlay":i=r<128?2*h*r/255:255-2*(255-h)*(255-r)/255,a=s<128?2*c*s/255:255-2*(255-c)*(255-s)/255,l=n<128?2*u*n/255:255-2*(255-u)*(255-n)/255;break;case"exclusion":i=r+h-2*r*h/255,a=s+c-2*s*c/255,l=n+u-2*n*u/255;break;case"tint":i=r+h*o,a=s+c*o,l=n+u*o}t[e]=i,t[e+1]=a,t[e+2]=l}}sendUniformData(t,e){let i=new gi(this.color).getSource();i[0]=this.alpha*i[0]/255,i[1]=this.alpha*i[1]/255,i[2]=this.alpha*i[2]/255,i[3]=this.alpha,t.uniform4fv(e.uColor,i)}};p(Ta,"defaults",{color:"#F95C63",mode:"multiply",alpha:1}),p(Ta,"type","BlendColor"),p(Ta,"uniformLocations",["uColor"]),at.setClass(Ta);const Oa={multiply:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform sampler2D uImage;\n    uniform vec4 uColor;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      vec4 color2 = texture2D(uImage, vTexCoord2);\n      color.rgba *= color2.rgba;\n      gl_FragColor = color;\n    }\n    ",mask:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform sampler2D uImage;\n    uniform vec4 uColor;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      vec4 color2 = texture2D(uImage, vTexCoord2);\n      color.a = color2.a;\n      gl_FragColor = color;\n    }\n    "};var ka=class extends wa{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return Oa[this.mode]}getVertexSource(){return"\n    attribute vec2 aPosition;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    uniform mat3 uTransformMatrix;\n    void main() {\n      vTexCoord = aPosition;\n      vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n      gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n    }\n    "}applyToWebGL(t){let e=t.context,i=this.createTexture(t.filterBackend,this.image);this.bindAdditionalTexture(e,i,e.TEXTURE1),super.applyToWebGL(t),this.unbindAdditionalTexture(e,e.TEXTURE1)}createTexture(t,e){return t.getCachedTexture(e.cacheKey,e.getElement())}calculateMatrix(){let t=this.image,{width:e,height:i}=t.getElement();return[1/t.scaleX,0,0,0,1/t.scaleY,0,-t.left/e,-t.top/i,1]}applyTo2d({imageData:{data:t,width:e,height:i},filterBackend:{resources:r}}){let s=this.image;r.blendImage||(r.blendImage=Ct());let n=r.blendImage,o=n.getContext("2d");n.width!==e||n.height!==i?(n.width=e,n.height=i):o.clearRect(0,0,e,i),o.setTransform(s.scaleX,0,0,s.scaleY,s.left,s.top),o.drawImage(s.getElement(),0,0,e,i);let a=o.getImageData(0,0,e,i).data;for(let e=0;e<t.length;e+=4){let i=t[e],r=t[e+1],s=t[e+2],n=t[e+3],o=a[e],l=a[e+1],h=a[e+2],c=a[e+3];switch(this.mode){case"multiply":t[e]=i*o/255,t[e+1]=r*l/255,t[e+2]=s*h/255,t[e+3]=n*c/255;break;case"mask":t[e+3]=c}}}sendUniformData(t,e){let i=this.calculateMatrix();t.uniform1i(e.uImage,1),t.uniformMatrix3fv(e.uTransformMatrix,!1,i)}toObject(){return{...super.toObject(),image:this.image&&this.image.toObject()}}static async fromObject({type:t,image:e,...i},r){return ba.fromObject(e,r).then(t=>new this({...i,image:t}))}};p(ka,"type","BlendImage"),p(ka,"defaults",{mode:"multiply",alpha:1}),p(ka,"uniformLocations",["uTransformMatrix","uImage"]),at.setClass(ka);var Da=class extends wa{getFragmentSource(){return"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform vec2 uDelta;\n    varying vec2 vTexCoord;\n    const float nSamples = 15.0;\n    vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n    float random(vec3 scale) {\n      /* use the fragment position for a different seed per-pixel */\n      return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n    }\n    void main() {\n      vec4 color = vec4(0.0);\n      float totalC = 0.0;\n      float totalA = 0.0;\n      float offset = random(v3offset);\n      for (float t = -nSamples; t <= nSamples; t++) {\n        float percent = (t + offset - 0.5) / nSamples;\n        vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n        float weight = 1.0 - abs(percent);\n        float alpha = weight * sample.a;\n        color.rgb += sample.rgb * alpha;\n        color.a += alpha;\n        totalA += weight;\n        totalC += alpha;\n      }\n      gl_FragColor.rgb = color.rgb / totalC;\n      gl_FragColor.a = color.a / totalA;\n    }\n  "}applyTo(t){_a(t)?(this.aspectRatio=t.sourceWidth/t.sourceHeight,t.passes++,this._setupFrameBuffer(t),this.horizontal=!0,this.applyToWebGL(t),this._swapTextures(t),this._setupFrameBuffer(t),this.horizontal=!1,this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d({imageData:{data:t,width:e,height:i}}){this.aspectRatio=e/i,this.horizontal=!0;let r=this.getBlurValue()*e,s=new Uint8ClampedArray(t),n=4*e;for(let e=0;e<t.length;e+=4){let i=0,o=0,a=0,l=0,h=0,c=e-e%n,u=c+n;for(let s=-14;s<15;s++){let n=s/15,d=4*Math.floor(r*n),g=1-Math.abs(n),f=e+d;f<c?f=c:f>u&&(f=u);let p=t[f+3]*g;i+=t[f]*p,o+=t[f+1]*p,a+=t[f+2]*p,l+=p,h+=g}s[e]=i/l,s[e+1]=o/l,s[e+2]=a/l,s[e+3]=l/h}this.horizontal=!1,r=this.getBlurValue()*i;for(let e=0;e<s.length;e+=4){let i=0,o=0,a=0,l=0,h=0,c=e%n,u=s.length-n+c;for(let t=-14;t<15;t++){let d=t/15,g=Math.floor(r*d)*n,f=1-Math.abs(d),p=e+g;p<c?p=c:p>u&&(p=u);let m=s[p+3]*f;i+=s[p]*m,o+=s[p+1]*m,a+=s[p+2]*m,l+=m,h+=f}t[e]=i/l,t[e+1]=o/l,t[e+2]=a/l,t[e+3]=l/h}}sendUniformData(t,e){let i=this.chooseRightDelta();t.uniform2fv(e.uDelta,i)}isNeutralState(){return 0===this.blur}getBlurValue(){let t=1,{horizontal:e,aspectRatio:i}=this;return e?i>1&&(t=1/i):i<1&&(t=i),t*this.blur*.12}chooseRightDelta(){let t=this.getBlurValue();return this.horizontal?[t,0]:[0,t]}};p(Da,"type","Blur"),p(Da,"defaults",{blur:0}),p(Da,"uniformLocations",["uDelta"]),at.setClass(Da);var Ma=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uBrightness;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color.rgb += uBrightness;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=Math.round(255*this.brightness);for(let i=0;i<t.length;i+=4)t[i]+=e,t[i+1]+=e,t[i+2]+=e}isNeutralState(){return 0===this.brightness}sendUniformData(t,e){t.uniform1f(e.uBrightness,this.brightness)}};p(Ma,"type","Brightness"),p(Ma,"defaults",{brightness:0}),p(Ma,"uniformLocations",["uBrightness"]),at.setClass(Ma);const ja={matrix:[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],colorsOnly:!0};var Ea=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  varying vec2 vTexCoord;\n  uniform mat4 uColorMatrix;\n  uniform vec4 uConstants;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color *= uColorMatrix;\n    color += uConstants;\n    gl_FragColor = color;\n  }"}applyTo2d(t){let e=t.imageData.data,i=this.matrix,r=this.colorsOnly;for(let t=0;t<e.length;t+=4){let s=e[t],n=e[t+1],o=e[t+2];if(e[t]=s*i[0]+n*i[1]+o*i[2]+255*i[4],e[t+1]=s*i[5]+n*i[6]+o*i[7]+255*i[9],e[t+2]=s*i[10]+n*i[11]+o*i[12]+255*i[14],!r){let r=e[t+3];e[t]+=r*i[3],e[t+1]+=r*i[8],e[t+2]+=r*i[13],e[t+3]=s*i[15]+n*i[16]+o*i[17]+r*i[18]+255*i[19]}}}sendUniformData(t,e){let i=this.matrix,r=[i[0],i[1],i[2],i[3],i[5],i[6],i[7],i[8],i[10],i[11],i[12],i[13],i[15],i[16],i[17],i[18]],s=[i[4],i[9],i[14],i[19]];t.uniformMatrix4fv(e.uColorMatrix,!1,r),t.uniform4fv(e.uConstants,s)}toObject(){return{...super.toObject(),matrix:[...this.matrix]}}};function Pa(t,e){var i;let r=(p(i=class extends Ea{toObject(){return{type:this.type,colorsOnly:this.colorsOnly}}},"type",t),p(i,"defaults",{colorsOnly:!1,matrix:e}),i);return at.setClass(r,t),r}p(Ea,"type","ColorMatrix"),p(Ea,"defaults",ja),p(Ea,"uniformLocations",["uColorMatrix","uConstants"]),at.setClass(Ea);const Aa=Pa("Brownie",[.5997,.34553,-.27082,0,.186,-.0377,.86095,.15059,0,-.1449,.24113,-.07441,.44972,0,-.02965,0,0,0,1,0]),Fa=Pa("Vintage",[.62793,.32021,-.03965,0,.03784,.02578,.64411,.03259,0,.02926,.0466,-.08512,.52416,0,.02023,0,0,0,1,0]),La=Pa("Kodachrome",[1.12855,-.39673,-.03992,0,.24991,-.16404,1.08352,-.05498,0,.09698,-.16786,-.56034,1.60148,0,.13972,0,0,0,1,0]),Ia=Pa("Technicolor",[1.91252,-.85453,-.09155,0,.04624,-.30878,1.76589,-.10601,0,-.27589,-.2311,-.75018,1.84759,0,.12137,0,0,0,1,0]),Ra=Pa("Polaroid",[1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0]),Ba=Pa("Sepia",[.393,.769,.189,0,0,.349,.686,.168,0,0,.272,.534,.131,0,0,0,0,0,1,0]),$a=Pa("BlackWhite",[1.5,1.5,1.5,0,-1,1.5,1.5,1.5,0,-1,1.5,1.5,1.5,0,-1,0,0,0,1,0]);var Xa=class extends wa{constructor(t={}){super(t),this.subFilters=t.subFilters||[]}applyTo(t){_a(t)&&(t.passes+=this.subFilters.length-1),this.subFilters.forEach(e=>{e.applyTo(t)})}toObject(){return{type:this.type,subFilters:this.subFilters.map(t=>t.toObject())}}isNeutralState(){return!this.subFilters.some(t=>!t.isNeutralState())}static fromObject(t,e){return Promise.all((t.subFilters||[]).map(t=>at.getClass(t.type).fromObject(t,e))).then(t=>new this({subFilters:t}))}};p(Xa,"type","Composed"),at.setClass(Xa);var Ya=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uContrast;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n    color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n    gl_FragColor = color;\n  }"}isNeutralState(){return 0===this.contrast}applyTo2d({imageData:{data:t}}){let e=Math.floor(255*this.contrast),i=259*(e+255)/(255*(259-e));for(let e=0;e<t.length;e+=4)t[e]=i*(t[e]-128)+128,t[e+1]=i*(t[e+1]-128)+128,t[e+2]=i*(t[e+2]-128)+128}sendUniformData(t,e){t.uniform1f(e.uContrast,this.contrast)}};p(Ya,"type","Contrast"),p(Ya,"defaults",{contrast:0}),p(Ya,"uniformLocations",["uContrast"]),at.setClass(Ya);const Wa={Convolute_3_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[9];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 3.0; h+=1.0) {\n        for (float w = 0.0; w < 3.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_3_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[9];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 3.0; h+=1.0) {\n        for (float w = 0.0; w < 3.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_5_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[25];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 5.0; h+=1.0) {\n        for (float w = 0.0; w < 5.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_5_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[25];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 5.0; h+=1.0) {\n        for (float w = 0.0; w < 5.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_7_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[49];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 7.0; h+=1.0) {\n        for (float w = 0.0; w < 7.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_7_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[49];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 7.0; h+=1.0) {\n        for (float w = 0.0; w < 7.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_9_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[81];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 9.0; h+=1.0) {\n        for (float w = 0.0; w < 9.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_9_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[81];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 9.0; h+=1.0) {\n        for (float w = 0.0; w < 9.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    "};var Na=class extends wa{getCacheKey(){return`${this.type}_${Math.sqrt(this.matrix.length)}_${+!!this.opaque}`}getFragmentSource(){return Wa[this.getCacheKey()]}applyTo2d(t){let e,i,r,s,n,o,a,l,h,c,u,d,g,f=t.imageData,p=f.data,m=this.matrix,y=Math.round(Math.sqrt(m.length)),b=Math.floor(y/2),_=f.width,v=f.height,x=t.ctx.createImageData(_,v),C=x.data,w=+!!this.opaque;for(u=0;u<v;u++)for(c=0;c<_;c++){for(n=4*(u*_+c),e=0,i=0,r=0,s=0,g=0;g<y;g++)for(d=0;d<y;d++)a=u+g-b,o=c+d-b,a<0||a>=v||o<0||o>=_||(l=4*(a*_+o),h=m[g*y+d],e+=p[l]*h,i+=p[l+1]*h,r+=p[l+2]*h,w||(s+=p[l+3]*h));C[n]=e,C[n+1]=i,C[n+2]=r,C[n+3]=w?p[n+3]:s}t.imageData=x}sendUniformData(t,e){t.uniform1fv(e.uMatrix,this.matrix)}toObject(){return{...super.toObject(),opaque:this.opaque,matrix:[...this.matrix]}}};p(Na,"type","Convolute"),p(Na,"defaults",{opaque:!1,matrix:[0,0,0,0,1,0,0,0,0]}),p(Na,"uniformLocations",["uMatrix","uOpaque","uHalfSize","uSize"]),at.setClass(Na);const Va="Gamma";var za=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform vec3 uGamma;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    vec3 correction = (1.0 / uGamma);\n    color.r = pow(color.r, correction.r);\n    color.g = pow(color.g, correction.g);\n    color.b = pow(color.b, correction.b);\n    gl_FragColor = color;\n    gl_FragColor.rgb *= color.a;\n  }\n"}constructor(t={}){super(t),this.gamma=t.gamma||this.constructor.defaults.gamma.concat()}applyTo2d({imageData:{data:t}}){let e=this.gamma,i=1/e[0],r=1/e[1],s=1/e[2];this.rgbValues||(this.rgbValues={r:new Uint8Array(256),g:new Uint8Array(256),b:new Uint8Array(256)});let n=this.rgbValues;for(let t=0;t<256;t++)n.r[t]=255*(t/255)**i,n.g[t]=255*(t/255)**r,n.b[t]=255*(t/255)**s;for(let e=0;e<t.length;e+=4)t[e]=n.r[t[e]],t[e+1]=n.g[t[e+1]],t[e+2]=n.b[t[e+2]]}sendUniformData(t,e){t.uniform3fv(e.uGamma,this.gamma)}isNeutralState(){let{gamma:t}=this;return 1===t[0]&&1===t[1]&&1===t[2]}toObject(){return{type:Va,gamma:this.gamma.concat()}}};p(za,"type",Va),p(za,"defaults",{gamma:[1,1,1]}),p(za,"uniformLocations",["uGamma"]),at.setClass(za);const Ha={average:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      float average = (color.r + color.b + color.g) / 3.0;\n      gl_FragColor = vec4(average, average, average, color.a);\n    }\n    ",lightness:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform int uMode;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 col = texture2D(uTexture, vTexCoord);\n      float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n      gl_FragColor = vec4(average, average, average, col.a);\n    }\n    ",luminosity:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform int uMode;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 col = texture2D(uTexture, vTexCoord);\n      float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n      gl_FragColor = vec4(average, average, average, col.a);\n    }\n    "};var Ga=class extends wa{applyTo2d({imageData:{data:t}}){for(let e,i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2];switch(this.mode){case"average":e=(r+s+n)/3;break;case"lightness":e=(Math.min(r,s,n)+Math.max(r,s,n))/2;break;case"luminosity":e=.21*r+.72*s+.07*n}t[i+2]=t[i+1]=t[i]=e}}getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return Ha[this.mode]}sendUniformData(t,e){t.uniform1i(e.uMode,1)}isNeutralState(){return!1}};p(Ga,"type","Grayscale"),p(Ga,"defaults",{mode:"average"}),p(Ga,"uniformLocations",["uMode"]),at.setClass(Ga);const Ua={...ja,rotation:0};var qa=class extends Ea{calculateMatrix(){let t=this.rotation*Math.PI,e=ut(t),i=dt(t),r=1/3,s=Math.sqrt(r)*i,n=1-e;this.matrix=[e+n/3,r*n-s,r*n+s,0,0,r*n+s,e+r*n,r*n-s,0,0,r*n-s,r*n+s,e+r*n,0,0,0,0,0,1,0]}isNeutralState(){return 0===this.rotation}applyTo(t){this.calculateMatrix(),super.applyTo(t)}toObject(){return{type:this.type,rotation:this.rotation}}};p(qa,"type","HueRotation"),p(qa,"defaults",Ua),at.setClass(qa);var Ka=class extends wa{applyTo2d({imageData:{data:t}}){for(let e=0;e<t.length;e+=4)t[e]=255-t[e],t[e+1]=255-t[e+1],t[e+2]=255-t[e+2],this.alpha&&(t[e+3]=255-t[e+3])}getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform int uInvert;\n  uniform int uAlpha;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    if (uInvert == 1) {\n      if (uAlpha == 1) {\n        gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n      } else {\n        gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n      }\n    } else {\n      gl_FragColor = color;\n    }\n  }\n"}isNeutralState(){return!this.invert}sendUniformData(t,e){t.uniform1i(e.uInvert,Number(this.invert)),t.uniform1i(e.uAlpha,Number(this.alpha))}};p(Ka,"type","Invert"),p(Ka,"defaults",{alpha:!1,invert:!0}),p(Ka,"uniformLocations",["uInvert","uAlpha"]),at.setClass(Ka);var Ja=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uStepH;\n  uniform float uNoise;\n  uniform float uSeed;\n  varying vec2 vTexCoord;\n  float rand(vec2 co, float seed, float vScale) {\n    return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n  }\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=this.noise;for(let i=0;i<t.length;i+=4){let r=(.5-Math.random())*e;t[i]+=r,t[i+1]+=r,t[i+2]+=r}}sendUniformData(t,e){t.uniform1f(e.uNoise,this.noise/255),t.uniform1f(e.uSeed,Math.random())}isNeutralState(){return 0===this.noise}};p(Ja,"type","Noise"),p(Ja,"defaults",{noise:0}),p(Ja,"uniformLocations",["uNoise","uSeed"]),at.setClass(Ja);var Qa=class extends wa{applyTo2d({imageData:{data:t,width:e,height:i}}){for(let r=0;r<i;r+=this.blocksize)for(let s=0;s<e;s+=this.blocksize){let n=4*r*e+4*s,o=t[n],a=t[n+1],l=t[n+2],h=t[n+3];for(let n=r;n<Math.min(r+this.blocksize,i);n++)for(let i=s;i<Math.min(s+this.blocksize,e);i++){let r=4*n*e+4*i;t[r]=o,t[r+1]=a,t[r+2]=l,t[r+3]=h}}}isNeutralState(){return 1===this.blocksize}getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uBlocksize;\n  uniform float uStepW;\n  uniform float uStepH;\n  varying vec2 vTexCoord;\n  void main() {\n    float blockW = uBlocksize * uStepW;\n    float blockH = uBlocksize * uStepH;\n    int posX = int(vTexCoord.x / blockW);\n    int posY = int(vTexCoord.y / blockH);\n    float fposX = float(posX);\n    float fposY = float(posY);\n    vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n    vec4 color = texture2D(uTexture, squareCoords);\n    gl_FragColor = color;\n  }\n"}sendUniformData(t,e){t.uniform1f(e.uBlocksize,this.blocksize)}};p(Qa,"type","Pixelate"),p(Qa,"defaults",{blocksize:4}),p(Qa,"uniformLocations",["uBlocksize"]),at.setClass(Qa);var Za=class extends wa{getFragmentSource(){return"\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n  gl_FragColor = texture2D(uTexture, vTexCoord);\n  if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n    gl_FragColor.a = 0.0;\n  }\n}\n"}applyTo2d({imageData:{data:t}}){let e=255*this.distance,i=new gi(this.color).getSource(),r=[i[0]-e,i[1]-e,i[2]-e],s=[i[0]+e,i[1]+e,i[2]+e];for(let e=0;e<t.length;e+=4){let i=t[e],n=t[e+1],o=t[e+2];i>r[0]&&n>r[1]&&o>r[2]&&i<s[0]&&n<s[1]&&o<s[2]&&(t[e+3]=0)}}sendUniformData(t,e){let i=new gi(this.color).getSource(),r=this.distance,s=[0+i[0]/255-r,0+i[1]/255-r,0+i[2]/255-r,1],n=[i[0]/255+r,i[1]/255+r,i[2]/255+r,1];t.uniform4fv(e.uLow,s),t.uniform4fv(e.uHigh,n)}};p(Za,"type","RemoveColor"),p(Za,"defaults",{color:"#FFFFFF",distance:.02,useAlpha:!1}),p(Za,"uniformLocations",["uLow","uHigh"]),at.setClass(Za);var tl=class extends wa{sendUniformData(t,e){t.uniform2fv(e.uDelta,this.horizontal?[1/this.width,0]:[0,1/this.height]),t.uniform1fv(e.uTaps,this.taps)}getFilterWindow(){let t=this.tempScale;return Math.ceil(this.lanczosLobes/t)}getCacheKey(){let t=this.getFilterWindow();return`${this.type}_${t}`}getFragmentSource(){let t=this.getFilterWindow();return this.generateShader(t)}getTaps(){let t=this.lanczosCreate(this.lanczosLobes),e=this.tempScale,i=this.getFilterWindow(),r=Array(i);for(let s=1;s<=i;s++)r[s-1]=t(s*e);return r}generateShader(t){let e=Array(t);for(let i=1;i<=t;i++)e[i-1]=`${i}.0 * uDelta`;return`\n      precision highp float;\n      uniform sampler2D uTexture;\n      uniform vec2 uDelta;\n      varying vec2 vTexCoord;\n      uniform float uTaps[${t}];\n      void main() {\n        vec4 color = texture2D(uTexture, vTexCoord);\n        float sum = 1.0;\n        ${e.map((t,e)=>`\n              color += texture2D(uTexture, vTexCoord + ${t}) * uTaps[${e}] + texture2D(uTexture, vTexCoord - ${t}) * uTaps[${e}];\n              sum += 2.0 * uTaps[${e}];\n            `).join("\n")}\n        gl_FragColor = color / sum;\n      }\n    `}applyToForWebgl(t){t.passes++,this.width=t.sourceWidth,this.horizontal=!0,this.dW=Math.round(this.width*this.scaleX),this.dH=t.sourceHeight,this.tempScale=this.dW/this.width,this.taps=this.getTaps(),t.destinationWidth=this.dW,super.applyTo(t),t.sourceWidth=t.destinationWidth,this.height=t.sourceHeight,this.horizontal=!1,this.dH=Math.round(this.height*this.scaleY),this.tempScale=this.dH/this.height,this.taps=this.getTaps(),t.destinationHeight=this.dH,super.applyTo(t),t.sourceHeight=t.destinationHeight}applyTo(t){_a(t)?this.applyToForWebgl(t):this.applyTo2d(t)}isNeutralState(){return 1===this.scaleX&&1===this.scaleY}lanczosCreate(t){return e=>{if(e>=t||e<=-t)return 0;if(e<1.1920929e-7&&e>-1.1920929e-7)return 1;let i=(e*=Math.PI)/t;return Math.sin(e)/e*Math.sin(i)/i}}applyTo2d(t){let e=t.imageData,i=this.scaleX,r=this.scaleY;this.rcpScaleX=1/i,this.rcpScaleY=1/r;let s,n=e.width,o=e.height,a=Math.round(n*i),l=Math.round(o*r);s="sliceHack"===this.resizeType?this.sliceByTwo(t,n,o,a,l):"hermite"===this.resizeType?this.hermiteFastResize(t,n,o,a,l):"bilinear"===this.resizeType?this.bilinearFiltering(t,n,o,a,l):"lanczos"===this.resizeType?this.lanczosResize(t,n,o,a,l):new ImageData(a,l),t.imageData=s}sliceByTwo(t,e,i,r,s){let n=t.imageData,o=.5,a=!1,l=!1,h=e*o,c=i*o,u=t.filterBackend.resources,d=0,g=0,f=e,p=0;u.sliceByTwo||(u.sliceByTwo=Ct());let m=u.sliceByTwo;(m.width<1.5*e||m.height<i)&&(m.width=1.5*e,m.height=i);let y=m.getContext("2d");for(y.clearRect(0,0,1.5*e,i),y.putImageData(n,0,0),r=Math.floor(r),s=Math.floor(s);!a||!l;)e=h,i=c,r<Math.floor(h*o)?h=Math.floor(h*o):(h=r,a=!0),s<Math.floor(c*o)?c=Math.floor(c*o):(c=s,l=!0),y.drawImage(m,d,g,e,i,f,p,h,c),d=f,g=p,p+=c;return y.getImageData(d,g,r,s)}lanczosResize(t,e,i,r,s){let n=t.imageData.data,o=t.ctx.createImageData(r,s),a=o.data,l=this.lanczosCreate(this.lanczosLobes),h=this.rcpScaleX,c=this.rcpScaleY,u=2/this.rcpScaleX,d=2/this.rcpScaleY,g=Math.ceil(h*this.lanczosLobes/2),f=Math.ceil(c*this.lanczosLobes/2),p={},m={x:0,y:0},y={x:0,y:0};return function t(b){let _,v,x,C,w,S,T,O,k,D,M;for(m.x=(b+.5)*h,y.x=Math.floor(m.x),_=0;_<s;_++){for(m.y=(_+.5)*c,y.y=Math.floor(m.y),w=0,S=0,T=0,O=0,k=0,v=y.x-g;v<=y.x+g;v++)if(!(v<0||v>=e)){D=Math.floor(1e3*Math.abs(v-m.x)),p[D]||(p[D]={});for(let t=y.y-f;t<=y.y+f;t++)t<0||t>=i||(M=Math.floor(1e3*Math.abs(t-m.y)),p[D][M]||(p[D][M]=l(Math.sqrt((D*u)**2+(M*d)**2)/1e3)),x=p[D][M],x>0&&(C=4*(t*e+v),w+=x,S+=x*n[C],T+=x*n[C+1],O+=x*n[C+2],k+=x*n[C+3]))}C=4*(_*r+b),a[C]=S/w,a[C+1]=T/w,a[C+2]=O/w,a[C+3]=k/w}return++b<r?t(b):o}(0)}bilinearFiltering(t,e,i,r,s){let n,o,a,l,h,c,u,d,g,f,p,m,y,b=0,_=this.rcpScaleX,v=this.rcpScaleY,x=4*(e-1),C=t.imageData.data,w=t.ctx.createImageData(r,s),S=w.data;for(u=0;u<s;u++)for(d=0;d<r;d++)for(h=Math.floor(_*d),c=Math.floor(v*u),g=_*d-h,f=v*u-c,y=4*(c*e+h),p=0;p<4;p++)n=C[y+p],o=C[y+4+p],a=C[y+x+p],l=C[y+x+4+p],m=n*(1-g)*(1-f)+o*g*(1-f)+a*f*(1-g)+l*g*f,S[b++]=m;return w}hermiteFastResize(t,e,i,r,s){let n=this.rcpScaleX,o=this.rcpScaleY,a=Math.ceil(n/2),l=Math.ceil(o/2),h=t.imageData.data,c=t.ctx.createImageData(r,s),u=c.data;for(let t=0;t<s;t++)for(let i=0;i<r;i++){let s,c=4*(i+t*r),d=0,g=0,f=0,p=0,m=0,y=0,b=(t+.5)*o;for(let r=Math.floor(t*o);r<(t+1)*o;r++){let t=Math.abs(b-(r+.5))/l,o=(i+.5)*n,c=t*t;for(let t=Math.floor(i*n);t<(i+1)*n;t++){let i=Math.abs(o-(t+.5))/a,n=Math.sqrt(c+i*i);n>1&&n<-1||(s=2*n*n*n-3*n*n+1,s>0&&(i=4*(t+r*e),y+=s*h[i+3],g+=s,h[i+3]<255&&(s=s*h[i+3]/250),f+=s*h[i],p+=s*h[i+1],m+=s*h[i+2],d+=s))}}u[c]=f/d,u[c+1]=p/d,u[c+2]=m/d,u[c+3]=y/g}return c}};p(tl,"type","Resize"),p(tl,"defaults",{resizeType:"hermite",scaleX:1,scaleY:1,lanczosLobes:3}),p(tl,"uniformLocations",["uDelta","uTaps"]),at.setClass(tl);var el=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uSaturation;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float rgMax = max(color.r, color.g);\n    float rgbMax = max(rgMax, color.b);\n    color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n    color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n    color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=-this.saturation;for(let i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2],o=Math.max(r,s,n);t[i]+=o===r?0:(o-r)*e,t[i+1]+=o===s?0:(o-s)*e,t[i+2]+=o===n?0:(o-n)*e}}sendUniformData(t,e){t.uniform1f(e.uSaturation,-this.saturation)}isNeutralState(){return 0===this.saturation}};p(el,"type","Saturation"),p(el,"defaults",{saturation:0}),p(el,"uniformLocations",["uSaturation"]),at.setClass(el);var il=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uVibrance;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float max = max(color.r, max(color.g, color.b));\n    float avg = (color.r + color.g + color.b) / 3.0;\n    float amt = (abs(max - avg) * 2.0) * uVibrance;\n    color.r += max != color.r ? (max - color.r) * amt : 0.00;\n    color.g += max != color.g ? (max - color.g) * amt : 0.00;\n    color.b += max != color.b ? (max - color.b) * amt : 0.00;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=-this.vibrance;for(let i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2],o=Math.max(r,s,n),a=(r+s+n)/3,l=2*Math.abs(o-a)/255*e;t[i]+=o===r?0:(o-r)*l,t[i+1]+=o===s?0:(o-s)*l,t[i+2]+=o===n?0:(o-n)*l}}sendUniformData(t,e){t.uniform1f(e.uVibrance,-this.vibrance)}isNeutralState(){return 0===this.vibrance}};function rl(t,e){const i=document.createElement("canvas");return i.width=t,i.height=e,i}function sl(t){const e=t.getContext("2d");if(!e)throw new Error("The browser gave no 2D canvas.");return e}function nl(t){const e=new Map;return t.forEach(t=>{e.has(t.family)||e.set(t.family,{family:t.family,label:t.label||t.family})}),[...e.values()]}p(il,"type","Vibrance"),p(il,"defaults",{vibrance:0}),p(il,"uniformLocations",["uVibrance"]),at.setClass(il),d({BaseFilter:()=>wa,BlackWhite:()=>$a,BlendColor:()=>Ta,BlendImage:()=>ka,Blur:()=>Da,Brightness:()=>Ma,Brownie:()=>Aa,ColorMatrix:()=>Ea,Composed:()=>Xa,Contrast:()=>Ya,Convolute:()=>Na,Gamma:()=>za,Grayscale:()=>Ga,HueRotation:()=>qa,Invert:()=>Ka,Kodachrome:()=>La,Noise:()=>Ja,Pixelate:()=>Qa,Polaroid:()=>Ra,RemoveColor:()=>Za,Resize:()=>tl,Saturation:()=>el,Sepia:()=>Ba,Technicolor:()=>Ia,Vibrance:()=>il,Vintage:()=>Fa});const ol={woff2:"woff2",woff:"woff",ttf:"truetype",otf:"opentype"},al=t=>`"PrintBlob ${t}"`,ll=new Map;async function hl(t){const e=[...new Set(t.filter(t=>ll.has(t)))];await Promise.all(e.flatMap(t=>(ll.get(t)??[]).map(t=>t.load()))),await Promise.all(e.flatMap(t=>[document.fonts.load(`400 40px ${al(t)}`,"Aа"),document.fonts.load(`700 40px ${al(t)}`,"Aа")]))}function cl(t){const e=new Set,i=t=>{if(t&&"string"==typeof t.fontFamily){const i=t.fontFamily.match(/^"PrintBlob (.+)"$/);i?.[1]&&e.add(i[1])}(t?.objects??[]).forEach(i)};return Object.values(t??{}).forEach(i),[...e]}const ul="#1A1D22",dl="#FFFFFF",gl="#2645D6",fl=[{name:(0,e.__)("Black","printblob"),hex:ul},{name:(0,e.__)("White","printblob"),hex:dl},{name:(0,e.__)("Cobalt","printblob"),hex:gl},{name:(0,e.__)("Red","printblob"),hex:"#D7263D"},{name:(0,e.__)("Yellow","printblob"),hex:"#F4C20D"},{name:(0,e.__)("Green","printblob"),hex:"#1F8A4C"}],pl=t=>({"--printblob-swatch":t}),ml=JSON.parse('{"r_":["front"],"Ee":1000,"uQ":300,"LH":{"area":{"x":0.3,"y":0.3,"w":0.4,"h":0.4},"print_cm":{"w":28,"h":36}}}');ml.r_,ml.Ee;const yl=ml.uQ;ml.LH;const bl=["printblobKind","printblobAutoInk","printblobVector"];function _l(t){return new Qs({left:t.left+t.width/2,top:t.top+t.height/2,width:t.width,height:t.height,absolutePositioned:!0})}function vl(t){return{x:t.left+t.width/2,y:t.top+t.height/2}}async function xl(t,e,i,{vector:r=!1}={}){const s=await ba.fromURL(e),n=Math.min(.8*i.width/s.width,.8*i.height/s.height),o=vl(i);return s.set({left:o.x,top:o.y,scaleX:n,scaleY:n,printblobKind:"image",printblobVector:r}),t.add(s),t.setActiveObject(s),t.requestRenderAll(),s}function Cl(t,e,i,{family:r="Onest",color:s=ul}={}){const n=vl(i),o=new la(e,{left:n.x,top:n.y,width:.9*i.width,fontSize:56,lineHeight:1.1,fontFamily:al(r),fontWeight:700,fill:s,textAlign:"center",printblobKind:"text",printblobAutoInk:!0});return t.add(o),t.setActiveObject(o),t.requestRenderAll(),o}function wl(t){return"text"===t.printblobKind&&t instanceof la}function Sl(t,e){t.setActiveObject(e),e.enterEditing(),e.selectAll(),t.requestRenderAll()}function Tl(t,e){t.remove(e),t.discardActiveObject(),t.requestRenderAll()}function Ol(t){return t.toObject(bl)}function kl(t){return Boolean(t?.objects?.length)}async function Dl(t,e,i){t.discardActiveObject(),t.clear(),t.getWidth()===i.stage.width&&t.getHeight()===i.stage.height||t.setDimensions({width:i.stage.width,height:i.stage.height},{backstoreOnly:!0}),e&&await t.loadFromJSON(e),t.clipPath=_l(i.area),t.requestRenderAll()}function Ml(t,e){return t?{...t,objects:t.objects.map(t=>t.printblobAutoInk?{...t,fill:e}:t)}:t}function jl(t,e){if("image"!==t?.printblobKind||t.printblobVector)return null;const i=t.getScaledWidth()/e.area.width*e.printCm.width;return Math.round(t.width/(i/2.54))}Object.assign(ps.ownDefaults,{cornerColor:gl,cornerStrokeColor:"#FFFFFF",borderColor:gl,cornerStyle:"circle",cornerSize:22,touchCornerSize:36,transparentCorners:!1,borderScaleFactor:2,padding:6});const El=t=>("Image"===t.type||"image"===t.printblobKind)&&Boolean(t.src?.startsWith("data:"));function Pl(t){const e=t=>t?{...t,objects:t.objects.map(t=>El(t)?{...t,src:""}:t)}:null;return Object.fromEntries(Object.entries(t).map(([t,i])=>[t,e(i)]))}function Al(t){const e=(t?.objects||[]).filter(El).map(t=>t.src);return[...new Set(e)]}async function Fl(t,e){const i=new _e(document.createElement("canvas"),{width:e.stage.width,height:e.stage.height,enableRetinaScaling:!1,renderOnAddRemove:!1});return await i.loadFromJSON(t),i.getObjects().forEach(t=>t.set({objectCaching:!1})),i.clipPath=_l(e.area),i.renderAll(),i}const Ll=t=>new Promise((e,i)=>t.toBlob(t=>t?e(t):i(new Error("Export failed")),"image/png")),Il=Uint32Array.from({length:256},(t,e)=>{let i=e;for(let t=0;t<8;t++)i=1&i?3988292384^i>>>1:i>>>1;return i>>>0});async function Rl(t,e){const i=new Uint8Array(await t.arrayBuffer()),r=Math.round(e/.0254),s=new Uint8Array(21),n=new DataView(s.buffer);return n.setUint32(0,9),s.set([112,72,89,115],4),n.setUint32(8,r),n.setUint32(12,r),s[16]=1,n.setUint32(17,function(t){let e=4294967295;for(const i of t)e=Il[255&(e^i)]^e>>>8;return(4294967295^e)>>>0}(s.subarray(4,17))),new Blob([i.subarray(0,33),s,i.subarray(33)],{type:"image/png"})}function Bl(t,e,i,r){const s=t.toCanvasElement(i/e.area.width,{left:e.area.left,top:e.area.top,width:e.area.width,height:e.area.height}),n=rl(i,r);return sl(n).drawImage(s,0,0,i,r),n}async function $l(t,e,i){const r=Math.round(i*e.area.height/e.area.width);if(!t||!kl(t))return rl(i,r);const s=await Fl(t,e),n=Bl(s,e,i,r);return s.dispose(),n}async function Xl(t,e,i){const r=await Fl(t,e),s=Bl(r,e,e.printPx.width,e.printPx.height),n=rl(.8*e.stage.width,.8*e.stage.height),o=sl(n);return o.drawImage(i,0,0,n.width,n.height),o.drawImage(r.toCanvasElement(.8),0,0),r.dispose(),{print:await Rl(await Ll(s),yl),preview:await Ll(n)}}const Yl=(t,e)=>e?`${t} is-shown`:t;function Wl({selected:t,items:i,tool:r,printFonts:s,dpi:n,onChoose:a,onDone:l,onChange:h,onCentre:c,onLayer:u,onRemove:d}){const g=t&&wl(t)?t:null,f="image"===t?.printblobKind?t:null,p=(0,o.jsxs)("div",{className:"printblob-designer__row printblob-designer__row--actions",children:[(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:c,children:(0,e.__)("Centre","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:()=>u("up"),children:(0,e.__)("Bring forward","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:()=>u("down"),children:(0,e.__)("Send back","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button printblob-link-button--danger",onClick:d,children:(0,e.__)("Remove","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:l,children:/* translators: closes the controls of the chosen image or text, back to the list of what is on the side. */ /* translators: closes the controls of the chosen image or text, back to the list of what is on the side. */
    55(0,e.__)("Done","printblob")})]});return(0,o.jsxs)("div",{className:"printblob-designer__workbench printblob-stack",children:[(0,o.jsxs)("div",{className:Yl("printblob-designer__selection printblob-designer__selection--text",!r&&null!==g),children:[(0,o.jsxs)("div",{className:"printblob-designer__row",children:[(0,o.jsxs)("label",{className:"printblob-field",children:[(0,o.jsx)("span",{children:(0,e.__)("Font","printblob")}),(0,o.jsx)("select",{value:s.find(t=>al(t.family)===g?.fontFamily)?.family??s[0]?.family,onChange:async t=>{const e=t.target.value;await hl([e]),h({fontFamily:al(e)})},children:s.map(t=>(0,o.jsx)("option",{value:t.family,children:t.label},t.family))})]}),(0,o.jsx)("button",{type:"button",className:"printblob-toggle","aria-pressed":Number(g?.fontWeight)>=700,onClick:()=>h({fontWeight:Number(g?.fontWeight)>=700?400:700}),children:(0,e.__)("Bold","printblob")})]}),(0,o.jsxs)("fieldset",{className:"printblob-field",children:[(0,o.jsx)("legend",{children:(0,e.__)("Ink colour","printblob")}),(0,o.jsxs)("div",{className:"printblob-swatches",children:[fl.map(t=>(0,o.jsx)("button",{type:"button",className:"printblob-swatch",style:pl(t.hex),"aria-label":t.name,"aria-pressed":"string"==typeof g?.fill&&g.fill.toUpperCase()===t.hex,onClick:()=>h({fill:t.hex,printblobAutoInk:!1})},t.hex)),(0,o.jsx)("label",{className:"printblob-swatch printblob-swatch--custom","aria-label":(0,e.__)("Custom colour","printblob"),children:(0,o.jsx)("input",{type:"color",value:"string"==typeof g?.fill?g.fill:ul,onChange:t=>h({fill:t.target.value.toUpperCase(),printblobAutoInk:!1})})})]})]}),p]}),(0,o.jsxs)("div",{className:Yl("printblob-designer__selection printblob-designer__selection--image",!r&&null!==f),children:[p,f&&null!==n&&(0,o.jsx)("p",{className:n<150?"printblob-note printblob-note--warn":"printblob-note",children:n<150?(0,e.sprintf)(/* translators: %d: dots per inch. */ /* translators: %d: dots per inch. */
    66(0,e.__)("This image is %d DPI at this size, so it may print blurry. Make it smaller or upload a larger file.","printblob"),n):(0,e.sprintf)(/* translators: %d: dots per inch. */ /* translators: %d: dots per inch. */
    … …  
    88(0,e.__)("Choose what to change","printblob")}),(0,o.jsx)("ul",{children:i.map((t,i)=>(0,o.jsx)("li",{children:(0,o.jsx)("button",{type:"button",className:"printblob-designer__item",onClick:()=>a(t),children:wl(t)?(0,o.jsx)("span",{children:t.text}):(0,o.jsxs)(o.Fragment,{children:[t instanceof ba&&(0,o.jsx)("img",{src:t.getSrc(),alt:""}),(0,o.jsx)("span",{children:/* translators: a picture the customer placed on the product, in the list of what is on a printed side. */ /* translators: a picture the customer placed on the product, in the list of what is on a printed side. */
    99(0,e.__)("Image","printblob")})]})})},i))})]}):(0,o.jsx)("p",{className:"printblob-note",children:/* translators: shown where the controls appear while the printed side shown has nothing on it. */ /* translators: shown where the controls appear while the printed side shown has nothing on it. */
    10 (0,e.__)("Upload an image or add text to start.","printblob")})}),r]})}const Nl={"image/png":"png","image/jpeg":"jpg","image/webp":"webp"},Vl=Object.keys(Nl);function zl(t){const[e,i]=t.split(","),r=Uint8Array.from(atob(i),t=>t.charCodeAt(0));return new Blob([r],{type:e.slice(5).split(";")[0]})}const Hl=()=>new Promise(t=>window.requestAnimationFrame(()=>window.setTimeout(t,0)));function Gl(t,{color:e,size:i,options:r}){const s=[];return e&&s.push({attribute:t.attributes.color,value:e}),i&&s.push({attribute:t.attributes.size,value:i}),(t.options??[]).forEach(t=>s.push({attribute:t.attribute,value:r[t.field]??null})),s}async function Ul(t,e){try{const i=await t.json();return i?.description||i?.message||e}catch{return e}}const ql=t=>`printblob-design-${t}`;function Kl(t){try{const e=window.localStorage.getItem(ql(t));return(null===e?null:JSON.parse(e))||null}catch{return null}}function Jl(t,e){try{window.localStorage.setItem(ql(t),JSON.stringify(e))}catch{}}function Ql(t,e,i){return.2126*t+.7152*e+.0722*i}function Zl(t,e){if(t[e+3]<5)return!1;const i=t[e],r=t[e+1],s=t[e+2],n=Math.max(i,r,s),o=Math.min(i,r,s);return n>0&&(n-o)/n<.14}function th(t,e,i){const r=new Uint32Array(256);let s=0;for(let n=0;n<i;n++)for(let i=0;i<e;i++){const o=4*(n*e+i);Zl(t,o)&&(r[Math.round(Ql(t[o],t[o+1],t[o+2]))]++,s++)}let n=0;for(let t=0;t<256;t++)if(n+=r[t],n>=.7*s)return t/255;return 1}function eh(t){const e=t.replace("#",""),i=t=>parseInt(e.slice(t,t+2),16)/255;return[i(0),i(2),i(4)]}const ih=window.wp.hooks;let rh=0;function sh(e,i,r){const[s]=(0,t.useState)(()=>`printblob/designer/${e}/${++rh}`),[,n]=(0,t.useState)(0);return(0,t.useEffect)(()=>{const t=t=>t===e&&n(t=>t+1);return(0,ih.addAction)("hookAdded",s,t),(0,ih.addAction)("hookRemoved",s,t),n(t=>t+1),()=>{(0,ih.removeAction)("hookAdded",s),(0,ih.removeAction)("hookRemoved",s)}},[e,s]),function(t,e,i){const r=(0,ih.applyFilters)(t,{},i);return(e??[]).flatMap(t=>{const e=r[t.key];return e&&!1!==e.available?.()?[{...t,...e}]:[]})}(e,i,r)}const nh=t=>`attribute_${t}`,oh=(t,e)=>Object.entries(t.attributes).every(([t,i])=>""===i||t in e&&(null===e[t]||e[t]===i)),ah=(t,e)=>Object.fromEntries(t.map(t=>[t.key,e(t)]));function lh({config:a}){const u=(0,t.useMemo)(()=>function(t){const e=function(t){const e={};for(const i of["designs","storeApi"]){const r=t[i];if("string"!=typeof r)throw new TypeError(`The designer's configuration has no ${i} endpoint.`);e[i]=r}return e}(t);let i=null;const s=t=>{const e=t.headers.get("Nonce");return e&&(i=e),t};async function n(){return i||s(await fetch(`${e.storeApi}cart`,{credentials:"same-origin"})),String(i)}return{saveDesign:async function(t){const i=s(await fetch(e.designs,{method:"POST",credentials:"same-origin",headers:{Nonce:await n()},body:t}));if(!i.ok)throw new Error(await Ul(i,r().notSaved));return i.json()},addToCart:async function({id:t,productId:i,quantity:o,variation:a,design:l}){const h=s(await fetch(`${e.storeApi}cart/add-item`,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json",Nonce:await n()},body:JSON.stringify({id:i??t,quantity:o,variation:a,printblob_design:l})}));if(!h.ok)throw new Error(await Ul(h,r().notAdded));const c=await h.json();return document.body.dispatchEvent(new CustomEvent("wc-blocks_added_to_cart",{bubbles:!0,detail:{preserveCartData:!1}})),c}}}(a.endpoints),[a.endpoints]),d=(0,t.useMemo)(()=>ah(a.sides,t=>function(t,{recolor:e=!0}={}){let i=null;const r=new Map;let s=null;return{get ready(){return s??=new Promise((e,r)=>{const s=new Image;s.onload=()=>{const t=sl(rl(s.naturalWidth,s.naturalHeight));t.drawImage(s,0,0);const r=t.getImageData(0,0,s.naturalWidth,s.naturalHeight);i={photo:s,base:r,reference:th(r.data,r.width,r.height)},e()},s.onerror=()=>r(new Error("The product photo could not be loaded.")),s.crossOrigin="anonymous",s.src=t}),s},render:function(t){const s=e?t:"photo";let n=r.get(s);if(!n){if(!i)throw new Error("The product photo is not loaded yet.");const{base:o,reference:a}=i;n=rl(o.width,o.height);const l=e?function(t,e,i,r,s){const[n,o,a]=eh(r),l=.55-(n+o+a)/3*.35,h=new Uint8ClampedArray(t.length);h.set(t);for(let r=0;r<i;r++)for(let i=0;i<e;i++){const c=4*(r*e+i);if(!Zl(t,c))continue;const u=Ql(t[c],t[c+1],t[c+2])/255,d=u/s,g=(u-s)*l;h[c]=255*(n*d+g),h[c+1]=255*(o*d+g),h[c+2]=255*(a*d+g)}return h}(o.data,o.width,o.height,t,a):o.data;sl(n).putImageData(new ImageData(new Uint8ClampedArray(l),o.width,o.height),0,0),r.set(s,n)}return n},image:()=>i?.photo??null,pixels:()=>({data:i?.base??null,reference:i?.reference??1})}}(t.image,{recolor:t.recolor})),[a.sides]),g=(0,t.useRef)(null),f=(0,t.useMemo)(()=>nl(a.fonts),[a.fonts]),p=(0,t.useMemo)(()=>ah(a.sides,t=>t),[a.sides]),m=(0,t.useMemo)(()=>Kl(a.productId),[a.productId]),y=(0,t.useRef)(null),b=(0,t.useRef)(null),_=(0,t.useRef)(!1),v=(0,t.useRef)(!1),x=(0,t.useRef)(null),C=()=>ah(a.sides,()=>null),w=(0,t.useRef)({...C(),...m?.sides??{}}),[S,T]=(0,t.useState)(!1),[O,k]=(0,t.useState)(a.sides[0].key),[D,M]=(0,t.useState)(a.initialColor||m?.color||a.colors[0]?.slug||""),[j,E]=(0,t.useState)(m?.size??""),P=a.options??[],[A,F]=(0,t.useState)(()=>Object.fromEntries(P.map(t=>{const e=m?.options?.[t.field];return[t.field,t.choices.find(t=>t.value===e)?.value??t.choices[0]?.value??null]}))),[L,I]=(0,t.useState)(1),[R,B]=(0,t.useState)(null),[$,X]=(0,t.useState)([]),[Y,W]=(0,t.useState)({}),[N,V]=(0,t.useState)(()=>ah(a.sides,t=>kl(w.current[t.key]))),[z,H]=(0,t.useState)({state:"idle",message:""}),G=(t=>sh("printblob.designer.views",t.views,t))(a),[U,q]=(0,t.useState)(null),K=G.find(t=>t.key===U)?.Component??null,J=G.find(t=>t.initial)?.key??null,Q=(0,t.useRef)(!1),Z=(t=>sh("printblob.designer.tools",t.tools,t))(a),[tt,et]=(0,t.useState)(null),it=Z.find(t=>t.key===tt)?.Panel??null,rt=a.colors.find(t=>t.slug===D)?.hex??"#FFFFFF",st=p[O],nt=a.sides[0],ot=d[O],at=a.sizes.length>0,lt=nh(a.attributes.size),ht={[nh(a.attributes.color)]:D,[lt]:at&&!j?null:j,...A},ct=a.variations.length?((t,e)=>t.find(t=>!Object.values(e).includes(null)&&oh(t,e)))(a.variations,ht):null,ut=t=>!a.variations.length||((t,e)=>t.some(t=>t.inStock&&oh(t,e)))(a.variations,{...ht,...t}),dt=ct?ct.price:a.basePrice,gt=dt+a.sides.filter(t=>N[t.key]).reduce((t,e)=>t+e.price,0),ft=()=>X(b.current?[...b.current.getObjects()]:[]),pt=(0,t.useCallback)(t=>W(e=>({...e,...Object.fromEntries(t.map(t=>[t,(e[t]??0)+1]))})),[]),mt=(0,t.useMemo)(()=>a.sides.reduce((t,e)=>e.stage.height/e.stage.width>t.stage.height/t.stage.width?e:t),[a.sides]),yt=(0,t.useCallback)((t,e)=>$l(w.current[t],p[t],e),[p]),bt=(0,t.useCallback)(()=>{const t=b.current;t&&(w.current={...w.current,[O]:Ol(t)},V(t=>({...t,[O]:kl(w.current[O])})),pt([O]),Jl(a.productId,{sides:w.current,color:D,size:j,options:A}))},[O,D,j,A,a.productId,pt]);(0,t.useEffect)(()=>{let t,e=!1;return(async()=>{a.fonts.forEach(t=>{const e={weight:t.weight||"400",style:t.style||"normal",display:"block"};t.unicodeRange&&(e.unicodeRange=t.unicodeRange);const i=new FontFace(`PrintBlob ${t.family}`,`url(${t.url}) format("${function(t){const e=new URL(t,window.location.href).pathname.split(".").pop()?.toLowerCase()??"";return ol[e]??"woff2"}(t.url)}")`,e);document.fonts.add(i),ll.set(t.family,[...ll.get(t.family)??[],i])});const i=[nl(a.fonts)[0]?.family,...cl(a.initialText?{}:w.current)].filter(t=>Boolean(t));if(await Promise.all([hl(i),...Object.values(d).map(t=>t.ready)]),!e&&y.current){if(t=function(t,e){const i=new po(t,{width:e.stage.width,height:e.stage.height,preserveObjectStacking:!0,selectionColor:"rgba(38, 69, 214, 0.08)",selectionBorderColor:gl,controlsAboveOverlay:!0});return i.clipPath=_l(e.area),i.setDimensions({width:"100%",height:"auto"},{cssOnly:!0}),i}(y.current,nt),b.current=t,a.initialColor){const t=new URL(window.location.href);t.searchParams.delete("color"),window.history.replaceState(null,"",t)}if(a.initialText){w.current=C(),V(ah(a.sides,()=>!1));const t=new URL(window.location.href);t.searchParams.delete("text"),window.history.replaceState(null,"",t)}await Dl(t,w.current[nt.key],nt),a.initialText&&(Cl(t,a.initialText,nt.area,{family:nl(a.fonts)[0]?.family}),w.current={...w.current,[nt.key]:Ol(t)},Jl(a.productId,{...Kl(a.productId),sides:w.current}),V(t=>({...t,[nt.key]:!0})),pt([nt.key]),B(t.getActiveObject()??null)),ft(),T(!0)}})(),()=>{e=!0,t?.dispose(),b.current=null}},[]),(0,t.useEffect)(()=>{const t=b.current;if(!S||!t)return;const e=()=>{const e=t.getActiveObject()??null;B(e),e&&et(null)},i=()=>{_.current||(bt(),ft())};return t.on("selection:created",e),t.on("selection:updated",e),t.on("selection:cleared",e),t.on("object:modified",i),t.on("object:added",i),t.on("object:removed",i),t.on("text:changed",i),()=>{t.off("selection:created",e),t.off("selection:updated",e),t.off("selection:cleared",e),t.off("object:modified",i),t.off("object:added",i),t.off("object:removed",i),t.off("text:changed",i)}},[S,bt]),(0,t.useEffect)(()=>{Jl(a.productId,{sides:w.current,color:D,size:j,options:A})},[D,j,A,a.productId]),(0,t.useEffect)(()=>{S&&J&&!Q.current&&(Q.current=!0,q(J))},[S,J]);const _t=function(t){const[e,i,r]=eh(t).map(t=>t<=.03928?t/12.92:((t+.055)/1.055)**2.4);return.2126*e+.7152*i+.0722*r<.25}(rt),vt=_t?dl:ul;function xt(t){const e=b.current;var i;R&&e&&((i=R)instanceof aa&&i.isEditing&&i.exitEditing(),t(e,R))}function Ct(t){xt((e,i)=>{i.set(t),i.setCoords(),e.requestRenderAll(),bt(),ft()})}(0,t.useEffect)(()=>{const t=g.current;if(!S||!t)return;const e=ot.render(rt);t.width=e.width,t.height=e.height,t.getContext("2d")?.drawImage(e,0,0)},[S,rt,ot,O]),(0,t.useEffect)(()=>{const t=b.current;S&&t&&(t.getObjects().forEach(t=>t.printblobAutoInk&&t.set({fill:vt})),t.requestRenderAll(),w.current=Object.fromEntries(Object.entries(w.current).map(([e,i])=>[e,e===O?Ol(t):Ml(i,vt)])),pt(Object.keys(w.current)),ft())},[vt,S]),function(e,i){(0,t.useEffect)(()=>{const t=t=>{const r=e.current,s=r?.getActiveObject();if(!r||!s||(n=s)instanceof aa&&n.isEditing||t.target instanceof HTMLElement&&/^(INPUT|TEXTAREA|SELECT)$/.test(t.target.tagName))return;var n;const o=t.shiftKey?10:2,a={ArrowLeft:[-o,0],ArrowRight:[o,0],ArrowUp:[0,-o],ArrowDown:[0,o]}[t.key];a?(t.preventDefault(),s.set({left:s.left+a[0],top:s.top+a[1]}),s.setCoords(),r.requestRenderAll(),i()):"Delete"!==t.key&&"Backspace"!==t.key||(t.preventDefault(),Tl(r,s))};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,i])}(b,bt);const wt="busy"===z.state;return(0,o.jsxs)("div",{className:"printblob-designer__layout",children:[(0,o.jsxs)("div",{className:"printblob-designer__stage-column",children:[(0,o.jsxs)("div",{className:"printblob-designer__views",children:[(0,o.jsx)("div",{className:"printblob-designer__sides",role:"tablist","aria-label":(0,e.__)("Printed side","printblob"),children:a.sides.map(t=>(0,o.jsxs)("button",{type:"button",role:"tab","aria-selected":O===t.key,className:"printblob-designer__side",onClick:()=>async function(t){const e=b.current;if(t!==O&&e){w.current={...w.current,[O]:Ol(e)},_.current=!0;try{await Dl(e,w.current[t],p[t])}finally{_.current=!1}B(null),k(t),ft()}}(t.key),disabled:!S||wt,children:[t.label,(0,o.jsx)("span",{className:N[t.key]?"printblob-designer__side-dot is-shown":"printblob-designer__side-dot","aria-label":N[t.key]?(0,e.__)("has a print","printblob"):void 0})]},t.key))}),G.map(t=>(0,o.jsx)("button",{type:"button",className:`printblob-designer__side printblob-designer__side--view printblob-designer__side--${t.key}`,"aria-pressed":U===t.key,onClick:()=>q(e=>e===t.key?null:t.key),disabled:!S||wt,children:t.label},t.key))]}),(0,o.jsxs)("div",{className:"printblob-designer__stage",style:{aspectRatio:`${mt.stage.width} / ${mt.stage.height}`},children:[(0,o.jsxs)("div",{className:"printblob-designer__frame",style:{aspectRatio:`${st.stage.width} / ${st.stage.height}`},children:[(0,o.jsx)("canvas",{ref:g,className:"printblob-designer__shirt","aria-hidden":"true"}),(0,o.jsx)("div",{className:_t?"printblob-designer__area is-on-dark":"printblob-designer__area","aria-hidden":"true",style:{left:st.area.left/st.stage.width*100+"%",top:st.area.top/st.stage.height*100+"%",width:st.area.width/st.stage.width*100+"%",height:st.area.height/st.stage.height*100+"%"}},O),(0,o.jsx)("div",{className:"printblob-designer__canvas",children:(0,o.jsx)("canvas",{ref:y,"aria-label":(0,e.__)("Design area. Drag to move, use the corner handles to resize or rotate.","printblob")})})]}),!S&&(0,o.jsx)("p",{className:"printblob-designer__stage-loading",children:(0,e.__)("Loading the designer…","printblob")}),K&&S&&(0,o.jsx)(K,{config:a,mockups:d,colorHex:rt,side:O,renderSide:yt,revisions:Y})]}),(0,o.jsx)("p",{className:"printblob-designer__hint",children:(0,e.sprintf)(/* translators: 1: print area width in cm, 2: print area height in cm. */ /* translators: 1: print area width in cm, 2: print area height in cm. */
     10(0,e.__)("Upload an image or add text to start.","printblob")})}),r]})}const Nl={"image/png":"png","image/jpeg":"jpg","image/webp":"webp"},Vl=Object.keys(Nl);function zl(t){const[e,i]=t.split(","),r=Uint8Array.from(atob(i),t=>t.charCodeAt(0));return new Blob([r],{type:e.slice(5).split(";")[0]})}const Hl=()=>new Promise(t=>window.requestAnimationFrame(()=>window.setTimeout(t,0)));function Gl(t,{color:e,size:i,options:r}){const s=[];return e&&s.push({attribute:t.attributes.color,value:e}),i&&s.push({attribute:t.attributes.size,value:i}),(t.options??[]).forEach(t=>s.push({attribute:t.attribute,value:r[t.field]??null})),s}async function Ul(t,e){try{const i=await t.json();return i?.description||i?.message||e}catch{return e}}const ql=t=>`printblob-design-${t}`;function Kl(t){try{const e=window.localStorage.getItem(ql(t));return(null===e?null:JSON.parse(e))||null}catch{return null}}function Jl(t,e){try{window.localStorage.setItem(ql(t),JSON.stringify(e))}catch{}}function Ql(t,e,i){return.2126*t+.7152*e+.0722*i}function Zl(t,e){if(t[e+3]<5)return!1;const i=t[e],r=t[e+1],s=t[e+2],n=Math.max(i,r,s),o=Math.min(i,r,s);return n>0&&(n-o)/n<.14}function th(t,e,i){const r=new Uint32Array(256);let s=0;for(let n=0;n<i;n++)for(let i=0;i<e;i++){const o=4*(n*e+i);Zl(t,o)&&(r[Math.round(Ql(t[o],t[o+1],t[o+2]))]++,s++)}let n=0;for(let t=0;t<256;t++)if(n+=r[t],n>=.7*s)return t/255;return 1}function eh(t){const e=t.replace("#",""),i=t=>parseInt(e.slice(t,t+2),16)/255;return[i(0),i(2),i(4)]}const ih=window.wp.hooks;let rh=0;function sh(e,i,r){const[s]=(0,t.useState)(()=>`printblob/designer/${e}/${++rh}`),[,n]=(0,t.useState)(0);return(0,t.useEffect)(()=>{const t=t=>t===e&&n(t=>t+1);return(0,ih.addAction)("hookAdded",s,t),(0,ih.addAction)("hookRemoved",s,t),n(t=>t+1),()=>{(0,ih.removeAction)("hookAdded",s),(0,ih.removeAction)("hookRemoved",s)}},[e,s]),function(t,e,i){const r=(0,ih.applyFilters)(t,{},i);return(e??[]).flatMap(t=>{const e=r[t.key];return e&&!1!==e.available?.()?[{...t,...e}]:[]})}(e,i,r)}const nh=t=>`attribute_${t}`,oh=(t,e)=>Object.entries(t.attributes).every(([t,i])=>""===i||t in e&&(null===e[t]||e[t]===i)),ah=(t,e)=>Object.fromEntries(t.map(t=>[t.key,e(t)]));function lh({config:a}){const u=(0,t.useMemo)(()=>function(t){const e=function(t){const e={};for(const i of["designs","storeApi"]){const r=t[i];if("string"!=typeof r)throw new TypeError(`The designer's configuration has no ${i} endpoint.`);e[i]=r}return e}(t);let i=null;const s=t=>{const e=t.headers.get("Nonce");return e&&(i=e),t};async function n(){return i||s(await fetch(`${e.storeApi}cart`,{credentials:"same-origin"})),String(i)}return{saveDesign:async function(t){const i=s(await fetch(e.designs,{method:"POST",credentials:"same-origin",headers:{Nonce:await n()},body:t}));if(!i.ok)throw new Error(await Ul(i,r().notSaved));return i.json()},addToCart:async function({id:t,productId:i,quantity:o,variation:a,design:l}){const h=s(await fetch(`${e.storeApi}cart/add-item`,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json",Nonce:await n()},body:JSON.stringify({id:i??t,quantity:o,variation:a,printblob_design:l})}));if(!h.ok)throw new Error(await Ul(h,r().notAdded));const c=await h.json();return document.body.dispatchEvent(new CustomEvent("wc-blocks_added_to_cart",{bubbles:!0,detail:{preserveCartData:!1}})),c}}}(a.endpoints),[a.endpoints]),d=(0,t.useMemo)(()=>ah(a.sides,t=>function(t,{recolor:e=!0}={}){let i=null;const r=new Map;let s=null;return{get ready(){return s??=new Promise((e,r)=>{const s=new Image;s.onload=()=>{const t=sl(rl(s.naturalWidth,s.naturalHeight));t.drawImage(s,0,0);const r=t.getImageData(0,0,s.naturalWidth,s.naturalHeight);i={photo:s,base:r,reference:th(r.data,r.width,r.height)},e()},s.onerror=()=>r(new Error("The product photo could not be loaded.")),s.crossOrigin="anonymous",s.src=t}),s},render:function(t){const s=e?t:"photo";let n=r.get(s);if(!n){if(!i)throw new Error("The product photo is not loaded yet.");const{base:o,reference:a}=i;n=rl(o.width,o.height);const l=e?function(t,e,i,r,s){const[n,o,a]=eh(r),l=.55-(n+o+a)/3*.35,h=new Uint8ClampedArray(t.length);h.set(t);for(let r=0;r<i;r++)for(let i=0;i<e;i++){const c=4*(r*e+i);if(!Zl(t,c))continue;const u=Ql(t[c],t[c+1],t[c+2])/255,d=u/s,g=(u-s)*l;h[c]=255*(n*d+g),h[c+1]=255*(o*d+g),h[c+2]=255*(a*d+g)}return h}(o.data,o.width,o.height,t,a):o.data;sl(n).putImageData(new ImageData(new Uint8ClampedArray(l),o.width,o.height),0,0),r.set(s,n)}return n},image:()=>i?.photo??null,pixels:()=>({data:i?.base??null,reference:i?.reference??1})}}(t.image,{recolor:t.recolor})),[a.sides]),g=(0,t.useRef)(null),f=(0,t.useMemo)(()=>nl(a.fonts),[a.fonts]),p=(0,t.useMemo)(()=>ah(a.sides,t=>t),[a.sides]),m=(0,t.useMemo)(()=>Kl(a.productId),[a.productId]),y=(0,t.useRef)(null),b=(0,t.useRef)(null),_=(0,t.useRef)(!1),v=(0,t.useRef)(!1),x=(0,t.useRef)(null),C=()=>ah(a.sides,()=>null),w=(0,t.useRef)({...C(),...m?.sides??{}}),[S,T]=(0,t.useState)(!1),[O,k]=(0,t.useState)(a.sides[0].key),[D,M]=(0,t.useState)(a.initialColor||m?.color||a.colors[0]?.slug||""),[j,E]=(0,t.useState)(m?.size??""),P=a.options??[],[A,F]=(0,t.useState)(()=>Object.fromEntries(P.map(t=>{const e=m?.options?.[t.field];return[t.field,t.choices.find(t=>t.value===e)?.value??t.choices[0]?.value??null]}))),[L,I]=(0,t.useState)(1),[R,B]=(0,t.useState)(null),[$,X]=(0,t.useState)([]),[Y,W]=(0,t.useState)({}),[N,V]=(0,t.useState)(()=>ah(a.sides,t=>kl(w.current[t.key]))),[z,H]=(0,t.useState)({state:"idle",message:""}),G=(t=>sh("printblob.designer.views",t.views,t))(a),[U,q]=(0,t.useState)(null),K=G.find(t=>t.key===U)?.Component??null,J=G.find(t=>t.initial)?.key??null,Q=(0,t.useRef)(!1),Z=(t=>sh("printblob.designer.tools",t.tools,t))(a),[tt,et]=(0,t.useState)(null),it=Z.find(t=>t.key===tt)?.Panel??null,rt=a.colors.find(t=>t.slug===D)?.hex??"#FFFFFF",st=p[O],nt=a.sides[0],ot=d[O],at=a.sizes.length>0,lt=nh(a.attributes.size),ht={[nh(a.attributes.color)]:D,[lt]:at&&!j?null:j,...A},ct=a.variations.length?((t,e)=>t.find(t=>!Object.values(e).includes(null)&&oh(t,e)))(a.variations,ht):null,ut=t=>!a.variations.length||((t,e)=>t.some(t=>t.inStock&&oh(t,e)))(a.variations,{...ht,...t}),dt=ct?ct.price:a.basePrice,gt=dt+a.sides.filter(t=>N[t.key]).reduce((t,e)=>t+e.price,0),ft=()=>X(b.current?[...b.current.getObjects()]:[]),pt=(0,t.useCallback)(t=>W(e=>({...e,...Object.fromEntries(t.map(t=>[t,(e[t]??0)+1]))})),[]),mt=(0,t.useMemo)(()=>a.sides.reduce((t,e)=>e.stage.height/e.stage.width>t.stage.height/t.stage.width?e:t),[a.sides]),yt=(0,t.useCallback)((t,e)=>$l(w.current[t],p[t],e),[p]),bt=(0,t.useCallback)(()=>{const t=b.current;t&&(w.current={...w.current,[O]:Ol(t)},V(t=>({...t,[O]:kl(w.current[O])})),pt([O]),Jl(a.productId,{sides:w.current,color:D,size:j,options:A}))},[O,D,j,A,a.productId,pt]);(0,t.useEffect)(()=>{let t,e=!1;return(async()=>{a.fonts.forEach(t=>{const e={weight:t.weight||"400",style:t.style||"normal",display:"block"};t.unicodeRange&&(e.unicodeRange=t.unicodeRange);const i=new FontFace(`PrintBlob ${t.family}`,`url(${t.url}) format("${function(t){const e=new URL(t,window.location.href).pathname.split(".").pop()?.toLowerCase()??"";return ol[e]??"woff2"}(t.url)}")`,e);document.fonts.add(i),ll.set(t.family,[...ll.get(t.family)??[],i])});const i=[nl(a.fonts)[0]?.family,...cl(a.initialText?{}:w.current)].filter(t=>Boolean(t));if(await Promise.all([hl(i),...Object.values(d).map(t=>t.ready)]),!e&&y.current){if(t=function(t,e){const i=new po(t,{width:e.stage.width,height:e.stage.height,preserveObjectStacking:!0,selectionColor:"rgba(38, 69, 214, 0.08)",selectionBorderColor:gl,controlsAboveOverlay:!0});return i.clipPath=_l(e.area),i.setDimensions({width:"100%",height:"auto"},{cssOnly:!0}),i}(y.current,nt),b.current=t,a.initialColor){const t=new URL(window.location.href);t.searchParams.delete("color"),window.history.replaceState(null,"",t)}if(a.initialText){w.current=C(),V(ah(a.sides,()=>!1));const t=new URL(window.location.href);t.searchParams.delete("text"),window.history.replaceState(null,"",t)}await Dl(t,w.current[nt.key],nt),a.initialText&&(Cl(t,a.initialText,nt.area,{family:nl(a.fonts)[0]?.family}),w.current={...w.current,[nt.key]:Ol(t)},Jl(a.productId,{...Kl(a.productId),sides:w.current}),V(t=>({...t,[nt.key]:!0})),pt([nt.key]),B(t.getActiveObject()??null)),ft(),T(!0)}})(),()=>{e=!0,t?.dispose(),b.current=null}},[]),(0,t.useEffect)(()=>{const t=b.current;if(!S||!t)return;const e=()=>{const e=t.getActiveObject()??null;B(e),e&&et(null)},i=()=>{_.current||(bt(),ft())};return t.on("selection:created",e),t.on("selection:updated",e),t.on("selection:cleared",e),t.on("object:modified",i),t.on("object:added",i),t.on("object:removed",i),t.on("text:changed",i),()=>{t.off("selection:created",e),t.off("selection:updated",e),t.off("selection:cleared",e),t.off("object:modified",i),t.off("object:added",i),t.off("object:removed",i),t.off("text:changed",i)}},[S,bt]),(0,t.useEffect)(()=>{Jl(a.productId,{sides:w.current,color:D,size:j,options:A})},[D,j,A,a.productId]),(0,t.useEffect)(()=>{S&&J&&!Q.current&&(Q.current=!0,q(J))},[S,J]);const _t=function(t){const[e,i,r]=eh(t).map(t=>t<=.03928?t/12.92:((t+.055)/1.055)**2.4);return.2126*e+.7152*i+.0722*r<.25}(rt),vt=_t?dl:ul;function xt(t){const e=b.current;var i;R&&e&&((i=R)instanceof aa&&i.isEditing&&i.exitEditing(),t(e,R))}function Ct(t){xt((e,i)=>{i.set(t),i.setCoords(),e.requestRenderAll(),bt(),ft()})}(0,t.useEffect)(()=>{const t=g.current;if(!S||!t)return;const e=ot.render(rt);t.width=e.width,t.height=e.height,t.getContext("2d")?.drawImage(e,0,0)},[S,rt,ot,O]),(0,t.useEffect)(()=>{const t=b.current;S&&t&&(t.getObjects().forEach(t=>t.printblobAutoInk&&t.set({fill:vt})),t.requestRenderAll(),w.current=Object.fromEntries(Object.entries(w.current).map(([e,i])=>[e,e===O?Ol(t):Ml(i,vt)])),pt(Object.keys(w.current)),ft())},[vt,S]),function(e,i){(0,t.useEffect)(()=>{const t=t=>{const r=e.current,s=r?.getActiveObject();if(!r||!s||(n=s)instanceof aa&&n.isEditing||t.target instanceof HTMLElement&&/^(INPUT|TEXTAREA|SELECT)$/.test(t.target.tagName))return;var n;const o=t.shiftKey?10:2,a={ArrowLeft:[-o,0],ArrowRight:[o,0],ArrowUp:[0,-o],ArrowDown:[0,o]}[t.key];a?(t.preventDefault(),s.set({left:s.left+a[0],top:s.top+a[1]}),s.setCoords(),r.requestRenderAll(),i()):"Delete"!==t.key&&"Backspace"!==t.key||(t.preventDefault(),Tl(r,s))};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,i])}(b,bt);const wt="busy"===z.state;return(0,o.jsxs)("div",{className:"printblob-designer__layout",children:[(0,o.jsxs)("div",{className:"printblob-designer__stage-column",children:[(0,o.jsxs)("div",{className:"printblob-designer__views",children:[a.sides.length>1&&(0,o.jsx)("div",{className:"printblob-designer__sides",role:"tablist","aria-label":(0,e.__)("Printed side","printblob"),children:a.sides.map(t=>(0,o.jsxs)("button",{type:"button",role:"tab","aria-selected":O===t.key,className:"printblob-designer__side",onClick:()=>async function(t){const e=b.current;if(t!==O&&e){w.current={...w.current,[O]:Ol(e)},_.current=!0;try{await Dl(e,w.current[t],p[t])}finally{_.current=!1}B(null),k(t),ft()}}(t.key),disabled:!S||wt,children:[t.label,(0,o.jsx)("span",{className:N[t.key]?"printblob-designer__side-dot is-shown":"printblob-designer__side-dot","aria-label":N[t.key]?(0,e.__)("has a print","printblob"):void 0})]},t.key))}),G.map(t=>(0,o.jsx)("button",{type:"button",className:`printblob-designer__side printblob-designer__side--view printblob-designer__side--${t.key}`,"aria-pressed":U===t.key,onClick:()=>q(e=>e===t.key?null:t.key),disabled:!S||wt,children:t.label},t.key)),a.proChip&&(0,o.jsx)("a",{className:"printblob-designer__pro-chip",href:a.proChip.href,title:a.proChip.title,target:"_blank",rel:"noopener",children:a.proChip.label})]}),(0,o.jsxs)("div",{className:"printblob-designer__stage",style:{aspectRatio:`${mt.stage.width} / ${mt.stage.height}`},children:[(0,o.jsxs)("div",{className:"printblob-designer__frame",style:{aspectRatio:`${st.stage.width} / ${st.stage.height}`},children:[(0,o.jsx)("canvas",{ref:g,className:"printblob-designer__shirt","aria-hidden":"true"}),(0,o.jsx)("div",{className:_t?"printblob-designer__area is-on-dark":"printblob-designer__area","aria-hidden":"true",style:{left:st.area.left/st.stage.width*100+"%",top:st.area.top/st.stage.height*100+"%",width:st.area.width/st.stage.width*100+"%",height:st.area.height/st.stage.height*100+"%"}},O),(0,o.jsx)("div",{className:"printblob-designer__canvas",children:(0,o.jsx)("canvas",{ref:y,"aria-label":(0,e.__)("Design area. Drag to move, use the corner handles to resize or rotate.","printblob")})})]}),!S&&(0,o.jsx)("p",{className:"printblob-designer__stage-loading",children:(0,e.__)("Loading the designer…","printblob")}),K&&S&&(0,o.jsx)(K,{config:a,mockups:d,colorHex:rt,side:O,renderSide:yt,revisions:Y})]}),(0,o.jsx)("p",{className:"printblob-designer__hint",children:(0,e.sprintf)(/* translators: 1: print area width in cm, 2: print area height in cm. */ /* translators: 1: print area width in cm, 2: print area height in cm. */
    1111(0,e.__)("Print area %1$d × %2$d cm. Anything outside the dashed line is not printed.","printblob"),st.printCm.width,st.printCm.height)})]}),(0,o.jsxs)("div",{className:"printblob-designer__panel",children:[(0,o.jsx)("h1",{className:"printblob-designer__title",children:a.productName}),(0,o.jsx)("p",{className:"printblob-designer__price",children:i(gt,a.currency)}),(0,o.jsxs)("section",{className:"printblob-designer__section","aria-labelledby":"printblob-print-heading",children:[(0,o.jsx)("h2",{id:"printblob-print-heading",children:(0,e.__)("Your print","printblob")}),(0,o.jsxs)("div",{className:"printblob-designer__tools",children:[(0,o.jsx)("button",{type:"button",className:"printblob-button",onClick:()=>{q(null),x.current?.click()},disabled:!S||wt,children:(0,e.__)("Upload image","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-button printblob-button--quiet",onClick:()=>{q(null),b.current&&Sl(b.current,Cl(b.current,(0,e.__)("Your text","printblob"),st.area,{color:vt,family:f[0]?.family}))},disabled:!S||wt,children:(0,e.__)("Add text","printblob")}),Z.map(t=>(0,o.jsx)("button",{type:"button",className:"printblob-button printblob-button--quiet","aria-expanded":tt===t.key,"aria-controls":`printblob-tool-${t.key}`,onClick:()=>et(tt===t.key?null:t.key),disabled:!S||wt,children:t.label},t.key)),(0,o.jsx)("input",{ref:x,type:"file",accept:Vl.join(","),onChange:async function(t){const e=t.target.files?.[0];t.target.value="",e&&(Vl.includes(e.type)?e.size>a.maxUploadBytes?H({state:"error",message:s(a.maxUploadBytes)}):(H({state:"idle",message:""}),b.current&&await xl(b.current,await function(t){return new Promise((e,i)=>{const r=new FileReader;r.onload=()=>"string"==typeof r.result?e(r.result):i(new Error("The image could not be read.")),r.onerror=()=>i(r.error),r.readAsDataURL(t)})}(e),st.area)):H({state:"error",message:r().imageType}))},hidden:!0})]}),(0,o.jsx)(Wl,{selected:R,items:$,tool:it&&S?(0,o.jsx)("div",{className:"printblob-designer__tool printblob-stack__fill is-shown",id:`printblob-tool-${tt}`,children:(0,o.jsx)(it,{config:a,addImage:async function(t,{vector:e=!1}={}){if(q(null),H({state:"idle",message:""}),b.current)return xl(b.current,t,st.area,{vector:e})},close:()=>et(null)})}):null,printFonts:f,dpi:R?jl(R,st):null,onChoose:function(t){const e=b.current;e&&(wl(t)?Sl(e,t):(e.setActiveObject(t),e.requestRenderAll()),B(t),et(null))},onDone:function(){const t=b.current;t?.discardActiveObject(),t?.requestRenderAll(),B(null)},onChange:Ct,onCentre:()=>Ct({left:vl(st.area).x}),onLayer:function(t){xt((e,i)=>{"up"===t?e.bringObjectForward(i):e.sendObjectBackwards(i),e.requestRenderAll(),bt(),ft()})},onRemove:()=>xt(Tl)})]}),a.colors.length>0&&(0,o.jsxs)("fieldset",{className:"printblob-designer__section",children:[(0,o.jsxs)("legend",{children:[(0,e.__)("Colour","printblob"),(0,o.jsx)(h,{names:a.colors.map(t=>t.name),chosen:a.colors.find(t=>t.slug===D)?.name??""})]}),(0,o.jsx)("div",{className:"printblob-swatches printblob-swatches--shirt",children:a.colors.map(t=>(0,o.jsx)("button",{type:"button",className:"printblob-swatch",style:pl(t.hex),"aria-label":t.name,"aria-pressed":D===t.slug,onClick:()=>M(t.slug),disabled:wt},t.slug))})]}),at&&(0,o.jsx)(c,{label:(0,e.__)("Size","printblob"),choices:a.sizes.map(t=>({key:t.slug,name:t.name,pressed:j===t.slug,disabled:!ut({[lt]:t.slug})||wt,onSelect:()=>E(t.slug)}))}),P.map(t=>(0,o.jsx)(c,{label:t.label,chosen:t.choices.find(e=>e.value===A[t.field])?.name??"",choices:t.choices.map(e=>({key:e.value,name:e.name,pressed:A[t.field]===e.value,disabled:!ut({[t.field]:e.value})||wt,onSelect:()=>F(i=>({...i,[t.field]:e.value}))}))},t.field)),(0,o.jsx)(l,{quantity:L,onQuantity:I,currency:a.currency,shirtPrice:dt,sides:a.sides,printed:N,unitPrice:gt,status:z,disabled:!S||wt,cartUrl:a.endpoints.cart,maxUploadBytes:a.maxUploadBytes,onAddToCart:async function(){const t=b.current;if(!t||v.current)return;w.current={...w.current,[O]:Ol(t)};const e=function(t,e){return t.sides.flatMap(t=>{const i=e[t.key];return i&&kl(i)?[{side:t,json:i}]:[]})}(a,w.current);if(!e.length)return void H({state:"error",message:r().nothingPrinted});if(at&&!j)return void H({state:"error",message:r().chooseSize});if(a.variations.length&&(!ct||!ct.inStock))return void H({state:"error",message:P.length?r().soldOutCombination:r().soldOut});v.current=!0;const[i,s,o]=n();try{H({state:"busy",message:i}),await Hl();const t={color:D,size:j,options:A},n=await async function(t,e,i,r,s){const n=new FormData;n.append("product_id",String(t.productId)),n.append("design",JSON.stringify({color:r.color,size:r.size,options:r.options,sides:Pl(e)}));for(const{side:e,json:r}of i){const i=await Xl(r,e,s(e));n.append(`${e.key}_print`,i.print,`${e.key}-print.png`),n.append(`${e.key}_preview`,i.preview,`${e.key}-preview.png`),t.sendUploads&&Al(r).forEach((t,i)=>{const r=zl(t);var s;n.append(`${e.key}_upload_${i}`,r,`${e.key}-upload-${i}.${s=r.type,Nl[s]??"png"}`)}),await Hl()}return n}(a,w.current,e,t,t=>d[t.key].render(rt));H({state:"busy",message:s});const l=await u.saveDesign(n);H({state:"busy",message:o}),await u.addToCart({id:ct?ct.id:a.productId,productId:a.productId,quantity:L,variation:Gl(a,t),design:l.token}),H({state:"added",message:r().added})}catch(t){H({state:"error",message:t instanceof Error?t.message:String(t)})}finally{v.current=!1}}})]})]})}document.querySelectorAll(".printblob-designer[data-printblob-config]").forEach(e=>{!function(e,i){e.classList.add("printblob-designer");const r=(0,t.createRoot)(e);(0,t.flushSync)(()=>r.render((0,t.createElement)(lh,{config:i})))}(e,JSON.parse(e.dataset.printblobConfig??""))})})();
  • printblob/tags/1.3.0/changelog.txt

    r3750583 r3751408  
    22
    33The current and previous minor versions are in readme.txt.
     4
     5= 1.1.2 =
     6* In themes with a dark mode, the designer's Front and Back switch, its 3D button and its quieter buttons follow the dark colours: they stayed light, with light text that could not be read.
     7
     8= 1.1.1 =
     9* Saving designs is limited per shopper and per IP (30 and 300 an hour; filter `printblob_design_save_limits`), since every save stores files on the shop's server.
     10* A design preview larger than a browser makes is refused before it is processed.
     11* A design that fails part-way through saving leaves no files behind.
     12* Unordered designs are cleaned up twice a day, in batches until none are left, instead of 200 a day.
     13* Site Health checks that print files cannot be downloaded from the web, and gives the nginx rule when they can.
     14* Designs are part of WordPress's Export and Erase Personal Data tools (ordered designs follow WooCommerce's setting for order data), are deleted with their order, and the privacy policy guide says what is stored.
     15* The 3D button is shown only where the browser draws 3D on a graphics processor; where it would draw it in software and stutter, the designer works without it.
     16* Copyright: microcompanies, LLC.
     17
     18= 1.1.0 =
     19* New: a 3D view in the designer. The 3D button turns the product into a garment on a hanger, made from the mockup's front and back photos, with the customer's design printed on each side; drag to turn it, or use Front and Back. Its code loads only when it is opened. It can be turned off under WooCommerce › Settings › PrintBlob.
     20* The bundled t-shirt mockup has its own photo of the back (until now the front photo was used for both sides). Shops still using the bundled photos get it automatically; photos a shop uploaded are never changed.
     21* Mockups can record where the garment is open (sleeve ends, hem, neck) for the 3D view; the bundled t-shirt comes with them.
     22
     23Older entries are in changelog.txt.
    424
    525= 1.0.3 =
  • printblob/tags/1.3.0/includes/class-cart.php

    r3750583 r3751408  
    6060        }
    6161
    62         /** @return array<string, array{preview_id:int, print_path:string, uploads?:string[]}> */
     62        /**
     63         * The printed sides of a cart item's design that its product offers now: a side the shop no longer offers (the
     64         * back once PrintBlob Pro is gone) is neither charged nor ordered.
     65         *
     66         * @return array<string, array{preview_id:int, print_path:string, uploads?:string[]}>
     67         */
    6368        public static function design_sides( array $cart_item ): array {
    64                 if ( empty( $cart_item[ self::ITEM_KEY ] ) ) {
     69                if ( empty( $cart_item[ self::ITEM_KEY ] ) || ! ( ( $cart_item['data'] ?? null ) instanceof \WC_Product ) ) {
    6570                        return array();
    6671                }
    6772                $design = Design_Store::find_by_token( (string) $cart_item[ self::ITEM_KEY ] );
    68                 return $design ? Design_Store::sides( $design->ID ) : array();
     73                return $design ? array_intersect_key( Design_Store::sides( $design->ID ), Mockups::sides_for( $cart_item['data'] ) ) : array();
    6974        }
    7075
  • printblob/tags/1.3.0/includes/class-design-store.php

    r3750583 r3751408  
    543543        public static function mark_ordered( int $design_id, int $order_id ): void {
    544544                update_post_meta( $design_id, self::META_ORDER, $order_id );
     545        }
     546
     547        /**
     548         * Every order with a design, newest (highest ID) first.
     549         *
     550         * @return int[] Order IDs.
     551         */
     552        public static function order_ids(): array {
     553                global $wpdb;
     554                $ids = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT CAST(meta_value AS UNSIGNED) AS order_id FROM {$wpdb->postmeta} WHERE meta_key = %s ORDER BY order_id DESC", self::META_ORDER ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- The distinct orders the designs are saved with: no WordPress API lists distinct meta values, and the answer changes with every order.
     555                return array_values( array_filter( array_map( 'intval', $ids ) ) );
     556        }
     557
     558        /**
     559         * The orders with a design among WooCommerce orders matching a query.
     560         *
     561         * @param array $query wc_get_orders() arguments (status, date_created).
     562         * @return int[] Order IDs, newest first.
     563         */
     564        public static function orders_where( array $query ): array {
     565                $matching = wc_get_orders(
     566                        array(
     567                                'return' => 'ids',
     568                                'limit'  => -1,
     569                        ) + $query
     570                );
     571                return array_values( array_intersect( self::order_ids(), array_map( 'intval', (array) $matching ) ) );
     572        }
     573
     574        /**
     575         * Each designed item of an order and its print files: [ item ID => [ design ID, sides ] ].
     576         *
     577         * @return array<int, array{design:int, sides:array}>
     578         */
     579        public static function order_designs( \WC_Order $order ): array {
     580                $designs = array();
     581                foreach ( $order->get_items() as $item_id => $item ) {
     582                        $design = $item instanceof \WC_Order_Item_Product ? Order::design_for_item( $item ) : null;
     583                        if ( $design ) {
     584                                $designs[ (int) $item_id ] = array(
     585                                        'design' => $design->ID,
     586                                        'sides'  => self::sides( $design->ID ),
     587                                );
     588                        }
     589                }
     590                return $designs;
     591        }
     592
     593        /** How many print files an order has: one per printed side of each designed item. */
     594        public static function print_file_count( \WC_Order $order ): int {
     595                return array_sum( array_map( static fn( array $design ): int => count( $design['sides'] ), self::order_designs( $order ) ) );
    545596        }
    546597
  • printblob/tags/1.3.0/includes/class-designer-data.php

    r3750583 r3751408  
    33 * The designer's data, written once in assets/ and read by its TypeScript and every host too: its fixed numbers
    44 * (designer.json: stage width, print DPI, a new side's area and print size, the editors' limits) and the bundled
    5  * t-shirt (mockups/tee.json).
     5 * t-shirt (mockups/tee.json) with its colours, sizes and starting prices (mockups/shirt.json).
    66 *
    77 * @package PrintBlob
    … …  
    2525        }
    2626
     27        /** @return array{colours:array<int, array{slug:string, name:string, hex:string}>, sizes:string[], price:string, print_price:string} */
     28        public static function shirt(): array {
     29                return self::read( 'mockups/shirt.json' );
     30        }
     31
    2732        /** A printed length in centimetres as pixels of the print file. */
    2833        public static function print_pixels( float $cm ): int {
  • printblob/tags/1.3.0/includes/class-mockups.php

    r3750583 r3751408  
    33 * Mockups: the product photos customers design on.
    44 *
    5  * A mockup is a post (Products › Mockups) with a photo for each printable side, the print area drawn on
    6  * that photo, and the real print size in centimetres. Products with the designer on pick a mockup; the
    7  * designer, the print files and the cart previews all follow it.
     5 * A mockup is a post with a photo for each printable side, the print area drawn on that photo, and the real
     6 * print size in centimetres. Products with the designer on pick a mockup; the designer, the print files and the
     7 * cart previews all follow it. This plugin installs the bundled t-shirt and shows the shop's mockups under
     8 * PrintBlob › Mockups; making and editing mockups is PrintBlob Pro's (its mockup editor turns on the post type's
     9 * screens through `register_post_type_args`).
    810 *
    911 * Print areas are stored as fractions of the photo (0–1), so any photo size works. The designer works on
    … …  
    2325        public const PRODUCT_META   = '_printblob_mockup';
    2426        public const DEFAULT_OPTION = 'printblob_default_mockup';
     27        public const PAGE           = 'printblob-mockups';
     28        public const STYLE          = 'printblob-mockups';
    2529
    2630        /** Revision of the bundled photos the default mockup has been upgraded to (see use_bundled_photos()). */
    2731        private const BUNDLED_REVISION = 'webp-back-3d';
     32
     33        /** @var string The hook name of this plugin's Mockups screen, once the PrintBlob menu has it. */
     34        private static $page = '';
    2835
    2936        /**
    … …  
    3441        public static function sides(): array {
    3542                /**
    36                  * Filters the printable sides of products. Add-ons can add sides (e.g. sleeves); each side gets its
    37                  * own photo, print area, print size and price.
     43                 * Filters the printable sides of products. PrintBlob prints the front; add-ons add sides (PrintBlob Pro the
     44                 * back and the sleeves), each with its own photo, print area, print size and price.
    3845                 *
    3946                 * @param string[] $sides Side keys in display order.
    4047                 */
    41                 $sides = (array) apply_filters( 'printblob_sides', array( 'front', 'back' ) );
     48                $sides = (array) apply_filters( 'printblob_sides', Designer_Data::numbers()['sides'] );
    4249                return array_values( array_unique( array_map( 'sanitize_key', $sides ) ) );
    4350        }
    … …  
    4754                add_action( 'admin_init', array( __CLASS__, 'ensure_default' ) );
    4855                add_action( 'admin_init', array( __CLASS__, 'upgrade_bundled_photo' ) );
    49                 add_action( 'add_meta_boxes_' . self::POST_TYPE, array( __CLASS__, 'add_meta_box' ) );
    50                 add_action( 'save_post_' . self::POST_TYPE, array( __CLASS__, 'save' ) );
     56                add_action( 'printblob_admin_menu', array( __CLASS__, 'add_menu' ) );
    5157                add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_admin' ) );
    52                 add_filter( 'manage_' . self::POST_TYPE . '_posts_columns', array( __CLASS__, 'columns' ) );
    53                 add_action( 'manage_' . self::POST_TYPE . '_posts_custom_column', array( __CLASS__, 'render_column' ), 10, 2 );
    5458        }
    5559
    … …  
    7175                                ),
    7276                                'public'          => false,
    73                                 'show_ui'         => true,
    74                                 'show_in_menu'    => 'edit.php?post_type=product',
     77                                'show_ui'         => false,
     78                                'show_in_menu'    => false,
    7579                                'supports'        => array( 'title' ),
    7680                                'capability_type' => 'product',
    … …  
    218222        }
    219223
     224        /** The photo a mockup has for a side, whether or not this site prints that side: its attachment ID, or 0. */
     225        public static function photo( int $mockup_id, string $side ): int {
     226                $stored = get_post_meta( $mockup_id, self::META, true );
     227                return is_array( $stored ) ? (int) ( $stored['sides'][ $side ]['image'] ?? 0 ) : 0;
     228        }
     229
    220230        /** Kept for setup scripts written for 1.0.2: the same upgrade as use_bundled_photos(). */
    221231        public static function use_bundled_webp(): void {
    … …  
    353363        /* ---------------------------------------------------------------- Admin */
    354364
    355         public static function enqueue_admin(): void {
    356                 $screen = get_current_screen();
    357                 if ( ! $screen || self::POST_TYPE !== $screen->post_type || 'post' !== $screen->base ) {
     365        /** The PrintBlob menu's Mockups entry: the list PrintBlob Pro's editor opens, else this plugin's own screen. */
     366        public static function add_menu( string $menu ): void {
     367                $type = get_post_type_object( self::POST_TYPE );
     368                if ( $type && $type->show_ui ) {
     369                        $list = 'edit.php?post_type=' . self::POST_TYPE;
     370                        add_submenu_page( $menu, $type->labels->name, $type->labels->menu_name, $type->cap->edit_posts, $list );
     371                        add_filter(
     372                                'parent_file',
     373                                static function ( $file ) use ( $list, $menu ) {
     374                                        return $list === $file ? $menu : $file;
     375                                }
     376                        );
    358377                        return;
    359378                }
    360                 wp_enqueue_media();
    361                 wp_enqueue_style( 'printblob-mockup-editor', plugins_url( 'assets/admin/mockup-editor.css', FILE ), array(), VERSION );
    362                 $asset = include dirname( FILE ) . '/build/admin/mockup-editor.asset.php';
    363                 wp_enqueue_script( 'printblob-mockup-editor', plugins_url( 'build/admin/mockup-editor.js', FILE ), array_merge( $asset['dependencies'], array( 'media-editor' ) ), $asset['version'], true );
    364                 wp_localize_script(
    365                         'printblob-mockup-editor',
    366                         'printblobMockupEditor',
    367                         array(
    368                                 'title'  => __( 'Photo for this side', 'printblob' ),
    369                                 'button' => __( 'Use this photo', 'printblob' ),
    370                         )
    371                 );
    372         }
    373 
    374         public static function add_meta_box(): void {
    375                 add_meta_box( 'printblob-mockup', __( 'Printable sides', 'printblob' ), array( __CLASS__, 'render_meta_box' ), self::POST_TYPE, 'normal', 'high' );
    376         }
    377 
    378         public static function render_meta_box( \WP_Post $post ): void {
    379                 wp_nonce_field( 'printblob_mockup', 'printblob_mockup_nonce' );
    380                 $data = self::data( $post->ID );
     379                $page       = add_submenu_page( $menu, __( 'Mockups', 'printblob' ), __( 'Mockups', 'printblob' ), 'edit_products', self::PAGE, array( __CLASS__, 'render_page' ) );
     380                self::$page = $page ? $page : '';
     381        }
     382
     383        /** Where the shop's mockups are shown: PrintBlob Pro's list, else this plugin's Mockups screen. */
     384        public static function screen_url(): string {
     385                $type = get_post_type_object( self::POST_TYPE );
     386                return admin_url( $type && $type->show_ui ? 'edit.php?post_type=' . self::POST_TYPE : 'admin.php?page=' . self::PAGE );
     387        }
     388
     389        public static function enqueue_admin( string $hook ): void {
     390                wp_register_style( self::STYLE, plugins_url( 'assets/admin/mockups.css', FILE ), array(), VERSION );
     391                if ( '' !== self::$page && self::$page === $hook ) {
     392                        wp_enqueue_style( self::STYLE );
     393                }
     394        }
     395
     396        /** A print size as shop managers read it, e.g. "28 × 36 cm". */
     397        public static function print_size( array $print_cm ): string {
     398                /* translators: 1: width in cm, 2: height in cm. */
     399                return sprintf( __( '%1$s × %2$s cm', 'printblob' ), wc_format_localized_decimal( (string) $print_cm['w'] ), wc_format_localized_decimal( (string) $print_cm['h'] ) );
     400        }
     401
     402        public static function render_page(): void {
    381403                ?>
    382                 <p class="description"><?php esc_html_e( 'Upload a photo of the blank product for each side, then drag the blue box over the area that can be printed. Use the corner to resize it. A product on a transparent or plain white background works best.', 'printblob' ); ?></p>
    383                 <p>
    384                         <label>
    385                                 <input type="checkbox" name="printblob_mockup[recolor]" value="1" <?php checked( $data['recolor'] ); ?> />
    386                                 <?php esc_html_e( 'Recolour the photo to the colour the customer picks (for a white or light grey product photo)', 'printblob' ); ?>
    387                         </label>
    388                 </p>
    389                 <div class="printblob-mockup-sides">
    390                         <?php foreach ( $data['sides'] as $key => $side ) : ?>
    391                                 <?php $field = 'printblob_mockup[sides][' . $key . ']'; ?>
    392                                 <fieldset class="printblob-mockup-side" data-printblob-side>
    393                                         <legend><?php echo esc_html( self::side_label( $key ) ); ?></legend>
    394                                         <p>
    395                                                 <label>
    396                                                         <input type="checkbox" name="<?php echo esc_attr( $field ); ?>[enabled]" value="1" <?php checked( $side['enabled'] ); ?> />
    397                                                         <?php esc_html_e( 'Customers can print on this side', 'printblob' ); ?>
    398                                                 </label>
    399                                         </p>
    400                                         <input type="hidden" name="<?php echo esc_attr( $field ); ?>[image]" value="<?php echo esc_attr( (string) $side['image'] ); ?>" data-printblob-image-id />
    401                                         <?php foreach ( array( 'x', 'y', 'w', 'h' ) as $axis ) : ?>
    402                                                 <input type="hidden" name="<?php echo esc_attr( $field ); ?>[area][<?php echo esc_attr( $axis ); ?>]" value="<?php echo esc_attr( (string) $side['area'][ $axis ] ); ?>" data-printblob-area="<?php echo esc_attr( $axis ); ?>" />
     404                <div class="wrap printblob-mockups">
     405                        <h1><?php esc_html_e( 'Mockups', 'printblob' ); ?></h1>
     406                        <p><?php esc_html_e( 'The product photos customers design on, with the print area of each side and its print size. Choose a product’s mockup on its PrintBlob tab.', 'printblob' ); ?></p>
     407                        <div class="printblob-mockups__pro">
     408                                <h2><?php esc_html_e( 'Your own products — mugs, hoodies, bags, your own photos — with the PrintBlob Pro add-on', 'printblob' ); ?></h2>
     409                                <p><?php esc_html_e( 'PrintBlob Pro adds the mockup editor: a photo of your product for each side, the print area drawn on the photo, and the real print size in centimetres.', 'printblob' ); ?></p>
     410                                <p><a class="button button-primary" href="<?php echo esc_url( Pro::checkout_url( 'mockups' ) ); ?>" target="_blank" rel="noopener"><?php esc_html_e( 'Get PrintBlob Pro', 'printblob' ); ?></a></p>
     411                        </div>
     412                        <?php foreach ( self::choices() as $id => $title ) : ?>
     413                                <?php $data = self::data( (int) $id ); ?>
     414                                <h2><?php echo esc_html( $title ); ?></h2>
     415                                <?php if ( $data['recolor'] ) : ?>
     416                                        <p class="description"><?php esc_html_e( 'Recoloured to the colour the customer picks.', 'printblob' ); ?></p>
     417                                <?php endif; ?>
     418                                <div class="printblob-mockup-sides">
     419                                        <?php foreach ( $data['sides'] as $key => $side ) : ?>
     420                                                <?php
     421                                                if ( ! $side['enabled'] || ! $side['image'] ) {
     422                                                        continue;
     423                                                }
     424                                                ?>
     425                                                <figure class="printblob-mockup-side">
     426                                                        <div class="printblob-mockup-stage">
     427                                                                <img src="<?php echo esc_url( (string) wp_get_attachment_image_url( $side['image'], 'large' ) ); ?>" alt="" />
     428                                                                <svg class="printblob-mockup-stage__area" viewBox="0 0 1 1" preserveAspectRatio="none" aria-hidden="true" focusable="false"><rect x="<?php echo esc_attr( (string) $side['area']['x'] ); ?>" y="<?php echo esc_attr( (string) $side['area']['y'] ); ?>" width="<?php echo esc_attr( (string) $side['area']['w'] ); ?>" height="<?php echo esc_attr( (string) $side['area']['h'] ); ?>" vector-effect="non-scaling-stroke" /></svg>
     429                                                        </div>
     430                                                        <figcaption><strong><?php echo esc_html( self::side_label( $key ) ); ?></strong> <?php echo esc_html( self::print_size( $side['print_cm'] ) ); ?></figcaption>
     431                                                </figure>
    403432                                        <?php endforeach; ?>
    404                                         <div class="printblob-mockup-stage" data-printblob-stage>
    405                                                 <?php if ( $side['image'] ) : ?>
    406                                                         <img src="<?php echo esc_url( (string) wp_get_attachment_image_url( $side['image'], 'large' ) ); ?>" alt="" data-printblob-photo />
    407                                                 <?php else : ?>
    408                                                         <img src="" alt="" data-printblob-photo hidden />
    409                                                 <?php endif; ?>
    410                                                 <div class="printblob-mockup-area" data-printblob-box<?php echo $side['image'] ? '' : ' hidden'; ?>>
    411                                                         <span class="printblob-mockup-area__handle" data-printblob-handle aria-hidden="true"></span>
    412                                                 </div>
    413                                         </div>
    414                                         <p><button type="button" class="button" data-printblob-choose><?php esc_html_e( 'Choose photo', 'printblob' ); ?></button></p>
    415                                         <p class="printblob-mockup-size">
    416                                                 <label><?php esc_html_e( 'Print width (cm)', 'printblob' ); ?> <input type="number" min="1" max="200" step="0.5" name="<?php echo esc_attr( $field ); ?>[print_cm][w]" value="<?php echo esc_attr( (string) $side['print_cm']['w'] ); ?>" /></label>
    417                                                 <label><?php esc_html_e( 'Print height (cm)', 'printblob' ); ?> <input type="number" min="1" max="200" step="0.5" name="<?php echo esc_attr( $field ); ?>[print_cm][h]" value="<?php echo esc_attr( (string) $side['print_cm']['h'] ); ?>" /></label>
    418                                         </p>
    419                                 </fieldset>
     433                                </div>
    420434                        <?php endforeach; ?>
    421435                </div>
    422436                <?php
    423437        }
    424 
    425         public static function save( int $post_id ): void {
    426                 if ( ! isset( $_POST['printblob_mockup_nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['printblob_mockup_nonce'] ) ), 'printblob_mockup' )
    427                         || ! current_user_can( 'edit_post', $post_id ) || wp_is_post_revision( $post_id ) ) {
    428                         return;
    429                 }
    430                 $input   = isset( $_POST['printblob_mockup'] ) && is_array( $_POST['printblob_mockup'] ) ? wp_unslash( $_POST['printblob_mockup'] ) : array(); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Each value is sanitised below.
    431                 $clamp   = static fn( $value, float $min, float $max ): float => max( $min, min( $max, (float) $value ) );
    432                 $numbers = Designer_Data::numbers();
    433                 $start   = $numbers['new_side'];
    434                 $data    = array(
    435                         'recolor' => ! empty( $input['recolor'] ),
    436                         'sides'   => array(),
    437                 );
    438                 foreach ( self::sides() as $key ) {
    439                         $side                  = $input['sides'][ $key ] ?? array();
    440                         $x                     = $clamp( $side['area']['x'] ?? $start['area']['x'], 0, $numbers['area_start_max'] );
    441                         $y                     = $clamp( $side['area']['y'] ?? $start['area']['y'], 0, $numbers['area_start_max'] );
    442                         $image                 = absint( $side['image'] ?? 0 );
    443                         $data['sides'][ $key ] = array(
    444                                 'enabled'  => ! empty( $side['enabled'] ),
    445                                 'image'    => $image && wp_attachment_is_image( $image ) ? $image : 0,
    446                                 'area'     => array(
    447                                         'x' => round( $x, 4 ),
    448                                         'y' => round( $y, 4 ),
    449                                         'w' => round( $clamp( $side['area']['w'] ?? $start['area']['w'], $numbers['area_min'], 1 - $x ), 4 ),
    450                                         'h' => round( $clamp( $side['area']['h'] ?? $start['area']['h'], $numbers['area_min'], 1 - $y ), 4 ),
    451                                 ),
    452                                 'print_cm' => array(
    453                                         'w' => $clamp( $side['print_cm']['w'] ?? $start['print_cm']['w'], $numbers['print_cm_range']['min'], $numbers['print_cm_range']['max'] ),
    454                                         'h' => $clamp( $side['print_cm']['h'] ?? $start['print_cm']['h'], $numbers['print_cm_range']['min'], $numbers['print_cm_range']['max'] ),
    455                                 ),
    456                         );
    457                 }
    458                 update_post_meta( $post_id, self::META, $data );
    459         }
    460 
    461         public static function columns( array $columns ): array {
    462                 return array_slice( $columns, 0, 2, true ) + array( 'printblob_sides' => __( 'Sides', 'printblob' ) ) + array_slice( $columns, 2, null, true );
    463         }
    464 
    465         public static function render_column( string $column, int $post_id ): void {
    466                 if ( 'printblob_sides' !== $column ) {
    467                         return;
    468                 }
    469                 $labels = array();
    470                 foreach ( self::data( $post_id )['sides'] as $key => $side ) {
    471                         if ( $side['enabled'] && $side['image'] ) {
    472                                 /* translators: 1: side name, 2: width in cm, 3: height in cm. */
    473                                 $labels[] = sprintf( __( '%1$s (%2$s × %3$s cm)', 'printblob' ), self::side_label( $key ), wc_format_localized_decimal( $side['print_cm']['w'] ), wc_format_localized_decimal( $side['print_cm']['h'] ) );
    474                         }
    475                 }
    476                 echo esc_html( $labels ? implode( ', ', $labels ) : __( 'No sides set up', 'printblob' ) );
    477         }
    478438}
  • printblob/tags/1.3.0/includes/class-onboarding.php

    r3750583 r3751408  
    33 * First steps after activation: a dismissible notice with the three things to set up.
    44 *
    5  * Shown to shop managers on the Plugins screen and PrintBlob's own screens (its settings tab and the mockups) until
    6  * dismissed.
     5 * Shown to shop managers on the Plugins screen and PrintBlob's own screens until dismissed, and only while no product has
     6 * the designer on: a shop that has set one up never sees it again.
    77 *
    88 * @package PrintBlob
    … …  
    3131                        return;
    3232                }
     33                echo wp_kses( self::notice_html(), self::NOTICE_HTML );
     34        }
     35
     36        /** What notice_html() prints. */
     37        public const NOTICE_HTML = array(
     38                'div'    => array( 'class' => true ),
     39                'p'      => array(),
     40                'strong' => array(),
     41                'ol'     => array(),
     42                'li'     => array(),
     43                'a'      => array(
     44                        'href'   => true,
     45                        'class'  => true,
     46                        'target' => true,
     47                        'rel'    => true,
     48                ),
     49        );
     50
     51        /** The first steps, while no product has the designer on; empty once one has. */
     52        public static function notice_html(): string {
     53                if ( Product_Settings::designer_products( 1 )['total'] > 0 ) {
     54                        return '';
     55                }
    3356                $dismiss = wp_nonce_url( admin_url( 'admin-post.php?action=printblob_dismiss_welcome' ), 'printblob_dismiss_welcome' );
    3457                $steps   = array(
    3558                        sprintf(
    36                                 /* translators: %s: link to Products › Mockups. */
    37                                 __( 'Check the t-shirt mockup or add your own product photos and print areas under %s.', 'printblob' ),
    38                                 '<a href="' . esc_url( admin_url( 'edit.php?post_type=' . Mockups::POST_TYPE ) ) . '">' . esc_html__( 'Products › Mockups', 'printblob' ) . '</a>'
     59                                /* translators: %s: link to PrintBlob › Mockups. */
     60                                esc_html__( 'Check the bundled product mockup under %s.', 'printblob' ),
     61                                '<a href="' . esc_url( Mockups::screen_url() ) . '">' . esc_html__( 'PrintBlob › Mockups', 'printblob' ) . '</a>'
    3962                        ),
    4063                        sprintf(
    4164                                /* translators: %s: link to Products. */
    42                                 __( 'Edit a product, open its PrintBlob designer tab, turn the designer on and set the print price per side (%s).', 'printblob' ),
     65                                esc_html__( 'Edit a product, open its PrintBlob designer tab, turn the designer on and set the print price per side (%s).', 'printblob' ),
    4366                                '<a href="' . esc_url( admin_url( 'edit.php?post_type=product' ) ) . '">' . esc_html__( 'Products', 'printblob' ) . '</a>'
    4467                        ),
    45                         __( 'Add the PrintBlob designer block to a page, or open the product: the designer shows on its page.', 'printblob' ),
     68                        esc_html__( 'Add the PrintBlob designer block to a page, or open the product: the designer shows on its page.', 'printblob' ),
    4669                );
    47                 ?>
    48                 <div class="notice notice-info">
    49                         <p><strong><?php esc_html_e( 'PrintBlob is ready. Three steps to your first designable product:', 'printblob' ); ?></strong></p>
    50                         <ol>
    51                                 <?php foreach ( $steps as $step ) : ?>
    52                                         <li><?php echo wp_kses( $step, array( 'a' => array( 'href' => true ) ) ); ?></li>
    53                                 <?php endforeach; ?>
    54                         </ol>
    55                         <p>
    56                                 <a class="button button-primary" href="<?php echo esc_url( Settings::url() ); ?>"><?php esc_html_e( 'PrintBlob settings', 'printblob' ); ?></a>
    57                                 <a class="button" href="<?php echo esc_url( FACTS['docs'] ); ?>" target="_blank" rel="noopener"><?php esc_html_e( 'Documentation', 'printblob' ); ?></a>
    58                                 <a href="<?php echo esc_url( $dismiss ); ?>" style="margin-left:8px"><?php esc_html_e( 'Dismiss', 'printblob' ); ?></a>
    59                         </p>
    60                 </div>
    61                 <?php
     70                $items   = implode( '', array_map( static fn( string $step ): string => '<li>' . $step . '</li>', $steps ) );
     71                return sprintf(
     72                        '<div class="notice notice-info printblob-welcome"><p><strong>%1$s</strong></p><ol>%2$s</ol><p><a class="button button-primary" href="%3$s">%4$s</a> <a class="button" href="%5$s" target="_blank" rel="noopener">%6$s</a> <a href="%7$s">%8$s</a></p></div>',
     73                        esc_html__( 'PrintBlob is ready. Three steps to your first designable product:', 'printblob' ),
     74                        $items,
     75                        esc_url( Quick_Setup::url() ),
     76                        esc_html__( 'Quick setup: all three in one click', 'printblob' ),
     77                        esc_url( FACTS['docs'] ),
     78                        esc_html__( 'Documentation', 'printblob' ),
     79                        esc_url( $dismiss ),
     80                        esc_html__( 'Dismiss', 'printblob' )
     81                );
    6282        }
    6383
  • printblob/tags/1.3.0/includes/class-order.php

    r3750583 r3751408  
    110110                if ( ! $offered ) {
    111111                        $offered = true;
    112                         echo wp_kses_post( self::pro_hint() );
     112                        $order   = $item->get_order();
     113                        echo wp_kses_post( self::pro_hint( $order instanceof \WC_Order ? Design_Store::print_file_count( $order ) : 0 ) );
    113114                }
    114115        }
    115116
    116117        /**
    117          * One quiet line under an order's first designed item about what PrintBlob Pro adds there, while Pro is not active
    118          * and until this admin dismisses it. No prices or trial lengths.
     118         * One quiet line under an order's first designed item about the PrintBlob Pro add-on's ZIP of its print files, while
     119         * Pro is not active and until this admin dismisses it.
    119120         *
     121         * @param int       $files      The order's print files.
    120122         * @param bool|null $pro_active Whether Pro is active; Settings::pro_active() when null.
    121123         * @param int|null  $user_id    The admin; the current user when null.
    122124         */
    123         public static function pro_hint( ?bool $pro_active = null, ?int $user_id = null ): string {
    124                 if ( ( $pro_active ?? Settings::pro_active() ) || get_user_meta( $user_id ?? get_current_user_id(), self::PRO_HINT_DISMISSED, true ) ) {
     125        public static function pro_hint( int $files, ?bool $pro_active = null, ?int $user_id = null ): string {
     126                if ( $files < 1 || ( $pro_active ?? Settings::pro_active() ) || get_user_meta( $user_id ?? get_current_user_id(), self::PRO_HINT_DISMISSED, true ) ) {
    125127                        return '';
    126128                }
    127129                return sprintf(
    128130                        '<p class="printblob-pro-hint description">%1$s <a href="%2$s" target="_blank" rel="noopener">%3$s</a> · <a href="%4$s">%5$s</a></p>',
    129                         esc_html__( 'Download all print files of an order as one ZIP, and work through a print queue, with PrintBlob Pro.', 'printblob' ),
    130                         esc_url( FACTS['pricing'] ),
    131                         esc_html__( 'About PrintBlob Pro', 'printblob' ),
     131                        /* translators: %d: number of print files of the order. */
     132                        esc_html( sprintf( _n( 'This order’s %d print file in one ZIP, with PrintBlob Pro.', 'This order’s %d print files in one ZIP, with PrintBlob Pro.', $files, 'printblob' ), $files ) ),
     133                        esc_url( Pro::checkout_url( 'order-zip' ) ),
     134                        esc_html__( 'About the PrintBlob Pro add-on', 'printblob' ),
    132135                        esc_url( wp_nonce_url( admin_url( 'admin-post.php?action=printblob_dismiss_pro_hint' ), 'printblob_dismiss_pro_hint' ) ),
    133136                        esc_html__( 'Dismiss', 'printblob' )
  • printblob/tags/1.3.0/includes/class-product-settings.php

    r3750583 r3751408  
    2222                add_action( 'woocommerce_admin_process_product_object', array( __CLASS__, 'save' ) );
    2323                add_filter( 'single_template_hierarchy', array( __CLASS__, 'designer_template' ) );
     24                add_action( 'init', array( __CLASS__, 'register_designer_template' ) );
     25                add_action( 'woocommerce_before_single_product', array( __CLASS__, 'classic_designer' ) );
    2426                // A designed shirt always has a print: listed prices include the cheapest printed side.
    2527                foreach ( array( 'price', 'regular_price', 'sale_price' ) as $printblob_kind ) {
    … …  
    8991
    9092        /**
    91          * Designer products use the theme's `single-product-designer` template when it has one;
    92          * otherwise the normal product template is used.
     93         * Designer products use the `single-product-designer` template: the theme's own when it has one, otherwise the one
     94         * PrintBlob registers for block themes (register_designer_template()). Classic themes get the designer through
     95         * WooCommerce's product hooks (classic_designer()).
    9396         */
    9497        public static function designer_template( array $templates ): array {
    … …  
    98101                }
    99102                return $templates;
     103        }
     104
     105        /** The product page of a designer product in a block theme: the theme's header and footer around the designer. */
     106        public static function register_designer_template(): void {
     107                if ( ! function_exists( 'register_block_template' ) || ! wp_is_block_theme() ) {
     108                        return;
     109                }
     110                register_block_template(
     111                        'printblob//single-product-designer',
     112                        array(
     113                                'title'       => __( 'Product with the PrintBlob designer', 'printblob' ),
     114                                'description' => __( 'The page of a product with the PrintBlob designer turned on: customers design their print, choose colour and size, and add it to the cart.', 'printblob' ),
     115                                'content'     => '<!-- wp:template-part {"slug":"header","tagName":"header"} /-->'
     116                                        . '<!-- wp:group {"tagName":"main","align":"wide","layout":{"type":"constrained"}} --><main class="wp-block-group alignwide">'
     117                                        . '<!-- wp:printblob/designer {"align":"wide"} /-->'
     118                                        . '<!-- wp:woocommerce/product-details {"align":"wide"} /-->'
     119                                        . '</main><!-- /wp:group -->'
     120                                        . '<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->',
     121                        )
     122                );
     123        }
     124
     125        /**
     126         * The product page of a designer product in a classic theme: the designer, which shows the product's name, price and
     127         * cart button itself, in place of WooCommerce's photos and summary.
     128         */
     129        public static function classic_designer(): void {
     130                $product = wc_get_product( get_the_ID() );
     131                if ( wp_is_block_theme() || ! $product || ! self::is_enabled( $product ) ) {
     132                        return;
     133                }
     134                remove_action( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_sale_flash', 10 );
     135                remove_action( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 20 );
     136                remove_all_actions( 'woocommerce_single_product_summary' );
     137                add_action(
     138                        'woocommerce_before_single_product_summary',
     139                        static function () use ( $product ): void {
     140                                echo render_block( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- The designer block's own markup, escaped in its render.php.
     141                                        array(
     142                                                'blockName'    => 'printblob/designer',
     143                                                'attrs'        => array( 'productId' => $product->get_id() ),
     144                                                'innerBlocks'  => array(),
     145                                                'innerHTML'    => '',
     146                                                'innerContent' => array(),
     147                                        )
     148                                );
     149                        }
     150                );
     151        }
     152
     153        /**
     154         * Products with the designer on, in any status but the trash, last changed first.
     155         *
     156         * @param int $limit How many IDs to return.
     157         * @return array{ids:int[], total:int}
     158         */
     159        public static function designer_products( int $limit ): array {
     160                $query = new \WP_Query(
     161                        array(
     162                                'post_type'      => 'product',
     163                                'post_status'    => 'any',
     164                                'posts_per_page' => $limit,
     165                                'fields'         => 'ids',
     166                                'orderby'        => 'modified',
     167                                'order'          => 'DESC',
     168                                'meta_key'       => self::META_ENABLED, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- The products with the designer on, for the overview and the first steps.
     169                                'meta_value'     => 'yes', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value -- As above.
     170                        )
     171                );
     172                return array(
     173                        'ids'   => array_map( 'intval', $query->posts ),
     174                        'total' => (int) $query->found_posts,
     175                );
    100176        }
    101177
    … …  
    137213                                'id'          => Mockups::PRODUCT_META,
    138214                                'label'       => __( 'Mockup', 'printblob' ),
    139                                 'description' => __( 'The product photo customers design on, with its print areas. Manage mockups under Products › Mockups.', 'printblob' ),
     215                                'description' => __( 'The product photo customers design on, with its print areas. The shop’s mockups are under PrintBlob › Mockups.', 'printblob' ),
    140216                                'desc_tip'    => true,
    141217                                'value'       => (string) ( $chosen ? $chosen : $default ),
    … …  
    155231                        );
    156232                }
     233                echo wp_kses( Pro::product_html( Mockups::sides() ), Pro::LOCK_HTML );
    157234                /**
    158235                 * Fires at the end of the product's PrintBlob tab, for other plugins' settings of the designer.
  • printblob/tags/1.3.0/includes/class-review-request.php

    r3750583 r3751408  
    11<?php
    22/**
    3  * One request for a review on WordPress.org. Once the shop has its first order with a design, PrintBlob's own
    4  * screens (its settings tab and the mockup screens) ask once; following the request or dismissing it ends it for
    5  * good, for every admin. Nothing is offered for a review.
     3 * A request for a review on WordPress.org, on PrintBlob's own screens: once the shop has its first order with a design,
     4 * and once more at its tenth unless the first was followed or dismissed for good. Following a request, or dismissing it
     5 * for good, ends it for every admin. Nothing is offered for a review.
    66 *
    77 * @package PrintBlob
    … …  
    1414final class Review_Request {
    1515
    16         /** 'waiting' (no order with a design yet), 'due', or 'done' (followed or dismissed). */
     16        /**
     17         * 'waiting' (no order with a design yet), 'due' (the first request), 'later' (dismissed until the second milestone),
     18         * 'due-again' (the second request) or 'done' (followed, or dismissed for good).
     19         */
    1720        public const OPTION = 'printblob_review_request';
     21
     22        /** Orders with designs at which the request is made a second time. */
     23        public const SECOND_MILESTONE = 10;
    1824
    1925        public const REVIEW_URL = FACTS['reviews'];
    … …  
    2430        }
    2531
    26         /** An order with a design makes the request due, unless it has been answered. */
     32        /** An order with a design makes the first request due, and at the second milestone the second one. */
    2733        public static function order_with_design(): void {
    28                 if ( 'done' !== get_option( self::OPTION ) ) {
     34                $state = (string) get_option( self::OPTION, '' );
     35                if ( in_array( $state, array( '', 'waiting' ), true ) ) {
    2936                        update_option( self::OPTION, 'due', false );
     37                } elseif ( 'later' === $state && count( Design_Store::order_ids() ) >= self::SECOND_MILESTONE ) {
     38                        update_option( self::OPTION, 'due-again', false );
    3039                }
    3140        }
    … …  
    5867
    5968        public static function notice_html(): string {
    60                 if ( 'due' !== self::state() ) {
     69                $state = self::state();
     70                if ( ! in_array( $state, array( 'due', 'due-again' ), true ) ) {
    6171                        return '';
    6272                }
    6373                $answer = static fn( string $answer ): string => wp_nonce_url( admin_url( 'admin-post.php?action=printblob_review_request&answer=' . $answer ), 'printblob_review_request' );
     74                $later  = 'due' === $state
     75                        ? sprintf( ' <a class="button" href="%1$s">%2$s</a> <a href="%3$s">%4$s</a>', esc_url( $answer( 'dismiss' ) ), esc_html__( 'Dismiss', 'printblob' ), esc_url( $answer( 'never' ) ), esc_html__( 'Don’t ask again', 'printblob' ) )
     76                        : sprintf( ' <a class="button" href="%1$s">%2$s</a>', esc_url( $answer( 'never' ) ), esc_html__( 'Dismiss', 'printblob' ) );
    6477                return sprintf(
    65                         '<div class="notice notice-info printblob-review-request"><p>%1$s</p><p><a class="button button-primary" href="%2$s" target="_blank" rel="noopener">%3$s</a> <a class="button" href="%4$s">%5$s</a></p></div>',
    66                         esc_html__( 'Your shop has its first order with a PrintBlob design. If PrintBlob is useful to you, a review on WordPress.org helps other shops find it.', 'printblob' ),
     78                        '<div class="notice notice-info printblob-review-request"><p>%1$s</p><p><a class="button button-primary" href="%2$s" target="_blank" rel="noopener">%3$s</a>%4$s</p></div>',
     79                        'due' === $state
     80                                ? esc_html__( 'Your shop has its first order with a PrintBlob design. If PrintBlob is useful to you, a review on WordPress.org helps other shops find it.', 'printblob' )
     81                                /* translators: %d: number of orders with designs. */
     82                                : esc_html( sprintf( __( 'Your shop has had %d orders with PrintBlob designs. If PrintBlob is useful to you, a review on WordPress.org helps other shops find it.', 'printblob' ), self::SECOND_MILESTONE ) ),
    6783                        esc_url( $answer( 'review' ) ),
    6884                        esc_html__( 'Write a review', 'printblob' ),
    69                         esc_url( $answer( 'dismiss' ) ),
    70                         esc_html__( 'Dismiss', 'printblob' )
     85                        $later
    7186                );
    7287        }
    7388
    7489        /**
    75          * Records the admin's answer: following the request or dismissing it ends it for good.
     90         * Records the admin's answer. Following a request, "Don't ask again" and dismissing the second request end it for
     91         * good; dismissing the first waits for the second milestone, unless the shop has reached it already.
    7692         *
    77          * @param string $answer 'review' or 'dismiss'.
     93         * @param string $answer 'review', 'dismiss' or 'never'.
    7894         */
    7995        public static function answer( string $answer ): void {
    80                 if ( in_array( $answer, array( 'review', 'dismiss' ), true ) ) {
     96                if ( in_array( $answer, array( 'review', 'never' ), true ) ) {
    8197                        update_option( self::OPTION, 'done', false );
     98                } elseif ( 'dismiss' === $answer ) {
     99                        $first = 'due' === self::state() && count( Design_Store::order_ids() ) < self::SECOND_MILESTONE;
     100                        update_option( self::OPTION, $first ? 'later' : 'done', false );
    82101                }
    83102        }
  • printblob/tags/1.3.0/includes/class-settings-page.php

    r3750583 r3751408  
    2828        protected function get_settings_for_default_section() {
    2929                $attributes = Settings::attribute_choices();
     30                $pro        = Settings::pro_rows();
    3031                $designer   = array(
    3132                        array(
    … …  
    3435                                'title' => __( 'Designer', 'printblob' ),
    3536                                'desc'  => sprintf(
    36                                         /* translators: %s: link to Products › Mockups. */
    37                                         __( 'Turn the designer on per product in its PrintBlob tab. Product photos and print areas are set up under %s.', 'printblob' ),
    38                                         '<a href="' . esc_url( admin_url( 'edit.php?post_type=' . Mockups::POST_TYPE ) ) . '">' . esc_html__( 'Products › Mockups', 'printblob' ) . '</a>'
     37                                        /* translators: %s: link to PrintBlob › Mockups. */
     38                                        __( 'Turn the designer on per product in its PrintBlob tab. The product photos and their print areas are under %s.', 'printblob' ),
     39                                        '<a href="' . esc_url( Mockups::screen_url() ) . '">' . esc_html__( 'PrintBlob › Mockups', 'printblob' ) . '</a>'
    3940                                ),
    4041                        ),
    … …  
    8990                                ),
    9091                        ),
     92                );
     93                return array_merge(
     94                        $designer,
     95                        $pro['fonts'],
    9196                        array(
    92                                 'id'   => 'printblob_designer',
    93                                 'type' => 'sectionend',
     97                                array(
     98                                        'id'   => 'printblob_designer',
     99                                        'type' => 'sectionend',
     100                                ),
    94101                        ),
     102                        $pro['panel']
    95103                );
    96                 return array_merge( $designer, Settings::pro_panel() );
    97104        }
    98105}
  • printblob/tags/1.3.0/includes/class-settings.php

    r3750583 r3751408  
    2323                add_filter( 'plugin_action_links_' . plugin_basename( FILE ), array( __CLASS__, 'action_links' ) );
    2424                add_filter( 'plugin_row_meta', array( __CLASS__, 'row_meta' ), 10, 2 );
     25                add_action( 'woocommerce_admin_field_printblob_pro_lock', array( __CLASS__, 'pro_lock_field' ) );
    2526        }
    2627
    2728        /**
    28          * Links under the plugin's description: documentation, and PrintBlob Pro's plans while Pro is not active.
     29         * Links under the plugin's description: documentation, a request to rate PrintBlob, and, while Pro is not active,
     30         * PrintBlob Pro's 3D view and trial.
    2931         *
    3032         * @param string[]  $links      The row's links.
    … …  
    3739                }
    3840                $links[] = '<a href="' . esc_url( FACTS['docs'] ) . '" target="_blank" rel="noopener">' . esc_html__( 'Documentation', 'printblob' ) . '</a>';
     41                $links[] = '<a href="' . esc_url( FACTS['reviews'] ) . '" target="_blank" rel="noopener">' . esc_html__( 'Rate PrintBlob ★★★★★', 'printblob' ) . '</a>';
    3942                if ( ! ( $pro_active ?? self::pro_active() ) ) {
    40                         $links[] = '<a href="' . esc_url( FACTS['pricing'] ) . '" target="_blank" rel="noopener">' . esc_html__( 'PrintBlob Pro: sleeves, print queue, your own fonts', 'printblob' ) . '</a>';
     43                        $days = (int) FACTS['pro']['trial_days'];
     44                        /* translators: %d: days of PrintBlob Pro's free trial. */
     45                        $links[] = '<a href="' . esc_url( Pro::checkout_url( 'plugins-row' ) ) . '" target="_blank" rel="noopener">' . esc_html( sprintf( _n( 'PrintBlob Pro add-on: the 3D view and more, free for %d day', 'PrintBlob Pro add-on: the 3D view and more, free for %d days', $days, 'printblob' ), $days ) ) . '</a>';
    4146                }
    4247                return $links;
    … …  
    7782        }
    7883
    79         /** Whether a screen is PrintBlob's own: its settings tab, or a mockup screen. */
     84        /** Whether a screen is PrintBlob's own: its menu's pages, its settings tab, or a mockup screen. */
    8085        public static function own_screen( string $screen_id, string $post_type, string $tab ): bool {
    81                 return ( 'woocommerce_page_wc-settings' === $screen_id && 'printblob' === $tab ) || Mockups::POST_TYPE === $post_type;
     86                return Admin_Menu::SCREEN === $screen_id || str_starts_with( $screen_id, Admin_Menu::SCREEN_PREFIX )
     87                        || ( 'woocommerce_page_wc-settings' === $screen_id && 'printblob' === $tab ) || Mockups::POST_TYPE === $post_type;
    8288        }
    8389
    … …  
    96102
    97103        /**
    98          * The PrintBlob Pro panel at the end of the settings screen: what Pro adds and where its plans are, while Pro is not
    99          * active. No prices or trial lengths here; printblob.com's plans are the one source.
     104         * The settings screen's PrintBlob Pro rows while Pro is not active: "Upload your own fonts" switched off in the designer
     105         * section, and a panel at the end with what Pro adds, its trial and prices.
    100106         *
    101107         * @param bool|null $pro_active Whether Pro is active; self::pro_active() when null.
    102          * @return array[] WooCommerce settings rows, none while Pro is active.
     108         * @return array{fonts:array[], panel:array[]} WooCommerce settings rows, none while Pro is active.
    103109         */
    104         public static function pro_panel( ?bool $pro_active = null ): array {
     110        public static function pro_rows( ?bool $pro_active = null ): array {
    105111                if ( $pro_active ?? self::pro_active() ) {
    106                         return array();
     112                        return array(
     113                                'fonts' => array(),
     114                                'panel' => array(),
     115                        );
    107116                }
     117                $points = implode( '', array_map( static fn( string $point ): string => '<li>' . esc_html( $point ) . '</li>', Pro::points() ) );
    108118                return array(
    109                         array(
    110                                 'id'    => 'printblob_pro',
    111                                 'type'  => 'title',
    112                                 'title' => __( 'PrintBlob Pro', 'printblob' ),
    113                                 'desc'  => sprintf(
    114                                         '<p>%1$s</p><p><a class="button" href="%2$s" target="_blank" rel="noopener">%3$s</a></p>',
    115                                         esc_html__( 'PrintBlob Pro adds a 3D view of the product, sleeve printing, a print queue that downloads every print file of an order as one ZIP, and your own fonts, with automatic updates and priority support. It is a separate plugin from printblob.com; everything here works without it.', 'printblob' ),
    116                                         esc_url( FACTS['pricing'] ),
    117                                         esc_html__( 'PrintBlob Pro’s plans', 'printblob' )
     119                        'fonts' => array(
     120                                array(
     121                                        'id'    => 'printblob_pro_fonts',
     122                                        'type'  => 'printblob_pro_lock',
     123                                        'title' => __( 'Upload your own fonts', 'printblob' ),
     124                                        'from'  => 'settings-fonts',
    118125                                ),
    119126                        ),
    120                         array(
    121                                 'id'   => 'printblob_pro',
    122                                 'type' => 'sectionend',
     127                        'panel' => array(
     128                                array(
     129                                        'id'    => 'printblob_pro',
     130                                        'type'  => 'title',
     131                                        'title' => __( 'PrintBlob Pro', 'printblob' ),
     132                                        'desc'  => sprintf(
     133                                                '<p><strong>%1$s</strong> %2$s %3$s</p><ul class="ul-disc">%4$s</ul><p>%5$s <a href="%6$s">%7$s</a></p><p>%8$s</p>',
     134                                                esc_html( Pro::trial_text() ),
     135                                                esc_html( Pro::prices_text() . '.' ),
     136                                                esc_html( Pro::refund_text() ),
     137                                                $points,
     138                                                Pro::buttons_html( 'settings-panel' ),
     139                                                esc_url( Pro::compare_url() ),
     140                                                esc_html__( 'Compare free and Pro', 'printblob' ),
     141                                                esc_html( Pro::separate_text() )
     142                                        ),
     143                                ),
     144                                array(
     145                                        'id'   => 'printblob_pro',
     146                                        'type' => 'sectionend',
     147                                ),
    123148                        ),
    124149                );
     150        }
     151
     152        /**
     153         * A Pro row of the settings screen: its name and the control that opens the upgrade box.
     154         *
     155         * @param array $field The row: title and from (its placement).
     156         */
     157        public static function pro_lock_field( array $field ): void {
     158                ?>
     159                <tr>
     160                        <th scope="row" class="titledesc"><?php echo esc_html( $field['title'] ); ?></th>
     161                        <td class="forminp"><?php echo wp_kses( Pro::lock_html( (string) $field['from'] ), Pro::LOCK_HTML ); ?></td>
     162                </tr>
     163                <?php
    125164        }
    126165
  • printblob/tags/1.3.0/includes/facts.json

    r3750583 r3751408  
    11{
    22        "docs": "https://printblob.com/docs/",
    3         "pricing": "https://printblob.com/pricing/",
    4         "reviews": "https://wordpress.org/support/plugin/printblob/reviews/#new-post"
     3        "reviews": "https://wordpress.org/support/plugin/printblob/reviews/#new-post",
     4        "get_pro": "https://printblob.com/get-pro/",
     5        "placements": [
     6                "overview-card",
     7                "overview-line",
     8                "compare",
     9                "menu",
     10                "plugins-row",
     11                "product-sleeves",
     12                "order-zip",
     13                "settings-panel",
     14                "mockups",
     15                "product-3d",
     16                "product-back",
     17                "settings-fonts",
     18                "queue-zip",
     19                "dashboard",
     20                "orders-milestone",
     21                "storefront-3d",
     22                "deactivate",
     23                "quick-setup"
     24        ],
     25        "feedback": {
     26                "url": "https://printblob.com/api/v1/feedback",
     27                "reasons": [
     28                        {
     29                                "id": "temporary",
     30                                "pro": []
     31                        },
     32                        {
     33                                "id": "not-working",
     34                                "pro": []
     35                        },
     36                        {
     37                                "id": "hard-to-use",
     38                                "pro": []
     39                        },
     40                        {
     41                                "id": "back-or-sleeves",
     42                                "pro": [
     43                                        "back",
     44                                        "sleeves"
     45                                ]
     46                        },
     47                        {
     48                                "id": "own-products",
     49                                "pro": [
     50                                        "own-products"
     51                                ]
     52                        },
     53                        {
     54                                "id": "3d",
     55                                "pro": [
     56                                        "3d"
     57                                ]
     58                        },
     59                        {
     60                                "id": "print-queue",
     61                                "pro": [
     62                                        "print-queue"
     63                                ]
     64                        },
     65                        {
     66                                "id": "other-plugin",
     67                                "pro": []
     68                        },
     69                        {
     70                                "id": "other",
     71                                "pro": []
     72                        }
     73                ],
     74                "text_max": 1000,
     75                "email_max": 254
     76        },
     77        "demo_3d": "https://printblob.com/#demo?view=3d",
     78        "menu_icon": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PHBhdGggZmlsbD0iI2E3YWFhZCIgZD0iTTE2LjQgNy42YzMuOS0uNCA3LjYgMiA4LjIgNS44LjUgMy0xLjIgNC40LTEgNyAuMiAyLjctMi4xIDQuNi01IDQuMy0yLjEtLjItMy0xLjUtNS4zLTEuMi0yLjguNC01LjMtMS01LjYtMy45LS4zLTIuNCAxLjMtMy40IDEuMi01LjUtLjItMy4zIDMuMy02LjIgNy41LTYuNVoiLz48cGF0aCBmaWxsPSIjYTdhYWFkIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yIDJoMjh2MjhoLTI4Wk00IDR2MjRoMjR2LTI0WiIvPjxjaXJjbGUgZmlsbD0iI2E3YWFhZCIgY3g9IjMiIGN5PSIzIiByPSIyLjYiLz48Y2lyY2xlIGZpbGw9IiNhN2FhYWQiIGN4PSIyOSIgY3k9IjMiIHI9IjIuNiIvPjxjaXJjbGUgZmlsbD0iI2E3YWFhZCIgY3g9IjMiIGN5PSIyOSIgcj0iMi42Ii8+PGNpcmNsZSBmaWxsPSIjYTdhYWFkIiBjeD0iMjkiIGN5PSIyOSIgcj0iMi42Ii8+PC9zdmc+",
     79        "pro": {
     80                "yearly": "$49",
     81                "lifetime": "$79",
     82                "trial_days": 14,
     83                "refund_days": 14,
     84                "features": [
     85                        {
     86                                "id": "own-products",
     87                                "name": "Your own products",
     88                                "point": "Your own products: mugs, hoodies, bags, on your own photos, with print areas drawn on them"
     89                        },
     90                        {
     91                                "id": "back",
     92                                "name": "Back printing",
     93                                "point": "Back printing, with its own photo, print area and price"
     94                        },
     95                        {
     96                                "id": "3d",
     97                                "name": "3D view",
     98                                "point": "A 3D view of the product, made from its own photos"
     99                        },
     100                        {
     101                                "id": "sleeves",
     102                                "name": "Sleeve printing",
     103                                "point": "Sleeve printing, with their own photos, print areas and prices"
     104                        },
     105                        {
     106                                "id": "print-queue",
     107                                "name": "Print queue",
     108                                "point": "A print queue, with each order’s print files in one ZIP"
     109                        },
     110                        {
     111                                "id": "fonts",
     112                                "name": "Custom fonts and Google Fonts",
     113                                "point": "Custom fonts and Google Fonts, in the designer and the print files"
     114                        },
     115                        {
     116                                "id": "page-builders",
     117                                "name": "Page builder widgets",
     118                                "point": "Page builder widgets: the designer anywhere in Elementor and Beaver Builder pages, and a shortcode for Divi, Bricks and the others"
     119                        }
     120                ],
     121                "services": [
     122                        "automatic updates",
     123                        "priority email support"
     124                ]
     125        }
    5126}
  • printblob/tags/1.3.0/languages/printblob.pot

    r3751165 r3751408  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: PrintBlob – Product Designer for WooCommerce 1.2.5\n"
     5"Project-Id-Version: PrintBlob – Product Designer for WooCommerce 1.2.6\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/printblob\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    … …  
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-10-16T20:25:53+00:00\n"
     12"POT-Creation-Date: 2026-10-17T03:32:40+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
    … …  
    2727#. Description of the plugin
    2828#: printblob.php
    29 msgid "Customers design their own print on your products — photos, logos and text on the front and back — see it on the real product, and order it through WooCommerce with a print-ready file attached to the order."
     29msgid "Customers design their own t-shirt print — photos, logos and text — see it on the t-shirt, and order it through WooCommerce with a print-ready file attached to the order."
    3030msgstr ""
    3131
    … …  
    4141
    4242#: build/colors/render.php:45
    43 #: includes/class-order.php:162
     43#: includes/class-order.php:165
    4444msgid "Design"
    4545msgstr ""
    … …  
    5050
    5151#. translators: %s: attribute names, such as Material.
    52 #: build/designer/render.php:169
     52#: build/designer/render.php:175
    5353#, php-format
    5454msgid "The designer can’t show this product: its variations also depend on %s, which the designer doesn’t offer. Set it to “Any” in every variation, or stop using it for variations."
    5555msgstr ""
    5656
    57 #: build/designer/render.php:222
     57#: build/designer/render.php:233
    5858#: build/designer/view.js:10
    5959msgid "Loading the designer…"
    … …  
    6161
    6262#. translators: 1: print area width in cm, 2: print area height in cm.
    63 #: build/designer/render.php:227
     63#: build/designer/render.php:238
    6464#: build/designer/view.js:11
    6565#, php-format,js-format
    … …  
    6767msgstr ""
    6868
    69 #: build/designer/render.php:235
     69#: build/designer/render.php:246
    7070#: build/designer/view.js:11
    7171msgid "Your print"
    7272msgstr ""
    7373
    74 #: build/designer/render.php:237
     74#: build/designer/render.php:248
    7575#: build/designer/view.js:11
    7676msgid "Upload image"
    7777msgstr ""
    7878
    79 #: build/designer/render.php:238
     79#: build/designer/render.php:249
    8080#: build/designer/view.js:11
    8181msgid "Add text"
    8282msgstr ""
    8383
    84 #: build/designer/render.php:247
     84#: build/designer/render.php:258
    8585#: build/designer/view.js:5
    8686msgid "Font"
    8787msgstr ""
    8888
    89 #: build/designer/render.php:248
     89#: build/designer/render.php:259
    9090#: build/designer/view.js:5
    9191msgid "Bold"
    9292msgstr ""
    9393
    94 #: build/designer/render.php:251
     94#: build/designer/render.php:262
    9595#: build/designer/view.js:5
    9696msgid "Ink colour"
    9797msgstr ""
    9898
    99 #: build/designer/render.php:260
     99#: build/designer/render.php:271
    100100#: build/designer/view.js:4
    101101msgid "Centre"
    102102msgstr ""
    103103
    104 #: build/designer/render.php:260
     104#: build/designer/render.php:271
    105105#: build/designer/view.js:4
    106106msgid "Bring forward"
    107107msgstr ""
    108108
    109 #: build/designer/render.php:260
     109#: build/designer/render.php:271
    110110#: build/designer/view.js:4
    111111msgid "Send back"
    112112msgstr ""
    113113
    114 #: build/designer/render.php:260
     114#: build/designer/render.php:271
    115115#: includes/class-shirt-colors.php:104
    116116#: build/designer/view.js:4
    … …  
    119119
    120120#. translators: closes the controls of the chosen image or text, back to the list of what is on the side.
    121 #: build/designer/render.php:260
     121#: build/designer/render.php:271
     122#: includes/class-overview.php:169
    122123#: build/designer/view.js:5
    123124msgid "Done"
    … …  
    125126
    126127#. translators: shown where the controls appear while the printed side shown has nothing on it.
    127 #: build/designer/render.php:265
     128#: build/designer/render.php:276
    128129#: build/designer/view.js:10
    129130msgid "Upload an image or add text to start."
    130131msgstr ""
    131132
    132 #: build/designer/render.php:274
     133#: build/designer/render.php:285
     134#: includes/class-quick-setup.php:178
     135#: includes/class-quick-setup.php:502
    133136#: build/designer/view.js:11
    134137msgid "Colour"
    135138msgstr ""
    136139
    137 #: build/designer/render.php:284
     140#: build/designer/render.php:295
     141#: includes/class-quick-setup.php:179
     142#: includes/class-quick-setup.php:514
    138143#: build/designer/view.js:11
    139144msgid "Size"
    140145msgstr ""
    141146
    142 #: build/designer/render.php:305
     147#: build/designer/render.php:316
    143148#: build/designer/view.js:2
    144149msgid "Quantity"
    145150msgstr ""
    146151
    147 #: build/designer/render.php:310
     152#: build/designer/render.php:321
    148153#: includes/class-privacy.php:103
     154#: includes/class-quick-setup.php:524
    149155#: build/designer/index.js:1
    150156#: build/designer/view.js:2
    … …  
    153159
    154160#. translators: %s: printed side, e.g. Front.
    155 #: build/designer/render.php:316
     161#: build/designer/render.php:327
    156162#: build/designer/view.js:3
    157163#, php-format,js-format
    … …  
    160166
    161167#. translators: in the price breakdown, beside a side (e.g. "Back print") that has no design.
    162 #: build/designer/render.php:319
     168#: build/designer/render.php:330
    163169#: build/designer/view.js:4
    164170msgid "Not printed"
    165171msgstr ""
    166172
    167 #: build/designer/render.php:322
     173#: build/designer/render.php:333
    168174#: build/designer/view.js:4
    169175msgid "Total"
    170176msgstr ""
    171177
    172 #: build/designer/render.php:326
     178#: build/designer/render.php:337
    173179#: build/designer/view.js:2
    174180#: build/designer/view.js:4
    … …  
    176182msgstr ""
    177183
    178 #: build/designer/render.php:327
     184#: build/designer/render.php:338
    179185#: build/designer/view.js:2
    180186msgid "Preparing your print file…"
    181187msgstr ""
    182188
    183 #: build/designer/render.php:327
     189#: build/designer/render.php:338
    184190#: build/designer/view.js:2
    185191msgid "Saving your design…"
    186192msgstr ""
    187193
    188 #: build/designer/render.php:327
     194#: build/designer/render.php:338
    189195#: build/designer/view.js:2
    190196msgid "Adding to cart…"
    191197msgstr ""
    192198
    193 #: build/designer/render.php:332
     199#: build/designer/render.php:343
    194200#: build/designer/view.js:1
    195201msgid "Added to your cart."
    196202msgstr ""
    197203
    198 #: build/designer/render.php:332
     204#: build/designer/render.php:343
    199205#: build/designer/view.js:2
    200206msgid "View cart"
    201207msgstr ""
    202208
    203 #: build/designer/render.php:335
     209#: build/designer/render.php:346
    204210#: build/designer/view.js:1
    205211msgid "Add an image or text to the front or back first."
    206212msgstr ""
    207213
    208 #: build/designer/render.php:336
     214#: build/designer/render.php:347
    209215#: build/designer/view.js:1
    210216msgid "Choose a size."
    211217msgstr ""
    212218
    213 #: build/designer/render.php:337
     219#: build/designer/render.php:348
    214220#: build/designer/view.js:1
    215221msgid "This combination is sold out. Choose another."
    216222msgstr ""
    217223
    218 #: build/designer/render.php:338
     224#: build/designer/render.php:349
    219225#: build/designer/view.js:1
    220226msgid "This colour and size is sold out. Choose another."
    221227msgstr ""
    222228
    223 #: build/designer/render.php:339
     229#: build/designer/render.php:350
    224230#: build/designer/view.js:1
    225231msgid "Use a PNG, JPG or WebP image."
    226232msgstr ""
    227233
    228 #: build/designer/render.php:340
     234#: build/designer/render.php:351
    229235#: includes/class-design-store.php:435
    230236#: build/designer/view.js:1
    … …  
    232238msgstr ""
    233239
    234 #: build/designer/render.php:341
     240#: build/designer/render.php:352
    235241#: build/designer/view.js:1
    236242msgid "The product could not be added to the cart."
    … …  
    238244
    239245#. translators: %d: largest allowed file size in megabytes.
    240 #: build/designer/render.php:343
     246#: build/designer/render.php:354
    241247#: build/designer/view.js:2
    242248#, php-format,js-format
    … …  
    244250msgstr ""
    245251
    246 #: build/designer/render.php:354
     252#: build/designer/render.php:365
    247253msgid "The designer needs JavaScript. Turn it on in your browser to design your product."
     254msgstr ""
     255
     256#: includes/class-admin-menu.php:35
     257#: includes/class-dashboard-widget.php:69
     258#: includes/class-overview.php:180
     259#: includes/class-quick-setup.php:491
     260msgid "PrintBlob overview"
     261msgstr ""
     262
     263#: includes/class-admin-menu.php:37
     264msgid "Overview"
     265msgstr ""
     266
     267#: includes/class-admin-menu.php:38
     268msgid "PrintBlob settings"
     269msgstr ""
     270
     271#: includes/class-admin-menu.php:38
     272#: includes/class-settings.php:61
     273msgid "Settings"
     274msgstr ""
     275
     276#: includes/class-admin-menu.php:46
     277#: includes/class-dashboard-widget.php:71
     278#: includes/class-print-queue.php:86
     279msgid "Print queue"
     280msgstr ""
     281
     282#: includes/class-admin-menu.php:48
     283#: includes/class-overview.php:238
     284#: includes/class-settings.php:131
     285msgid "PrintBlob Pro"
     286msgstr ""
     287
     288#: includes/class-admin-menu.php:52
     289msgid "Get Pro"
     290msgstr ""
     291
     292#: includes/class-admin-menu.php:52
     293#: includes/class-deactivation-feedback.php:122
     294#: includes/class-mockups.php:410
     295msgid "Get PrintBlob Pro"
     296msgstr ""
     297
     298#. translators: %s: five stars, linking to PrintBlob's reviews on WordPress.org.
     299#: includes/class-admin-menu.php:92
     300#, php-format
     301msgid "If PrintBlob helps your shop, please rate it %s on WordPress.org."
     302msgstr ""
     303
     304#: includes/class-admin-menu.php:93
     305msgid "Rate PrintBlob on WordPress.org"
    248306msgstr ""
    249307
    … …  
    256314msgstr ""
    257315
    258 #: includes/class-cart.php:93
     316#: includes/class-cart.php:98
    259317#: includes/class-order.php:37
    260318msgid "Print"
    261319msgstr ""
    262320
    263 #: includes/class-cart.php:125
    264 #: includes/class-cart.php:137
     321#: includes/class-cart.php:130
     322#: includes/class-cart.php:142
    265323msgid "Your design"
     324msgstr ""
     325
     326#: includes/class-dashboard-widget.php:32
     327msgid "PrintBlob this week"
     328msgstr ""
     329
     330#. translators: %d: number of orders.
     331#: includes/class-dashboard-widget.php:66
     332#, php-format
     333msgid "%d order with a design this week"
     334msgid_plural "%d orders with designs this week"
     335msgstr[0] ""
     336msgstr[1] ""
     337
     338#: includes/class-dashboard-widget.php:74
     339#: includes/class-print-queue.php:125
     340#: includes/class-pro.php:130
     341#: includes/class-pro.php:251
     342#: includes/class-pro.php:322
     343#: includes/class-pro.php:408
     344#: includes/class-quick-setup.php:575
     345msgid "PrintBlob Pro add-on"
     346msgstr ""
     347
     348#: includes/class-dashboard-widget.php:76
     349#: includes/class-pro.php:99
     350#: includes/class-pro.php:122
     351#: includes/class-pro.php:414
     352msgid "Start your free trial"
     353msgstr ""
     354
     355#: includes/class-dashboard-widget.php:79
     356#: includes/class-onboarding.php:80
     357#: includes/class-order-milestones.php:56
     358#: includes/class-order.php:136
     359#: includes/class-review-request.php:75
     360#: includes/class-review-request.php:76
     361msgid "Dismiss"
     362msgstr ""
     363
     364#: includes/class-dashboard-widget.php:90
     365#: includes/class-order-milestones.php:63
     366#: includes/class-order.php:143
     367#: includes/class-overview.php:175
     368#: includes/class-print-queue.php:81
     369#: includes/class-pro.php:185
     370#: includes/class-pro.php:237
     371#: includes/class-quick-setup.php:97
     372#: includes/class-quick-setup.php:454
     373#: includes/class-review-request.php:107
     374msgid "You are not allowed to do this."
     375msgstr ""
     376
     377#: includes/class-deactivation-feedback.php:91
     378msgid "It’s only for a moment: I’m fixing something"
     379msgstr ""
     380
     381#: includes/class-deactivation-feedback.php:92
     382msgid "It didn’t work on my site"
     383msgstr ""
     384
     385#: includes/class-deactivation-feedback.php:93
     386msgid "It was hard to set up or use"
     387msgstr ""
     388
     389#: includes/class-deactivation-feedback.php:94
     390msgid "I need back or sleeve printing"
     391msgstr ""
     392
     393#: includes/class-deactivation-feedback.php:95
     394msgid "I need my own products"
     395msgstr ""
     396
     397#: includes/class-deactivation-feedback.php:96
     398msgid "I need a 3D view"
     399msgstr ""
     400
     401#: includes/class-deactivation-feedback.php:97
     402msgid "I need a print queue"
     403msgstr ""
     404
     405#: includes/class-deactivation-feedback.php:98
     406msgid "I found another plugin"
     407msgstr ""
     408
     409#: includes/class-deactivation-feedback.php:99
     410msgid "Something else"
     411msgstr ""
     412
     413#: includes/class-deactivation-feedback.php:104
     414msgid "Nothing is sent unless you press “Send and deactivate”. Then printblob.com receives the reason you chose, your note, your email address if you type one, the PrintBlob version and your WordPress language. Never your site’s address."
     415msgstr ""
     416
     417#: includes/class-deactivation-feedback.php:117
     418#: includes/class-pro.php:118
     419msgid "PrintBlob Pro add-on:"
     420msgstr ""
     421
     422#: includes/class-deactivation-feedback.php:140
     423msgid "Tell us more below if you like: what you needed, or what went wrong."
     424msgstr ""
     425
     426#: includes/class-deactivation-feedback.php:168
     427msgid "Why are you leaving?"
     428msgstr ""
     429
     430#: includes/class-deactivation-feedback.php:171
     431msgid "Your note (optional)"
     432msgstr ""
     433
     434#: includes/class-deactivation-feedback.php:173
     435msgid "Your email address, if you would like an answer (optional)"
     436msgstr ""
     437
     438#: includes/class-deactivation-feedback.php:177
     439msgid "Skip and deactivate"
     440msgstr ""
     441
     442#: includes/class-deactivation-feedback.php:178
     443msgid "Send and deactivate"
    266444msgstr ""
    267445
    … …  
    340518msgstr ""
    341519
    342 #: includes/class-design-store.php:588
    343 #: includes/class-design-store.php:613
     520#: includes/class-design-store.php:639
     521#: includes/class-design-store.php:664
    344522msgid "PrintBlob print files are private"
    345523msgstr ""
    346524
    347 #: includes/class-design-store.php:619
     525#: includes/class-design-store.php:670
    348526msgid "Customers’ print files cannot be downloaded from the web; shop managers download them from the order screen."
    349527msgstr ""
    350528
    351 #: includes/class-design-store.php:623
     529#: includes/class-design-store.php:674
    352530msgid "PrintBlob print files can be downloaded from the web"
    353531msgstr ""
    354532
    355 #: includes/class-design-store.php:625
     533#: includes/class-design-store.php:676
    356534msgid "This server does not apply the .htaccess file that protects the print folder (nginx ignores it). Anyone who learns a print file’s address could download it. Ask your host to add this rule to the site’s nginx configuration:"
    357535msgstr ""
    358536
    359 #: includes/class-design-store.php:628
     537#: includes/class-design-store.php:679
    360538msgid "PrintBlob could not check that print files are private"
    361539msgstr ""
    362540
    363 #: includes/class-design-store.php:630
     541#: includes/class-design-store.php:681
    364542msgid "The site could not request a test file from its own print folder, so it cannot tell whether print files are protected. On Apache the folder’s .htaccess protects them; on nginx, make sure the site’s configuration has this rule:"
    365543msgstr ""
    366544
    367 #: includes/class-mockups.php:61
     545#. translators: %s: mockup title.
     546#: includes/class-mockups.php:65
     547#: includes/class-mockups.php:74
     548#: includes/class-mockups.php:379
     549#: includes/class-mockups.php:405
     550#: includes/class-overview.php:122
     551msgid "Mockups"
     552msgstr ""
     553
     554#: includes/class-mockups.php:66
     555#: includes/class-product-settings.php:214
     556msgid "Mockup"
     557msgstr ""
     558
     559#: includes/class-mockups.php:67
     560#: includes/class-mockups.php:68
     561msgid "Add mockup"
     562msgstr ""
     563
     564#: includes/class-mockups.php:69
     565msgid "Edit mockup"
     566msgstr ""
     567
    368568#: includes/class-mockups.php:70
    369 msgid "Mockups"
    370 msgstr ""
    371 
    372 #: includes/class-mockups.php:62
    373 #: includes/class-product-settings.php:138
    374 msgid "Mockup"
    375 msgstr ""
    376 
    377 #: includes/class-mockups.php:63
    378 #: includes/class-mockups.php:64
    379 msgid "Add mockup"
    380 msgstr ""
    381 
    382 #: includes/class-mockups.php:65
    383 msgid "Edit mockup"
    384 msgstr ""
    385 
    386 #: includes/class-mockups.php:66
    387569msgid "New mockup"
    388570msgstr ""
    389571
    390 #: includes/class-mockups.php:67
     572#: includes/class-mockups.php:71
    391573msgid "Search mockups"
    392574msgstr ""
    393575
    394 #: includes/class-mockups.php:68
     576#: includes/class-mockups.php:72
    395577msgid "No mockups yet."
    396578msgstr ""
    397579
    398 #: includes/class-mockups.php:69
     580#: includes/class-mockups.php:73
    399581msgid "No mockups in the trash."
    400582msgstr ""
    401583
    402 #: includes/class-mockups.php:136
     584#: includes/class-mockups.php:140
     585#: includes/class-quick-setup.php:88
    403586msgid "T-shirt"
    404587msgstr ""
    405588
    406 #: includes/class-mockups.php:158
     589#: includes/class-mockups.php:162
    407590msgid "T-shirt mockup (back)"
    408591msgstr ""
    409592
    410 #: includes/class-mockups.php:158
     593#: includes/class-mockups.php:162
    411594msgid "T-shirt mockup"
    412595msgstr ""
    413596
    414 #: includes/class-mockups.php:310
     597#: includes/class-mockups.php:320
     598#: includes/class-pro.php:369
    415599msgid "Back"
    416600msgstr ""
    417601
    418 #: includes/class-mockups.php:310
     602#: includes/class-mockups.php:320
    419603msgid "Front"
    420604msgstr ""
    421605
    422 #: includes/class-mockups.php:368
    423 msgid "Photo for this side"
    424 msgstr ""
    425 
    426 #: includes/class-mockups.php:369
    427 #: includes/class-shirt-colors.php:93
    428 msgid "Use this photo"
    429 msgstr ""
    430 
    431 #: includes/class-mockups.php:375
    432 msgid "Printable sides"
    433 msgstr ""
    434 
    435 #: includes/class-mockups.php:382
    436 msgid "Upload a photo of the blank product for each side, then drag the blue box over the area that can be printed. Use the corner to resize it. A product on a transparent or plain white background works best."
    437 msgstr ""
    438 
    439 #: includes/class-mockups.php:386
    440 msgid "Recolour the photo to the colour the customer picks (for a white or light grey product photo)"
    441 msgstr ""
    442 
    443 #: includes/class-mockups.php:397
    444 msgid "Customers can print on this side"
    445 msgstr ""
    446 
    447 #: includes/class-mockups.php:414
    448 #: includes/class-shirt-colors.php:103
    449 msgid "Choose photo"
     606#. translators: 1: width in cm, 2: height in cm.
     607#: includes/class-mockups.php:399
     608#, php-format
     609msgid "%1$s × %2$s cm"
     610msgstr ""
     611
     612#: includes/class-mockups.php:406
     613msgid "The product photos customers design on, with the print area of each side and its print size. Choose a product’s mockup on its PrintBlob tab."
     614msgstr ""
     615
     616#: includes/class-mockups.php:408
     617msgid "Your own products — mugs, hoodies, bags, your own photos — with the PrintBlob Pro add-on"
     618msgstr ""
     619
     620#: includes/class-mockups.php:409
     621msgid "PrintBlob Pro adds the mockup editor: a photo of your product for each side, the print area drawn on the photo, and the real print size in centimetres."
    450622msgstr ""
    451623
    452624#: includes/class-mockups.php:416
    453 msgid "Print width (cm)"
    454 msgstr ""
    455 
    456 #: includes/class-mockups.php:417
    457 msgid "Print height (cm)"
    458 msgstr ""
    459 
    460 #: includes/class-mockups.php:462
    461 msgid "Sides"
    462 msgstr ""
    463 
    464 #. translators: 1: side name, 2: width in cm, 3: height in cm.
    465 #: includes/class-mockups.php:473
    466 #, php-format
    467 msgid "%1$s (%2$s × %3$s cm)"
    468 msgstr ""
    469 
    470 #: includes/class-mockups.php:476
    471 msgid "No sides set up"
    472 msgstr ""
    473 
    474 #. translators: %s: link to Products › Mockups.
    475 #: includes/class-onboarding.php:37
    476 #, php-format
    477 msgid "Check the t-shirt mockup or add your own product photos and print areas under %s."
    478 msgstr ""
    479 
    480 #: includes/class-onboarding.php:38
    481 #: includes/class-settings-page.php:38
    482 msgid "Products › Mockups"
     625msgid "Recoloured to the colour the customer picks."
     626msgstr ""
     627
     628#. translators: %s: link to PrintBlob › Mockups.
     629#: includes/class-onboarding.php:60
     630#, php-format
     631msgid "Check the bundled product mockup under %s."
     632msgstr ""
     633
     634#: includes/class-onboarding.php:61
     635#: includes/class-settings-page.php:39
     636msgid "PrintBlob › Mockups"
    483637msgstr ""
    484638
    485639#. translators: %s: link to Products.
    486 #: includes/class-onboarding.php:42
     640#: includes/class-onboarding.php:65
    487641#, php-format
    488642msgid "Edit a product, open its PrintBlob designer tab, turn the designer on and set the print price per side (%s)."
    489643msgstr ""
    490644
    491 #: includes/class-onboarding.php:43
     645#: includes/class-onboarding.php:66
     646#: includes/class-overview.php:106
    492647msgid "Products"
    493648msgstr ""
    494649
    495 #: includes/class-onboarding.php:45
     650#: includes/class-onboarding.php:68
    496651msgid "Add the PrintBlob designer block to a page, or open the product: the designer shows on its page."
    497652msgstr ""
    498653
    499 #: includes/class-onboarding.php:49
     654#: includes/class-onboarding.php:73
    500655msgid "PrintBlob is ready. Three steps to your first designable product:"
    501656msgstr ""
    502657
    503 #: includes/class-onboarding.php:56
    504 msgid "PrintBlob settings"
    505 msgstr ""
    506 
    507 #: includes/class-onboarding.php:57
    508 #: includes/class-settings.php:38
     658#: includes/class-onboarding.php:76
     659msgid "Quick setup: all three in one click"
     660msgstr ""
     661
     662#: includes/class-onboarding.php:78
     663#: includes/class-overview.php:244
     664#: includes/class-settings.php:40
    509665msgid "Documentation"
    510666msgstr ""
    511667
    512 #: includes/class-onboarding.php:58
    513 #: includes/class-order.php:133
    514 #: includes/class-review-request.php:70
    515 msgid "Dismiss"
     668#. translators: %d: number of orders with designs (10, 25 or 50).
     669#: includes/class-order-milestones.php:52
     670#, php-format
     671msgid "Your shop has had %d orders with PrintBlob designs. The PrintBlob Pro add-on’s print queue downloads each order’s print files as one ZIP."
    516672msgstr ""
    517673
    518674#. translators: %s: printed side, e.g. Front.
    519675#: includes/class-order.php:88
     676#: includes/class-print-queue.php:109
    520677#, php-format
    521678msgid "Download %s print file"
    … …  
    528685msgstr ""
    529686
    530 #: includes/class-order.php:129
    531 msgid "Download all print files of an order as one ZIP, and work through a print queue, with PrintBlob Pro."
    532 msgstr ""
    533 
    534 #: includes/class-order.php:131
    535 msgid "About PrintBlob Pro"
    536 msgstr ""
    537 
    538 #: includes/class-order.php:140
    539 #: includes/class-review-request.php:88
    540 msgid "You are not allowed to do this."
    541 msgstr ""
     687#. translators: %d: number of print files of the order.
     688#: includes/class-order.php:132
     689#, php-format
     690msgid "This order’s %d print file in one ZIP, with PrintBlob Pro."
     691msgid_plural "This order’s %d print files in one ZIP, with PrintBlob Pro."
     692msgstr[0] ""
     693msgstr[1] ""
     694
     695#: includes/class-order.php:134
     696msgid "About the PrintBlob Pro add-on"
     697msgstr ""
     698
     699#: includes/class-overview.php:38
     700#: includes/class-quick-setup.php:556
     701#: includes/class-settings-page.php:45
     702msgid "Designer page"
     703msgstr ""
     704
     705#. translators: %s: page title.
     706#: includes/class-overview.php:46
     707#, php-format
     708msgid "“%s”, the first published page with the designer block."
     709msgstr ""
     710
     711#. translators: %s: page title.
     712#: includes/class-overview.php:46
     713#: includes/class-overview.php:59
     714msgid "View"
     715msgstr ""
     716
     717#: includes/class-overview.php:47
     718msgid "No page is set and no published page has the designer block. Products with the designer still show it on their own page."
     719msgstr ""
     720
     721#: includes/class-overview.php:47
     722msgid "Choose a page"
     723msgstr ""
     724
     725#. translators: %s: page title.
     726#: includes/class-overview.php:52
     727#, php-format
     728msgid "“%s” is not published."
     729msgstr ""
     730
     731#. translators: %s: page title.
     732#: includes/class-overview.php:52
     733msgid "Edit the page"
     734msgstr ""
     735
     736#. translators: %s: page title.
     737#: includes/class-overview.php:56
     738#, php-format
     739msgid "“%s” has no PrintBlob designer block."
     740msgstr ""
     741
     742#. translators: %s: page title.
     743#: includes/class-overview.php:56
     744msgid "Add the block"
     745msgstr ""
     746
     747#. translators: %s: page title.
     748#: includes/class-overview.php:59
     749#, php-format
     750msgid "“%s” is published and shows the designer."
     751msgstr ""
     752
     753#: includes/class-overview.php:63
     754#: includes/class-quick-setup.php:500
     755msgid "Colours"
     756msgstr ""
     757
     758#: includes/class-overview.php:67
     759msgid "The colour attribute chosen in the settings does not exist."
     760msgstr ""
     761
     762#: includes/class-overview.php:67
     763#: includes/class-overview.php:90
     764msgid "Product attributes"
     765msgstr ""
     766
     767#: includes/class-overview.php:72
     768msgid "The colour attribute has no colours yet."
     769msgstr ""
     770
     771#: includes/class-overview.php:72
     772msgid "Add colours"
     773msgstr ""
     774
     775#. translators: 1: number of colours, 2: how many have a colour value, 3: how many have their own photo.
     776#: includes/class-overview.php:78
     777#, php-format
     778msgid "%1$d colour: %2$d with a colour value, %3$d with its own photo."
     779msgid_plural "%1$d colours: %2$d with a colour value, %3$d with their own photo."
     780msgstr[0] ""
     781msgstr[1] ""
     782
     783#: includes/class-overview.php:83
     784msgid "Edit colours"
     785msgstr ""
     786
     787#: includes/class-overview.php:83
     788msgid "Give each colour a value"
     789msgstr ""
     790
     791#: includes/class-overview.php:87
     792#: includes/class-quick-setup.php:512
     793msgid "Sizes"
     794msgstr ""
     795
     796#: includes/class-overview.php:90
     797msgid "The size attribute chosen in the settings does not exist. Without one, customers choose no size."
     798msgstr ""
     799
     800#. translators: %d: number of sizes.
     801#: includes/class-overview.php:99
     802#, php-format
     803msgid "%d size."
     804msgid_plural "%d sizes."
     805msgstr[0] ""
     806msgstr[1] ""
     807
     808#. translators: %d: number of sizes.
     809#: includes/class-overview.php:99
     810msgid "Edit sizes"
     811msgstr ""
     812
     813#. translators: %d: number of sizes.
     814#: includes/class-overview.php:99
     815msgid "Add sizes"
     816msgstr ""
     817
     818#: includes/class-overview.php:103
     819msgid "Products with the designer"
     820msgstr ""
     821
     822#: includes/class-overview.php:106
     823msgid "No product has the designer on. Edit a product, open its PrintBlob designer tab and turn the designer on."
     824msgstr ""
     825
     826#. translators: %d: number of products.
     827#: includes/class-overview.php:113
     828#, php-format
     829msgid "%d product:"
     830msgid_plural "%d products:"
     831msgstr[0] ""
     832msgstr[1] ""
     833
     834#: includes/class-overview.php:117
     835msgid "Default mockup"
     836msgstr ""
     837
     838#. translators: %s: mockup title.
     839#: includes/class-overview.php:122
     840#, php-format
     841msgid "“%s”, which products use unless they choose another."
     842msgstr ""
     843
     844#: includes/class-overview.php:123
     845msgid "The bundled product mockup is missing. It is made again the next time a shop manager opens the dashboard."
     846msgstr ""
     847
     848#: includes/class-overview.php:123
     849msgid "Dashboard"
     850msgstr ""
     851
     852#: includes/class-overview.php:132
     853msgid "Print files"
     854msgstr ""
     855
     856#: includes/class-overview.php:132
     857msgid "Site Health"
     858msgstr ""
     859
     860#: includes/class-overview.php:170
     861msgid "To do"
     862msgstr ""
     863
     864#: includes/class-overview.php:183
     865msgid "Set-up"
     866msgstr ""
     867
     868#: includes/class-overview.php:185
     869msgid "Quick setup: a designable product in one click"
     870msgstr ""
     871
     872#: includes/class-overview.php:204
     873msgid "Orders with designs"
     874msgstr ""
     875
     876#. translators: %d: number of orders.
     877#: includes/class-overview.php:208
     878#, php-format
     879msgid "%d order with a design this month."
     880msgid_plural "%d orders with designs this month."
     881msgstr[0] ""
     882msgstr[1] ""
     883
     884#. translators: %s: order number.
     885#: includes/class-overview.php:218
     886#: includes/class-print-queue.php:95
     887#, php-format
     888msgid "Order #%s"
     889msgstr ""
     890
     891#. translators: %d: number of print files.
     892#: includes/class-overview.php:227
     893#: includes/class-print-queue.php:69
     894#, php-format
     895msgid "%d print file"
     896msgid_plural "%d print files"
     897msgstr[0] ""
     898msgstr[1] ""
     899
     900#: includes/class-overview.php:233
     901msgid "No order has a design yet."
     902msgstr ""
     903
     904#. translators: %s: version number.
     905#: includes/class-overview.php:239
     906#, php-format
     907msgid "PrintBlob Pro %s is active."
     908msgstr ""
     909
     910#. translators: %s: version number.
     911#: includes/class-overview.php:240
     912msgid "Licence"
     913msgstr ""
     914
     915#: includes/class-print-queue.php:66
     916msgid "No processing order has a design waiting to print."
     917msgstr ""
     918
     919#. translators: %d: number of orders.
     920#: includes/class-print-queue.php:71
     921#, php-format
     922msgid "%d order"
     923msgid_plural "%d orders"
     924msgstr[0] ""
     925msgstr[1] ""
     926
     927#. translators: 1: number of print files, as "12 print files", 2: number of orders, as "5 orders".
     928#: includes/class-print-queue.php:73
     929#, php-format
     930msgid "You have %1$s in %2$s waiting: with PrintBlob Pro, one ZIP per order."
     931msgstr ""
     932
     933#. translators: 1: number of print files, as "12 print files", 2: number of orders, as "5 orders".
     934#: includes/class-print-queue.php:75
     935#, php-format
     936msgid "You have %1$s in %2$s waiting to print."
     937msgstr ""
     938
     939#. translators: %d: number of print files.
     940#: includes/class-print-queue.php:120
     941#, php-format
     942msgid "Download its %d print file as one ZIP"
     943msgid_plural "Download all %d print files of this order as one ZIP"
     944msgstr[0] ""
     945msgstr[1] ""
     946
     947#: includes/class-print-queue.php:121
     948msgid "Mark printed"
     949msgstr ""
     950
     951#. translators: %d: number of orders not listed.
     952#: includes/class-print-queue.php:133
     953#, php-format
     954msgid "%d more order is waiting."
     955msgid_plural "%d more orders are waiting."
     956msgstr[0] ""
     957msgstr[1] ""
    542958
    543959#: includes/class-privacy.php:32
    … …  
    582998msgstr ""
    583999
     1000#. translators: %d: days of PrintBlob Pro's free trial.
     1001#: includes/class-pro.php:60
     1002#, php-format
     1003msgid "Try PrintBlob Pro free for %d day"
     1004msgid_plural "Try PrintBlob Pro free for %d days"
     1005msgstr[0] ""
     1006msgstr[1] ""
     1007
     1008#. translators: 1: PrintBlob Pro's yearly price, e.g. $49, 2: its one-time price, e.g. $79.
     1009#: includes/class-pro.php:65
     1010#, php-format
     1011msgid "%1$s a year or %2$s once"
     1012msgstr ""
     1013
     1014#. translators: %d: days in which a PrintBlob Pro purchase is refunded in full.
     1015#: includes/class-pro.php:71
     1016#, php-format
     1017msgid "Full refund within %d day."
     1018msgid_plural "Full refund within %d days."
     1019msgstr[0] ""
     1020msgstr[1] ""
     1021
     1022#: includes/class-pro.php:75
     1023msgid "PrintBlob Pro is a separate plugin from printblob.com. Everything PrintBlob does works without it."
     1024msgstr ""
     1025
     1026#: includes/class-pro.php:101
     1027msgid "See it in 3D"
     1028msgstr ""
     1029
     1030#: includes/class-pro.php:124
     1031#: includes/class-pro.php:137
     1032#: includes/class-quick-setup.php:579
     1033#: includes/class-settings.php:140
     1034msgid "Compare free and Pro"
     1035msgstr ""
     1036
     1037#: includes/class-pro.php:140
     1038msgid "Show less"
     1039msgstr ""
     1040
     1041#: includes/class-pro.php:160
     1042msgid "A product with a printed design in PrintBlob Pro’s 3D view"
     1043msgstr ""
     1044
     1045#: includes/class-pro.php:176
     1046msgid "3D · Pro"
     1047msgstr ""
     1048
     1049#: includes/class-pro.php:177
     1050msgid "Only you see this, as the shop manager: your product in 3D with the PrintBlob Pro add-on, on printblob.com"
     1051msgstr ""
     1052
     1053#: includes/class-pro.php:200
     1054msgid "The designer on the product page or any page: photos, logos and text, moved, resized and rotated on the product"
     1055msgstr ""
     1056
     1057#: includes/class-pro.php:201
     1058msgid "Text typed on the product, in four bundled fonts"
     1059msgstr ""
     1060
     1061#: includes/class-pro.php:202
     1062msgid "Front printing on the bundled product, with its own print price"
     1063msgstr ""
     1064
     1065#: includes/class-pro.php:203
     1066msgid "Every colour of the product from one photo, and the Colours block"
     1067msgstr ""
     1068
     1069#: includes/class-pro.php:204
     1070msgid "A warning when a customer’s image is too small to print sharply"
     1071msgstr ""
     1072
     1073#: includes/class-pro.php:205
     1074msgid "A 300 DPI print file per side on every order, and the customer’s images as uploaded"
     1075msgstr ""
     1076
     1077#: includes/class-pro.php:206
     1078msgid "WooCommerce’s block cart and checkout, order emails and custom order tables"
     1079msgstr ""
     1080
     1081#: includes/class-pro.php:207
     1082msgid "Community support in the WordPress.org forum"
     1083msgstr ""
     1084
     1085#: includes/class-pro.php:240
     1086msgid "Included"
     1087msgstr ""
     1088
     1089#: includes/class-pro.php:241
     1090msgid "Not included"
     1091msgstr ""
     1092
     1093#: includes/class-pro.php:244
     1094msgid "PrintBlob and PrintBlob Pro"
     1095msgstr ""
     1096
     1097#: includes/class-pro.php:249
     1098msgid "What it does"
     1099msgstr ""
     1100
     1101#: includes/class-pro.php:250
     1102msgid "PrintBlob (free)"
     1103msgstr ""
     1104
     1105#. translators: %s: PrintBlob Pro's one-time price, e.g. $79.
     1106#: includes/class-pro.php:273
     1107#, php-format
     1108msgid "Buy once for %s"
     1109msgstr ""
     1110
     1111#: includes/class-pro.php:279
     1112msgid "PrintBlob Pro is active on this site."
     1113msgstr ""
     1114
     1115#: includes/class-pro.php:367
     1116msgid "3D view"
     1117msgstr ""
     1118
     1119#: includes/class-pro.php:370
     1120msgid "Left sleeve"
     1121msgstr ""
     1122
     1123#: includes/class-pro.php:371
     1124msgid "Right sleeve"
     1125msgstr ""
     1126
     1127#. translators: %s: product side, e.g. Left sleeve.
     1128#. translators: %s: product side (Front/Back).
     1129#: includes/class-pro.php:378
     1130#: includes/class-product-settings.php:226
     1131#, php-format
     1132msgid "Print price: %s"
     1133msgstr ""
     1134
     1135#: includes/class-pro.php:415
     1136msgid "See all Pro features"
     1137msgstr ""
     1138
     1139#: includes/class-pro.php:418
     1140msgid "Close"
     1141msgstr ""
     1142
     1143#: includes/class-product-settings.php:113
     1144msgid "Product with the PrintBlob designer"
     1145msgstr ""
     1146
    5841147#: includes/class-product-settings.php:114
     1148msgid "The page of a product with the PrintBlob designer turned on: customers design their print, choose colour and size, and add it to the cart."
     1149msgstr ""
     1150
     1151#: includes/class-product-settings.php:190
    5851152#: build/designer/index.js:1
    5861153msgid "PrintBlob designer"
    5871154msgstr ""
    5881155
    589 #: includes/class-product-settings.php:128
     1156#: includes/class-product-settings.php:204
    5901157#: includes/class-settings-page.php:24
    591 #: includes/class-settings-page.php:34
     1158#: includes/class-settings-page.php:35
    5921159msgid "Designer"
    5931160msgstr ""
    5941161
    595 #: includes/class-product-settings.php:129
     1162#: includes/class-product-settings.php:205
    5961163msgid "Customers design their own print on this product before adding it to the cart."
    5971164msgstr ""
    5981165
    599 #: includes/class-product-settings.php:139
    600 msgid "The product photo customers design on, with its print areas. Manage mockups under Products › Mockups."
    601 msgstr ""
    602 
    603 #. translators: %s: product side (Front/Back).
    604 #: includes/class-product-settings.php:150
    605 #, php-format
    606 msgid "Print price: %s"
    607 msgstr ""
    608 
    609 #: includes/class-product-settings.php:151
     1166#: includes/class-product-settings.php:215
     1167msgid "The product photo customers design on, with its print areas. The shop’s mockups are under PrintBlob › Mockups."
     1168msgstr ""
     1169
     1170#: includes/class-product-settings.php:227
    6101171msgid "Added to the product’s price when this side has a print."
    6111172msgstr ""
    6121173
    613 #: includes/class-review-request.php:66
     1174#: includes/class-quick-setup.php:41
     1175#: includes/class-quick-setup.php:466
     1176msgid "Quick setup"
     1177msgstr ""
     1178
     1179#: includes/class-quick-setup.php:117
     1180msgid "The form had expired. Open Quick setup again and run it from there."
     1181msgstr ""
     1182
     1183#: includes/class-quick-setup.php:120
     1184msgid "Only shop managers can run Quick setup."
     1185msgstr ""
     1186
     1187#: includes/class-quick-setup.php:148
     1188msgid "Give the product a name, and type its price and the print price as numbers, such as 18 and 6."
     1189msgstr ""
     1190
     1191#. translators: %s: mockup title.
     1192#: includes/class-quick-setup.php:155
     1193#: includes/class-quick-setup.php:163
     1194#, php-format
     1195msgid "Mockup “%s”"
     1196msgstr ""
     1197
     1198#: includes/class-quick-setup.php:159
     1199msgid "The bundled product mockup could not be added to the media library. Check that WordPress can write to the uploads folder (Tools › Site Health), then run Quick setup again."
     1200msgstr ""
     1201
     1202#: includes/class-quick-setup.php:192
     1203msgid "Printed with your own design."
     1204msgstr ""
     1205
     1206#: includes/class-quick-setup.php:217
     1207msgid "The product could not be saved. Check that WooCommerce is up to date and that Products › Add new works, then run Quick setup again."
     1208msgstr ""
     1209
     1210#. translators: %s: product name.
     1211#: includes/class-quick-setup.php:222
     1212#, php-format
     1213msgid "Product “%s”, with the designer on"
     1214msgstr ""
     1215
     1216#. translators: 1: number of variations, 2: number of colours, 3: number of sizes.
     1217#: includes/class-quick-setup.php:265
     1218#, php-format
     1219msgid "%1$d variations: %2$d colours in %3$d sizes"
     1220msgstr ""
     1221
     1222#. translators: %s: attribute name, e.g. Colour.
     1223#: includes/class-quick-setup.php:307
     1224#, php-format
     1225msgid "The %s attribute chosen is not one of the shop’s product attributes. Choose one from the list, or a new one."
     1226msgstr ""
     1227
     1228#. translators: %s: attribute name.
     1229#: includes/class-quick-setup.php:312
     1230#: includes/class-quick-setup.php:337
     1231#, php-format
     1232msgid "Attribute “%s”"
     1233msgstr ""
     1234
     1235#. translators: 1: attribute name, 2: WooCommerce's reason.
     1236#: includes/class-quick-setup.php:328
     1237#, php-format
     1238msgid "WooCommerce did not add the %1$s attribute: %2$s Add it under Products › Attributes, then choose it here."
     1239msgstr ""
     1240
     1241#. translators: 1: term name, e.g. Navy, 2: WordPress's reason.
     1242#: includes/class-quick-setup.php:349
     1243#, php-format
     1244msgid "“%1$s” could not be added: %2$s"
     1245msgstr ""
     1246
     1247#. translators: 1: attribute name, 2: term names, e.g. White, Black, Navy.
     1248#: includes/class-quick-setup.php:364
     1249#, php-format
     1250msgid "%1$s: %2$s"
     1251msgstr ""
     1252
     1253#. translators: %s: page title.
     1254#: includes/class-quick-setup.php:380
     1255#: includes/class-quick-setup.php:408
     1256#, php-format
     1257msgid "Designer page “%s”"
     1258msgstr ""
     1259
     1260#: includes/class-quick-setup.php:390
     1261msgid "Design your own"
     1262msgstr ""
     1263
     1264#. translators: %s: attribute name, e.g. Colour.
     1265#: includes/class-quick-setup.php:437
     1266#, php-format
     1267msgid "A new %s attribute"
     1268msgstr ""
     1269
     1270#. translators: %s: the shop's attribute name.
     1271#: includes/class-quick-setup.php:444
     1272#, php-format
     1273msgid "The shop’s “%s” attribute"
     1274msgstr ""
     1275
     1276#: includes/class-quick-setup.php:470
     1277msgid "Quick setup stopped:"
     1278msgstr ""
     1279
     1280#: includes/class-quick-setup.php:479
     1281msgid "Your shop is set up. Open the product and design on it."
     1282msgstr ""
     1283
     1284#: includes/class-quick-setup.php:483
     1285msgid "Made now"
     1286msgstr ""
     1287
     1288#: includes/class-quick-setup.php:487
     1289msgid "Already there, kept as it was"
     1290msgstr ""
     1291
     1292#: includes/class-quick-setup.php:491
     1293msgid "Open the product"
     1294msgstr ""
     1295
     1296#: includes/class-quick-setup.php:494
     1297msgid "One click makes a product your customers can design and order, on the bundled mockup. Choose what to use for each step: something new, or what your shop already has. Running it again makes nothing twice."
     1298msgstr ""
     1299
     1300#. translators: %s: colour names, e.g. White, Black, Navy.
     1301#: includes/class-quick-setup.php:506
     1302#, php-format
     1303msgid "Six colours, each with the colour value the designer recolours the product to: %s. Colours the attribute already has are kept."
     1304msgstr ""
     1305
     1306#. translators: %s: sizes, e.g. XS, S, M.
     1307#: includes/class-quick-setup.php:518
     1308#, php-format
     1309msgid "The sizes %s. Sizes the attribute already has are kept."
     1310msgstr ""
     1311
     1312#. translators: %s: currency symbol.
     1313#: includes/class-quick-setup.php:531
     1314#, php-format
     1315msgid "Price (%s)"
     1316msgstr ""
     1317
     1318#. translators: %s: currency symbol.
     1319#: includes/class-quick-setup.php:538
     1320#, php-format
     1321msgid "Front print price (%s)"
     1322msgstr ""
     1323
     1324#. translators: %s: product name.
     1325#: includes/class-quick-setup.php:548
     1326#, php-format
     1327msgid "“%s”, made by an earlier run, is kept: variations it lacks are added and the prices above apply to it."
     1328msgstr ""
     1329
     1330#: includes/class-quick-setup.php:549
     1331msgid "A variable product on the bundled mockup, with the designer on, a variation for every colour and size, and the mockup’s photos. Customers pay the price plus the print price when they print the front."
     1332msgstr ""
     1333
     1334#. translators: %s: page title.
     1335#: includes/class-quick-setup.php:563
     1336#, php-format
     1337msgid "“%s” stays the designer page."
     1338msgstr ""
     1339
     1340#: includes/class-quick-setup.php:564
     1341msgid "A page named “Design your own” with the designer block on the product, set as the designer page."
     1342msgstr ""
     1343
     1344#: includes/class-quick-setup.php:571
     1345msgid "Set up my shop"
     1346msgstr ""
     1347
     1348#: includes/class-quick-setup.php:577
     1349msgid "Your product has a back photo ready: turn on back printing, sleeves and the 3D view with PrintBlob Pro"
     1350msgstr ""
     1351
     1352#: includes/class-review-request.php:75
     1353msgid "Don’t ask again"
     1354msgstr ""
     1355
     1356#: includes/class-review-request.php:80
    6141357msgid "Your shop has its first order with a PrintBlob design. If PrintBlob is useful to you, a review on WordPress.org helps other shops find it."
    6151358msgstr ""
    6161359
    617 #: includes/class-review-request.php:68
     1360#. translators: %d: number of orders with designs.
     1361#: includes/class-review-request.php:82
     1362#, php-format
     1363msgid "Your shop has had %d orders with PrintBlob designs. If PrintBlob is useful to you, a review on WordPress.org helps other shops find it."
     1364msgstr ""
     1365
     1366#: includes/class-review-request.php:84
    6181367msgid "Write a review"
    6191368msgstr ""
    … …  
    6231372msgstr ""
    6241373
    625 #. translators: %s: link to Products › Mockups.
    626 #: includes/class-settings-page.php:37
    627 #, php-format
    628 msgid "Turn the designer on per product in its PrintBlob tab. Product photos and print areas are set up under %s."
    629 msgstr ""
    630 
    631 #: includes/class-settings-page.php:44
    632 msgid "Designer page"
    633 msgstr ""
    634 
    635 #: includes/class-settings-page.php:45
     1374#. translators: %s: link to PrintBlob › Mockups.
     1375#: includes/class-settings-page.php:38
     1376#, php-format
     1377msgid "Turn the designer on per product in its PrintBlob tab. The product photos and their print areas are under %s."
     1378msgstr ""
     1379
     1380#: includes/class-settings-page.php:46
    6361381msgid "Where the Colours block and colour links send customers. Leave empty to use the first page that contains the designer."
    6371382msgstr ""
    6381383
    639 #: includes/class-settings-page.php:53
     1384#: includes/class-settings-page.php:54
    6401385msgid "Colour attribute"
    6411386msgstr ""
    6421387
    643 #: includes/class-settings-page.php:54
     1388#: includes/class-settings-page.php:55
    6441389msgid "The product attribute whose terms are the product colours. Each colour gets a colour value and a photo on its edit screen."
    6451390msgstr ""
    6461391
    647 #: includes/class-settings-page.php:62
     1392#: includes/class-settings-page.php:63
    6481393msgid "Size attribute"
    6491394msgstr ""
    6501395
    651 #: includes/class-settings-page.php:63
     1396#: includes/class-settings-page.php:64
    6521397msgid "The product attribute that holds sizes, shown as size buttons in the designer."
    6531398msgstr ""
    6541399
    655 #: includes/class-settings-page.php:71
     1400#: includes/class-settings-page.php:72
    6561401msgid "Largest customer image (MB)"
    6571402msgstr ""
    6581403
    659 #: includes/class-settings-page.php:82
     1404#: includes/class-settings-page.php:83
    6601405msgid "Keep unordered designs (days)"
    6611406msgstr ""
    6621407
    663 #: includes/class-settings-page.php:83
     1408#: includes/class-settings-page.php:84
    6641409msgid "Designs added to a cart but never ordered are deleted after this many days. Ordered designs are kept with the order."
    6651410msgstr ""
    6661411
    667 #: includes/class-settings.php:40
    668 msgid "PrintBlob Pro: sleeves, print queue, your own fonts"
    669 msgstr ""
    670 
    671 #: includes/class-settings.php:56
    672 msgid "Settings"
    673 msgstr ""
    674 
    675 #: includes/class-settings.php:112
    676 msgid "PrintBlob Pro"
    677 msgstr ""
    678 
    679 #: includes/class-settings.php:115
    680 msgid "PrintBlob Pro adds a 3D view of the product, sleeve printing, a print queue that downloads every print file of an order as one ZIP, and your own fonts, with automatic updates and priority support. It is a separate plugin from printblob.com; everything here works without it."
    681 msgstr ""
    682 
    683 #: includes/class-settings.php:117
    684 msgid "PrintBlob Pro’s plans"
     1412#: includes/class-settings.php:41
     1413msgid "Rate PrintBlob ★★★★★"
     1414msgstr ""
     1415
     1416#. translators: %d: days of PrintBlob Pro's free trial.
     1417#: includes/class-settings.php:45
     1418#, php-format
     1419msgid "PrintBlob Pro add-on: the 3D view and more, free for %d day"
     1420msgid_plural "PrintBlob Pro add-on: the 3D view and more, free for %d days"
     1421msgstr[0] ""
     1422msgstr[1] ""
     1423
     1424#: includes/class-settings.php:123
     1425msgid "Upload your own fonts"
    6851426msgstr ""
    6861427
    6871428#: includes/class-shirt-colors.php:92
    6881429msgid "Product photo for this colour"
     1430msgstr ""
     1431
     1432#: includes/class-shirt-colors.php:93
     1433msgid "Use this photo"
     1434msgstr ""
     1435
     1436#: includes/class-shirt-colors.php:103
     1437msgid "Choose photo"
    6891438msgstr ""
    6901439
  • printblob/tags/1.3.0/package.json

    r3751165 r3751408  
    99                "./build": "./build.mts",
    1010                "./designer/*.js": "./src/designer/app/*.ts",
     11                "./admin/*.js": "./src/admin/*.ts",
    1112                "./designer.scss": {
    1213                        "types": "./src/designer/stylesheet.d.ts",
  • printblob/tags/1.3.0/printblob.php

    r3751165 r3751408  
    33 * Plugin Name:       PrintBlob – Product Designer for WooCommerce
    44 * Plugin URI:        https://printblob.com/
    5  * Description:       Customers design their own print on your products — photos, logos and text on the front and back — see it on the real product, and order it through WooCommerce with a print-ready file attached to the order.
    6  * Version:           1.2.6
     5 * Description:       Customers design their own t-shirt print — photos, logos and text — see it on the t-shirt, and order it through WooCommerce with a print-ready file attached to the order.
     6 * Version:           1.3.0
    77 * Requires at least: 7.0
    88 * Requires PHP:      7.4
    … …  
    3939require_once __DIR__ . '/includes/class-privacy.php';
    4040require_once __DIR__ . '/includes/class-review-request.php';
     41require_once __DIR__ . '/includes/class-pro.php';
     42require_once __DIR__ . '/includes/class-admin-menu.php';
     43require_once __DIR__ . '/includes/class-overview.php';
     44require_once __DIR__ . '/includes/class-print-queue.php';
     45require_once __DIR__ . '/includes/class-dashboard-widget.php';
     46require_once __DIR__ . '/includes/class-order-milestones.php';
     47require_once __DIR__ . '/includes/class-quick-setup.php';
     48require_once __DIR__ . '/includes/class-deactivation-feedback.php';
    4149
    4250add_action(
    … …  
    5664                Privacy::register();
    5765                Review_Request::register();
     66                Pro::register();
     67                Admin_Menu::register();
     68                Dashboard_Widget::register();
     69                Order_Milestones::register();
     70                Quick_Setup::register();
     71                Deactivation_Feedback::register();
    5872        }
    5973);
  • printblob/tags/1.3.0/readme.txt

    r3751165 r3751408  
    55Tested up to: 7.1
    66Requires PHP: 7.4
    7 Stable tag: 1.2.6
     7Stable tag: 1.3.0
    88License: GPL-2.0-or-later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    1010
    11 Let customers design their own print — photos, logos and text — on your real product photos, and receive a print-ready 300 DPI file with every order.
     11Let customers design their own t-shirt print — photos, logos and text — and receive a print-ready 300 DPI file with every order.
    1212
    1313== Description ==
    1414
    15 Try it before you install: the [live demo on printblob.com](https://printblob.com/#demo) runs this exact designer.
     15Try it before you install: the [live demo on printblob.com](https://printblob.com/#demo) runs this designer, with PrintBlob Pro's back printing and 3D view added.
    1616
    17 PrintBlob adds a product designer to WooCommerce. Customers upload a photo or logo, type text in a choice of fonts, move and resize everything on the front and back of your product, pick a colour and size, and see the price update as they go. When they order, you get a print-ready PNG at 300 DPI for each printed side, attached to the order.
     17PrintBlob adds a product designer to WooCommerce. Customers upload a photo or logo, type text in a choice of fonts, move and resize everything on the front of the t-shirt, pick a colour and size, and see the price update as they go. When they order, you get a print-ready PNG at 300 DPI for each printed side, attached to the order.
    1818
    19 * **Your own product photos.** Set up mockups under Products › Mockups: a photo per side, the print area drawn right on the photo, and the real print size in centimetres.
    20 * **Every colour from one photo.** Photograph the product once in white; PrintBlob recolours it to each colour of your colour attribute, keeping folds and shading.
     19* **A t-shirt, ready to sell.** The bundled t-shirt mockup, front and back photos with its print area and real print size set, is ready the moment you activate. PrintBlob › Mockups shows it with its print area drawn on the photo.
     20* **Every colour from one photo.** The white t-shirt is recoloured to each colour of your colour attribute, keeping folds and shading.
    2121* **Print-ready files.** Each printed side becomes a transparent PNG at exactly the print size, 300 DPI. Customers are warned when an image is too small to print sharply.
    2222* **Works with WooCommerce.** Variable products, the block cart and checkout, order emails and the order screen (with download links for the print files). Compatible with High-Performance Order Storage.
    … …  
    2626= PrintBlob Pro =
    2727
    28 The [PrintBlob Pro](https://printblob.com/) add-on adds a 3D view of the product, made from the same front and back photos, sleeve printing, a production print queue and your own fonts.
     28The [PrintBlob Pro](https://printblob.com/) add-on adds your own products (mugs, hoodies, bags, on your own photos, with the print area drawn on each and its real print size), back printing, a 3D view of the product made from its front and back photos, sleeve printing, a production print queue and your own fonts.
    2929
    3030= Privacy =
    3131
    32 PrintBlob does not send data to any outside service. Customer images and designs are stored on your site: previews in the media library, print files in a protected folder. Designs that never become an order are deleted after the number of days set in the settings.
     32PrintBlob sends nothing to any outside service, with one exception you choose: when you deactivate it, a box asks why you are leaving. "Skip and deactivate" sends nothing. Only if you press "Send and deactivate" does it send printblob.com the reason you chose, your note, your email address if you typed one, the PrintBlob version and your WordPress language; never your site's address or your customers' data. How long printblob.com keeps it is in its privacy policy: https://printblob.com/legal/privacy/. Customer images and designs are stored on your site: previews in the media library, print files in a protected folder. Designs that never become an order are deleted after the number of days set in the settings.
    3333
    3434= Copyright =
    … …  
    4747
    48481. Install PrintBlob from Plugins › Add Plugin (search for "PrintBlob") and activate it. WooCommerce must be active.
    49 2. Open Products › Mockups. A t-shirt mockup is ready to use; add your own photos and print areas as needed.
     492. Open PrintBlob › Mockups. The t-shirt mockup is ready to use; your own products and photos come with PrintBlob Pro.
    50503. Edit a product, open its PrintBlob designer tab, turn the designer on, choose a mockup and set the print price per side.
    51514. Add colour values and photos to the terms of your colour attribute (Products › Attributes).
    … …  
    8989
    9090== Changelog ==
     91
     92= 1.3.0 =
     93* A PrintBlob menu with its own Overview: each set-up step marked done or to do, with the link that fixes it, the latest orders with designs, and this month's count. The same overview is under WooCommerce › PrintBlob.
     94* Quick setup: one click makes a designable product on the bundled t-shirt, with a colour and a size attribute, its variations and a designer page. Each step can use what the shop already has, and running it again makes nothing twice.
     95* The designer now shows on the product page of a designer product in any theme: block themes get a "Product with the PrintBlob designer" template, classic themes get the designer in place of the photos and summary.
     96* A Print queue screen lists processing orders with designs and their print files; a "PrintBlob this week" dashboard widget counts them.
     97* PrintBlob prints the front of the bundled t-shirt. Back printing and your own products (the mockup editor) are now part of the PrintBlob Pro add-on, beside sleeves, the 3D view and the print queue. Orders placed with a back print keep their print files, and mockups made earlier keep working.
     98* PrintBlob's own screens show what PrintBlob Pro adds, with its free trial, and a page compares free and Pro.
     99* When PrintBlob is deactivated, a box asks why. Nothing is sent unless the person presses Send.
    91100
    92101= 1.2.6 =
    … …  
    137146* The bundled t-shirt mockup's print areas are in assets/mockups/tee.json.
    138147
    139 = 1.1.2 =
    140 * In themes with a dark mode, the designer's Front and Back switch, its 3D button and its quieter buttons follow the dark colours: they stayed light, with light text that could not be read.
     148== Upgrade Notice ==
    141149
    142 = 1.1.1 =
    143 * Saving designs is limited per shopper and per IP (30 and 300 an hour; filter `printblob_design_save_limits`), since every save stores files on the shop's server.
    144 * A design preview larger than a browser makes is refused before it is processed.
    145 * A design that fails part-way through saving leaves no files behind.
    146 * Unordered designs are cleaned up twice a day, in batches until none are left, instead of 200 a day.
    147 * Site Health checks that print files cannot be downloaded from the web, and gives the nginx rule when they can.
    148 * Designs are part of WordPress's Export and Erase Personal Data tools (ordered designs follow WooCommerce's setting for order data), are deleted with their order, and the privacy policy guide says what is stored.
    149 * The 3D button is shown only where the browser draws 3D on a graphics processor; where it would draw it in software and stutter, the designer works without it.
    150 * Copyright: microcompanies, LLC.
    151 
    152 = 1.1.0 =
    153 * New: a 3D view in the designer. The 3D button turns the product into a garment on a hanger, made from the mockup's front and back photos, with the customer's design printed on each side; drag to turn it, or use Front and Back. Its code loads only when it is opened. It can be turned off under WooCommerce › Settings › PrintBlob.
    154 * The bundled t-shirt mockup has its own photo of the back (until now the front photo was used for both sides). Shops still using the bundled photos get it automatically; photos a shop uploaded are never changed.
    155 * Mockups can record where the garment is open (sleeve ends, hem, neck) for the 3D view; the bundled t-shirt comes with them.
    156 
    157 Older entries are in changelog.txt.
    158 
    159 == Upgrade Notice ==
     150= 1.3.0 =
     151Back printing and editing your own mockups move to the PrintBlob Pro add-on; existing orders and mockups keep working. Adds the PrintBlob menu, Quick setup and the designer on product pages in any theme.
    160152
    161153= 1.2.3 =
  • printblob/tags/1.3.0/src/admin/term-image.ts

    r3750583 r3751408  
    11/* Media library picker for the colour term's shirt photo. */
    22import $ from 'jquery';
     3import { chooseImage, type MediaLabels } from './media.ts';
     4
     5declare const printblobTermImage: MediaLabels;
    36
    47$( document ).on( 'click', '[data-printblob-term-image] [data-printblob-choose]', function ( event ) {
    58        event.preventDefault();
    69        const field = $( this ).closest( '[data-printblob-term-image]' );
    7         const frame = wp.media( {
    8                 title: window.printblobTermImage.title,
    9                 button: { text: window.printblobTermImage.button },
    10                 library: { type: 'image' },
    11                 multiple: false,
    12         } );
    13         frame.on( 'select', function () {
    14                 const image = frame.state().get( 'selection' ).first().toJSON();
     10        chooseImage( printblobTermImage, ( image ) => {
    1511                const preview = image.sizes?.thumbnail?.url ?? image.url;
    1612                field.find( 'input[name="printblob_image"]' ).val( image.id );
    … …  
    1814                field.find( '[data-printblob-remove]' ).prop( 'hidden', false );
    1915        } );
    20         frame.open();
    2116} );
    2217
  • printblob/tags/1.3.0/src/designer/app/App.tsx

    r3751165 r3751408  
    427427                        <div className="printblob-designer__stage-column">
    428428                                <div className="printblob-designer__views">
    429                                         <div className="printblob-designer__sides" role="tablist" aria-label={ __( 'Printed side', 'printblob' ) }>
    430                                                 { config.sides.map( ( entry ) => (
    431                                                         <button
    432                                                                 key={ entry.key }
    433                                                                 type="button"
    434                                                                 role="tab"
    435                                                                 aria-selected={ side === entry.key }
    436                                                                 className="printblob-designer__side"
    437                                                                 onClick={ () => switchSide( entry.key ) }
    438                                                                 disabled={ ! ready || busy }
    439                                                         >
    440                                                                 { entry.label }
    441                                                                 <span
    442                                                                         className={ filled[ entry.key ] ? 'printblob-designer__side-dot is-shown' : 'printblob-designer__side-dot' }
    443                                                                         aria-label={ filled[ entry.key ] ? __( 'has a print', 'printblob' ) : undefined }
    444                                                                 />
    445                                                         </button>
    446                                                 ) ) }
    447                                         </div>
     429                                        { config.sides.length > 1 && (
     430                                                <div className="printblob-designer__sides" role="tablist" aria-label={ __( 'Printed side', 'printblob' ) }>
     431                                                        { config.sides.map( ( entry ) => (
     432                                                                <button
     433                                                                        key={ entry.key }
     434                                                                        type="button"
     435                                                                        role="tab"
     436                                                                        aria-selected={ side === entry.key }
     437                                                                        className="printblob-designer__side"
     438                                                                        onClick={ () => switchSide( entry.key ) }
     439                                                                        disabled={ ! ready || busy }
     440                                                                >
     441                                                                        { entry.label }
     442                                                                        <span
     443                                                                                className={ filled[ entry.key ] ? 'printblob-designer__side-dot is-shown' : 'printblob-designer__side-dot' }
     444                                                                                aria-label={ filled[ entry.key ] ? __( 'has a print', 'printblob' ) : undefined }
     445                                                                        />
     446                                                                </button>
     447                                                        ) ) }
     448                                                </div>
     449                                        ) }
    448450                                        { views.map( ( view ) => (
    449451                                                <button
    … …  
    458460                                                </button>
    459461                                        ) ) }
     462                                        { config.proChip && (
     463                                                <a className="printblob-designer__pro-chip" href={ config.proChip.href } title={ config.proChip.title } target="_blank" rel="noopener">
     464                                                        { config.proChip.label }
     465                                                </a>
     466                                        ) }
    460467                                </div>
    461468                                <div className="printblob-designer__stage" style={ { aspectRatio: `${ tallest.stage.width } / ${ tallest.stage.height }` } }>
  • printblob/tags/1.3.0/src/designer/app/sides.ts

    r3750583 r3751408  
    33import type { PrintSide, Size } from './types.ts';
    44
     5/** The sides PrintBlob prints, by key; add-ons add others. */
     6export const PRINTED_SIDES: readonly string[] = designer.sides;
    57export const STAGE_WIDTH = designer.stage_width;
    68export const PRINT_DPI = designer.print_dpi;
  • printblob/tags/1.3.0/src/designer/app/types.ts

    r3750583 r3751408  
    9494        cart: string;
    9595        [endpoint: string]: unknown;
     96}
     97
     98export interface ProChip {
     99        label: string;
     100        title: string;
     101        href: string;
    96102}
    97103
    … …  
    118124        tools?: ListedExtension[];
    119125        options?: DesignerOption[];
     126        /** The "3D · Pro" link the host shows a shop manager while PrintBlob Pro is not active; never sent to customers. */
     127        proChip?: ProChip;
    120128        currency: CurrencyConfig;
    121129        endpoints: DesignerEndpoints;
  • printblob/tags/1.3.0/src/designer/render.php

    r3751165 r3751408  
    149149$printblob_config = (array) apply_filters( 'printblob_designer_config', $printblob_config, $printblob_product );
    150150
     151// The "3D · Pro" link, for a shop manager while PrintBlob Pro is not active: decided here, so customers' pages never carry it.
     152$printblob_pro_chip = Pro::storefront_chip();
     153if ( $printblob_pro_chip ) {
     154        $printblob_config['proChip'] = $printblob_pro_chip;
     155}
     156
    151157// A variation that depends on an attribute the designer doesn't offer could only be ordered as the wrong one.
    152158$printblob_offered   = array_merge(
    … …  
    210216                <div class="printblob-designer__stage-column">
    211217                        <div class="printblob-designer__views" aria-hidden="true">
    212                                 <div class="printblob-designer__sides">
    213                                         <?php foreach ( $printblob_sides as $printblob_index => $printblob_entry ) : ?>
    214                                                 <span class="printblob-designer__side<?php echo 0 === $printblob_index ? ' is-current' : ''; ?>"><?php echo esc_html( (string) $printblob_entry['label'] ); ?><span class="printblob-designer__side-dot"></span></span>
    215                                         <?php endforeach; ?>
    216                                 </div>
     218                                <?php if ( count( $printblob_sides ) > 1 ) : ?>
     219                                        <div class="printblob-designer__sides">
     220                                                <?php foreach ( $printblob_sides as $printblob_index => $printblob_entry ) : ?>
     221                                                        <span class="printblob-designer__side<?php echo 0 === $printblob_index ? ' is-current' : ''; ?>"><?php echo esc_html( (string) $printblob_entry['label'] ); ?><span class="printblob-designer__side-dot"></span></span>
     222                                                <?php endforeach; ?>
     223                                        </div>
     224                                <?php endif; ?>
    217225                                <?php foreach ( (array) ( $printblob_config['views'] ?? array() ) as $printblob_view ) : ?>
    218226                                        <span class="printblob-designer__side printblob-designer__side--view printblob-designer__side--<?php echo esc_attr( (string) $printblob_view['key'] ); ?>"><?php echo esc_html( (string) $printblob_view['label'] ); ?></span>
    219227                                <?php endforeach; ?>
     228                                <?php if ( $printblob_pro_chip ) : ?>
     229                                        <a class="printblob-designer__pro-chip" href="<?php echo esc_url( $printblob_pro_chip['href'] ); ?>" title="<?php echo esc_attr( $printblob_pro_chip['title'] ); ?>" target="_blank" rel="noopener" tabindex="-1"><?php echo esc_html( $printblob_pro_chip['label'] ); ?></a>
     230                                <?php endif; ?>
    220231                        </div>
    221232                        <div class="printblob-designer__stage" style="aspect-ratio: <?php echo (int) $printblob_tallest['stage']['width']; ?> / <?php echo (int) $printblob_tallest['stage']['height']; ?>">
  • printblob/tags/1.3.0/src/designer/view.scss

    r3751165 r3751408  
    135135}
    136136
     137// The shop manager's link to PrintBlob Pro's 3D view (Pro::storefront_chip()):
     138// customers never get it.
     139.printblob-designer__pro-chip {
     140        display: inline-flex;
     141        align-items: center;
     142        padding: 0.5rem 0.9rem;
     143        border-radius: 999px;
     144        box-shadow: inset 0 0 0 1px var(--printblob-seam);
     145        color: var(--printblob-cobalt);
     146        font-size: 0.875em;
     147        font-weight: 640;
     148        letter-spacing: 0.02em;
     149        line-height: 1.2;
     150        text-decoration: none;
     151
     152        &:focus-visible {
     153                outline: 2px solid var(--printblob-cobalt);
     154                outline-offset: 2px;
     155        }
     156}
     157
    137158// Always in the tab, shown once the side has a print, so the tab keeps its width.
    138159.printblob-designer__side-dot {
  • printblob/tags/1.3.0/uninstall.php

    r3750583 r3751408  
    1313global $wpdb;
    1414
    15 foreach ( array( 'printblob_designer_page', 'printblob_color_attribute', 'printblob_size_attribute', 'printblob_max_upload_mb', 'printblob_keep_unordered_days', 'printblob_default_mockup', 'printblob_bundled_photo', 'printblob_show_welcome', 'printblob_review_request' ) as $printblob_option ) {
     15foreach ( array( 'printblob_designer_page', 'printblob_color_attribute', 'printblob_size_attribute', 'printblob_max_upload_mb', 'printblob_keep_unordered_days', 'printblob_default_mockup', 'printblob_bundled_photo', 'printblob_show_welcome', 'printblob_review_request', 'printblob_order_milestone_dismissed', 'printblob_quick_setup' ) as $printblob_option ) {
    1616        delete_option( $printblob_option );
    1717}
    1818$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", $wpdb->esc_like( '_transient_printblob_saves_' ) . '%', $wpdb->esc_like( '_transient_timeout_printblob_saves_' ) . '%' ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall: the hourly design-save counters carry a hash and the hour in their names, no API deletes transients by prefix, and nothing is cached afterwards.
    1919wp_clear_scheduled_hook( 'printblob_cleanup_designs' );
    20 delete_metadata( 'user', 0, 'printblob_pro_hint_dismissed', '', true );
     20delete_transient( 'printblob_print_folder_check' );
     21foreach ( get_users(
     22        array(
     23                'capability' => 'manage_woocommerce',
     24                'fields'     => 'ID',
     25        )
     26) as $printblob_user ) {
     27        delete_transient( 'printblob_quick_setup_result_' . $printblob_user );
     28}
     29foreach ( array( 'printblob_pro_hint_dismissed', 'printblob_pro_card_dismissed', 'printblob_dashboard_dismissed' ) as $printblob_user_meta ) {
     30        delete_metadata( 'user', 0, $printblob_user_meta, '', true );
     31}
    2132
    2233// Every post of a type, or every attachment of a post, by ID.
  • printblob/tags/1.3.0/webpack.config.mts

    r3750583 r3751408  
    1414import { INK_COLORS } from './src/designer/app/ink.ts';
    1515
    16 const admin = { 'admin/mockup-editor': './src/admin/mockup-editor.ts', 'admin/term-image': './src/admin/term-image.ts' };
     16const admin = { 'admin/term-image': './src/admin/term-image.ts', 'admin/pro-box': './src/admin/pro-box.ts' };
    1717
    1818const withAdmin = async ( entry: Configuration[ 'entry' ] ): Promise< EntryObject > => {
  • printblob/trunk/assets/designer.json

    r3750583 r3751408  
    11{
    2         "$comment": "The designer's fixed numbers, written once: its TypeScript (src/designer/app/sides.ts, host.ts), its PHP and every host of the designer read them here.",
     2        "$comment": "The designer's fixed numbers and the sides PrintBlob prints, written once: its TypeScript (src/designer/app/sides.ts, host.ts), its PHP and every host of the designer read them here. Add-ons add sides (PHP: the printblob_sides filter).",
     3        "sides": [ "front" ],
    34        "stage_width": 1000,
    45        "print_dpi": 300,
  • printblob/trunk/build/admin/term-image.asset.php

    r3750583 r3751408  
    33                'jquery'
    44        ),
    5         'version' => 'e08ff7b792227bd5f4fa'
     5        'version' => '26adf56b3d5ffb32e043'
    66);
  • printblob/trunk/build/admin/term-image.js

    r3750583 r3751408  
    1 (()=>{"use strict";const t={n:e=>{const i=e&&e.__esModule?()=>e.default:()=>e;return t.d(i,{a:i}),i},d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.hasOwn(t,e)},e=window.jQuery;var i=t.n(e);i()(document).on("click","[data-printblob-term-image] [data-printblob-choose]",function(t){t.preventDefault();const e=i()(this).closest("[data-printblob-term-image]"),n=wp.media({title:window.printblobTermImage.title,button:{text:window.printblobTermImage.button},library:{type:"image"},multiple:!1});n.on("select",function(){const t=n.state().get("selection").first().toJSON(),a=t.sizes?.thumbnail?.url??t.url;e.find('input[name="printblob_image"]').val(t.id),e.find(".printblob-term-image__preview").empty().append(i()("<img>",{src:a,alt:"",width:150})),e.find("[data-printblob-remove]").prop("hidden",!1)}),n.open()}),i()(document).on("click","[data-printblob-term-image] [data-printblob-remove]",function(t){t.preventDefault();const e=i()(this).closest("[data-printblob-term-image]");e.find('input[name="printblob_image"]').val(""),e.find(".printblob-term-image__preview").empty(),i()(this).prop("hidden",!0)}),i()(document).on("ajaxComplete",function(t,e,n){"string"==typeof n.data&&-1!==n.data.indexOf("action=add-tag")&&i()("#addtag [data-printblob-term-image] [data-printblob-remove]").trigger("click")})})();
     1(()=>{"use strict";const t={n:e=>{const i=e&&e.__esModule?()=>e.default:()=>e;return t.d(i,{a:i}),i},d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.hasOwn(t,e)},e=window.jQuery;var i=t.n(e);i()(document).on("click","[data-printblob-term-image] [data-printblob-choose]",function(t){t.preventDefault();const e=i()(this).closest("[data-printblob-term-image]");!function(t){const n=wp.media({title:t.title,button:{text:t.button},library:{type:"image"},multiple:!1});n.on("select",()=>(t=>{const n=t.sizes?.thumbnail?.url??t.url;e.find('input[name="printblob_image"]').val(t.id),e.find(".printblob-term-image__preview").empty().append(i()("<img>",{src:n,alt:"",width:150})),e.find("[data-printblob-remove]").prop("hidden",!1)})(n.state().get("selection").first().toJSON())),n.open()}(printblobTermImage)}),i()(document).on("click","[data-printblob-term-image] [data-printblob-remove]",function(t){t.preventDefault();const e=i()(this).closest("[data-printblob-term-image]");e.find('input[name="printblob_image"]').val(""),e.find(".printblob-term-image__preview").empty(),i()(this).prop("hidden",!0)}),i()(document).on("ajaxComplete",function(t,e,n){"string"==typeof n.data&&-1!==n.data.indexOf("action=add-tag")&&i()("#addtag [data-printblob-term-image] [data-printblob-remove]").trigger("click")})})();
  • printblob/trunk/build/designer/render.php

    r3751165 r3751408  
    149149$printblob_config = (array) apply_filters( 'printblob_designer_config', $printblob_config, $printblob_product );
    150150
     151// The "3D · Pro" link, for a shop manager while PrintBlob Pro is not active: decided here, so customers' pages never carry it.
     152$printblob_pro_chip = Pro::storefront_chip();
     153if ( $printblob_pro_chip ) {
     154        $printblob_config['proChip'] = $printblob_pro_chip;
     155}
     156
    151157// A variation that depends on an attribute the designer doesn't offer could only be ordered as the wrong one.
    152158$printblob_offered   = array_merge(
    … …  
    210216                <div class="printblob-designer__stage-column">
    211217                        <div class="printblob-designer__views" aria-hidden="true">
    212                                 <div class="printblob-designer__sides">
    213                                         <?php foreach ( $printblob_sides as $printblob_index => $printblob_entry ) : ?>
    214                                                 <span class="printblob-designer__side<?php echo 0 === $printblob_index ? ' is-current' : ''; ?>"><?php echo esc_html( (string) $printblob_entry['label'] ); ?><span class="printblob-designer__side-dot"></span></span>
    215                                         <?php endforeach; ?>
    216                                 </div>
     218                                <?php if ( count( $printblob_sides ) > 1 ) : ?>
     219                                        <div class="printblob-designer__sides">
     220                                                <?php foreach ( $printblob_sides as $printblob_index => $printblob_entry ) : ?>
     221                                                        <span class="printblob-designer__side<?php echo 0 === $printblob_index ? ' is-current' : ''; ?>"><?php echo esc_html( (string) $printblob_entry['label'] ); ?><span class="printblob-designer__side-dot"></span></span>
     222                                                <?php endforeach; ?>
     223                                        </div>
     224                                <?php endif; ?>
    217225                                <?php foreach ( (array) ( $printblob_config['views'] ?? array() ) as $printblob_view ) : ?>
    218226                                        <span class="printblob-designer__side printblob-designer__side--view printblob-designer__side--<?php echo esc_attr( (string) $printblob_view['key'] ); ?>"><?php echo esc_html( (string) $printblob_view['label'] ); ?></span>
    219227                                <?php endforeach; ?>
     228                                <?php if ( $printblob_pro_chip ) : ?>
     229                                        <a class="printblob-designer__pro-chip" href="<?php echo esc_url( $printblob_pro_chip['href'] ); ?>" title="<?php echo esc_attr( $printblob_pro_chip['title'] ); ?>" target="_blank" rel="noopener" tabindex="-1"><?php echo esc_html( $printblob_pro_chip['label'] ); ?></a>
     230                                <?php endif; ?>
    220231                        </div>
    221232                        <div class="printblob-designer__stage" style="aspect-ratio: <?php echo (int) $printblob_tallest['stage']['width']; ?> / <?php echo (int) $printblob_tallest['stage']['height']; ?>">
  • printblob/trunk/build/designer/view-rtl.css

    r3751165 r3751408  
    1 .printblob-designer,.wp-block-printblob-designer{--printblob-ink:var(--wp--preset--color--ink,#1a1d22);--printblob-heather:var(--wp--preset--color--heather,#5f6670);--printblob-seam:var(--wp--preset--color--seam,#e2e4e0);--printblob-cotton:var(--wp--preset--color--cotton,#f6f7f5);--printblob-cobalt:var(--wp--preset--color--cobalt,#2645d6);--printblob-cobalt-deep:var(--wp--preset--color--cobalt-deep,#1b33a6);--printblob-surface:var(--wp--preset--color--white,#fff);--printblob-on-ink:var(--wp--preset--color--white,#fff);--printblob-fill:color-mix(in srgb,var(--printblob-ink) 8%,var(--printblob-surface));--printblob-muted:color-mix(in srgb,var(--printblob-ink) 80%,var(--printblob-surface));--printblob-on-cobalt:#fff;--printblob-radius:var(--wp--custom--printblob--radius,6px);--printblob-field-radius:min(var(--printblob-radius),14px);color:var(--printblob-ink)}.printblob-designer__loading{color:var(--printblob-heather)}.printblob-stack{display:grid}.printblob-stack>*{grid-area:1/1;min-width:0}.printblob-stack>:not(.is-shown){visibility:hidden}.printblob-stack>.printblob-stack__fill{contain:size;overflow:auto;scrollbar-gutter:stable}.printblob-designer__layout{align-items:start;display:grid;gap:clamp(1.5rem,4vw,4rem);grid-template-columns:minmax(0,1.25fr) minmax(320px,.75fr)}@media(max-width:900px){.printblob-designer__layout{grid-template-columns:minmax(0,1fr)}}.printblob-designer__stage-column{position:sticky;top:1.5rem}@media(max-width:900px){.printblob-designer__stage-column{position:static}}.printblob-designer__views{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1rem}.printblob-designer__sides{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);display:inline-flex;gap:.25rem;padding:.25rem}.printblob-designer__side{align-items:center;background:transparent;border:0;border-radius:var(--printblob-radius);color:var(--printblob-muted);cursor:pointer;display:inline-flex;font:inherit;font-weight:560;gap:.45rem;letter-spacing:inherit;padding:.5rem 1.1rem}.printblob-designer__side.is-current,.printblob-designer__side[aria-selected=true]{background:var(--printblob-surface);box-shadow:0 1px 2px rgba(26,29,34,.08);color:var(--printblob-ink)}.printblob-designer__side--view{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);font-weight:640;letter-spacing:.02em;padding:.75rem 1.1rem}.printblob-designer__side--view[aria-pressed=true]{background:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-designer__side--view:disabled{cursor:default;opacity:.6}.printblob-designer__side-dot{background:var(--printblob-cobalt);border-radius:50%;height:7px;width:7px}.printblob-designer__side-dot:not(.is-shown){visibility:hidden}.printblob-designer__stage{align-items:center;background:var(--printblob-cotton);border-radius:10px;display:grid;overflow:hidden;position:relative}.printblob-designer__frame{position:relative}.printblob-designer__canvas,.printblob-designer__shirt{inset:0;position:absolute}.printblob-designer__shirt{display:block;height:100%;width:100%}.printblob-designer__area{border:2px dashed rgba(26,29,34,.35);border-radius:4px;pointer-events:none;position:absolute}.printblob-designer__area.is-on-dark{border-color:hsla(0,0%,100%,.55)}.printblob-designer__canvas .canvas-container,.printblob-designer__canvas canvas{height:100%!important;width:100%!important}.printblob-designer__stage-loading{align-items:center;background:var(--printblob-surface);border-radius:999px;color:var(--printblob-heather);display:flex;font-size:.875rem;gap:.5rem;right:50%;margin:0;padding:.45rem .85rem;position:absolute;top:50%;transform:translate(50%,-50%);white-space:nowrap}.printblob-designer__stage-loading:before{border:2px solid var(--printblob-seam);border-radius:50%;border-top-color:var(--printblob-cobalt);content:"";flex:none;height:.9rem;width:.9rem}@media(prefers-reduced-motion:no-preference){.printblob-designer__stage-loading:before{animation:printblob-turn .8s linear infinite}}@keyframes printblob-turn{to{transform:rotate(-1turn)}}.printblob-designer__hint{color:var(--printblob-heather);font-size:.875rem;margin:.75rem 0 0}.printblob-designer__title{font-size:clamp(1.75rem,3vw,2.5rem);letter-spacing:-.03em;line-height:1.1;margin:0}.printblob-designer__price{font-size:1.375rem;font-weight:560;margin:.5rem 0 0}.printblob-designer__section{border:0;margin:2rem 0 0;padding:0}.printblob-designer__section h2,.printblob-designer__section legend{align-items:baseline;display:flex;font-size:1rem;font-weight:620;gap:.5rem;letter-spacing:-.01em;margin:0 0 .75rem;padding:0}.printblob-designer__choice{color:var(--printblob-heather);font-weight:400}.printblob-designer__row,.printblob-designer__tools{align-items:end;display:flex;flex-wrap:wrap;gap:.6rem}.printblob-designer__workbench{border:1px solid var(--printblob-seam);border-radius:10px;margin-top:1rem}.printblob-designer__items,.printblob-designer__selection,.printblob-designer__tool{align-content:start;display:grid;gap:1rem;padding:1rem}.printblob-designer__items{gap:.6rem}.printblob-designer__items h3{color:var(--printblob-heather);font-size:.875rem;font-weight:560;margin:0}.printblob-designer__items ul{display:grid;gap:.4rem;list-style:none;margin:0;padding:0}.printblob-designer__item{align-items:center;background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);box-sizing:border-box;color:var(--printblob-ink);cursor:pointer;display:flex;font:inherit;gap:.6rem;min-height:2.75rem;padding:.4rem .75rem;text-align:start;width:100%}.printblob-designer__item:hover{outline:1px solid var(--printblob-ink);outline-offset:-1px}.printblob-designer__item img{flex:none;height:1.75rem;object-fit:contain;width:1.75rem}.printblob-designer__item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.printblob-designer__row--actions{gap:1rem}.printblob-button{background:var(--printblob-ink);border:1.5px solid var(--printblob-ink);border-radius:var(--printblob-radius);color:var(--printblob-on-ink);cursor:pointer;font:inherit;font-weight:560;padding:.75rem 1.2rem}.printblob-button:hover:not(:disabled){background:color-mix(in srgb,var(--printblob-ink) 82%,#000)}.printblob-button--quiet{background:transparent;color:var(--printblob-ink)}.printblob-button--quiet:hover:not(:disabled){background:var(--printblob-fill)}.printblob-button--primary{background:var(--printblob-cobalt);border-color:var(--printblob-cobalt);color:var(--printblob-on-cobalt);font-size:1.0625rem;padding:1rem 1.2rem;width:100%}.printblob-button--primary:hover:not(:disabled){background:var(--printblob-cobalt-deep);border-color:var(--printblob-cobalt-deep)}.printblob-button:disabled{cursor:not-allowed;opacity:.55}.printblob-link-button{background:none;border:0;color:var(--printblob-ink);cursor:pointer;font:inherit;font-size:.9375rem;padding:0;text-decoration:underline;text-underline-offset:.18em}.printblob-link-button--danger{color:#b42318}.printblob-field{border:0;color:var(--printblob-heather);display:grid;font-size:.875rem;gap:.35rem;margin:0;padding:0}.printblob-field input[type=number],.printblob-field select,.printblob-field textarea{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-field-radius);box-sizing:border-box;color:var(--printblob-ink);font:inherit;font-size:1rem;max-width:100%;min-width:0;padding:.6rem .75rem;width:100%}.printblob-field textarea{resize:vertical}.printblob-field legend{margin-bottom:.35rem}.printblob-field--qty{max-width:7rem}.printblob-toggle{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:700;padding:.6rem .9rem}.printblob-toggle[aria-pressed=true]{background:var(--printblob-ink);border-color:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-swatches{display:flex;flex-wrap:wrap;gap:.6rem}.printblob-swatch{background:var(--printblob-swatch);border:1px solid color-mix(in srgb,var(--printblob-ink) 22%,transparent);border-radius:50%;cursor:pointer;height:2.25rem;padding:0;position:relative;width:2.25rem}.printblob-swatch[aria-pressed=true]{outline:2px solid var(--printblob-ink);outline-offset:3px}.printblob-swatch--custom{background:conic-gradient(#d7263d,#f4c20d,#1f8a4c,#2645d6,#d7263d);overflow:hidden}.printblob-swatch--custom input{cursor:pointer;inset:0;opacity:0;position:absolute}.printblob-swatches--shirt .printblob-swatch{height:2.6rem;width:2.6rem}.printblob-sizes{display:flex;flex-wrap:wrap;gap:.5rem}.printblob-size{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:560;min-width:3.25rem;padding:.6rem .8rem}.printblob-size[aria-pressed=true]{border-color:var(--printblob-ink);box-shadow:inset 0 0 0 1px var(--printblob-ink)}.printblob-size:disabled{color:var(--printblob-heather);cursor:not-allowed;text-decoration:line-through}.printblob-breakdown{border-top:1px solid var(--printblob-seam);display:grid;gap:.4rem;margin:1.25rem 0;padding:1rem 0 0}.printblob-breakdown div{display:flex;justify-content:space-between}.printblob-breakdown dt{color:var(--printblob-heather)}.printblob-breakdown dd{justify-items:end;margin:0}.printblob-breakdown__none{color:var(--printblob-heather)}.printblob-breakdown__total{font-size:1.125rem;font-weight:620;margin-top:.4rem}.printblob-breakdown__total dt{color:var(--printblob-ink)}.printblob-note{color:var(--printblob-heather);font-size:.9375rem;margin:0}.printblob-note--warn{color:#8a5a00}.printblob-note--error{color:#b42318;margin-top:.75rem}.printblob-note--ok{color:var(--printblob-ink);margin-top:.75rem}:is(.wp-block-printblob-designer,.printblob-designer) :is(button,input,select,textarea,a):focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}
     1.printblob-designer,.wp-block-printblob-designer{--printblob-ink:var(--wp--preset--color--ink,#1a1d22);--printblob-heather:var(--wp--preset--color--heather,#5f6670);--printblob-seam:var(--wp--preset--color--seam,#e2e4e0);--printblob-cotton:var(--wp--preset--color--cotton,#f6f7f5);--printblob-cobalt:var(--wp--preset--color--cobalt,#2645d6);--printblob-cobalt-deep:var(--wp--preset--color--cobalt-deep,#1b33a6);--printblob-surface:var(--wp--preset--color--white,#fff);--printblob-on-ink:var(--wp--preset--color--white,#fff);--printblob-fill:color-mix(in srgb,var(--printblob-ink) 8%,var(--printblob-surface));--printblob-muted:color-mix(in srgb,var(--printblob-ink) 80%,var(--printblob-surface));--printblob-on-cobalt:#fff;--printblob-radius:var(--wp--custom--printblob--radius,6px);--printblob-field-radius:min(var(--printblob-radius),14px);color:var(--printblob-ink)}.printblob-designer__loading{color:var(--printblob-heather)}.printblob-stack{display:grid}.printblob-stack>*{grid-area:1/1;min-width:0}.printblob-stack>:not(.is-shown){visibility:hidden}.printblob-stack>.printblob-stack__fill{contain:size;overflow:auto;scrollbar-gutter:stable}.printblob-designer__layout{align-items:start;display:grid;gap:clamp(1.5rem,4vw,4rem);grid-template-columns:minmax(0,1.25fr) minmax(320px,.75fr)}@media(max-width:900px){.printblob-designer__layout{grid-template-columns:minmax(0,1fr)}}.printblob-designer__stage-column{position:sticky;top:1.5rem}@media(max-width:900px){.printblob-designer__stage-column{position:static}}.printblob-designer__views{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1rem}.printblob-designer__sides{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);display:inline-flex;gap:.25rem;padding:.25rem}.printblob-designer__side{align-items:center;background:transparent;border:0;border-radius:var(--printblob-radius);color:var(--printblob-muted);cursor:pointer;display:inline-flex;font:inherit;font-weight:560;gap:.45rem;letter-spacing:inherit;padding:.5rem 1.1rem}.printblob-designer__side.is-current,.printblob-designer__side[aria-selected=true]{background:var(--printblob-surface);box-shadow:0 1px 2px rgba(26,29,34,.08);color:var(--printblob-ink)}.printblob-designer__side--view{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);font-weight:640;letter-spacing:.02em;padding:.75rem 1.1rem}.printblob-designer__side--view[aria-pressed=true]{background:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-designer__side--view:disabled{cursor:default;opacity:.6}.printblob-designer__pro-chip{align-items:center;border-radius:999px;box-shadow:inset 0 0 0 1px var(--printblob-seam);color:var(--printblob-cobalt);display:inline-flex;font-size:.875em;font-weight:640;letter-spacing:.02em;line-height:1.2;padding:.5rem .9rem;text-decoration:none}.printblob-designer__pro-chip:focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}.printblob-designer__side-dot{background:var(--printblob-cobalt);border-radius:50%;height:7px;width:7px}.printblob-designer__side-dot:not(.is-shown){visibility:hidden}.printblob-designer__stage{align-items:center;background:var(--printblob-cotton);border-radius:10px;display:grid;overflow:hidden;position:relative}.printblob-designer__frame{position:relative}.printblob-designer__canvas,.printblob-designer__shirt{inset:0;position:absolute}.printblob-designer__shirt{display:block;height:100%;width:100%}.printblob-designer__area{border:2px dashed rgba(26,29,34,.35);border-radius:4px;pointer-events:none;position:absolute}.printblob-designer__area.is-on-dark{border-color:hsla(0,0%,100%,.55)}.printblob-designer__canvas .canvas-container,.printblob-designer__canvas canvas{height:100%!important;width:100%!important}.printblob-designer__stage-loading{align-items:center;background:var(--printblob-surface);border-radius:999px;color:var(--printblob-heather);display:flex;font-size:.875rem;gap:.5rem;right:50%;margin:0;padding:.45rem .85rem;position:absolute;top:50%;transform:translate(50%,-50%);white-space:nowrap}.printblob-designer__stage-loading:before{border:2px solid var(--printblob-seam);border-radius:50%;border-top-color:var(--printblob-cobalt);content:"";flex:none;height:.9rem;width:.9rem}@media(prefers-reduced-motion:no-preference){.printblob-designer__stage-loading:before{animation:printblob-turn .8s linear infinite}}@keyframes printblob-turn{to{transform:rotate(-1turn)}}.printblob-designer__hint{color:var(--printblob-heather);font-size:.875rem;margin:.75rem 0 0}.printblob-designer__title{font-size:clamp(1.75rem,3vw,2.5rem);letter-spacing:-.03em;line-height:1.1;margin:0}.printblob-designer__price{font-size:1.375rem;font-weight:560;margin:.5rem 0 0}.printblob-designer__section{border:0;margin:2rem 0 0;padding:0}.printblob-designer__section h2,.printblob-designer__section legend{align-items:baseline;display:flex;font-size:1rem;font-weight:620;gap:.5rem;letter-spacing:-.01em;margin:0 0 .75rem;padding:0}.printblob-designer__choice{color:var(--printblob-heather);font-weight:400}.printblob-designer__row,.printblob-designer__tools{align-items:end;display:flex;flex-wrap:wrap;gap:.6rem}.printblob-designer__workbench{border:1px solid var(--printblob-seam);border-radius:10px;margin-top:1rem}.printblob-designer__items,.printblob-designer__selection,.printblob-designer__tool{align-content:start;display:grid;gap:1rem;padding:1rem}.printblob-designer__items{gap:.6rem}.printblob-designer__items h3{color:var(--printblob-heather);font-size:.875rem;font-weight:560;margin:0}.printblob-designer__items ul{display:grid;gap:.4rem;list-style:none;margin:0;padding:0}.printblob-designer__item{align-items:center;background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);box-sizing:border-box;color:var(--printblob-ink);cursor:pointer;display:flex;font:inherit;gap:.6rem;min-height:2.75rem;padding:.4rem .75rem;text-align:start;width:100%}.printblob-designer__item:hover{outline:1px solid var(--printblob-ink);outline-offset:-1px}.printblob-designer__item img{flex:none;height:1.75rem;object-fit:contain;width:1.75rem}.printblob-designer__item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.printblob-designer__row--actions{gap:1rem}.printblob-button{background:var(--printblob-ink);border:1.5px solid var(--printblob-ink);border-radius:var(--printblob-radius);color:var(--printblob-on-ink);cursor:pointer;font:inherit;font-weight:560;padding:.75rem 1.2rem}.printblob-button:hover:not(:disabled){background:color-mix(in srgb,var(--printblob-ink) 82%,#000)}.printblob-button--quiet{background:transparent;color:var(--printblob-ink)}.printblob-button--quiet:hover:not(:disabled){background:var(--printblob-fill)}.printblob-button--primary{background:var(--printblob-cobalt);border-color:var(--printblob-cobalt);color:var(--printblob-on-cobalt);font-size:1.0625rem;padding:1rem 1.2rem;width:100%}.printblob-button--primary:hover:not(:disabled){background:var(--printblob-cobalt-deep);border-color:var(--printblob-cobalt-deep)}.printblob-button:disabled{cursor:not-allowed;opacity:.55}.printblob-link-button{background:none;border:0;color:var(--printblob-ink);cursor:pointer;font:inherit;font-size:.9375rem;padding:0;text-decoration:underline;text-underline-offset:.18em}.printblob-link-button--danger{color:#b42318}.printblob-field{border:0;color:var(--printblob-heather);display:grid;font-size:.875rem;gap:.35rem;margin:0;padding:0}.printblob-field input[type=number],.printblob-field select,.printblob-field textarea{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-field-radius);box-sizing:border-box;color:var(--printblob-ink);font:inherit;font-size:1rem;max-width:100%;min-width:0;padding:.6rem .75rem;width:100%}.printblob-field textarea{resize:vertical}.printblob-field legend{margin-bottom:.35rem}.printblob-field--qty{max-width:7rem}.printblob-toggle{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:700;padding:.6rem .9rem}.printblob-toggle[aria-pressed=true]{background:var(--printblob-ink);border-color:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-swatches{display:flex;flex-wrap:wrap;gap:.6rem}.printblob-swatch{background:var(--printblob-swatch);border:1px solid color-mix(in srgb,var(--printblob-ink) 22%,transparent);border-radius:50%;cursor:pointer;height:2.25rem;padding:0;position:relative;width:2.25rem}.printblob-swatch[aria-pressed=true]{outline:2px solid var(--printblob-ink);outline-offset:3px}.printblob-swatch--custom{background:conic-gradient(#d7263d,#f4c20d,#1f8a4c,#2645d6,#d7263d);overflow:hidden}.printblob-swatch--custom input{cursor:pointer;inset:0;opacity:0;position:absolute}.printblob-swatches--shirt .printblob-swatch{height:2.6rem;width:2.6rem}.printblob-sizes{display:flex;flex-wrap:wrap;gap:.5rem}.printblob-size{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:560;min-width:3.25rem;padding:.6rem .8rem}.printblob-size[aria-pressed=true]{border-color:var(--printblob-ink);box-shadow:inset 0 0 0 1px var(--printblob-ink)}.printblob-size:disabled{color:var(--printblob-heather);cursor:not-allowed;text-decoration:line-through}.printblob-breakdown{border-top:1px solid var(--printblob-seam);display:grid;gap:.4rem;margin:1.25rem 0;padding:1rem 0 0}.printblob-breakdown div{display:flex;justify-content:space-between}.printblob-breakdown dt{color:var(--printblob-heather)}.printblob-breakdown dd{justify-items:end;margin:0}.printblob-breakdown__none{color:var(--printblob-heather)}.printblob-breakdown__total{font-size:1.125rem;font-weight:620;margin-top:.4rem}.printblob-breakdown__total dt{color:var(--printblob-ink)}.printblob-note{color:var(--printblob-heather);font-size:.9375rem;margin:0}.printblob-note--warn{color:#8a5a00}.printblob-note--error{color:#b42318;margin-top:.75rem}.printblob-note--ok{color:var(--printblob-ink);margin-top:.75rem}:is(.wp-block-printblob-designer,.printblob-designer) :is(button,input,select,textarea,a):focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}
  • printblob/trunk/build/designer/view.asset.php

    r3751165 r3751408  
    66                'wp-i18n'
    77        ),
    8         'version' => '60ca96706854fdd0ab81'
     8        'version' => 'da6fbaf91134b31e3aec'
    99);
  • printblob/trunk/build/designer/view.css

    r3751165 r3751408  
    1 .printblob-designer,.wp-block-printblob-designer{--printblob-ink:var(--wp--preset--color--ink,#1a1d22);--printblob-heather:var(--wp--preset--color--heather,#5f6670);--printblob-seam:var(--wp--preset--color--seam,#e2e4e0);--printblob-cotton:var(--wp--preset--color--cotton,#f6f7f5);--printblob-cobalt:var(--wp--preset--color--cobalt,#2645d6);--printblob-cobalt-deep:var(--wp--preset--color--cobalt-deep,#1b33a6);--printblob-surface:var(--wp--preset--color--white,#fff);--printblob-on-ink:var(--wp--preset--color--white,#fff);--printblob-fill:color-mix(in srgb,var(--printblob-ink) 8%,var(--printblob-surface));--printblob-muted:color-mix(in srgb,var(--printblob-ink) 80%,var(--printblob-surface));--printblob-on-cobalt:#fff;--printblob-radius:var(--wp--custom--printblob--radius,6px);--printblob-field-radius:min(var(--printblob-radius),14px);color:var(--printblob-ink)}.printblob-designer__loading{color:var(--printblob-heather)}.printblob-stack{display:grid}.printblob-stack>*{grid-area:1/1;min-width:0}.printblob-stack>:not(.is-shown){visibility:hidden}.printblob-stack>.printblob-stack__fill{contain:size;overflow:auto;scrollbar-gutter:stable}.printblob-designer__layout{align-items:start;display:grid;gap:clamp(1.5rem,4vw,4rem);grid-template-columns:minmax(0,1.25fr) minmax(320px,.75fr)}@media(max-width:900px){.printblob-designer__layout{grid-template-columns:minmax(0,1fr)}}.printblob-designer__stage-column{position:sticky;top:1.5rem}@media(max-width:900px){.printblob-designer__stage-column{position:static}}.printblob-designer__views{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1rem}.printblob-designer__sides{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);display:inline-flex;gap:.25rem;padding:.25rem}.printblob-designer__side{align-items:center;background:transparent;border:0;border-radius:var(--printblob-radius);color:var(--printblob-muted);cursor:pointer;display:inline-flex;font:inherit;font-weight:560;gap:.45rem;letter-spacing:inherit;padding:.5rem 1.1rem}.printblob-designer__side.is-current,.printblob-designer__side[aria-selected=true]{background:var(--printblob-surface);box-shadow:0 1px 2px rgba(26,29,34,.08);color:var(--printblob-ink)}.printblob-designer__side--view{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);font-weight:640;letter-spacing:.02em;padding:.75rem 1.1rem}.printblob-designer__side--view[aria-pressed=true]{background:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-designer__side--view:disabled{cursor:default;opacity:.6}.printblob-designer__side-dot{background:var(--printblob-cobalt);border-radius:50%;height:7px;width:7px}.printblob-designer__side-dot:not(.is-shown){visibility:hidden}.printblob-designer__stage{align-items:center;background:var(--printblob-cotton);border-radius:10px;display:grid;overflow:hidden;position:relative}.printblob-designer__frame{position:relative}.printblob-designer__canvas,.printblob-designer__shirt{inset:0;position:absolute}.printblob-designer__shirt{display:block;height:100%;width:100%}.printblob-designer__area{border:2px dashed rgba(26,29,34,.35);border-radius:4px;pointer-events:none;position:absolute}.printblob-designer__area.is-on-dark{border-color:hsla(0,0%,100%,.55)}.printblob-designer__canvas .canvas-container,.printblob-designer__canvas canvas{height:100%!important;width:100%!important}.printblob-designer__stage-loading{align-items:center;background:var(--printblob-surface);border-radius:999px;color:var(--printblob-heather);display:flex;font-size:.875rem;gap:.5rem;left:50%;margin:0;padding:.45rem .85rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap}.printblob-designer__stage-loading:before{border:2px solid var(--printblob-seam);border-radius:50%;border-top-color:var(--printblob-cobalt);content:"";flex:none;height:.9rem;width:.9rem}@media(prefers-reduced-motion:no-preference){.printblob-designer__stage-loading:before{animation:printblob-turn .8s linear infinite}}@keyframes printblob-turn{to{transform:rotate(1turn)}}.printblob-designer__hint{color:var(--printblob-heather);font-size:.875rem;margin:.75rem 0 0}.printblob-designer__title{font-size:clamp(1.75rem,3vw,2.5rem);letter-spacing:-.03em;line-height:1.1;margin:0}.printblob-designer__price{font-size:1.375rem;font-weight:560;margin:.5rem 0 0}.printblob-designer__section{border:0;margin:2rem 0 0;padding:0}.printblob-designer__section h2,.printblob-designer__section legend{align-items:baseline;display:flex;font-size:1rem;font-weight:620;gap:.5rem;letter-spacing:-.01em;margin:0 0 .75rem;padding:0}.printblob-designer__choice{color:var(--printblob-heather);font-weight:400}.printblob-designer__row,.printblob-designer__tools{align-items:end;display:flex;flex-wrap:wrap;gap:.6rem}.printblob-designer__workbench{border:1px solid var(--printblob-seam);border-radius:10px;margin-top:1rem}.printblob-designer__items,.printblob-designer__selection,.printblob-designer__tool{align-content:start;display:grid;gap:1rem;padding:1rem}.printblob-designer__items{gap:.6rem}.printblob-designer__items h3{color:var(--printblob-heather);font-size:.875rem;font-weight:560;margin:0}.printblob-designer__items ul{display:grid;gap:.4rem;list-style:none;margin:0;padding:0}.printblob-designer__item{align-items:center;background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);box-sizing:border-box;color:var(--printblob-ink);cursor:pointer;display:flex;font:inherit;gap:.6rem;min-height:2.75rem;padding:.4rem .75rem;text-align:start;width:100%}.printblob-designer__item:hover{outline:1px solid var(--printblob-ink);outline-offset:-1px}.printblob-designer__item img{flex:none;height:1.75rem;object-fit:contain;width:1.75rem}.printblob-designer__item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.printblob-designer__row--actions{gap:1rem}.printblob-button{background:var(--printblob-ink);border:1.5px solid var(--printblob-ink);border-radius:var(--printblob-radius);color:var(--printblob-on-ink);cursor:pointer;font:inherit;font-weight:560;padding:.75rem 1.2rem}.printblob-button:hover:not(:disabled){background:color-mix(in srgb,var(--printblob-ink) 82%,#000)}.printblob-button--quiet{background:transparent;color:var(--printblob-ink)}.printblob-button--quiet:hover:not(:disabled){background:var(--printblob-fill)}.printblob-button--primary{background:var(--printblob-cobalt);border-color:var(--printblob-cobalt);color:var(--printblob-on-cobalt);font-size:1.0625rem;padding:1rem 1.2rem;width:100%}.printblob-button--primary:hover:not(:disabled){background:var(--printblob-cobalt-deep);border-color:var(--printblob-cobalt-deep)}.printblob-button:disabled{cursor:not-allowed;opacity:.55}.printblob-link-button{background:none;border:0;color:var(--printblob-ink);cursor:pointer;font:inherit;font-size:.9375rem;padding:0;text-decoration:underline;text-underline-offset:.18em}.printblob-link-button--danger{color:#b42318}.printblob-field{border:0;color:var(--printblob-heather);display:grid;font-size:.875rem;gap:.35rem;margin:0;padding:0}.printblob-field input[type=number],.printblob-field select,.printblob-field textarea{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-field-radius);box-sizing:border-box;color:var(--printblob-ink);font:inherit;font-size:1rem;max-width:100%;min-width:0;padding:.6rem .75rem;width:100%}.printblob-field textarea{resize:vertical}.printblob-field legend{margin-bottom:.35rem}.printblob-field--qty{max-width:7rem}.printblob-toggle{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:700;padding:.6rem .9rem}.printblob-toggle[aria-pressed=true]{background:var(--printblob-ink);border-color:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-swatches{display:flex;flex-wrap:wrap;gap:.6rem}.printblob-swatch{background:var(--printblob-swatch);border:1px solid color-mix(in srgb,var(--printblob-ink) 22%,transparent);border-radius:50%;cursor:pointer;height:2.25rem;padding:0;position:relative;width:2.25rem}.printblob-swatch[aria-pressed=true]{outline:2px solid var(--printblob-ink);outline-offset:3px}.printblob-swatch--custom{background:conic-gradient(#d7263d,#f4c20d,#1f8a4c,#2645d6,#d7263d);overflow:hidden}.printblob-swatch--custom input{cursor:pointer;inset:0;opacity:0;position:absolute}.printblob-swatches--shirt .printblob-swatch{height:2.6rem;width:2.6rem}.printblob-sizes{display:flex;flex-wrap:wrap;gap:.5rem}.printblob-size{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:560;min-width:3.25rem;padding:.6rem .8rem}.printblob-size[aria-pressed=true]{border-color:var(--printblob-ink);box-shadow:inset 0 0 0 1px var(--printblob-ink)}.printblob-size:disabled{color:var(--printblob-heather);cursor:not-allowed;text-decoration:line-through}.printblob-breakdown{border-top:1px solid var(--printblob-seam);display:grid;gap:.4rem;margin:1.25rem 0;padding:1rem 0 0}.printblob-breakdown div{display:flex;justify-content:space-between}.printblob-breakdown dt{color:var(--printblob-heather)}.printblob-breakdown dd{justify-items:end;margin:0}.printblob-breakdown__none{color:var(--printblob-heather)}.printblob-breakdown__total{font-size:1.125rem;font-weight:620;margin-top:.4rem}.printblob-breakdown__total dt{color:var(--printblob-ink)}.printblob-note{color:var(--printblob-heather);font-size:.9375rem;margin:0}.printblob-note--warn{color:#8a5a00}.printblob-note--error{color:#b42318;margin-top:.75rem}.printblob-note--ok{color:var(--printblob-ink);margin-top:.75rem}:is(.wp-block-printblob-designer,.printblob-designer) :is(button,input,select,textarea,a):focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}
     1.printblob-designer,.wp-block-printblob-designer{--printblob-ink:var(--wp--preset--color--ink,#1a1d22);--printblob-heather:var(--wp--preset--color--heather,#5f6670);--printblob-seam:var(--wp--preset--color--seam,#e2e4e0);--printblob-cotton:var(--wp--preset--color--cotton,#f6f7f5);--printblob-cobalt:var(--wp--preset--color--cobalt,#2645d6);--printblob-cobalt-deep:var(--wp--preset--color--cobalt-deep,#1b33a6);--printblob-surface:var(--wp--preset--color--white,#fff);--printblob-on-ink:var(--wp--preset--color--white,#fff);--printblob-fill:color-mix(in srgb,var(--printblob-ink) 8%,var(--printblob-surface));--printblob-muted:color-mix(in srgb,var(--printblob-ink) 80%,var(--printblob-surface));--printblob-on-cobalt:#fff;--printblob-radius:var(--wp--custom--printblob--radius,6px);--printblob-field-radius:min(var(--printblob-radius),14px);color:var(--printblob-ink)}.printblob-designer__loading{color:var(--printblob-heather)}.printblob-stack{display:grid}.printblob-stack>*{grid-area:1/1;min-width:0}.printblob-stack>:not(.is-shown){visibility:hidden}.printblob-stack>.printblob-stack__fill{contain:size;overflow:auto;scrollbar-gutter:stable}.printblob-designer__layout{align-items:start;display:grid;gap:clamp(1.5rem,4vw,4rem);grid-template-columns:minmax(0,1.25fr) minmax(320px,.75fr)}@media(max-width:900px){.printblob-designer__layout{grid-template-columns:minmax(0,1fr)}}.printblob-designer__stage-column{position:sticky;top:1.5rem}@media(max-width:900px){.printblob-designer__stage-column{position:static}}.printblob-designer__views{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1rem}.printblob-designer__sides{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);display:inline-flex;gap:.25rem;padding:.25rem}.printblob-designer__side{align-items:center;background:transparent;border:0;border-radius:var(--printblob-radius);color:var(--printblob-muted);cursor:pointer;display:inline-flex;font:inherit;font-weight:560;gap:.45rem;letter-spacing:inherit;padding:.5rem 1.1rem}.printblob-designer__side.is-current,.printblob-designer__side[aria-selected=true]{background:var(--printblob-surface);box-shadow:0 1px 2px rgba(26,29,34,.08);color:var(--printblob-ink)}.printblob-designer__side--view{background:var(--printblob-fill);border-radius:calc(var(--printblob-radius) + 4px);box-shadow:inset 0 0 0 1px var(--printblob-seam);font-weight:640;letter-spacing:.02em;padding:.75rem 1.1rem}.printblob-designer__side--view[aria-pressed=true]{background:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-designer__side--view:disabled{cursor:default;opacity:.6}.printblob-designer__pro-chip{align-items:center;border-radius:999px;box-shadow:inset 0 0 0 1px var(--printblob-seam);color:var(--printblob-cobalt);display:inline-flex;font-size:.875em;font-weight:640;letter-spacing:.02em;line-height:1.2;padding:.5rem .9rem;text-decoration:none}.printblob-designer__pro-chip:focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}.printblob-designer__side-dot{background:var(--printblob-cobalt);border-radius:50%;height:7px;width:7px}.printblob-designer__side-dot:not(.is-shown){visibility:hidden}.printblob-designer__stage{align-items:center;background:var(--printblob-cotton);border-radius:10px;display:grid;overflow:hidden;position:relative}.printblob-designer__frame{position:relative}.printblob-designer__canvas,.printblob-designer__shirt{inset:0;position:absolute}.printblob-designer__shirt{display:block;height:100%;width:100%}.printblob-designer__area{border:2px dashed rgba(26,29,34,.35);border-radius:4px;pointer-events:none;position:absolute}.printblob-designer__area.is-on-dark{border-color:hsla(0,0%,100%,.55)}.printblob-designer__canvas .canvas-container,.printblob-designer__canvas canvas{height:100%!important;width:100%!important}.printblob-designer__stage-loading{align-items:center;background:var(--printblob-surface);border-radius:999px;color:var(--printblob-heather);display:flex;font-size:.875rem;gap:.5rem;left:50%;margin:0;padding:.45rem .85rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap}.printblob-designer__stage-loading:before{border:2px solid var(--printblob-seam);border-radius:50%;border-top-color:var(--printblob-cobalt);content:"";flex:none;height:.9rem;width:.9rem}@media(prefers-reduced-motion:no-preference){.printblob-designer__stage-loading:before{animation:printblob-turn .8s linear infinite}}@keyframes printblob-turn{to{transform:rotate(1turn)}}.printblob-designer__hint{color:var(--printblob-heather);font-size:.875rem;margin:.75rem 0 0}.printblob-designer__title{font-size:clamp(1.75rem,3vw,2.5rem);letter-spacing:-.03em;line-height:1.1;margin:0}.printblob-designer__price{font-size:1.375rem;font-weight:560;margin:.5rem 0 0}.printblob-designer__section{border:0;margin:2rem 0 0;padding:0}.printblob-designer__section h2,.printblob-designer__section legend{align-items:baseline;display:flex;font-size:1rem;font-weight:620;gap:.5rem;letter-spacing:-.01em;margin:0 0 .75rem;padding:0}.printblob-designer__choice{color:var(--printblob-heather);font-weight:400}.printblob-designer__row,.printblob-designer__tools{align-items:end;display:flex;flex-wrap:wrap;gap:.6rem}.printblob-designer__workbench{border:1px solid var(--printblob-seam);border-radius:10px;margin-top:1rem}.printblob-designer__items,.printblob-designer__selection,.printblob-designer__tool{align-content:start;display:grid;gap:1rem;padding:1rem}.printblob-designer__items{gap:.6rem}.printblob-designer__items h3{color:var(--printblob-heather);font-size:.875rem;font-weight:560;margin:0}.printblob-designer__items ul{display:grid;gap:.4rem;list-style:none;margin:0;padding:0}.printblob-designer__item{align-items:center;background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);box-sizing:border-box;color:var(--printblob-ink);cursor:pointer;display:flex;font:inherit;gap:.6rem;min-height:2.75rem;padding:.4rem .75rem;text-align:start;width:100%}.printblob-designer__item:hover{outline:1px solid var(--printblob-ink);outline-offset:-1px}.printblob-designer__item img{flex:none;height:1.75rem;object-fit:contain;width:1.75rem}.printblob-designer__item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.printblob-designer__row--actions{gap:1rem}.printblob-button{background:var(--printblob-ink);border:1.5px solid var(--printblob-ink);border-radius:var(--printblob-radius);color:var(--printblob-on-ink);cursor:pointer;font:inherit;font-weight:560;padding:.75rem 1.2rem}.printblob-button:hover:not(:disabled){background:color-mix(in srgb,var(--printblob-ink) 82%,#000)}.printblob-button--quiet{background:transparent;color:var(--printblob-ink)}.printblob-button--quiet:hover:not(:disabled){background:var(--printblob-fill)}.printblob-button--primary{background:var(--printblob-cobalt);border-color:var(--printblob-cobalt);color:var(--printblob-on-cobalt);font-size:1.0625rem;padding:1rem 1.2rem;width:100%}.printblob-button--primary:hover:not(:disabled){background:var(--printblob-cobalt-deep);border-color:var(--printblob-cobalt-deep)}.printblob-button:disabled{cursor:not-allowed;opacity:.55}.printblob-link-button{background:none;border:0;color:var(--printblob-ink);cursor:pointer;font:inherit;font-size:.9375rem;padding:0;text-decoration:underline;text-underline-offset:.18em}.printblob-link-button--danger{color:#b42318}.printblob-field{border:0;color:var(--printblob-heather);display:grid;font-size:.875rem;gap:.35rem;margin:0;padding:0}.printblob-field input[type=number],.printblob-field select,.printblob-field textarea{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-field-radius);box-sizing:border-box;color:var(--printblob-ink);font:inherit;font-size:1rem;max-width:100%;min-width:0;padding:.6rem .75rem;width:100%}.printblob-field textarea{resize:vertical}.printblob-field legend{margin-bottom:.35rem}.printblob-field--qty{max-width:7rem}.printblob-toggle{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:700;padding:.6rem .9rem}.printblob-toggle[aria-pressed=true]{background:var(--printblob-ink);border-color:var(--printblob-ink);color:var(--printblob-on-ink)}.printblob-swatches{display:flex;flex-wrap:wrap;gap:.6rem}.printblob-swatch{background:var(--printblob-swatch);border:1px solid color-mix(in srgb,var(--printblob-ink) 22%,transparent);border-radius:50%;cursor:pointer;height:2.25rem;padding:0;position:relative;width:2.25rem}.printblob-swatch[aria-pressed=true]{outline:2px solid var(--printblob-ink);outline-offset:3px}.printblob-swatch--custom{background:conic-gradient(#d7263d,#f4c20d,#1f8a4c,#2645d6,#d7263d);overflow:hidden}.printblob-swatch--custom input{cursor:pointer;inset:0;opacity:0;position:absolute}.printblob-swatches--shirt .printblob-swatch{height:2.6rem;width:2.6rem}.printblob-sizes{display:flex;flex-wrap:wrap;gap:.5rem}.printblob-size{background:var(--printblob-surface);border:1px solid var(--printblob-seam);border-radius:var(--printblob-radius);color:var(--printblob-ink);cursor:pointer;font:inherit;font-weight:560;min-width:3.25rem;padding:.6rem .8rem}.printblob-size[aria-pressed=true]{border-color:var(--printblob-ink);box-shadow:inset 0 0 0 1px var(--printblob-ink)}.printblob-size:disabled{color:var(--printblob-heather);cursor:not-allowed;text-decoration:line-through}.printblob-breakdown{border-top:1px solid var(--printblob-seam);display:grid;gap:.4rem;margin:1.25rem 0;padding:1rem 0 0}.printblob-breakdown div{display:flex;justify-content:space-between}.printblob-breakdown dt{color:var(--printblob-heather)}.printblob-breakdown dd{justify-items:end;margin:0}.printblob-breakdown__none{color:var(--printblob-heather)}.printblob-breakdown__total{font-size:1.125rem;font-weight:620;margin-top:.4rem}.printblob-breakdown__total dt{color:var(--printblob-ink)}.printblob-note{color:var(--printblob-heather);font-size:.9375rem;margin:0}.printblob-note--warn{color:#8a5a00}.printblob-note--error{color:#b42318;margin-top:.75rem}.printblob-note--ok{color:var(--printblob-ink);margin-top:.75rem}:is(.wp-block-printblob-designer,.printblob-designer) :is(button,input,select,textarea,a):focus-visible{outline:2px solid var(--printblob-cobalt);outline-offset:2px}
  • printblob/trunk/build/designer/view.js

    r3751165 r3751408  
    22(0,e.__)("That image is over %d MB. Use a smaller file.","printblob"),Math.round(t/1048576)),n=()=>[(0,e.__)("Preparing your print file…","printblob"),(0,e.__)("Saving your design…","printblob"),(0,e.__)("Adding to cart…","printblob")],o=window.ReactJSXRuntime,a=(t,e="")=>[e,t?"is-shown":""].filter(Boolean).join(" ");function l({quantity:t,onQuantity:l,currency:h,shirtPrice:c,sides:u,printed:d,unitPrice:g,status:f,disabled:p,cartUrl:m,maxUploadBytes:y,onAddToCart:b}){const _="busy"===f.state?f.message:(0,e.__)("Add to cart","printblob"),v=(0,e.__)("View cart","printblob"),{added:x,...C}=r();return(0,o.jsxs)("div",{className:"printblob-designer__section printblob-designer__buy",children:[(0,o.jsxs)("label",{className:"printblob-field printblob-field--qty",children:[(0,o.jsx)("span",{children:(0,e.__)("Quantity","printblob")}),(0,o.jsx)("input",{type:"number",min:1,max:500,value:t,onChange:t=>l(Math.max(1,Math.min(500,parseInt(t.target.value,10)||1)))})]}),(0,o.jsxs)("dl",{className:"printblob-breakdown",children:[(0,o.jsxs)("div",{children:[(0,o.jsx)("dt",{children:(0,e.__)("Product","printblob")}),(0,o.jsx)("dd",{children:i(c,h)})]}),u.map(t=>(0,o.jsxs)("div",{children:[(0,o.jsx)("dt",{children:(0,e.sprintf)(/* translators: %s: printed side, e.g. Front. */ /* translators: %s: printed side, e.g. Front. */
    33(0,e.__)("%s print","printblob"),t.label)}),(0,o.jsxs)("dd",{className:"printblob-stack",children:[(0,o.jsx)("span",{className:a(Boolean(d[t.key])),children:i(t.price,h)}),(0,o.jsx)("span",{className:a(!d[t.key],"printblob-breakdown__none"),children:/* translators: in the price breakdown, beside a side (e.g. "Back print") that has no design. */ /* translators: in the price breakdown, beside a side (e.g. "Back print") that has no design. */
    4 (0,e.__)("Not printed","printblob")})]})]},t.key)),(0,o.jsxs)("div",{className:"printblob-breakdown__total",children:[(0,o.jsx)("dt",{children:(0,e.__)("Total","printblob")}),(0,o.jsx)("dd",{children:i(g*t,h)})]})]}),(0,o.jsx)("button",{type:"button",className:"printblob-button printblob-button--primary",onClick:b,disabled:p,children:(0,o.jsx)("span",{className:"printblob-stack",children:[(0,e.__)("Add to cart","printblob"),...n()].map(t=>(0,o.jsx)("span",{className:a(t===_),children:t},t))})}),(0,o.jsxs)("div",{className:"printblob-designer__messages printblob-stack",children:[(0,o.jsxs)("p",{className:"printblob-note printblob-note--ok","aria-hidden":"true",children:[x," ",v]}),[...Object.values(C),s(y)].map(t=>(0,o.jsx)("p",{className:"printblob-note printblob-note--error","aria-hidden":"true",children:t},t)),(0,o.jsxs)("div",{className:"printblob-stack__fill is-shown",children:[(0,o.jsx)("div",{className:"printblob-designer__status",role:"status","aria-live":"polite",children:"added"===f.state&&(0,o.jsxs)("p",{className:"printblob-note printblob-note--ok",children:[f.message," ",(0,o.jsx)("a",{href:m,children:v})]})}),"error"===f.state&&(0,o.jsx)("p",{className:"printblob-note printblob-note--error",role:"alert",children:f.message})]})]})]})}function h({names:t,chosen:e}){return(0,o.jsx)("span",{className:"printblob-designer__choice printblob-stack",children:t.map(t=>(0,o.jsx)("span",{className:t===e?"is-shown":void 0,children:t},t))})}function c({label:t,chosen:e,choices:i}){return(0,o.jsxs)("fieldset",{className:"printblob-designer__section",children:[(0,o.jsxs)("legend",{children:[t,void 0!==e&&(0,o.jsx)(h,{names:i.map(t=>t.name),chosen:e})]}),(0,o.jsx)("div",{className:"printblob-sizes",children:i.map(t=>(0,o.jsx)("button",{type:"button",className:"printblob-size","aria-pressed":t.pressed,onClick:t.onSelect,disabled:t.disabled,children:t.name},t.key))})]})}var u=Object.defineProperty,d=(t,e)=>{let i={};for(var r in t)u(i,r,{get:t[r],enumerable:!0});return e||u(i,Symbol.toStringTag,{value:"Module"}),i};function g(t){return g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},g(t)}function f(t){var e=function(t){if("object"!=g(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,"string");if("object"!=g(i))return i;throw TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==g(e)?e:e+""}function p(t,e,i){return(e=f(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}var m=class{constructor(){p(this,"browserShadowBlurConstant",1),p(this,"DPI",96),p(this,"devicePixelRatio",typeof window<"u"?window.devicePixelRatio:1),p(this,"perfLimitSizeTotal",2097152),p(this,"maxCacheSideLimit",4096),p(this,"minCacheSideLimit",256),p(this,"disableStyleCopyPaste",!1),p(this,"enableGLFiltering",!0),p(this,"textureSize",4096),p(this,"forceGLPutImageData",!1),p(this,"cachesBoundsOfCurve",!1),p(this,"fontPaths",{}),p(this,"NUM_FRACTION_DIGITS",4)}};const y=new class extends m{constructor(t){super(),this.configure(t)}configure(t={}){Object.assign(this,t)}addFonts(t={}){this.fontPaths={...this.fontPaths,...t}}removeFonts(t=[]){t.forEach(t=>{delete this.fontPaths[t]})}clearFonts(){this.fontPaths={}}restoreDefaults(t){let e=new m,i=(null==t?void 0:t.reduce((t,i)=>(t[i]=e[i],t),{}))||e;this.configure(i)}},b=(t,...e)=>console[t]("fabric",...e);var _=class extends Error{constructor(t,e){super(`fabric: ${t}`,e)}},v=class extends _{constructor(t){super(`${t} 'options.signal' is in 'aborted' state`)}},x=class{},C=class extends x{testPrecision(t,e){let i=`precision ${e} float;\nvoid main(){}`,r=t.createShader(t.FRAGMENT_SHADER);return!!r&&(t.shaderSource(r,i),t.compileShader(r),!!t.getShaderParameter(r,t.COMPILE_STATUS))}queryWebGL(t){let e=t.getContext("webgl");e&&(this.maxTextureSize=e.getParameter(e.MAX_TEXTURE_SIZE),this.GLPrecision=["highp","mediump","lowp"].find(t=>this.testPrecision(e,t)),e.getExtension("WEBGL_lose_context").loseContext(),b("log",`WebGL: max texture size ${this.maxTextureSize}`))}isSupported(t){return!!this.maxTextureSize&&this.maxTextureSize>=t}};const w={};let S;const T=()=>S||(S={document,window,isTouchSupported:"ontouchstart"in window||"ontouchstart"in document||window&&window.navigator&&window.navigator.maxTouchPoints>0,WebGLProbe:new C,dispose(){},copyPasteData:w}),O=()=>T().document,k=()=>T().window,D=()=>{var t;return Math.max(null==(t=y.devicePixelRatio)?k().devicePixelRatio:t,1)},M=new class{constructor(){p(this,"boundsOfCurveCache",{}),this.charWidthsCache=new Map}getFontCache({fontFamily:t,fontStyle:e,fontWeight:i}){t=t.toLowerCase();let r=this.charWidthsCache;r.has(t)||r.set(t,new Map);let s=r.get(t),n=`${e.toLowerCase()}_${(i+"").toLowerCase()}`;return s.has(n)||s.set(n,new Map),s.get(n)}clearFontCache(t){t?this.charWidthsCache.delete((t||"").toLowerCase()):this.charWidthsCache=new Map}limitDimsByArea(t){let{perfLimitSizeTotal:e}=y,i=Math.sqrt(e*t);return[Math.floor(i),Math.floor(e/i)]}},j="7.4.0";function E(){}const P=Math.PI/2,A=Math.PI/4,F=2*Math.PI,L=Math.PI/180,I=Object.freeze([1,0,0,1,0,0]),R="center",B="left",$="bottom",X="right",Y="none",W=/\r?\n/,N="moving",V="scaling",z="rotating",H="rotate",G="skewing",U="resizing",q="modifyPoly",K="changed",J="scale",Q="scaleX",Z="scaleY",tt="skewX",et="skewY",it="fill",rt="stroke",st="modified",nt="normal",ot="json",at=new class{constructor(){this[ot]=new Map,this.svg=new Map}has(t){return this[ot].has(t)}getClass(t){let e=this[ot].get(t);if(!e)throw new _(`No class registered for ${t}`);return e}setClass(t,e){e?this[ot].set(e,t):(this[ot].set(t.type,t),this[ot].set(t.type.toLowerCase(),t))}getSVGClass(t){return this.svg.get(t)}setSVGClass(t,e){this.svg.set(e??t.type.toLowerCase(),t)}},lt=new class extends Array{remove(t){let e=this.indexOf(t);e>-1&&this.splice(e,1)}cancelAll(){let t=this.splice(0);return t.forEach(t=>t.abort()),t}cancelByCanvas(t){if(!t)return[];let e=this.filter(e=>{var i;return e.target===t||"object"==typeof e.target&&(null==(i=e.target)?void 0:i.canvas)===t});return e.forEach(t=>t.abort()),e}cancelByTarget(t){if(!t)return[];let e=this.filter(e=>e.target===t);return e.forEach(t=>t.abort()),e}};var ht=class{constructor(){p(this,"__eventListeners",{})}on(t,e){if(this.__eventListeners||(this.__eventListeners={}),"object"==typeof t)return Object.entries(t).forEach(([t,e])=>{this.on(t,e)}),()=>this.off(t);if(e){let i=t;return this.__eventListeners[i]||(this.__eventListeners[i]=[]),this.__eventListeners[i].push(e),()=>this.off(i,e)}return()=>!1}once(t,e){if("object"==typeof t){let e=[];return Object.entries(t).forEach(([t,i])=>{e.push(this.once(t,i))}),()=>e.forEach(t=>t())}if(e){let i=this.on(t,function(...t){e.call(this,...t),i()});return i}return()=>!1}_removeEventListener(t,e){if(this.__eventListeners[t])if(e){let i=this.__eventListeners[t],r=i.indexOf(e);r>-1&&i.splice(r,1)}else this.__eventListeners[t]=[]}off(t,e){if(this.__eventListeners)if(void 0===t)for(let t in this.__eventListeners)this._removeEventListener(t);else"object"==typeof t?Object.entries(t).forEach(([t,e])=>{this._removeEventListener(t,e)}):this._removeEventListener(t,e)}fire(t,e){var i;if(!this.__eventListeners)return;let r=null==(i=this.__eventListeners[t])?void 0:i.concat();if(r)for(let t=0;t<r.length;t++)r[t].call(this,e||{})}};const ct=(t,e)=>{let i=t.indexOf(e);return-1!==i&&t.splice(i,1),t},ut=t=>{if(0===t)return 1;switch(Math.abs(t)/P){case 1:case 3:return 0;case 2:return-1}return Math.cos(t)},dt=t=>{if(0===t)return 0;let e=t/P,i=Math.sign(t);switch(e){case 1:return i;case 2:return 0;case 3:return-i}return Math.sin(t)};var gt=class t{constructor(t=0,e=0){"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e)}add(e){return new t(this.x+e.x,this.y+e.y)}addEquals(t){return this.x+=t.x,this.y+=t.y,this}scalarAdd(e){return new t(this.x+e,this.y+e)}scalarAddEquals(t){return this.x+=t,this.y+=t,this}subtract(e){return new t(this.x-e.x,this.y-e.y)}subtractEquals(t){return this.x-=t.x,this.y-=t.y,this}scalarSubtract(e){return new t(this.x-e,this.y-e)}scalarSubtractEquals(t){return this.x-=t,this.y-=t,this}multiply(e){return new t(this.x*e.x,this.y*e.y)}scalarMultiply(e){return new t(this.x*e,this.y*e)}scalarMultiplyEquals(t){return this.x*=t,this.y*=t,this}divide(e){return new t(this.x/e.x,this.y/e.y)}scalarDivide(e){return new t(this.x/e,this.y/e)}scalarDivideEquals(t){return this.x/=t,this.y/=t,this}eq(t){return this.x===t.x&&this.y===t.y}lt(t){return this.x<t.x&&this.y<t.y}lte(t){return this.x<=t.x&&this.y<=t.y}gt(t){return this.x>t.x&&this.y>t.y}gte(t){return this.x>=t.x&&this.y>=t.y}lerp(e,i=.5){return i=Math.max(Math.min(1,i),0),new t(this.x+(e.x-this.x)*i,this.y+(e.y-this.y)*i)}distanceFrom(t){let e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)}midPointFrom(t){return this.lerp(t)}min(e){return new t(Math.min(this.x,e.x),Math.min(this.y,e.y))}max(e){return new t(Math.max(this.x,e.x),Math.max(this.y,e.y))}toString(){return`${this.x},${this.y}`}setXY(t,e){return this.x=t,this.y=e,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setFromPoint(t){return this.x=t.x,this.y=t.y,this}swap(t){let e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i}clone(){return new t(this.x,this.y)}rotate(e,i=ft){let r=dt(e),s=ut(e),n=this.subtract(i);return new t(n.x*s-n.y*r,n.x*r+n.y*s).add(i)}transform(e,i=!1){return new t(e[0]*this.x+e[2]*this.y+(i?0:e[4]),e[1]*this.x+e[3]*this.y+(i?0:e[5]))}};const ft=new gt(0,0),pt=t=>!!t&&Array.isArray(t._objects);function mt(t){class e extends t{constructor(...t){super(...t),p(this,"_objects",[])}_onObjectAdded(t){}_onObjectRemoved(t){}_onStackOrderChanged(t){}add(...t){let e=this._objects.push(...t);return t.forEach(t=>this._onObjectAdded(t)),e}insertAt(t,...e){return this._objects.splice(t,0,...e),e.forEach(t=>this._onObjectAdded(t)),this._objects.length}remove(...t){let e=this._objects,i=[];return t.forEach(t=>{let r=e.indexOf(t);-1!==r&&(e.splice(r,1),i.push(t),this._onObjectRemoved(t))}),i}forEachObject(t){this.getObjects().forEach((e,i,r)=>t(e,i,r))}getObjects(...t){return 0===t.length?[...this._objects]:this._objects.filter(e=>e.isType(...t))}item(t){return this._objects[t]}isEmpty(){return 0===this._objects.length}size(){return this._objects.length}contains(t,i){return!!this._objects.includes(t)||!!i&&this._objects.some(i=>i instanceof e&&i.contains(t,!0))}complexity(){return this._objects.reduce((t,e)=>t+(e.complexity?e.complexity():0),0)}sendObjectToBack(t){return!(!t||t===this._objects[0]||(ct(this._objects,t),this._objects.unshift(t),this._onStackOrderChanged(t),0))}bringObjectToFront(t){return!(!t||t===this._objects[this._objects.length-1]||(ct(this._objects,t),this._objects.push(t),this._onStackOrderChanged(t),0))}sendObjectBackwards(t,e){if(!t)return!1;let i=this._objects.indexOf(t);if(0!==i){let r=this.findNewLowerIndex(t,i,e);return ct(this._objects,t),this._objects.splice(r,0,t),this._onStackOrderChanged(t),!0}return!1}bringObjectForward(t,e){if(!t)return!1;let i=this._objects.indexOf(t);if(i!==this._objects.length-1){let r=this.findNewUpperIndex(t,i,e);return ct(this._objects,t),this._objects.splice(r,0,t),this._onStackOrderChanged(t),!0}return!1}moveObjectTo(t,e){return t!==this._objects[e]&&(ct(this._objects,t),this._objects.splice(e,0,t),this._onStackOrderChanged(t),!0)}findNewLowerIndex(t,e,i){let r;if(i){r=e;for(let i=e-1;i>=0;--i)if(t.isOverlapping(this._objects[i])){r=i;break}}else r=e-1;return r}findNewUpperIndex(t,e,i){let r;if(i){r=e;for(let i=e+1;i<this._objects.length;++i)if(t.isOverlapping(this._objects[i])){r=i;break}}else r=e+1;return r}collectObjects({left:t,top:e,width:i,height:r},{includeIntersecting:s=!0}={}){let n=[],o=new gt(t,e),a=o.add(new gt(i,r));for(let t=this._objects.length-1;t>=0;t--){let e=this._objects[t];e.selectable&&e.visible&&(s&&e.intersectsWithRect(o,a)||e.isContainedWithinRect(o,a)||s&&e.containsPoint(o)||s&&e.containsPoint(a))&&n.push(e)}return n}}return e}var yt=class extends ht{_setOptions(t={}){for(let e in t)this.set(e,t[e])}_setObject(t){for(let e in t)this._set(e,t[e])}set(t,e){return"object"==typeof t?this._setObject(t):this._set(t,e),this}_set(t,e){this[t]=e}toggle(t){let e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this}get(t){return this[t]}};function bt(t){return k().requestAnimationFrame(t)}function _t(t){return k().cancelAnimationFrame(t)}let vt=0;const xt=()=>vt++,Ct=()=>{let t=O().createElement("canvas");if(!t||void 0===t.getContext)throw new _("Failed to create `canvas` element");return t},wt=()=>O().createElement("img"),St=t=>{var e;let i=Tt(t);return null==(e=i.getContext("2d"))||e.drawImage(t,0,0),i},Tt=t=>{let e=Ct();return e.width=t.width,e.height=t.height,e},Ot=(t,e,i)=>t.toDataURL(`image/${e}`,i),kt=(t,e,i)=>new Promise((r,s)=>{t.toBlob(r,`image/${e}`,i)}),Dt=t=>t*L,Mt=t=>t/L,jt=t=>t.every((t,e)=>t===I[e]),Et=(t,e,i)=>new gt(t).transform(e,i),Pt=t=>{let e=1/(t[0]*t[3]-t[1]*t[2]),i=[e*t[3],-e*t[1],-e*t[2],e*t[0],0,0],{x:r,y:s}=new gt(t[4],t[5]).transform(i,!0);return i[4]=-r,i[5]=-s,i},At=(t,e,i)=>[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],i?0:t[0]*e[4]+t[2]*e[5]+t[4],i?0:t[1]*e[4]+t[3]*e[5]+t[5]],Ft=(t,e)=>t.reduceRight((t,i)=>i&&t?At(i,t,e):i||t,void 0)||I.concat(),Lt=([t,e])=>Math.atan2(e,t),It=([t,e])=>Math.sqrt(t*t+e*e),Rt=([,,t,e])=>Math.sqrt(t*t+e*e),Bt=t=>{let e=Lt(t),i=t[0]**2+t[1]**2,r=Math.sqrt(i),s=(t[0]*t[3]-t[2]*t[1])/r,n=Math.atan2(t[0]*t[2]+t[1]*t[3],i);return{angle:Mt(e),scaleX:r,scaleY:s,skewX:Mt(n),skewY:0,translateX:t[4]||0,translateY:t[5]||0}},$t=(t,e=0)=>[1,0,0,1,t,e];function Xt({angle:t=0}={},{x:e=0,y:i=0}={}){let r=Dt(t),s=ut(r),n=dt(r);return[s,n,-n,s,e?e-(s*e-n*i):0,i?i-(n*e+s*i):0]}const Yt=(t,e=t)=>[t,0,0,e,0,0],Wt=t=>Math.tan(Dt(t)),Nt=t=>[1,0,Wt(t),1,0,0],Vt=t=>[1,Wt(t),0,1,0,0],zt=({scaleX:t=1,scaleY:e=1,flipX:i=!1,flipY:r=!1,skewX:s=0,skewY:n=0})=>{let o=Yt(i?-t:t,r?-e:e);return s&&(o=At(o,Nt(s),!0)),n&&(o=At(o,Vt(n),!0)),o},Ht=t=>{let{translateX:e=0,translateY:i=0,angle:r=0}=t,s=$t(e,i);r&&(s=At(s,Xt({angle:r})));let n=zt(t);return jt(n)||(s=At(s,n)),s},Gt=(t,{signal:e,crossOrigin:i=null}={})=>new Promise(function(r,s){if(e&&e.aborted)return s(new v("loadImage"));let n,o=wt();e&&(n=function(t){o.src="",s(t)},e.addEventListener("abort",n,{once:!0}));let a=function(){o.onload=o.onerror=null,n&&(null==e||e.removeEventListener("abort",n)),r(o)};t?(o.onload=a,o.onerror=function(){n&&(null==e||e.removeEventListener("abort",n)),s(new _(`Error loading ${o.src}`))},i&&(o.crossOrigin=i),o.src=t):a()}),Ut=(t,{signal:e,reviver:i=E}={})=>new Promise((r,s)=>{let n=[];e&&e.addEventListener("abort",s,{once:!0}),Promise.allSettled(t.map(t=>at.getClass(t.type).fromObject(t,{signal:e}))).then(async e=>{for(let[r,s]of e.entries())if("fulfilled"===s.status&&(await i(t[r],s.value),n.push(s.value)),"rejected"===s.status){let e=await i(t[r],void 0,s.reason);e&&n.push(e)}r(n)}).catch(t=>{n.forEach(t=>{t.dispose&&t.dispose()}),s(t)}).finally(()=>{e&&e.removeEventListener("abort",s)})}),qt=(t,{signal:e}={})=>new Promise((i,r)=>{let s=[];e&&e.addEventListener("abort",r,{once:!0});let n=Object.values(t).map(t=>t&&t.type&&at.has(t.type)?Ut([t],{signal:e}).then(([t])=>(s.push(t),t)):t),o=Object.keys(t);Promise.all(n).then(t=>t.reduce((t,e,i)=>(t[o[i]]=e,t),{})).then(i).catch(t=>{s.forEach(t=>{t.dispose&&t.dispose()}),r(t)}).finally(()=>{e&&e.removeEventListener("abort",r)})}),Kt=(t,e=[])=>e.reduce((e,i)=>(i in t&&(e[i]=t[i]),e),{}),Jt=(t,e)=>Object.keys(t).reduce((i,r)=>(e(t[r],r,t)&&(i[r]=t[r]),i),{}),Qt=(t,e)=>parseFloat(Number(t).toFixed(e)),Zt=t=>"matrix("+t.map(t=>Qt(t,y.NUM_FRACTION_DIGITS)).join(" ")+")",te=t=>!!t&&void 0!==t.toLive,ee=t=>!!t&&"function"==typeof t.toObject,ie=t=>!!t&&void 0!==t.offsetX&&"source"in t,re=t=>!!t&&"multiSelectionStacking"in t;function se(t){let e=t&&ne(t),i=0,r=0;if(!t||!e)return{left:i,top:r};let s=t,n=e.documentElement,o=e.body||{scrollLeft:0,scrollTop:0};for(;s&&(s.parentNode||s.host)&&(s=s.parentNode||s.host,s===e?(i=o.scrollLeft||n.scrollLeft||0,r=o.scrollTop||n.scrollTop||0):(i+=s.scrollLeft||0,r+=s.scrollTop||0),1!==s.nodeType||"fixed"!==s.style.position););return{left:i,top:r}}const ne=t=>t.ownerDocument||null,oe=t=>{var e;return(null==(e=t.ownerDocument)?void 0:e.defaultView)||null},ae=(t,e,{width:i,height:r},s=1)=>{t.width=i,t.height=r,s>1&&(t.setAttribute("width",(i*s).toString()),t.setAttribute("height",(r*s).toString()),e.scale(s,s))},le=(t,{width:e,height:i})=>{e&&(t.style.width="number"==typeof e?`${e}px`:e),i&&(t.style.height="number"==typeof i?`${i}px`:i)};function he(t){return void 0!==t.onselectstart&&(t.onselectstart=()=>!1),t.style.userSelect=Y,t}var ce=class{constructor(t){p(this,"_originalCanvasStyle",void 0),p(this,"lower",void 0);let e=this.createLowerCanvas(t);this.lower={el:e,ctx:e.getContext("2d")}}createLowerCanvas(t){let e=(i=t)&&void 0!==i.getContext?t:t&&O().getElementById(t)||Ct();var i;if(e.hasAttribute("data-fabric"))throw new _("Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?");return this._originalCanvasStyle=e.style.cssText,e.setAttribute("data-fabric","main"),e.classList.add("lower-canvas"),e}cleanupDOM({width:t,height:e}){let{el:i}=this.lower;i.classList.remove("lower-canvas"),i.removeAttribute("data-fabric"),i.setAttribute("width",`${t}`),i.setAttribute("height",`${e}`),i.style.cssText=this._originalCanvasStyle||"",this._originalCanvasStyle=void 0}setDimensions(t,e){let{el:i,ctx:r}=this.lower;ae(i,r,t,e)}setCSSDimensions(t){le(this.lower.el,t)}calcOffset(){return function(t){var e;let i=t&&ne(t),r={left:0,top:0};if(!i)return r;let s=(null==(e=oe(t))?void 0:e.getComputedStyle(t,null))||{};r.left+=parseInt(s.borderLeftWidth,10)||0,r.top+=parseInt(s.borderTopWidth,10)||0,r.left+=parseInt(s.paddingLeft,10)||0,r.top+=parseInt(s.paddingTop,10)||0;let n={left:0,top:0},o=i.documentElement;void 0!==t.getBoundingClientRect&&(n=t.getBoundingClientRect());let a=se(t);return{left:n.left+a.left-(o.clientLeft||0)+r.left,top:n.top+a.top-(o.clientTop||0)+r.top}}(this.lower.el)}dispose(){T().dispose(this.lower.el),delete this.lower}};const ue={backgroundVpt:!0,backgroundColor:"",overlayVpt:!0,overlayColor:"",includeDefaultValues:!0,svgViewportTransformation:!0,renderOnAddRemove:!0,skipOffscreen:!0,enableRetinaScaling:!0,imageSmoothingEnabled:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,viewportTransform:[...I],patternQuality:"best"};var de=d({capitalize:()=>ge,escapeXml:()=>fe,graphemeSplit:()=>me});const ge=(t,e=!1)=>`${t.charAt(0).toUpperCase()}${e?t.slice(1):t.slice(1).toLowerCase()}`,fe=t=>t.toString().replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;");let pe;const me=t=>{if(pe||pe||(pe="Intl"in k()&&"Segmenter"in Intl&&new Intl.Segmenter(void 0,{granularity:"grapheme"})),pe){let e=pe.segment(t);return Array.from(e).map(({segment:t})=>t)}return ye(t)},ye=t=>{let e=[];for(let i,r=0;r<t.length;r++)!1!==(i=be(t,r))&&e.push(i);return e},be=(t,e)=>{let i=t.charCodeAt(e);if(isNaN(i))return"";if(i<55296||i>57343)return t.charAt(e);if(55296<=i&&i<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";let i=t.charCodeAt(e+1);if(56320>i||i>57343)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";let r=t.charCodeAt(e-1);if(55296>r||r>56319)throw"Low surrogate without preceding high surrogate";return!1};var _e=class t extends(mt(yt)){get lowerCanvasEl(){var t;return null==(t=this.elements.lower)?void 0:t.el}get contextContainer(){var t;return null==(t=this.elements.lower)?void 0:t.ctx}static getDefaults(){return t.ownDefaults}constructor(t,e={}){super(),Object.assign(this,this.constructor.getDefaults()),this.set(e),this.initElements(t),this._setDimensionsImpl({width:this.width||this.elements.lower.el.width||0,height:this.height||this.elements.lower.el.height||0}),this.skipControlsDrawing=!1,this.viewportTransform=[...this.viewportTransform],this.calcViewportBoundaries()}initElements(t){this.elements=new ce(t)}add(...t){let e=super.add(...t);return t.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),e}insertAt(t,...e){let i=super.insertAt(t,...e);return e.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),i}remove(...t){let e=super.remove(...t);return e.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),e}_onObjectAdded(t){t.canvas&&t.canvas!==this&&(b("warn","Canvas is trying to add an object that belongs to a different canvas.\nResulting to default behavior: removing object from previous canvas and adding to new canvas"),t.canvas.remove(t)),t._set("canvas",this),t.setCoords(),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t){t._set("canvas",void 0),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onStackOrderChanged(){this.renderOnAddRemove&&this.requestRenderAll()}getRetinaScaling(){return this.enableRetinaScaling?D():1}calcOffset(){return this._offset=this.elements.calcOffset()}getWidth(){return this.width}getHeight(){return this.height}_setDimensionsImpl(t,{cssOnly:e=!1,backstoreOnly:i=!1}={}){if(!e){let e={width:this.width,height:this.height,...t};this.elements.setDimensions(e,this.getRetinaScaling()),this.hasLostContext=!0,this.width=e.width,this.height=e.height}i||this.elements.setCSSDimensions(t),this.calcOffset()}setDimensions(t,e){this._setDimensionsImpl(t,e),e&&e.cssOnly||this.requestRenderAll()}getZoom(){return It(this.viewportTransform)}setViewportTransform(t){this.viewportTransform=t,this.calcViewportBoundaries(),this.renderOnAddRemove&&this.requestRenderAll()}zoomToPoint(t,e){let i=t,r=[...this.viewportTransform],s=Et(t,Pt(r));r[0]=e,r[3]=e;let n=Et(s,r);r[4]+=i.x-n.x,r[5]+=i.y-n.y,this.setViewportTransform(r)}setZoom(t){this.zoomToPoint(new gt(0,0),t)}absolutePan(t){let e=[...this.viewportTransform];return e[4]=-t.x,e[5]=-t.y,this.setViewportTransform(e)}relativePan(t){return this.absolutePan(new gt(-t.x-this.viewportTransform[4],-t.y-this.viewportTransform[5]))}getElement(){return this.elements.lower.el}clearContext(t){t.clearRect(0,0,this.width,this.height)}getContext(){return this.elements.lower.ctx}clear(){this.remove(...this.getObjects()),this.backgroundImage=void 0,this.overlayImage=void 0,this.backgroundColor="",this.overlayColor="",this.clearContext(this.getContext()),this.fire("canvas:cleared"),this.renderOnAddRemove&&this.requestRenderAll()}renderAll(){this.cancelRequestedRender(),this.destroyed||this.renderCanvas(this.getContext(),this._objects)}renderAndReset(){this.nextRenderHandle=0,this.renderAll()}requestRenderAll(){this.nextRenderHandle||this.disposed||this.destroyed||(this.nextRenderHandle=bt(()=>this.renderAndReset()))}calcViewportBoundaries(){let t=this.width,e=this.height,i=Pt(this.viewportTransform),r=Et({x:0,y:0},i),s=Et({x:t,y:e},i),n=r.min(s),o=r.max(s);return this.vptCoords={tl:n,tr:new gt(o.x,n.y),bl:new gt(n.x,o.y),br:o}}cancelRequestedRender(){this.nextRenderHandle&&(_t(this.nextRenderHandle),this.nextRenderHandle=0)}drawControls(t){}renderCanvas(t,e){if(this.destroyed)return;let i=this.viewportTransform,r=this.clipPath;this.calcViewportBoundaries(),this.clearContext(t),t.imageSmoothingEnabled=this.imageSmoothingEnabled,t.patternQuality=this.patternQuality,this.fire("before:render",{ctx:t}),this._renderBackground(t),t.save(),t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this._renderObjects(t,e),t.restore(),this.controlsAboveOverlay||this.skipControlsDrawing||this.drawControls(t),r&&(r._set("canvas",this),r.shouldCache(),r._transformDone=!0,r.renderCache({forClipping:!0}),this.drawClipPathOnCanvas(t,r)),this._renderOverlay(t),this.controlsAboveOverlay&&!this.skipControlsDrawing&&this.drawControls(t),this.fire("after:render",{ctx:t}),this.__cleanupTask&&(this.__cleanupTask(),this.__cleanupTask=void 0)}drawClipPathOnCanvas(t,e){let i=this.viewportTransform;t.save(),t.transform(...i),t.globalCompositeOperation="destination-in",e.transform(t),t.scale(1/e.zoomX,1/e.zoomY),t.drawImage(e._cacheCanvas,-e.cacheTranslationX,-e.cacheTranslationY),t.restore()}_renderObjects(t,e){for(let i=0,r=e.length;i<r;++i)e[i]&&e[i].render(t)}_renderBackgroundOrOverlay(t,e){let i=this[`${e}Color`],r=this[`${e}Image`],s=this.viewportTransform,n=this[`${e}Vpt`];if(!i&&!r)return;let o=te(i);if(i){if(t.save(),t.beginPath(),t.moveTo(0,0),t.lineTo(this.width,0),t.lineTo(this.width,this.height),t.lineTo(0,this.height),t.closePath(),t.fillStyle=o?i.toLive(t):i,n&&t.transform(...s),o){t.transform(1,0,0,1,i.offsetX||0,i.offsetY||0);let e=i.gradientTransform||i.patternTransform;e&&t.transform(...e)}t.fill(),t.restore()}if(r){t.save();let{skipOffscreen:e}=this;this.skipOffscreen=n,n&&t.transform(...s),r.render(t),this.skipOffscreen=e,t.restore()}}_renderBackground(t){this._renderBackgroundOrOverlay(t,"background")}_renderOverlay(t){this._renderBackgroundOrOverlay(t,"overlay")}getCenterPoint(){return new gt(this.width/2,this.height/2)}centerObjectH(t){return this._centerObject(t,new gt(this.getCenterPoint().x,t.getCenterPoint().y))}centerObjectV(t){return this._centerObject(t,new gt(t.getCenterPoint().x,this.getCenterPoint().y))}centerObject(t){return this._centerObject(t,this.getCenterPoint())}viewportCenterObject(t){return this._centerObject(t,this.getVpCenter())}viewportCenterObjectH(t){return this._centerObject(t,new gt(this.getVpCenter().x,t.getCenterPoint().y))}viewportCenterObjectV(t){return this._centerObject(t,new gt(t.getCenterPoint().x,this.getVpCenter().y))}getVpCenter(){return Et(this.getCenterPoint(),Pt(this.viewportTransform))}_centerObject(t,e){t.setXY(e,R,R),t.setCoords(),this.renderOnAddRemove&&this.requestRenderAll()}toDatalessJSON(t){return this.toDatalessObject(t)}toObject(t){return this._toObjectMethod("toObject",t)}toJSON(){return this.toObject()}toDatalessObject(t){return this._toObjectMethod("toDatalessObject",t)}_toObjectMethod(t,e){let i=this.clipPath,r=i&&!i.excludeFromExport?this._toObject(i,t,e):null;return{version:j,...Kt(this,e),objects:this._objects.filter(t=>!t.excludeFromExport).map(i=>this._toObject(i,t,e)),...this.__serializeBgOverlay(t,e),...r?{clipPath:r}:null}}_toObject(t,e,i){let r;this.includeDefaultValues||(r=t.includeDefaultValues,t.includeDefaultValues=!1);let s=t[e](i);return this.includeDefaultValues||(t.includeDefaultValues=!!r),s}__serializeBgOverlay(t,e){let i={},r=this.backgroundImage,s=this.overlayImage,n=this.backgroundColor,o=this.overlayColor;return te(n)?n.excludeFromExport||(i.background=n.toObject(e)):n&&(i.background=n),te(o)?o.excludeFromExport||(i.overlay=o.toObject(e)):o&&(i.overlay=o),r&&!r.excludeFromExport&&(i.backgroundImage=this._toObject(r,t,e)),s&&!s.excludeFromExport&&(i.overlayImage=this._toObject(s,t,e)),i}toSVG(t={},e){t.reviver=e;let i=[];var r;return this._setSVGPreamble(i,t),this._setSVGHeader(i,t),this.clipPath&&i.push(`<g clip-path="url(#${fe(null==(r=this.clipPath.clipPathId)?"":r)})" >\n`),this._setSVGBgOverlayColor(i,"background"),this._setSVGBgOverlayImage(i,"backgroundImage",e),this._setSVGObjects(i,e),this.clipPath&&i.push("</g>\n"),this._setSVGBgOverlayColor(i,"overlay"),this._setSVGBgOverlayImage(i,"overlayImage",e),i.push("</svg>"),i.join("")}_setSVGPreamble(t,e){e.suppressPreamble||t.push('<?xml version="1.0" encoding="',e.encoding||"UTF-8",'" standalone="no" ?>\n','<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" ','"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n')}_setSVGHeader(t,e){let i,r=e.width||`${this.width}`,s=e.height||`${this.height}`,n=y.NUM_FRACTION_DIGITS,o=e.viewBox;if(o)i=`viewBox="${o.x} ${o.y} ${o.width} ${o.height}" `;else if(this.svgViewportTransformation){let t=this.viewportTransform;i=`viewBox="${Qt(-t[4]/t[0],n)} ${Qt(-t[5]/t[3],n)} ${Qt(this.width/t[0],n)} ${Qt(this.height/t[3],n)}" `}else i=`viewBox="0 0 ${this.width} ${this.height}" `;t.push("<svg ",'xmlns="http://www.w3.org/2000/svg" ','xmlns:xlink="http://www.w3.org/1999/xlink" ','version="1.1" ','width="',r,'" ','height="',s,'" ',i,'xml:space="preserve">\n',"<desc>Created with Fabric.js ",j,"</desc>\n","<defs>\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"</defs>\n")}createSVGClipPathMarkup(t){let e=this.clipPath;return e?(e.clipPathId=`CLIPPATH_${xt()}`,`<clipPath id="${e.clipPathId}" >\n${e.toClipPathSVG(t.reviver)}</clipPath>\n`):""}createSVGRefElementsMarkup(){return["background","overlay"].map(t=>{let e=this[`${t}Color`];if(te(e)){let i=this[`${t}Vpt`],r=this.viewportTransform,s={isType:()=>!1,width:this.width/(i?r[0]:1),height:this.height/(i?r[3]:1)};return e.toSVG(s,{additionalTransform:i?Zt(r):""})}}).join("")}createSVGFontFacesMarkup(){let t=[],e={},i=y.fontPaths;this._objects.forEach(function e(i){t.push(i),pt(i)&&i._objects.forEach(e)}),t.forEach(t=>{if(!(r=t)||"function"!=typeof r._renderText)return;var r;let{styles:s,fontFamily:n}=t;!e[n]&&i[n]&&(e[n]=!0,s&&Object.values(s).forEach(t=>{Object.values(t).forEach(({fontFamily:t=""})=>{!e[t]&&i[t]&&(e[t]=!0)})}))});let r=Object.keys(e).map(t=>`\t\t@font-face {\n\t\t\tfont-family: '${t}';\n\t\t\tsrc: url('${i[t]}');\n\t\t}\n`).join("");return r?`\t<style type="text/css"><![CDATA[\n${r}]]></style>\n`:""}_setSVGObjects(t,e){this.forEachObject(i=>{i.excludeFromExport||this._setSVGObject(t,i,e)})}_setSVGObject(t,e,i){t.push(e.toSVG(i))}_setSVGBgOverlayImage(t,e,i){let r=this[e];r&&!r.excludeFromExport&&r.toSVG&&t.push(r.toSVG(i))}_setSVGBgOverlayColor(t,e){let i=this[`${e}Color`];if(i)if(te(i)){let r=i.repeat||"",s=this.width,n=this.height,o=this[`${e}Vpt`]?Zt(Pt(this.viewportTransform)):"";t.push(`<rect transform="${o} translate(${s/2},${n/2})" x="${i.offsetX-s/2}" y="${i.offsetY-n/2}" width="${"repeat-y"!==r&&"no-repeat"!==r||!ie(i)?s:i.source.width}" height="${"repeat-x"!==r&&"no-repeat"!==r||!ie(i)?n:i.source.height}" fill="url(#SVGID_${i.id})"></rect>\n`)}else t.push('<rect x="0" y="0" width="100%" height="100%" ','fill="',i,'"',"></rect>\n")}loadFromJSON(t,e,{signal:i}={}){if(!t)return Promise.reject(new _("`json` is undefined"));let{objects:r=[],...s}="string"==typeof t?JSON.parse(t):t,{backgroundImage:n,background:o,overlayImage:a,overlay:l,clipPath:h}=s,c=this.renderOnAddRemove;return this.renderOnAddRemove=!1,Promise.all([Ut(r,{reviver:e,signal:i}),qt({backgroundImage:n,backgroundColor:o,overlayImage:a,overlayColor:l,clipPath:h},{signal:i})]).then(([t,e])=>(this.clear(),this.add(...t),this.set(s),this.set(e),this.renderOnAddRemove=c,this))}clone(t){let e=this.toObject(t);return this.cloneWithoutData().loadFromJSON(e)}cloneWithoutData(){let t=Tt(this);return new this.constructor(t)}toDataURL(t={}){let{format:e="png",quality:i=1,multiplier:r=1,enableRetinaScaling:s=!1}=t,n=r*(s?this.getRetinaScaling():1);return Ot(this.toCanvasElement(n,t),e,i)}toBlob(t={}){let{format:e="png",quality:i=1,multiplier:r=1,enableRetinaScaling:s=!1}=t,n=r*(s?this.getRetinaScaling():1);return kt(this.toCanvasElement(n,t),e,i)}toCanvasElement(t=1,{width:e,height:i,left:r,top:s,filter:n}={}){let o=(e||this.width)*t,a=(i||this.height)*t,l=this.getZoom(),h=this.width,c=this.height,u=this.skipControlsDrawing,d=l*t,g=this.viewportTransform,f=[d,0,0,d,(g[4]-(r||0))*t,(g[5]-(s||0))*t],p=this.enableRetinaScaling,m=Tt({width:o,height:a}),y=n?this._objects.filter(t=>n(t)):this._objects;return this.enableRetinaScaling=!1,this.viewportTransform=f,this.width=o,this.height=a,this.skipControlsDrawing=!0,this.calcViewportBoundaries(),this.renderCanvas(m.getContext("2d"),y),this.viewportTransform=g,this.width=h,this.height=c,this.calcViewportBoundaries(),this.enableRetinaScaling=p,this.skipControlsDrawing=u,m}dispose(){return!this.disposed&&this.elements.cleanupDOM({width:this.width,height:this.height}),lt.cancelByCanvas(this),this.disposed=!0,new Promise((t,e)=>{let i=()=>{this.destroy(),t(!0)};i.kill=e,this.__cleanupTask&&this.__cleanupTask.kill("aborted"),this.destroyed?t(!1):this.nextRenderHandle?this.__cleanupTask=i:i()})}destroy(){this.destroyed=!0,this.cancelRequestedRender(),this.forEachObject(t=>t.dispose()),this._objects=[],this.backgroundImage&&this.backgroundImage.dispose(),this.backgroundImage=void 0,this.overlayImage&&this.overlayImage.dispose(),this.overlayImage=void 0,this.elements.dispose()}toString(){return`#<Canvas (${this.complexity()}): { objects: ${this._objects.length} }>`}};p(_e,"ownDefaults",ue);const ve=["touchstart","touchmove","touchend"],xe=t=>{let e=se(t.target),i=function(t){let e=t.changedTouches;return e&&e[0]?e[0]:t}(t);return new gt(i.clientX+e.left,i.clientY+e.top)},Ce=t=>ve.includes(t.type)||"touch"===t.pointerType,we=t=>{t.preventDefault(),t.stopPropagation()},Se=t=>{let e=0,i=0,r=0,s=0;for(let n=0,o=t.length;n<o;n++){let{x:o,y:a}=t[n];(o>r||!n)&&(r=o),(o<e||!n)&&(e=o),(a>s||!n)&&(s=a),(a<i||!n)&&(i=a)}return{left:e,top:i,width:r-e,height:s-i}},Te=(t,e)=>{ke(t,At(Pt(e),t.calcOwnMatrix()))},Oe=(t,e)=>ke(t,At(e,t.calcOwnMatrix())),ke=(t,e)=>{let{translateX:i,translateY:r,scaleX:s,scaleY:n,...o}=Bt(e),a=new gt(i,r);t.flipX=!1,t.flipY=!1,Object.assign(t,o),t.set({scaleX:s,scaleY:n}),t.setPositionByOrigin(a,R,R)},De=t=>{t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.rotate(0)},Me=t=>({scaleX:t.scaleX,scaleY:t.scaleY,skewX:t.skewX,skewY:t.skewY,angle:t.angle,left:t.left,flipX:t.flipX,flipY:t.flipY,top:t.top}),je=(t,e,i)=>{let r=t/2,s=e/2,n=Se([new gt(-r,-s),new gt(r,-s),new gt(-r,s),new gt(r,s)].map(t=>t.transform(i)));return new gt(n.width,n.height)},Ee=(t=I,e=I)=>At(Pt(e),t),Pe=(t,e=I,i=I)=>t.transform(Ee(e,i)),Ae=(t,e=I,i=I)=>t.transform(Ee(e,i),!0),Fe=(t,e,i)=>{let r=Ee(e,i);return ke(t,At(r,t.calcOwnMatrix())),r},Le={left:-.5,top:-.5,center:0,bottom:.5,right:.5},Ie=t=>"string"==typeof t?Le[t]:t-.5,Re=new gt(1,0),Be=new gt,$e=(t,e)=>t.rotate(e),Xe=(t,e)=>new gt(e).subtract(t),Ye=t=>t.distanceFrom(Be),We=(t,e)=>Math.atan2(He(t,e),Ge(t,e)),Ne=t=>We(Re,t),Ve=t=>t.eq(Be)?t:t.scalarDivide(Ye(t)),ze=(t,e=!0)=>Ve(new gt(-t.y,t.x).scalarMultiply(e?1:-1)),He=(t,e)=>t.x*e.y-t.y*e.x,Ge=(t,e)=>t.x*e.x+t.y*e.y,Ue=(t,e,i)=>{if(t.eq(e)||t.eq(i))return!0;let r=He(e,i),s=He(e,t),n=He(i,t);return r>=0?s>=0&&n<=0:!(s<=0&&n>=0)},qe="not-allowed";function Ke(t){return Ie(t.originX)===Ie("center")&&Ie(t.originY)===Ie("center")}function Je(t){return.5-Ie(t)}const Qe=(t,e)=>t[e],Ze=(t,e,i,r)=>({e:t,transform:e,pointer:new gt(i,r)});function ti(t,e,i){let r=i,s=Ne(Xe(Pe(t.getCenterPoint(),t.canvas.viewportTransform,void 0),r))+F;return Math.round(s%F/A)}function ei({target:t,corner:e},i,r,s,n){var o;let a=t.controls[e],l=(null==(o=t.canvas)?void 0:o.getZoom())||1,h=t.padding/l,c=function(t,e,i,r){let s=t.getRelativeCenterPoint(),n=void 0!==i&&void 0!==r?t.translateToGivenOrigin(s,R,R,i,r):new gt(t.left,t.top);return(t.angle?e.rotate(-Dt(t.angle),s):e).subtract(n)}(t,new gt(s,n),i,r);return c.x>=h&&(c.x-=h),c.x<=-h&&(c.x+=h),c.y>=h&&(c.y-=h),c.y<=h&&(c.y+=h),c.x-=a.offsetX,c.y-=a.offsetY,c}const ii=new RegExp(String.raw`[\0-\x1F\x7F;<>\\]|\/\*|\*\/|url\s*\(|expression\s*\(|(?:java|vb)script\s*:|data\s*:|@import\b`,"iu"),ri=t=>"string"==typeof t&&t.trim().length>0&&!ii.test(t),si=(t,e="")=>{let i=Number(t);return Number.isFinite(i)?`${i}`:e},ni=(t,e="")=>"string"==typeof t&&ri(t)?t:e,oi=t=>t.replace(/\s+/g," "),ai={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#0FF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000",blanchedalmond:"#FFEBCD",blue:"#00F",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#0FF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",darkgreen:"#006400",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#F0F",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",lightgreen:"#90EE90",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#0F0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#F0F",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",rebeccapurple:"#639",red:"#F00",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",white:"#FFF",whitesmoke:"#F5F5F5",yellow:"#FF0",yellowgreen:"#9ACD32"},li=(t,e,i)=>(i<0&&(i+=1),i>1&&--i,i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t),hi=(t,e,i,r)=>{t/=255,e/=255,i/=255;let s,n,o=Math.max(t,e,i),a=Math.min(t,e,i),l=(o+a)/2;if(o===a)s=n=0;else{let r=o-a;switch(n=l>.5?r/(2-o-a):r/(o+a),o){case t:s=(e-i)/r+(e<i?6:0);break;case e:s=(i-t)/r+2;break;case i:s=(t-e)/r+4}s/=6}return[Math.round(360*s),Math.round(100*n),Math.round(100*l),r]},ci=(t="1")=>parseFloat(t)/(t.endsWith("%")?100:1),ui=t=>Math.min(Math.round(t),255).toString(16).toUpperCase().padStart(2,"0"),di=([t,e,i,r=1])=>{let s=Math.round(.3*t+.59*e+.11*i);return[s,s,s,r]};var gi=class t{constructor(e){if(p(this,"isUnrecognised",!1),e)if(e instanceof t)this.setSource([...e._source]);else if(Array.isArray(e)){let[t,i,r,s=1]=e;this.setSource([t,i,r,s])}else this.setSource(this._tryParsingColor(e));else this.setSource([0,0,0,1])}_tryParsingColor(e){return(e=e.toLowerCase())in ai&&(e=ai[e]),"transparent"===e?[255,255,255,0]:t.sourceFromHex(e)||t.sourceFromRgb(e)||t.sourceFromHsl(e)||(this.isUnrecognised=!0)&&[0,0,0,1]}getSource(){return this._source}setSource(t){this._source=t}toRgb(){let[t,e,i]=this.getSource();return`rgb(${t},${e},${i})`}toRgba(){return`rgba(${this.getSource().join(",")})`}toHsl(){let[t,e,i]=hi(...this.getSource());return`hsl(${t},${e}%,${i}%)`}toHsla(){let[t,e,i,r]=hi(...this.getSource());return`hsla(${t},${e}%,${i}%,${r})`}toHex(){return this.toHexa().slice(0,6)}toHexa(){let[t,e,i,r]=this.getSource();return`${ui(t)}${ui(e)}${ui(i)}${ui(Math.round(255*r))}`}getAlpha(){return this.getSource()[3]}setAlpha(t){return this._source[3]=t,this}toGrayscale(){return this.setSource(di(this.getSource())),this}toBlackWhite(t){let[e,,,i]=di(this.getSource()),r=e<(t||127)?0:255;return this.setSource([r,r,r,i]),this}overlayWith(e){e instanceof t||(e=new t(e));let i=this.getSource(),r=e.getSource(),[s,n,o]=i.map((t,e)=>Math.round(.5*t+.5*r[e]));return this.setSource([s,n,o,i[3]]),this}static fromRgb(e){return t.fromRgba(e)}static fromRgba(e){return new t(t.sourceFromRgb(e))}static sourceFromRgb(t){let e=oi(t).match(/^rgba?\(\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?(?:\s?[,/]\s?(\d{0,3}(?:\.\d+)?%?)\s?)?\)$/i);if(e){let[t,i,r]=e.slice(1,4).map(t=>{let e=parseFloat(t);return t.endsWith("%")?Math.round(2.55*e):e});return[t,i,r,ci(e[4])]}}static fromHsl(e){return t.fromHsla(e)}static fromHsla(e){return new t(t.sourceFromHsl(e))}static sourceFromHsl(e){let i=oi(e).match(/^hsla?\(\s?([+-]?\d{0,3}(?:\.\d+)?(?:deg|turn|rad)?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?(?:\s?[,/]\s?(\d*(?:\.\d+)?%?)\s?)?\)$/i);if(!i)return;let r,s,n,o=(t.parseAngletoDegrees(i[1])%360+360)%360/360,a=parseFloat(i[2])/100,l=parseFloat(i[3])/100;if(0===a)r=s=n=l;else{let t=l<=.5?l*(a+1):l+a-l*a,e=2*l-t;r=li(e,t,o+1/3),s=li(e,t,o),n=li(e,t,o-1/3)}return[Math.round(255*r),Math.round(255*s),Math.round(255*n),ci(i[4])]}static fromHex(e){return new t(t.sourceFromHex(e))}static sourceFromHex(t){if(t.match(/^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i)){let e,i=t.slice(t.indexOf("#")+1);e=i.length<=4?i.split("").map(t=>t+t):i.match(/.{2}/g);let[r,s,n,o=255]=e.map(t=>parseInt(t,16));return[r,s,n,o/255]}}static parseAngletoDegrees(t){let e=t.toLowerCase(),i=parseFloat(e);return e.includes("rad")?Mt(i):e.includes("turn")?360*i:i}};const fi=t=>{let e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":return e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);case"radialGradient":return e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);case"stop":return e.concat(["offset","stop-color","stop-opacity"])}return e},pi=(t,e=16)=>{let i=/\D{0,2}$/.exec(t),r=parseFloat(t),s=y.DPI;switch(null==i?void 0:i[0]){case"mm":return r*s/25.4;case"cm":return r*s/2.54;case"in":return r*s;case"pt":return r*s/72;case"pc":return r*s/72*12;case"em":return r*e;default:return r}},mi=t=>{let[e,i]=t.trim().split(" "),[r,s]=(n=e)&&"none"!==n?[n.slice(1,4),n.slice(5,8)]:"none"===n?[n,n]:["Mid","Mid"];var n;return{meetOrSlice:i||"meet",alignX:r,alignY:s}},yi=(t,e,i=!0)=>{let r,s;if(e)if(e.toLive)r=`url(#SVGID_${fe(e.id)})`;else{let t=String(e);if(ri(t)){let e=new gi(t),i=e.getAlpha();r=e.toRgb(),1!==i&&(s=i.toString())}else r=new gi("black").toRgb()}else r="none";return i?`${t}: ${r}; ${s?`${t}-opacity: ${s}; `:""}`:`${t}="${r}" ${s?`${t}-opacity="${s}" `:""}`};var bi=class{getSvgStyles(t){let e=null==this.fillRule?"nonzero":ni(this.fillRule),i=null==this.strokeWidth?"0":si(this.strokeWidth),r=null==this.strokeDashArray?Y:this.strokeDashArray.every(t=>Number.isFinite(Number(t)))?this.strokeDashArray.join(" "):"",s=null==this.strokeDashOffset?"0":si(this.strokeDashOffset),n=null==this.strokeLineCap?"butt":ni(this.strokeLineCap),o=null==this.strokeLineJoin?"miter":ni(this.strokeLineJoin),a=null==this.strokeMiterLimit?"4":si(this.strokeMiterLimit),l=null==this.opacity?"1":si(this.opacity),h=this.visible?"":" visibility: hidden;",c=t?"":this.getSvgFilter(),u=yi(it,this.fill);return[yi(rt,this.stroke),i?`stroke-width: ${i}; `:"",r?`stroke-dasharray: ${r}; `:"",n?`stroke-linecap: ${n}; `:"",s?`stroke-dashoffset: ${s}; `:"",o?`stroke-linejoin: ${o}; `:"",a?`stroke-miterlimit: ${a}; `:"",u,e?`fill-rule: ${e}; `:"",l?`opacity: ${l};`:"",c,h].map(t=>fe(t)).join("")}getSvgFilter(){return this.shadow?`filter: url(#SVGID_${fe(this.shadow.id)});`:""}getSvgCommons(){return[this.id?`id="${fe(String(this.id))}" `:"",this.clipPath?`clip-path="url(#${fe(this.clipPath.clipPathId)})" `:""].join("")}getSvgTransform(t,e=""){return`transform="${Zt(t?this.calcTransformMatrix():this.calcOwnMatrix())}${e}" `}_toSVG(t){return[""]}toSVG(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})}toClipPathSVG(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})}_createBaseClipPathSVGMarkup(t,{reviver:e,additionalTransform:i=""}={}){let r=[this.getSvgTransform(!0,i),this.getSvgCommons()].join(""),s=t.indexOf("COMMON_PARTS");return t[s]=r,e?e(t.join("")):t.join("")}_createBaseSVGMarkup(t,{noStyle:e,reviver:i,withShadow:r,additionalTransform:s}={}){let n,o=e?"":`style="${this.getSvgStyles()}" `,a=r?`style="${this.getSvgFilter()}" `:"",l=this.clipPath,h=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",c=l&&l.absolutePositioned,u=this.stroke,d=this.fill,g=this.shadow,f=[],p=t.indexOf("COMMON_PARTS");return l&&(l.clipPathId=`CLIPPATH_${xt()}`,n=`<clipPath id="${l.clipPathId}" >\n${l.toClipPathSVG(i)}</clipPath>\n`),c&&f.push("<g ",a,this.getSvgCommons()," >\n"),f.push("<g ",this.getSvgTransform(!1),c?"":a+this.getSvgCommons()," >\n"),t[p]=[o,h,e?"":this.addPaintOrder()," ",s?`transform="${s}" `:""].join(""),te(d)&&f.push(d.toSVG(this)),te(u)&&f.push(u.toSVG(this)),g&&f.push(g.toSVG(this)),l&&f.push(n),f.push(t.join("")),f.push("</g>\n"),c&&f.push("</g>\n"),i?i(f.join("")):f.join("")}addPaintOrder(){return"fill"===this.paintFirst?"":` paint-order="${fe(this.paintFirst)}" `}};function _n(t){return RegExp("^("+t.join("|")+")\\b","i")}const _i="textDecorationThickness",vi="textDecorationColor",xi=["fontSize","fontWeight","fontFamily","fontStyle"],Ci=["underline","overline","linethrough"],wi=[...xi,"lineHeight","text","charSpacing","textAlign","styles","path","pathStartOffset","pathSide","pathAlign"],Si=[...wi,...Ci,"textBackgroundColor","direction",_i,vi],Ti=[...xi,...Ci,rt,"strokeWidth",it,"deltaY","textBackgroundColor",_i,vi],Oi={_reNewline:W,_reSpacesAndTabs:/[ \t\r]/g,_reSpaceAndTab:/[ \t\r]/,_reWords:/\S+/g,fontSize:40,fontWeight:nt,fontFamily:"Times New Roman",underline:!1,overline:!1,linethrough:!1,textAlign:B,fontStyle:nt,lineHeight:1.16,textBackgroundColor:"",stroke:null,shadow:null,path:void 0,pathStartOffset:0,pathSide:B,pathAlign:"baseline",charSpacing:0,deltaY:0,direction:"ltr",CACHE_FONT_SIZE:400,MIN_TEXT_WIDTH:2,superscript:{size:.6,baseline:-.35},subscript:{size:.6,baseline:.11},_fontSizeFraction:.222,offsets:{underline:.1,linethrough:-.28167,overline:-.81333},_fontSizeMult:1.13,[_i]:66.667},ki="justify",Di=String.raw`[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?`,Mi=String.raw`(?:\s*,?\s+|\s*,\s*)`,ji=RegExp("(normal|italic)?\\s*(normal|small-caps)?\\s*(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*("+Di+"(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|"+Di+"))?\\s+(.*)"),Ei={cx:B,x:B,r:"radius",cy:"top",y:"top",display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","letter-spacing":"charSpacing","paint-order":"paintFirst","stroke-dasharray":"strokeDashArray","stroke-dashoffset":"strokeDashOffset","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"textAnchor",opacity:"opacity","clip-path":"clipPath","clip-rule":"clipRule","vector-effect":"strokeUniform","image-rendering":"imageSmoothing","text-decoration-thickness":_i,"text-decoration-color":vi},Pi="font-size",Ai="clip-path",Fi=(_n(["path","circle","polygon","polyline","ellipse","rect","line","image","text"]),_n(["symbol","image","marker","pattern","view","svg"]),_n(["symbol","g","a","svg","clipPath","defs"])),Li=(new RegExp(String.raw`^\s*(${Di})${Mi}(${Di})${Mi}(${Di})${Mi}(${Di})\s*$`),"(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?"),Ii=RegExp("(?:\\s|^)"+Li+Li+"("+Di+"?(?:px)?)?(?:\\s?|$)(?:$|\\s)");var Ri=class t{constructor(e={}){let i="string"==typeof e?t.parseShadow(e):e;Object.assign(this,t.ownDefaults,i),this.id=xt()}static parseShadow(t){let e=t.trim(),[,i=0,r=0,s=0]=(Ii.exec(e)||[]).map(t=>parseFloat(t)||0);return{color:(e.replace(Ii,"")||"rgb(0,0,0)").trim(),offsetX:i,offsetY:r,blur:s}}toString(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")}toSVG(t){let e=$e(new gt(this.offsetX,this.offsetY),Dt(-t.angle)),i=y.NUM_FRACTION_DIGITS,r=new gi(this.color),s=40,n=40;return t.width&&t.height&&(s=100*Qt((Math.abs(e.x)+this.blur)/t.width,i)+20,n=100*Qt((Math.abs(e.y)+this.blur)/t.height,i)+20),t.flipX&&(e.x*=-1),t.flipY&&(e.y*=-1),`<filter id="SVGID_${fe(this.id)}" y="-${n}%" height="${100+2*n}%" x="-${s}%" width="${100+2*s}%" >\n\t<feGaussianBlur in="SourceAlpha" stdDeviation="${Qt(this.blur?this.blur/2:0,i)}"></feGaussianBlur>\n\t<feOffset dx="${Qt(e.x,i)}" dy="${Qt(e.y,i)}" result="oBlur" ></feOffset>\n\t<feFlood flood-color="${r.toRgb()}" flood-opacity="${r.getAlpha()}"/>\n\t<feComposite in2="oBlur" operator="in" />\n\t<feMerge>\n\t\t<feMergeNode></feMergeNode>\n\t\t<feMergeNode in="SourceGraphic"></feMergeNode>\n\t</feMerge>\n</filter>\n`}toObject(){let e={color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling,type:this.constructor.type},i=t.ownDefaults;return this.includeDefaultValues?e:Jt(e,(t,e)=>t!==i[e])}static async fromObject(t){return new this(t)}};p(Ri,"ownDefaults",{color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1}),p(Ri,"type","shadow"),at.setClass(Ri,"shadow");const Bi=(t,e,i)=>Math.max(t,Math.min(e,i)),$i=["top",B,Q,Z,"flipX","flipY","originX","originY","angle","opacity","globalCompositeOperation","shadow","visible",tt,et],Xi=[it,rt,"strokeWidth","strokeDashArray","width","height","paintFirst","strokeUniform","strokeLineCap","strokeDashOffset","strokeLineJoin","strokeMiterLimit","backgroundColor","clipPath"],Yi={top:0,left:0,width:0,height:0,angle:0,flipX:!1,flipY:!1,scaleX:1,scaleY:1,minScaleLimit:0,skewX:0,skewY:0,originX:R,originY:R,strokeWidth:1,strokeUniform:!1,padding:0,opacity:1,paintFirst:it,fill:"rgb(0,0,0)",fillRule:"nonzero",stroke:null,strokeDashArray:null,strokeDashOffset:0,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:4,globalCompositeOperation:"source-over",backgroundColor:"",shadow:null,visible:!0,includeDefaultValues:!0,excludeFromExport:!1,objectCaching:!0,clipPath:void 0,inverted:!1,absolutePositioned:!1,centeredRotation:!0,centeredScaling:!1,dirty:!0};var Wi=d({defaultEasing:()=>zi,easeInBack:()=>gr,easeInBounce:()=>yr,easeInCirc:()=>ar,easeInCubic:()=>Hi,easeInElastic:()=>cr,easeInExpo:()=>sr,easeInOutBack:()=>pr,easeInOutBounce:()=>br,easeInOutCirc:()=>hr,easeInOutCubic:()=>Ui,easeInOutElastic:()=>dr,easeInOutExpo:()=>or,easeInOutQuad:()=>xr,easeInOutQuart:()=>Ji,easeInOutQuint:()=>tr,easeInOutSine:()=>rr,easeInQuad:()=>_r,easeInQuart:()=>qi,easeInQuint:()=>Qi,easeInSine:()=>er,easeOutBack:()=>fr,easeOutBounce:()=>mr,easeOutCirc:()=>lr,easeOutCubic:()=>Gi,easeOutElastic:()=>ur,easeOutExpo:()=>nr,easeOutQuad:()=>vr,easeOutQuart:()=>Ki,easeOutQuint:()=>Zi,easeOutSine:()=>ir});const Ni=(t,e,i,r)=>(t<Math.abs(e)?(t=e,r=i/4):r=0===e&&0===t?i/F*Math.asin(1):i/F*Math.asin(e/t),{a:t,c:e,p:i,s:r}),Vi=(t,e,i,r,s)=>t*2**(10*--r)*Math.sin((r*s-e)*F/i),zi=(t,e,i,r)=>-i*Math.cos(t/r*P)+i+e,Hi=(t,e,i,r)=>i*(t/r)**3+e,Gi=(t,e,i,r)=>i*((t/r-1)**3+1)+e,Ui=(t,e,i,r)=>(t/=r/2)<1?i/2*t**3+e:i/2*((t-2)**3+2)+e,qi=(t,e,i,r)=>i*(t/=r)*t**3+e,Ki=(t,e,i,r)=>-i*((t=t/r-1)*t**3-1)+e,Ji=(t,e,i,r)=>(t/=r/2)<1?i/2*t**4+e:-i/2*((t-=2)*t**3-2)+e,Qi=(t,e,i,r)=>i*(t/r)**5+e,Zi=(t,e,i,r)=>i*((t/r-1)**5+1)+e,tr=(t,e,i,r)=>(t/=r/2)<1?i/2*t**5+e:i/2*((t-2)**5+2)+e,er=(t,e,i,r)=>-i*Math.cos(t/r*P)+i+e,ir=(t,e,i,r)=>i*Math.sin(t/r*P)+e,rr=(t,e,i,r)=>-i/2*(Math.cos(Math.PI*t/r)-1)+e,sr=(t,e,i,r)=>0===t?e:i*2**(10*(t/r-1))+e,nr=(t,e,i,r)=>t===r?e+i:i*-(2**(-10*t/r)+1)+e,or=(t,e,i,r)=>0===t?e:t===r?e+i:(t/=r/2)<1?i/2*2**(10*(t-1))+e:i/2*-(2**(-10*(t-1))+2)+e,ar=(t,e,i,r)=>-i*(Math.sqrt(1-(t/=r)*t)-1)+e,lr=(t,e,i,r)=>i*Math.sqrt(1-(t=t/r-1)*t)+e,hr=(t,e,i,r)=>(t/=r/2)<1?-i/2*(Math.sqrt(1-t**2)-1)+e:i/2*(Math.sqrt(1-(t-=2)*t)+1)+e,cr=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(1===(t/=r))return e+i;n||(n=.3*r);let{a:o,s:a,p:l}=Ni(s,i,n,1.70158);return-Vi(o,a,l,t,r)+e},ur=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(1===(t/=r))return e+i;n||(n=.3*r);let{a:o,s:a,p:l,c:h}=Ni(s,i,n,1.70158);return o*2**(-10*t)*Math.sin((t*r-a)*F/l)+h+e},dr=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(2==(t/=r/2))return e+i;n||(n=.3*1.5*r);let{a:o,s:a,p:l,c:h}=Ni(s,i,n,1.70158);return t<1?-.5*Vi(o,a,l,t,r)+e:o*2**(-10*--t)*Math.sin((t*r-a)*F/l)*.5+h+e},gr=(t,e,i,r,s=1.70158)=>i*(t/=r)*t*((s+1)*t-s)+e,fr=(t,e,i,r,s=1.70158)=>i*((t=t/r-1)*t*((s+1)*t+s)+1)+e,pr=(t,e,i,r,s=1.70158)=>(t/=r/2)<1?i/2*(t*t*((1+(s*=1.525))*t-s))+e:i/2*((t-=2)*t*((1+(s*=1.525))*t+s)+2)+e,mr=(t,e,i,r)=>(t/=r)<1/2.75?i*(7.5625*t*t)+e:t<2/2.75?i*(7.5625*(t-=1.5/2.75)*t+.75)+e:t<2.5/2.75?i*(7.5625*(t-=2.25/2.75)*t+.9375)+e:i*(7.5625*(t-=2.625/2.75)*t+.984375)+e,yr=(t,e,i,r)=>i-mr(r-t,0,i,r)+e,br=(t,e,i,r)=>t<r/2?.5*yr(2*t,0,i,r)+e:.5*mr(2*t-r,0,i,r)+.5*i+e,_r=(t,e,i,r)=>i*(t/=r)*t+e,vr=(t,e,i,r)=>-i*(t/=r)*(t-2)+e,xr=(t,e,i,r)=>(t/=r/2)<1?i/2*t**2+e:-i/2*(--t*(t-2)-1)+e,Cr=()=>!1;var wr=class{constructor({startValue:t,byValue:e,duration:i=500,delay:r=0,easing:s=zi,onStart:n=E,onChange:o=E,onComplete:a=E,abort:l=Cr,target:h}){p(this,"_state","pending"),p(this,"durationProgress",0),p(this,"valueProgress",0),this.tick=this.tick.bind(this),this.duration=i,this.delay=r,this.easing=s,this._onStart=n,this._onChange=o,this._onComplete=a,this._abort=l,this.target=h,this.startValue=t,this.byValue=e,this.value=this.startValue,this.endValue=Object.freeze(this.calculate(this.duration).value)}get state(){return this._state}isDone(){return"aborted"===this._state||"completed"===this._state}start(){let t=t=>{"pending"===this._state&&(this.startTime=t||+new Date,this._state="running",this._onStart(),this.tick(this.startTime))};this.register(),this.delay>0?this.timeout=k().setTimeout(()=>bt(t),this.delay):bt(t)}tick(t){let e=(t||+new Date)-this.startTime,i=Math.min(e,this.duration);this.durationProgress=i/this.duration;let{value:r,valueProgress:s}=this.calculate(i);this.value=Object.freeze(r),this.valueProgress=s,"aborted"!==this._state&&(this._abort(this.value,this.valueProgress,this.durationProgress)?(this._state="aborted",this.unregister()):e>=this.duration?(this.durationProgress=this.valueProgress=1,this._onChange(this.endValue,this.valueProgress,this.durationProgress),this._state="completed",this._onComplete(this.endValue,this.valueProgress,this.durationProgress),this.unregister(),this.timeout=null):(this._onChange(this.value,this.valueProgress,this.durationProgress),bt(this.tick)))}register(){lt.push(this)}unregister(){lt.remove(this)}abort(){this._state="aborted",this.unregister(),this.timeout&&k().clearTimeout(this.timeout)}},Sr=class extends wr{constructor({startValue:t=0,endValue:e=100,...i}){super({...i,startValue:t,byValue:e-t})}calculate(t){let e=this.easing(t,this.startValue,this.byValue,this.duration);return{value:e,valueProgress:Math.abs((e-this.startValue)/this.byValue)}}},Tr=class extends wr{constructor({startValue:t=[0],endValue:e=[100],...i}){super({...i,startValue:t,byValue:e.map((e,i)=>e-t[i])})}calculate(t){let e=this.startValue.map((e,i)=>this.easing(t,e,this.byValue[i],this.duration,i));return{value:e,valueProgress:Math.abs((e[0]-this.startValue[0])/this.byValue[0])}}};const Or=(t,e,i,r)=>e+i*(1-Math.cos(t/r*P)),kr=t=>t&&((e,i,r)=>t(new gi(e).toRgba(),i,r));var Dr=class extends wr{constructor({startValue:t,endValue:e,easing:i=Or,onChange:r,onComplete:s,abort:n,...o}){let a=new gi(t).getSource(),l=new gi(e).getSource();super({...o,startValue:a,byValue:l.map((t,e)=>t-a[e]),easing:i,onChange:kr(r),onComplete:kr(s),abort:kr(n)})}calculate(t){let[e,i,r,s]=this.startValue.map((e,i)=>this.easing(t,e,this.byValue[i],this.duration,i)),n=[...[e,i,r].map(Math.round),Bi(0,s,1)];return{value:n,valueProgress:n.map((t,e)=>0===this.byValue[e]?0:Math.abs((t-this.startValue[e])/this.byValue[e])).find(t=>0!==t)||0}}};function Mr(t){let e=(t=>Array.isArray(t.startValue)||Array.isArray(t.endValue))(t)?new Tr(t):new Sr(t);return e.start(),e}function jr(t){let e=new Dr(t);return e.start(),e}var Er=class t{constructor(t){this.status=t,this.points=[]}includes(t){return this.points.some(e=>e.eq(t))}append(...t){return this.points=this.points.concat(t.filter(t=>!this.includes(t))),this}static isPointContained(t,e,i,r=!1){if(e.eq(i))return t.eq(e);if(e.x===i.x)return t.x===e.x&&(r||t.y>=Math.min(e.y,i.y)&&t.y<=Math.max(e.y,i.y));if(e.y===i.y)return t.y===e.y&&(r||t.x>=Math.min(e.x,i.x)&&t.x<=Math.max(e.x,i.x));{let s=Xe(e,i),n=Xe(e,t).divide(s);return r?Math.abs(n.x)===Math.abs(n.y):n.x===n.y&&n.x>=0&&n.x<=1}}static isPointInPolygon(t,e){let i=new gt(t).setX(Math.min(t.x-1,...e.map(t=>t.x))),r=0;for(let s=0;s<e.length;s++){let n=this.intersectSegmentSegment(e[s],e[(s+1)%e.length],t,i);if(n.includes(t))return!0;r+=Number("Intersection"===n.status)}return r%2==1}static intersectLineLine(e,i,r,s,n=!0,o=!0){let a=i.x-e.x,l=i.y-e.y,h=s.x-r.x,c=s.y-r.y,u=e.x-r.x,d=e.y-r.y,g=h*d-c*u,f=a*d-l*u,p=c*a-h*l;if(0!==p){let i=g/p,r=f/p;return(n||0<=i&&i<=1)&&(o||0<=r&&r<=1)?new t("Intersection").append(new gt(e.x+i*a,e.y+i*l)):new t}return new t(0===g||0===f?n||o||t.isPointContained(e,r,s)||t.isPointContained(i,r,s)||t.isPointContained(r,e,i)||t.isPointContained(s,e,i)?"Coincident":void 0:"Parallel")}static intersectSegmentLine(e,i,r,s){return t.intersectLineLine(e,i,r,s,!1,!0)}static intersectSegmentSegment(e,i,r,s){return t.intersectLineLine(e,i,r,s,!1,!1)}static intersectLinePolygon(e,i,r,s=!0){let n=new t,o=r.length;for(let a,l,h,c=0;c<o;c++){if(a=r[c],l=r[(c+1)%o],h=t.intersectLineLine(e,i,a,l,s,!1),"Coincident"===h.status)return h;n.append(...h.points)}return n.points.length>0&&(n.status="Intersection"),n}static intersectSegmentPolygon(e,i,r){return t.intersectLinePolygon(e,i,r,!1)}static intersectPolygonPolygon(e,i){let r=new t,s=e.length,n=[];for(let o=0;o<s;o++){let a=e[o],l=e[(o+1)%s],h=t.intersectSegmentPolygon(a,l,i);"Coincident"===h.status?(n.push(h),r.append(a,l)):r.append(...h.points)}return n.length>0&&n.length===e.length?new t("Coincident"):(r.points.length>0&&(r.status="Intersection"),r)}static intersectPolygonRectangle(e,i,r){let s=i.min(r),n=i.max(r),o=new gt(n.x,s.y),a=new gt(s.x,n.y);return t.intersectPolygonPolygon(e,[s,o,n,a])}},Pr=class extends yt{getX(){return this.getXY().x}setX(t){this.setXY(this.getXY().setX(t))}getY(){return this.getXY().y}setY(t){this.setXY(this.getXY().setY(t))}getRelativeX(){return this.left}setRelativeX(t){this.left=t}getRelativeY(){return this.top}setRelativeY(t){this.top=t}getXY(){let t=this.getRelativeXY();return this.group?Et(t,this.group.calcTransformMatrix()):t}setXY(t,e,i){this.group&&(t=Et(t,Pt(this.group.calcTransformMatrix()))),this.setRelativeXY(t,e,i)}getRelativeXY(){return new gt(this.left,this.top)}setRelativeXY(t,e=this.originX,i=this.originY){this.setPositionByOrigin(t,e,i)}isStrokeAccountedForInDimensions(){return!1}getCoords(){let{tl:t,tr:e,br:i,bl:r}=this.aCoords||(this.aCoords=this.calcACoords()),s=[t,e,i,r];if(this.group){let t=this.group.calcTransformMatrix();return s.map(e=>Et(e,t))}return s}intersectsWithRect(t,e){return"Intersection"===Er.intersectPolygonRectangle(this.getCoords(),t,e).status}intersectsWithObject(t){let e=Er.intersectPolygonPolygon(this.getCoords(),t.getCoords());return"Intersection"===e.status||"Coincident"===e.status||t.isContainedWithinObject(this)||this.isContainedWithinObject(t)}isContainedWithinObject(t){return this.getCoords().every(e=>t.containsPoint(e))}isContainedWithinRect(t,e){let{left:i,top:r,width:s,height:n}=this.getBoundingRect();return i>=t.x&&i+s<=e.x&&r>=t.y&&r+n<=e.y}isOverlapping(t){return this.intersectsWithObject(t)||this.isContainedWithinObject(t)||t.isContainedWithinObject(this)}containsPoint(t){return Er.isPointInPolygon(t,this.getCoords())}isOnScreen(){if(!this.canvas)return!1;let{tl:t,br:e}=this.canvas.vptCoords;return!!this.getCoords().some(i=>i.x<=e.x&&i.x>=t.x&&i.y<=e.y&&i.y>=t.y)||!!this.intersectsWithRect(t,e)||this.containsPoint(t.midPointFrom(e))}isPartiallyOnScreen(){if(!this.canvas)return!1;let{tl:t,br:e}=this.canvas.vptCoords;return!!this.intersectsWithRect(t,e)||this.getCoords().every(i=>(i.x>=e.x||i.x<=t.x)&&(i.y>=e.y||i.y<=t.y))&&this.containsPoint(t.midPointFrom(e))}getBoundingRect(){return Se(this.getCoords())}getScaledWidth(){return this._getTransformedDimensions().x}getScaledHeight(){return this._getTransformedDimensions().y}scale(t){this._set(Q,t),this._set(Z,t),this.setCoords()}scaleToWidth(t){let e=this.getBoundingRect().width/this.getScaledWidth();return this.scale(t/this.width/e)}scaleToHeight(t){let e=this.getBoundingRect().height/this.getScaledHeight();return this.scale(t/this.height/e)}getCanvasRetinaScaling(){var t;return(null==(t=this.canvas)?void 0:t.getRetinaScaling())||1}getTotalAngle(){return this.group?Mt(Lt(this.calcTransformMatrix())):this.angle}getViewportTransform(){var t;return(null==(t=this.canvas)?void 0:t.viewportTransform)||I.concat()}calcACoords(){let t=Xt({angle:this.angle}),{x:e,y:i}=this.getRelativeCenterPoint(),r=At($t(e,i),t),s=this._getTransformedDimensions(),n=s.x/2,o=s.y/2;return{tl:Et({x:-n,y:-o},r),tr:Et({x:n,y:-o},r),bl:Et({x:-n,y:o},r),br:Et({x:n,y:o},r)}}setCoords(){this.aCoords=this.calcACoords()}transformMatrixKey(t=!1){let e=[];return!t&&this.group&&(e=this.group.transformMatrixKey(t)),e.push(this.top,this.left,this.width,this.height,this.scaleX,this.scaleY,this.angle,this.strokeWidth,this.skewX,this.skewY,+this.flipX,+this.flipY,Ie(this.originX),Ie(this.originY)),e}calcTransformMatrix(t=!1){let e=this.calcOwnMatrix();if(t||!this.group)return e;let i=this.transformMatrixKey(t),r=this.matrixCache;return r&&r.key.every((t,e)=>t===i[e])?r.value:(this.group&&(e=At(this.group.calcTransformMatrix(!1),e)),this.matrixCache={key:i,value:e},e)}calcOwnMatrix(){let t=this.transformMatrixKey(!0),e=this.ownMatrixCache;if(e&&e.key.every((e,i)=>e===t[i]))return e.value;let i=this.getRelativeCenterPoint(),r=Ht({angle:this.angle,translateX:i.x,translateY:i.y,scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,flipX:this.flipX,flipY:this.flipY});return this.ownMatrixCache={key:t,value:r},r}_getNonTransformedDimensions(){return new gt(this.width,this.height).scalarAdd(this.strokeWidth)}_calculateCurrentDimensions(t){var e;let i=null==(e=this.canvas)?void 0:e.viewportTransform,r=this._getTransformedDimensions(t);return i?r.multiply(new gt(It(i),Rt(i))).scalarAdd(2*this.padding):r.scalarAdd(2*this.padding)}_getTransformedDimensions(t={}){let e={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,width:this.width,height:this.height,strokeWidth:this.strokeWidth,...t},i=e.strokeWidth,r=i,s=0;this.strokeUniform&&(r=0,s=i);let n,o=e.width+r,a=e.height+r;return n=0===e.skewX&&0===e.skewY?new gt(o*e.scaleX,a*e.scaleY):je(o,a,zt(e)),n.scalarAdd(s)}translateToGivenOrigin(t,e,i,r,s){let n=t.x,o=t.y,a=Ie(r)-Ie(e),l=Ie(s)-Ie(i);if(a||l){let t=this._getTransformedDimensions();n+=a*t.x,o+=l*t.y}return new gt(n,o)}translateToCenterPoint(t,e,i){if("center"===e&&"center"===i)return t;let r=this.translateToGivenOrigin(t,e,i,R,R);return this.angle?r.rotate(Dt(this.angle),t):r}translateToOriginPoint(t,e,i){let r=this.translateToGivenOrigin(t,R,R,e,i);return this.angle?r.rotate(Dt(this.angle),t):r}getCenterPoint(){let t=this.getRelativeCenterPoint();return this.group?Et(t,this.group.calcTransformMatrix()):t}getRelativeCenterPoint(){return this.translateToCenterPoint(new gt(this.left,this.top),this.originX,this.originY)}getPointByOrigin(t,e){return this.getPositionByOrigin(t,e)}getPositionByOrigin(t,e){return this.translateToOriginPoint(this.getRelativeCenterPoint(),t,e)}setPositionByOrigin(t,e,i){let r=this.translateToCenterPoint(t,e,i),s=this.translateToOriginPoint(r,this.originX,this.originY);this.set({left:s.x,top:s.y})}_getLeftTopCoords(){return this.getPositionByOrigin(B,"top")}positionByLeftTop(t){return this.setPositionByOrigin(t,B,"top")}},Ar=class t extends Pr{static getDefaults(){return t.ownDefaults}get type(){let t=this.constructor.type;return"FabricObject"===t?"object":t.toLowerCase()}set type(t){b("warn","Setting type has no effect",t)}constructor(e){super(),p(this,"_cacheContext",null),Object.assign(this,t.ownDefaults),this.setOptions(e)}_createCacheCanvas(){this._cacheCanvas=Ct(),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas(),this.dirty=!0}_limitCacheSize(t){let e=t.width,i=t.height,r=y.maxCacheSideLimit,s=y.minCacheSideLimit;if(e<=r&&i<=r&&e*i<=y.perfLimitSizeTotal)return e<s&&(t.width=s),i<s&&(t.height=s),t;let n=e/i,[o,a]=M.limitDimsByArea(n),l=Bi(s,o,r),h=Bi(s,a,r);return e>l&&(t.zoomX/=e/l,t.width=l,t.capped=!0),i>h&&(t.zoomY/=i/h,t.height=h,t.capped=!0),t}_getCacheCanvasDimensions(){let t=this.getTotalObjectScaling(),e=this._getTransformedDimensions({skewX:0,skewY:0}),i=e.x*t.x/this.scaleX,r=e.y*t.y/this.scaleY;return{width:Math.ceil(i+2),height:Math.ceil(r+2),zoomX:t.x,zoomY:t.y,x:i,y:r}}_updateCacheCanvas(){let t=this._cacheCanvas,e=this._cacheContext,{width:i,height:r,zoomX:s,zoomY:n,x:o,y:a}=this._limitCacheSize(this._getCacheCanvasDimensions()),l=i!==t.width||r!==t.height,h=this.zoomX!==s||this.zoomY!==n;if(!t||!e)return!1;if(l||h){i!==t.width||r!==t.height?(t.width=i,t.height=r):(e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t.width,t.height));let l=o/2,h=a/2;return this.cacheTranslationX=Math.round(t.width/2-l)+l,this.cacheTranslationY=Math.round(t.height/2-h)+h,e.translate(this.cacheTranslationX,this.cacheTranslationY),e.scale(s,n),this.zoomX=s,this.zoomY=n,!0}return!1}setOptions(t={}){this._setOptions(t)}transform(t){let e=this.group&&!this.group._transformDone||this.group&&this.canvas&&t===this.canvas.contextTop,i=this.calcTransformMatrix(!e);t.transform(i[0],i[1],i[2],i[3],i[4],i[5])}getObjectScaling(){if(!this.group)return new gt(Math.abs(this.scaleX),Math.abs(this.scaleY));let t=Bt(this.calcTransformMatrix());return new gt(Math.abs(t.scaleX),Math.abs(t.scaleY))}getTotalObjectScaling(){let t=this.getObjectScaling();if(this.canvas){let e=this.canvas.getZoom(),i=this.getCanvasRetinaScaling();return t.scalarMultiply(e*i)}return t}getObjectOpacity(){let t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t}_constrainScale(t){return Math.abs(t)<this.minScaleLimit?t<0?-this.minScaleLimit:this.minScaleLimit:0===t?1e-4:t}_set(t,e){"scaleX"!==t&&"scaleY"!==t||(e=this._constrainScale(e)),"scaleX"===t&&e<0?(this.flipX=!this.flipX,e*=-1):"scaleY"===t&&e<0?(this.flipY=!this.flipY,e*=-1):"shadow"!==t||!e||e instanceof Ri||(e=new Ri(e));let i=this[t]!==e;return this[t]=e,i&&this.constructor.cacheProperties.includes(t)&&(this.dirty=!0),this.parent&&(this.dirty||i&&this.constructor.stateProperties.includes(t))&&this.parent._set("dirty",!0),this}isNotVisible(){return 0===this.opacity||!this.width&&!this.height&&0===this.strokeWidth||!this.visible}render(t){this.isNotVisible()||this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),this.transform(t),this._setOpacity(t),this._setShadow(t),this.shouldCache()?(this.renderCache(),this.drawCacheOnCanvas(t)):(this._removeCacheCanvas(),this.drawObject(t,!1,{}),this.dirty=!1),t.restore())}drawSelectionBackground(t){}renderCache(t){if(t=t||{},this._cacheCanvas&&this._cacheContext||this._createCacheCanvas(),this.isCacheDirty()&&this._cacheContext){let{zoomX:e,zoomY:i,cacheTranslationX:r,cacheTranslationY:s}=this,{width:n,height:o}=this._cacheCanvas;this.drawObject(this._cacheContext,t.forClipping,{zoomX:e,zoomY:i,cacheTranslationX:r,cacheTranslationY:s,width:n,height:o,parentClipPaths:[]}),this.dirty=!1}}_removeCacheCanvas(){this._cacheCanvas=void 0,this._cacheContext=null}hasStroke(){return!!this.stroke&&"transparent"!==this.stroke&&0!==this.strokeWidth}hasFill(){return!!this.fill&&"transparent"!==this.fill}needsItsOwnCache(){return!!("stroke"===this.paintFirst&&this.hasFill()&&this.hasStroke()&&this.shadow)||!!this.clipPath}shouldCache(){return this.ownCaching=this.objectCaching&&(!this.parent||!this.parent.isOnACache())||this.needsItsOwnCache(),this.ownCaching}willDrawShadow(){return!!this.shadow&&(0!==this.shadow.offsetX||0!==this.shadow.offsetY)}drawClipPathOnCache(t,e,i){t.save(),e.inverted?t.globalCompositeOperation="destination-out":t.globalCompositeOperation="destination-in",t.setTransform(1,0,0,1,0,0),t.drawImage(i,0,0),t.restore()}drawObject(t,e,i){let r=this.fill,s=this.stroke;e?(this.fill="black",this.stroke="",this._setClippingProperties(t)):this._renderBackground(t),this.fire("before:render",{ctx:t}),this._render(t),this._drawClipPath(t,this.clipPath,i),this.fill=r,this.stroke=s}createClipPathLayer(t,e){let i=Tt(e),r=i.getContext("2d");if(r.translate(e.cacheTranslationX,e.cacheTranslationY),r.scale(e.zoomX,e.zoomY),t._cacheCanvas=i,e.parentClipPaths.forEach(t=>{t.transform(r)}),e.parentClipPaths.push(t),t.absolutePositioned){let t=Pt(this.calcTransformMatrix());r.transform(t[0],t[1],t[2],t[3],t[4],t[5])}return t.transform(r),t.drawObject(r,!0,e),i}_drawClipPath(t,e,i){if(!e)return;e._transformDone=!0;let r=this.createClipPathLayer(e,i);this.drawClipPathOnCache(t,e,r)}drawCacheOnCanvas(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)}isCacheDirty(t=!1){if(this.isNotVisible())return!1;let e=this._cacheCanvas,i=this._cacheContext;return!(!e||!i||t||!this._updateCacheCanvas())||!!(this.dirty||this.clipPath&&this.clipPath.absolutePositioned)&&(e&&i&&!t&&(i.save(),i.setTransform(1,0,0,1,0,0),i.clearRect(0,0,e.width,e.height),i.restore()),!0)}_renderBackground(t){if(!this.backgroundColor)return;let e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}_setOpacity(t){this.group&&!this.group._transformDone?t.globalAlpha=this.getObjectOpacity():t.globalAlpha*=this.opacity}_setStrokeStyles(t,e){let i=e.stroke;i&&(t.lineWidth=e.strokeWidth,t.lineCap=e.strokeLineCap,t.lineDashOffset=e.strokeDashOffset,t.lineJoin=e.strokeLineJoin,t.miterLimit=e.strokeMiterLimit,te(i)?"percentage"===i.gradientUnits||i.gradientTransform||i.patternTransform?this._applyPatternForTransformedGradient(t,i):(t.strokeStyle=i.toLive(t),this._applyPatternGradientTransform(t,i)):t.strokeStyle=e.stroke)}_setFillStyles(t,{fill:e}){e&&(te(e)?(t.fillStyle=e.toLive(t),this._applyPatternGradientTransform(t,e)):t.fillStyle=e)}_setClippingProperties(t){t.globalAlpha=1,t.strokeStyle="transparent",t.fillStyle="#000000"}_setLineDash(t,e){e&&0!==e.length&&t.setLineDash(e)}_setShadow(t){if(!this.shadow)return;let e=this.shadow,i=this.canvas,r=this.getCanvasRetinaScaling(),[s,,,n]=(null==i?void 0:i.viewportTransform)||I,o=s*r,a=n*r,l=e.nonScaling?new gt(1,1):this.getObjectScaling();t.shadowColor=e.color,t.shadowBlur=e.blur*y.browserShadowBlurConstant*(o+a)*(l.x+l.y)/4,t.shadowOffsetX=e.offsetX*o*l.x,t.shadowOffsetY=e.offsetY*a*l.y}_removeShadow(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)}_applyPatternGradientTransform(t,e){if(!te(e))return{offsetX:0,offsetY:0};let i=e.gradientTransform||e.patternTransform,r=-this.width/2+e.offsetX||0,s=-this.height/2+e.offsetY||0;return"percentage"===e.gradientUnits?t.transform(this.width,0,0,this.height,r,s):t.transform(1,0,0,1,r,s),i&&t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),{offsetX:r,offsetY:s}}_renderPaintInOrder(t){"stroke"===this.paintFirst?(this._renderStroke(t),this._renderFill(t)):(this._renderFill(t),this._renderStroke(t))}_render(t){}_renderFill(t){this.fill&&(t.save(),this._setFillStyles(t,this),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())}_renderStroke(t){if(this.stroke&&0!==this.strokeWidth){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this.strokeUniform){let e=this.getObjectScaling();t.scale(1/e.x,1/e.y)}this._setLineDash(t,this.strokeDashArray),this._setStrokeStyles(t,this),t.stroke(),t.restore()}}_applyPatternForTransformedGradient(t,e){var i;let r=this._limitCacheSize(this._getCacheCanvasDimensions()),s=this.getCanvasRetinaScaling(),n=r.x/this.scaleX/s,o=r.y/this.scaleY/s,a=Tt({width:Math.ceil(n),height:Math.ceil(o)}),l=a.getContext("2d");l&&(l.beginPath(),l.moveTo(0,0),l.lineTo(n,0),l.lineTo(n,o),l.lineTo(0,o),l.closePath(),l.translate(n/2,o/2),l.scale(r.zoomX/this.scaleX/s,r.zoomY/this.scaleY/s),this._applyPatternGradientTransform(l,e),l.fillStyle=e.toLive(t),l.fill(),t.translate(-this.width/2-this.strokeWidth/2,-this.height/2-this.strokeWidth/2),t.scale(s*this.scaleX/r.zoomX,s*this.scaleY/r.zoomY),t.strokeStyle=null==(i=l.createPattern(a,"no-repeat"))?"":i)}_findCenterFromElement(){return new gt(this.left+this.width/2,this.top+this.height/2)}clone(t){let e=this.toObject(t);return this.constructor.fromObject(e)}cloneAsImage(t){let e=this.toCanvasElement(t);return new(at.getClass("image"))(e)}toCanvasElement(t={}){let e=Me(this),i=this.group,r=this.shadow,s=Math.abs,n=t.enableRetinaScaling?D():1,o=(t.multiplier||1)*n,a=t.canvasProvider||(t=>new _e(t,{enableRetinaScaling:!1,renderOnAddRemove:!1,skipOffscreen:!1}));delete this.group,t.withoutTransform&&De(this),t.withoutShadow&&(this.shadow=null),t.viewportTransform&&Fe(this,this.getViewportTransform()),this.setCoords();let l=Ct(),h=this.getBoundingRect(),c=this.shadow,u=new gt;if(c){let t=c.blur,e=c.nonScaling?new gt(1,1):this.getObjectScaling();u.x=2*Math.round(s(c.offsetX)+t)*s(e.x),u.y=2*Math.round(s(c.offsetY)+t)*s(e.y)}let d=h.width+u.x,g=h.height+u.y;l.width=Math.ceil(d),l.height=Math.ceil(g);let f=a(l);"jpeg"===t.format&&(f.backgroundColor="#fff"),this.setPositionByOrigin(new gt(f.width/2,f.height/2),R,R);let p=this.canvas;f._objects=[this],this.set("canvas",f),this.setCoords();let m=f.toCanvasElement(o||1,t);return this.set("canvas",p),this.shadow=r,i&&(this.group=i),this.set(e),this.setCoords(),f._objects=[],f.destroy(),m}toDataURL(t={}){return Ot(this.toCanvasElement(t),t.format||"png",t.quality||1)}toBlob(t={}){return kt(this.toCanvasElement(t),t.format||"png",t.quality||1)}isType(...t){return t.includes(this.constructor.type)||t.includes(this.type)}complexity(){return 1}toJSON(){return this.toObject()}rotate(t){let{centeredRotation:e,originX:i,originY:r}=this;if(e){let{x:t,y:e}=this.getRelativeCenterPoint();this.originX=R,this.originY=R,this.left=t,this.top=e}if(this.set("angle",t),e){let{x:t,y:e}=this.getPositionByOrigin(i,r);this.left=t,this.top=e,this.originX=i,this.originY=r}}setOnGroup(){}_setupCompositeOperation(t){this.globalCompositeOperation&&(t.globalCompositeOperation=this.globalCompositeOperation)}dispose(){lt.cancelByTarget(this),this.off(),this._set("canvas",void 0),this._cacheCanvas&&T().dispose(this._cacheCanvas),this._cacheCanvas=void 0,this._cacheContext=null}animate(t,e){return Object.entries(t).reduce((t,[i,r])=>(t[i]=this._animate(i,r,e),t),{})}_animate(t,e,i={}){let r=t.split("."),s=this.constructor.colorProperties.includes(r[r.length-1]),{abort:n,startValue:o,onChange:a,onComplete:l}=i,h={...i,target:this,startValue:o??r.reduce((t,e)=>t[e],this),endValue:e,abort:null==n?void 0:n.bind(this),onChange:(t,e,i)=>{r.reduce((e,i,s)=>(s===r.length-1&&(e[i]=t),e[i]),this),a&&a(t,e,i)},onComplete:(t,e,i)=>{this.setCoords(),l&&l(t,e,i)}};return s?jr(h):Mr(h)}isDescendantOf(t){let{parent:e,group:i}=this;return e===t||i===t||!!e&&e.isDescendantOf(t)||!!i&&i!==e&&i.isDescendantOf(t)}getAncestors(){let t=[],e=this;do{e=e.parent,e&&t.push(e)}while(e);return t}findCommonAncestors(t){if(this===t)return{fork:[],otherFork:[],common:[this,...this.getAncestors()]};let e=this.getAncestors(),i=t.getAncestors();if(0===e.length&&i.length>0&&this===i[i.length-1])return{fork:[],otherFork:[t,...i.slice(0,i.length-1)],common:[this]};for(let r,s=0;s<e.length;s++){if(r=e[s],r===t)return{fork:[this,...e.slice(0,s)],otherFork:[],common:e.slice(s)};for(let n=0;n<i.length;n++){if(this===i[n])return{fork:[],otherFork:[t,...i.slice(0,n)],common:[this,...e]};if(r===i[n])return{fork:[this,...e.slice(0,s)],otherFork:[t,...i.slice(0,n)],common:e.slice(s)}}}return{fork:[this,...e],otherFork:[t,...i],common:[]}}hasCommonAncestors(t){let e=this.findCommonAncestors(t);return e&&!!e.common.length}isInFrontOf(t){if(this===t)return;let e=this.findCommonAncestors(t);if(e.fork.includes(t))return!0;if(e.otherFork.includes(this))return!1;let i=e.common[0]||this.canvas;if(!i)return;let r=e.fork.pop(),s=e.otherFork.pop(),n=i._objects.indexOf(r),o=i._objects.indexOf(s);return n>-1&&n>o}toObject(e=[]){let i,r=e.concat(t.customProperties,this.constructor.customProperties||[]),s=y.NUM_FRACTION_DIGITS,{clipPath:n,fill:o,stroke:a,shadow:l,strokeDashArray:h,left:c,top:u,originX:d,originY:g,width:f,height:p,strokeWidth:m,strokeLineCap:b,strokeDashOffset:_,strokeLineJoin:v,strokeUniform:x,strokeMiterLimit:C,scaleX:w,scaleY:S,angle:T,flipX:O,flipY:k,opacity:D,visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:F,skewX:L,skewY:I}=this;n&&!n.excludeFromExport&&(i=n.toObject(r.concat("inverted","absolutePositioned")));let R=t=>Qt(t,s),B={...Kt(this,r),type:this.constructor.type,version:j,originX:d,originY:g,left:R(c),top:R(u),width:R(f),height:R(p),fill:ee(o)?o.toObject():o,stroke:ee(a)?a.toObject():a,strokeWidth:R(m),strokeDashArray:h&&h.concat(),strokeLineCap:b,strokeDashOffset:_,strokeLineJoin:v,strokeUniform:x,strokeMiterLimit:R(C),scaleX:R(w),scaleY:R(S),angle:R(T),flipX:O,flipY:k,opacity:R(D),shadow:l&&l.toObject(),visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:F,skewX:R(L),skewY:R(I),...i?{clipPath:i}:null};return this.includeDefaultValues?B:this._removeDefaultValues(B)}toDatalessObject(t){return this.toObject(t)}_removeDefaultValues(t){let e=this.constructor.getDefaults(),i=Object.keys(e).length>0?e:Object.getPrototypeOf(this);return Jt(t,(t,e)=>{if("left"===e||"top"===e||"type"===e)return!0;let r=i[e];return t!==r&&!(Array.isArray(t)&&Array.isArray(r)&&0===t.length&&0===r.length)})}toString(){return`#<${this.constructor.type}>`}static _fromObject({type:t,...e},{extraParam:i,...r}={}){return qt(e,r).then(t=>i?(delete t[i],new this(e[i],t)):new this(t))}static fromObject(t,e){return this._fromObject(t,e)}};p(Ar,"stateProperties",$i),p(Ar,"cacheProperties",Xi),p(Ar,"ownDefaults",Yi),p(Ar,"type","FabricObject"),p(Ar,"colorProperties",[it,rt,"backgroundColor"]),p(Ar,"customProperties",[]),at.setClass(Ar),at.setClass(Ar,"object");const Fr=(t,e)=>{var i;let{transform:{target:r}}=e;null==(i=r.canvas)||i.fire(`object:${t}`,{...e,target:r}),r.fire(t,e)},Lr=(t,e,i)=>(r,s,n,o)=>{let a=e(r,s,n,o);return a&&Fr(t,{...Ze(r,s,n,o),...i}),a};function Ir(t){return(e,i,r,s)=>{let{target:n,originX:o,originY:a}=i,l=n.getPositionByOrigin(o,a),h=t(e,i,r,s);return n.setPositionByOrigin(l,i.originX,i.originY),h}}const Rr=(t,e,i,r)=>(s,n,o,a)=>{let l=ei(n,n.originX,n.originY,o,a)[i],h=Ie(n[e]);if(0===h||h>0&&l<0||h<0&&l>0){let{target:e}=n,i=e.strokeWidth/(e.strokeUniform?e[r]:1),s=Ke(n)?2:1,o=e[t],a=Math.abs(l*s/e[r])-i;return e.set(t,Math.max(a,1)),o!==e[t]}return!1},Br=Rr("width","originX","x","scaleX"),$r=Rr("height","originY","y","scaleY"),Xr=Lr(U,Ir(Br)),Yr=Lr(U,Ir($r));function Wr(t,e,i,r,s){t.save();let{stroke:n,xSize:o,ySize:a,opName:l}=this.commonRenderProps(t,e,i,s,r),h=o;o>a?t.scale(1,a/o):a>o&&(h=a,t.scale(o/a,1)),t.beginPath(),t.arc(0,0,h/2,0,F,!1),t[l](),n&&t.stroke(),t.restore()}function Nr(t,e,i,r,s){t.save();let{stroke:n,xSize:o,ySize:a,opName:l}=this.commonRenderProps(t,e,i,s,r),h=o/2,c=a/2;t[`${l}Rect`](-h,-c,o,a),n&&t.strokeRect(-h,-c,o,a),t.restore()}var Vr=class{constructor(t){p(this,"visible",!0),p(this,"actionName",J),p(this,"angle",0),p(this,"x",0),p(this,"y",0),p(this,"offsetX",0),p(this,"offsetY",0),p(this,"sizeX",0),p(this,"sizeY",0),p(this,"touchSizeX",0),p(this,"touchSizeY",0),p(this,"cursorStyle","crosshair"),p(this,"withConnection",!1),Object.assign(this,t)}getTransformAnchorPoint(){var t;return null==(t=this.transformAnchorPoint)?new gt(.5-this.x,.5-this.y):t}shouldActivate(t,e,i,{tl:r,tr:s,br:n,bl:o}){var a;return(null==(a=e.canvas)?void 0:a.getActiveObject())===e&&e.isControlVisible(t)&&Er.isPointInPolygon(i,[r,s,n,o])}getActionHandler(t,e,i){return this.actionHandler}getMouseDownHandler(t,e,i){return this.mouseDownHandler}getMouseUpHandler(t,e,i){return this.mouseUpHandler}cursorStyleHandler(t,e,i,r){return e.cursorStyle}getActionName(t,e,i){return e.actionName}getVisibility(t,e){var i,r;return null==(i=null==(r=t._controlsVisibility)?void 0:r[e])?this.visible:i}setVisibility(t,e,i){this.visible=t}positionHandler(t,e,i,r){return new gt(this.x*t.x+this.offsetX,this.y*t.y+this.offsetY).transform(e)}calcCornerCoords(t,e,i,r,s,n){let o=Ft([$t(i,r),Xt({angle:t}),Yt((s?this.touchSizeX:this.sizeX)||e,(s?this.touchSizeY:this.sizeY)||e)]);return{tl:new gt(-.5,-.5).transform(o),tr:new gt(.5,-.5).transform(o),br:new gt(.5,.5).transform(o),bl:new gt(-.5,.5).transform(o)}}commonRenderProps(t,e,i,r,s={}){let{cornerSize:n,cornerColor:o,transparentCorners:a,cornerStrokeColor:l}=s,h=n||r.cornerSize,c=this.sizeX||h,u=this.sizeY||h,d=void 0===a?r.transparentCorners:a,g=d?rt:it,f=l||r.cornerStrokeColor,p=!d&&!!f;return t.fillStyle=o||r.cornerColor||"",t.strokeStyle=f||"",t.translate(e,i),t.rotate(Dt(r.getTotalAngle())),{stroke:p,xSize:c,ySize:u,transparentCorners:d,opName:g}}render(t,e,i,r,s){"circle"===((r=r||{}).cornerStyle||s.cornerStyle)?Wr.call(this,t,e,i,r,s):Nr.call(this,t,e,i,r,s)}};const zr=(t,e,i)=>i.lockRotation?qe:e.cursorStyle,Hr=Lr(z,Ir((t,{target:e,ex:i,ey:r,theta:s,originX:n,originY:o},a,l)=>{let h=e.getPositionByOrigin(n,o);if(Qe(e,"lockRotation"))return!1;let c=Math.atan2(r-h.y,i-h.x),u=Mt(Math.atan2(l-h.y,a-h.x)-c+s);if(e.snapAngle&&e.snapAngle>0){let t=e.snapAngle,i=e.snapThreshold||t,r=Math.ceil(u/t)*t,s=Math.floor(u/t)*t;Math.abs(u-s)<i?u=s:Math.abs(u-r)<i&&(u=r)}u<0&&(u=360+u),u%=360;let d=e.angle!==u;return e.angle=u,d}));function Gr(t,e){let i=e.canvas,r=t[i.uniScaleKey];return i.uniformScaling&&!r||!i.uniformScaling&&r}function Ur(t,e,i){let r=Qe(t,"lockScalingX"),s=Qe(t,"lockScalingY");if(r&&s||!e&&(r||s)&&i||r&&"x"===e||s&&"y"===e)return!0;let{width:n,height:o,strokeWidth:a}=t;return 0===n&&0===a&&"y"!==e||0===o&&0===a&&"x"!==e}const qr=["e","se","s","sw","w","nw","n","ne","e"],Kr=(t,e,i,r)=>{let s=Gr(t,i);return Ur(i,0!==e.x&&0===e.y?"x":0===e.x&&0!==e.y?"y":"",s)?qe:`${qr[ti(i,0,r)]}-resize`};function Jr(t,e,i,r,s={}){let n,o,a,l,h,c,u=e.target,d=s.by,g=Gr(t,u);if(Ur(u,d,g))return!1;if(e.gestureScale)o=e.scaleX*e.gestureScale,a=e.scaleY*e.gestureScale;else{if(n=ei(e,e.originX,e.originY,i,r),h="y"===d?1:Math.sign(n.x||e.signX||1),c="x"===d?1:Math.sign(n.y||e.signY||1),e.signX||(e.signX=h),e.signY||(e.signY=c),Qe(u,"lockScalingFlip")&&(e.signX!==h||e.signY!==c))return!1;if(l=u._getTransformedDimensions(),g&&!d){let t=Math.abs(n.x)+Math.abs(n.y),{original:i}=e,r=t/(Math.abs(l.x*i.scaleX/u.scaleX)+Math.abs(l.y*i.scaleY/u.scaleY));o=i.scaleX*r,a=i.scaleY*r}else o=Math.abs(n.x*u.scaleX/l.x),a=Math.abs(n.y*u.scaleY/l.y);Ke(e)&&(o*=2,a*=2),e.signX!==h&&"y"!==d&&(e.originX=Je(e.originX),o*=-1,e.signX=h),e.signY!==c&&"x"!==d&&(e.originY=Je(e.originY),a*=-1,e.signY=c)}let f=u.scaleX,p=u.scaleY;return d?("x"===d&&u.set("scaleX",o),"y"===d&&u.set("scaleY",a)):(!Qe(u,"lockScalingX")&&u.set("scaleX",o),!Qe(u,"lockScalingY")&&u.set("scaleY",a)),f!==u.scaleX||p!==u.scaleY}const Qr=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r))),Zr=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r,{by:"x"}))),ts=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r,{by:"y"}))),es={x:{counterAxis:"y",scale:Q,skew:tt,lockSkewing:"lockSkewingX",origin:"originX",flip:"flipX"},y:{counterAxis:"x",scale:Z,skew:et,lockSkewing:"lockSkewingY",origin:"originY",flip:"flipY"}},is=["ns","nesw","ew","nwse"],rs=(t,e,i,r)=>0!==e.x&&Qe(i,"lockSkewingY")||0!==e.y&&Qe(i,"lockSkewingX")?qe:`${is[ti(i,0,r)%4]}-resize`;function ss(t,e,i,r,s){let{target:n}=i,{counterAxis:o,origin:a,lockSkewing:l,skew:h,flip:c}=es[t];if(Qe(n,l))return!1;let{origin:u,flip:d}=es[o],g=Ie(i[u])*(n[d]?-1:1),f=-Math.sign(g)*(n[c]?-1:1),p=-(0===n[h]&&ei(i,"center","center",r,s)[t]>0||n[h]>0?1:-1)*f*.5+.5;return Lr(G,Ir((e,i,r,s)=>function(t,{target:e,ex:i,ey:r,skewingSide:s,...n},o){let{skew:a}=es[t],l=o.subtract(new gt(i,r)).divide(new gt(e.scaleX,e.scaleY))[t],h=e[a],c=n[a],u=Math.tan(Dt(c)),d="y"===t?e._getTransformedDimensions({scaleX:1,scaleY:1,skewX:0}).x:e._getTransformedDimensions({scaleX:1,scaleY:1}).y,g=2*l*s/Math.max(d,1)+u,f=Mt(Math.atan(g));e.set(a,f);let p=h!==e[a];if(p&&"y"===t){let{skewX:t,scaleX:i}=e,r=e._getTransformedDimensions({skewY:h}),s=e._getTransformedDimensions(),n=0===t?1:r.x/s.x;1!==n&&e.set("scaleX",n*i)}return p}(t,i,new gt(r,s))))(e,{...i,[a]:p,skewingSide:f},r,s)}const ns=(t,e,i,r)=>ss("x",t,e,i,r),os=(t,e,i,r)=>ss("y",t,e,i,r);function as(t,e){return t[e.canvas.altActionKey]}const ls=(t,e,i)=>{let r=as(t,i);return 0===e.x?r?tt:Z:0===e.y?r?et:Q:""},hs=(t,e,i,r)=>as(t,i)?rs(0,e,i,r):Kr(t,e,i,r),cs=(t,e,i,r)=>as(t,e.target)?os(t,e,i,r):Zr(t,e,i,r),us=(t,e,i,r)=>as(t,e.target)?ns(t,e,i,r):ts(t,e,i,r),ds=()=>({ml:new Vr({x:-.5,y:0,cursorStyleHandler:hs,actionHandler:cs,getActionName:ls}),mr:new Vr({x:.5,y:0,cursorStyleHandler:hs,actionHandler:cs,getActionName:ls}),mb:new Vr({x:0,y:.5,cursorStyleHandler:hs,actionHandler:us,getActionName:ls}),mt:new Vr({x:0,y:-.5,cursorStyleHandler:hs,actionHandler:us,getActionName:ls}),tl:new Vr({x:-.5,y:-.5,cursorStyleHandler:Kr,actionHandler:Qr}),tr:new Vr({x:.5,y:-.5,cursorStyleHandler:Kr,actionHandler:Qr}),bl:new Vr({x:-.5,y:.5,cursorStyleHandler:Kr,actionHandler:Qr}),br:new Vr({x:.5,y:.5,cursorStyleHandler:Kr,actionHandler:Qr}),mtr:new Vr({x:0,y:-.5,actionHandler:Hr,cursorStyleHandler:zr,offsetY:-40,withConnection:!0,actionName:H})}),gs=()=>({mr:new Vr({x:.5,y:0,actionHandler:Xr,cursorStyleHandler:hs,actionName:U}),ml:new Vr({x:-.5,y:0,actionHandler:Xr,cursorStyleHandler:hs,actionName:U})}),fs=()=>({...ds(),...gs()});var ps=class t extends Ar{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,this.constructor.createControls(),t.ownDefaults),this.setOptions(e)}static createControls(){return{controls:ds()}}_updateCacheCanvas(){let t=this.canvas;if(this.noScaleCache&&t&&t._currentTransform){let e=t._currentTransform,i=e.target,r=e.action;if(this===i&&r&&r.startsWith("scale"))return!1}return super._updateCacheCanvas()}getActiveControl(){let t=this.__corner;return t?{key:t,control:this.controls[t],coord:this.oCoords[t]}:void 0}findControl(t,e=!1){if(!this.hasControls||!this.canvas)return;this.__corner=void 0;let i=Object.entries(this.oCoords);for(let r=i.length-1;r>=0;r--){let[s,n]=i[r],o=this.controls[s];if(o.shouldActivate(s,this,t,e?n.touchCorner:n.corner))return this.__corner=s,{key:s,control:o,coord:this.oCoords[s]}}}calcOCoords(){let t=this.getViewportTransform(),e=It(t),i=Rt(t),r=this.getCenterPoint(),s=At(At(t,At($t(r.x,r.y),Xt({angle:this.getTotalAngle()-(this.group&&this.flipX?180:0)}))),[1/e,0,0,1/i,0,0]),n=this.group?Bt(this.calcTransformMatrix()):void 0;n&&(n.scaleX=Math.abs(n.scaleX),n.scaleY=Math.abs(n.scaleY));let o=this._calculateCurrentDimensions(n),a={};return this.forEachControl((t,e)=>{let i=t.positionHandler(o,s,this,t);a[e]=Object.assign(i,this._calcCornerCoords(t,i))}),a}_calcCornerCoords(t,e){let i=this.getTotalAngle();return{corner:t.calcCornerCoords(i,this.cornerSize,e.x,e.y,!1,this),touchCorner:t.calcCornerCoords(i,this.touchCornerSize,e.x,e.y,!0,this)}}setCoords(){super.setCoords(),this.canvas&&(this.oCoords=this.calcOCoords())}forEachControl(t){for(let e in this.controls)t(this.controls[e],e,this)}drawSelectionBackground(t){if(!this.selectionBackgroundColor||this.canvas&&this.canvas._activeObject!==this)return;t.save();let e=this.getRelativeCenterPoint(),i=this._calculateCurrentDimensions(),r=this.getViewportTransform();t.translate(e.x,e.y),t.scale(1/r[0],1/r[3]),t.rotate(Dt(this.angle)),t.fillStyle=this.selectionBackgroundColor,t.fillRect(-i.x/2,-i.y/2,i.x,i.y),t.restore()}strokeBorders(t,e){t.strokeRect(-e.x/2,-e.y/2,e.x,e.y)}_drawBorders(t,e,i={}){let r={hasControls:this.hasControls,borderColor:this.borderColor,borderDashArray:this.borderDashArray,...i};t.save(),t.strokeStyle=r.borderColor,this._setLineDash(t,r.borderDashArray),this.strokeBorders(t,e),r.hasControls&&this.drawControlsConnectingLines(t,e),t.restore()}_renderControls(t,e={}){let{hasBorders:i,hasControls:r}=this,s={hasBorders:i,hasControls:r,...e},n=this.getViewportTransform(),o=s.hasBorders,a=s.hasControls,l=Bt(At(n,this.calcTransformMatrix()));t.save(),t.translate(l.translateX,l.translateY),t.lineWidth=this.borderScaleFactor,this.group===this.parent&&(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),this.flipX&&(l.angle-=180);let h=Lt(n);t.rotate(this.group?Dt(l.angle):Dt(this.angle)+h),o&&this.drawBorders(t,l,e),a&&this.drawControls(t,e),t.restore()}drawBorders(t,e,i){let r;if(i&&i.forActiveSelection||this.group){let t=je(this.width,this.height,zt(e)),i=this.isStrokeAccountedForInDimensions()?ft:(this.strokeUniform?(new gt).scalarAdd(this.canvas?this.canvas.getZoom():1):new gt(e.scaleX,e.scaleY)).scalarMultiply(this.strokeWidth);r=t.add(i).scalarAdd(this.borderScaleFactor).scalarAdd(2*this.padding)}else r=this._calculateCurrentDimensions().scalarAdd(this.borderScaleFactor);this._drawBorders(t,r,i)}drawControlsConnectingLines(t,e){let i=!1;t.beginPath(),this.forEachControl((r,s)=>{r.withConnection&&r.getVisibility(this,s)&&(i=!0,t.moveTo(r.x*e.x,r.y*e.y),t.lineTo(r.x*e.x+r.offsetX,r.y*e.y+r.offsetY))}),i&&t.stroke()}drawControls(t,e={}){t.save();let i=this.getCanvasRetinaScaling(),{cornerStrokeColor:r,cornerDashArray:s,cornerColor:n}=this,o={cornerStrokeColor:r,cornerDashArray:s,cornerColor:n,...e};t.setTransform(i,0,0,i,0,0),t.strokeStyle=t.fillStyle=o.cornerColor,this.transparentCorners||(t.strokeStyle=o.cornerStrokeColor),this._setLineDash(t,o.cornerDashArray),this.forEachControl((e,i)=>{if(e.getVisibility(this,i)){let r=this.oCoords[i];e.render(t,r.x,r.y,o,this)}}),t.restore()}isControlVisible(t){return this.controls[t]&&this.controls[t].getVisibility(this,t)}setControlVisible(t,e){this._controlsVisibility||(this._controlsVisibility={}),this._controlsVisibility[t]=e}setControlsVisibility(t={}){Object.entries(t).forEach(([t,e])=>this.setControlVisible(t,e))}clearContextTop(t){if(!this.canvas)return;let e=this.canvas.contextTop;if(!e)return;let i=this.canvas.viewportTransform;e.save(),e.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this.transform(e);let r=this.width+4,s=this.height+4;return e.clearRect(-r/2,-s/2,r,s),t||e.restore(),e}onDeselect(t){return!1}onSelect(t){return!1}shouldStartDragging(t){return!1}onDragStart(t){return!1}canDrop(t){return!1}renderDragSourceEffect(t){}renderDropTargetEffect(t){}};function ms(t,e){return e.forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(i=>{"constructor"!==i&&Object.defineProperty(t.prototype,i,Object.getOwnPropertyDescriptor(e.prototype,i)||Object.create(null))})}),t}p(ps,"ownDefaults",{noScaleCache:!0,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,cornerSize:13,touchCornerSize:24,transparentCorners:!0,cornerColor:"rgb(178,204,255)",cornerStrokeColor:"",cornerStyle:"rect",cornerDashArray:null,hasControls:!0,borderColor:"rgb(178,204,255)",borderDashArray:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,hasBorders:!0,selectionBackgroundColor:"",selectable:!0,evented:!0,perPixelTargetFind:!1,activeOn:"down",hoverCursor:null,moveCursor:null});var ys=class extends ps{};ms(ys,[bi]),at.setClass(ys),at.setClass(ys,"object");const bs=(t,e,i,r)=>{let s=2*(r=Math.round(r))+1,{data:n}=t.getImageData(e-r,i-r,s,s);for(let t=3;t<n.length;t+=4)if(n[t]>0)return!1;return!0};var _s=class{constructor(t){this.options=t,this.strokeProjectionMagnitude=this.options.strokeWidth/2,this.scale=new gt(this.options.scaleX,this.options.scaleY),this.strokeUniformScalar=this.options.strokeUniform?new gt(1/this.options.scaleX,1/this.options.scaleY):new gt(1,1)}createSideVector(t,e){let i=Xe(t,e);return this.options.strokeUniform?i.multiply(this.scale):i}projectOrthogonally(t,e,i){return this.applySkew(t.add(this.calcOrthogonalProjection(t,e,i)))}isSkewed(){return 0!==this.options.skewX||0!==this.options.skewY}applySkew(t){let e=new gt(t);return e.y+=e.x*Math.tan(Dt(this.options.skewY)),e.x+=e.y*Math.tan(Dt(this.options.skewX)),e}scaleUnitVector(t,e){return t.multiply(this.strokeUniformScalar).scalarMultiply(e)}};const vs=new gt;var xs=class t extends _s{static getOrthogonalRotationFactor(t,e){let i=e?We(t,e):Ne(t);return Math.abs(i)<P?-1:1}constructor(t,e,i,r){super(r),p(this,"AB",void 0),p(this,"AC",void 0),p(this,"alpha",void 0),p(this,"bisector",void 0),this.A=new gt(t),this.B=new gt(e),this.C=new gt(i),this.AB=this.createSideVector(this.A,this.B),this.AC=this.createSideVector(this.A,this.C),this.alpha=We(this.AB,this.AC),this.bisector=Ve($e(this.AB.eq(vs)?this.AC:this.AB,this.alpha/2))}calcOrthogonalProjection(e,i,r=this.strokeProjectionMagnitude){let s=ze(this.createSideVector(e,i)),n=t.getOrthogonalRotationFactor(s,this.bisector);return this.scaleUnitVector(s,r*n)}projectBevel(){let t=[];return(this.alpha%F===0?[this.B]:[this.B,this.C]).forEach(e=>{t.push(this.projectOrthogonally(this.A,e)),t.push(this.projectOrthogonally(this.A,e,-this.strokeProjectionMagnitude))}),t}projectMiter(){let t=[],e=Math.abs(this.alpha),i=1/Math.sin(e/2),r=this.scaleUnitVector(this.bisector,-this.strokeProjectionMagnitude*i),s=this.options.strokeUniform?Ye(this.scaleUnitVector(this.bisector,this.options.strokeMiterLimit)):this.options.strokeMiterLimit;return Ye(r)/this.strokeProjectionMagnitude<=s&&t.push(this.applySkew(this.A.add(r))),t.push(...this.projectBevel()),t}projectRoundNoSkew(e,i){let r=[],s=new gt(t.getOrthogonalRotationFactor(this.bisector),t.getOrthogonalRotationFactor(new gt(this.bisector.y,this.bisector.x)));return[new gt(1,0).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(s),new gt(0,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(s)].forEach(t=>{Ue(t,e,i)&&r.push(this.A.add(t))}),r}projectRoundWithSkew(t,e){let i=[],{skewX:r,skewY:s,scaleX:n,scaleY:o,strokeUniform:a}=this.options,l=new gt(Math.tan(Dt(r)),Math.tan(Dt(s))),h=this.strokeProjectionMagnitude,c=a?h/o/Math.sqrt(1/o**2+1/n**2*l.y**2):h/Math.sqrt(1+l.y**2),u=new gt(Math.sqrt(Math.max(h**2-c**2,0)),c),d=a?h/Math.sqrt(1+l.x**2*(1/o)**2/(1/n+1/n*l.x*l.y)**2):h/Math.sqrt(1+l.x**2/(1+l.x*l.y)**2),g=new gt(d,Math.sqrt(Math.max(h**2-d**2,0)));return[g,g.scalarMultiply(-1),u,u.scalarMultiply(-1)].map(t=>this.applySkew(a?t.multiply(this.strokeUniformScalar):t)).forEach(r=>{Ue(r,t,e)&&i.push(this.applySkew(this.A).add(r))}),i}projectRound(){let t=[];t.push(...this.projectBevel());let e=this.alpha%F===0,i=this.applySkew(this.A),r=t[e?0:2].subtract(i),s=t[+!!e].subtract(i),n=He(r,e?this.applySkew(this.AB.scalarMultiply(-1)):this.applySkew(this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1)))>0,o=n?r:s,a=n?s:r;return this.isSkewed()?t.push(...this.projectRoundWithSkew(o,a)):t.push(...this.projectRoundNoSkew(o,a)),t}projectPoints(){switch(this.options.strokeLineJoin){case"miter":return this.projectMiter();case"round":return this.projectRound();default:return this.projectBevel()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t,angle:this.alpha,bisector:this.bisector}))}},Cs=class extends _s{constructor(t,e,i){super(i),this.A=new gt(t),this.T=new gt(e)}calcOrthogonalProjection(t,e,i=this.strokeProjectionMagnitude){let r=this.createSideVector(t,e);return this.scaleUnitVector(ze(r),i)}projectButt(){return[this.projectOrthogonally(this.A,this.T,this.strokeProjectionMagnitude),this.projectOrthogonally(this.A,this.T,-this.strokeProjectionMagnitude)]}projectRound(){let t=[];if(!this.isSkewed()&&this.A.eq(this.T)){let e=new gt(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.applySkew(this.A.add(e)),this.applySkew(this.A.subtract(e)))}else t.push(...new xs(this.A,this.T,this.T,this.options).projectRound());return t}projectSquare(){let t=[];if(this.A.eq(this.T)){let e=new gt(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.A.add(e),this.A.subtract(e))}else{let e=this.calcOrthogonalProjection(this.A,this.T,this.strokeProjectionMagnitude),i=this.scaleUnitVector(Ve(this.createSideVector(this.A,this.T)),-this.strokeProjectionMagnitude),r=this.A.add(i);t.push(r.add(e),r.subtract(e))}return t.map(t=>this.applySkew(t))}projectPoints(){switch(this.options.strokeLineCap){case"round":return this.projectRound();case"square":return this.projectSquare();default:return this.projectButt()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t}))}};const ws=(t,e,i=!1)=>{let r=[];if(0===t.length)return r;let s=t.reduce((t,e)=>(t[t.length-1].eq(e)||t.push(new gt(e)),t),[new gt(t[0])]);if(1===s.length)i=!0;else if(!i){let t=s[0],e=((t,e)=>{for(let i=t.length-1;i>=0;i--)if(e(t[i]))return i;return-1})(s,e=>!e.eq(t));s.splice(e+1)}return s.forEach((t,s,n)=>{let o,a;0===s?(a=n[1],o=i?t:n[n.length-1]):s===n.length-1?(o=n[s-1],a=i?t:n[0]):(o=n[s-1],a=n[s+1]),i&&1===n.length?r.push(...new Cs(t,t,e).project()):!i||0!==s&&s!==n.length-1?r.push(...new xs(t,o,a,e).project()):r.push(...new Cs(t,0===s?a:o,e).project())}),r},Ss=t=>{let e={};return Object.keys(t).forEach(i=>{e[i]={},Object.keys(t[i]).forEach(r=>{e[i][r]={...t[i][r]}})}),e},Ts=(t,e,i=!1)=>t.fill!==e.fill||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth||t.fontSize!==e.fontSize||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.textDecorationThickness!==e.textDecorationThickness||t.textDecorationColor!==e.textDecorationColor||t.textBackgroundColor!==e.textBackgroundColor||t.deltaY!==e.deltaY||i&&(t.overline!==e.overline||t.underline!==e.underline||t.linethrough!==e.linethrough),Os=(t,e)=>{let i=e.split("\n"),r=[],s=-1,n={};t=Ss(t);for(let e=0;e<i.length;e++){let o=me(i[e]);if(t[e])for(let i=0;i<o.length;i++){s++;let o=t[e][i];o&&Object.keys(o).length>0&&(Ts(n,o,!0)?r.push({start:s,end:s+1,style:o}):r[r.length-1].end++),n=o||{}}else s+=o.length,n={}}return r},ks=(t,e)=>{if(!Array.isArray(t))return Ss(t);let i=e.split(W),r={},s=-1,n=0;for(let e=0;e<i.length;e++){let o=me(i[e]);for(let i=0;i<o.length;i++)s++,t[n]&&t[n].start<=s&&s<t[n].end&&(r[e]=r[e]||{},r[e][i]={...t[n].style},s===t[n].end-1&&n++)}return r},Ds=["display","transform",it,"fill-opacity","fill-rule","opacity",rt,"stroke-dasharray","stroke-linecap","stroke-dashoffset","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","id","paint-order","vector-effect","instantiated_by_use","clip-path"];function Ms(t,e){let i,r=t.nodeName,s=t.getAttribute("class"),n=t.getAttribute("id"),o="(?![a-zA-Z\\-]+)";if(i=RegExp("^"+r,"i"),e=e.replace(i,""),n&&e.length&&(i=RegExp("#"+n+o,"i"),e=e.replace(i,"")),s&&e.length){let t=s.split(" ");for(let r=t.length;r--;)i=RegExp("\\."+t[r]+o,"i"),e=e.replace(i,"")}return 0===e.length}function js(t,e){let i=!0,r=Ms(t,e.pop());return r&&e.length&&(i=function(t,e){let i,r=!0;for(;t.parentElement&&1===t.parentElement.nodeType&&e.length;)r&&(i=e.pop()),r=Ms(t=t.parentElement,i);return 0===e.length}(t,e)),r&&i&&0===e.length}function Es(t,e={}){let i={};for(let r in e)js(t,r.split(" "))&&(i={...i,...e[r]});return i}const Ps=t=>{var e;return null==(e=Ei[t])?t:e},As=RegExp(`(${Di})`,"gi"),Fs=`(${Di})`,Ls=String.raw`(skewX)\(${Fs}\)`,Is=String.raw`(skewY)\(${Fs}\)`,Rs=String.raw`(rotate)\(${Fs}(?: ${Fs} ${Fs})?\)`,Bs=String.raw`(scale)\(${Fs}(?: ${Fs})?\)`,$s=String.raw`(translate)\(${Fs}(?: ${Fs})?\)`,Xs=`(?:${String.raw`(matrix)\(${Fs} ${Fs} ${Fs} ${Fs} ${Fs} ${Fs}\)`}|${$s}|${Rs}|${Bs}|${Ls}|${Is})`,Ys=`(?:${Xs}*)`,Ws=String.raw`^\s*(?:${Ys}?)\s*$`,Ns=new RegExp(Ws),Vs=new RegExp(Xs),zs=new RegExp(Xs,"g");function Hs(t){let e=[];if(!(t=(t=>oi(t.replace(As," $1 ").replace(/,/gi," ")))(t).replace(/\s*([()])\s*/gi,"$1"))||t&&!Ns.test(t))return[...I];for(let i of t.matchAll(zs)){let t=Vs.exec(i[0]);if(!t)continue;let r=I,[,s,...n]=t.filter(t=>!!t),[o,a,l,h,c,u]=n.map(t=>parseFloat(t));switch(s){case"translate":r=$t(o,a);break;case H:r=Xt({angle:o},{x:a,y:l});break;case J:r=Yt(o,a);break;case tt:r=Nt(o);break;case et:r=Vt(o);break;case"matrix":r=[o,a,l,h,c,u]}e.push(r)}return Ft(e)}function Gs(t,e,i,r){let s,n=Array.isArray(e),o=e;if("fill"!==t&&"stroke"!==t||"none"!==e){if("strokeUniform"===t)return"non-scaling-stroke"===e;if("strokeDashArray"===t)o="none"===e?null:e.replace(/,/g," ").split(/\s+/).map(parseFloat);else if("transformMatrix"===t)o=i&&i.transformMatrix?At(i.transformMatrix,Hs(e)):Hs(e);else if("visible"===t)o="none"!==e&&"hidden"!==e,i&&!1===i.visible&&(o=!1);else if("opacity"===t)o=parseFloat(e),i&&void 0!==i.opacity&&(o*=i.opacity);else if("textAnchor"===t)o="start"===e?B:"end"===e?X:R;else if("charSpacing"===t||"textDecorationThickness"===t)s=pi(e,r)/r*1e3;else if("paintFirst"===t){let t=e.indexOf(it),i=e.indexOf(rt);o=it,(t>-1&&i>-1&&i<t||-1===t&&i>-1)&&(o=rt)}else{if("href"===t||"xlink:href"===t||"font"===t||"id"===t)return e;if("imageSmoothing"===t)return"optimizeQuality"===e;s=n?e.map(pi):pi(e,r)}}else o="";return!n&&isNaN(s)?o:s}function Us(t){let e={},i=t.getAttribute("style");return i&&("string"==typeof i?function(t,e){t.replace(/;\s*$/,"").split(";").forEach(t=>{if(!t)return;let[i,r]=t.split(":");e[i.trim().toLowerCase()]=r.trim()})}(i,e):function(t,e){Object.entries(t).forEach(([t,i])=>{void 0!==i&&(e[t.toLowerCase()]=i)})}(i,e)),e}const qs={stroke:"strokeOpacity",fill:"fillOpacity"};function Ks(t,e,i){if(!t)return{};let r,s={},n=16;t.parentNode&&Fi.test(t.parentNode.nodeName)&&(s=Ks(t.parentElement,e,i),s.fontSize&&(r=n=pi(s.fontSize)));let o={...e.reduce((e,i)=>{let r=t.getAttribute(i);return r&&(e[i]=r),e},{}),...Es(t,i),...Us(t)};o["clip-path"]&&t.setAttribute(Ai,o[Ai]),o["font-size"]&&(r=pi(o[Pi],n),o[Pi]=`${r}`);let a={};for(let t in o){let e=Ps(t);a[e]=Gs(e,o[t],s,r)}a&&a.font&&function(t,e){let i=t.match(ji);if(!i)return;let r=i[1],s=i[3],n=i[4],o=i[5],a=i[6];r&&(e.fontStyle=r),s&&(e.fontWeight=isNaN(parseFloat(s))?s:parseFloat(s)),n&&(e.fontSize=pi(n)),a&&(e.fontFamily=a),o&&(e.lineHeight="normal"===o?1:o)}(a.font,a);let l={...s,...a};return Fi.test(t.nodeName)?l:function(t){let e=ys.getDefaults();return Object.entries(qs).forEach(([i,r])=>{if(void 0===t[r]||""===t[i])return;if(void 0===t[i]){if(!e[i])return;t[i]=e[i]}if(0===t[i].indexOf("url("))return;let s=new gi(t[i]);t[i]=s.setAlpha(Qt(s.getAlpha()*t[r],2)).toRgba()}),t}(l)}const Js=["rx","ry"];var Qs=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e),this._initRxRy()}_initRxRy(){let{rx:t,ry:e}=this;t&&!e?this.ry=t:e&&!t&&(this.rx=e)}_render(t){let{width:e,height:i}=this,r=-e/2,s=-i/2,n=this.rx?Math.min(this.rx,e/2):0,o=this.ry?Math.min(this.ry,i/2):0,a=0!==n||0!==o;t.beginPath(),t.moveTo(r+n,s),t.lineTo(r+e-n,s),a&&t.bezierCurveTo(r+e-.4477152502*n,s,r+e,s+.4477152502*o,r+e,s+o),t.lineTo(r+e,s+i-o),a&&t.bezierCurveTo(r+e,s+i-.4477152502*o,r+e-.4477152502*n,s+i,r+e-n,s+i),t.lineTo(r+n,s+i),a&&t.bezierCurveTo(r+.4477152502*n,s+i,r,s+i-.4477152502*o,r,s+i-o),t.lineTo(r,s+o),a&&t.bezierCurveTo(r,s+.4477152502*o,r+.4477152502*n,s,r+n,s),t.closePath(),this._renderPaintInOrder(t)}toObject(t=[]){return super.toObject([...Js,...t])}_toSVG(){let{width:t,height:e,rx:i,ry:r}=this;return["<rect ","COMMON_PARTS",`x="${-t/2}" y="${-e/2}" rx="${fe(i)}" ry="${fe(r)}" width="${fe(t)}" height="${fe(e)}" />\n`]}static async fromElement(t,e,i){let{left:r=0,top:s=0,width:n=0,height:o=0,visible:a=!0,...l}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this({...e,...l,left:r,top:s,width:n,height:o,visible:!!(a&&n&&o)})}};p(Qs,"type","Rect"),p(Qs,"cacheProperties",[...Xi,...Js]),p(Qs,"ownDefaults",{rx:0,ry:0}),p(Qs,"ATTRIBUTE_NAMES",[...Ds,"x","y","rx","ry","width","height"]),at.setClass(Qs),at.setSVGClass(Qs);const Zs="initialization",tn="added",en=(t,e)=>{let{strokeUniform:i,strokeWidth:r,width:s,height:n,group:o}=e,a=o&&o!==t?Ee(o.calcTransformMatrix(),t.calcTransformMatrix()):null,l=a?e.getRelativeCenterPoint().transform(a):e.getRelativeCenterPoint(),h=!e.isStrokeAccountedForInDimensions(),c=i&&h?Ae(new gt(r,r),void 0,t.calcTransformMatrix()):ft,u=!i&&h?r:0,d=je(s+u,n+u,Ft([a,e.calcOwnMatrix()],!0)).add(c).scalarDivide(2);return[l.subtract(d),l.add(d)]};var rn=class{calcLayoutResult(t,e){if(this.shouldPerformLayout(t))return this.calcBoundingBox(e,t)}shouldPerformLayout({type:t,prevStrategy:e,strategy:i}){return"initialization"===t||"imperative"===t||!!e&&i!==e}shouldLayoutClipPath({type:t,target:{clipPath:e}}){return"initialization"!==t&&e&&!e.absolutePositioned}getInitialSize(t,e){return e.size}calcBoundingBox(t,e){let{type:i,target:r}=e;if("imperative"===i&&e.overrides)return e.overrides;if(0===t.length)return;let{left:s,top:n,width:o,height:a}=Se(t.map(t=>en(r,t)).reduce((t,e)=>t.concat(e),[])),l=new gt(o,a),h=new gt(s,n).add(l.scalarDivide(2));if("initialization"===i){let t=this.getInitialSize(e,{size:l,center:h});return{center:h,relativeCorrection:new gt(0,0),size:t}}return{center:h.transform(r.calcOwnMatrix()),size:l}}};p(rn,"type","strategy");var sn=class extends rn{shouldPerformLayout(t){return!0}};p(sn,"type","fit-content"),at.setClass(sn);const nn="layoutManager";var on=class{constructor(t=new sn){p(this,"strategy",void 0),this.strategy=t,this._subscriptions=new Map}performLayout(t){let e={bubbles:!0,strategy:this.strategy,...t,prevStrategy:this._prevLayoutStrategy,stopPropagation(){this.bubbles=!1}};this.onBeforeLayout(e);let i=this.getLayoutResult(e);i&&this.commitLayout(e,i),this.onAfterLayout(e,i),this._prevLayoutStrategy=e.strategy}attachHandlers(t,e){let{target:i}=e;return[st,N,U,z,V,G,K,q,"modifyPath"].map(e=>t.on(e,t=>this.performLayout("modified"===e?{type:"object_modified",trigger:e,e:t,target:i}:{type:"object_modifying",trigger:e,e:t,target:i})))}subscribe(t,e){this.unsubscribe(t,e);let i=this.attachHandlers(t,e);this._subscriptions.set(t,i)}unsubscribe(t,e){(this._subscriptions.get(t)||[]).forEach(t=>t()),this._subscriptions.delete(t)}unsubscribeTargets(t){t.targets.forEach(e=>this.unsubscribe(e,t))}subscribeTargets(t){t.targets.forEach(e=>this.subscribe(e,t))}onBeforeLayout(t){let{target:e,type:i}=t,{canvas:r}=e;if("initialization"===i||"added"===i?this.subscribeTargets(t):"removed"===i&&this.unsubscribeTargets(t),e.fire("layout:before",{context:t}),r&&r.fire("object:layout:before",{target:e,context:t}),"imperative"===i&&t.deep){let{strategy:i,...r}=t;e.forEachObject(t=>t.layoutManager&&t.layoutManager.performLayout({...r,bubbles:!1,target:t}))}}getLayoutResult(t){let{target:e,strategy:i,type:r}=t,s=i.calcLayoutResult(t,e.getObjects());if(!s)return;let n="initialization"===r?new gt:e.getRelativeCenterPoint(),{center:o,correction:a=new gt,relativeCorrection:l=new gt}=s;return{result:s,prevCenter:n,nextCenter:o,offset:n.subtract(o).add(a).transform("initialization"===r?I:Pt(e.calcOwnMatrix()),!0).add(l)}}commitLayout(t,e){let{target:i}=t,{result:{size:r},nextCenter:s}=e;var n,o;i.set({width:r.x,height:r.y}),this.layoutObjects(t,e),"initialization"===t.type?i.set({left:null==(n=t.x)?s.x+r.x*Ie(i.originX):n,top:null==(o=t.y)?s.y+r.y*Ie(i.originY):o}):(i.setPositionByOrigin(s,R,R),i.setCoords(),i.set("dirty",!0))}layoutObjects(t,e){let{target:i}=t;i.forEachObject(r=>{r.group===i&&this.layoutObject(t,e,r)}),t.strategy.shouldLayoutClipPath(t)&&this.layoutObject(t,e,i.clipPath)}layoutObject(t,{offset:e},i){i.set({left:i.left+e.x,top:i.top+e.y})}onAfterLayout(t,e){let{target:i,strategy:r,bubbles:s,prevStrategy:n,...o}=t,{canvas:a}=i;i.fire("layout:after",{context:t,result:e}),a&&a.fire("object:layout:after",{context:t,result:e,target:i});let l=i.parent;s&&null!=l&&l.layoutManager&&((o.path||(o.path=[])).push(i),l.layoutManager.performLayout({...o,target:l})),i.set("dirty",!0)}dispose(){let{_subscriptions:t}=this;t.forEach(t=>t.forEach(t=>t())),t.clear()}toObject(){return{type:nn,strategy:this.strategy.constructor.type}}toJSON(){return this.toObject()}};at.setClass(on,nn);var an=class extends on{performLayout(){}},ln=class t extends(mt(ys)){static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),p(this,"_activeObjects",[]),p(this,"__objectSelectionTracker",void 0),p(this,"__objectSelectionDisposer",void 0),Object.assign(this,t.ownDefaults),this.setOptions(i),this.groupInit(e,i)}groupInit(t,e){var i;this._objects=[...t],this.__objectSelectionTracker=this.__objectSelectionMonitor.bind(this,!0),this.__objectSelectionDisposer=this.__objectSelectionMonitor.bind(this,!1),this.forEachObject(t=>{this.enterGroup(t,!1)}),this.layoutManager=null==(i=e.layoutManager)?new on:i,this.layoutManager.performLayout({type:Zs,target:this,targets:[...t],x:e.left,y:e.top})}canEnterGroup(t){return t===this||this.isDescendantOf(t)?(b("error","Group: circular object trees are not supported, this call has no effect"),!1):-1===this._objects.indexOf(t)||(b("error","Group: duplicate objects are not supported inside group, this call has no effect"),!1)}_filterObjectsBeforeEnteringGroup(t){return t.filter((t,e,i)=>this.canEnterGroup(t)&&i.indexOf(t)===e)}add(...t){let e=this._filterObjectsBeforeEnteringGroup(t),i=super.add(...e);return this._onAfterObjectsChange(tn,e),i}insertAt(t,...e){let i=this._filterObjectsBeforeEnteringGroup(e),r=super.insertAt(t,...i);return this._onAfterObjectsChange(tn,i),r}remove(...t){let e=super.remove(...t);return this._onAfterObjectsChange("removed",e),e}_onObjectAdded(t){this.enterGroup(t,!0),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t,e){this.exitGroup(t,e),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onAfterObjectsChange(t,e){this.layoutManager.performLayout({type:t,targets:e,target:this})}_onStackOrderChanged(){this._set("dirty",!0)}_set(t,e){let i=this[t];return super._set(t,e),"canvas"===t&&i!==e&&(this._objects||[]).forEach(i=>{i._set(t,e)}),this}_shouldSetNestedCoords(){return this.subTargetCheck}removeAll(){return this._activeObjects=[],this.remove(...this._objects)}__objectSelectionMonitor(t,{target:e}){let i=this._activeObjects;if(t)i.push(e),this._set("dirty",!0);else if(i.length>0){let t=i.indexOf(e);t>-1&&(i.splice(t,1),this._set("dirty",!0))}}_watchObject(t,e){t&&this._watchObject(!1,e),t?(e.on("selected",this.__objectSelectionTracker),e.on("deselected",this.__objectSelectionDisposer)):(e.off("selected",this.__objectSelectionTracker),e.off("deselected",this.__objectSelectionDisposer))}enterGroup(t,e){t.group&&t.group.remove(t),t._set("parent",this),this._enterGroup(t,e)}_enterGroup(t,e){e&&ke(t,At(Pt(this.calcTransformMatrix()),t.calcTransformMatrix())),this._shouldSetNestedCoords()&&t.setCoords(),t._set("group",this),t._set("canvas",this.canvas),this._watchObject(!0,t);let i=this.canvas&&this.canvas.getActiveObject&&this.canvas.getActiveObject();i&&(i===t||t.isDescendantOf(i))&&this._activeObjects.push(t)}exitGroup(t,e){this._exitGroup(t,e),t._set("parent",void 0),t._set("canvas",void 0)}_exitGroup(t,e){t._set("group",void 0),e||(ke(t,At(this.calcTransformMatrix(),t.calcTransformMatrix())),t.setCoords()),this._watchObject(!1,t);let i=this._activeObjects.length>0?this._activeObjects.indexOf(t):-1;i>-1&&this._activeObjects.splice(i,1)}shouldCache(){let t=ys.prototype.shouldCache.call(this);if(t)for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow())return this.ownCaching=!1,!1;return t}willDrawShadow(){if(super.willDrawShadow())return!0;for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow())return!0;return!1}isOnACache(){return this.ownCaching||!!this.parent&&this.parent.isOnACache()}drawObject(t,e,i){this._renderBackground(t);for(let e=0;e<this._objects.length;e++){var r;let i=this._objects[e];null!=(r=this.canvas)&&r.preserveObjectStacking&&i.group!==this?(t.save(),t.transform(...Pt(this.calcTransformMatrix())),i.render(t),t.restore()):i.group===this&&i.render(t)}this._drawClipPath(t,this.clipPath,i)}setCoords(){super.setCoords(),this._shouldSetNestedCoords()&&this.forEachObject(t=>t.setCoords())}triggerLayout(t={}){this.layoutManager.performLayout({target:this,type:"imperative",...t})}render(t){this._transformDone=!0,super.render(t),this._transformDone=!1}__serializeObjects(t,e){let i=this.includeDefaultValues;return this._objects.filter(function(t){return!t.excludeFromExport}).map(function(r){let s=r.includeDefaultValues;r.includeDefaultValues=i;let n=r[t||"toObject"](e);return r.includeDefaultValues=s,n})}toObject(t=[]){let e=this.layoutManager.toObject();return{...super.toObject(["subTargetCheck","interactive",...t]),..."fit-content"!==e.strategy||this.includeDefaultValues?{layoutManager:e}:{},objects:this.__serializeObjects("toObject",t)}}toString(){return`#<Group: (${this.complexity()})>`}dispose(){this.layoutManager.unsubscribeTargets({targets:this.getObjects(),target:this}),this._activeObjects=[],this.forEachObject(t=>{this._watchObject(!1,t),t.dispose()}),super.dispose()}_createSVGBgRect(t){if(!this.backgroundColor)return"";let e=Qs.prototype._toSVG.call(this),i=e.indexOf("COMMON_PARTS");e[i]='for="group" ';let r=e.join("");return t?t(r):r}_toSVG(t){let e=["<g ","COMMON_PARTS"," >\n"],i=this._createSVGBgRect(t);i&&e.push("\t\t",i);for(let i=0;i<this._objects.length;i++)e.push("\t\t",this._objects[i].toSVG(t));return e.push("</g>\n"),e}getSvgStyles(){let t=void 0!==this.opacity&&1!==this.opacity?`opacity: ${fe(this.opacity)};`:"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")}toClipPathSVG(t){let e=[],i=this._createSVGBgRect(t);i&&e.push("\t",i);for(let i=0;i<this._objects.length;i++)e.push("\t",this._objects[i].toClipPathSVG(t));return this._createBaseClipPathSVGMarkup(e,{reviver:t})}static fromObject({type:t,objects:e=[],layoutManager:i,...r},s){return Promise.all([Ut(e,s),qt(r,s)]).then(([t,e])=>{let s=new this(t,{...r,...e,layoutManager:new an});return s.layoutManager=i?new(at.getClass(i.type))(new(at.getClass(i.strategy))):new on,s.layoutManager.subscribeTargets({type:Zs,target:s,targets:s.getObjects()}),s.setCoords(),s})}};p(ln,"type","Group"),p(ln,"ownDefaults",{strokeWidth:0,subTargetCheck:!1,interactive:!1}),at.setClass(ln);const hn=(t,e)=>t&&1===t.length?t[0]:new ln(t,e),cn=(t,e)=>Math.min(e.width/t.width,e.height/t.height),un=(t,e)=>Math.max(e.width/t.width,e.height/t.height),dn="\\s*,?\\s*",gn=`${dn}(${Di})`,fn=`${gn}${gn}${gn}${dn}([01])${dn}([01])${gn}${gn}`,pn={m:"l",M:"L"},mn=(t,e,i,r,s,n,o,a,l,h,c)=>{let u=ut(t),d=dt(t),g=ut(e),f=dt(e),p=i*s*g-r*n*f+o,m=r*s*g+i*n*f+a;return["C",h+l*(-i*s*d-r*n*u),c+l*(-r*s*d+i*n*u),p+l*(i*s*f+r*n*g),m+l*(r*s*f-i*n*g),p,m]},yn=(t,e,i,r)=>{let s=Math.atan2(e,t),n=Math.atan2(r,i);return n>=s?n-s:2*Math.PI-(s-n)};function bn(t,e,i,r,s,n,o,a){let l;if(y.cachesBoundsOfCurve&&(l=[...arguments].join(),M.boundsOfCurveCache[l]))return M.boundsOfCurveCache[l];let h=Math.sqrt,c=Math.abs,u=[],d=[[0,0],[0,0]],g=6*t-12*i+6*s,f=-3*t+9*i-9*s+3*o,p=3*i-3*t;for(let t=0;t<2;++t){if(t>0&&(g=6*e-12*r+6*n,f=-3*e+9*r-9*n+3*a,p=3*r-3*e),c(f)<1e-12){if(c(g)<1e-12)continue;let t=-p/g;0<t&&t<1&&u.push(t);continue}let i=g*g-4*p*f;if(i<0)continue;let s=h(i),o=(-g+s)/(2*f);0<o&&o<1&&u.push(o);let l=(-g-s)/(2*f);0<l&&l<1&&u.push(l)}let m=u.length,b=m,_=wn(t,e,i,r,s,n,o,a);for(;m--;){let{x:t,y:e}=_(u[m]);d[0][m]=t,d[1][m]=e}d[0][b]=t,d[1][b]=e,d[0][b+1]=o,d[1][b+1]=a;let v=[new gt(Math.min(...d[0]),Math.min(...d[1])),new gt(Math.max(...d[0]),Math.max(...d[1]))];return y.cachesBoundsOfCurve&&(M.boundsOfCurveCache[l]=v),v}const vn=(t,e,[i,r,s,n,o,a,l,h])=>{let c=((t,e,i,r,s,n,o)=>{if(0===i||0===r)return[];let a=0,l=0,h=0,c=Math.PI,u=o*L,d=dt(u),g=ut(u),f=.5*(-g*t-d*e),p=.5*(-g*e+d*t),m=i**2,y=r**2,b=p**2,_=f**2,v=m*y-m*b-y*_,x=Math.abs(i),C=Math.abs(r);if(v<0){let t=Math.sqrt(1-v/(m*y));x*=t,C*=t}else h=(s===n?-1:1)*Math.sqrt(v/(m*b+y*_));let w=h*x*p/C,S=-h*C*f/x,T=g*w-d*S+.5*t,O=d*w+g*S+.5*e,k=yn(1,0,(f-w)/x,(p-S)/C),D=yn((f-w)/x,(p-S)/C,(-f-w)/x,(-p-S)/C);0===n&&D>0?D-=2*c:1===n&&D<0&&(D+=2*c);let M=Math.ceil(Math.abs(D/c*2)),j=[],E=D/M,P=8/3*Math.sin(E/4)*Math.sin(E/4)/Math.sin(E/2),A=k+E;for(let t=0;t<M;t++)j[t]=mn(k,A,g,d,x,C,T,O,P,a,l),a=j[t][5],l=j[t][6],k=A,A+=E;return j})(l-t,h-e,r,s,o,a,n);for(let i=0,r=c.length;i<r;i++)c[i][1]+=t,c[i][2]+=e,c[i][3]+=t,c[i][4]+=e,c[i][5]+=t,c[i][6]+=e;return c},xn=t=>{let e,i=0,r=0,s=0,n=0,o=[],a=0,l=0;for(let h of t){let t,c=[...h];switch(c[0]){case"l":c[1]+=i,c[2]+=r;case"L":i=c[1],r=c[2],t=["L",i,r];break;case"h":c[1]+=i;case"H":i=c[1],t=["L",i,r];break;case"v":c[1]+=r;case"V":r=c[1],t=["L",i,r];break;case"m":c[1]+=i,c[2]+=r;case"M":i=c[1],r=c[2],s=c[1],n=c[2],t=["M",i,r];break;case"c":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r,c[5]+=i,c[6]+=r;case"C":a=c[3],l=c[4],i=c[5],r=c[6],t=["C",c[1],c[2],a,l,i,r];break;case"s":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r;case"S":"C"===e?(a=2*i-a,l=2*r-l):(a=i,l=r),i=c[3],r=c[4],t=["C",a,l,c[1],c[2],i,r],a=t[3],l=t[4];break;case"q":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r;case"Q":a=c[1],l=c[2],i=c[3],r=c[4],t=["Q",a,l,i,r];break;case"t":c[1]+=i,c[2]+=r;case"T":"Q"===e?(a=2*i-a,l=2*r-l):(a=i,l=r),i=c[1],r=c[2],t=["Q",a,l,i,r];break;case"a":c[6]+=i,c[7]+=r;case"A":vn(i,r,c).forEach(t=>o.push(t)),i=c[6],r=c[7];break;case"z":case"Z":i=s,r=n,t=["Z"]}t?(o.push(t),e=t[0]):e=""}return o},Cn=(t,e,i,r)=>Math.sqrt((i-t)**2+(r-e)**2),wn=(t,e,i,r,s,n,o,a)=>l=>{let h=l**3,c=(t=>3*t**2*(1-t))(l),u=(t=>3*t*(1-t)**2)(l),d=(t=>(1-t)**3)(l);return new gt(o*h+s*c+i*u+t*d,a*h+n*c+r*u+e*d)},Sn=t=>t**2,Tn=t=>2*t*(1-t),On=t=>(1-t)**2,kn=(t,e,i,r,s,n,o,a)=>l=>{let h=Sn(l),c=Tn(l),u=On(l),d=3*(u*(i-t)+c*(s-i)+h*(o-s)),g=3*(u*(r-e)+c*(n-r)+h*(a-n));return Math.atan2(g,d)},Dn=(t,e,i,r,s,n)=>o=>{let a=Sn(o),l=Tn(o),h=On(o);return new gt(s*a+i*l+t*h,n*a+r*l+e*h)},Mn=(t,e,i,r,s,n)=>o=>{let a=1-o,l=2*(a*(i-t)+o*(s-i)),h=2*(a*(r-e)+o*(n-r));return Math.atan2(h,l)},jn=(t,e,i)=>{let r=new gt(e,i),s=0;for(let e=1;e<=100;e+=1){let i=t(e/100);s+=Cn(r.x,r.y,i.x,i.y),r=i}return s},En=t=>{let e,i,r=0,s=0,n=0,o=0,a=0,l=[];for(let h of t){let t={x:s,y:n,command:h[0],length:0};switch(h[0]){case"M":i=t,i.x=o=s=h[1],i.y=a=n=h[2];break;case"L":i=t,i.length=Cn(s,n,h[1],h[2]),s=h[1],n=h[2];break;case"C":e=wn(s,n,h[1],h[2],h[3],h[4],h[5],h[6]),i=t,i.iterator=e,i.angleFinder=kn(s,n,h[1],h[2],h[3],h[4],h[5],h[6]),i.length=jn(e,s,n),s=h[5],n=h[6];break;case"Q":e=Dn(s,n,h[1],h[2],h[3],h[4]),i=t,i.iterator=e,i.angleFinder=Mn(s,n,h[1],h[2],h[3],h[4]),i.length=jn(e,s,n),s=h[3],n=h[4];break;case"Z":i=t,i.destX=o,i.destY=a,i.length=Cn(s,n,o,a),s=o,n=a}r+=i.length,l.push(i)}return l.push({length:r,x:s,y:n}),l},Pn=(t,e,i=En(t))=>{let r=0;for(;e-i[r].length>0&&r<i.length-2;)e-=i[r].length,r++;let s=i[r],n=e/s.length,o=t[r];switch(s.command){case"M":return{x:s.x,y:s.y,angle:0};case"Z":return{...new gt(s.x,s.y).lerp(new gt(s.destX,s.destY),n),angle:Math.atan2(s.destY-s.y,s.destX-s.x)};case"L":return{...new gt(s.x,s.y).lerp(new gt(o[1],o[2]),n),angle:Math.atan2(o[2]-s.y,o[1]-s.x)};case"C":case"Q":return((t,e)=>{let i,r=0,s=0,n={x:t.x,y:t.y},o={...n},a=.01,l=0,h=t.iterator,c=t.angleFinder;for(;s<e&&a>1e-4;)o=h(r),l=r,i=Cn(n.x,n.y,o.x,o.y),i+s>e?(r-=a,a/=2):(n=o,r+=a,s+=i);return{...o,angle:c(l)}})(s,e)}},An=RegExp("[mzlhvcsqta][^mzlhvcsqta]*","gi"),Fn=new RegExp(fn,"g"),Ln=new RegExp(Di,"gi"),In={m:2,l:2,h:1,v:1,c:6,s:4,q:4,t:2,a:7},Rn=t=>{var e;let i=[],r=null==(e=t.match(An))?[]:e;for(let t of r){let e=t[0];if("z"===e||"Z"===e){i.push([e]);continue}let r=In[e.toLowerCase()],s=[];if("a"===e||"A"===e){let e;for(Fn.lastIndex=0;e=Fn.exec(t);)s.push(...e.slice(1))}else s=t.match(Ln)||[];for(let t=0;t<s.length;t+=r){let n=Array(r),o=pn[e];n[0]=t>0&&o?o:e;for(let e=0;e<r;e++)n[e+1]=parseFloat(s[t+e]);i.push(n)}}return i},Bn=(t,e=0)=>{let i,r=new gt(t[0]),s=new gt(t[1]),n=1,o=0,a=[],l=t.length,h=l>2;for(h&&(n=t[2].x<s.x?-1:t[2].x===s.x?0:1,o=t[2].y<s.y?-1:t[2].y===s.y?0:1),a.push(["M",r.x-n*e,r.y-o*e]),i=1;i<l;i++){if(!r.eq(s)){let t=r.midPointFrom(s);a.push(["Q",r.x,r.y,t.x,t.y])}r=t[i],i+1<t.length&&(s=t[i+1])}return h&&(n=r.x>t[i-2].x?1:r.x===t[i-2].x?0:-1,o=r.y>t[i-2].y?1:r.y===t[i-2].y?0:-1),a.push(["L",r.x+n*e,r.y+o*e]),a},$n=(t,e,i)=>(i&&(e=At(e,[1,0,0,1,-i.x,-i.y])),t.map(t=>{let i=[...t];for(let r=1;r<t.length-1;r+=2){let{x:s,y:n}=Et({x:t[r],y:t[r+1]},e);i[r]=s,i[r+1]=n}return i})),Xn=(t,e)=>{let i=2*Math.PI/t,r=-P;t%2==0&&(r+=i/2);let s=Array(t+1);for(let n=0;n<t;n++){let t=n*i+r,{x:o,y:a}=new gt(ut(t),dt(t)).scalarMultiply(e);s[n]=[0===n?"M":"L",o,a]}return s[t]=["Z"],s},Yn=(t,e)=>t.map(t=>t.map((t,i)=>0===i||void 0===e?t:Qt(t,e)).join(" ")).join(" "),Wn=(t,e)=>{var i;let r=t,s=e;r.inverted&&!s.inverted&&(r=e,s=t),Fe(s,null==(i=s.group)?void 0:i.calcTransformMatrix(),r.calcTransformMatrix());let n=r.inverted&&s.inverted;return n&&(r.inverted=s.inverted=!1),new ln([r],{clipPath:s,inverted:n})},Nn=(t,e)=>Math.floor(Math.random()*(e-t+1))+t,Vn=(t,e)=>{let i=t._findCenterFromElement();t.transformMatrix&&((t=>{if(t.transformMatrix){let{scaleX:e,scaleY:i,angle:r,skewX:s}=Bt(t.transformMatrix);t.flipX=!1,t.flipY=!1,t.set(Q,e),t.set(Z,i),t.angle=r,t.skewX=s,t.skewY=0}})(t),i=i.transform(t.transformMatrix)),delete t.transformMatrix,e&&(t.scaleX*=e.scaleX,t.scaleY*=e.scaleY,t.cropX=e.cropX,t.cropY=e.cropY,i.x+=e.offsetLeft,i.y+=e.offsetTop,t.width=e.width,t.height=e.height),t.setPositionByOrigin(i,R,R)};function zn(t,e){let i=t.style;i&&Object.entries(e).forEach(([t,e])=>i.setProperty(t,e))}d({addTransformToObject:()=>Oe,animate:()=>Mr,animateColor:()=>jr,applyTransformToObject:()=>ke,calcAngleBetweenVectors:()=>We,calcDimensionsMatrix:()=>zt,calcPlaneChangeMatrix:()=>Ee,calcVectorRotation:()=>Ne,cancelAnimFrame:()=>_t,capValue:()=>Bi,composeMatrix:()=>Ht,copyCanvasElement:()=>St,cos:()=>ut,createCanvasElement:()=>Ct,createImage:()=>wt,createRotateMatrix:()=>Xt,createScaleMatrix:()=>Yt,createSkewXMatrix:()=>Nt,createSkewYMatrix:()=>Vt,createTranslateMatrix:()=>$t,createVector:()=>Xe,crossProduct:()=>He,degreesToRadians:()=>Dt,dotProduct:()=>Ge,ease:()=>Wi,enlivenObjectEnlivables:()=>qt,enlivenObjects:()=>Ut,findScaleToCover:()=>un,findScaleToFit:()=>cn,getBoundsOfCurve:()=>bn,getOrthonormalVector:()=>ze,getPathSegmentsInfo:()=>En,getPointOnPath:()=>Pn,getPointer:()=>xe,getRandomInt:()=>Nn,getRegularPolygonPath:()=>Xn,getSmoothPathFromPoints:()=>Bn,getSvgAttributes:()=>fi,getUnitVector:()=>Ve,groupSVGElements:()=>hn,hasStyleChanged:()=>Ts,invertTransform:()=>Pt,isBetweenVectors:()=>Ue,isIdentityMatrix:()=>jt,isTouchEvent:()=>Ce,isTransparent:()=>bs,joinPath:()=>Yn,loadImage:()=>Gt,magnitude:()=>Ye,makeBoundingBoxFromPoints:()=>Se,makePathSimpler:()=>xn,matrixToSVG:()=>Zt,mergeClipPaths:()=>Wn,multiplyTransformMatrices:()=>At,multiplyTransformMatrixArray:()=>Ft,parsePath:()=>Rn,parsePreserveAspectRatioAttribute:()=>mi,parseUnit:()=>pi,pick:()=>Kt,projectStrokeOnPoints:()=>ws,qrDecompose:()=>Bt,radiansToDegrees:()=>Mt,removeFromArray:()=>ct,removeTransformFromObject:()=>Te,removeTransformMatrixForSvgParsing:()=>Vn,requestAnimFrame:()=>bt,resetObjectTransform:()=>De,rotateVector:()=>$e,saveObjectTransform:()=>Me,sendObjectToPlane:()=>Fe,sendPointToPlane:()=>Pe,sendVectorToPlane:()=>Ae,sin:()=>dt,sizeAfterTransform:()=>je,string:()=>de,stylesFromArray:()=>ks,stylesToArray:()=>Os,toBlob:()=>kt,toDataURL:()=>Ot,toFixed:()=>Qt,transformPath:()=>$n,transformPoint:()=>Et});var Hn=class extends ce{constructor(t,{allowTouchScrolling:e=!1,containerClass:i=""}={}){super(t),p(this,"upper",void 0),p(this,"container",void 0);let{el:r}=this.lower,s=this.createUpperCanvas();this.upper={el:s,ctx:s.getContext("2d")},this.applyCanvasStyle(r,{allowTouchScrolling:e}),this.applyCanvasStyle(s,{allowTouchScrolling:e,styles:{position:"absolute",left:"0",top:"0"}});let n=this.createContainerElement();n.classList.add(i),r.parentNode&&r.parentNode.replaceChild(n,r),n.append(r,s),this.container=n}createUpperCanvas(){let{el:t}=this.lower,e=Ct();return e.className=t.className,e.classList.remove("lower-canvas"),e.classList.add("upper-canvas"),e.setAttribute("data-fabric","top"),e.style.cssText=t.style.cssText,e.setAttribute("draggable","true"),e}createContainerElement(){let t=O().createElement("div");return t.setAttribute("data-fabric","wrapper"),zn(t,{position:"relative"}),he(t),t}applyCanvasStyle(t,e){let{styles:i,allowTouchScrolling:r}=e;zn(t,{...i,"touch-action":r?"manipulation":Y}),he(t)}setDimensions(t,e){super.setDimensions(t,e);let{el:i,ctx:r}=this.upper;ae(i,r,t,e)}setCSSDimensions(t){super.setCSSDimensions(t),le(this.upper.el,t),le(this.container,t)}cleanupDOM(t){let e=this.container,{el:i}=this.lower,{el:r}=this.upper;super.cleanupDOM(t),e.removeChild(r),e.removeChild(i),e.parentNode&&e.parentNode.replaceChild(i,e)}dispose(){super.dispose(),T().dispose(this.upper.el),delete this.upper,delete this.container}};const Gn=(t,e,i,r)=>{let{target:s,offsetX:n,offsetY:o}=e,a=i-n,l=r-o,h=!Qe(s,"lockMovementX")&&s.left!==a,c=!Qe(s,"lockMovementY")&&s.top!==l;return h&&s.set("left",a),c&&s.set("top",l),(h||c)&&Fr(N,Ze(t,e,i,r)),h||c},Un=q,qn=t=>function(e,i,r){let{points:s,pathOffset:n}=r;return new gt(s[t]).subtract(n).transform(At(r.getViewportTransform(),r.calcTransformMatrix()))},Kn=(t,e,i,r)=>{let{target:s,pointIndex:n}=e,o=s,a=Pe(new gt(i,r),void 0,o.calcOwnMatrix());return o.points[n]=a.add(o.pathOffset),o.setDimensions(),o.set("dirty",!0),!0},Jn=(t,e)=>function(i,r,s,n){let o=r.target,a=new gt(o.points[(t>0?t:o.points.length)-1]),l=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()),h=e(i,{...r,pointIndex:t},s,n),c=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()).subtract(l);return o.left-=c.x,o.top-=c.y,h},Qn=t=>Lr(Un,Jn(t,Kn));function Zn(t,e={}){let i={};for(let r=0;r<("number"==typeof t?t:t.points.length);r++)i[`p${r}`]=new Vr({actionName:Un,positionHandler:qn(r),actionHandler:Qn(r),...e});return i}const to=(t,e,i)=>{let{path:r,pathOffset:s}=t,n=r[e];return new gt(n[i]-s.x,n[i+1]-s.y).transform(At(t.getViewportTransform(),t.calcTransformMatrix()))};function eo(t,e,i){let{commandIndex:r,pointIndex:s}=this;return to(i,r,s)}function io(t,e,i,r){let{target:s}=e,{commandIndex:n,pointIndex:o}=this,a=((t,e,i,r,s)=>{let{path:n,pathOffset:o}=t,a=n[(r>0?r:n.length)-1],l=new gt(a[s],a[s+1]),h=l.subtract(o).transform(t.calcOwnMatrix()),c=Pe(new gt(e,i),void 0,t.calcOwnMatrix());n[r][s]=c.x+o.x,n[r][s+1]=c.y+o.y,t.setDimensions();let u=l.subtract(t.pathOffset).transform(t.calcOwnMatrix()).subtract(h);return t.left-=u.x,t.top-=u.y,t.set("dirty",!0),!0})(s,i,r,n,o);return a&&Fr(this.actionName,{...Ze(t,e,i,r),commandIndex:n,pointIndex:o}),a}var ro=class extends Vr{constructor(t){super(t)}render(t,e,i,r,s){let n={...r,cornerColor:this.controlFill,cornerStrokeColor:this.controlStroke,transparentCorners:!this.controlFill};super.render(t,e,i,n,s)}},so=class extends ro{constructor(t){super(t)}render(t,e,i,r,s){let{path:n}=s,{commandIndex:o,pointIndex:a,connectToCommandIndex:l,connectToPointIndex:h}=this;t.save(),t.strokeStyle=this.controlStroke,this.connectionDashArray&&t.setLineDash(this.connectionDashArray);let[c]=n[o],u=to(s,l,h);if("Q"===c){let r=to(s,o,a+2);t.moveTo(r.x,r.y),t.lineTo(e,i)}else t.moveTo(e,i);t.lineTo(u.x,u.y),t.stroke(),t.restore(),super.render(t,e,i,r,s)}};const no=(t,e,i,r,s,n)=>new(i?so:ro)({commandIndex:t,pointIndex:e,actionName:"modifyPath",positionHandler:eo,actionHandler:io,connectToCommandIndex:s,connectToPointIndex:n,...r,...i?r.controlPointStyle:r.pointStyle});function oo(t,e={}){let i={},r="M";return t.path.forEach((t,s)=>{let n=t[0];switch("Z"!==n&&(i[`c_${s}_${n}`]=no(s,t.length-2,!1,e)),n){case"C":i[`c_${s}_C_CP_1`]=no(s,1,!0,e,s-1,(t=>"C"===t?5:"Q"===t?3:1)(r)),i[`c_${s}_C_CP_2`]=no(s,3,!0,e,s,5);break;case"Q":i[`c_${s}_Q_CP_1`]=no(s,1,!0,e,s,3)}r=n}),i}d({changeHeight:()=>Yr,changeObjectHeight:()=>$r,changeObjectWidth:()=>Br,changeWidth:()=>Xr,createObjectDefaultControls:()=>ds,createPathControls:()=>oo,createPolyActionHandler:()=>Qn,createPolyControls:()=>Zn,createPolyPositionHandler:()=>qn,createResizeControls:()=>gs,createTextboxDefaultControls:()=>fs,dragHandler:()=>Gn,factoryPolyActionHandler:()=>Jn,getLocalPoint:()=>ei,polyActionHandler:()=>Kn,renderCircleControl:()=>Wr,renderSquareControl:()=>Nr,rotationStyleHandler:()=>zr,rotationWithSnapping:()=>Hr,scaleCursorStyleHandler:()=>Kr,scaleOrSkewActionName:()=>ls,scaleSkewCursorStyleHandler:()=>hs,scalingEqually:()=>Qr,scalingX:()=>Zr,scalingXOrSkewingY:()=>cs,scalingY:()=>ts,scalingYOrSkewingX:()=>us,skewCursorStyleHandler:()=>rs,skewHandlerX:()=>ns,skewHandlerY:()=>os,wrapWithFireEvent:()=>Lr,wrapWithFixedAnchor:()=>Ir});var ao=class t extends _e{constructor(...t){super(...t),p(this,"_hoveredTargets",[]),p(this,"_currentTransform",null),p(this,"_groupSelector",null),p(this,"contextTopDirty",!1)}static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}get upperCanvasEl(){var t;return null==(t=this.elements.upper)?void 0:t.el}get contextTop(){var t;return null==(t=this.elements.upper)?void 0:t.ctx}get wrapperEl(){return this.elements.container}initElements(t){this.elements=new Hn(t,{allowTouchScrolling:this.allowTouchScrolling,containerClass:this.containerClass}),this._createCacheCanvas()}_onObjectAdded(t){this._objectsToRender=void 0,super._onObjectAdded(t)}_onObjectRemoved(t){this._objectsToRender=void 0,t===this._activeObject&&(this.fire("before:selection:cleared",{deselected:[t]}),this._discardActiveObject(),this.fire("selection:cleared",{deselected:[t]}),t.fire("deselected",{target:t})),t===this._hoveredTarget&&(this._hoveredTarget=void 0,this._hoveredTargets=[]),super._onObjectRemoved(t)}_onStackOrderChanged(){this._objectsToRender=void 0,super._onStackOrderChanged()}_chooseObjectsToRender(){let t=this._activeObject;return!this.preserveObjectStacking&&t?this._objects.filter(e=>!e.group&&e!==t).concat(t):this._objects}renderAll(){this.cancelRequestedRender(),this.destroyed||(!this.contextTopDirty||this._groupSelector||this.isDrawingMode||(this.clearContext(this.contextTop),this.contextTopDirty=!1),this.hasLostContext&&(this.renderTopLayer(this.contextTop),this.hasLostContext=!1),!this._objectsToRender&&(this._objectsToRender=this._chooseObjectsToRender()),this.renderCanvas(this.getContext(),this._objectsToRender))}renderTopLayer(t){t.save(),this.isDrawingMode&&this._isCurrentlyDrawing&&(this.freeDrawingBrush&&this.freeDrawingBrush._render(),this.contextTopDirty=!0),this.selection&&this._groupSelector&&(this._drawSelection(t),this.contextTopDirty=!0),t.restore()}renderTop(){let t=this.contextTop;this.clearContext(t),this.renderTopLayer(t),this.fire("after:render",{ctx:t})}setTargetFindTolerance(t){t=Math.round(t),this.targetFindTolerance=t;let e=this.getRetinaScaling(),i=Math.ceil((2*t+1)*e);this.pixelFindCanvasEl.width=this.pixelFindCanvasEl.height=i,this.pixelFindContext.scale(e,e)}isTargetTransparent(t,e,i){let r=this.targetFindTolerance,s=this.pixelFindContext;this.clearContext(s),s.save(),s.translate(-e+r,-i+r),s.transform(...this.viewportTransform);let n=t.selectionBackgroundColor;t.selectionBackgroundColor="",t.render(s),t.selectionBackgroundColor=n,s.restore();let o=Math.round(r*this.getRetinaScaling());return bs(s,o,o,o)}_isSelectionKeyPressed(t){let e=this.selectionKey;return!!e&&(Array.isArray(e)?!!e.find(e=>!!e&&!0===t[e]):t[e])}_shouldClearSelection(t,e){let i=this.getActiveObjects(),r=this._activeObject;return!!(!e||e&&r&&i.length>1&&-1===i.indexOf(e)&&r!==e&&!this._isSelectionKeyPressed(t)||e&&!e.evented||e&&!e.selectable&&r&&r!==e)}_shouldCenterTransform(t,e,i){if(!t)return;let r;return"scale"===e||"scaleX"===e||"scaleY"===e||"resizing"===e?r=this.centeredScaling||t.centeredScaling:"rotate"===e&&(r=this.centeredRotation||t.centeredRotation),r?!i:i}_getOriginFromCorner(t,e){let i=e?t.controls[e].getTransformAnchorPoint():{x:t.originX,y:t.originY};return e?(["ml","tl","bl"].includes(e)?i.x=X:["mr","tr","br"].includes(e)&&(i.x=B),["tl","mt","tr"].includes(e)?i.y=$:["bl","mb","br"].includes(e)&&(i.y="top"),i):i}_setupCurrentTransform(t,e,i){var r;let s=e.group?Pe(this.getScenePoint(t),void 0,e.group.calcTransformMatrix()):this.getScenePoint(t),{key:n="",control:o}=e.getActiveControl()||{},a=i&&o?null==(r=o.getActionHandler(t,e,o))?void 0:r.bind(o):Gn,l=((t,e,i,r)=>{if(!e||!t)return"drag";let s=r.controls[e];return s.getActionName(i,s,r)})(i,n,t,e),h=t[this.centeredKey],c=this._shouldCenterTransform(e,l,h)?{x:R,y:R}:this._getOriginFromCorner(e,n),{scaleX:u,scaleY:d,skewX:g,skewY:f,left:p,top:m,angle:y,width:b,height:_,cropX:v,cropY:x}=e,C={target:e,action:l,actionHandler:a,actionPerformed:!1,corner:n,scaleX:u,scaleY:d,skewX:g,skewY:f,offsetX:s.x-p,offsetY:s.y-m,originX:c.x,originY:c.y,ex:s.x,ey:s.y,lastX:s.x,lastY:s.y,theta:Dt(y),width:b,height:_,shiftKey:t.shiftKey,altKey:h,original:{...Me(e),originX:c.x,originY:c.y,cropX:v,cropY:x}};this._currentTransform=C,this.fire("before:transform",{e:t,transform:C})}setCursor(t){this.upperCanvasEl.style.cursor=t}_drawSelection(t){let{x:e,y:i,deltaX:r,deltaY:s}=this._groupSelector,n=new gt(e,i).transform(this.viewportTransform),o=new gt(e+r,i+s).transform(this.viewportTransform),a=this.selectionLineWidth/2,l=Math.min(n.x,o.x),h=Math.min(n.y,o.y),c=Math.max(n.x,o.x),u=Math.max(n.y,o.y);this.selectionColor&&(t.fillStyle=this.selectionColor,t.fillRect(l,h,c-l,u-h)),this.selectionLineWidth&&this.selectionBorderColor&&(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,l+=a,h+=a,c-=a,u-=a,ys.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(l,h,c-l,u-h))}findTarget(t){if(this._targetInfo)return this._targetInfo;if(this.skipTargetFind)return{subTargets:[],currentSubTargets:[]};let e=this.getScenePoint(t),i=this._activeObject,r=this.getActiveObjects(),s=this.searchPossibleTargets(this._objects,e),{subTargets:n,container:o,target:a}=s,l={...s,currentSubTargets:n,currentContainer:o,currentTarget:a};if(!i)return l;let h={...this.searchPossibleTargets([i],e),currentSubTargets:n,currentContainer:o,currentTarget:a};return i.findControl(this.getViewportPoint(t),Ce(t))?{...h,target:i}:h.target&&(r.length>1||!this.preserveObjectStacking||this.preserveObjectStacking&&t[this.altSelectionKey])?h:l}_pointIsInObjectSelectionArea(t,e){let i=t.getCoords(),r=this.getZoom(),s=t.padding/r;if(s){let[t,e,r,n]=i,o=Math.atan2(e.y-t.y,e.x-t.x),a=ut(o)*s,l=dt(o)*s,h=a+l,c=a-l;i=[new gt(t.x-c,t.y-h),new gt(e.x+h,e.y-c),new gt(r.x+c,r.y+h),new gt(n.x-h,n.y+c)]}return Er.isPointInPolygon(e,i)}_checkTarget(t,e){if(t&&t.visible&&t.evented&&this._pointIsInObjectSelectionArea(t,e)){if(!this.perPixelTargetFind&&!t.perPixelTargetFind||t.isEditing)return!0;{let i=e.transform(this.viewportTransform);if(!this.isTargetTransparent(t,i.x,i.y))return!0}}return!1}_searchPossibleTargets(t,e,i){let r=t.length;for(;r--;){let s=t[r];if(this._checkTarget(s,e)){if(pt(s)&&s.subTargetCheck){let{target:t}=this._searchPossibleTargets(s._objects,e,i);t&&i.push(t)}return{target:s,subTargets:i}}}return{subTargets:[]}}searchPossibleTargets(t,e){let i=this._searchPossibleTargets(t,e,[]);i.container=i.target;let{container:r,subTargets:s}=i;if(r&&pt(r)&&r.interactive&&s[0]){for(let t=s.length-1;t>0;t--){let e=s[t];if(!pt(e)||!e.interactive)return i.target=e,i}return i.target=s[0],i}return i}getViewportPoint(t){return this._viewportPoint?this._viewportPoint:this._getPointerImpl(t,!0)}getScenePoint(t){return this._scenePoint?this._scenePoint:this._getPointerImpl(t)}_getPointerImpl(t,e=!1){let i=this.upperCanvasEl,r=i.getBoundingClientRect(),s=xe(t),n=r.width||0,o=r.height||0;n&&o||("top"in r&&"bottom"in r&&(o=Math.abs(r.top-r.bottom)),"right"in r&&"left"in r&&(n=Math.abs(r.right-r.left))),this.calcOffset(),s.x-=this._offset.left,s.y-=this._offset.top,e||(s=Pe(s,void 0,this.viewportTransform));let a=this.getRetinaScaling();1!==a&&(s.x/=a,s.y/=a);let l=0===n||0===o?new gt(1,1):new gt(i.width/n,i.height/o);return s.multiply(l)}_setDimensionsImpl(t,e){this._resetTransformEventData(),super._setDimensionsImpl(t,e),this._isCurrentlyDrawing&&this.freeDrawingBrush&&this.freeDrawingBrush._setBrushStyles(this.contextTop)}_createCacheCanvas(){this.pixelFindCanvasEl=Ct(),this.pixelFindContext=this.pixelFindCanvasEl.getContext("2d",{willReadFrequently:!0}),this.setTargetFindTolerance(this.targetFindTolerance)}getTopContext(){return this.elements.upper.ctx}getSelectionContext(){return this.elements.upper.ctx}getSelectionElement(){return this.elements.upper.el}getActiveObject(){return this._activeObject}getActiveObjects(){let t=this._activeObject;return re(t)?t.getObjects():t?[t]:[]}_fireSelectionEvents(t,e){let i=!1,r=!1,s=this.getActiveObjects(),n=[],o=[];t.forEach(t=>{s.includes(t)||(i=!0,t.fire("deselected",{e,target:t}),o.push(t))}),s.forEach(r=>{t.includes(r)||(i=!0,r.fire("selected",{e,target:r}),n.push(r))}),t.length>0&&s.length>0?(r=!0,i&&this.fire("selection:updated",{e,selected:n,deselected:o})):s.length>0?(r=!0,this.fire("selection:created",{e,selected:n})):t.length>0&&(r=!0,this.fire("selection:cleared",{e,deselected:o})),r&&(this._objectsToRender=void 0)}setActiveObject(t,e){let i=this.getActiveObjects(),r=this._setActiveObject(t,e);return this._fireSelectionEvents(i,e),r}_setActiveObject(t,e){let i=this._activeObject;return!(i===t||!this._discardActiveObject(e,t)&&this._activeObject||t.onSelect({e})||(this._activeObject=t,re(t)&&i!==t&&t.set("canvas",this),t.setCoords(),0))}_discardActiveObject(t,e){let i=this._activeObject;return!!i&&!i.onDeselect({e:t,object:e})&&(this._currentTransform&&this._currentTransform.target===i&&this.endCurrentTransform(t),re(i)&&i===this._hoveredTarget&&(this._hoveredTarget=void 0),this._activeObject=void 0,!0)}discardActiveObject(t){let e=this.getActiveObjects(),i=this.getActiveObject();e.length&&this.fire("before:selection:cleared",{e:t,deselected:[i]});let r=this._discardActiveObject(t);return this._fireSelectionEvents(e,t),r}endCurrentTransform(t){let e=this._currentTransform;this._finalizeCurrentTransform(t),e&&e.target&&(e.target.isMoving=!1),this._currentTransform=null}_finalizeCurrentTransform(t){let e=this._currentTransform,i=e.target,r={e:t,target:i,transform:e,action:e.action};i._scaling&&(i._scaling=!1),i.setCoords(),e.actionPerformed&&(this.fire("object:modified",r),i.fire(st,r))}setViewportTransform(t){super.setViewportTransform(t);let e=this._activeObject;e&&e.setCoords()}destroy(){let t=this._activeObject;re(t)&&(t.removeAll(),t.dispose()),delete this._activeObject,super.destroy(),this.pixelFindContext=null,this.pixelFindCanvasEl=void 0}clear(){this.discardActiveObject(),this._activeObject=void 0,this.clearContext(this.contextTop),super.clear()}drawControls(t){let e=this._activeObject;e&&e._renderControls(t)}_toObject(t,e,i){let r=this._realizeGroupTransformOnObject(t),s=super._toObject(t,e,i);return t.set(r),s}_realizeGroupTransformOnObject(t){let{group:e}=t;if(e&&re(e)&&this._activeObject===e){let i=Kt(t,["angle","flipX","flipY",B,Q,Z,tt,et,"top"]);return Oe(t,e.calcOwnMatrix()),i}return{}}_setSVGObject(t,e,i){let r=this._realizeGroupTransformOnObject(e);super._setSVGObject(t,e,i),e.set(r)}};p(ao,"ownDefaults",{uniformScaling:!0,uniScaleKey:"shiftKey",centeredScaling:!1,centeredRotation:!1,centeredKey:"altKey",altActionKey:"shiftKey",selection:!0,selectionKey:"shiftKey",selectionColor:"rgba(100, 100, 255, 0.3)",selectionDashArray:[],selectionBorderColor:"rgba(255, 255, 255, 0.3)",selectionLineWidth:1,selectionFullyContained:!1,hoverCursor:"move",moveCursor:"move",defaultCursor:"default",freeDrawingCursor:"crosshair",notAllowedCursor:"not-allowed",perPixelTargetFind:!1,targetFindTolerance:0,skipTargetFind:!1,stopContextMenu:!0,fireRightClick:!0,fireMiddleClick:!0,enablePointerEvents:!1,containerClass:"canvas-container",preserveObjectStacking:!0});var lo=class{constructor(t){p(this,"targets",[]),p(this,"__disposer",void 0);let e=()=>{let{hiddenTextarea:e}=t.getActiveObject()||{};e&&e.focus()},i=t.upperCanvasEl;i.addEventListener("click",e),this.__disposer=()=>i.removeEventListener("click",e)}exitTextEditing(){this.target=void 0,this.targets.forEach(t=>{t.isEditing&&t.exitEditing()})}add(t){this.targets.push(t)}remove(t){this.unregister(t),ct(this.targets,t)}register(t){this.target=t}unregister(t){t===this.target&&(this.target=void 0)}onMouseMove(t){var e;null!=(e=this.target)&&e.isEditing&&this.target.updateSelectionOnMouseMove(t)}clear(){this.targets=[],this.target=void 0}dispose(){this.clear(),this.__disposer(),delete this.__disposer}};const ho={passive:!1},co=(t,e)=>({viewportPoint:t.getViewportPoint(e),scenePoint:t.getScenePoint(e)}),uo=(t,...e)=>t.addEventListener(...e),go=(t,...e)=>t.removeEventListener(...e),fo={mouse:{in:"over",out:"out",targetIn:"mouseover",targetOut:"mouseout",canvasIn:"mouse:over",canvasOut:"mouse:out"},drag:{in:"enter",out:"leave",targetIn:"dragenter",targetOut:"dragleave",canvasIn:"drag:enter",canvasOut:"drag:leave"}};var po=class extends ao{constructor(t,e={}){super(t,e),p(this,"_isClick",void 0),p(this,"textEditingManager",new lo(this)),["_onMouseDown","_onTouchStart","_onMouseMove","_onMouseUp","_onTouchEnd","_onResize","_onMouseWheel","_onMouseOut","_onMouseEnter","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragProgress","_onDragOver","_onDragEnter","_onDragLeave","_onDrop"].forEach(t=>{this[t]=this[t].bind(this)}),this.addOrRemove(uo)}_getEventPrefix(){return this.enablePointerEvents?"pointer":"mouse"}addOrRemove(t,e=!1){let i=this.upperCanvasEl,r=this._getEventPrefix();t(oe(i),"resize",this._onResize),t(i,r+"down",this._onMouseDown),t(i,`${r}move`,this._onMouseMove,ho),t(i,`${r}out`,this._onMouseOut),t(i,`${r}enter`,this._onMouseEnter),t(i,"wheel",this._onMouseWheel,{passive:!1}),t(i,"contextmenu",this._onContextMenu),e||(t(i,"click",this._onClick),t(i,"dblclick",this._onClick)),t(i,"dragstart",this._onDragStart),t(i,"dragend",this._onDragEnd),t(i,"dragover",this._onDragOver),t(i,"dragenter",this._onDragEnter),t(i,"dragleave",this._onDragLeave),t(i,"drop",this._onDrop),this.enablePointerEvents||t(i,"touchstart",this._onTouchStart,ho)}removeListeners(){this.addOrRemove(go);let t=this._getEventPrefix(),e=ne(this.upperCanvasEl);go(e,`${t}up`,this._onMouseUp),go(e,"touchend",this._onTouchEnd,ho),go(e,`${t}move`,this._onMouseMove,ho),go(e,"touchmove",this._onMouseMove,ho),clearTimeout(this._willAddMouseDown)}_onMouseWheel(t){this._cacheTransformEventData(t),this._handleEvent(t,"wheel"),this._resetTransformEventData()}_onMouseOut(t){let e=this._hoveredTarget,i={e:t,...co(this,t)};this.fire("mouse:out",{...i,target:e}),this._hoveredTarget=void 0,e&&e.fire("mouseout",{...i}),this._hoveredTargets.forEach(t=>{this.fire("mouse:out",{...i,target:t}),t&&t.fire("mouseout",{...i})}),this._hoveredTargets=[]}_onMouseEnter(t){let{target:e}=this.findTarget(t);this._currentTransform||e||(this.fire("mouse:over",{e:t,...co(this,t)}),this._hoveredTarget=void 0,this._hoveredTargets=[])}_onDragStart(t){this._isClick=!1;let e=this.getActiveObject();if(e&&e.onDragStart(t)){this._dragSource=e;let i={e:t,target:e};return this.fire("dragstart",i),e.fire("dragstart",i),void uo(this.upperCanvasEl,"drag",this._onDragProgress)}we(t)}_renderDragEffects(t,e,i){let r=!1,s=this._dropTarget;s&&s!==e&&s!==i&&(s.clearContextTop(),r=!0),null==e||e.clearContextTop(),i!==e&&(null==i||i.clearContextTop());let n=this.contextTop;n.save(),n.transform(...this.viewportTransform),e&&(n.save(),e.transform(n),e.renderDragSourceEffect(t),n.restore(),r=!0),i&&(n.save(),i.transform(n),i.renderDropTargetEffect(t),n.restore(),r=!0),n.restore(),r&&(this.contextTopDirty=!0)}_onDragEnd(t){let{currentSubTargets:e}=this.findTarget(t),i=!!t.dataTransfer&&"none"!==t.dataTransfer.dropEffect,r=i?this._activeObject:void 0,s={e:t,target:this._dragSource,subTargets:e,dragSource:this._dragSource,didDrop:i,dropTarget:r};go(this.upperCanvasEl,"drag",this._onDragProgress),this.fire("dragend",s),this._dragSource&&this._dragSource.fire("dragend",s),delete this._dragSource,this._onMouseUp(t)}_onDragProgress(t){let e={e:t,target:this._dragSource,dragSource:this._dragSource,dropTarget:this._draggedoverTarget};this.fire("drag",e),this._dragSource&&this._dragSource.fire("drag",e)}_onDragOver(t){let e,i="dragover",{currentContainer:r,currentSubTargets:s}=this.findTarget(t),n=this._dragSource,o={e:t,target:r,subTargets:s,dragSource:n,canDrop:!1,dropTarget:void 0};this.fire(i,o),this._fireEnterLeaveEvents(t,r,o),r&&(r.canDrop(t)&&(e=r),r.fire(i,o));for(let r=0;r<s.length;r++){let n=s[r];n.canDrop(t)&&(e=n),n.fire(i,o)}this._renderDragEffects(t,n,e),this._dropTarget=e}_onDragEnter(t){let{currentContainer:e,currentSubTargets:i}=this.findTarget(t),r={e:t,target:e,subTargets:i,dragSource:this._dragSource};this.fire("dragenter",r),this._fireEnterLeaveEvents(t,e,r)}_onDragLeave(t){let{currentSubTargets:e}=this.findTarget(t),i={e:t,target:this._draggedoverTarget,subTargets:e,dragSource:this._dragSource};this.fire("dragleave",i),this._fireEnterLeaveEvents(t,void 0,i),this._renderDragEffects(t,this._dragSource),this._dropTarget=void 0,this._hoveredTargets=[]}_onDrop(t){let{currentContainer:e,currentSubTargets:i}=this.findTarget(t),r=this._basicEventHandler("drop:before",{e:t,target:e,subTargets:i,dragSource:this._dragSource,...co(this,t)});r.didDrop=!1,r.dropTarget=void 0,this._basicEventHandler("drop",r),this.fire("drop:after",r)}_onContextMenu(t){let{target:e,subTargets:i}=this.findTarget(t),r=this._basicEventHandler("contextmenu:before",{e:t,target:e,subTargets:i});return this.stopContextMenu&&we(t),this._basicEventHandler("contextmenu",r),!1}_onClick(t){let e=t.detail;e>3||e<2||(this._cacheTransformEventData(t),2==e&&"dblclick"===t.type&&this._handleEvent(t,"dblclick"),3==e&&this._handleEvent(t,"tripleclick"),this._resetTransformEventData())}fireEventFromPointerEvent(t,e,i,r={}){this._cacheTransformEventData(t);let{target:s,subTargets:n}=this.findTarget(t),o={e:t,target:s,subTargets:n,...co(this,t),transform:this._currentTransform,...r};this.fire(e,o),s&&s.fire(i,o);for(let t=0;t<n.length;t++)n[t]!==s&&n[t].fire(i,o);this._resetTransformEventData()}getPointerId(t){let e=t.changedTouches;return e?e[0]&&e[0].identifier:this.enablePointerEvents?t.pointerId:-1}_isMainEvent(t){return!0===t.isPrimary||!1!==t.isPrimary&&("touchend"===t.type&&0===t.touches.length||!t.changedTouches||t.changedTouches[0].identifier===this.mainTouchId)}_onTouchStart(t){this._cacheTransformEventData(t);let e=!this.allowTouchScrolling,i=this._activeObject;void 0===this.mainTouchId&&(this.mainTouchId=this.getPointerId(t)),this.__onMouseDown(t);let{target:r}=this.findTarget(t);(this.isDrawingMode||i&&r===i)&&(e=!0),e&&t.preventDefault();let s=this.upperCanvasEl,n=this._getEventPrefix(),o=ne(s);uo(o,"touchend",this._onTouchEnd,ho),e&&uo(o,"touchmove",this._onMouseMove,ho),go(s,`${n}down`,this._onMouseDown),this._resetTransformEventData()}_onMouseDown(t){this._cacheTransformEventData(t),this.__onMouseDown(t);let e=this.upperCanvasEl,i=this._getEventPrefix();go(e,`${i}move`,this._onMouseMove,ho);let r=ne(e);uo(r,`${i}up`,this._onMouseUp),uo(r,`${i}move`,this._onMouseMove,ho),this._resetTransformEventData()}_onTouchEnd(t){if(t.touches.length>0)return;this._cacheTransformEventData(t),this.__onMouseUp(t),this._resetTransformEventData(),delete this.mainTouchId;let e=this._getEventPrefix(),i=ne(this.upperCanvasEl);go(i,"touchend",this._onTouchEnd,ho),go(i,"touchmove",this._onMouseMove,ho),this._willAddMouseDown&&clearTimeout(this._willAddMouseDown),this._willAddMouseDown=setTimeout(()=>{uo(this.upperCanvasEl,`${e}down`,this._onMouseDown),this._willAddMouseDown=0},400)}_onMouseUp(t){this._cacheTransformEventData(t),this.__onMouseUp(t);let e=this.upperCanvasEl,i=this._getEventPrefix();if(this._isMainEvent(t)){let t=ne(this.upperCanvasEl);go(t,`${i}up`,this._onMouseUp),go(t,`${i}move`,this._onMouseMove,ho),uo(e,`${i}move`,this._onMouseMove,ho)}this._resetTransformEventData()}_onMouseMove(t){this._cacheTransformEventData(t);let e=this.getActiveObject();!this.allowTouchScrolling&&(!e||!e.shouldStartDragging(t))&&t.preventDefault&&t.preventDefault(),this.__onMouseMove(t),this._resetTransformEventData()}_onResize(){this.calcOffset(),this._resetTransformEventData()}_shouldRender(t){let e=this.getActiveObject();return!!e!=!!t||e&&t&&e!==t}__onMouseUp(t){var e;this._handleEvent(t,"up:before");let i=this._currentTransform,r=this._isClick,{target:s}=this.findTarget(t),{button:n}=t;if(n)return void((this.fireMiddleClick&&1===n||this.fireRightClick&&2===n)&&this._handleEvent(t,"up"));if(this.isDrawingMode&&this._isCurrentlyDrawing)return void this._onMouseUpInDrawingMode(t);if(!this._isMainEvent(t))return;let o,a,l=!1;if(i&&(this._finalizeCurrentTransform(t),l=i.actionPerformed),!r){let e=s===this._activeObject;this.handleSelection(t),l||(l=this._shouldRender(s)||!e&&s===this._activeObject)}if(s){let{key:e,control:r}=s.findControl(this.getViewportPoint(t),Ce(t))||{};if(a=e,s.selectable&&s!==this._activeObject&&"up"===s.activeOn)this.setActiveObject(s,t),l=!0;else if(r){let e=r.getMouseUpHandler(t,s,r);e&&(o=this.getScenePoint(t),e.call(r,t,i,o.x,o.y))}s.isMoving=!1}if(i&&(i.target!==s||i.corner!==a)){let e=i.target&&i.target.controls[i.corner],r=e&&e.getMouseUpHandler(t,i.target,e);o=o||this.getScenePoint(t),r&&r.call(e,t,i,o.x,o.y)}this._setCursorFromEvent(t,s),this._handleEvent(t,"up"),this._groupSelector=null,this._currentTransform=null,s&&(s.__corner=void 0),l?this.requestRenderAll():r||null!=(e=this._activeObject)&&e.isEditing||this.renderTop()}_basicEventHandler(t,e){let{target:i,subTargets:r=[]}=e;this.fire(t,e),i&&i.fire(t,e);for(let s=0;s<r.length;s++)r[s]!==i&&r[s].fire(t,e);return e}_handleEvent(t,e,i){let{target:r,subTargets:s}=this.findTarget(t),n={e:t,target:r,subTargets:s,...co(this,t),transform:this._currentTransform,..."down:before"===e||"down"===e?i:{}};"up:before"!==e&&"up"!==e||(n.isClick=this._isClick),this.fire(`mouse:${e}`,n),r&&r.fire(`mouse${e}`,n);for(let t=0;t<s.length;t++)s[t]!==r&&s[t].fire(`mouse${e}`,n)}_onMouseDownInDrawingMode(t){this._isCurrentlyDrawing=!0,this.getActiveObject()&&(this.discardActiveObject(t),this.requestRenderAll());let e=this.getScenePoint(t);this.freeDrawingBrush&&this.freeDrawingBrush.onMouseDown(e,{e:t,pointer:e}),this._handleEvent(t,"down",{alreadySelected:!1})}_onMouseMoveInDrawingMode(t){if(this._isCurrentlyDrawing){let e=this.getScenePoint(t);this.freeDrawingBrush&&this.freeDrawingBrush.onMouseMove(e,{e:t,pointer:e})}this.setCursor(this.freeDrawingCursor),this._handleEvent(t,"move")}_onMouseUpInDrawingMode(t){let e=this.getScenePoint(t);this.freeDrawingBrush?this._isCurrentlyDrawing=!!this.freeDrawingBrush.onMouseUp({e:t,pointer:e}):this._isCurrentlyDrawing=!1,this._handleEvent(t,"up")}__onMouseDown(t){this._isClick=!0,this._handleEvent(t,"down:before");let{target:e}=this.findTarget(t),i=!!e&&e===this._activeObject,{button:r}=t;if(r)return void((this.fireMiddleClick&&1===r||this.fireRightClick&&2===r)&&this._handleEvent(t,"down",{alreadySelected:i}));if(this.isDrawingMode)return void this._onMouseDownInDrawingMode(t);if(!this._isMainEvent(t)||this._currentTransform)return;let s=this._shouldRender(e),n=!1;if(this.handleMultiSelection(t,e)?(e=this._activeObject,n=!0,s=!0):this._shouldClearSelection(t,e)&&this.discardActiveObject(t),this.selection&&(!e||!e.selectable&&!e.isEditing&&e!==this._activeObject)){let e=this.getScenePoint(t);this._groupSelector={x:e.x,y:e.y,deltaY:0,deltaX:0}}if(i=!!e&&e===this._activeObject,e){e.selectable&&"down"===e.activeOn&&this.setActiveObject(e,t);let r=e.findControl(this.getViewportPoint(t),Ce(t));if(e===this._activeObject&&(r||!n)){this._setupCurrentTransform(t,e,i);let s=r?r.control:void 0,n=this.getScenePoint(t),o=s&&s.getMouseDownHandler(t,e,s);o&&o.call(s,t,this._currentTransform,n.x,n.y)}}s&&(this._objectsToRender=void 0),this._handleEvent(t,"down",{alreadySelected:i}),s&&this.requestRenderAll()}_resetTransformEventData(){this._targetInfo=this._viewportPoint=this._scenePoint=void 0}_cacheTransformEventData(t){this._resetTransformEventData(),this._viewportPoint=this.getViewportPoint(t),this._scenePoint=Pe(this._viewportPoint,void 0,this.viewportTransform),this._targetInfo=this.findTarget(t),this._currentTransform&&(this._targetInfo.target=this._currentTransform.target)}__onMouseMove(t){if(this._isClick=!1,this._handleEvent(t,"move:before"),this.isDrawingMode)return void this._onMouseMoveInDrawingMode(t);if(!this._isMainEvent(t))return;let e=this._groupSelector;if(e){let i=this.getScenePoint(t);e.deltaX=i.x-e.x,e.deltaY=i.y-e.y,this.renderTop()}else if(this._currentTransform)this._transformObject(t);else{let{target:e}=this.findTarget(t);this._setCursorFromEvent(t,e),this._fireOverOutEvents(t,e)}this.textEditingManager.onMouseMove(t),this._handleEvent(t,"move")}_fireOverOutEvents(t,e){let{_hoveredTarget:i,_hoveredTargets:r}=this,{subTargets:s,currentTarget:n}=this.findTarget(t),o=Math.max(r.length,s.length);this.fireSyntheticInOutEvents("mouse",{e:t,target:e,oldTarget:i,actualTarget:n,oldActualTarget:this._hoveredActualTarget,fireCanvas:!0});for(let n=0;n<o;n++)s[n]===e||r[n]&&r[n]===i||this.fireSyntheticInOutEvents("mouse",{e:t,target:s[n],oldTarget:r[n]});this._hoveredActualTarget=n,this._hoveredTarget=e,this._hoveredTargets=s}_fireEnterLeaveEvents(t,e,i){let r=this._draggedoverTarget,s=this._hoveredTargets,{subTargets:n}=this.findTarget(t),o=Math.max(s.length,n.length);this.fireSyntheticInOutEvents("drag",{...i,target:e,oldTarget:r,fireCanvas:!0});for(let t=0;t<o;t++)this.fireSyntheticInOutEvents("drag",{...i,target:n[t],oldTarget:s[t]});this._draggedoverTarget=e}fireSyntheticInOutEvents(t,{target:e,oldTarget:i,actualTarget:r,oldActualTarget:s,fireCanvas:n,e:o,...a}){let{targetIn:l,targetOut:h,canvasIn:c,canvasOut:u}=fo[t],d=i!==e,g=s!==r,f=e&&d,p=r&&g,m=i&&d,y=s&&g,b={...a,e:o,...co(this,o)},_={...b,target:i,nextTarget:e,actualTarget:s,nextActualTarget:r};(m||y)&&n&&this.fire(u,_),m&&i.fire(h,_),y&&i!==s&&s.fire(h,_);let v={...b,target:e,previousTarget:i,actualTarget:r,previousActualTarget:s};(f||p)&&n&&this.fire(c,v),f&&e.fire(l,v),p&&r!==e&&r.fire(l,v)}_transformObject(t){let e=this.getScenePoint(t),i=this._currentTransform,r=i.target,s=r.group?Pe(e,void 0,r.group.calcTransformMatrix()):e;i.shiftKey=t.shiftKey,i.altKey=!!this.centeredKey&&t[this.centeredKey],this._performTransformAction(t,i,s),i.actionPerformed&&this.requestRenderAll()}_performTransformAction(t,e,i){let{action:r,actionHandler:s,target:n}=e,o=!!s&&s(t,e,i.x,i.y);o&&n.setCoords(),"drag"===r&&o&&(e.target.isMoving=!0,this.setCursor(e.target.moveCursor||this.moveCursor)),e.actionPerformed=e.actionPerformed||o}_setCursorFromEvent(t,e){if(!e)return void this.setCursor(this.defaultCursor);let i=e.hoverCursor||this.hoverCursor,r=re(this._activeObject)?this._activeObject:null,s=(!r||e.group!==r)&&e.findControl(this.getViewportPoint(t));if(s){let{control:i,coord:r}=s;this.setCursor(i.cursorStyleHandler(t,i,e,r))}else{if(e.subTargetCheck){let{subTargets:e}=this.findTarget(t);e.concat().reverse().forEach(t=>{i=t.hoverCursor||i})}this.setCursor(i)}}handleMultiSelection(t,e){let i=this._activeObject,r=re(i);if(i&&this._isSelectionKeyPressed(t)&&this.selection&&e&&e.selectable&&(i!==e||r)&&(r||!e.isDescendantOf(i)&&!i.isDescendantOf(e))&&!e.onSelect({e:t})&&!i.getActiveControl()){if(r){let r=i.getObjects(),s=[];if(e===i){let i=this.getScenePoint(t),n=this.searchPossibleTargets(r,i);if(n.target?(e=n.target,s=n.subTargets):(n=this.searchPossibleTargets(this._objects,i),e=n.target,s=n.subTargets),!e||!e.selectable)return!1}e.group===i?(i.remove(e),this._hoveredTarget=e,this._hoveredTargets=s,1===i.size()&&this._setActiveObject(i.item(0),t)):(i.multiSelectAdd(e),this._hoveredTarget=i,this._hoveredTargets=s),this._fireSelectionEvents(r,t)}else{i.isEditing&&i.exitEditing();let r=new(at.getClass("ActiveSelection"))([],{canvas:this});r.multiSelectAdd(i,e),this._hoveredTarget=r,this._setActiveObject(r,t),this._fireSelectionEvents([i],t)}return!0}return!1}handleSelection(t){if(!this.selection||!this._groupSelector)return!1;let{x:e,y:i,deltaX:r,deltaY:s}=this._groupSelector,n=new gt(e,i),o=n.add(new gt(r,s)),a=n.min(o),l=n.max(o).subtract(a),h=this.collectObjects({left:a.x,top:a.y,width:l.x,height:l.y},{includeIntersecting:!this.selectionFullyContained}),c=n.eq(o)?h[0]?[h[0]]:[]:h.length>1?h.filter(e=>!e.onSelect({e:t})).reverse():h;if(1===c.length)this.setActiveObject(c[0],t);else if(c.length>1){let e=at.getClass("ActiveSelection");this.setActiveObject(new e(c,{canvas:this}),t)}return this._groupSelector=null,!0}toCanvasElement(t=1,e){let{upper:i}=this.elements;i.ctx=void 0;let r=super.toCanvasElement(t,e);return i.ctx=i.el.getContext("2d"),r}clear(){this.textEditingManager.clear(),super.clear()}destroy(){this.removeListeners(),this.textEditingManager.dispose(),super.destroy()}};const mo={x1:0,y1:0,x2:0,y2:0},yo={...mo,r1:0,r2:0},bo=(t,e)=>isNaN(t)&&"number"==typeof e?e:t;function _o(t){return t&&/%$/.test(t)&&Number.isFinite(parseFloat(t))}function vo(t,e){return Bi(0,bo("number"==typeof t?t:"string"==typeof t?parseFloat(t)/(_o(t)?100:1):NaN,e),1)}const xo=/\s*;\s*/,Co=/\s*:\s*/;function wo(t,e){let i,r,s=t.getAttribute("style");if(s){let t=s.split(xo);""===t[t.length-1]&&t.pop();for(let e=t.length;e--;){let[s,n]=t[e].split(Co).map(t=>t.trim());"stop-color"===s?i=n:"stop-opacity"===s&&(r=n)}}i=i||t.getAttribute("stop-color")||"rgb(0,0,0)",r=bo(parseFloat(r||t.getAttribute("stop-opacity")||""),1);let n=new gi(i);return n.setAlpha(n.getAlpha()*r*e),{offset:vo(t.getAttribute("offset"),0),color:n.toRgba()}}function So(t,e){let i=[],r=t.getElementsByTagName("stop"),s=vo(e,1);for(let t=r.length;t--;)i.push(wo(r[t],s));return i}function To(t){return"linearGradient"===t.nodeName||"LINEARGRADIENT"===t.nodeName?"linear":"radial"}function Oo(t){return"userSpaceOnUse"===t.getAttribute("gradientUnits")?"pixels":"percentage"}function ko(t,e){return t.getAttribute(e)}function Do(t,e){return function(t,{width:e,height:i,gradientUnits:r}){let s;return Object.entries(t).reduce((t,[n,o])=>{if("Infinity"===o)s=1;else if("-Infinity"===o)s=0;else{let t="string"==typeof o;s=t?parseFloat(o):o,t&&_o(o)&&(s*=.01,"pixels"===r&&("x1"!==n&&"x2"!==n&&"r2"!==n||(s*=e),"y1"!==n&&"y2"!==n||(s*=i)))}return t[n]=s,t},{})}("linear"===To(t)?function(t){return{x1:ko(t,"x1")||0,y1:ko(t,"y1")||0,x2:ko(t,"x2")||"100%",y2:ko(t,"y2")||0}}(t):function(t){return{x1:ko(t,"fx")||ko(t,"cx")||"50%",y1:ko(t,"fy")||ko(t,"cy")||"50%",r1:0,x2:ko(t,"cx")||"50%",y2:ko(t,"cy")||"50%",r2:ko(t,"r")||"50%"}}(t),{...e,gradientUnits:Oo(t)})}var Mo=class{constructor(t){let{type:e="linear",gradientUnits:i="pixels",coords:r={},colorStops:s=[],offsetX:n=0,offsetY:o=0,gradientTransform:a,id:l}=t||{};Object.assign(this,{type:e,gradientUnits:i,coords:{..."radial"===e?yo:mo,...r},colorStops:s,offsetX:n,offsetY:o,gradientTransform:a,id:l?`${l}_${xt()}`:xt()})}addColorStop(t){for(let e in t)this.colorStops.push({offset:parseFloat(e),color:t[e]});return this}toObject(t){return{...Kt(this,t),type:this.type,coords:{...this.coords},colorStops:this.colorStops.map(t=>({...t})),offsetX:this.offsetX,offsetY:this.offsetY,gradientUnits:this.gradientUnits,gradientTransform:this.gradientTransform?[...this.gradientTransform]:void 0}}toSVG(t,{additionalTransform:e}={}){let i=[],r=this.gradientTransform?this.gradientTransform.concat():I.concat(),s="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox",n=this.colorStops.map(t=>({...t})).sort((t,e)=>t.offset-e.offset),o=-this.offsetX,a=-this.offsetY;var l;"objectBoundingBox"===s?(o/=t.width,a/=t.height):(o+=t.width/2,a+=t.height/2),(l=t)&&"function"==typeof l._renderPathCommands&&"percentage"!==this.gradientUnits&&(o-=t.pathOffset.x,a-=t.pathOffset.y),r[4]-=o,r[5]-=a;let h=[`id="SVGID_${fe(String(this.id))}"`,`gradientUnits="${s}"`,`gradientTransform="${e?e+" ":""}${Zt(r)}"`,""].join(" "),c=t=>parseFloat(String(t));if("linear"===this.type){let{x1:t,y1:e,x2:r,y2:s}=this.coords,n=c(t),o=c(e),a=c(r),l=c(s);i.push("<linearGradient ",h,' x1="',n,'" y1="',o,'" x2="',a,'" y2="',l,'">\n')}else if("radial"===this.type){let{x1:t,y1:e,x2:r,y2:s,r1:o,r2:a}=this.coords,l=c(t),u=c(e),d=c(r),g=c(s),f=c(o),p=c(a),m=f>p;i.push("<radialGradient ",h,' cx="',m?l:d,'" cy="',m?u:g,'" r="',m?f:p,'" fx="',m?d:l,'" fy="',m?g:u,'">\n'),m&&(n.reverse(),n.forEach(t=>{t.offset=1-t.offset}));let y=Math.min(f,p);if(y>0){let t=y/Math.max(f,p);n.forEach(e=>{e.offset+=t*(1-e.offset)})}}return n.forEach(({color:t,offset:e})=>{let r=String(t),s=ri(r)?r:new gi(r).toRgba();i.push(`<stop offset="${100*e}%" style="stop-color:${fe(s)};"/>\n`)}),i.push("linear"===this.type?"</linearGradient>":"</radialGradient>","\n"),i.join("")}toLive(t){let{x1:e,y1:i,x2:r,y2:s,r1:n,r2:o}=this.coords,a="linear"===this.type?t.createLinearGradient(e,i,r,s):t.createRadialGradient(e,i,n,r,s,o);return this.colorStops.forEach(({color:t,offset:e})=>{a.addColorStop(e,t)}),a}static async fromObject(t){let{colorStops:e,gradientTransform:i}=t;return new this({...t,colorStops:e?e.map(t=>({...t})):void 0,gradientTransform:i?[...i]:void 0})}static fromElement(t,e,i){let r=Oo(t),s=e._findCenterFromElement();return new this({id:t.getAttribute("id")||void 0,type:To(t),coords:Do(t,{width:i.viewBoxWidth||i.width,height:i.viewBoxHeight||i.height}),colorStops:So(t,i.opacity),gradientUnits:r,gradientTransform:Hs(t.getAttribute("gradientTransform")||""),..."pixels"===r?{offsetX:e.width/2-s.x,offsetY:e.height/2-s.y}:{offsetX:0,offsetY:0}})}};p(Mo,"type","Gradient"),at.setClass(Mo,"gradient"),at.setClass(Mo,"linear"),at.setClass(Mo,"radial");var jo=class{get type(){return"pattern"}set type(t){b("warn","Setting type has no effect",t)}constructor(t){p(this,"repeat","repeat"),p(this,"offsetX",0),p(this,"offsetY",0),p(this,"crossOrigin",""),this.id=xt(),Object.assign(this,t)}isImageSource(){return!!this.source&&"string"==typeof this.source.src}isCanvasSource(){return!!this.source&&!!this.source.toDataURL}sourceToString(){return this.isImageSource()?this.source.src:this.isCanvasSource()?this.source.toDataURL():""}toLive(t){return this.source&&(!this.isImageSource()||this.source.complete&&0!==this.source.naturalWidth&&0!==this.source.naturalHeight)?t.createPattern(this.source,this.repeat):null}toObject(t=[]){let{repeat:e,crossOrigin:i}=this;return{...Kt(this,t),type:"pattern",source:this.sourceToString(),repeat:e,crossOrigin:i,offsetX:Qt(this.offsetX,y.NUM_FRACTION_DIGITS),offsetY:Qt(this.offsetY,y.NUM_FRACTION_DIGITS),patternTransform:this.patternTransform?[...this.patternTransform]:null}}toSVG({width:t,height:e}){let{source:i,repeat:r,id:s}=this,n=bo(this.offsetX/t,0),o=bo(this.offsetY/e,0),a="repeat-y"===r||"no-repeat"===r?1+Math.abs(n||0):bo(i.width/t,0),l="repeat-x"===r||"no-repeat"===r?1+Math.abs(o||0):bo(i.height/e,0);return[`<pattern id="SVGID_${fe(s)}" x="${n}" y="${o}" width="${a}" height="${l}">`,`<image x="0" y="0" width="${i.width}" height="${i.height}" xlink:href="${fe(this.sourceToString())}"></image>`,"</pattern>",""].join("\n")}static async fromObject({type:t,source:e,patternTransform:i,...r},s){let n=await Gt(e,{...s,crossOrigin:r.crossOrigin});return new this({...r,patternTransform:i&&i.slice(0),source:n})}};p(jo,"type","Pattern"),at.setClass(jo),at.setClass(jo,"pattern");var Eo=class t extends ys{constructor(e,{path:i,left:r,top:s,...n}={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(n),this._setPath(e||[],!0),"number"==typeof r&&this.set("left",r),"number"==typeof s&&this.set("top",s)}_setPath(t,e){this.path=xn(Array.isArray(t)?t:Rn(t)),this.setBoundingBox(e)}_findCenterFromElement(){let t=this._calcBoundsFromPath();return new gt(t.left+t.width/2,t.top+t.height/2)}_renderPathCommands(t){let e=-this.pathOffset.x,i=-this.pathOffset.y;t.beginPath();for(let r of this.path)switch(r[0]){case"L":t.lineTo(r[1]+e,r[2]+i);break;case"M":t.moveTo(r[1]+e,r[2]+i);break;case"C":t.bezierCurveTo(r[1]+e,r[2]+i,r[3]+e,r[4]+i,r[5]+e,r[6]+i);break;case"Q":t.quadraticCurveTo(r[1]+e,r[2]+i,r[3]+e,r[4]+i);break;case"Z":t.closePath()}}_render(t){this._renderPathCommands(t),this._renderPaintInOrder(t)}toString(){return`#<Path (${this.complexity()}): { "top": ${this.top}, "left": ${this.left} }>`}toObject(t=[]){return{...super.toObject(t),path:this.path.map(t=>t.slice())}}toDatalessObject(t=[]){let e=this.toObject(t);return this.sourcePath&&(delete e.path,e.sourcePath=this.sourcePath),e}_toSVG(){return["<path ","COMMON_PARTS",`d="${Yn(this.path,y.NUM_FRACTION_DIGITS)}" stroke-linecap="round" />\n`]}_getOffsetTransform(){let t=y.NUM_FRACTION_DIGITS;return` translate(${Qt(-this.pathOffset.x,t)}, ${Qt(-this.pathOffset.y,t)})`}toClipPathSVG(t){let e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}toSVG(t){let e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}complexity(){return this.path.length}setDimensions(){this.setBoundingBox()}setBoundingBox(t){let{width:e,height:i,pathOffset:r}=this._calcDimensions();this.set({width:e,height:i,pathOffset:r}),t&&this.setPositionByOrigin(r,"center","center")}_calcBoundsFromPath(){let t=[],e=0,i=0,r=0,s=0;for(let n of this.path)switch(n[0]){case"L":r=n[1],s=n[2],t.push({x:e,y:i},{x:r,y:s});break;case"M":r=n[1],s=n[2],e=r,i=s;break;case"C":t.push(...bn(r,s,n[1],n[2],n[3],n[4],n[5],n[6])),r=n[5],s=n[6];break;case"Q":t.push(...bn(r,s,n[1],n[2],n[1],n[2],n[3],n[4])),r=n[3],s=n[4];break;case"Z":r=e,s=i}return Se(t)}_calcDimensions(){let t=this._calcBoundsFromPath();return{...t,pathOffset:new gt(t.left+t.width/2,t.top+t.height/2)}}static fromObject(t){return this._fromObject(t,{extraParam:"path"})}static async fromElement(t,e,i){let{d:r,...s}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this(r,{...s,...e,left:void 0,top:void 0})}};p(Eo,"type","Path"),p(Eo,"cacheProperties",[...Xi,"path","fillRule"]),p(Eo,"ATTRIBUTE_NAMES",[...Ds,"d"]),at.setClass(Eo),at.setSVGClass(Eo);const Po=["radius","startAngle","endAngle","counterClockwise"];var Ao=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_set(t,e){return super._set(t,e),"radius"===t&&this.setRadius(e),this}_render(t){t.beginPath(),t.arc(0,0,this.radius,Dt(this.startAngle),Dt(this.endAngle),this.counterClockwise),this._renderPaintInOrder(t)}getRadiusX(){return this.get("radius")*this.get(Q)}getRadiusY(){return this.get("radius")*this.get(Z)}setRadius(t){this.radius=t,this.set({width:2*t,height:2*t})}toObject(t=[]){return super.toObject([...Po,...t])}_toSVG(){let{radius:t,startAngle:e,endAngle:i}=this,r=(i-e)%360;if(0===r)return["<circle ","COMMON_PARTS",'cx="0" cy="0" ','r="',`${fe(t)}`,'" />\n'];{let s=Dt(e),n=Dt(i),o=ut(s)*t,a=dt(s)*t,l=ut(n)*t,h=dt(n)*t;return[`<path d="M ${o} ${a} A ${t} ${t} 0 ${+(r>180)} ${+!this.counterClockwise} ${l} ${h}" `,"COMMON_PARTS"," />\n"]}}static async fromElement(t,e,i){let{left:r=0,top:s=0,radius:n=0,...o}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this({...o,radius:n,left:r-n,top:s-n})}static fromObject(t){return super._fromObject(t)}};p(Ao,"type","Circle"),p(Ao,"cacheProperties",[...Xi,...Po]),p(Ao,"ownDefaults",{radius:0,startAngle:0,endAngle:360,counterClockwise:!1}),p(Ao,"ATTRIBUTE_NAMES",["cx","cy","r",...Ds]),at.setClass(Ao),at.setSVGClass(Ao);const Fo=["x1","x2","y1","y2"];var Lo=class t extends ys{constructor([e,i,r,s]=[0,0,0,0],n={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(n),this.x1=e,this.x2=r,this.y1=i,this.y2=s,this._setWidthHeight();let{left:o,top:a}=n;"number"==typeof o&&this.set("left",o),"number"==typeof a&&this.set("top",a)}_setWidthHeight(){let{x1:t,y1:e,x2:i,y2:r}=this;this.width=Math.abs(i-t),this.height=Math.abs(r-e);let{left:s,top:n,width:o,height:a}=Se([{x:t,y:e},{x:i,y:r}]),l=new gt(s+o/2,n+a/2);this.setPositionByOrigin(l,R,R)}_set(t,e){return super._set(t,e),Fo.includes(t)&&this._setWidthHeight(),this}_render(t){t.beginPath();let e=this.calcLinePoints();t.moveTo(e.x1,e.y1),t.lineTo(e.x2,e.y2),t.lineWidth=this.strokeWidth;let i=t.strokeStyle;var r;te(this.stroke)?t.strokeStyle=this.stroke.toLive(t):t.strokeStyle=null==(r=this.stroke)?t.fillStyle:r,this.stroke&&this._renderStroke(t),t.strokeStyle=i}_findCenterFromElement(){return new gt((this.x1+this.x2)/2,(this.y1+this.y2)/2)}toObject(t=[]){return{...super.toObject(t),...this.calcLinePoints()}}_getNonTransformedDimensions(){let t=super._getNonTransformedDimensions();return"butt"===this.strokeLineCap&&(0===this.width&&(t.y-=this.strokeWidth),0===this.height&&(t.x-=this.strokeWidth)),t}calcLinePoints(){let{x1:t,x2:e,y1:i,y2:r,width:s,height:n}=this,o=t<=e?-.5:.5,a=i<=r?-.5:.5;return{x1:o*s,x2:o*-s,y1:a*n,y2:a*-n}}_toSVG(){let{x1:t,x2:e,y1:i,y2:r}=this.calcLinePoints();return["<line ","COMMON_PARTS",`x1="${t}" y1="${i}" x2="${e}" y2="${r}" />\n`]}static async fromElement(t,e,i){let{x1:r=0,y1:s=0,x2:n=0,y2:o=0,...a}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this([r,s,n,o],a)}static fromObject({x1:t,y1:e,x2:i,y2:r,...s}){return this._fromObject({...s,points:[t,e,i,r]},{extraParam:"points"})}};p(Lo,"type","Line"),p(Lo,"cacheProperties",[...Xi,...Fo]),p(Lo,"ATTRIBUTE_NAMES",Ds.concat(Fo)),at.setClass(Lo),at.setSVGClass(Lo);var Io=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_render(t){let e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderPaintInOrder(t)}_toSVG(){let t=this.width/2,e=this.height/2;return["<polygon ","COMMON_PARTS",'points="',`${-t} ${e},0 ${-e},${t} ${e}`,'" />']}};p(Io,"type","Triangle"),p(Io,"ownDefaults",{width:100,height:100}),at.setClass(Io),at.setSVGClass(Io);const Ro=["rx","ry"];var Bo=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_set(t,e){switch(super._set(t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this}getRx(){return this.get("rx")*this.get(Q)}getRy(){return this.get("ry")*this.get(Z)}toObject(t=[]){return super.toObject([...Ro,...t])}_toSVG(){return["<ellipse ","COMMON_PARTS",`cx="0" cy="0" rx="${fe(this.rx)}" ry="${fe(this.ry)}" />\n`]}_render(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,F,!1),t.restore(),this._renderPaintInOrder(t)}static async fromElement(t,e,i){let r=Ks(t,this.ATTRIBUTE_NAMES,i);return r.left=(r.left||0)-r.rx,r.top=(r.top||0)-r.ry,new this(r)}};p(Bo,"type","Ellipse"),p(Bo,"cacheProperties",[...Xi,...Ro]),p(Bo,"ownDefaults",{rx:0,ry:0}),p(Bo,"ATTRIBUTE_NAMES",[...Ds,"cx","cy","rx","ry"]),at.setClass(Bo),at.setSVGClass(Bo);const $o={exactBoundingBox:!1};var Xo=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),p(this,"strokeDiff",void 0),Object.assign(this,t.ownDefaults),this.setOptions(i),this.points=e;let{left:r,top:s}=i;this.initialized=!0,this.setBoundingBox(!0),"number"==typeof r&&this.set("left",r),"number"==typeof s&&this.set("top",s)}isOpen(){return!0}_projectStrokeOnPoints(t){return ws(this.points,t,this.isOpen())}_calcDimensions(t){t={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:this.strokeMiterLimit,strokeUniform:this.strokeUniform,strokeWidth:this.strokeWidth,...t||{}};let e=this.exactBoundingBox?this._projectStrokeOnPoints(t).map(t=>t.projectedPoint):this.points;if(0===e.length)return{left:0,top:0,width:0,height:0,pathOffset:new gt,strokeOffset:new gt,strokeDiff:new gt};let i=Se(e),r=zt({...t,scaleX:1,scaleY:1}),s=Se(this.points.map(t=>Et(t,r,!0))),n=new gt(this.scaleX,this.scaleY),o=i.left+i.width/2,a=i.top+i.height/2;return this.exactBoundingBox&&(o-=a*Math.tan(Dt(this.skewX)),a-=o*Math.tan(Dt(this.skewY))),{...i,pathOffset:new gt(o,a),strokeOffset:new gt(s.left,s.top).subtract(new gt(i.left,i.top)).multiply(n),strokeDiff:new gt(i.width,i.height).subtract(new gt(s.width,s.height)).multiply(n)}}_findCenterFromElement(){let t=Se(this.points);return new gt(t.left+t.width/2,t.top+t.height/2)}setDimensions(){this.setBoundingBox()}setBoundingBox(t){let{left:e,top:i,width:r,height:s,pathOffset:n,strokeOffset:o,strokeDiff:a}=this._calcDimensions();this.set({width:r,height:s,pathOffset:n,strokeOffset:o,strokeDiff:a}),t&&this.setPositionByOrigin(new gt(e+r/2,i+s/2),"center","center")}isStrokeAccountedForInDimensions(){return this.exactBoundingBox}_getNonTransformedDimensions(){return this.exactBoundingBox?new gt(this.width,this.height):super._getNonTransformedDimensions()}_getTransformedDimensions(t={}){if(this.exactBoundingBox){let n;if(Object.keys(t).some(t=>this.strokeUniform||this.constructor.layoutProperties.includes(t))){var e,i;let{width:r,height:s}=this._calcDimensions(t);n=new gt(null==(e=t.width)?r:e,null==(i=t.height)?s:i)}else{var r,s;n=new gt(null==(r=t.width)?this.width:r,null==(s=t.height)?this.height:s)}return n.multiply(new gt(t.scaleX||this.scaleX,t.scaleY||this.scaleY))}return super._getTransformedDimensions(t)}_set(t,e){let i=this.initialized&&this[t]!==e,r=super._set(t,e);return this.exactBoundingBox&&i&&(("scaleX"===t||"scaleY"===t)&&this.strokeUniform&&this.constructor.layoutProperties.includes("strokeUniform")||this.constructor.layoutProperties.includes(t))&&this.setDimensions(),r}toObject(t=[]){return{...super.toObject(t),points:this.points.map(({x:t,y:e})=>({x:t,y:e}))}}_toSVG(){let t=this.pathOffset.x,e=this.pathOffset.y,i=y.NUM_FRACTION_DIGITS,r=this.points.map(({x:r,y:s})=>`${Qt(r-t,i)},${Qt(s-e,i)}`).join(" ");return[`<${fe(this.constructor.type).toLowerCase()} `,"COMMON_PARTS",`points="${r}" />\n`]}_render(t){let e=this.points.length,i=this.pathOffset.x,r=this.pathOffset.y;if(e&&!isNaN(this.points[e-1].y)){t.beginPath(),t.moveTo(this.points[0].x-i,this.points[0].y-r);for(let s=0;s<e;s++){let e=this.points[s];t.lineTo(e.x-i,e.y-r)}!this.isOpen()&&t.closePath(),this._renderPaintInOrder(t)}}complexity(){return this.points.length}static async fromElement(t,e,i){let r=function(t){if(!t)return[];let e=t.replace(/,/g," ").trim().split(/\s+/),i=[];for(let t=0;t<e.length;t+=2)i.push({x:parseFloat(e[t]),y:parseFloat(e[t+1])});return i}(t.getAttribute("points")),{left:s,top:n,...o}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this(r,{...o,...e})}static fromObject(t){return this._fromObject(t,{extraParam:"points"})}};p(Xo,"ownDefaults",$o),p(Xo,"type","Polyline"),p(Xo,"layoutProperties",[tt,et,"strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeWidth","strokeUniform","points"]),p(Xo,"cacheProperties",[...Xi,"points"]),p(Xo,"ATTRIBUTE_NAMES",[...Ds]),at.setClass(Xo),at.setSVGClass(Xo);var Yo=class extends Xo{isOpen(){return!1}};p(Yo,"ownDefaults",$o),p(Yo,"type","Polygon"),at.setClass(Yo),at.setSVGClass(Yo);var Wo=class extends ys{isEmptyStyles(t){if(!this.styles||void 0!==t&&!this.styles[t])return!0;let e=void 0===t?this.styles:{line:this.styles[t]};for(let t in e)for(let i in e[t])for(let r in e[t][i])return!1;return!0}styleHas(t,e){if(!this.styles||void 0!==e&&!this.styles[e])return!1;let i=void 0===e?this.styles:{0:this.styles[e]};for(let e in i)for(let r in i[e])if(void 0!==i[e][r][t])return!0;return!1}cleanStyle(t){if(!this.styles)return!1;let e,i,r=this.styles,s=0,n=!0,o=0;for(let o in r){e=0;for(let a in r[o]){let l=r[o][a]||{};s++,void 0===l[t]?n=!1:(i?l[t]!==i&&(n=!1):i=l[t],l[t]===this[t]&&delete l[t]),0===Object.keys(l).length?delete r[o][a]:e++}0===e&&delete r[o]}for(let t=0;t<this._textLines.length;t++)o+=this._textLines[t].length;n&&s===o&&(this[t]=i,this.removeStyle(t))}removeStyle(t){if(!this.styles)return;let e,i,r,s=this.styles;for(i in s){for(r in e=s[i],e)delete e[r][t],0===Object.keys(e[r]).length&&delete e[r];0===Object.keys(e).length&&delete s[i]}}_extendStyles(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t);this._getLineStyle(i)||this._setLineStyle(i);let s=Jt({...this._getStyleDeclaration(i,r),...e},t=>void 0!==t);this._setStyleDeclaration(i,r,s)}getSelectionStyles(t,e,i){let r=[];for(let s=t;s<(e||t);s++)r.push(this.getStyleAtPosition(s,i));return r}getStyleAtPosition(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t);return e?this.getCompleteStyleDeclaration(i,r):this._getStyleDeclaration(i,r)}setSelectionStyles(t,e,i){for(let r=e;r<(i||e);r++)this._extendStyles(r,t);this._forceClearCache=!0}_getStyleDeclaration(t,e){var i;let r=this.styles&&this.styles[t];return r&&null!=(i=r[e])?i:{}}getCompleteStyleDeclaration(t,e){return{...Kt(this,this.constructor._styleProperties),...this._getStyleDeclaration(t,e)}}_setStyleDeclaration(t,e,i){this.styles[t][e]=i}_deleteStyleDeclaration(t,e){delete this.styles[t][e]}_getLineStyle(t){return!!this.styles[t]}_setLineStyle(t){this.styles[t]={}}_deleteLineStyle(t){delete this.styles[t]}};p(Wo,"_styleProperties",Ti);const No=/  +/g,Vo=/"/g;function zo(t,e,i,r,s){return`\t\t${((t,{left:e,top:i,width:r,height:s},n=y.NUM_FRACTION_DIGITS)=>{let o=yi(it,t,!1),[a,l,h,c]=[e,i,r,s].map(t=>Qt(t,n));return`<rect ${o} x="${a}" y="${l}" width="${h}" height="${c}"></rect>`})(t,{left:e,top:i,width:r,height:s})}\n`}let Ho;var Go=class t extends Wo{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(),p(this,"__charBounds",[]),Object.assign(this,t.ownDefaults),this.setOptions(i),this.styles||(this.styles={}),this.text=e,this.initialized=!0,this.path&&this.setPathInfo(),this.initDimensions(),this.setCoords()}setPathInfo(){let t=this.path;t&&(t.segmentsInfo=En(t.path))}_splitText(){let t=this._splitTextIntoLines(this.text);return this.textLines=t.lines,this._textLines=t.graphemeLines,this._unwrappedTextLines=t._unwrappedLines,this._text=t.graphemeText,t}initDimensions(){this._splitText(),this._clearCache(),this.dirty=!0,this.path?(this.width=this.path.width,this.height=this.path.height):(this.width=this.calcTextWidth()||this.cursorWidth||this.MIN_TEXT_WIDTH,this.height=this.calcTextHeight()),this.textAlign.includes("justify")&&this.enlargeSpaces()}enlargeSpaces(){let t,e,i,r,s,n,o;for(let a=0,l=this._textLines.length;a<l;a++)if(("justify"===this.textAlign||a!==l-1&&!this.isEndOfWrapping(a))&&(r=0,s=this._textLines[a],e=this.getLineWidth(a),e<this.width&&(o=this.textLines[a].match(this._reSpacesAndTabs)))){i=o.length,t=(this.width-e)/i;for(let e=0;e<=s.length;e++)n=this.__charBounds[a][e],this._reSpaceAndTab.test(s[e])?(n.width+=t,n.kernedWidth+=t,n.left+=r,r+=t):n.left+=r}}isEndOfWrapping(t){return t===this._textLines.length-1}missingNewlineOffset(t){return 1}get2DCursorLocation(t,e){let i,r=e?this._unwrappedTextLines:this._textLines;for(i=0;i<r.length;i++){if(t<=r[i].length)return{lineIndex:i,charIndex:t};t-=r[i].length+this.missingNewlineOffset(i,e)}return{lineIndex:i-1,charIndex:r[i-1].length<t?r[i-1].length:t}}toString(){return`#<Text (${this.complexity()}): { "text": "${this.text}", "fontFamily": "${this.fontFamily}" }>`}_getCacheCanvasDimensions(){let t=super._getCacheCanvasDimensions(),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t}_render(t){let e=this.path;e&&!e.isNotVisible()&&e._render(t),this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")}_renderText(t){"stroke"===this.paintFirst?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))}_setTextStyles(t,e,i){if(t.textBaseline="alphabetic",this.path)switch(this.pathAlign){case R:t.textBaseline="middle";break;case"ascender":t.textBaseline="top";break;case"descender":t.textBaseline=$}t.font=this._getFontDeclaration(e,i)}calcTextWidth(){let t=this.getLineWidth(0);for(let e=1,i=this._textLines.length;e<i;e++){let i=this.getLineWidth(e);i>t&&(t=i)}return t}_renderTextLine(t,e,i,r,s,n){this._renderChars(t,e,i,r,s,n)}_renderTextLinesBackground(t){if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor"))return;let e=t.fillStyle,i=this._getLeftOffset(),r=this._getTopOffset();for(let e=0,s=this._textLines.length;e<s;e++){let s=this.getHeightOfLine(e);if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor",e)){r+=s;continue}let n,o,a=this._textLines[e].length,l=this._getLineLeftOffset(e),h=0,c=0,u=this.getValueOfPropertyAt(e,0,"textBackgroundColor"),d=this.getHeightOfLineImpl(e);for(let s=0;s<a;s++){let a=this.__charBounds[e][s];o=this.getValueOfPropertyAt(e,s,"textBackgroundColor"),this.path?(t.save(),t.translate(a.renderLeft,a.renderTop),t.rotate(a.angle),t.fillStyle=o,o&&t.fillRect(-a.width/2,-d*(1-this._fontSizeFraction),a.width,d),t.restore()):o===u?h+=a.kernedWidth:(n=i+l+c,"rtl"===this.direction&&(n=this.width-n-h),t.fillStyle=u,u&&t.fillRect(n,r,h,d),c=a.left,h=a.width,u=o)}o&&!this.path&&(n=i+l+c,"rtl"===this.direction&&(n=this.width-n-h),t.fillStyle=o,t.fillRect(n,r,h,d)),r+=s}t.fillStyle=e,this._removeShadow(t)}_measureChar(t,e,i,r){let s,n,o,a,l=M.getFontCache(e),h=this._getFontDeclaration(e),c=i?i+t:t,u=i&&h===this._getFontDeclaration(r),d=e.fontSize/this.CACHE_FONT_SIZE;if(i&&l.has(i)&&(o=l.get(i)),l.has(t)&&(a=s=l.get(t)),u&&l.has(c)&&(n=l.get(c),a=n-o),void 0===s||void 0===o||void 0===n){let r=(Ho||(Ho=Tt({width:0,height:0}).getContext("2d")),Ho);this._setTextStyles(r,e,!0),void 0===s&&(a=s=r.measureText(t).width,l.set(t,s)),void 0===o&&u&&i&&(o=r.measureText(i).width,l.set(i,o)),u&&void 0===n&&(n=r.measureText(c).width,l.set(c,n),a=n-o)}return{width:s*d,kernedWidth:a*d}}getHeightOfChar(t,e){return this.getValueOfPropertyAt(t,e,"fontSize")}measureLine(t){let e=this._measureLine(t);return 0!==this.charSpacing&&(e.width-=this._getWidthOfCharSpacing()),e.width<0&&(e.width=0),e}_measureLine(t){let e,i,r=0,s=this.pathSide===X,n=this.path,o=this._textLines[t],a=o.length,l=Array(a);this.__charBounds[t]=l;for(let s=0;s<a;s++){let n=o[s];i=this._getGraphemeBox(n,t,s,e),l[s]=i,r+=i.kernedWidth,e=n}if(l[a]={left:i?i.left+i.width:0,width:0,kernedWidth:0,height:this.fontSize,deltaY:0},n&&n.segmentsInfo){let t=0,e=n.segmentsInfo[n.segmentsInfo.length-1].length;switch(this.textAlign){case B:t=s?e-r:0;break;case R:t=(e-r)/2;break;case X:t=s?0:e-r}t+=this.pathStartOffset*(s?-1:1);for(let r=s?a-1:0;s?r>=0:r<a;s?r--:r++)i=l[r],t>e?t%=e:t<0&&(t+=e),this._setGraphemeOnPath(t,i),t+=i.kernedWidth}return{width:r,numOfSpaces:0}}_setGraphemeOnPath(t,e){let i=t+e.kernedWidth/2,r=this.path,s=Pn(r.path,i,r.segmentsInfo);e.renderLeft=s.x-r.pathOffset.x,e.renderTop=s.y-r.pathOffset.y,e.angle=s.angle+("right"===this.pathSide?Math.PI:0)}_getGraphemeBox(t,e,i,r,s){let n,o=this.getCompleteStyleDeclaration(e,i),a=r?this.getCompleteStyleDeclaration(e,i-1):{},l=this._measureChar(t,o,r,a),h=l.kernedWidth,c=l.width;0!==this.charSpacing&&(n=this._getWidthOfCharSpacing(),c+=n,h+=n);let u={width:c,left:0,height:o.fontSize,kernedWidth:h,deltaY:o.deltaY};if(i>0&&!s){let t=this.__charBounds[e][i-1];u.left=t.left+t.width+l.kernedWidth-l.width}return u}getHeightOfLineImpl(t){let e=this.__lineHeights;if(e[t])return e[t];let i=this.getHeightOfChar(t,0);for(let e=1,r=this._textLines[t].length;e<r;e++)i=Math.max(this.getHeightOfChar(t,e),i);return e[t]=i*this._fontSizeMult}getHeightOfLine(t){return this.getHeightOfLineImpl(t)*this.lineHeight}calcTextHeight(){let t=0;for(let e=0,i=this._textLines.length;e<i;e++)t+=e===i-1?this.getHeightOfLineImpl(e):this.getHeightOfLine(e);return t}_getLeftOffset(){return"ltr"===this.direction?-this.width/2:this.width/2}_getTopOffset(){return-this.height/2}_renderTextCommon(t,e){t.save();let i=0,r=this._getLeftOffset(),s=this._getTopOffset();for(let n=0,o=this._textLines.length;n<o;n++)this._renderTextLine(e,t,this._textLines[n],r+this._getLineLeftOffset(n),s+i+this.getHeightOfLineImpl(n),n),i+=this.getHeightOfLine(n);t.restore()}_renderTextFill(t){(this.fill||this.styleHas("fill"))&&this._renderTextCommon(t,"fillText")}_renderTextStroke(t){(this.stroke&&0!==this.strokeWidth||!this.isEmptyStyles())&&(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray),t.beginPath(),this._renderTextCommon(t,"strokeText"),t.closePath(),t.restore())}_renderChars(t,e,i,r,s,n){let o,a,l,h,c,u=this.textAlign.includes(ki),d=this.path,g=!u&&0===this.charSpacing&&this.isEmptyStyles(n)&&!d,f="ltr"===this.direction,p="ltr"===this.direction?1:-1,m=e.direction,y="",b=0;if(e.save(),m!==this.direction&&(e.canvas.setAttribute("dir",f?"ltr":"rtl"),e.direction=f?"ltr":"rtl",e.textAlign=f?B:X),s-=this.getHeightOfLineImpl(n)*this._fontSizeFraction,g)return this._renderChar(t,e,n,0,i.join(""),r,s),void e.restore();for(let g=0,f=i.length-1;g<=f;g++)h=g===f||this.charSpacing||d,y+=i[g],l=this.__charBounds[n][g],0===b?(r+=p*(l.kernedWidth-l.width),b+=l.width):b+=l.kernedWidth,u&&!h&&this._reSpaceAndTab.test(i[g])&&(h=!0),h||(o=o||this.getCompleteStyleDeclaration(n,g),a=this.getCompleteStyleDeclaration(n,g+1),h=Ts(o,a,!1)),h&&(d?(e.save(),e.translate(l.renderLeft,l.renderTop),e.rotate(l.angle),this._renderChar(t,e,n,g,y,-b/2,0),e.restore()):(c=r,this._renderChar(t,e,n,g,y,c,s)),y="",o=a,r+=p*b,b=0);e.restore()}_applyPatternGradientTransformText(t){let e=this.width+this.strokeWidth,i=this.height+this.strokeWidth,r=Tt({width:e,height:i}),s=r.getContext("2d");return r.width=e,r.height=i,s.beginPath(),s.moveTo(0,0),s.lineTo(e,0),s.lineTo(e,i),s.lineTo(0,i),s.closePath(),s.translate(e/2,i/2),s.fillStyle=t.toLive(s),this._applyPatternGradientTransform(s,t),s.fill(),s.createPattern(r,"no-repeat")}handleFiller(t,e,i){let r,s;return te(i)?"percentage"===i.gradientUnits||i.gradientTransform||i.patternTransform?(r=-this.width/2,s=-this.height/2,t.translate(r,s),t[e]=this._applyPatternGradientTransformText(i),{offsetX:r,offsetY:s}):(t[e]=i.toLive(t),this._applyPatternGradientTransform(t,i)):(t[e]=i,{offsetX:0,offsetY:0})}_setStrokeStyles(t,{stroke:e,strokeWidth:i}){return t.lineWidth=i,t.lineCap=this.strokeLineCap,t.lineDashOffset=this.strokeDashOffset,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,this.handleFiller(t,"strokeStyle",e)}_setFillStyles(t,{fill:e}){return this.handleFiller(t,"fillStyle",e)}_renderChar(t,e,i,r,s,n,o){let a=this._getStyleDeclaration(i,r),l=this.getCompleteStyleDeclaration(i,r),h="fillText"===t&&l.fill,c="strokeText"===t&&l.stroke&&l.strokeWidth;if(c||h){if(e.save(),e.font=this._getFontDeclaration(l),a.textBackgroundColor&&this._removeShadow(e),a.deltaY&&(o+=a.deltaY),h){let t=this._setFillStyles(e,l);e.fillText(s,n-t.offsetX,o-t.offsetY)}if(c){let t=this._setStrokeStyles(e,l);e.strokeText(s,n-t.offsetX,o-t.offsetY)}e.restore()}}setSuperscript(t,e){this._setScript(t,e,this.superscript)}setSubscript(t,e){this._setScript(t,e,this.subscript)}_setScript(t,e,i){let r=this.get2DCursorLocation(t,!0),s=this.getValueOfPropertyAt(r.lineIndex,r.charIndex,"fontSize"),n=this.getValueOfPropertyAt(r.lineIndex,r.charIndex,"deltaY"),o={fontSize:s*i.size,deltaY:n+s*i.baseline};this.setSelectionStyles(o,t,e)}_getLineLeftOffset(t){let e=this.getLineWidth(t),i=this.width-e,r=this.textAlign,s=this.direction,n=this.isEndOfWrapping(t),o=0;return"justify"===r||"justify-center"===r&&!n||"justify-right"===r&&!n||"justify-left"===r&&!n?0:("center"===r&&(o=i/2),"right"===r&&(o=i),"justify-center"===r&&(o=i/2),"justify-right"===r&&(o=i),"rtl"===s&&("right"===r||"justify-right"===r?o=0:"left"===r||"justify-left"===r?o=-i:"center"!==r&&"justify-center"!==r||(o=-i/2)),o)}_clearCache(){this._forceClearCache=!1,this.__lineWidths=[],this.__lineHeights=[],this.__charBounds=[]}getLineWidth(t){if(void 0!==this.__lineWidths[t])return this.__lineWidths[t];let{width:e}=this.measureLine(t);return this.__lineWidths[t]=e,e}_getWidthOfCharSpacing(){return 0===this.charSpacing?0:this.fontSize*this.charSpacing/1e3}getValueOfPropertyAt(t,e,i){var r;return null==(r=this._getStyleDeclaration(t,e)[i])?this[i]:r}_renderTextDecoration(t,e){if(!this[e]&&!this.styleHas(e))return;let i=this._getTopOffset(),r=this._getLeftOffset(),s=this.path,n=this._getWidthOfCharSpacing(),o="linethrough"===e?.5:+("overline"===e),a=this.offsets[e];for(let l=0,h=this._textLines.length;l<h;l++){let h=this.getHeightOfLine(l);if(!this[e]&&!this.styleHas(e,l)){i+=h;continue}let c,u=this._textLines[l],d=h/this.lineHeight,g=this._getLineLeftOffset(l),f=0,p=0,m=this.getValueOfPropertyAt(l,0,e),y=this.getValueOfPropertyAt(l,0,it),b=this.getValueOfPropertyAt(l,0,"textDecorationColor")||y,_=this.getValueOfPropertyAt(l,0,_i),v=m,x=b,C=_,w=i+d*(1-this._fontSizeFraction),S=this.getHeightOfChar(l,0),T=this.getValueOfPropertyAt(l,0,"deltaY");for(let i=0,n=u.length;i<n;i++){let n=this.__charBounds[l][i];v=this.getValueOfPropertyAt(l,i,e),c=this.getValueOfPropertyAt(l,i,it),x=this.getValueOfPropertyAt(l,i,"textDecorationColor")||c,C=this.getValueOfPropertyAt(l,i,_i);let h=this.getHeightOfChar(l,i),u=this.getValueOfPropertyAt(l,i,"deltaY");if(s&&v&&c){let e=this.fontSize*C/1e3;t.save(),t.fillStyle=x,t.translate(n.renderLeft,n.renderTop),t.rotate(n.angle),t.fillRect(-n.kernedWidth/2,a*h+u-o*e,n.kernedWidth,e),t.restore()}else if((v!==m||c!==y||x!==b||h!==S||C!==_||u!==T)&&p>0){let e=this.fontSize*_/1e3,i=r+g+f;"rtl"===this.direction&&(i=this.width-i-p),m&&b&&_&&(t.fillStyle=b,t.fillRect(i,w+a*S+T-o*e,p,e)),f=n.left,p=n.width,m=v,b=x,_=C,y=c,S=h,T=u}else p+=n.kernedWidth}let O=r+g+f;"rtl"===this.direction&&(O=this.width-O-p),t.fillStyle=x;let k=this.fontSize*C/1e3;v&&x&&C&&t.fillRect(O,w+a*S+T-o*k,p-n,k),i+=h}this._removeShadow(t)}_getFontDeclaration({fontFamily:e=this.fontFamily,fontStyle:i=this.fontStyle,fontWeight:r=this.fontWeight,fontSize:s=this.fontSize}={},n){let o=e.includes("'")||e.includes('"')||e.includes(",")||t.genericFonts.includes(e.toLowerCase())?e:`"${e}"`;return[i,r,`${n?this.CACHE_FONT_SIZE:s}px`,o].join(" ")}render(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._forceClearCache&&this.initDimensions(),super.render(t)))}graphemeSplit(t){return me(t)}_splitTextIntoLines(t){let e=t.split(this._reNewline),i=Array(e.length),r=["\n"],s=[];for(let t=0;t<e.length;t++)i[t]=this.graphemeSplit(e[t]),s=s.concat(i[t],r);return s.pop(),{_unwrappedLines:i,lines:e,graphemeText:s,graphemeLines:i}}toObject(t=[]){return{...super.toObject([...Si,...t]),styles:Os(this.styles,this.text),...this.path?{path:this.path.toObject()}:{}}}set(t,e){let{textLayoutProperties:i}=this.constructor;super.set(t,e);let r=!1,s=!1;if("object"==typeof t)for(let e in t)"path"===e&&this.setPathInfo(),r=r||i.includes(e),s=s||"path"===e;else r=i.includes(t),s="path"===t;return s&&this.setPathInfo(),r&&this.initialized&&(this.initDimensions(),this.setCoords()),this}complexity(){return 1}static async fromElement(e,i,r){let s=Ks(e,t.ATTRIBUTE_NAMES,r),{textAnchor:n=B,textDecoration:o="",dx:a=0,dy:l=0,top:h=0,left:c=0,fontSize:u=16,strokeWidth:d=1,...g}={...i,...s},f=new this(oi(e.textContent||"").trim(),{left:c+a,top:h+l,underline:o.includes("underline"),overline:o.includes("overline"),linethrough:o.includes("line-through"),strokeWidth:0,fontSize:u,...g}),p=f.getScaledHeight()/f.height,m=((f.height+f.strokeWidth)*f.lineHeight-f.height)*p,y=f.getScaledHeight()+m,b=0;return"center"===n&&(b=f.getScaledWidth()/2),"right"===n&&(b=f.getScaledWidth()),f.set({left:f.left-b,top:f.top-(y-f.fontSize*(.07+f._fontSizeFraction))/f.lineHeight,strokeWidth:d}),f}static fromObject(t){return this._fromObject({...t,styles:ks(t.styles||{},t.text)},{extraParam:"text"})}};p(Go,"textLayoutProperties",wi),p(Go,"cacheProperties",[...Xi,...Si]),p(Go,"ownDefaults",Oi),p(Go,"type","Text"),p(Go,"genericFonts",["serif","sans-serif","monospace","cursive","fantasy","system-ui","ui-serif","ui-sans-serif","ui-monospace","ui-rounded","math","emoji","fangsong"]),p(Go,"ATTRIBUTE_NAMES",Ds.concat("x","y","dx","dy","font-family","font-style","font-weight","font-size","letter-spacing","text-decoration","text-decoration-thickness","text-decoration-color","text-anchor")),ms(Go,[class extends bi{_toSVG(){let t=this._getSVGLeftTopOffsets(),e=this._getSVGTextAndBg(t.textTop,t.textLeft);return this._wrapSVGTextAndBg(e)}toSVG(t){let e=this._createBaseSVGMarkup(this._toSVG(),{reviver:t,noStyle:!0,withShadow:!0}),i=this.path;return i?e+i._createBaseSVGMarkup(i._toSVG(),{reviver:t,withShadow:!0,additionalTransform:Zt(this.calcOwnMatrix())}):e}_getSVGLeftTopOffsets(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}}_wrapSVGTextAndBg({textBgRects:t,textSpans:e}){let i=this.getSvgTextDecoration(this);return[t.join(""),'\t\t<text xml:space="preserve" ',`font-family="${fe(this.fontFamily.replace(Vo,"'"))}" `,`font-size="${fe(this.fontSize)}" `,this.fontStyle?`font-style="${fe(this.fontStyle)}" `:"",this.fontWeight?`font-weight="${fe(this.fontWeight)}" `:"",i?`text-decoration="${i}" `:"","rtl"===this.direction?'direction="rtl" ':"",'style="',this.getSvgStyles(!0),'"',this.addPaintOrder()," >",e.join(""),"</text>\n"]}_getSVGTextAndBg(t,e){let i,r=[],s=[],n=t;this.backgroundColor&&s.push(zo(this.backgroundColor,-this.width/2,-this.height/2,this.width,this.height));for(let t=0,o=this._textLines.length;t<o;t++)i=this._getLineLeftOffset(t),"rtl"===this.direction&&(i+=this.width),(this.textBackgroundColor||this.styleHas("textBackgroundColor",t))&&this._setSVGTextLineBg(s,t,e+i,n),this._setSVGTextLineText(r,t,e+i,n),n+=this.getHeightOfLine(t);return{textSpans:r,textBgRects:s}}_createTextCharSpan(t,e,i,r,s){let n=y.NUM_FRACTION_DIGITS,o=this.getSvgSpanStyles(e,t!==t.trim()||!!t.match(No)),a=o?`style="${o}"`:"",l=e.deltaY,h=l?` dy="${Qt(l,n)}" `:"",{angle:c,renderLeft:u,renderTop:d,width:g}=s,f="";if(void 0!==u){let t=g/2;c&&(f=` rotate="${Qt(Mt(c),n)}"`);let e=Xt({angle:Mt(c)});e[4]=u,e[5]=d;let s=new gt(-t,0).transform(e);i=s.x,r=s.y}return`<tspan x="${Qt(i,n)}" y="${Qt(r,n)}" ${h}${f}${a}>${fe(t)}</tspan>`}_setSVGTextLineText(t,e,i,r){let s,n,o,a,l,h=this.getHeightOfLine(e),c=this.textAlign.includes(ki),u=this._textLines[e],d="",g=0;r+=h*(1-this._fontSizeFraction)/this.lineHeight;for(let h=0,f=u.length-1;h<=f;h++)l=h===f||this.charSpacing||this.path,d+=u[h],o=this.__charBounds[e][h],0===g?(i+=o.kernedWidth-o.width,g+=o.width):g+=o.kernedWidth,c&&!l&&this._reSpaceAndTab.test(u[h])&&(l=!0),l||(s=s||this.getCompleteStyleDeclaration(e,h),n=this.getCompleteStyleDeclaration(e,h+1),l=Ts(s,n,!0)),l&&(a=this._getStyleDeclaration(e,h),t.push(this._createTextCharSpan(d,a,i,r,o)),d="",s=n,"rtl"===this.direction?i-=g:i+=g,g=0)}_setSVGTextLineBg(t,e,i,r){let s,n=this._textLines[e],o=this.getHeightOfLine(e)/this.lineHeight,a=0,l=0,h=this.getValueOfPropertyAt(e,0,"textBackgroundColor");for(let c=0;c<n.length;c++){let{left:n,width:u,kernedWidth:d}=this.__charBounds[e][c];s=this.getValueOfPropertyAt(e,c,"textBackgroundColor"),s===h?a+=d:(h&&t.push(zo(h,i+l,r,a,o)),l=n,a=u,h=s)}s&&t.push(zo(h,i+l,r,a,o))}getSvgStyles(t){let e=ri(this.textDecorationColor)?` text-decoration-color: ${fe(this[vi])};`:"";return`${super.getSvgStyles(t)} text-decoration-thickness: ${Qt(this.textDecorationThickness*this.getObjectScaling().y/10,y.NUM_FRACTION_DIGITS)}%;${e} white-space: pre;`}getSvgSpanStyles(t,e){let{fontFamily:i,strokeWidth:r,stroke:s,fill:n,fontSize:o,fontStyle:a,fontWeight:l,textDecorationThickness:h,textDecorationColor:c,linethrough:u,overline:d,underline:g}=t,f=this.getSvgTextDecoration({underline:g??this.underline,overline:d??this.overline,linethrough:u??this.linethrough}),p=h||this.textDecorationThickness,m=c||this.textDecorationColor,b=si(r),_=ni(i),v=si(o),x=ni(a),C=si(l)||ni(l),w=ni(m);return[s?yi(rt,s):"",b?`stroke-width: ${fe(b)}; `:"",_?`font-family: ${_.includes("'")||_.includes('"')?fe(_):`'${fe(_)}'`}; `:"",v?`font-size: ${fe(v)}px; `:"",x?`font-style: ${fe(x)}; `:"",C?`font-weight: ${fe(C)}; `:"",f?`text-decoration: ${f}; text-decoration-thickness: ${Qt(p*this.getObjectScaling().y/10,y.NUM_FRACTION_DIGITS)}%;${w?` text-decoration-color: ${fe(w)};`:""} `:"",n?yi(it,n):"",e?"white-space: pre; ":""].join("")}getSvgTextDecoration(t){return["overline","underline","line-through"].filter(e=>t[e.replace("-","")]).join(" ")}}]),at.setClass(Go),at.setSVGClass(Go);var Uo=class{constructor(t){p(this,"target",void 0),p(this,"__mouseDownInPlace",!1),p(this,"__dragStartFired",!1),p(this,"__isDraggingOver",!1),p(this,"__dragStartSelection",void 0),p(this,"__dragImageDisposer",void 0),p(this,"_dispose",void 0),this.target=t;let e=[this.target.on("dragenter",this.dragEnterHandler.bind(this)),this.target.on("dragover",this.dragOverHandler.bind(this)),this.target.on("dragleave",this.dragLeaveHandler.bind(this)),this.target.on("dragend",this.dragEndHandler.bind(this)),this.target.on("drop",this.dropHandler.bind(this))];this._dispose=()=>{e.forEach(t=>t()),this._dispose=void 0}}isPointerOverSelection(t){let e=this.target,i=e.getSelectionStartFromPointer(t);return e.isEditing&&i>=e.selectionStart&&i<=e.selectionEnd&&e.selectionStart<e.selectionEnd}start(t){return this.__mouseDownInPlace=this.isPointerOverSelection(t)}isActive(){return this.__mouseDownInPlace}end(t){let e=this.isActive();return e&&!this.__dragStartFired&&(this.target.setCursorByClick(t),this.target.initDelayedCursor(!0)),this.__mouseDownInPlace=!1,this.__dragStartFired=!1,this.__isDraggingOver=!1,e}getDragStartSelection(){return this.__dragStartSelection}setDragImage(t,{selectionStart:e,selectionEnd:i}){var r;let s=this.target,n=s.canvas,o=new gt(s.flipX?-1:1,s.flipY?-1:1),a=s._getCursorBoundaries(e),l=new gt(a.left+a.leftOffset,a.top+a.topOffset).multiply(o).transform(s.calcTransformMatrix()),h=n.getScenePoint(t).subtract(l),c=s.getCanvasRetinaScaling(),u=s.getBoundingRect(),d=l.subtract(new gt(u.left,u.top)),g=n.viewportTransform,f=d.add(h).transform(g,!0),p=s.backgroundColor,m=Ss(s.styles);s.backgroundColor="";let y={stroke:"transparent",fill:"transparent",textBackgroundColor:"transparent"};s.setSelectionStyles(y,0,e),s.setSelectionStyles(y,i,s.text.length),s.dirty=!0;let b=s.toCanvasElement({enableRetinaScaling:n.enableRetinaScaling,viewportTransform:!0});s.backgroundColor=p,s.styles=m,s.dirty=!0,zn(b,{position:"fixed",left:-b.width+"px",border:Y,width:b.width/c+"px",height:b.height/c+"px"}),this.__dragImageDisposer&&this.__dragImageDisposer(),this.__dragImageDisposer=()=>{b.remove()},ne(t.target||this.target.hiddenTextarea).body.appendChild(b),null==(r=t.dataTransfer)||r.setDragImage(b,f.x,f.y)}onDragStart(t){this.__dragStartFired=!0;let e=this.target,i=this.isActive();if(i&&t.dataTransfer){let i=this.__dragStartSelection={selectionStart:e.selectionStart,selectionEnd:e.selectionEnd},r=e._text.slice(i.selectionStart,i.selectionEnd).join(""),s={text:e.text,value:r,...i};t.dataTransfer.setData("text/plain",r),t.dataTransfer.setData("application/fabric",JSON.stringify({value:r,styles:e.getSelectionStyles(i.selectionStart,i.selectionEnd,!0)})),t.dataTransfer.effectAllowed="copyMove",this.setDragImage(t,s)}return e.abortCursorAnimation(),i}canDrop(t){if(this.target.editable&&!this.target.getActiveControl()&&!t.defaultPrevented){if(this.isActive()&&this.__dragStartSelection){let e=this.target.getSelectionStartFromPointer(t),i=this.__dragStartSelection;return e<i.selectionStart||e>i.selectionEnd}return!0}return!1}targetCanDrop(t){return this.target.canDrop(t)}dragEnterHandler({e:t}){let e=this.targetCanDrop(t);!this.__isDraggingOver&&e&&(this.__isDraggingOver=!0)}dragOverHandler(t){let{e}=t,i=this.targetCanDrop(e);!this.__isDraggingOver&&i?this.__isDraggingOver=!0:this.__isDraggingOver&&!i&&(this.__isDraggingOver=!1),this.__isDraggingOver&&(e.preventDefault(),t.canDrop=!0,t.dropTarget=this.target)}dragLeaveHandler(){(this.__isDraggingOver||this.isActive())&&(this.__isDraggingOver=!1)}dropHandler(t){var e;let{e:i}=t,r=i.defaultPrevented;this.__isDraggingOver=!1,i.preventDefault();let s=null==(e=i.dataTransfer)?void 0:e.getData("text/plain");if(s&&!r){let e=this.target,r=e.canvas,n=e.getSelectionStartFromPointer(i),{styles:o}=i.dataTransfer.types.includes("application/fabric")?JSON.parse(i.dataTransfer.getData("application/fabric")):{},a=s[Math.max(0,s.length-1)];if(this.__dragStartSelection){let t=this.__dragStartSelection.selectionStart,i=this.__dragStartSelection.selectionEnd;n>t&&n<=i?n=t:n>i&&(n-=i-t),e.removeChars(t,i),delete this.__dragStartSelection}e._reNewline.test(a)&&(e._reNewline.test(e._text[n])||n===e._text.length)&&(s=s.trimEnd()),t.didDrop=!0,t.dropTarget=e,e.insertChars(s,o,n),r.setActiveObject(e),e.enterEditing(i),e.selectionStart=Math.min(n+0,e._text.length),e.selectionEnd=Math.min(e.selectionStart+s.length,e._text.length),e.hiddenTextarea.value=e.text,e._updateTextarea(),e.hiddenTextarea.focus(),e.fire(K,{index:n+0,action:"drop"}),r.fire("text:changed",{target:e}),r.contextTopDirty=!0,r.requestRenderAll()}}dragEndHandler({e:t}){if(this.isActive()&&this.__dragStartFired&&this.__dragStartSelection){var e;let i=this.target,r=this.target.canvas,{selectionStart:s,selectionEnd:n}=this.__dragStartSelection,o=(null==(e=t.dataTransfer)?void 0:e.dropEffect)||"none";"none"===o?(i.selectionStart=s,i.selectionEnd=n,i._updateTextarea(),i.hiddenTextarea.focus()):(i.clearContextTop(),"move"===o&&(i.removeChars(s,n),i.selectionStart=i.selectionEnd=s,i.hiddenTextarea&&(i.hiddenTextarea.value=i.text),i._updateTextarea(),i.fire(K,{index:s,action:"dragend"}),r.fire("text:changed",{target:i}),r.requestRenderAll()),i.exitEditing())}this.__dragImageDisposer&&this.__dragImageDisposer(),delete this.__dragImageDisposer,delete this.__dragStartSelection,this.__isDraggingOver=!1}dispose(){this._dispose&&this._dispose()}};const qo=/[ \n\.,;!\?\-]/;var Ko=class extends Go{constructor(...t){super(...t),p(this,"_currentCursorOpacity",1)}initBehavior(){this._tick=this._tick.bind(this),this._onTickComplete=this._onTickComplete.bind(this),this.updateSelectionOnMouseMove=this.updateSelectionOnMouseMove.bind(this)}onDeselect(t){return this.isEditing&&this.exitEditing(),this.selected=!1,super.onDeselect(t)}_animateCursor({toValue:t,duration:e,delay:i,onComplete:r}){return Mr({startValue:this._currentCursorOpacity,endValue:t,duration:e,delay:i,onComplete:r,abort:()=>!this.canvas||this.selectionStart!==this.selectionEnd,onChange:t=>{this._currentCursorOpacity=t,this.renderCursorOrSelection()}})}_tick(t){this._currentTickState=this._animateCursor({toValue:0,duration:this.cursorDuration/2,delay:Math.max(t||0,100),onComplete:this._onTickComplete})}_onTickComplete(){var t;null==(t=this._currentTickCompleteState)||t.abort(),this._currentTickCompleteState=this._animateCursor({toValue:1,duration:this.cursorDuration,onComplete:this._tick})}initDelayedCursor(t){this.abortCursorAnimation(),this._tick(t?0:this.cursorDelay)}abortCursorAnimation(){let t=!1;[this._currentTickState,this._currentTickCompleteState].forEach(e=>{e&&!e.isDone()&&(t=!0,e.abort())}),this._currentCursorOpacity=1,t&&this.clearContextTop()}restartCursorIfNeeded(){[this._currentTickState,this._currentTickCompleteState].some(t=>!t||t.isDone())&&this.initDelayedCursor()}selectAll(){return this.selectionStart=0,this.selectionEnd=this._text.length,this._fireSelectionChanged(),this._updateTextarea(),this}cmdAll(){this.selectAll(),this.renderCursorOrSelection()}getSelectedText(){return this._text.slice(this.selectionStart,this.selectionEnd).join("")}findWordBoundaryLeft(t){let e=0,i=t-1;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i--;for(;/\S/.test(this._text[i])&&i>-1;)e++,i--;return t-e}findWordBoundaryRight(t){let e=0,i=t;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i++;for(;/\S/.test(this._text[i])&&i<this._text.length;)e++,i++;return t+e}findLineBoundaryLeft(t){let e=0,i=t-1;for(;!/\n/.test(this._text[i])&&i>-1;)e++,i--;return t-e}findLineBoundaryRight(t){let e=0,i=t;for(;!/\n/.test(this._text[i])&&i<this._text.length;)e++,i++;return t+e}searchWordBoundary(t,e){let i=this._text,r=t>0&&this._reSpace.test(i[t])&&(-1===e||!W.test(i[t-1]))?t-1:t,s=i[r];for(;r>0&&r<i.length&&!qo.test(s);)r+=e,s=i[r];return-1===e&&qo.test(s)&&r++,r}selectWord(t){var e;t=null==(e=t)?this.selectionStart:e;let i=this.searchWordBoundary(t,-1),r=Math.max(i,this.searchWordBoundary(t,1));this.selectionStart=i,this.selectionEnd=r,this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()}selectLine(t){var e;t=null==(e=t)?this.selectionStart:e;let i=this.findLineBoundaryLeft(t),r=this.findLineBoundaryRight(t);this.selectionStart=i,this.selectionEnd=r,this._fireSelectionChanged(),this._updateTextarea()}enterEditing(t){!this.isEditing&&this.editable&&(this.enterEditingImpl(),this.fire("editing:entered",t?{e:t}:void 0),this._fireSelectionChanged(),this.canvas&&(this.canvas.fire("text:editing:entered",{target:this,e:t}),this.canvas.requestRenderAll()))}enterEditingImpl(){this.canvas&&(this.canvas.calcOffset(),this.canvas.textEditingManager.exitTextEditing()),this.isEditing=!0,this.initHiddenTextarea(),this.hiddenTextarea.focus(),this.hiddenTextarea.value=this.text,this._updateTextarea(),this._saveEditingProps(),this._setEditingProps(),this._textBeforeEdit=this.text,this._tick()}updateSelectionOnMouseMove(t){if(this.getActiveControl())return;let e=this.hiddenTextarea;ne(e).activeElement!==e&&e.focus();let i=this.getSelectionStartFromPointer(t),r=this.selectionStart,s=this.selectionEnd;(i===this.__selectionStartOnMouseDown&&r!==s||r!==i&&s!==i)&&(i>this.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=i):(this.selectionStart=i,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===r&&this.selectionEnd===s||(this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}_setEditingProps(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0}fromStringToGraphemeSelection(t,e,i){let r=i.slice(0,t),s=this.graphemeSplit(r).length;if(t===e)return{selectionStart:s,selectionEnd:s};let n=i.slice(t,e);return{selectionStart:s,selectionEnd:s+this.graphemeSplit(n).length}}fromGraphemeToStringSelection(t,e,i){let r=i.slice(0,t).join("").length;return t===e?{selectionStart:r,selectionEnd:r}:{selectionStart:r,selectionEnd:r+i.slice(t,e).join("").length}}_updateTextarea(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){let t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}}updateFromTextArea(){let{hiddenTextarea:t,direction:e,textAlign:i,inCompositionMode:r}=this;if(!t)return;let s="justify"===i?"ltr"===e?B:X:i.replace("justify-",""),n=this.getPositionByOrigin(s,"top");this.cursorOffsetCache={},this.text=t.value,this.set("dirty",!0),this.initDimensions(),this.setPositionByOrigin(n,s,"top"),this.setCoords();let o=this.fromStringToGraphemeSelection(t.selectionStart,t.selectionEnd,t.value);this.selectionEnd=this.selectionStart=o.selectionEnd,r||(this.selectionStart=o.selectionStart),this.updateTextareaPosition()}updateTextareaPosition(){if(this.selectionStart===this.selectionEnd){let t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}}_calcTextareaPosition(){if(!this.canvas)return{left:"1px",top:"1px"};let t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),i=this.get2DCursorLocation(t),r=i.lineIndex,s=i.charIndex,n=this.getValueOfPropertyAt(r,s,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.getCanvasRetinaScaling(),l=this.canvas.upperCanvasEl,h=l.width/a,c=l.height/a,u=h-n,d=c-n,g=new gt(e.left+o,e.top+e.topOffset+n).transform(this.calcTransformMatrix()).transform(this.canvas.viewportTransform).multiply(new gt(l.clientWidth/h,l.clientHeight/c));return g.x<0&&(g.x=0),g.x>u&&(g.x=u),g.y<0&&(g.y=0),g.y>d&&(g.y=d),g.x+=this.canvas._offset.left,g.y+=this.canvas._offset.top,{left:`${g.x}px`,top:`${g.y}px`,fontSize:`${n}px`,charHeight:n}}_saveEditingProps(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}}_restoreEditingProps(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor||this.canvas.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor||this.canvas.moveCursor),delete this._savedProps)}exitEditingImpl(){let t=this.hiddenTextarea;this.selected=!1,this.isEditing=!1,t&&(t.blur&&t.blur(),t.parentNode&&t.parentNode.removeChild(t)),this.hiddenTextarea=null,this.abortCursorAnimation(),this.selectionStart!==this.selectionEnd&&this.clearContextTop(),this.selectionEnd=this.selectionStart,this._restoreEditingProps(),this._forceClearCache&&(this.initDimensions(),this.setCoords())}exitEditing(){let t=this._textBeforeEdit!==this.text;return this.exitEditingImpl(),this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this}_removeExtraneousStyles(){for(let t in this.styles)this._textLines[t]||delete this.styles[t]}removeStyleFromTo(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t,!0),{lineIndex:s,charIndex:n}=this.get2DCursorLocation(e,!0);if(i!==s){if(this.styles[i])for(let t=r;t<this._unwrappedTextLines[i].length;t++)delete this.styles[i][t];if(this.styles[s])for(let t=n;t<this._unwrappedTextLines[s].length;t++){let e=this.styles[s][t];e&&(this.styles[i]||(this.styles[i]={}),this.styles[i][r+t-n]=e)}for(let t=i+1;t<=s;t++)delete this.styles[t];this.shiftLineStyles(s,i-s)}else if(this.styles[i]){let t=this.styles[i],e=n-r;for(let e=r;e<n;e++)delete t[e];for(let r in this.styles[i]){let i=parseInt(r,10);i>=n&&(t[i-e]=t[r],delete t[r])}}}shiftLineStyles(t,e){let i=Object.assign({},this.styles);for(let r in this.styles){let s=parseInt(r,10);s>t&&(this.styles[s+e]=i[s],i[s-e]||delete this.styles[s])}}insertNewlineStyleObject(t,e,i,r){let s={},n=this._unwrappedTextLines[t].length,o=n===e,a=!1;i||(i=1),this.shiftLineStyles(t,i);let l=this.styles[t]?this.styles[t][0===e?e:e-1]:void 0;for(let i in this.styles[t]){let r=parseInt(i,10);r>=e&&(a=!0,s[r-e]=this.styles[t][i],o&&0===e||delete this.styles[t][i])}let h=!1;for(a&&!o&&(this.styles[t+i]=s,h=!0),(h||n>e)&&i--;i>0;)r&&r[i-1]?this.styles[t+i]={0:{...r[i-1]}}:l?this.styles[t+i]={0:{...l}}:delete this.styles[t+i],i--;this._forceClearCache=!0}insertCharStyleObject(t,e,i,r){this.styles||(this.styles={});let s=this.styles[t],n=s?{...s}:{};i||(i=1);for(let t in n){let r=parseInt(t,10);r>=e&&(s[r+i]=n[r],n[r-i]||delete s[r])}if(this._forceClearCache=!0,r){for(;i--;)Object.keys(r[i]).length&&(this.styles[t]||(this.styles[t]={}),this.styles[t][e+i]={...r[i]});return}if(!s)return;let o=s[e?e-1:1];for(;o&&i--;)this.styles[t][e+i]={...o}}insertNewStyleBlock(t,e,i){let r,s=this.get2DCursorLocation(e,!0),n=[0],o=0;for(let e=0;e<t.length;e++)"\n"===t[e]?(o++,n[o]=0):n[o]++;for(n[0]>0&&(this.insertCharStyleObject(s.lineIndex,s.charIndex,n[0],i),i=i&&i.slice(n[0]+1)),o&&this.insertNewlineStyleObject(s.lineIndex,s.charIndex+n[0],o),r=1;r<o;r++)n[r]>0?this.insertCharStyleObject(s.lineIndex+r,0,n[r],i):i&&this.styles[s.lineIndex+r]&&i[0]&&(this.styles[s.lineIndex+r][0]=i[0]),i=i&&i.slice(n[r]+1);n[r]>0&&this.insertCharStyleObject(s.lineIndex+r,0,n[r],i)}removeChars(t,e=t+1){this.removeStyleFromTo(t,e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}insertChars(t,e,i,r=i){r>i&&this.removeStyleFromTo(i,r);let s=this.graphemeSplit(t);this.insertNewStyleBlock(s,i,e),this._text=[...this._text.slice(0,i),...s,...this._text.slice(r)],this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}setSelectionStartEndWithShift(t,e,i){i<=t?(e===t?this._selectionDirection=B:"right"===this._selectionDirection&&(this._selectionDirection=B,this.selectionEnd=t),this.selectionStart=i):i>t&&i<e?"right"===this._selectionDirection?this.selectionEnd=i:this.selectionStart=i:(e===t?this._selectionDirection=X:"left"===this._selectionDirection&&(this._selectionDirection=X,this.selectionStart=e),this.selectionEnd=i)}},Jo=class extends Ko{initHiddenTextarea(){let t=this.canvas&&ne(this.canvas.getElement())||O(),e=t.createElement("textarea");Object.entries({autocapitalize:"off",autocorrect:"off",autocomplete:"off",spellcheck:"false","data-fabric":"textarea",wrap:"off",name:"fabricTextarea"}).map(([t,i])=>e.setAttribute(t,i));let{top:i,left:r,fontSize:s}=this._calcTextareaPosition();e.style.cssText=`position: absolute; top: ${i}; left: ${r}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${s};`,(this.hiddenTextareaContainer||t.body).appendChild(e),Object.entries({blur:"blur",keydown:"onKeyDown",keyup:"onKeyUp",input:"onInput",copy:"copy",cut:"copy",paste:"paste",compositionstart:"onCompositionStart",compositionupdate:"onCompositionUpdate",compositionend:"onCompositionEnd"}).map(([t,i])=>e.addEventListener(t,this[i].bind(this))),this.hiddenTextarea=e}blur(){this.abortCursorAnimation()}onKeyDown(t){if(!this.isEditing)return;let e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown)||!t.ctrlKey&&!t.metaKey)return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}onKeyUp(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())}onInput(t){let e=this.fromPaste,{value:i,selectionStart:r,selectionEnd:s}=this.hiddenTextarea;if(this.fromPaste=!1,t&&t.stopPropagation(),!this.isEditing)return;let n=()=>{this.updateFromTextArea(),this.fire(K),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())};if(""===this.hiddenTextarea.value)return this.styles={},void n();let o,a,l,h,c=this._splitTextIntoLines(i).graphemeText,u=this._text.length,d=c.length,g=this.selectionStart,f=this.selectionEnd,p=g!==f,m=d-u,b=this.fromStringToGraphemeSelection(r,s,i),_=g>b.selectionStart;p?(a=this._text.slice(g,f),m+=f-g):d<u&&(a=_?this._text.slice(f+m,f):this._text.slice(g,g-m));let v=c.slice(b.selectionEnd-m,b.selectionEnd);if(a&&a.length&&(v.length&&(o=this.getSelectionStyles(g,g+1,!1),o=v.map(()=>o[0])),p?(l=g,h=f):_?(l=f-a.length,h=f):(l=f,h=f+a.length),this.removeStyleFromTo(l,h)),v.length){let{copyPasteData:t}=T();e&&v.join("")===t.copiedText&&!y.disableStyleCopyPaste&&(o=t.copiedTextStyle),this.insertNewStyleBlock(v,g,o)}n()}onCompositionStart(){this.inCompositionMode=!0}onCompositionEnd(){this.inCompositionMode=!1}onCompositionUpdate({target:t}){let{selectionStart:e,selectionEnd:i}=t;this.compositionStart=e,this.compositionEnd=i,this.updateTextareaPosition()}copy(){if(this.selectionStart===this.selectionEnd)return;let{copyPasteData:t}=T();t.copiedText=this.getSelectedText(),y.disableStyleCopyPaste?t.copiedTextStyle=void 0:t.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd,!0),this._copyDone=!0}paste(){this.fromPaste=!0}_getWidthBeforeCursor(t,e){let i,r=this._getLineLeftOffset(t);return e>0&&(i=this.__charBounds[t][e-1],r+=i.left+i.width),r}getDownCursorOffset(t,e){let i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),s=r.lineIndex;if(s===this._textLines.length-1||t.metaKey||34===t.keyCode)return this._text.length-i;let n=r.charIndex,o=this._getWidthBeforeCursor(s,n),a=this._getIndexOnLine(s+1,o);return this._textLines[s].slice(n).length+a+1+this.missingNewlineOffset(s)}_getSelectionForOffset(t,e){return t.shiftKey&&this.selectionStart!==this.selectionEnd&&e?this.selectionEnd:this.selectionStart}getUpCursorOffset(t,e){let i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),s=r.lineIndex;if(0===s||t.metaKey||33===t.keyCode)return-i;let n=r.charIndex,o=this._getWidthBeforeCursor(s,n),a=this._getIndexOnLine(s-1,o),l=this._textLines[s].slice(0,n),h=this.missingNewlineOffset(s-1);return-this._textLines[s-1].length+a-l.length+(1-h)}_getIndexOnLine(t,e){let i,r,s=this._textLines[t],n=this._getLineLeftOffset(t),o=0;for(let a=0,l=s.length;a<l;a++)if(i=this.__charBounds[t][a].width,n+=i,n>e){r=!0;let t=n-i,s=n,l=Math.abs(t-e);o=Math.abs(s-e)<l?a:a-1;break}return r||(o=s.length-1),o}moveCursorDown(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)}moveCursorUp(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)}_moveCursorUpOrDown(t,e){let i=this[`get${t}CursorOffset`](e,this._selectionDirection===X);if(e.shiftKey?this.moveCursorWithShift(i):this.moveCursorWithoutShift(i),0!==i){let t=this.text.length;this.selectionStart=Bi(0,this.selectionStart,t),this.selectionEnd=Bi(0,this.selectionEnd,t),this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea()}}moveCursorWithShift(t){let e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t}moveCursorWithoutShift(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t}moveCursorLeft(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)}_move(t,e,i){let r;if(t.altKey)r=this[`findWordBoundary${i}`](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this[`findLineBoundary${i}`](this[e])}return void 0!==r&&this[e]!==r&&(this[e]=r,!0)}_moveLeft(t,e){return this._move(t,e,"Left")}_moveRight(t,e){return this._move(t,e,"Right")}moveCursorLeftWithoutShift(t){let e=!0;return this._selectionDirection=B,this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e}moveCursorLeftWithShift(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0===this.selectionStart?void 0:(this._selectionDirection=B,this._moveLeft(t,"selectionStart"))}moveCursorRight(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)}_moveCursorLeftOrRight(t,e){let i=`moveCursor${t}${e.shiftKey?"WithShift":"WithoutShift"}`;this._currentCursorOpacity=1,this[i](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())}moveCursorRightWithShift(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd===this._text.length?void 0:(this._selectionDirection=X,this._moveRight(t,"selectionEnd"))}moveCursorRightWithoutShift(t){let e=!0;return this._selectionDirection=X,this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e}};const Qo=t=>!!t.button;var Zo=class extends Jo{constructor(...t){super(...t),p(this,"draggableTextDelegate",void 0)}initBehavior(){this.on("mousedown",this._mouseDownHandler),this.on("mouseup",this.mouseUpHandler),this.on("mousedblclick",this.doubleClickHandler),this.on("mousetripleclick",this.tripleClickHandler),this.draggableTextDelegate=new Uo(this),super.initBehavior()}shouldStartDragging(){return this.draggableTextDelegate.isActive()}onDragStart(t){return this.draggableTextDelegate.onDragStart(t)}canDrop(t){return this.draggableTextDelegate.canDrop(t)}doubleClickHandler(t){this.isEditing&&(this.selectWord(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}tripleClickHandler(t){this.isEditing&&(this.selectLine(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}_mouseDownHandler({e:t,alreadySelected:e}){this.canvas&&this.editable&&!Qo(t)&&!this.getActiveControl()&&(this.draggableTextDelegate.start(t)||(this.canvas.textEditingManager.register(this),e&&(this.inCompositionMode=!1,this.setCursorByClick(t)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()),this.selected||(this.selected=e||this.isEditing)))}mouseUpHandler({e:t,transform:e}){let i=this.draggableTextDelegate.end(t);if(this.canvas){this.canvas.textEditingManager.unregister(this);let t=this.canvas._activeObject;if(t&&t!==this)return}!this.editable||this.group&&!this.group.interactive||e&&e.actionPerformed||Qo(t)||i||this.selected&&!this.getActiveControl()&&(this.enterEditing(t),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection())}setCursorByClick(t){let e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())}getSelectionStartFromPointer(t){let e=this.canvas.getScenePoint(t).transform(Pt(this.calcTransformMatrix())).add(new gt(-this._getLeftOffset(),-this._getTopOffset())),i=0,r=0,s=0;for(let t=0;t<this._textLines.length&&i<=e.y;t++)i+=this.getHeightOfLine(t),s=t,t>0&&(r+=this._textLines[t-1].length+this.missingNewlineOffset(t-1));let n=Math.abs(this._getLineLeftOffset(s)),o=this._textLines[s].length,a=this.__charBounds[s];for(let t=0;t<o;t++){let i=n+a[t].kernedWidth;if(e.x<=i){Math.abs(e.x-i)<=Math.abs(e.x-n)&&r++;break}n=i,r++}return Math.min(this.flipX?o-r:r,this._text.length)}};const ta="moveCursorUp",ea="moveCursorDown",ia="moveCursorLeft",ra="moveCursorRight",sa="exitEditing",na=(t,e)=>{let i=e.getRetinaScaling();t.setTransform(i,0,0,i,0,0);let r=e.viewportTransform;t.transform(r[0],r[1],r[2],r[3],r[4],r[5])},oa={selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"",cursorDelay:1e3,cursorDuration:600,caching:!0,hiddenTextareaContainer:null,keysMap:{9:sa,27:sa,33:ta,34:ea,35:ra,36:ia,37:ia,38:ta,39:ra,40:ea},keysMapRtl:{9:sa,27:sa,33:ta,34:ea,35:ia,36:ra,37:ra,38:ta,39:ia,40:ea},ctrlKeysMapDown:{65:"cmdAll"},ctrlKeysMapUp:{67:"copy",88:"cut"},_selectionDirection:null,_reSpace:/\s|\r?\n/,inCompositionMode:!1};var aa=class t extends Zo{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}get type(){let t=super.type;return"itext"===t?"i-text":t}constructor(e,i){super(e,{...t.ownDefaults,...i}),this.initBehavior()}_set(t,e){return this.isEditing&&this._savedProps&&t in this._savedProps?(this._savedProps[t]=e,this):("canvas"===t&&(this.canvas instanceof po&&this.canvas.textEditingManager.remove(this),e instanceof po&&e.textEditingManager.add(this)),super._set(t,e))}setSelectionStart(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)}setSelectionEnd(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)}_updateAndFire(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()}_fireSelectionChanged(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})}initDimensions(){this.isEditing&&this.initDelayedCursor(),super.initDimensions()}getSelectionStyles(t=this.selectionStart||0,e=this.selectionEnd,i){return super.getSelectionStyles(t,e,i)}setSelectionStyles(t,e=this.selectionStart||0,i=this.selectionEnd){return super.setSelectionStyles(t,e,i)}get2DCursorLocation(t=this.selectionStart,e){return super.get2DCursorLocation(t,e)}render(t){super.render(t),this.cursorOffsetCache={},this.renderCursorOrSelection()}toCanvasElement(t){let e=this.isEditing;this.isEditing=!1;let i=super.toCanvasElement(t);return this.isEditing=e,i}renderCursorOrSelection(){if(!this.isEditing||!this.canvas)return;let t=this.clearContextTop(!0);if(!t)return;let e,i=this._getCursorBoundaries(),r=this.findAncestorsWithClipPath(),s=r.length>0,n=t;if(s){e=Tt(t.canvas),n=e.getContext("2d"),na(n,this.canvas);let i=this.calcTransformMatrix();n.transform(i[0],i[1],i[2],i[3],i[4],i[5])}if(this.selectionStart!==this.selectionEnd||this.inCompositionMode?this.renderSelection(n,i):this.renderCursor(n,i),s)for(let e of r){let i=e.clipPath,r=Tt(t.canvas),s=r.getContext("2d");if(na(s,this.canvas),!i.absolutePositioned){let t=e.calcTransformMatrix();s.transform(t[0],t[1],t[2],t[3],t[4],t[5])}i.transform(s),i.drawObject(s,!0,{}),this.drawClipPathOnCache(n,i,r)}s&&(t.setTransform(1,0,0,1,0,0),t.drawImage(e,0,0)),this.canvas.contextTopDirty=!0,t.restore()}findAncestorsWithClipPath(){let t=[],e=this;for(;e;)e.clipPath&&t.push(e),e=e.parent;return t}_getCursorBoundaries(t=this.selectionStart,e){let i=this._getLeftOffset(),r=this._getTopOffset(),s=this._getCursorBoundariesOffsets(t,e);return{left:i,top:r,leftOffset:s.left,topOffset:s.top}}_getCursorBoundariesOffsets(t,e){return e?this.__getCursorBoundariesOffsets(t):this.cursorOffsetCache&&"top"in this.cursorOffsetCache?this.cursorOffsetCache:this.cursorOffsetCache=this.__getCursorBoundariesOffsets(t)}__getCursorBoundariesOffsets(t){let e=0,i=0,{charIndex:r,lineIndex:s}=this.get2DCursorLocation(t),{textAlign:n,direction:o}=this;for(let t=0;t<s;t++)e+=this.getHeightOfLine(t);let a=this._getLineLeftOffset(s),l=this.__charBounds[s][r];l&&(i=l.left),0!==this.charSpacing&&r===this._textLines[s].length&&(i-=this._getWidthOfCharSpacing());let h=a+(i>0?i:0);return"rtl"===o&&("right"===n||"justify"===n||"justify-right"===n?h*=-1:"left"===n||"justify-left"===n?h=a-(i>0?i:0):"center"!==n&&"justify-center"!==n||(h=a-(i>0?i:0))),{top:e,left:h}}renderCursorAt(t){this._renderCursor(this.canvas.contextTop,this._getCursorBoundaries(t,!0),t)}renderCursor(t,e){this._renderCursor(t,e,this.selectionStart)}getCursorRenderingData(t=this.selectionStart,e=this._getCursorBoundaries(t)){let i=this.get2DCursorLocation(t),r=i.lineIndex,s=i.charIndex>0?i.charIndex-1:0,n=this.getValueOfPropertyAt(r,s,"fontSize"),o=this.getObjectScaling().x*this.canvas.getZoom(),a=this.cursorWidth/o,l=this.getValueOfPropertyAt(r,s,"deltaY"),h=e.topOffset+(1-this._fontSizeFraction)*this.getHeightOfLine(r)/this.lineHeight-n*(1-this._fontSizeFraction);return{color:this.cursorColor||this.getValueOfPropertyAt(r,s,"fill"),opacity:this._currentCursorOpacity,left:e.left+e.leftOffset-a/2,top:h+e.top+l,width:a,height:n}}_renderCursor(t,e,i){let{color:r,opacity:s,left:n,top:o,width:a,height:l}=this.getCursorRenderingData(i,e);t.fillStyle=r,t.globalAlpha=s,t.fillRect(n,o,a,l)}renderSelection(t,e){let i={selectionStart:this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,selectionEnd:this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd};this._renderSelection(t,i,e)}renderDragSourceEffect(){let t=this.draggableTextDelegate.getDragStartSelection();this._renderSelection(this.canvas.contextTop,t,this._getCursorBoundaries(t.selectionStart,!0))}renderDropTargetEffect(t){let e=this.getSelectionStartFromPointer(t);this.renderCursorAt(e)}_renderSelection(t,e,i){let{textAlign:r,direction:s}=this,n=e.selectionStart,o=e.selectionEnd,a=r.includes(ki),l=this.get2DCursorLocation(n),h=this.get2DCursorLocation(o),c=l.lineIndex,u=h.lineIndex,d=l.charIndex<0?0:l.charIndex,g=h.charIndex<0?0:h.charIndex;for(let e=c;e<=u;e++){let n=this._getLineLeftOffset(e)||0,o=this.getHeightOfLine(e),l=0,h=0;if(e===c&&(l=this.__charBounds[c][d].left),e>=c&&e<u)h=a&&!this.isEndOfWrapping(e)?this.width:this.getLineWidth(e)||5;else if(e===u)if(0===g)h=this.__charBounds[u][g].left;else{let t=this._getWidthOfCharSpacing();h=this.__charBounds[u][g-1].left+this.__charBounds[u][g-1].width-t}let f=o;(this.lineHeight<1||e===u&&this.lineHeight>1)&&(o/=this.lineHeight);let p=i.left+n+l,m=o,y=0,b=h-l;this.inCompositionMode?(t.fillStyle=this.compositionColor||"black",m=1,y=o):t.fillStyle=this.selectionColor,"rtl"===s&&("right"===r||"justify"===r||"justify-right"===r?p=this.width-p-b:"left"===r||"justify-left"===r?p=i.left+n-h:"center"!==r&&"justify-center"!==r||(p=i.left+n-h)),t.fillRect(p,i.top+i.topOffset+y,b,m),i.topOffset+=f}}getCurrentCharFontSize(){let t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")}getCurrentCharColor(){let t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,it)}_getCurrentCharIndex(){let t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}dispose(){this.exitEditingImpl(),this.draggableTextDelegate.dispose(),super.dispose()}};p(aa,"ownDefaults",oa),p(aa,"type","IText"),at.setClass(aa),at.setClass(aa,"i-text");var la=class t extends aa{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(e,{...t.ownDefaults,...i})}static createControls(){return{controls:fs()}}initDimensions(){this.initialized&&(this.isEditing&&this.initDelayedCursor(),this._clearCache(),this.dynamicMinWidth=0,this._styleMap=this._generateStyleMap(this._splitText()),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this.textAlign.includes("justify")&&this.enlargeSpaces(),this.height=this.calcTextHeight())}_generateStyleMap(t){let e=0,i=0,r=0,s={};for(let n=0;n<t.graphemeLines.length;n++)"\n"===t.graphemeText[r]&&n>0?(i=0,r++,e++):!this.splitByGrapheme&&this._reSpaceAndTab.test(t.graphemeText[r])&&n>0&&(i++,r++),s[n]={line:e,offset:i},r+=t.graphemeLines[n].length,i+=t.graphemeLines[n].length;return s}styleHas(t,e){if(this._styleMap&&!this.isWrapping){let t=this._styleMap[e];t&&(e=t.line)}return super.styleHas(t,e)}isEmptyStyles(t){if(!this.styles)return!0;let e,i,r=0,s=!1,n=this._styleMap[t],o=this._styleMap[t+1];n&&(t=n.line,r=n.offset),o&&(e=o.line,s=e===t,i=o.offset);let a=void 0===t?this.styles:{line:this.styles[t]};for(let t in a)for(let e in a[t]){let n=parseInt(e,10);if(n>=r&&(!s||n<i))for(let i in a[t][e])return!1}return!0}_getStyleDeclaration(t,e){if(this._styleMap&&!this.isWrapping){let i=this._styleMap[t];if(!i)return{};t=i.line,e=i.offset+e}return super._getStyleDeclaration(t,e)}_setStyleDeclaration(t,e,i){let r=this._styleMap[t];super._setStyleDeclaration(r.line,r.offset+e,i)}_deleteStyleDeclaration(t,e){let i=this._styleMap[t];super._deleteStyleDeclaration(i.line,i.offset+e)}_getLineStyle(t){let e=this._styleMap[t];return!!this.styles[e.line]}_setLineStyle(t){let e=this._styleMap[t];super._setLineStyle(e.line)}_wrapText(t,e){this.isWrapping=!0;let i=this.getGraphemeDataForRender(t),r=[];for(let t=0;t<i.wordsData.length;t++)r.push(...this._wrapLine(t,e,i));return this.isWrapping=!1,r}getGraphemeDataForRender(t){let e=this.splitByGrapheme,i=e?"":" ",r=0;return{wordsData:t.map((t,s)=>{let n=0,o=e?this.graphemeSplit(t):this.wordSplit(t);return 0===o.length?[{word:[],width:0}]:o.map(t=>{let o=e?[t]:this.graphemeSplit(t),a=this._measureWord(o,s,n);return r=Math.max(a,r),n+=o.length+i.length,{word:o,width:a}})}),largestWordWidth:r}}_measureWord(t,e,i=0){let r,s=0;for(let n=0,o=t.length;n<o;n++)s+=this._getGraphemeBox(t[n],e,n+i,r,!0).kernedWidth,r=t[n];return s}wordSplit(t){return t.split(this._wordJoiners)}_wrapLine(t,e,{largestWordWidth:i,wordsData:r},s=0){let n=this._getWidthOfCharSpacing(),o=this.splitByGrapheme,a=[],l=o?"":" ",h=0,c=[],u=0,d=0,g=!0;e-=s;let f,p=Math.max(e,i,this.dynamicMinWidth),m=r[t];for(f=0;f<m.length;f++){let{word:e,width:i}=m[f];u+=e.length,h+=d+i-n,h>p&&!g?(a.push(c),c=[],h=i,g=!0):h+=n,g||o||c.push(l),c=c.concat(e),d=o?0:this._measureWord([l],t,u),u++,g=!1}return f&&a.push(c),i+s>this.dynamicMinWidth&&(this.dynamicMinWidth=i-n+s),a}isEndOfWrapping(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line}missingNewlineOffset(t,e){return this.splitByGrapheme&&!e?+!!this.isEndOfWrapping(t):1}_splitTextIntoLines(t){let e=super._splitTextIntoLines(t),i=this._wrapText(e.lines,this.width),r=Array(i.length);for(let t=0;t<i.length;t++)r[t]=i[t].join("");return e.lines=r,e.graphemeLines=i,e}getMinWidth(){return Math.max(this.minWidth,this.dynamicMinWidth)}_removeExtraneousStyles(){let t=new Map;for(let e in this._styleMap){let i=parseInt(e,10);if(this._textLines[i]){let i=this._styleMap[e].line;t.set(`${i}`,!0)}}for(let e in this.styles)t.has(e)||delete this.styles[e]}toObject(t=[]){return super.toObject(["minWidth","splitByGrapheme",...t])}};p(la,"type","Textbox"),p(la,"textLayoutProperties",[...aa.textLayoutProperties,"width"]),p(la,"ownDefaults",{minWidth:20,dynamicMinWidth:2,lockScalingFlip:!0,noScaleCache:!1,_wordJoiners:/[ \t\r]/,splitByGrapheme:!1}),at.setClass(la);var ha=class extends rn{shouldPerformLayout(t){return!!t.target.clipPath&&super.shouldPerformLayout(t)}shouldLayoutClipPath(){return!1}calcLayoutResult(t,e){let{target:i}=t,{clipPath:r,group:s}=i;if(!r||!this.shouldPerformLayout(t))return;let{width:n,height:o}=Se(en(i,r)),a=new gt(n,o);if(r.absolutePositioned)return{center:Pe(r.getRelativeCenterPoint(),void 0,s?s.calcTransformMatrix():void 0),size:a};{let s=r.getRelativeCenterPoint().transform(i.calcOwnMatrix(),!0);if(this.shouldPerformLayout(t)){let{center:i=new gt,correction:r=new gt}=this.calcBoundingBox(e,t)||{};return{center:i.add(s),correction:r.subtract(s),size:a}}return{center:i.getRelativeCenterPoint().add(s),size:a}}}};p(ha,"type","clip-path"),at.setClass(ha);var ca=class extends rn{getInitialSize({target:t},{size:e}){return new gt(t.width||e.x,t.height||e.y)}};p(ca,"type","fixed"),at.setClass(ca);var ua=class extends on{subscribeTargets(t){let e=t.target;t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{t.layoutManager.subscribeTargets({target:t,targets:[e]})})}unsubscribeTargets(t){let e=t.target,i=e.getObjects();t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{!i.some(e=>e.parent===t)&&t.layoutManager.unsubscribeTargets({target:t,targets:[e]})})}},da=class t extends ln{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(i);let{left:r,top:s,layoutManager:n}=i;this.groupInit(e,{left:r,top:s,layoutManager:n??new ua})}_shouldSetNestedCoords(){return!0}__objectSelectionMonitor(){}multiSelectAdd(...t){"selection-order"===this.multiSelectionStacking?this.add(...t):t.forEach(t=>{let e=this._objects.findIndex(e=>e.isInFrontOf(t)),i=-1===e?this.size():e;this.insertAt(i,t)})}canEnterGroup(t){return this.getObjects().some(e=>e.isDescendantOf(t)||t.isDescendantOf(e))?(b("error","ActiveSelection: circular object trees are not supported, this call has no effect"),!1):super.canEnterGroup(t)}enterGroup(t,e){t.parent&&t.parent===t.group?t.parent._exitGroup(t):t.group&&t.parent!==t.group&&t.group.remove(t),this._enterGroup(t,e)}exitGroup(t,e){this._exitGroup(t,e),t.parent&&t.parent._enterGroup(t,!0)}_onAfterObjectsChange(t,e){super._onAfterObjectsChange(t,e);let i=new Set;e.forEach(t=>{let{parent:e}=t;e&&i.add(e)}),"removed"===t?i.forEach(t=>{t._onAfterObjectsChange(tn,e)}):i.forEach(t=>{t._set("dirty",!0)})}onDeselect(){return this.removeAll(),!1}toString(){return`#<ActiveSelection: (${this.complexity()})>`}shouldCache(){return!1}isOnACache(){return!1}_renderControls(t,e,i){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;let r={hasControls:!1,...i,forActiveSelection:!0};for(let e=0;e<this._objects.length;e++)this._objects[e]._renderControls(t,r);super._renderControls(t,e),t.restore()}};p(da,"type","ActiveSelection"),p(da,"ownDefaults",{multiSelectionStacking:"canvas-stacking"}),at.setClass(da),at.setClass(da,"activeSelection");var ga=class{constructor(){p(this,"resources",{})}applyFilters(t,e,i,r,s){let n=s.getContext("2d",{willReadFrequently:!0,desynchronized:!0});if(!n)return;n.drawImage(e,0,0,i,r);let o={sourceWidth:i,sourceHeight:r,imageData:n.getImageData(0,0,i,r),originalEl:e,originalImageData:n.getImageData(0,0,i,r),canvasEl:s,ctx:n,filterBackend:this};t.forEach(t=>{t.applyTo(o)});let{imageData:a}=o;return a.width===i&&a.height===r||(s.width=a.width,s.height=a.height),n.putImageData(a,0,0),o}},fa=class{constructor({tileSize:t=y.textureSize}={}){p(this,"aPosition",new Float32Array([0,0,0,1,1,0,1,1])),p(this,"resources",{}),this.tileSize=t,this.setupGLContext(t,t),this.captureGPUInfo()}setupGLContext(t,e){this.dispose(),this.createWebGLCanvas(t,e)}createWebGLCanvas(t,e){let i=Tt({width:t,height:e}),r=i.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,depth:!1,stencil:!1,antialias:!1});r&&(r.clearColor(0,0,0,0),this.canvas=i,this.gl=r)}applyFilters(t,e,i,r,s,n){let o,a=this.gl,l=s.getContext("2d");if(!a||!l)return;n&&(o=this.getCachedTexture(n,e));let h={originalWidth:e.width||e.naturalWidth||0,originalHeight:e.height||e.naturalHeight||0,sourceWidth:i,sourceHeight:r,destinationWidth:i,destinationHeight:r,context:a,sourceTexture:this.createTexture(a,i,r,o?void 0:e),targetTexture:this.createTexture(a,i,r),originalTexture:o||this.createTexture(a,i,r,o?void 0:e),passes:t.length,webgl:!0,aPosition:this.aPosition,programCache:this.programCache,pass:0,filterBackend:this,targetCanvas:s},c=a.createFramebuffer();return a.bindFramebuffer(a.FRAMEBUFFER,c),t.forEach(t=>{t&&t.applyTo(h)}),function(t){let e=t.targetCanvas,i=e.width,r=e.height,s=t.destinationWidth,n=t.destinationHeight;i===s&&r===n||(e.width=s,e.height=n)}(h),this.copyGLTo2D(a,h),a.bindTexture(a.TEXTURE_2D,null),a.deleteTexture(h.sourceTexture),a.deleteTexture(h.targetTexture),a.deleteFramebuffer(c),l.setTransform(1,0,0,1,0,0),h}dispose(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()}clearWebGLCaches(){this.programCache={},this.textureCache={}}createTexture(t,e,i,r,s){let{NEAREST:n,TEXTURE_2D:o,RGBA:a,UNSIGNED_BYTE:l,CLAMP_TO_EDGE:h,TEXTURE_MAG_FILTER:c,TEXTURE_MIN_FILTER:u,TEXTURE_WRAP_S:d,TEXTURE_WRAP_T:g}=t,f=t.createTexture();return t.bindTexture(o,f),t.texParameteri(o,c,s||n),t.texParameteri(o,u,s||n),t.texParameteri(o,d,h),t.texParameteri(o,g,h),r?t.texImage2D(o,0,a,a,l,r):t.texImage2D(o,0,a,e,i,0,a,l,null),f}getCachedTexture(t,e,i){let{textureCache:r}=this;if(r[t])return r[t];{let s=this.createTexture(this.gl,e.width,e.height,e,i);return s&&(r[t]=s),s}}evictCachesForKey(t){this.textureCache[t]&&(this.gl.deleteTexture(this.textureCache[t]),delete this.textureCache[t])}copyGLTo2D(t,e){let i=t.canvas,r=e.targetCanvas,s=r.getContext("2d");if(!s)return;s.translate(0,r.height),s.scale(1,-1);let n=i.height-r.height;s.drawImage(i,0,n,r.width,r.height,0,0,r.width,r.height)}copyGLTo2DPutImageData(t,e){let i=e.targetCanvas.getContext("2d"),r=e.destinationWidth,s=e.destinationHeight,n=r*s*4;if(!i)return;let o=new Uint8Array(this.imageBuffer,0,n),a=new Uint8ClampedArray(this.imageBuffer,0,n);t.readPixels(0,0,r,s,t.RGBA,t.UNSIGNED_BYTE,o);let l=new ImageData(a,r,s);i.putImageData(l,0,0)}captureGPUInfo(){if(this.gpuInfo)return this.gpuInfo;let t=this.gl,e={renderer:"",vendor:""};if(!t)return e;let i=t.getExtension("WEBGL_debug_renderer_info");if(i){let r=t.getParameter(i.UNMASKED_RENDERER_WEBGL),s=t.getParameter(i.UNMASKED_VENDOR_WEBGL);r&&(e.renderer=r.toLowerCase()),s&&(e.vendor=s.toLowerCase())}return this.gpuInfo=e,e}};let pa;function ma(t=!0){return!pa&&t&&(pa=function(){let{WebGLProbe:t}=T();return t.queryWebGL(Ct()),y.enableGLFiltering&&t.isSupported(y.textureSize)?new fa({tileSize:y.textureSize}):new ga}()),pa}const ya=["cropX","cropY"];var ba=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(),p(this,"_lastScaleX",1),p(this,"_lastScaleY",1),p(this,"_filterScalingX",1),p(this,"_filterScalingY",1),this.filters=[],Object.assign(this,t.ownDefaults),this.setOptions(i),this.cacheKey=`texture${xt()}`,this.setElement("string"==typeof e?(this.canvas&&ne(this.canvas.getElement())||O()).getElementById(e):e,i)}getElement(){return this._element}setElement(t,e={}){this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(e),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){let e=ma(!1);e instanceof fa&&e.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach(t=>{let e=this[t];e&&T().dispose(e),this[t]=void 0})}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){let t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;let e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,-i),t.lineTo(e,-i),t.lineTo(e,i),t.lineTo(-e,i),t.lineTo(-e,-i),t.closePath()}toObject(t=[]){let e=[];return this.filters.forEach(t=>{t&&e.push(t.toObject())}),{...super.toObject([...ya,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:e,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width<this._element.width||this.height<this._element.height}_toSVG(){let t=[],e=this._element,i=-this.width/2,r=-this.height/2,s=[],n=[],o="",a="";if(!e)return[];if(this.hasCrop()){let t=xt();s.push('<clipPath id="imageCrop_'+t+'">\n','\t<rect x="'+i+'" y="'+r+'" width="'+fe(this.width)+'" height="'+fe(this.height)+'" />\n',"</clipPath>\n"),o=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t<image ","COMMON_PARTS",`xlink:href="${fe(this.getSrc(!0))}" x="${i-this.cropX}" y="${r-this.cropY}" width="${e.width||e.naturalWidth}" height="${e.height||e.naturalHeight}"${a}${o}></image>\n`),this.stroke||this.strokeDashArray){let t=this.fill;this.fill=null,n=[`\t<rect x="${i}" y="${r}" width="${fe(this.width)}" height="${fe(this.height)}" style="${this.getSvgStyles()}" />\n`],this.fill=t}return s="fill"===this.paintFirst?s.concat(t,n):s.concat(n,t),s}getSrc(t){let e=t?this._element:this._originalElement;return e?e.toDataURL?e.toDataURL():this.srcFromAttribute?e.getAttribute("src")||"":e.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t,{crossOrigin:e,signal:i}={}){return Gt(t,{crossOrigin:e,signal:i}).then(t=>{void 0!==e&&this.set({crossOrigin:e}),this.setElement(t)})}toString(){return`#<Image: { src: "${this.getSrc()}" }>`}applyResizeFilters(){let t=this.resizeFilter,e=this.minimumScaleTrigger,i=this.getTotalObjectScaling(),r=i.x,s=i.y,n=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||r>e&&s>e)return this._element=n,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=r,void(this._lastScaleY=s);let o=Tt(n),{width:a,height:l}=n;this._element=o,this._lastScaleX=t.scaleX=r,this._lastScaleY=t.scaleY=s,ma().applyFilters([t],n,a,l,this._element),this._filterScalingX=o.width/this._originalElement.width,this._filterScalingY=o.height/this._originalElement.height}applyFilters(t=this.filters||[]){if(t=t.filter(t=>t&&!t.isNeutralState()),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);let e=this._originalElement,i=e.naturalWidth||e.width,r=e.naturalHeight||e.height;if(this._element===this._originalElement){let t=Tt({width:i,height:r});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,i,r),this._lastScaleX=1,this._lastScaleY=1);ma().applyFilters(t,this._originalElement,i,r,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){let e=this._element;if(!e)return;let i=this._filterScalingX,r=this._filterScalingY,s=this.width,n=this.height,o=Math.max(this.cropX,0),a=Math.max(this.cropY,0),l=e.naturalWidth||e.width,h=e.naturalHeight||e.height,c=o*i,u=a*r,d=Math.min(s*i,l-c),g=Math.min(n*r,h-u),f=-s/2,p=-n/2,m=Math.min(s,l/i-o),y=Math.min(n,h/r-a);e&&t.drawImage(e,c,u,d,g,f,p,m,y)}_needsResize(){let t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight({width:t,height:e}={}){let i=this.getOriginalSize();this.width=t||i.width,this.height=e||i.height}parsePreserveAspectRatioAttribute(){let t,e=mi(this.preserveAspectRatio||""),i=this.width,r=this.height,s={width:i,height:r},n=this._element.width,o=this._element.height,a=1,l=1,h=0,c=0,u=0,d=0;return!e||"none"===e.alignX&&"none"===e.alignY?(a=i/n,l=r/o):("meet"===e.meetOrSlice&&(a=l=cn(this._element,s),t=(i-n*a)/2,"Min"===e.alignX&&(h=-t),"Max"===e.alignX&&(h=t),t=(r-o*l)/2,"Min"===e.alignY&&(c=-t),"Max"===e.alignY&&(c=t)),"slice"===e.meetOrSlice&&(a=l=un(this._element,s),t=n-i/a,"Mid"===e.alignX&&(u=t/2),"Max"===e.alignX&&(u=t),t=o-r/l,"Mid"===e.alignY&&(d=t/2),"Max"===e.alignY&&(d=t),n=i/a,o=r/l)),{width:n,height:o,scaleX:a,scaleY:l,offsetLeft:h,offsetTop:c,cropX:u,cropY:d}}static fromObject({filters:t,resizeFilter:e,src:i,crossOrigin:r,type:s,...n},o){return Promise.all([Gt(i,{...o,crossOrigin:r}),t&&Ut(t,o),e?Ut([e],o):[],qt(n,o)]).then(([t,e=[],[r],s={}])=>new this(t,{...n,src:i,filters:e,resizeFilter:r,...s}))}static fromURL(t,{crossOrigin:e=null,signal:i}={},r){return Gt(t,{crossOrigin:e,signal:i}).then(t=>new this(t,r))}static async fromElement(t,e={},i){let r=Ks(t,this.ATTRIBUTE_NAMES,i);return this.fromURL(r["xlink:href"]||r.href,e,r).catch(t=>(b("log","Unable to parse Image",t),null))}};p(ba,"type","Image"),p(ba,"cacheProperties",[...Xi,...ya]),p(ba,"ownDefaults",{strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0}),p(ba,"ATTRIBUTE_NAMES",[...Ds,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),at.setClass(ba),at.setSVGClass(ba),_n(["pattern","defs","symbol","metadata","clipPath","mask","desc"]);const _a=t=>void 0!==t.webgl,va="precision highp float",xa=`\n    ${va};\n    varying vec2 vTexCoord;\n    uniform sampler2D uTexture;\n    void main() {\n      gl_FragColor = texture2D(uTexture, vTexCoord);\n    }`,Ca=new RegExp(va,"g");var wa=class{get type(){return this.constructor.type}constructor({type:t,...e}={}){Object.assign(this,this.constructor.defaults,e)}getFragmentSource(){return xa}getVertexSource(){return"\n    attribute vec2 aPosition;\n    varying vec2 vTexCoord;\n    void main() {\n      vTexCoord = aPosition;\n      gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n    }"}createProgram(t,e=this.getFragmentSource(),i=this.getVertexSource()){let{WebGLProbe:{GLPrecision:r="highp"}}=T();"highp"!==r&&(e=e.replace(Ca,va.replace("highp",r)));let s=t.createShader(t.VERTEX_SHADER),n=t.createShader(t.FRAGMENT_SHADER),o=t.createProgram();if(!s||!n||!o)throw new _("Vertex, fragment shader or program creation error");if(t.shaderSource(s,i),t.compileShader(s),!t.getShaderParameter(s,t.COMPILE_STATUS))throw new _(`Vertex shader compile error for ${this.type}: ${t.getShaderInfoLog(s)}`);if(t.shaderSource(n,e),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new _(`Fragment shader compile error for ${this.type}: ${t.getShaderInfoLog(n)}`);if(t.attachShader(o,s),t.attachShader(o,n),t.linkProgram(o),!t.getProgramParameter(o,t.LINK_STATUS))throw new _(`Shader link error for "${this.type}" ${t.getProgramInfoLog(o)}`);let a=this.getUniformLocations(t,o)||{};return a.uStepW=t.getUniformLocation(o,"uStepW"),a.uStepH=t.getUniformLocation(o,"uStepH"),{program:o,attributeLocations:this.getAttributeLocations(t,o),uniformLocations:a}}getAttributeLocations(t,e){return{aPosition:t.getAttribLocation(e,"aPosition")}}getUniformLocations(t,e){let i=this.constructor.uniformLocations,r={};for(let s=0;s<i.length;s++)r[i[s]]=t.getUniformLocation(e,i[s]);return r}sendAttributeData(t,e,i){let r=e.aPosition,s=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,s),t.enableVertexAttribArray(r),t.vertexAttribPointer(r,2,t.FLOAT,!1,0,0),t.bufferData(t.ARRAY_BUFFER,i,t.STATIC_DRAW)}_setupFrameBuffer(t){let e=t.context;if(t.passes>1){let i=t.destinationWidth,r=t.destinationHeight;t.sourceWidth===i&&t.sourceHeight===r||(e.deleteTexture(t.targetTexture),t.targetTexture=t.filterBackend.createTexture(e,i,r)),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.targetTexture,0)}else e.bindFramebuffer(e.FRAMEBUFFER,null),e.finish()}_swapTextures(t){t.passes--,t.pass++;let e=t.targetTexture;t.targetTexture=t.sourceTexture,t.sourceTexture=e}isNeutralState(t){return!1}applyTo(t){_a(t)?(this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){}getCacheKey(){return this.type}retrieveShader(t){let e=this.getCacheKey();return t.programCache[e]||(t.programCache[e]=this.createProgram(t.context)),t.programCache[e]}applyToWebGL(t){let e=t.context,i=this.retrieveShader(t);0===t.pass&&t.originalTexture?e.bindTexture(e.TEXTURE_2D,t.originalTexture):e.bindTexture(e.TEXTURE_2D,t.sourceTexture),e.useProgram(i.program),this.sendAttributeData(e,i.attributeLocations,t.aPosition),e.uniform1f(i.uniformLocations.uStepW,1/t.sourceWidth),e.uniform1f(i.uniformLocations.uStepH,1/t.sourceHeight),this.sendUniformData(e,i.uniformLocations),e.viewport(0,0,t.destinationWidth,t.destinationHeight),e.drawArrays(e.TRIANGLE_STRIP,0,4)}bindAdditionalTexture(t,e,i){t.activeTexture(i),t.bindTexture(t.TEXTURE_2D,e),t.activeTexture(t.TEXTURE0)}unbindAdditionalTexture(t,e){t.activeTexture(e),t.bindTexture(t.TEXTURE_2D,null),t.activeTexture(t.TEXTURE0)}sendUniformData(t,e){}createHelpLayer(t){if(!t.helpLayer){let{sourceWidth:e,sourceHeight:i}=t;t.helpLayer=Tt({width:e,height:i})}}toObject(){let t=Object.keys(this.constructor.defaults||{});return{type:this.type,...t.reduce((t,e)=>(t[e]=this[e],t),{})}}toJSON(){return this.toObject()}static async fromObject({type:t,...e},i){return new this(e)}};p(wa,"type","BaseFilter"),p(wa,"uniformLocations",[]);const Sa={multiply:"gl_FragColor.rgb *= uColor.rgb;\n",screen:"gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n",add:"gl_FragColor.rgb += uColor.rgb;\n",difference:"gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n",subtract:"gl_FragColor.rgb -= uColor.rgb;\n",lighten:"gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n",darken:"gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n",exclusion:"gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n",overlay:"\n    if (uColor.r < 0.5) {\n      gl_FragColor.r *= 2.0 * uColor.r;\n    } else {\n      gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n    }\n    if (uColor.g < 0.5) {\n      gl_FragColor.g *= 2.0 * uColor.g;\n    } else {\n      gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n    }\n    if (uColor.b < 0.5) {\n      gl_FragColor.b *= 2.0 * uColor.b;\n    } else {\n      gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n    }\n    ",tint:"\n    gl_FragColor.rgb *= (1.0 - uColor.a);\n    gl_FragColor.rgb += uColor.rgb;\n    "};var Ta=class extends wa{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return`\n      precision highp float;\n      uniform sampler2D uTexture;\n      uniform vec4 uColor;\n      varying vec2 vTexCoord;\n      void main() {\n        vec4 color = texture2D(uTexture, vTexCoord);\n        gl_FragColor = color;\n        if (color.a > 0.0) {\n          ${Sa[this.mode]}\n        }\n      }\n      `}applyTo2d({imageData:{data:t}}){let e=new gi(this.color).getSource(),i=this.alpha,r=e[0]*i,s=e[1]*i,n=e[2]*i,o=1-i;for(let e=0;e<t.length;e+=4){let i,a,l,h=t[e],c=t[e+1],u=t[e+2];switch(this.mode){case"multiply":i=h*r/255,a=c*s/255,l=u*n/255;break;case"screen":i=255-(255-h)*(255-r)/255,a=255-(255-c)*(255-s)/255,l=255-(255-u)*(255-n)/255;break;case"add":i=h+r,a=c+s,l=u+n;break;case"difference":i=Math.abs(h-r),a=Math.abs(c-s),l=Math.abs(u-n);break;case"subtract":i=h-r,a=c-s,l=u-n;break;case"darken":i=Math.min(h,r),a=Math.min(c,s),l=Math.min(u,n);break;case"lighten":i=Math.max(h,r),a=Math.max(c,s),l=Math.max(u,n);break;case"overlay":i=r<128?2*h*r/255:255-2*(255-h)*(255-r)/255,a=s<128?2*c*s/255:255-2*(255-c)*(255-s)/255,l=n<128?2*u*n/255:255-2*(255-u)*(255-n)/255;break;case"exclusion":i=r+h-2*r*h/255,a=s+c-2*s*c/255,l=n+u-2*n*u/255;break;case"tint":i=r+h*o,a=s+c*o,l=n+u*o}t[e]=i,t[e+1]=a,t[e+2]=l}}sendUniformData(t,e){let i=new gi(this.color).getSource();i[0]=this.alpha*i[0]/255,i[1]=this.alpha*i[1]/255,i[2]=this.alpha*i[2]/255,i[3]=this.alpha,t.uniform4fv(e.uColor,i)}};p(Ta,"defaults",{color:"#F95C63",mode:"multiply",alpha:1}),p(Ta,"type","BlendColor"),p(Ta,"uniformLocations",["uColor"]),at.setClass(Ta);const Oa={multiply:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform sampler2D uImage;\n    uniform vec4 uColor;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      vec4 color2 = texture2D(uImage, vTexCoord2);\n      color.rgba *= color2.rgba;\n      gl_FragColor = color;\n    }\n    ",mask:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform sampler2D uImage;\n    uniform vec4 uColor;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      vec4 color2 = texture2D(uImage, vTexCoord2);\n      color.a = color2.a;\n      gl_FragColor = color;\n    }\n    "};var ka=class extends wa{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return Oa[this.mode]}getVertexSource(){return"\n    attribute vec2 aPosition;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    uniform mat3 uTransformMatrix;\n    void main() {\n      vTexCoord = aPosition;\n      vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n      gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n    }\n    "}applyToWebGL(t){let e=t.context,i=this.createTexture(t.filterBackend,this.image);this.bindAdditionalTexture(e,i,e.TEXTURE1),super.applyToWebGL(t),this.unbindAdditionalTexture(e,e.TEXTURE1)}createTexture(t,e){return t.getCachedTexture(e.cacheKey,e.getElement())}calculateMatrix(){let t=this.image,{width:e,height:i}=t.getElement();return[1/t.scaleX,0,0,0,1/t.scaleY,0,-t.left/e,-t.top/i,1]}applyTo2d({imageData:{data:t,width:e,height:i},filterBackend:{resources:r}}){let s=this.image;r.blendImage||(r.blendImage=Ct());let n=r.blendImage,o=n.getContext("2d");n.width!==e||n.height!==i?(n.width=e,n.height=i):o.clearRect(0,0,e,i),o.setTransform(s.scaleX,0,0,s.scaleY,s.left,s.top),o.drawImage(s.getElement(),0,0,e,i);let a=o.getImageData(0,0,e,i).data;for(let e=0;e<t.length;e+=4){let i=t[e],r=t[e+1],s=t[e+2],n=t[e+3],o=a[e],l=a[e+1],h=a[e+2],c=a[e+3];switch(this.mode){case"multiply":t[e]=i*o/255,t[e+1]=r*l/255,t[e+2]=s*h/255,t[e+3]=n*c/255;break;case"mask":t[e+3]=c}}}sendUniformData(t,e){let i=this.calculateMatrix();t.uniform1i(e.uImage,1),t.uniformMatrix3fv(e.uTransformMatrix,!1,i)}toObject(){return{...super.toObject(),image:this.image&&this.image.toObject()}}static async fromObject({type:t,image:e,...i},r){return ba.fromObject(e,r).then(t=>new this({...i,image:t}))}};p(ka,"type","BlendImage"),p(ka,"defaults",{mode:"multiply",alpha:1}),p(ka,"uniformLocations",["uTransformMatrix","uImage"]),at.setClass(ka);var Da=class extends wa{getFragmentSource(){return"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform vec2 uDelta;\n    varying vec2 vTexCoord;\n    const float nSamples = 15.0;\n    vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n    float random(vec3 scale) {\n      /* use the fragment position for a different seed per-pixel */\n      return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n    }\n    void main() {\n      vec4 color = vec4(0.0);\n      float totalC = 0.0;\n      float totalA = 0.0;\n      float offset = random(v3offset);\n      for (float t = -nSamples; t <= nSamples; t++) {\n        float percent = (t + offset - 0.5) / nSamples;\n        vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n        float weight = 1.0 - abs(percent);\n        float alpha = weight * sample.a;\n        color.rgb += sample.rgb * alpha;\n        color.a += alpha;\n        totalA += weight;\n        totalC += alpha;\n      }\n      gl_FragColor.rgb = color.rgb / totalC;\n      gl_FragColor.a = color.a / totalA;\n    }\n  "}applyTo(t){_a(t)?(this.aspectRatio=t.sourceWidth/t.sourceHeight,t.passes++,this._setupFrameBuffer(t),this.horizontal=!0,this.applyToWebGL(t),this._swapTextures(t),this._setupFrameBuffer(t),this.horizontal=!1,this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d({imageData:{data:t,width:e,height:i}}){this.aspectRatio=e/i,this.horizontal=!0;let r=this.getBlurValue()*e,s=new Uint8ClampedArray(t),n=4*e;for(let e=0;e<t.length;e+=4){let i=0,o=0,a=0,l=0,h=0,c=e-e%n,u=c+n;for(let s=-14;s<15;s++){let n=s/15,d=4*Math.floor(r*n),g=1-Math.abs(n),f=e+d;f<c?f=c:f>u&&(f=u);let p=t[f+3]*g;i+=t[f]*p,o+=t[f+1]*p,a+=t[f+2]*p,l+=p,h+=g}s[e]=i/l,s[e+1]=o/l,s[e+2]=a/l,s[e+3]=l/h}this.horizontal=!1,r=this.getBlurValue()*i;for(let e=0;e<s.length;e+=4){let i=0,o=0,a=0,l=0,h=0,c=e%n,u=s.length-n+c;for(let t=-14;t<15;t++){let d=t/15,g=Math.floor(r*d)*n,f=1-Math.abs(d),p=e+g;p<c?p=c:p>u&&(p=u);let m=s[p+3]*f;i+=s[p]*m,o+=s[p+1]*m,a+=s[p+2]*m,l+=m,h+=f}t[e]=i/l,t[e+1]=o/l,t[e+2]=a/l,t[e+3]=l/h}}sendUniformData(t,e){let i=this.chooseRightDelta();t.uniform2fv(e.uDelta,i)}isNeutralState(){return 0===this.blur}getBlurValue(){let t=1,{horizontal:e,aspectRatio:i}=this;return e?i>1&&(t=1/i):i<1&&(t=i),t*this.blur*.12}chooseRightDelta(){let t=this.getBlurValue();return this.horizontal?[t,0]:[0,t]}};p(Da,"type","Blur"),p(Da,"defaults",{blur:0}),p(Da,"uniformLocations",["uDelta"]),at.setClass(Da);var Ma=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uBrightness;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color.rgb += uBrightness;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=Math.round(255*this.brightness);for(let i=0;i<t.length;i+=4)t[i]+=e,t[i+1]+=e,t[i+2]+=e}isNeutralState(){return 0===this.brightness}sendUniformData(t,e){t.uniform1f(e.uBrightness,this.brightness)}};p(Ma,"type","Brightness"),p(Ma,"defaults",{brightness:0}),p(Ma,"uniformLocations",["uBrightness"]),at.setClass(Ma);const ja={matrix:[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],colorsOnly:!0};var Ea=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  varying vec2 vTexCoord;\n  uniform mat4 uColorMatrix;\n  uniform vec4 uConstants;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color *= uColorMatrix;\n    color += uConstants;\n    gl_FragColor = color;\n  }"}applyTo2d(t){let e=t.imageData.data,i=this.matrix,r=this.colorsOnly;for(let t=0;t<e.length;t+=4){let s=e[t],n=e[t+1],o=e[t+2];if(e[t]=s*i[0]+n*i[1]+o*i[2]+255*i[4],e[t+1]=s*i[5]+n*i[6]+o*i[7]+255*i[9],e[t+2]=s*i[10]+n*i[11]+o*i[12]+255*i[14],!r){let r=e[t+3];e[t]+=r*i[3],e[t+1]+=r*i[8],e[t+2]+=r*i[13],e[t+3]=s*i[15]+n*i[16]+o*i[17]+r*i[18]+255*i[19]}}}sendUniformData(t,e){let i=this.matrix,r=[i[0],i[1],i[2],i[3],i[5],i[6],i[7],i[8],i[10],i[11],i[12],i[13],i[15],i[16],i[17],i[18]],s=[i[4],i[9],i[14],i[19]];t.uniformMatrix4fv(e.uColorMatrix,!1,r),t.uniform4fv(e.uConstants,s)}toObject(){return{...super.toObject(),matrix:[...this.matrix]}}};function Pa(t,e){var i;let r=(p(i=class extends Ea{toObject(){return{type:this.type,colorsOnly:this.colorsOnly}}},"type",t),p(i,"defaults",{colorsOnly:!1,matrix:e}),i);return at.setClass(r,t),r}p(Ea,"type","ColorMatrix"),p(Ea,"defaults",ja),p(Ea,"uniformLocations",["uColorMatrix","uConstants"]),at.setClass(Ea);const Aa=Pa("Brownie",[.5997,.34553,-.27082,0,.186,-.0377,.86095,.15059,0,-.1449,.24113,-.07441,.44972,0,-.02965,0,0,0,1,0]),Fa=Pa("Vintage",[.62793,.32021,-.03965,0,.03784,.02578,.64411,.03259,0,.02926,.0466,-.08512,.52416,0,.02023,0,0,0,1,0]),La=Pa("Kodachrome",[1.12855,-.39673,-.03992,0,.24991,-.16404,1.08352,-.05498,0,.09698,-.16786,-.56034,1.60148,0,.13972,0,0,0,1,0]),Ia=Pa("Technicolor",[1.91252,-.85453,-.09155,0,.04624,-.30878,1.76589,-.10601,0,-.27589,-.2311,-.75018,1.84759,0,.12137,0,0,0,1,0]),Ra=Pa("Polaroid",[1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0]),Ba=Pa("Sepia",[.393,.769,.189,0,0,.349,.686,.168,0,0,.272,.534,.131,0,0,0,0,0,1,0]),$a=Pa("BlackWhite",[1.5,1.5,1.5,0,-1,1.5,1.5,1.5,0,-1,1.5,1.5,1.5,0,-1,0,0,0,1,0]);var Xa=class extends wa{constructor(t={}){super(t),this.subFilters=t.subFilters||[]}applyTo(t){_a(t)&&(t.passes+=this.subFilters.length-1),this.subFilters.forEach(e=>{e.applyTo(t)})}toObject(){return{type:this.type,subFilters:this.subFilters.map(t=>t.toObject())}}isNeutralState(){return!this.subFilters.some(t=>!t.isNeutralState())}static fromObject(t,e){return Promise.all((t.subFilters||[]).map(t=>at.getClass(t.type).fromObject(t,e))).then(t=>new this({subFilters:t}))}};p(Xa,"type","Composed"),at.setClass(Xa);var Ya=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uContrast;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n    color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n    gl_FragColor = color;\n  }"}isNeutralState(){return 0===this.contrast}applyTo2d({imageData:{data:t}}){let e=Math.floor(255*this.contrast),i=259*(e+255)/(255*(259-e));for(let e=0;e<t.length;e+=4)t[e]=i*(t[e]-128)+128,t[e+1]=i*(t[e+1]-128)+128,t[e+2]=i*(t[e+2]-128)+128}sendUniformData(t,e){t.uniform1f(e.uContrast,this.contrast)}};p(Ya,"type","Contrast"),p(Ya,"defaults",{contrast:0}),p(Ya,"uniformLocations",["uContrast"]),at.setClass(Ya);const Wa={Convolute_3_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[9];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 3.0; h+=1.0) {\n        for (float w = 0.0; w < 3.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_3_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[9];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 3.0; h+=1.0) {\n        for (float w = 0.0; w < 3.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_5_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[25];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 5.0; h+=1.0) {\n        for (float w = 0.0; w < 5.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_5_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[25];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 5.0; h+=1.0) {\n        for (float w = 0.0; w < 5.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_7_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[49];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 7.0; h+=1.0) {\n        for (float w = 0.0; w < 7.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_7_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[49];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 7.0; h+=1.0) {\n        for (float w = 0.0; w < 7.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_9_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[81];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 9.0; h+=1.0) {\n        for (float w = 0.0; w < 9.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_9_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[81];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 9.0; h+=1.0) {\n        for (float w = 0.0; w < 9.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    "};var Na=class extends wa{getCacheKey(){return`${this.type}_${Math.sqrt(this.matrix.length)}_${+!!this.opaque}`}getFragmentSource(){return Wa[this.getCacheKey()]}applyTo2d(t){let e,i,r,s,n,o,a,l,h,c,u,d,g,f=t.imageData,p=f.data,m=this.matrix,y=Math.round(Math.sqrt(m.length)),b=Math.floor(y/2),_=f.width,v=f.height,x=t.ctx.createImageData(_,v),C=x.data,w=+!!this.opaque;for(u=0;u<v;u++)for(c=0;c<_;c++){for(n=4*(u*_+c),e=0,i=0,r=0,s=0,g=0;g<y;g++)for(d=0;d<y;d++)a=u+g-b,o=c+d-b,a<0||a>=v||o<0||o>=_||(l=4*(a*_+o),h=m[g*y+d],e+=p[l]*h,i+=p[l+1]*h,r+=p[l+2]*h,w||(s+=p[l+3]*h));C[n]=e,C[n+1]=i,C[n+2]=r,C[n+3]=w?p[n+3]:s}t.imageData=x}sendUniformData(t,e){t.uniform1fv(e.uMatrix,this.matrix)}toObject(){return{...super.toObject(),opaque:this.opaque,matrix:[...this.matrix]}}};p(Na,"type","Convolute"),p(Na,"defaults",{opaque:!1,matrix:[0,0,0,0,1,0,0,0,0]}),p(Na,"uniformLocations",["uMatrix","uOpaque","uHalfSize","uSize"]),at.setClass(Na);const Va="Gamma";var za=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform vec3 uGamma;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    vec3 correction = (1.0 / uGamma);\n    color.r = pow(color.r, correction.r);\n    color.g = pow(color.g, correction.g);\n    color.b = pow(color.b, correction.b);\n    gl_FragColor = color;\n    gl_FragColor.rgb *= color.a;\n  }\n"}constructor(t={}){super(t),this.gamma=t.gamma||this.constructor.defaults.gamma.concat()}applyTo2d({imageData:{data:t}}){let e=this.gamma,i=1/e[0],r=1/e[1],s=1/e[2];this.rgbValues||(this.rgbValues={r:new Uint8Array(256),g:new Uint8Array(256),b:new Uint8Array(256)});let n=this.rgbValues;for(let t=0;t<256;t++)n.r[t]=255*(t/255)**i,n.g[t]=255*(t/255)**r,n.b[t]=255*(t/255)**s;for(let e=0;e<t.length;e+=4)t[e]=n.r[t[e]],t[e+1]=n.g[t[e+1]],t[e+2]=n.b[t[e+2]]}sendUniformData(t,e){t.uniform3fv(e.uGamma,this.gamma)}isNeutralState(){let{gamma:t}=this;return 1===t[0]&&1===t[1]&&1===t[2]}toObject(){return{type:Va,gamma:this.gamma.concat()}}};p(za,"type",Va),p(za,"defaults",{gamma:[1,1,1]}),p(za,"uniformLocations",["uGamma"]),at.setClass(za);const Ha={average:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      float average = (color.r + color.b + color.g) / 3.0;\n      gl_FragColor = vec4(average, average, average, color.a);\n    }\n    ",lightness:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform int uMode;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 col = texture2D(uTexture, vTexCoord);\n      float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n      gl_FragColor = vec4(average, average, average, col.a);\n    }\n    ",luminosity:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform int uMode;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 col = texture2D(uTexture, vTexCoord);\n      float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n      gl_FragColor = vec4(average, average, average, col.a);\n    }\n    "};var Ga=class extends wa{applyTo2d({imageData:{data:t}}){for(let e,i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2];switch(this.mode){case"average":e=(r+s+n)/3;break;case"lightness":e=(Math.min(r,s,n)+Math.max(r,s,n))/2;break;case"luminosity":e=.21*r+.72*s+.07*n}t[i+2]=t[i+1]=t[i]=e}}getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return Ha[this.mode]}sendUniformData(t,e){t.uniform1i(e.uMode,1)}isNeutralState(){return!1}};p(Ga,"type","Grayscale"),p(Ga,"defaults",{mode:"average"}),p(Ga,"uniformLocations",["uMode"]),at.setClass(Ga);const Ua={...ja,rotation:0};var qa=class extends Ea{calculateMatrix(){let t=this.rotation*Math.PI,e=ut(t),i=dt(t),r=1/3,s=Math.sqrt(r)*i,n=1-e;this.matrix=[e+n/3,r*n-s,r*n+s,0,0,r*n+s,e+r*n,r*n-s,0,0,r*n-s,r*n+s,e+r*n,0,0,0,0,0,1,0]}isNeutralState(){return 0===this.rotation}applyTo(t){this.calculateMatrix(),super.applyTo(t)}toObject(){return{type:this.type,rotation:this.rotation}}};p(qa,"type","HueRotation"),p(qa,"defaults",Ua),at.setClass(qa);var Ka=class extends wa{applyTo2d({imageData:{data:t}}){for(let e=0;e<t.length;e+=4)t[e]=255-t[e],t[e+1]=255-t[e+1],t[e+2]=255-t[e+2],this.alpha&&(t[e+3]=255-t[e+3])}getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform int uInvert;\n  uniform int uAlpha;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    if (uInvert == 1) {\n      if (uAlpha == 1) {\n        gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n      } else {\n        gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n      }\n    } else {\n      gl_FragColor = color;\n    }\n  }\n"}isNeutralState(){return!this.invert}sendUniformData(t,e){t.uniform1i(e.uInvert,Number(this.invert)),t.uniform1i(e.uAlpha,Number(this.alpha))}};p(Ka,"type","Invert"),p(Ka,"defaults",{alpha:!1,invert:!0}),p(Ka,"uniformLocations",["uInvert","uAlpha"]),at.setClass(Ka);var Ja=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uStepH;\n  uniform float uNoise;\n  uniform float uSeed;\n  varying vec2 vTexCoord;\n  float rand(vec2 co, float seed, float vScale) {\n    return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n  }\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=this.noise;for(let i=0;i<t.length;i+=4){let r=(.5-Math.random())*e;t[i]+=r,t[i+1]+=r,t[i+2]+=r}}sendUniformData(t,e){t.uniform1f(e.uNoise,this.noise/255),t.uniform1f(e.uSeed,Math.random())}isNeutralState(){return 0===this.noise}};p(Ja,"type","Noise"),p(Ja,"defaults",{noise:0}),p(Ja,"uniformLocations",["uNoise","uSeed"]),at.setClass(Ja);var Qa=class extends wa{applyTo2d({imageData:{data:t,width:e,height:i}}){for(let r=0;r<i;r+=this.blocksize)for(let s=0;s<e;s+=this.blocksize){let n=4*r*e+4*s,o=t[n],a=t[n+1],l=t[n+2],h=t[n+3];for(let n=r;n<Math.min(r+this.blocksize,i);n++)for(let i=s;i<Math.min(s+this.blocksize,e);i++){let r=4*n*e+4*i;t[r]=o,t[r+1]=a,t[r+2]=l,t[r+3]=h}}}isNeutralState(){return 1===this.blocksize}getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uBlocksize;\n  uniform float uStepW;\n  uniform float uStepH;\n  varying vec2 vTexCoord;\n  void main() {\n    float blockW = uBlocksize * uStepW;\n    float blockH = uBlocksize * uStepH;\n    int posX = int(vTexCoord.x / blockW);\n    int posY = int(vTexCoord.y / blockH);\n    float fposX = float(posX);\n    float fposY = float(posY);\n    vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n    vec4 color = texture2D(uTexture, squareCoords);\n    gl_FragColor = color;\n  }\n"}sendUniformData(t,e){t.uniform1f(e.uBlocksize,this.blocksize)}};p(Qa,"type","Pixelate"),p(Qa,"defaults",{blocksize:4}),p(Qa,"uniformLocations",["uBlocksize"]),at.setClass(Qa);var Za=class extends wa{getFragmentSource(){return"\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n  gl_FragColor = texture2D(uTexture, vTexCoord);\n  if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n    gl_FragColor.a = 0.0;\n  }\n}\n"}applyTo2d({imageData:{data:t}}){let e=255*this.distance,i=new gi(this.color).getSource(),r=[i[0]-e,i[1]-e,i[2]-e],s=[i[0]+e,i[1]+e,i[2]+e];for(let e=0;e<t.length;e+=4){let i=t[e],n=t[e+1],o=t[e+2];i>r[0]&&n>r[1]&&o>r[2]&&i<s[0]&&n<s[1]&&o<s[2]&&(t[e+3]=0)}}sendUniformData(t,e){let i=new gi(this.color).getSource(),r=this.distance,s=[0+i[0]/255-r,0+i[1]/255-r,0+i[2]/255-r,1],n=[i[0]/255+r,i[1]/255+r,i[2]/255+r,1];t.uniform4fv(e.uLow,s),t.uniform4fv(e.uHigh,n)}};p(Za,"type","RemoveColor"),p(Za,"defaults",{color:"#FFFFFF",distance:.02,useAlpha:!1}),p(Za,"uniformLocations",["uLow","uHigh"]),at.setClass(Za);var tl=class extends wa{sendUniformData(t,e){t.uniform2fv(e.uDelta,this.horizontal?[1/this.width,0]:[0,1/this.height]),t.uniform1fv(e.uTaps,this.taps)}getFilterWindow(){let t=this.tempScale;return Math.ceil(this.lanczosLobes/t)}getCacheKey(){let t=this.getFilterWindow();return`${this.type}_${t}`}getFragmentSource(){let t=this.getFilterWindow();return this.generateShader(t)}getTaps(){let t=this.lanczosCreate(this.lanczosLobes),e=this.tempScale,i=this.getFilterWindow(),r=Array(i);for(let s=1;s<=i;s++)r[s-1]=t(s*e);return r}generateShader(t){let e=Array(t);for(let i=1;i<=t;i++)e[i-1]=`${i}.0 * uDelta`;return`\n      precision highp float;\n      uniform sampler2D uTexture;\n      uniform vec2 uDelta;\n      varying vec2 vTexCoord;\n      uniform float uTaps[${t}];\n      void main() {\n        vec4 color = texture2D(uTexture, vTexCoord);\n        float sum = 1.0;\n        ${e.map((t,e)=>`\n              color += texture2D(uTexture, vTexCoord + ${t}) * uTaps[${e}] + texture2D(uTexture, vTexCoord - ${t}) * uTaps[${e}];\n              sum += 2.0 * uTaps[${e}];\n            `).join("\n")}\n        gl_FragColor = color / sum;\n      }\n    `}applyToForWebgl(t){t.passes++,this.width=t.sourceWidth,this.horizontal=!0,this.dW=Math.round(this.width*this.scaleX),this.dH=t.sourceHeight,this.tempScale=this.dW/this.width,this.taps=this.getTaps(),t.destinationWidth=this.dW,super.applyTo(t),t.sourceWidth=t.destinationWidth,this.height=t.sourceHeight,this.horizontal=!1,this.dH=Math.round(this.height*this.scaleY),this.tempScale=this.dH/this.height,this.taps=this.getTaps(),t.destinationHeight=this.dH,super.applyTo(t),t.sourceHeight=t.destinationHeight}applyTo(t){_a(t)?this.applyToForWebgl(t):this.applyTo2d(t)}isNeutralState(){return 1===this.scaleX&&1===this.scaleY}lanczosCreate(t){return e=>{if(e>=t||e<=-t)return 0;if(e<1.1920929e-7&&e>-1.1920929e-7)return 1;let i=(e*=Math.PI)/t;return Math.sin(e)/e*Math.sin(i)/i}}applyTo2d(t){let e=t.imageData,i=this.scaleX,r=this.scaleY;this.rcpScaleX=1/i,this.rcpScaleY=1/r;let s,n=e.width,o=e.height,a=Math.round(n*i),l=Math.round(o*r);s="sliceHack"===this.resizeType?this.sliceByTwo(t,n,o,a,l):"hermite"===this.resizeType?this.hermiteFastResize(t,n,o,a,l):"bilinear"===this.resizeType?this.bilinearFiltering(t,n,o,a,l):"lanczos"===this.resizeType?this.lanczosResize(t,n,o,a,l):new ImageData(a,l),t.imageData=s}sliceByTwo(t,e,i,r,s){let n=t.imageData,o=.5,a=!1,l=!1,h=e*o,c=i*o,u=t.filterBackend.resources,d=0,g=0,f=e,p=0;u.sliceByTwo||(u.sliceByTwo=Ct());let m=u.sliceByTwo;(m.width<1.5*e||m.height<i)&&(m.width=1.5*e,m.height=i);let y=m.getContext("2d");for(y.clearRect(0,0,1.5*e,i),y.putImageData(n,0,0),r=Math.floor(r),s=Math.floor(s);!a||!l;)e=h,i=c,r<Math.floor(h*o)?h=Math.floor(h*o):(h=r,a=!0),s<Math.floor(c*o)?c=Math.floor(c*o):(c=s,l=!0),y.drawImage(m,d,g,e,i,f,p,h,c),d=f,g=p,p+=c;return y.getImageData(d,g,r,s)}lanczosResize(t,e,i,r,s){let n=t.imageData.data,o=t.ctx.createImageData(r,s),a=o.data,l=this.lanczosCreate(this.lanczosLobes),h=this.rcpScaleX,c=this.rcpScaleY,u=2/this.rcpScaleX,d=2/this.rcpScaleY,g=Math.ceil(h*this.lanczosLobes/2),f=Math.ceil(c*this.lanczosLobes/2),p={},m={x:0,y:0},y={x:0,y:0};return function t(b){let _,v,x,C,w,S,T,O,k,D,M;for(m.x=(b+.5)*h,y.x=Math.floor(m.x),_=0;_<s;_++){for(m.y=(_+.5)*c,y.y=Math.floor(m.y),w=0,S=0,T=0,O=0,k=0,v=y.x-g;v<=y.x+g;v++)if(!(v<0||v>=e)){D=Math.floor(1e3*Math.abs(v-m.x)),p[D]||(p[D]={});for(let t=y.y-f;t<=y.y+f;t++)t<0||t>=i||(M=Math.floor(1e3*Math.abs(t-m.y)),p[D][M]||(p[D][M]=l(Math.sqrt((D*u)**2+(M*d)**2)/1e3)),x=p[D][M],x>0&&(C=4*(t*e+v),w+=x,S+=x*n[C],T+=x*n[C+1],O+=x*n[C+2],k+=x*n[C+3]))}C=4*(_*r+b),a[C]=S/w,a[C+1]=T/w,a[C+2]=O/w,a[C+3]=k/w}return++b<r?t(b):o}(0)}bilinearFiltering(t,e,i,r,s){let n,o,a,l,h,c,u,d,g,f,p,m,y,b=0,_=this.rcpScaleX,v=this.rcpScaleY,x=4*(e-1),C=t.imageData.data,w=t.ctx.createImageData(r,s),S=w.data;for(u=0;u<s;u++)for(d=0;d<r;d++)for(h=Math.floor(_*d),c=Math.floor(v*u),g=_*d-h,f=v*u-c,y=4*(c*e+h),p=0;p<4;p++)n=C[y+p],o=C[y+4+p],a=C[y+x+p],l=C[y+x+4+p],m=n*(1-g)*(1-f)+o*g*(1-f)+a*f*(1-g)+l*g*f,S[b++]=m;return w}hermiteFastResize(t,e,i,r,s){let n=this.rcpScaleX,o=this.rcpScaleY,a=Math.ceil(n/2),l=Math.ceil(o/2),h=t.imageData.data,c=t.ctx.createImageData(r,s),u=c.data;for(let t=0;t<s;t++)for(let i=0;i<r;i++){let s,c=4*(i+t*r),d=0,g=0,f=0,p=0,m=0,y=0,b=(t+.5)*o;for(let r=Math.floor(t*o);r<(t+1)*o;r++){let t=Math.abs(b-(r+.5))/l,o=(i+.5)*n,c=t*t;for(let t=Math.floor(i*n);t<(i+1)*n;t++){let i=Math.abs(o-(t+.5))/a,n=Math.sqrt(c+i*i);n>1&&n<-1||(s=2*n*n*n-3*n*n+1,s>0&&(i=4*(t+r*e),y+=s*h[i+3],g+=s,h[i+3]<255&&(s=s*h[i+3]/250),f+=s*h[i],p+=s*h[i+1],m+=s*h[i+2],d+=s))}}u[c]=f/d,u[c+1]=p/d,u[c+2]=m/d,u[c+3]=y/g}return c}};p(tl,"type","Resize"),p(tl,"defaults",{resizeType:"hermite",scaleX:1,scaleY:1,lanczosLobes:3}),p(tl,"uniformLocations",["uDelta","uTaps"]),at.setClass(tl);var el=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uSaturation;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float rgMax = max(color.r, color.g);\n    float rgbMax = max(rgMax, color.b);\n    color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n    color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n    color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=-this.saturation;for(let i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2],o=Math.max(r,s,n);t[i]+=o===r?0:(o-r)*e,t[i+1]+=o===s?0:(o-s)*e,t[i+2]+=o===n?0:(o-n)*e}}sendUniformData(t,e){t.uniform1f(e.uSaturation,-this.saturation)}isNeutralState(){return 0===this.saturation}};p(el,"type","Saturation"),p(el,"defaults",{saturation:0}),p(el,"uniformLocations",["uSaturation"]),at.setClass(el);var il=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uVibrance;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float max = max(color.r, max(color.g, color.b));\n    float avg = (color.r + color.g + color.b) / 3.0;\n    float amt = (abs(max - avg) * 2.0) * uVibrance;\n    color.r += max != color.r ? (max - color.r) * amt : 0.00;\n    color.g += max != color.g ? (max - color.g) * amt : 0.00;\n    color.b += max != color.b ? (max - color.b) * amt : 0.00;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=-this.vibrance;for(let i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2],o=Math.max(r,s,n),a=(r+s+n)/3,l=2*Math.abs(o-a)/255*e;t[i]+=o===r?0:(o-r)*l,t[i+1]+=o===s?0:(o-s)*l,t[i+2]+=o===n?0:(o-n)*l}}sendUniformData(t,e){t.uniform1f(e.uVibrance,-this.vibrance)}isNeutralState(){return 0===this.vibrance}};function rl(t,e){const i=document.createElement("canvas");return i.width=t,i.height=e,i}function sl(t){const e=t.getContext("2d");if(!e)throw new Error("The browser gave no 2D canvas.");return e}function nl(t){const e=new Map;return t.forEach(t=>{e.has(t.family)||e.set(t.family,{family:t.family,label:t.label||t.family})}),[...e.values()]}p(il,"type","Vibrance"),p(il,"defaults",{vibrance:0}),p(il,"uniformLocations",["uVibrance"]),at.setClass(il),d({BaseFilter:()=>wa,BlackWhite:()=>$a,BlendColor:()=>Ta,BlendImage:()=>ka,Blur:()=>Da,Brightness:()=>Ma,Brownie:()=>Aa,ColorMatrix:()=>Ea,Composed:()=>Xa,Contrast:()=>Ya,Convolute:()=>Na,Gamma:()=>za,Grayscale:()=>Ga,HueRotation:()=>qa,Invert:()=>Ka,Kodachrome:()=>La,Noise:()=>Ja,Pixelate:()=>Qa,Polaroid:()=>Ra,RemoveColor:()=>Za,Resize:()=>tl,Saturation:()=>el,Sepia:()=>Ba,Technicolor:()=>Ia,Vibrance:()=>il,Vintage:()=>Fa});const ol={woff2:"woff2",woff:"woff",ttf:"truetype",otf:"opentype"},al=t=>`"PrintBlob ${t}"`,ll=new Map;async function hl(t){const e=[...new Set(t.filter(t=>ll.has(t)))];await Promise.all(e.flatMap(t=>(ll.get(t)??[]).map(t=>t.load()))),await Promise.all(e.flatMap(t=>[document.fonts.load(`400 40px ${al(t)}`,"Aа"),document.fonts.load(`700 40px ${al(t)}`,"Aа")]))}function cl(t){const e=new Set,i=t=>{if(t&&"string"==typeof t.fontFamily){const i=t.fontFamily.match(/^"PrintBlob (.+)"$/);i?.[1]&&e.add(i[1])}(t?.objects??[]).forEach(i)};return Object.values(t??{}).forEach(i),[...e]}const ul="#1A1D22",dl="#FFFFFF",gl="#2645D6",fl=[{name:(0,e.__)("Black","printblob"),hex:ul},{name:(0,e.__)("White","printblob"),hex:dl},{name:(0,e.__)("Cobalt","printblob"),hex:gl},{name:(0,e.__)("Red","printblob"),hex:"#D7263D"},{name:(0,e.__)("Yellow","printblob"),hex:"#F4C20D"},{name:(0,e.__)("Green","printblob"),hex:"#1F8A4C"}],pl=t=>({"--printblob-swatch":t}),ml=JSON.parse('{"Ee":1000,"uQ":300,"LH":{"area":{"x":0.3,"y":0.3,"w":0.4,"h":0.4},"print_cm":{"w":28,"h":36}}}');ml.Ee;const yl=ml.uQ;ml.LH;const bl=["printblobKind","printblobAutoInk","printblobVector"];function _l(t){return new Qs({left:t.left+t.width/2,top:t.top+t.height/2,width:t.width,height:t.height,absolutePositioned:!0})}function vl(t){return{x:t.left+t.width/2,y:t.top+t.height/2}}async function xl(t,e,i,{vector:r=!1}={}){const s=await ba.fromURL(e),n=Math.min(.8*i.width/s.width,.8*i.height/s.height),o=vl(i);return s.set({left:o.x,top:o.y,scaleX:n,scaleY:n,printblobKind:"image",printblobVector:r}),t.add(s),t.setActiveObject(s),t.requestRenderAll(),s}function Cl(t,e,i,{family:r="Onest",color:s=ul}={}){const n=vl(i),o=new la(e,{left:n.x,top:n.y,width:.9*i.width,fontSize:56,lineHeight:1.1,fontFamily:al(r),fontWeight:700,fill:s,textAlign:"center",printblobKind:"text",printblobAutoInk:!0});return t.add(o),t.setActiveObject(o),t.requestRenderAll(),o}function wl(t){return"text"===t.printblobKind&&t instanceof la}function Sl(t,e){t.setActiveObject(e),e.enterEditing(),e.selectAll(),t.requestRenderAll()}function Tl(t,e){t.remove(e),t.discardActiveObject(),t.requestRenderAll()}function Ol(t){return t.toObject(bl)}function kl(t){return Boolean(t?.objects?.length)}async function Dl(t,e,i){t.discardActiveObject(),t.clear(),t.getWidth()===i.stage.width&&t.getHeight()===i.stage.height||t.setDimensions({width:i.stage.width,height:i.stage.height},{backstoreOnly:!0}),e&&await t.loadFromJSON(e),t.clipPath=_l(i.area),t.requestRenderAll()}function Ml(t,e){return t?{...t,objects:t.objects.map(t=>t.printblobAutoInk?{...t,fill:e}:t)}:t}function jl(t,e){if("image"!==t?.printblobKind||t.printblobVector)return null;const i=t.getScaledWidth()/e.area.width*e.printCm.width;return Math.round(t.width/(i/2.54))}Object.assign(ps.ownDefaults,{cornerColor:gl,cornerStrokeColor:"#FFFFFF",borderColor:gl,cornerStyle:"circle",cornerSize:22,touchCornerSize:36,transparentCorners:!1,borderScaleFactor:2,padding:6});const El=t=>("Image"===t.type||"image"===t.printblobKind)&&Boolean(t.src?.startsWith("data:"));function Pl(t){const e=t=>t?{...t,objects:t.objects.map(t=>El(t)?{...t,src:""}:t)}:null;return Object.fromEntries(Object.entries(t).map(([t,i])=>[t,e(i)]))}function Al(t){const e=(t?.objects||[]).filter(El).map(t=>t.src);return[...new Set(e)]}async function Fl(t,e){const i=new _e(document.createElement("canvas"),{width:e.stage.width,height:e.stage.height,enableRetinaScaling:!1,renderOnAddRemove:!1});return await i.loadFromJSON(t),i.getObjects().forEach(t=>t.set({objectCaching:!1})),i.clipPath=_l(e.area),i.renderAll(),i}const Ll=t=>new Promise((e,i)=>t.toBlob(t=>t?e(t):i(new Error("Export failed")),"image/png")),Il=Uint32Array.from({length:256},(t,e)=>{let i=e;for(let t=0;t<8;t++)i=1&i?3988292384^i>>>1:i>>>1;return i>>>0});async function Rl(t,e){const i=new Uint8Array(await t.arrayBuffer()),r=Math.round(e/.0254),s=new Uint8Array(21),n=new DataView(s.buffer);return n.setUint32(0,9),s.set([112,72,89,115],4),n.setUint32(8,r),n.setUint32(12,r),s[16]=1,n.setUint32(17,function(t){let e=4294967295;for(const i of t)e=Il[255&(e^i)]^e>>>8;return(4294967295^e)>>>0}(s.subarray(4,17))),new Blob([i.subarray(0,33),s,i.subarray(33)],{type:"image/png"})}function Bl(t,e,i,r){const s=t.toCanvasElement(i/e.area.width,{left:e.area.left,top:e.area.top,width:e.area.width,height:e.area.height}),n=rl(i,r);return sl(n).drawImage(s,0,0,i,r),n}async function $l(t,e,i){const r=Math.round(i*e.area.height/e.area.width);if(!t||!kl(t))return rl(i,r);const s=await Fl(t,e),n=Bl(s,e,i,r);return s.dispose(),n}async function Xl(t,e,i){const r=await Fl(t,e),s=Bl(r,e,e.printPx.width,e.printPx.height),n=rl(.8*e.stage.width,.8*e.stage.height),o=sl(n);return o.drawImage(i,0,0,n.width,n.height),o.drawImage(r.toCanvasElement(.8),0,0),r.dispose(),{print:await Rl(await Ll(s),yl),preview:await Ll(n)}}const Yl=(t,e)=>e?`${t} is-shown`:t;function Wl({selected:t,items:i,tool:r,printFonts:s,dpi:n,onChoose:a,onDone:l,onChange:h,onCentre:c,onLayer:u,onRemove:d}){const g=t&&wl(t)?t:null,f="image"===t?.printblobKind?t:null,p=(0,o.jsxs)("div",{className:"printblob-designer__row printblob-designer__row--actions",children:[(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:c,children:(0,e.__)("Centre","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:()=>u("up"),children:(0,e.__)("Bring forward","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:()=>u("down"),children:(0,e.__)("Send back","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button printblob-link-button--danger",onClick:d,children:(0,e.__)("Remove","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:l,children:/* translators: closes the controls of the chosen image or text, back to the list of what is on the side. */ /* translators: closes the controls of the chosen image or text, back to the list of what is on the side. */
     4(0,e.__)("Not printed","printblob")})]})]},t.key)),(0,o.jsxs)("div",{className:"printblob-breakdown__total",children:[(0,o.jsx)("dt",{children:(0,e.__)("Total","printblob")}),(0,o.jsx)("dd",{children:i(g*t,h)})]})]}),(0,o.jsx)("button",{type:"button",className:"printblob-button printblob-button--primary",onClick:b,disabled:p,children:(0,o.jsx)("span",{className:"printblob-stack",children:[(0,e.__)("Add to cart","printblob"),...n()].map(t=>(0,o.jsx)("span",{className:a(t===_),children:t},t))})}),(0,o.jsxs)("div",{className:"printblob-designer__messages printblob-stack",children:[(0,o.jsxs)("p",{className:"printblob-note printblob-note--ok","aria-hidden":"true",children:[x," ",v]}),[...Object.values(C),s(y)].map(t=>(0,o.jsx)("p",{className:"printblob-note printblob-note--error","aria-hidden":"true",children:t},t)),(0,o.jsxs)("div",{className:"printblob-stack__fill is-shown",children:[(0,o.jsx)("div",{className:"printblob-designer__status",role:"status","aria-live":"polite",children:"added"===f.state&&(0,o.jsxs)("p",{className:"printblob-note printblob-note--ok",children:[f.message," ",(0,o.jsx)("a",{href:m,children:v})]})}),"error"===f.state&&(0,o.jsx)("p",{className:"printblob-note printblob-note--error",role:"alert",children:f.message})]})]})]})}function h({names:t,chosen:e}){return(0,o.jsx)("span",{className:"printblob-designer__choice printblob-stack",children:t.map(t=>(0,o.jsx)("span",{className:t===e?"is-shown":void 0,children:t},t))})}function c({label:t,chosen:e,choices:i}){return(0,o.jsxs)("fieldset",{className:"printblob-designer__section",children:[(0,o.jsxs)("legend",{children:[t,void 0!==e&&(0,o.jsx)(h,{names:i.map(t=>t.name),chosen:e})]}),(0,o.jsx)("div",{className:"printblob-sizes",children:i.map(t=>(0,o.jsx)("button",{type:"button",className:"printblob-size","aria-pressed":t.pressed,onClick:t.onSelect,disabled:t.disabled,children:t.name},t.key))})]})}var u=Object.defineProperty,d=(t,e)=>{let i={};for(var r in t)u(i,r,{get:t[r],enumerable:!0});return e||u(i,Symbol.toStringTag,{value:"Module"}),i};function g(t){return g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},g(t)}function f(t){var e=function(t){if("object"!=g(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,"string");if("object"!=g(i))return i;throw TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==g(e)?e:e+""}function p(t,e,i){return(e=f(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}var m=class{constructor(){p(this,"browserShadowBlurConstant",1),p(this,"DPI",96),p(this,"devicePixelRatio",typeof window<"u"?window.devicePixelRatio:1),p(this,"perfLimitSizeTotal",2097152),p(this,"maxCacheSideLimit",4096),p(this,"minCacheSideLimit",256),p(this,"disableStyleCopyPaste",!1),p(this,"enableGLFiltering",!0),p(this,"textureSize",4096),p(this,"forceGLPutImageData",!1),p(this,"cachesBoundsOfCurve",!1),p(this,"fontPaths",{}),p(this,"NUM_FRACTION_DIGITS",4)}};const y=new class extends m{constructor(t){super(),this.configure(t)}configure(t={}){Object.assign(this,t)}addFonts(t={}){this.fontPaths={...this.fontPaths,...t}}removeFonts(t=[]){t.forEach(t=>{delete this.fontPaths[t]})}clearFonts(){this.fontPaths={}}restoreDefaults(t){let e=new m,i=(null==t?void 0:t.reduce((t,i)=>(t[i]=e[i],t),{}))||e;this.configure(i)}},b=(t,...e)=>console[t]("fabric",...e);var _=class extends Error{constructor(t,e){super(`fabric: ${t}`,e)}},v=class extends _{constructor(t){super(`${t} 'options.signal' is in 'aborted' state`)}},x=class{},C=class extends x{testPrecision(t,e){let i=`precision ${e} float;\nvoid main(){}`,r=t.createShader(t.FRAGMENT_SHADER);return!!r&&(t.shaderSource(r,i),t.compileShader(r),!!t.getShaderParameter(r,t.COMPILE_STATUS))}queryWebGL(t){let e=t.getContext("webgl");e&&(this.maxTextureSize=e.getParameter(e.MAX_TEXTURE_SIZE),this.GLPrecision=["highp","mediump","lowp"].find(t=>this.testPrecision(e,t)),e.getExtension("WEBGL_lose_context").loseContext(),b("log",`WebGL: max texture size ${this.maxTextureSize}`))}isSupported(t){return!!this.maxTextureSize&&this.maxTextureSize>=t}};const w={};let S;const T=()=>S||(S={document,window,isTouchSupported:"ontouchstart"in window||"ontouchstart"in document||window&&window.navigator&&window.navigator.maxTouchPoints>0,WebGLProbe:new C,dispose(){},copyPasteData:w}),O=()=>T().document,k=()=>T().window,D=()=>{var t;return Math.max(null==(t=y.devicePixelRatio)?k().devicePixelRatio:t,1)},M=new class{constructor(){p(this,"boundsOfCurveCache",{}),this.charWidthsCache=new Map}getFontCache({fontFamily:t,fontStyle:e,fontWeight:i}){t=t.toLowerCase();let r=this.charWidthsCache;r.has(t)||r.set(t,new Map);let s=r.get(t),n=`${e.toLowerCase()}_${(i+"").toLowerCase()}`;return s.has(n)||s.set(n,new Map),s.get(n)}clearFontCache(t){t?this.charWidthsCache.delete((t||"").toLowerCase()):this.charWidthsCache=new Map}limitDimsByArea(t){let{perfLimitSizeTotal:e}=y,i=Math.sqrt(e*t);return[Math.floor(i),Math.floor(e/i)]}},j="7.4.0";function E(){}const P=Math.PI/2,A=Math.PI/4,F=2*Math.PI,L=Math.PI/180,I=Object.freeze([1,0,0,1,0,0]),R="center",B="left",$="bottom",X="right",Y="none",W=/\r?\n/,N="moving",V="scaling",z="rotating",H="rotate",G="skewing",U="resizing",q="modifyPoly",K="changed",J="scale",Q="scaleX",Z="scaleY",tt="skewX",et="skewY",it="fill",rt="stroke",st="modified",nt="normal",ot="json",at=new class{constructor(){this[ot]=new Map,this.svg=new Map}has(t){return this[ot].has(t)}getClass(t){let e=this[ot].get(t);if(!e)throw new _(`No class registered for ${t}`);return e}setClass(t,e){e?this[ot].set(e,t):(this[ot].set(t.type,t),this[ot].set(t.type.toLowerCase(),t))}getSVGClass(t){return this.svg.get(t)}setSVGClass(t,e){this.svg.set(e??t.type.toLowerCase(),t)}},lt=new class extends Array{remove(t){let e=this.indexOf(t);e>-1&&this.splice(e,1)}cancelAll(){let t=this.splice(0);return t.forEach(t=>t.abort()),t}cancelByCanvas(t){if(!t)return[];let e=this.filter(e=>{var i;return e.target===t||"object"==typeof e.target&&(null==(i=e.target)?void 0:i.canvas)===t});return e.forEach(t=>t.abort()),e}cancelByTarget(t){if(!t)return[];let e=this.filter(e=>e.target===t);return e.forEach(t=>t.abort()),e}};var ht=class{constructor(){p(this,"__eventListeners",{})}on(t,e){if(this.__eventListeners||(this.__eventListeners={}),"object"==typeof t)return Object.entries(t).forEach(([t,e])=>{this.on(t,e)}),()=>this.off(t);if(e){let i=t;return this.__eventListeners[i]||(this.__eventListeners[i]=[]),this.__eventListeners[i].push(e),()=>this.off(i,e)}return()=>!1}once(t,e){if("object"==typeof t){let e=[];return Object.entries(t).forEach(([t,i])=>{e.push(this.once(t,i))}),()=>e.forEach(t=>t())}if(e){let i=this.on(t,function(...t){e.call(this,...t),i()});return i}return()=>!1}_removeEventListener(t,e){if(this.__eventListeners[t])if(e){let i=this.__eventListeners[t],r=i.indexOf(e);r>-1&&i.splice(r,1)}else this.__eventListeners[t]=[]}off(t,e){if(this.__eventListeners)if(void 0===t)for(let t in this.__eventListeners)this._removeEventListener(t);else"object"==typeof t?Object.entries(t).forEach(([t,e])=>{this._removeEventListener(t,e)}):this._removeEventListener(t,e)}fire(t,e){var i;if(!this.__eventListeners)return;let r=null==(i=this.__eventListeners[t])?void 0:i.concat();if(r)for(let t=0;t<r.length;t++)r[t].call(this,e||{})}};const ct=(t,e)=>{let i=t.indexOf(e);return-1!==i&&t.splice(i,1),t},ut=t=>{if(0===t)return 1;switch(Math.abs(t)/P){case 1:case 3:return 0;case 2:return-1}return Math.cos(t)},dt=t=>{if(0===t)return 0;let e=t/P,i=Math.sign(t);switch(e){case 1:return i;case 2:return 0;case 3:return-i}return Math.sin(t)};var gt=class t{constructor(t=0,e=0){"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e)}add(e){return new t(this.x+e.x,this.y+e.y)}addEquals(t){return this.x+=t.x,this.y+=t.y,this}scalarAdd(e){return new t(this.x+e,this.y+e)}scalarAddEquals(t){return this.x+=t,this.y+=t,this}subtract(e){return new t(this.x-e.x,this.y-e.y)}subtractEquals(t){return this.x-=t.x,this.y-=t.y,this}scalarSubtract(e){return new t(this.x-e,this.y-e)}scalarSubtractEquals(t){return this.x-=t,this.y-=t,this}multiply(e){return new t(this.x*e.x,this.y*e.y)}scalarMultiply(e){return new t(this.x*e,this.y*e)}scalarMultiplyEquals(t){return this.x*=t,this.y*=t,this}divide(e){return new t(this.x/e.x,this.y/e.y)}scalarDivide(e){return new t(this.x/e,this.y/e)}scalarDivideEquals(t){return this.x/=t,this.y/=t,this}eq(t){return this.x===t.x&&this.y===t.y}lt(t){return this.x<t.x&&this.y<t.y}lte(t){return this.x<=t.x&&this.y<=t.y}gt(t){return this.x>t.x&&this.y>t.y}gte(t){return this.x>=t.x&&this.y>=t.y}lerp(e,i=.5){return i=Math.max(Math.min(1,i),0),new t(this.x+(e.x-this.x)*i,this.y+(e.y-this.y)*i)}distanceFrom(t){let e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)}midPointFrom(t){return this.lerp(t)}min(e){return new t(Math.min(this.x,e.x),Math.min(this.y,e.y))}max(e){return new t(Math.max(this.x,e.x),Math.max(this.y,e.y))}toString(){return`${this.x},${this.y}`}setXY(t,e){return this.x=t,this.y=e,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setFromPoint(t){return this.x=t.x,this.y=t.y,this}swap(t){let e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i}clone(){return new t(this.x,this.y)}rotate(e,i=ft){let r=dt(e),s=ut(e),n=this.subtract(i);return new t(n.x*s-n.y*r,n.x*r+n.y*s).add(i)}transform(e,i=!1){return new t(e[0]*this.x+e[2]*this.y+(i?0:e[4]),e[1]*this.x+e[3]*this.y+(i?0:e[5]))}};const ft=new gt(0,0),pt=t=>!!t&&Array.isArray(t._objects);function mt(t){class e extends t{constructor(...t){super(...t),p(this,"_objects",[])}_onObjectAdded(t){}_onObjectRemoved(t){}_onStackOrderChanged(t){}add(...t){let e=this._objects.push(...t);return t.forEach(t=>this._onObjectAdded(t)),e}insertAt(t,...e){return this._objects.splice(t,0,...e),e.forEach(t=>this._onObjectAdded(t)),this._objects.length}remove(...t){let e=this._objects,i=[];return t.forEach(t=>{let r=e.indexOf(t);-1!==r&&(e.splice(r,1),i.push(t),this._onObjectRemoved(t))}),i}forEachObject(t){this.getObjects().forEach((e,i,r)=>t(e,i,r))}getObjects(...t){return 0===t.length?[...this._objects]:this._objects.filter(e=>e.isType(...t))}item(t){return this._objects[t]}isEmpty(){return 0===this._objects.length}size(){return this._objects.length}contains(t,i){return!!this._objects.includes(t)||!!i&&this._objects.some(i=>i instanceof e&&i.contains(t,!0))}complexity(){return this._objects.reduce((t,e)=>t+(e.complexity?e.complexity():0),0)}sendObjectToBack(t){return!(!t||t===this._objects[0]||(ct(this._objects,t),this._objects.unshift(t),this._onStackOrderChanged(t),0))}bringObjectToFront(t){return!(!t||t===this._objects[this._objects.length-1]||(ct(this._objects,t),this._objects.push(t),this._onStackOrderChanged(t),0))}sendObjectBackwards(t,e){if(!t)return!1;let i=this._objects.indexOf(t);if(0!==i){let r=this.findNewLowerIndex(t,i,e);return ct(this._objects,t),this._objects.splice(r,0,t),this._onStackOrderChanged(t),!0}return!1}bringObjectForward(t,e){if(!t)return!1;let i=this._objects.indexOf(t);if(i!==this._objects.length-1){let r=this.findNewUpperIndex(t,i,e);return ct(this._objects,t),this._objects.splice(r,0,t),this._onStackOrderChanged(t),!0}return!1}moveObjectTo(t,e){return t!==this._objects[e]&&(ct(this._objects,t),this._objects.splice(e,0,t),this._onStackOrderChanged(t),!0)}findNewLowerIndex(t,e,i){let r;if(i){r=e;for(let i=e-1;i>=0;--i)if(t.isOverlapping(this._objects[i])){r=i;break}}else r=e-1;return r}findNewUpperIndex(t,e,i){let r;if(i){r=e;for(let i=e+1;i<this._objects.length;++i)if(t.isOverlapping(this._objects[i])){r=i;break}}else r=e+1;return r}collectObjects({left:t,top:e,width:i,height:r},{includeIntersecting:s=!0}={}){let n=[],o=new gt(t,e),a=o.add(new gt(i,r));for(let t=this._objects.length-1;t>=0;t--){let e=this._objects[t];e.selectable&&e.visible&&(s&&e.intersectsWithRect(o,a)||e.isContainedWithinRect(o,a)||s&&e.containsPoint(o)||s&&e.containsPoint(a))&&n.push(e)}return n}}return e}var yt=class extends ht{_setOptions(t={}){for(let e in t)this.set(e,t[e])}_setObject(t){for(let e in t)this._set(e,t[e])}set(t,e){return"object"==typeof t?this._setObject(t):this._set(t,e),this}_set(t,e){this[t]=e}toggle(t){let e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this}get(t){return this[t]}};function bt(t){return k().requestAnimationFrame(t)}function _t(t){return k().cancelAnimationFrame(t)}let vt=0;const xt=()=>vt++,Ct=()=>{let t=O().createElement("canvas");if(!t||void 0===t.getContext)throw new _("Failed to create `canvas` element");return t},wt=()=>O().createElement("img"),St=t=>{var e;let i=Tt(t);return null==(e=i.getContext("2d"))||e.drawImage(t,0,0),i},Tt=t=>{let e=Ct();return e.width=t.width,e.height=t.height,e},Ot=(t,e,i)=>t.toDataURL(`image/${e}`,i),kt=(t,e,i)=>new Promise((r,s)=>{t.toBlob(r,`image/${e}`,i)}),Dt=t=>t*L,Mt=t=>t/L,jt=t=>t.every((t,e)=>t===I[e]),Et=(t,e,i)=>new gt(t).transform(e,i),Pt=t=>{let e=1/(t[0]*t[3]-t[1]*t[2]),i=[e*t[3],-e*t[1],-e*t[2],e*t[0],0,0],{x:r,y:s}=new gt(t[4],t[5]).transform(i,!0);return i[4]=-r,i[5]=-s,i},At=(t,e,i)=>[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],i?0:t[0]*e[4]+t[2]*e[5]+t[4],i?0:t[1]*e[4]+t[3]*e[5]+t[5]],Ft=(t,e)=>t.reduceRight((t,i)=>i&&t?At(i,t,e):i||t,void 0)||I.concat(),Lt=([t,e])=>Math.atan2(e,t),It=([t,e])=>Math.sqrt(t*t+e*e),Rt=([,,t,e])=>Math.sqrt(t*t+e*e),Bt=t=>{let e=Lt(t),i=t[0]**2+t[1]**2,r=Math.sqrt(i),s=(t[0]*t[3]-t[2]*t[1])/r,n=Math.atan2(t[0]*t[2]+t[1]*t[3],i);return{angle:Mt(e),scaleX:r,scaleY:s,skewX:Mt(n),skewY:0,translateX:t[4]||0,translateY:t[5]||0}},$t=(t,e=0)=>[1,0,0,1,t,e];function Xt({angle:t=0}={},{x:e=0,y:i=0}={}){let r=Dt(t),s=ut(r),n=dt(r);return[s,n,-n,s,e?e-(s*e-n*i):0,i?i-(n*e+s*i):0]}const Yt=(t,e=t)=>[t,0,0,e,0,0],Wt=t=>Math.tan(Dt(t)),Nt=t=>[1,0,Wt(t),1,0,0],Vt=t=>[1,Wt(t),0,1,0,0],zt=({scaleX:t=1,scaleY:e=1,flipX:i=!1,flipY:r=!1,skewX:s=0,skewY:n=0})=>{let o=Yt(i?-t:t,r?-e:e);return s&&(o=At(o,Nt(s),!0)),n&&(o=At(o,Vt(n),!0)),o},Ht=t=>{let{translateX:e=0,translateY:i=0,angle:r=0}=t,s=$t(e,i);r&&(s=At(s,Xt({angle:r})));let n=zt(t);return jt(n)||(s=At(s,n)),s},Gt=(t,{signal:e,crossOrigin:i=null}={})=>new Promise(function(r,s){if(e&&e.aborted)return s(new v("loadImage"));let n,o=wt();e&&(n=function(t){o.src="",s(t)},e.addEventListener("abort",n,{once:!0}));let a=function(){o.onload=o.onerror=null,n&&(null==e||e.removeEventListener("abort",n)),r(o)};t?(o.onload=a,o.onerror=function(){n&&(null==e||e.removeEventListener("abort",n)),s(new _(`Error loading ${o.src}`))},i&&(o.crossOrigin=i),o.src=t):a()}),Ut=(t,{signal:e,reviver:i=E}={})=>new Promise((r,s)=>{let n=[];e&&e.addEventListener("abort",s,{once:!0}),Promise.allSettled(t.map(t=>at.getClass(t.type).fromObject(t,{signal:e}))).then(async e=>{for(let[r,s]of e.entries())if("fulfilled"===s.status&&(await i(t[r],s.value),n.push(s.value)),"rejected"===s.status){let e=await i(t[r],void 0,s.reason);e&&n.push(e)}r(n)}).catch(t=>{n.forEach(t=>{t.dispose&&t.dispose()}),s(t)}).finally(()=>{e&&e.removeEventListener("abort",s)})}),qt=(t,{signal:e}={})=>new Promise((i,r)=>{let s=[];e&&e.addEventListener("abort",r,{once:!0});let n=Object.values(t).map(t=>t&&t.type&&at.has(t.type)?Ut([t],{signal:e}).then(([t])=>(s.push(t),t)):t),o=Object.keys(t);Promise.all(n).then(t=>t.reduce((t,e,i)=>(t[o[i]]=e,t),{})).then(i).catch(t=>{s.forEach(t=>{t.dispose&&t.dispose()}),r(t)}).finally(()=>{e&&e.removeEventListener("abort",r)})}),Kt=(t,e=[])=>e.reduce((e,i)=>(i in t&&(e[i]=t[i]),e),{}),Jt=(t,e)=>Object.keys(t).reduce((i,r)=>(e(t[r],r,t)&&(i[r]=t[r]),i),{}),Qt=(t,e)=>parseFloat(Number(t).toFixed(e)),Zt=t=>"matrix("+t.map(t=>Qt(t,y.NUM_FRACTION_DIGITS)).join(" ")+")",te=t=>!!t&&void 0!==t.toLive,ee=t=>!!t&&"function"==typeof t.toObject,ie=t=>!!t&&void 0!==t.offsetX&&"source"in t,re=t=>!!t&&"multiSelectionStacking"in t;function se(t){let e=t&&ne(t),i=0,r=0;if(!t||!e)return{left:i,top:r};let s=t,n=e.documentElement,o=e.body||{scrollLeft:0,scrollTop:0};for(;s&&(s.parentNode||s.host)&&(s=s.parentNode||s.host,s===e?(i=o.scrollLeft||n.scrollLeft||0,r=o.scrollTop||n.scrollTop||0):(i+=s.scrollLeft||0,r+=s.scrollTop||0),1!==s.nodeType||"fixed"!==s.style.position););return{left:i,top:r}}const ne=t=>t.ownerDocument||null,oe=t=>{var e;return(null==(e=t.ownerDocument)?void 0:e.defaultView)||null},ae=(t,e,{width:i,height:r},s=1)=>{t.width=i,t.height=r,s>1&&(t.setAttribute("width",(i*s).toString()),t.setAttribute("height",(r*s).toString()),e.scale(s,s))},le=(t,{width:e,height:i})=>{e&&(t.style.width="number"==typeof e?`${e}px`:e),i&&(t.style.height="number"==typeof i?`${i}px`:i)};function he(t){return void 0!==t.onselectstart&&(t.onselectstart=()=>!1),t.style.userSelect=Y,t}var ce=class{constructor(t){p(this,"_originalCanvasStyle",void 0),p(this,"lower",void 0);let e=this.createLowerCanvas(t);this.lower={el:e,ctx:e.getContext("2d")}}createLowerCanvas(t){let e=(i=t)&&void 0!==i.getContext?t:t&&O().getElementById(t)||Ct();var i;if(e.hasAttribute("data-fabric"))throw new _("Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?");return this._originalCanvasStyle=e.style.cssText,e.setAttribute("data-fabric","main"),e.classList.add("lower-canvas"),e}cleanupDOM({width:t,height:e}){let{el:i}=this.lower;i.classList.remove("lower-canvas"),i.removeAttribute("data-fabric"),i.setAttribute("width",`${t}`),i.setAttribute("height",`${e}`),i.style.cssText=this._originalCanvasStyle||"",this._originalCanvasStyle=void 0}setDimensions(t,e){let{el:i,ctx:r}=this.lower;ae(i,r,t,e)}setCSSDimensions(t){le(this.lower.el,t)}calcOffset(){return function(t){var e;let i=t&&ne(t),r={left:0,top:0};if(!i)return r;let s=(null==(e=oe(t))?void 0:e.getComputedStyle(t,null))||{};r.left+=parseInt(s.borderLeftWidth,10)||0,r.top+=parseInt(s.borderTopWidth,10)||0,r.left+=parseInt(s.paddingLeft,10)||0,r.top+=parseInt(s.paddingTop,10)||0;let n={left:0,top:0},o=i.documentElement;void 0!==t.getBoundingClientRect&&(n=t.getBoundingClientRect());let a=se(t);return{left:n.left+a.left-(o.clientLeft||0)+r.left,top:n.top+a.top-(o.clientTop||0)+r.top}}(this.lower.el)}dispose(){T().dispose(this.lower.el),delete this.lower}};const ue={backgroundVpt:!0,backgroundColor:"",overlayVpt:!0,overlayColor:"",includeDefaultValues:!0,svgViewportTransformation:!0,renderOnAddRemove:!0,skipOffscreen:!0,enableRetinaScaling:!0,imageSmoothingEnabled:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,viewportTransform:[...I],patternQuality:"best"};var de=d({capitalize:()=>ge,escapeXml:()=>fe,graphemeSplit:()=>me});const ge=(t,e=!1)=>`${t.charAt(0).toUpperCase()}${e?t.slice(1):t.slice(1).toLowerCase()}`,fe=t=>t.toString().replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;");let pe;const me=t=>{if(pe||pe||(pe="Intl"in k()&&"Segmenter"in Intl&&new Intl.Segmenter(void 0,{granularity:"grapheme"})),pe){let e=pe.segment(t);return Array.from(e).map(({segment:t})=>t)}return ye(t)},ye=t=>{let e=[];for(let i,r=0;r<t.length;r++)!1!==(i=be(t,r))&&e.push(i);return e},be=(t,e)=>{let i=t.charCodeAt(e);if(isNaN(i))return"";if(i<55296||i>57343)return t.charAt(e);if(55296<=i&&i<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";let i=t.charCodeAt(e+1);if(56320>i||i>57343)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";let r=t.charCodeAt(e-1);if(55296>r||r>56319)throw"Low surrogate without preceding high surrogate";return!1};var _e=class t extends(mt(yt)){get lowerCanvasEl(){var t;return null==(t=this.elements.lower)?void 0:t.el}get contextContainer(){var t;return null==(t=this.elements.lower)?void 0:t.ctx}static getDefaults(){return t.ownDefaults}constructor(t,e={}){super(),Object.assign(this,this.constructor.getDefaults()),this.set(e),this.initElements(t),this._setDimensionsImpl({width:this.width||this.elements.lower.el.width||0,height:this.height||this.elements.lower.el.height||0}),this.skipControlsDrawing=!1,this.viewportTransform=[...this.viewportTransform],this.calcViewportBoundaries()}initElements(t){this.elements=new ce(t)}add(...t){let e=super.add(...t);return t.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),e}insertAt(t,...e){let i=super.insertAt(t,...e);return e.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),i}remove(...t){let e=super.remove(...t);return e.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),e}_onObjectAdded(t){t.canvas&&t.canvas!==this&&(b("warn","Canvas is trying to add an object that belongs to a different canvas.\nResulting to default behavior: removing object from previous canvas and adding to new canvas"),t.canvas.remove(t)),t._set("canvas",this),t.setCoords(),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t){t._set("canvas",void 0),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onStackOrderChanged(){this.renderOnAddRemove&&this.requestRenderAll()}getRetinaScaling(){return this.enableRetinaScaling?D():1}calcOffset(){return this._offset=this.elements.calcOffset()}getWidth(){return this.width}getHeight(){return this.height}_setDimensionsImpl(t,{cssOnly:e=!1,backstoreOnly:i=!1}={}){if(!e){let e={width:this.width,height:this.height,...t};this.elements.setDimensions(e,this.getRetinaScaling()),this.hasLostContext=!0,this.width=e.width,this.height=e.height}i||this.elements.setCSSDimensions(t),this.calcOffset()}setDimensions(t,e){this._setDimensionsImpl(t,e),e&&e.cssOnly||this.requestRenderAll()}getZoom(){return It(this.viewportTransform)}setViewportTransform(t){this.viewportTransform=t,this.calcViewportBoundaries(),this.renderOnAddRemove&&this.requestRenderAll()}zoomToPoint(t,e){let i=t,r=[...this.viewportTransform],s=Et(t,Pt(r));r[0]=e,r[3]=e;let n=Et(s,r);r[4]+=i.x-n.x,r[5]+=i.y-n.y,this.setViewportTransform(r)}setZoom(t){this.zoomToPoint(new gt(0,0),t)}absolutePan(t){let e=[...this.viewportTransform];return e[4]=-t.x,e[5]=-t.y,this.setViewportTransform(e)}relativePan(t){return this.absolutePan(new gt(-t.x-this.viewportTransform[4],-t.y-this.viewportTransform[5]))}getElement(){return this.elements.lower.el}clearContext(t){t.clearRect(0,0,this.width,this.height)}getContext(){return this.elements.lower.ctx}clear(){this.remove(...this.getObjects()),this.backgroundImage=void 0,this.overlayImage=void 0,this.backgroundColor="",this.overlayColor="",this.clearContext(this.getContext()),this.fire("canvas:cleared"),this.renderOnAddRemove&&this.requestRenderAll()}renderAll(){this.cancelRequestedRender(),this.destroyed||this.renderCanvas(this.getContext(),this._objects)}renderAndReset(){this.nextRenderHandle=0,this.renderAll()}requestRenderAll(){this.nextRenderHandle||this.disposed||this.destroyed||(this.nextRenderHandle=bt(()=>this.renderAndReset()))}calcViewportBoundaries(){let t=this.width,e=this.height,i=Pt(this.viewportTransform),r=Et({x:0,y:0},i),s=Et({x:t,y:e},i),n=r.min(s),o=r.max(s);return this.vptCoords={tl:n,tr:new gt(o.x,n.y),bl:new gt(n.x,o.y),br:o}}cancelRequestedRender(){this.nextRenderHandle&&(_t(this.nextRenderHandle),this.nextRenderHandle=0)}drawControls(t){}renderCanvas(t,e){if(this.destroyed)return;let i=this.viewportTransform,r=this.clipPath;this.calcViewportBoundaries(),this.clearContext(t),t.imageSmoothingEnabled=this.imageSmoothingEnabled,t.patternQuality=this.patternQuality,this.fire("before:render",{ctx:t}),this._renderBackground(t),t.save(),t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this._renderObjects(t,e),t.restore(),this.controlsAboveOverlay||this.skipControlsDrawing||this.drawControls(t),r&&(r._set("canvas",this),r.shouldCache(),r._transformDone=!0,r.renderCache({forClipping:!0}),this.drawClipPathOnCanvas(t,r)),this._renderOverlay(t),this.controlsAboveOverlay&&!this.skipControlsDrawing&&this.drawControls(t),this.fire("after:render",{ctx:t}),this.__cleanupTask&&(this.__cleanupTask(),this.__cleanupTask=void 0)}drawClipPathOnCanvas(t,e){let i=this.viewportTransform;t.save(),t.transform(...i),t.globalCompositeOperation="destination-in",e.transform(t),t.scale(1/e.zoomX,1/e.zoomY),t.drawImage(e._cacheCanvas,-e.cacheTranslationX,-e.cacheTranslationY),t.restore()}_renderObjects(t,e){for(let i=0,r=e.length;i<r;++i)e[i]&&e[i].render(t)}_renderBackgroundOrOverlay(t,e){let i=this[`${e}Color`],r=this[`${e}Image`],s=this.viewportTransform,n=this[`${e}Vpt`];if(!i&&!r)return;let o=te(i);if(i){if(t.save(),t.beginPath(),t.moveTo(0,0),t.lineTo(this.width,0),t.lineTo(this.width,this.height),t.lineTo(0,this.height),t.closePath(),t.fillStyle=o?i.toLive(t):i,n&&t.transform(...s),o){t.transform(1,0,0,1,i.offsetX||0,i.offsetY||0);let e=i.gradientTransform||i.patternTransform;e&&t.transform(...e)}t.fill(),t.restore()}if(r){t.save();let{skipOffscreen:e}=this;this.skipOffscreen=n,n&&t.transform(...s),r.render(t),this.skipOffscreen=e,t.restore()}}_renderBackground(t){this._renderBackgroundOrOverlay(t,"background")}_renderOverlay(t){this._renderBackgroundOrOverlay(t,"overlay")}getCenterPoint(){return new gt(this.width/2,this.height/2)}centerObjectH(t){return this._centerObject(t,new gt(this.getCenterPoint().x,t.getCenterPoint().y))}centerObjectV(t){return this._centerObject(t,new gt(t.getCenterPoint().x,this.getCenterPoint().y))}centerObject(t){return this._centerObject(t,this.getCenterPoint())}viewportCenterObject(t){return this._centerObject(t,this.getVpCenter())}viewportCenterObjectH(t){return this._centerObject(t,new gt(this.getVpCenter().x,t.getCenterPoint().y))}viewportCenterObjectV(t){return this._centerObject(t,new gt(t.getCenterPoint().x,this.getVpCenter().y))}getVpCenter(){return Et(this.getCenterPoint(),Pt(this.viewportTransform))}_centerObject(t,e){t.setXY(e,R,R),t.setCoords(),this.renderOnAddRemove&&this.requestRenderAll()}toDatalessJSON(t){return this.toDatalessObject(t)}toObject(t){return this._toObjectMethod("toObject",t)}toJSON(){return this.toObject()}toDatalessObject(t){return this._toObjectMethod("toDatalessObject",t)}_toObjectMethod(t,e){let i=this.clipPath,r=i&&!i.excludeFromExport?this._toObject(i,t,e):null;return{version:j,...Kt(this,e),objects:this._objects.filter(t=>!t.excludeFromExport).map(i=>this._toObject(i,t,e)),...this.__serializeBgOverlay(t,e),...r?{clipPath:r}:null}}_toObject(t,e,i){let r;this.includeDefaultValues||(r=t.includeDefaultValues,t.includeDefaultValues=!1);let s=t[e](i);return this.includeDefaultValues||(t.includeDefaultValues=!!r),s}__serializeBgOverlay(t,e){let i={},r=this.backgroundImage,s=this.overlayImage,n=this.backgroundColor,o=this.overlayColor;return te(n)?n.excludeFromExport||(i.background=n.toObject(e)):n&&(i.background=n),te(o)?o.excludeFromExport||(i.overlay=o.toObject(e)):o&&(i.overlay=o),r&&!r.excludeFromExport&&(i.backgroundImage=this._toObject(r,t,e)),s&&!s.excludeFromExport&&(i.overlayImage=this._toObject(s,t,e)),i}toSVG(t={},e){t.reviver=e;let i=[];var r;return this._setSVGPreamble(i,t),this._setSVGHeader(i,t),this.clipPath&&i.push(`<g clip-path="url(#${fe(null==(r=this.clipPath.clipPathId)?"":r)})" >\n`),this._setSVGBgOverlayColor(i,"background"),this._setSVGBgOverlayImage(i,"backgroundImage",e),this._setSVGObjects(i,e),this.clipPath&&i.push("</g>\n"),this._setSVGBgOverlayColor(i,"overlay"),this._setSVGBgOverlayImage(i,"overlayImage",e),i.push("</svg>"),i.join("")}_setSVGPreamble(t,e){e.suppressPreamble||t.push('<?xml version="1.0" encoding="',e.encoding||"UTF-8",'" standalone="no" ?>\n','<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" ','"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n')}_setSVGHeader(t,e){let i,r=e.width||`${this.width}`,s=e.height||`${this.height}`,n=y.NUM_FRACTION_DIGITS,o=e.viewBox;if(o)i=`viewBox="${o.x} ${o.y} ${o.width} ${o.height}" `;else if(this.svgViewportTransformation){let t=this.viewportTransform;i=`viewBox="${Qt(-t[4]/t[0],n)} ${Qt(-t[5]/t[3],n)} ${Qt(this.width/t[0],n)} ${Qt(this.height/t[3],n)}" `}else i=`viewBox="0 0 ${this.width} ${this.height}" `;t.push("<svg ",'xmlns="http://www.w3.org/2000/svg" ','xmlns:xlink="http://www.w3.org/1999/xlink" ','version="1.1" ','width="',r,'" ','height="',s,'" ',i,'xml:space="preserve">\n',"<desc>Created with Fabric.js ",j,"</desc>\n","<defs>\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"</defs>\n")}createSVGClipPathMarkup(t){let e=this.clipPath;return e?(e.clipPathId=`CLIPPATH_${xt()}`,`<clipPath id="${e.clipPathId}" >\n${e.toClipPathSVG(t.reviver)}</clipPath>\n`):""}createSVGRefElementsMarkup(){return["background","overlay"].map(t=>{let e=this[`${t}Color`];if(te(e)){let i=this[`${t}Vpt`],r=this.viewportTransform,s={isType:()=>!1,width:this.width/(i?r[0]:1),height:this.height/(i?r[3]:1)};return e.toSVG(s,{additionalTransform:i?Zt(r):""})}}).join("")}createSVGFontFacesMarkup(){let t=[],e={},i=y.fontPaths;this._objects.forEach(function e(i){t.push(i),pt(i)&&i._objects.forEach(e)}),t.forEach(t=>{if(!(r=t)||"function"!=typeof r._renderText)return;var r;let{styles:s,fontFamily:n}=t;!e[n]&&i[n]&&(e[n]=!0,s&&Object.values(s).forEach(t=>{Object.values(t).forEach(({fontFamily:t=""})=>{!e[t]&&i[t]&&(e[t]=!0)})}))});let r=Object.keys(e).map(t=>`\t\t@font-face {\n\t\t\tfont-family: '${t}';\n\t\t\tsrc: url('${i[t]}');\n\t\t}\n`).join("");return r?`\t<style type="text/css"><![CDATA[\n${r}]]></style>\n`:""}_setSVGObjects(t,e){this.forEachObject(i=>{i.excludeFromExport||this._setSVGObject(t,i,e)})}_setSVGObject(t,e,i){t.push(e.toSVG(i))}_setSVGBgOverlayImage(t,e,i){let r=this[e];r&&!r.excludeFromExport&&r.toSVG&&t.push(r.toSVG(i))}_setSVGBgOverlayColor(t,e){let i=this[`${e}Color`];if(i)if(te(i)){let r=i.repeat||"",s=this.width,n=this.height,o=this[`${e}Vpt`]?Zt(Pt(this.viewportTransform)):"";t.push(`<rect transform="${o} translate(${s/2},${n/2})" x="${i.offsetX-s/2}" y="${i.offsetY-n/2}" width="${"repeat-y"!==r&&"no-repeat"!==r||!ie(i)?s:i.source.width}" height="${"repeat-x"!==r&&"no-repeat"!==r||!ie(i)?n:i.source.height}" fill="url(#SVGID_${i.id})"></rect>\n`)}else t.push('<rect x="0" y="0" width="100%" height="100%" ','fill="',i,'"',"></rect>\n")}loadFromJSON(t,e,{signal:i}={}){if(!t)return Promise.reject(new _("`json` is undefined"));let{objects:r=[],...s}="string"==typeof t?JSON.parse(t):t,{backgroundImage:n,background:o,overlayImage:a,overlay:l,clipPath:h}=s,c=this.renderOnAddRemove;return this.renderOnAddRemove=!1,Promise.all([Ut(r,{reviver:e,signal:i}),qt({backgroundImage:n,backgroundColor:o,overlayImage:a,overlayColor:l,clipPath:h},{signal:i})]).then(([t,e])=>(this.clear(),this.add(...t),this.set(s),this.set(e),this.renderOnAddRemove=c,this))}clone(t){let e=this.toObject(t);return this.cloneWithoutData().loadFromJSON(e)}cloneWithoutData(){let t=Tt(this);return new this.constructor(t)}toDataURL(t={}){let{format:e="png",quality:i=1,multiplier:r=1,enableRetinaScaling:s=!1}=t,n=r*(s?this.getRetinaScaling():1);return Ot(this.toCanvasElement(n,t),e,i)}toBlob(t={}){let{format:e="png",quality:i=1,multiplier:r=1,enableRetinaScaling:s=!1}=t,n=r*(s?this.getRetinaScaling():1);return kt(this.toCanvasElement(n,t),e,i)}toCanvasElement(t=1,{width:e,height:i,left:r,top:s,filter:n}={}){let o=(e||this.width)*t,a=(i||this.height)*t,l=this.getZoom(),h=this.width,c=this.height,u=this.skipControlsDrawing,d=l*t,g=this.viewportTransform,f=[d,0,0,d,(g[4]-(r||0))*t,(g[5]-(s||0))*t],p=this.enableRetinaScaling,m=Tt({width:o,height:a}),y=n?this._objects.filter(t=>n(t)):this._objects;return this.enableRetinaScaling=!1,this.viewportTransform=f,this.width=o,this.height=a,this.skipControlsDrawing=!0,this.calcViewportBoundaries(),this.renderCanvas(m.getContext("2d"),y),this.viewportTransform=g,this.width=h,this.height=c,this.calcViewportBoundaries(),this.enableRetinaScaling=p,this.skipControlsDrawing=u,m}dispose(){return!this.disposed&&this.elements.cleanupDOM({width:this.width,height:this.height}),lt.cancelByCanvas(this),this.disposed=!0,new Promise((t,e)=>{let i=()=>{this.destroy(),t(!0)};i.kill=e,this.__cleanupTask&&this.__cleanupTask.kill("aborted"),this.destroyed?t(!1):this.nextRenderHandle?this.__cleanupTask=i:i()})}destroy(){this.destroyed=!0,this.cancelRequestedRender(),this.forEachObject(t=>t.dispose()),this._objects=[],this.backgroundImage&&this.backgroundImage.dispose(),this.backgroundImage=void 0,this.overlayImage&&this.overlayImage.dispose(),this.overlayImage=void 0,this.elements.dispose()}toString(){return`#<Canvas (${this.complexity()}): { objects: ${this._objects.length} }>`}};p(_e,"ownDefaults",ue);const ve=["touchstart","touchmove","touchend"],xe=t=>{let e=se(t.target),i=function(t){let e=t.changedTouches;return e&&e[0]?e[0]:t}(t);return new gt(i.clientX+e.left,i.clientY+e.top)},Ce=t=>ve.includes(t.type)||"touch"===t.pointerType,we=t=>{t.preventDefault(),t.stopPropagation()},Se=t=>{let e=0,i=0,r=0,s=0;for(let n=0,o=t.length;n<o;n++){let{x:o,y:a}=t[n];(o>r||!n)&&(r=o),(o<e||!n)&&(e=o),(a>s||!n)&&(s=a),(a<i||!n)&&(i=a)}return{left:e,top:i,width:r-e,height:s-i}},Te=(t,e)=>{ke(t,At(Pt(e),t.calcOwnMatrix()))},Oe=(t,e)=>ke(t,At(e,t.calcOwnMatrix())),ke=(t,e)=>{let{translateX:i,translateY:r,scaleX:s,scaleY:n,...o}=Bt(e),a=new gt(i,r);t.flipX=!1,t.flipY=!1,Object.assign(t,o),t.set({scaleX:s,scaleY:n}),t.setPositionByOrigin(a,R,R)},De=t=>{t.scaleX=1,t.scaleY=1,t.skewX=0,t.skewY=0,t.flipX=!1,t.flipY=!1,t.rotate(0)},Me=t=>({scaleX:t.scaleX,scaleY:t.scaleY,skewX:t.skewX,skewY:t.skewY,angle:t.angle,left:t.left,flipX:t.flipX,flipY:t.flipY,top:t.top}),je=(t,e,i)=>{let r=t/2,s=e/2,n=Se([new gt(-r,-s),new gt(r,-s),new gt(-r,s),new gt(r,s)].map(t=>t.transform(i)));return new gt(n.width,n.height)},Ee=(t=I,e=I)=>At(Pt(e),t),Pe=(t,e=I,i=I)=>t.transform(Ee(e,i)),Ae=(t,e=I,i=I)=>t.transform(Ee(e,i),!0),Fe=(t,e,i)=>{let r=Ee(e,i);return ke(t,At(r,t.calcOwnMatrix())),r},Le={left:-.5,top:-.5,center:0,bottom:.5,right:.5},Ie=t=>"string"==typeof t?Le[t]:t-.5,Re=new gt(1,0),Be=new gt,$e=(t,e)=>t.rotate(e),Xe=(t,e)=>new gt(e).subtract(t),Ye=t=>t.distanceFrom(Be),We=(t,e)=>Math.atan2(He(t,e),Ge(t,e)),Ne=t=>We(Re,t),Ve=t=>t.eq(Be)?t:t.scalarDivide(Ye(t)),ze=(t,e=!0)=>Ve(new gt(-t.y,t.x).scalarMultiply(e?1:-1)),He=(t,e)=>t.x*e.y-t.y*e.x,Ge=(t,e)=>t.x*e.x+t.y*e.y,Ue=(t,e,i)=>{if(t.eq(e)||t.eq(i))return!0;let r=He(e,i),s=He(e,t),n=He(i,t);return r>=0?s>=0&&n<=0:!(s<=0&&n>=0)},qe="not-allowed";function Ke(t){return Ie(t.originX)===Ie("center")&&Ie(t.originY)===Ie("center")}function Je(t){return.5-Ie(t)}const Qe=(t,e)=>t[e],Ze=(t,e,i,r)=>({e:t,transform:e,pointer:new gt(i,r)});function ti(t,e,i){let r=i,s=Ne(Xe(Pe(t.getCenterPoint(),t.canvas.viewportTransform,void 0),r))+F;return Math.round(s%F/A)}function ei({target:t,corner:e},i,r,s,n){var o;let a=t.controls[e],l=(null==(o=t.canvas)?void 0:o.getZoom())||1,h=t.padding/l,c=function(t,e,i,r){let s=t.getRelativeCenterPoint(),n=void 0!==i&&void 0!==r?t.translateToGivenOrigin(s,R,R,i,r):new gt(t.left,t.top);return(t.angle?e.rotate(-Dt(t.angle),s):e).subtract(n)}(t,new gt(s,n),i,r);return c.x>=h&&(c.x-=h),c.x<=-h&&(c.x+=h),c.y>=h&&(c.y-=h),c.y<=h&&(c.y+=h),c.x-=a.offsetX,c.y-=a.offsetY,c}const ii=new RegExp(String.raw`[\0-\x1F\x7F;<>\\]|\/\*|\*\/|url\s*\(|expression\s*\(|(?:java|vb)script\s*:|data\s*:|@import\b`,"iu"),ri=t=>"string"==typeof t&&t.trim().length>0&&!ii.test(t),si=(t,e="")=>{let i=Number(t);return Number.isFinite(i)?`${i}`:e},ni=(t,e="")=>"string"==typeof t&&ri(t)?t:e,oi=t=>t.replace(/\s+/g," "),ai={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#0FF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000",blanchedalmond:"#FFEBCD",blue:"#00F",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#0FF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",darkgreen:"#006400",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#F0F",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",lightgreen:"#90EE90",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#0F0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#F0F",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",rebeccapurple:"#639",red:"#F00",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",white:"#FFF",whitesmoke:"#F5F5F5",yellow:"#FF0",yellowgreen:"#9ACD32"},li=(t,e,i)=>(i<0&&(i+=1),i>1&&--i,i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t),hi=(t,e,i,r)=>{t/=255,e/=255,i/=255;let s,n,o=Math.max(t,e,i),a=Math.min(t,e,i),l=(o+a)/2;if(o===a)s=n=0;else{let r=o-a;switch(n=l>.5?r/(2-o-a):r/(o+a),o){case t:s=(e-i)/r+(e<i?6:0);break;case e:s=(i-t)/r+2;break;case i:s=(t-e)/r+4}s/=6}return[Math.round(360*s),Math.round(100*n),Math.round(100*l),r]},ci=(t="1")=>parseFloat(t)/(t.endsWith("%")?100:1),ui=t=>Math.min(Math.round(t),255).toString(16).toUpperCase().padStart(2,"0"),di=([t,e,i,r=1])=>{let s=Math.round(.3*t+.59*e+.11*i);return[s,s,s,r]};var gi=class t{constructor(e){if(p(this,"isUnrecognised",!1),e)if(e instanceof t)this.setSource([...e._source]);else if(Array.isArray(e)){let[t,i,r,s=1]=e;this.setSource([t,i,r,s])}else this.setSource(this._tryParsingColor(e));else this.setSource([0,0,0,1])}_tryParsingColor(e){return(e=e.toLowerCase())in ai&&(e=ai[e]),"transparent"===e?[255,255,255,0]:t.sourceFromHex(e)||t.sourceFromRgb(e)||t.sourceFromHsl(e)||(this.isUnrecognised=!0)&&[0,0,0,1]}getSource(){return this._source}setSource(t){this._source=t}toRgb(){let[t,e,i]=this.getSource();return`rgb(${t},${e},${i})`}toRgba(){return`rgba(${this.getSource().join(",")})`}toHsl(){let[t,e,i]=hi(...this.getSource());return`hsl(${t},${e}%,${i}%)`}toHsla(){let[t,e,i,r]=hi(...this.getSource());return`hsla(${t},${e}%,${i}%,${r})`}toHex(){return this.toHexa().slice(0,6)}toHexa(){let[t,e,i,r]=this.getSource();return`${ui(t)}${ui(e)}${ui(i)}${ui(Math.round(255*r))}`}getAlpha(){return this.getSource()[3]}setAlpha(t){return this._source[3]=t,this}toGrayscale(){return this.setSource(di(this.getSource())),this}toBlackWhite(t){let[e,,,i]=di(this.getSource()),r=e<(t||127)?0:255;return this.setSource([r,r,r,i]),this}overlayWith(e){e instanceof t||(e=new t(e));let i=this.getSource(),r=e.getSource(),[s,n,o]=i.map((t,e)=>Math.round(.5*t+.5*r[e]));return this.setSource([s,n,o,i[3]]),this}static fromRgb(e){return t.fromRgba(e)}static fromRgba(e){return new t(t.sourceFromRgb(e))}static sourceFromRgb(t){let e=oi(t).match(/^rgba?\(\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?(?:\s?[,/]\s?(\d{0,3}(?:\.\d+)?%?)\s?)?\)$/i);if(e){let[t,i,r]=e.slice(1,4).map(t=>{let e=parseFloat(t);return t.endsWith("%")?Math.round(2.55*e):e});return[t,i,r,ci(e[4])]}}static fromHsl(e){return t.fromHsla(e)}static fromHsla(e){return new t(t.sourceFromHsl(e))}static sourceFromHsl(e){let i=oi(e).match(/^hsla?\(\s?([+-]?\d{0,3}(?:\.\d+)?(?:deg|turn|rad)?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?[\s|,]\s?(\d{0,3}(?:\.\d+)?%?)\s?(?:\s?[,/]\s?(\d*(?:\.\d+)?%?)\s?)?\)$/i);if(!i)return;let r,s,n,o=(t.parseAngletoDegrees(i[1])%360+360)%360/360,a=parseFloat(i[2])/100,l=parseFloat(i[3])/100;if(0===a)r=s=n=l;else{let t=l<=.5?l*(a+1):l+a-l*a,e=2*l-t;r=li(e,t,o+1/3),s=li(e,t,o),n=li(e,t,o-1/3)}return[Math.round(255*r),Math.round(255*s),Math.round(255*n),ci(i[4])]}static fromHex(e){return new t(t.sourceFromHex(e))}static sourceFromHex(t){if(t.match(/^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i)){let e,i=t.slice(t.indexOf("#")+1);e=i.length<=4?i.split("").map(t=>t+t):i.match(/.{2}/g);let[r,s,n,o=255]=e.map(t=>parseInt(t,16));return[r,s,n,o/255]}}static parseAngletoDegrees(t){let e=t.toLowerCase(),i=parseFloat(e);return e.includes("rad")?Mt(i):e.includes("turn")?360*i:i}};const fi=t=>{let e=["instantiated_by_use","style","id","class"];switch(t){case"linearGradient":return e.concat(["x1","y1","x2","y2","gradientUnits","gradientTransform"]);case"radialGradient":return e.concat(["gradientUnits","gradientTransform","cx","cy","r","fx","fy","fr"]);case"stop":return e.concat(["offset","stop-color","stop-opacity"])}return e},pi=(t,e=16)=>{let i=/\D{0,2}$/.exec(t),r=parseFloat(t),s=y.DPI;switch(null==i?void 0:i[0]){case"mm":return r*s/25.4;case"cm":return r*s/2.54;case"in":return r*s;case"pt":return r*s/72;case"pc":return r*s/72*12;case"em":return r*e;default:return r}},mi=t=>{let[e,i]=t.trim().split(" "),[r,s]=(n=e)&&"none"!==n?[n.slice(1,4),n.slice(5,8)]:"none"===n?[n,n]:["Mid","Mid"];var n;return{meetOrSlice:i||"meet",alignX:r,alignY:s}},yi=(t,e,i=!0)=>{let r,s;if(e)if(e.toLive)r=`url(#SVGID_${fe(e.id)})`;else{let t=String(e);if(ri(t)){let e=new gi(t),i=e.getAlpha();r=e.toRgb(),1!==i&&(s=i.toString())}else r=new gi("black").toRgb()}else r="none";return i?`${t}: ${r}; ${s?`${t}-opacity: ${s}; `:""}`:`${t}="${r}" ${s?`${t}-opacity="${s}" `:""}`};var bi=class{getSvgStyles(t){let e=null==this.fillRule?"nonzero":ni(this.fillRule),i=null==this.strokeWidth?"0":si(this.strokeWidth),r=null==this.strokeDashArray?Y:this.strokeDashArray.every(t=>Number.isFinite(Number(t)))?this.strokeDashArray.join(" "):"",s=null==this.strokeDashOffset?"0":si(this.strokeDashOffset),n=null==this.strokeLineCap?"butt":ni(this.strokeLineCap),o=null==this.strokeLineJoin?"miter":ni(this.strokeLineJoin),a=null==this.strokeMiterLimit?"4":si(this.strokeMiterLimit),l=null==this.opacity?"1":si(this.opacity),h=this.visible?"":" visibility: hidden;",c=t?"":this.getSvgFilter(),u=yi(it,this.fill);return[yi(rt,this.stroke),i?`stroke-width: ${i}; `:"",r?`stroke-dasharray: ${r}; `:"",n?`stroke-linecap: ${n}; `:"",s?`stroke-dashoffset: ${s}; `:"",o?`stroke-linejoin: ${o}; `:"",a?`stroke-miterlimit: ${a}; `:"",u,e?`fill-rule: ${e}; `:"",l?`opacity: ${l};`:"",c,h].map(t=>fe(t)).join("")}getSvgFilter(){return this.shadow?`filter: url(#SVGID_${fe(this.shadow.id)});`:""}getSvgCommons(){return[this.id?`id="${fe(String(this.id))}" `:"",this.clipPath?`clip-path="url(#${fe(this.clipPath.clipPathId)})" `:""].join("")}getSvgTransform(t,e=""){return`transform="${Zt(t?this.calcTransformMatrix():this.calcOwnMatrix())}${e}" `}_toSVG(t){return[""]}toSVG(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})}toClipPathSVG(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})}_createBaseClipPathSVGMarkup(t,{reviver:e,additionalTransform:i=""}={}){let r=[this.getSvgTransform(!0,i),this.getSvgCommons()].join(""),s=t.indexOf("COMMON_PARTS");return t[s]=r,e?e(t.join("")):t.join("")}_createBaseSVGMarkup(t,{noStyle:e,reviver:i,withShadow:r,additionalTransform:s}={}){let n,o=e?"":`style="${this.getSvgStyles()}" `,a=r?`style="${this.getSvgFilter()}" `:"",l=this.clipPath,h=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",c=l&&l.absolutePositioned,u=this.stroke,d=this.fill,g=this.shadow,f=[],p=t.indexOf("COMMON_PARTS");return l&&(l.clipPathId=`CLIPPATH_${xt()}`,n=`<clipPath id="${l.clipPathId}" >\n${l.toClipPathSVG(i)}</clipPath>\n`),c&&f.push("<g ",a,this.getSvgCommons()," >\n"),f.push("<g ",this.getSvgTransform(!1),c?"":a+this.getSvgCommons()," >\n"),t[p]=[o,h,e?"":this.addPaintOrder()," ",s?`transform="${s}" `:""].join(""),te(d)&&f.push(d.toSVG(this)),te(u)&&f.push(u.toSVG(this)),g&&f.push(g.toSVG(this)),l&&f.push(n),f.push(t.join("")),f.push("</g>\n"),c&&f.push("</g>\n"),i?i(f.join("")):f.join("")}addPaintOrder(){return"fill"===this.paintFirst?"":` paint-order="${fe(this.paintFirst)}" `}};function _n(t){return RegExp("^("+t.join("|")+")\\b","i")}const _i="textDecorationThickness",vi="textDecorationColor",xi=["fontSize","fontWeight","fontFamily","fontStyle"],Ci=["underline","overline","linethrough"],wi=[...xi,"lineHeight","text","charSpacing","textAlign","styles","path","pathStartOffset","pathSide","pathAlign"],Si=[...wi,...Ci,"textBackgroundColor","direction",_i,vi],Ti=[...xi,...Ci,rt,"strokeWidth",it,"deltaY","textBackgroundColor",_i,vi],Oi={_reNewline:W,_reSpacesAndTabs:/[ \t\r]/g,_reSpaceAndTab:/[ \t\r]/,_reWords:/\S+/g,fontSize:40,fontWeight:nt,fontFamily:"Times New Roman",underline:!1,overline:!1,linethrough:!1,textAlign:B,fontStyle:nt,lineHeight:1.16,textBackgroundColor:"",stroke:null,shadow:null,path:void 0,pathStartOffset:0,pathSide:B,pathAlign:"baseline",charSpacing:0,deltaY:0,direction:"ltr",CACHE_FONT_SIZE:400,MIN_TEXT_WIDTH:2,superscript:{size:.6,baseline:-.35},subscript:{size:.6,baseline:.11},_fontSizeFraction:.222,offsets:{underline:.1,linethrough:-.28167,overline:-.81333},_fontSizeMult:1.13,[_i]:66.667},ki="justify",Di=String.raw`[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?`,Mi=String.raw`(?:\s*,?\s+|\s*,\s*)`,ji=RegExp("(normal|italic)?\\s*(normal|small-caps)?\\s*(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*("+Di+"(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|"+Di+"))?\\s+(.*)"),Ei={cx:B,x:B,r:"radius",cy:"top",y:"top",display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","letter-spacing":"charSpacing","paint-order":"paintFirst","stroke-dasharray":"strokeDashArray","stroke-dashoffset":"strokeDashOffset","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"textAnchor",opacity:"opacity","clip-path":"clipPath","clip-rule":"clipRule","vector-effect":"strokeUniform","image-rendering":"imageSmoothing","text-decoration-thickness":_i,"text-decoration-color":vi},Pi="font-size",Ai="clip-path",Fi=(_n(["path","circle","polygon","polyline","ellipse","rect","line","image","text"]),_n(["symbol","image","marker","pattern","view","svg"]),_n(["symbol","g","a","svg","clipPath","defs"])),Li=(new RegExp(String.raw`^\s*(${Di})${Mi}(${Di})${Mi}(${Di})${Mi}(${Di})\s*$`),"(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?"),Ii=RegExp("(?:\\s|^)"+Li+Li+"("+Di+"?(?:px)?)?(?:\\s?|$)(?:$|\\s)");var Ri=class t{constructor(e={}){let i="string"==typeof e?t.parseShadow(e):e;Object.assign(this,t.ownDefaults,i),this.id=xt()}static parseShadow(t){let e=t.trim(),[,i=0,r=0,s=0]=(Ii.exec(e)||[]).map(t=>parseFloat(t)||0);return{color:(e.replace(Ii,"")||"rgb(0,0,0)").trim(),offsetX:i,offsetY:r,blur:s}}toString(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")}toSVG(t){let e=$e(new gt(this.offsetX,this.offsetY),Dt(-t.angle)),i=y.NUM_FRACTION_DIGITS,r=new gi(this.color),s=40,n=40;return t.width&&t.height&&(s=100*Qt((Math.abs(e.x)+this.blur)/t.width,i)+20,n=100*Qt((Math.abs(e.y)+this.blur)/t.height,i)+20),t.flipX&&(e.x*=-1),t.flipY&&(e.y*=-1),`<filter id="SVGID_${fe(this.id)}" y="-${n}%" height="${100+2*n}%" x="-${s}%" width="${100+2*s}%" >\n\t<feGaussianBlur in="SourceAlpha" stdDeviation="${Qt(this.blur?this.blur/2:0,i)}"></feGaussianBlur>\n\t<feOffset dx="${Qt(e.x,i)}" dy="${Qt(e.y,i)}" result="oBlur" ></feOffset>\n\t<feFlood flood-color="${r.toRgb()}" flood-opacity="${r.getAlpha()}"/>\n\t<feComposite in2="oBlur" operator="in" />\n\t<feMerge>\n\t\t<feMergeNode></feMergeNode>\n\t\t<feMergeNode in="SourceGraphic"></feMergeNode>\n\t</feMerge>\n</filter>\n`}toObject(){let e={color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling,type:this.constructor.type},i=t.ownDefaults;return this.includeDefaultValues?e:Jt(e,(t,e)=>t!==i[e])}static async fromObject(t){return new this(t)}};p(Ri,"ownDefaults",{color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1}),p(Ri,"type","shadow"),at.setClass(Ri,"shadow");const Bi=(t,e,i)=>Math.max(t,Math.min(e,i)),$i=["top",B,Q,Z,"flipX","flipY","originX","originY","angle","opacity","globalCompositeOperation","shadow","visible",tt,et],Xi=[it,rt,"strokeWidth","strokeDashArray","width","height","paintFirst","strokeUniform","strokeLineCap","strokeDashOffset","strokeLineJoin","strokeMiterLimit","backgroundColor","clipPath"],Yi={top:0,left:0,width:0,height:0,angle:0,flipX:!1,flipY:!1,scaleX:1,scaleY:1,minScaleLimit:0,skewX:0,skewY:0,originX:R,originY:R,strokeWidth:1,strokeUniform:!1,padding:0,opacity:1,paintFirst:it,fill:"rgb(0,0,0)",fillRule:"nonzero",stroke:null,strokeDashArray:null,strokeDashOffset:0,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:4,globalCompositeOperation:"source-over",backgroundColor:"",shadow:null,visible:!0,includeDefaultValues:!0,excludeFromExport:!1,objectCaching:!0,clipPath:void 0,inverted:!1,absolutePositioned:!1,centeredRotation:!0,centeredScaling:!1,dirty:!0};var Wi=d({defaultEasing:()=>zi,easeInBack:()=>gr,easeInBounce:()=>yr,easeInCirc:()=>ar,easeInCubic:()=>Hi,easeInElastic:()=>cr,easeInExpo:()=>sr,easeInOutBack:()=>pr,easeInOutBounce:()=>br,easeInOutCirc:()=>hr,easeInOutCubic:()=>Ui,easeInOutElastic:()=>dr,easeInOutExpo:()=>or,easeInOutQuad:()=>xr,easeInOutQuart:()=>Ji,easeInOutQuint:()=>tr,easeInOutSine:()=>rr,easeInQuad:()=>_r,easeInQuart:()=>qi,easeInQuint:()=>Qi,easeInSine:()=>er,easeOutBack:()=>fr,easeOutBounce:()=>mr,easeOutCirc:()=>lr,easeOutCubic:()=>Gi,easeOutElastic:()=>ur,easeOutExpo:()=>nr,easeOutQuad:()=>vr,easeOutQuart:()=>Ki,easeOutQuint:()=>Zi,easeOutSine:()=>ir});const Ni=(t,e,i,r)=>(t<Math.abs(e)?(t=e,r=i/4):r=0===e&&0===t?i/F*Math.asin(1):i/F*Math.asin(e/t),{a:t,c:e,p:i,s:r}),Vi=(t,e,i,r,s)=>t*2**(10*--r)*Math.sin((r*s-e)*F/i),zi=(t,e,i,r)=>-i*Math.cos(t/r*P)+i+e,Hi=(t,e,i,r)=>i*(t/r)**3+e,Gi=(t,e,i,r)=>i*((t/r-1)**3+1)+e,Ui=(t,e,i,r)=>(t/=r/2)<1?i/2*t**3+e:i/2*((t-2)**3+2)+e,qi=(t,e,i,r)=>i*(t/=r)*t**3+e,Ki=(t,e,i,r)=>-i*((t=t/r-1)*t**3-1)+e,Ji=(t,e,i,r)=>(t/=r/2)<1?i/2*t**4+e:-i/2*((t-=2)*t**3-2)+e,Qi=(t,e,i,r)=>i*(t/r)**5+e,Zi=(t,e,i,r)=>i*((t/r-1)**5+1)+e,tr=(t,e,i,r)=>(t/=r/2)<1?i/2*t**5+e:i/2*((t-2)**5+2)+e,er=(t,e,i,r)=>-i*Math.cos(t/r*P)+i+e,ir=(t,e,i,r)=>i*Math.sin(t/r*P)+e,rr=(t,e,i,r)=>-i/2*(Math.cos(Math.PI*t/r)-1)+e,sr=(t,e,i,r)=>0===t?e:i*2**(10*(t/r-1))+e,nr=(t,e,i,r)=>t===r?e+i:i*-(2**(-10*t/r)+1)+e,or=(t,e,i,r)=>0===t?e:t===r?e+i:(t/=r/2)<1?i/2*2**(10*(t-1))+e:i/2*-(2**(-10*(t-1))+2)+e,ar=(t,e,i,r)=>-i*(Math.sqrt(1-(t/=r)*t)-1)+e,lr=(t,e,i,r)=>i*Math.sqrt(1-(t=t/r-1)*t)+e,hr=(t,e,i,r)=>(t/=r/2)<1?-i/2*(Math.sqrt(1-t**2)-1)+e:i/2*(Math.sqrt(1-(t-=2)*t)+1)+e,cr=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(1===(t/=r))return e+i;n||(n=.3*r);let{a:o,s:a,p:l}=Ni(s,i,n,1.70158);return-Vi(o,a,l,t,r)+e},ur=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(1===(t/=r))return e+i;n||(n=.3*r);let{a:o,s:a,p:l,c:h}=Ni(s,i,n,1.70158);return o*2**(-10*t)*Math.sin((t*r-a)*F/l)+h+e},dr=(t,e,i,r)=>{let s=i,n=0;if(0===t)return e;if(2==(t/=r/2))return e+i;n||(n=.3*1.5*r);let{a:o,s:a,p:l,c:h}=Ni(s,i,n,1.70158);return t<1?-.5*Vi(o,a,l,t,r)+e:o*2**(-10*--t)*Math.sin((t*r-a)*F/l)*.5+h+e},gr=(t,e,i,r,s=1.70158)=>i*(t/=r)*t*((s+1)*t-s)+e,fr=(t,e,i,r,s=1.70158)=>i*((t=t/r-1)*t*((s+1)*t+s)+1)+e,pr=(t,e,i,r,s=1.70158)=>(t/=r/2)<1?i/2*(t*t*((1+(s*=1.525))*t-s))+e:i/2*((t-=2)*t*((1+(s*=1.525))*t+s)+2)+e,mr=(t,e,i,r)=>(t/=r)<1/2.75?i*(7.5625*t*t)+e:t<2/2.75?i*(7.5625*(t-=1.5/2.75)*t+.75)+e:t<2.5/2.75?i*(7.5625*(t-=2.25/2.75)*t+.9375)+e:i*(7.5625*(t-=2.625/2.75)*t+.984375)+e,yr=(t,e,i,r)=>i-mr(r-t,0,i,r)+e,br=(t,e,i,r)=>t<r/2?.5*yr(2*t,0,i,r)+e:.5*mr(2*t-r,0,i,r)+.5*i+e,_r=(t,e,i,r)=>i*(t/=r)*t+e,vr=(t,e,i,r)=>-i*(t/=r)*(t-2)+e,xr=(t,e,i,r)=>(t/=r/2)<1?i/2*t**2+e:-i/2*(--t*(t-2)-1)+e,Cr=()=>!1;var wr=class{constructor({startValue:t,byValue:e,duration:i=500,delay:r=0,easing:s=zi,onStart:n=E,onChange:o=E,onComplete:a=E,abort:l=Cr,target:h}){p(this,"_state","pending"),p(this,"durationProgress",0),p(this,"valueProgress",0),this.tick=this.tick.bind(this),this.duration=i,this.delay=r,this.easing=s,this._onStart=n,this._onChange=o,this._onComplete=a,this._abort=l,this.target=h,this.startValue=t,this.byValue=e,this.value=this.startValue,this.endValue=Object.freeze(this.calculate(this.duration).value)}get state(){return this._state}isDone(){return"aborted"===this._state||"completed"===this._state}start(){let t=t=>{"pending"===this._state&&(this.startTime=t||+new Date,this._state="running",this._onStart(),this.tick(this.startTime))};this.register(),this.delay>0?this.timeout=k().setTimeout(()=>bt(t),this.delay):bt(t)}tick(t){let e=(t||+new Date)-this.startTime,i=Math.min(e,this.duration);this.durationProgress=i/this.duration;let{value:r,valueProgress:s}=this.calculate(i);this.value=Object.freeze(r),this.valueProgress=s,"aborted"!==this._state&&(this._abort(this.value,this.valueProgress,this.durationProgress)?(this._state="aborted",this.unregister()):e>=this.duration?(this.durationProgress=this.valueProgress=1,this._onChange(this.endValue,this.valueProgress,this.durationProgress),this._state="completed",this._onComplete(this.endValue,this.valueProgress,this.durationProgress),this.unregister(),this.timeout=null):(this._onChange(this.value,this.valueProgress,this.durationProgress),bt(this.tick)))}register(){lt.push(this)}unregister(){lt.remove(this)}abort(){this._state="aborted",this.unregister(),this.timeout&&k().clearTimeout(this.timeout)}},Sr=class extends wr{constructor({startValue:t=0,endValue:e=100,...i}){super({...i,startValue:t,byValue:e-t})}calculate(t){let e=this.easing(t,this.startValue,this.byValue,this.duration);return{value:e,valueProgress:Math.abs((e-this.startValue)/this.byValue)}}},Tr=class extends wr{constructor({startValue:t=[0],endValue:e=[100],...i}){super({...i,startValue:t,byValue:e.map((e,i)=>e-t[i])})}calculate(t){let e=this.startValue.map((e,i)=>this.easing(t,e,this.byValue[i],this.duration,i));return{value:e,valueProgress:Math.abs((e[0]-this.startValue[0])/this.byValue[0])}}};const Or=(t,e,i,r)=>e+i*(1-Math.cos(t/r*P)),kr=t=>t&&((e,i,r)=>t(new gi(e).toRgba(),i,r));var Dr=class extends wr{constructor({startValue:t,endValue:e,easing:i=Or,onChange:r,onComplete:s,abort:n,...o}){let a=new gi(t).getSource(),l=new gi(e).getSource();super({...o,startValue:a,byValue:l.map((t,e)=>t-a[e]),easing:i,onChange:kr(r),onComplete:kr(s),abort:kr(n)})}calculate(t){let[e,i,r,s]=this.startValue.map((e,i)=>this.easing(t,e,this.byValue[i],this.duration,i)),n=[...[e,i,r].map(Math.round),Bi(0,s,1)];return{value:n,valueProgress:n.map((t,e)=>0===this.byValue[e]?0:Math.abs((t-this.startValue[e])/this.byValue[e])).find(t=>0!==t)||0}}};function Mr(t){let e=(t=>Array.isArray(t.startValue)||Array.isArray(t.endValue))(t)?new Tr(t):new Sr(t);return e.start(),e}function jr(t){let e=new Dr(t);return e.start(),e}var Er=class t{constructor(t){this.status=t,this.points=[]}includes(t){return this.points.some(e=>e.eq(t))}append(...t){return this.points=this.points.concat(t.filter(t=>!this.includes(t))),this}static isPointContained(t,e,i,r=!1){if(e.eq(i))return t.eq(e);if(e.x===i.x)return t.x===e.x&&(r||t.y>=Math.min(e.y,i.y)&&t.y<=Math.max(e.y,i.y));if(e.y===i.y)return t.y===e.y&&(r||t.x>=Math.min(e.x,i.x)&&t.x<=Math.max(e.x,i.x));{let s=Xe(e,i),n=Xe(e,t).divide(s);return r?Math.abs(n.x)===Math.abs(n.y):n.x===n.y&&n.x>=0&&n.x<=1}}static isPointInPolygon(t,e){let i=new gt(t).setX(Math.min(t.x-1,...e.map(t=>t.x))),r=0;for(let s=0;s<e.length;s++){let n=this.intersectSegmentSegment(e[s],e[(s+1)%e.length],t,i);if(n.includes(t))return!0;r+=Number("Intersection"===n.status)}return r%2==1}static intersectLineLine(e,i,r,s,n=!0,o=!0){let a=i.x-e.x,l=i.y-e.y,h=s.x-r.x,c=s.y-r.y,u=e.x-r.x,d=e.y-r.y,g=h*d-c*u,f=a*d-l*u,p=c*a-h*l;if(0!==p){let i=g/p,r=f/p;return(n||0<=i&&i<=1)&&(o||0<=r&&r<=1)?new t("Intersection").append(new gt(e.x+i*a,e.y+i*l)):new t}return new t(0===g||0===f?n||o||t.isPointContained(e,r,s)||t.isPointContained(i,r,s)||t.isPointContained(r,e,i)||t.isPointContained(s,e,i)?"Coincident":void 0:"Parallel")}static intersectSegmentLine(e,i,r,s){return t.intersectLineLine(e,i,r,s,!1,!0)}static intersectSegmentSegment(e,i,r,s){return t.intersectLineLine(e,i,r,s,!1,!1)}static intersectLinePolygon(e,i,r,s=!0){let n=new t,o=r.length;for(let a,l,h,c=0;c<o;c++){if(a=r[c],l=r[(c+1)%o],h=t.intersectLineLine(e,i,a,l,s,!1),"Coincident"===h.status)return h;n.append(...h.points)}return n.points.length>0&&(n.status="Intersection"),n}static intersectSegmentPolygon(e,i,r){return t.intersectLinePolygon(e,i,r,!1)}static intersectPolygonPolygon(e,i){let r=new t,s=e.length,n=[];for(let o=0;o<s;o++){let a=e[o],l=e[(o+1)%s],h=t.intersectSegmentPolygon(a,l,i);"Coincident"===h.status?(n.push(h),r.append(a,l)):r.append(...h.points)}return n.length>0&&n.length===e.length?new t("Coincident"):(r.points.length>0&&(r.status="Intersection"),r)}static intersectPolygonRectangle(e,i,r){let s=i.min(r),n=i.max(r),o=new gt(n.x,s.y),a=new gt(s.x,n.y);return t.intersectPolygonPolygon(e,[s,o,n,a])}},Pr=class extends yt{getX(){return this.getXY().x}setX(t){this.setXY(this.getXY().setX(t))}getY(){return this.getXY().y}setY(t){this.setXY(this.getXY().setY(t))}getRelativeX(){return this.left}setRelativeX(t){this.left=t}getRelativeY(){return this.top}setRelativeY(t){this.top=t}getXY(){let t=this.getRelativeXY();return this.group?Et(t,this.group.calcTransformMatrix()):t}setXY(t,e,i){this.group&&(t=Et(t,Pt(this.group.calcTransformMatrix()))),this.setRelativeXY(t,e,i)}getRelativeXY(){return new gt(this.left,this.top)}setRelativeXY(t,e=this.originX,i=this.originY){this.setPositionByOrigin(t,e,i)}isStrokeAccountedForInDimensions(){return!1}getCoords(){let{tl:t,tr:e,br:i,bl:r}=this.aCoords||(this.aCoords=this.calcACoords()),s=[t,e,i,r];if(this.group){let t=this.group.calcTransformMatrix();return s.map(e=>Et(e,t))}return s}intersectsWithRect(t,e){return"Intersection"===Er.intersectPolygonRectangle(this.getCoords(),t,e).status}intersectsWithObject(t){let e=Er.intersectPolygonPolygon(this.getCoords(),t.getCoords());return"Intersection"===e.status||"Coincident"===e.status||t.isContainedWithinObject(this)||this.isContainedWithinObject(t)}isContainedWithinObject(t){return this.getCoords().every(e=>t.containsPoint(e))}isContainedWithinRect(t,e){let{left:i,top:r,width:s,height:n}=this.getBoundingRect();return i>=t.x&&i+s<=e.x&&r>=t.y&&r+n<=e.y}isOverlapping(t){return this.intersectsWithObject(t)||this.isContainedWithinObject(t)||t.isContainedWithinObject(this)}containsPoint(t){return Er.isPointInPolygon(t,this.getCoords())}isOnScreen(){if(!this.canvas)return!1;let{tl:t,br:e}=this.canvas.vptCoords;return!!this.getCoords().some(i=>i.x<=e.x&&i.x>=t.x&&i.y<=e.y&&i.y>=t.y)||!!this.intersectsWithRect(t,e)||this.containsPoint(t.midPointFrom(e))}isPartiallyOnScreen(){if(!this.canvas)return!1;let{tl:t,br:e}=this.canvas.vptCoords;return!!this.intersectsWithRect(t,e)||this.getCoords().every(i=>(i.x>=e.x||i.x<=t.x)&&(i.y>=e.y||i.y<=t.y))&&this.containsPoint(t.midPointFrom(e))}getBoundingRect(){return Se(this.getCoords())}getScaledWidth(){return this._getTransformedDimensions().x}getScaledHeight(){return this._getTransformedDimensions().y}scale(t){this._set(Q,t),this._set(Z,t),this.setCoords()}scaleToWidth(t){let e=this.getBoundingRect().width/this.getScaledWidth();return this.scale(t/this.width/e)}scaleToHeight(t){let e=this.getBoundingRect().height/this.getScaledHeight();return this.scale(t/this.height/e)}getCanvasRetinaScaling(){var t;return(null==(t=this.canvas)?void 0:t.getRetinaScaling())||1}getTotalAngle(){return this.group?Mt(Lt(this.calcTransformMatrix())):this.angle}getViewportTransform(){var t;return(null==(t=this.canvas)?void 0:t.viewportTransform)||I.concat()}calcACoords(){let t=Xt({angle:this.angle}),{x:e,y:i}=this.getRelativeCenterPoint(),r=At($t(e,i),t),s=this._getTransformedDimensions(),n=s.x/2,o=s.y/2;return{tl:Et({x:-n,y:-o},r),tr:Et({x:n,y:-o},r),bl:Et({x:-n,y:o},r),br:Et({x:n,y:o},r)}}setCoords(){this.aCoords=this.calcACoords()}transformMatrixKey(t=!1){let e=[];return!t&&this.group&&(e=this.group.transformMatrixKey(t)),e.push(this.top,this.left,this.width,this.height,this.scaleX,this.scaleY,this.angle,this.strokeWidth,this.skewX,this.skewY,+this.flipX,+this.flipY,Ie(this.originX),Ie(this.originY)),e}calcTransformMatrix(t=!1){let e=this.calcOwnMatrix();if(t||!this.group)return e;let i=this.transformMatrixKey(t),r=this.matrixCache;return r&&r.key.every((t,e)=>t===i[e])?r.value:(this.group&&(e=At(this.group.calcTransformMatrix(!1),e)),this.matrixCache={key:i,value:e},e)}calcOwnMatrix(){let t=this.transformMatrixKey(!0),e=this.ownMatrixCache;if(e&&e.key.every((e,i)=>e===t[i]))return e.value;let i=this.getRelativeCenterPoint(),r=Ht({angle:this.angle,translateX:i.x,translateY:i.y,scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,flipX:this.flipX,flipY:this.flipY});return this.ownMatrixCache={key:t,value:r},r}_getNonTransformedDimensions(){return new gt(this.width,this.height).scalarAdd(this.strokeWidth)}_calculateCurrentDimensions(t){var e;let i=null==(e=this.canvas)?void 0:e.viewportTransform,r=this._getTransformedDimensions(t);return i?r.multiply(new gt(It(i),Rt(i))).scalarAdd(2*this.padding):r.scalarAdd(2*this.padding)}_getTransformedDimensions(t={}){let e={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,width:this.width,height:this.height,strokeWidth:this.strokeWidth,...t},i=e.strokeWidth,r=i,s=0;this.strokeUniform&&(r=0,s=i);let n,o=e.width+r,a=e.height+r;return n=0===e.skewX&&0===e.skewY?new gt(o*e.scaleX,a*e.scaleY):je(o,a,zt(e)),n.scalarAdd(s)}translateToGivenOrigin(t,e,i,r,s){let n=t.x,o=t.y,a=Ie(r)-Ie(e),l=Ie(s)-Ie(i);if(a||l){let t=this._getTransformedDimensions();n+=a*t.x,o+=l*t.y}return new gt(n,o)}translateToCenterPoint(t,e,i){if("center"===e&&"center"===i)return t;let r=this.translateToGivenOrigin(t,e,i,R,R);return this.angle?r.rotate(Dt(this.angle),t):r}translateToOriginPoint(t,e,i){let r=this.translateToGivenOrigin(t,R,R,e,i);return this.angle?r.rotate(Dt(this.angle),t):r}getCenterPoint(){let t=this.getRelativeCenterPoint();return this.group?Et(t,this.group.calcTransformMatrix()):t}getRelativeCenterPoint(){return this.translateToCenterPoint(new gt(this.left,this.top),this.originX,this.originY)}getPointByOrigin(t,e){return this.getPositionByOrigin(t,e)}getPositionByOrigin(t,e){return this.translateToOriginPoint(this.getRelativeCenterPoint(),t,e)}setPositionByOrigin(t,e,i){let r=this.translateToCenterPoint(t,e,i),s=this.translateToOriginPoint(r,this.originX,this.originY);this.set({left:s.x,top:s.y})}_getLeftTopCoords(){return this.getPositionByOrigin(B,"top")}positionByLeftTop(t){return this.setPositionByOrigin(t,B,"top")}},Ar=class t extends Pr{static getDefaults(){return t.ownDefaults}get type(){let t=this.constructor.type;return"FabricObject"===t?"object":t.toLowerCase()}set type(t){b("warn","Setting type has no effect",t)}constructor(e){super(),p(this,"_cacheContext",null),Object.assign(this,t.ownDefaults),this.setOptions(e)}_createCacheCanvas(){this._cacheCanvas=Ct(),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas(),this.dirty=!0}_limitCacheSize(t){let e=t.width,i=t.height,r=y.maxCacheSideLimit,s=y.minCacheSideLimit;if(e<=r&&i<=r&&e*i<=y.perfLimitSizeTotal)return e<s&&(t.width=s),i<s&&(t.height=s),t;let n=e/i,[o,a]=M.limitDimsByArea(n),l=Bi(s,o,r),h=Bi(s,a,r);return e>l&&(t.zoomX/=e/l,t.width=l,t.capped=!0),i>h&&(t.zoomY/=i/h,t.height=h,t.capped=!0),t}_getCacheCanvasDimensions(){let t=this.getTotalObjectScaling(),e=this._getTransformedDimensions({skewX:0,skewY:0}),i=e.x*t.x/this.scaleX,r=e.y*t.y/this.scaleY;return{width:Math.ceil(i+2),height:Math.ceil(r+2),zoomX:t.x,zoomY:t.y,x:i,y:r}}_updateCacheCanvas(){let t=this._cacheCanvas,e=this._cacheContext,{width:i,height:r,zoomX:s,zoomY:n,x:o,y:a}=this._limitCacheSize(this._getCacheCanvasDimensions()),l=i!==t.width||r!==t.height,h=this.zoomX!==s||this.zoomY!==n;if(!t||!e)return!1;if(l||h){i!==t.width||r!==t.height?(t.width=i,t.height=r):(e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t.width,t.height));let l=o/2,h=a/2;return this.cacheTranslationX=Math.round(t.width/2-l)+l,this.cacheTranslationY=Math.round(t.height/2-h)+h,e.translate(this.cacheTranslationX,this.cacheTranslationY),e.scale(s,n),this.zoomX=s,this.zoomY=n,!0}return!1}setOptions(t={}){this._setOptions(t)}transform(t){let e=this.group&&!this.group._transformDone||this.group&&this.canvas&&t===this.canvas.contextTop,i=this.calcTransformMatrix(!e);t.transform(i[0],i[1],i[2],i[3],i[4],i[5])}getObjectScaling(){if(!this.group)return new gt(Math.abs(this.scaleX),Math.abs(this.scaleY));let t=Bt(this.calcTransformMatrix());return new gt(Math.abs(t.scaleX),Math.abs(t.scaleY))}getTotalObjectScaling(){let t=this.getObjectScaling();if(this.canvas){let e=this.canvas.getZoom(),i=this.getCanvasRetinaScaling();return t.scalarMultiply(e*i)}return t}getObjectOpacity(){let t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t}_constrainScale(t){return Math.abs(t)<this.minScaleLimit?t<0?-this.minScaleLimit:this.minScaleLimit:0===t?1e-4:t}_set(t,e){"scaleX"!==t&&"scaleY"!==t||(e=this._constrainScale(e)),"scaleX"===t&&e<0?(this.flipX=!this.flipX,e*=-1):"scaleY"===t&&e<0?(this.flipY=!this.flipY,e*=-1):"shadow"!==t||!e||e instanceof Ri||(e=new Ri(e));let i=this[t]!==e;return this[t]=e,i&&this.constructor.cacheProperties.includes(t)&&(this.dirty=!0),this.parent&&(this.dirty||i&&this.constructor.stateProperties.includes(t))&&this.parent._set("dirty",!0),this}isNotVisible(){return 0===this.opacity||!this.width&&!this.height&&0===this.strokeWidth||!this.visible}render(t){this.isNotVisible()||this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),this.transform(t),this._setOpacity(t),this._setShadow(t),this.shouldCache()?(this.renderCache(),this.drawCacheOnCanvas(t)):(this._removeCacheCanvas(),this.drawObject(t,!1,{}),this.dirty=!1),t.restore())}drawSelectionBackground(t){}renderCache(t){if(t=t||{},this._cacheCanvas&&this._cacheContext||this._createCacheCanvas(),this.isCacheDirty()&&this._cacheContext){let{zoomX:e,zoomY:i,cacheTranslationX:r,cacheTranslationY:s}=this,{width:n,height:o}=this._cacheCanvas;this.drawObject(this._cacheContext,t.forClipping,{zoomX:e,zoomY:i,cacheTranslationX:r,cacheTranslationY:s,width:n,height:o,parentClipPaths:[]}),this.dirty=!1}}_removeCacheCanvas(){this._cacheCanvas=void 0,this._cacheContext=null}hasStroke(){return!!this.stroke&&"transparent"!==this.stroke&&0!==this.strokeWidth}hasFill(){return!!this.fill&&"transparent"!==this.fill}needsItsOwnCache(){return!!("stroke"===this.paintFirst&&this.hasFill()&&this.hasStroke()&&this.shadow)||!!this.clipPath}shouldCache(){return this.ownCaching=this.objectCaching&&(!this.parent||!this.parent.isOnACache())||this.needsItsOwnCache(),this.ownCaching}willDrawShadow(){return!!this.shadow&&(0!==this.shadow.offsetX||0!==this.shadow.offsetY)}drawClipPathOnCache(t,e,i){t.save(),e.inverted?t.globalCompositeOperation="destination-out":t.globalCompositeOperation="destination-in",t.setTransform(1,0,0,1,0,0),t.drawImage(i,0,0),t.restore()}drawObject(t,e,i){let r=this.fill,s=this.stroke;e?(this.fill="black",this.stroke="",this._setClippingProperties(t)):this._renderBackground(t),this.fire("before:render",{ctx:t}),this._render(t),this._drawClipPath(t,this.clipPath,i),this.fill=r,this.stroke=s}createClipPathLayer(t,e){let i=Tt(e),r=i.getContext("2d");if(r.translate(e.cacheTranslationX,e.cacheTranslationY),r.scale(e.zoomX,e.zoomY),t._cacheCanvas=i,e.parentClipPaths.forEach(t=>{t.transform(r)}),e.parentClipPaths.push(t),t.absolutePositioned){let t=Pt(this.calcTransformMatrix());r.transform(t[0],t[1],t[2],t[3],t[4],t[5])}return t.transform(r),t.drawObject(r,!0,e),i}_drawClipPath(t,e,i){if(!e)return;e._transformDone=!0;let r=this.createClipPathLayer(e,i);this.drawClipPathOnCache(t,e,r)}drawCacheOnCanvas(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)}isCacheDirty(t=!1){if(this.isNotVisible())return!1;let e=this._cacheCanvas,i=this._cacheContext;return!(!e||!i||t||!this._updateCacheCanvas())||!!(this.dirty||this.clipPath&&this.clipPath.absolutePositioned)&&(e&&i&&!t&&(i.save(),i.setTransform(1,0,0,1,0,0),i.clearRect(0,0,e.width,e.height),i.restore()),!0)}_renderBackground(t){if(!this.backgroundColor)return;let e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}_setOpacity(t){this.group&&!this.group._transformDone?t.globalAlpha=this.getObjectOpacity():t.globalAlpha*=this.opacity}_setStrokeStyles(t,e){let i=e.stroke;i&&(t.lineWidth=e.strokeWidth,t.lineCap=e.strokeLineCap,t.lineDashOffset=e.strokeDashOffset,t.lineJoin=e.strokeLineJoin,t.miterLimit=e.strokeMiterLimit,te(i)?"percentage"===i.gradientUnits||i.gradientTransform||i.patternTransform?this._applyPatternForTransformedGradient(t,i):(t.strokeStyle=i.toLive(t),this._applyPatternGradientTransform(t,i)):t.strokeStyle=e.stroke)}_setFillStyles(t,{fill:e}){e&&(te(e)?(t.fillStyle=e.toLive(t),this._applyPatternGradientTransform(t,e)):t.fillStyle=e)}_setClippingProperties(t){t.globalAlpha=1,t.strokeStyle="transparent",t.fillStyle="#000000"}_setLineDash(t,e){e&&0!==e.length&&t.setLineDash(e)}_setShadow(t){if(!this.shadow)return;let e=this.shadow,i=this.canvas,r=this.getCanvasRetinaScaling(),[s,,,n]=(null==i?void 0:i.viewportTransform)||I,o=s*r,a=n*r,l=e.nonScaling?new gt(1,1):this.getObjectScaling();t.shadowColor=e.color,t.shadowBlur=e.blur*y.browserShadowBlurConstant*(o+a)*(l.x+l.y)/4,t.shadowOffsetX=e.offsetX*o*l.x,t.shadowOffsetY=e.offsetY*a*l.y}_removeShadow(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)}_applyPatternGradientTransform(t,e){if(!te(e))return{offsetX:0,offsetY:0};let i=e.gradientTransform||e.patternTransform,r=-this.width/2+e.offsetX||0,s=-this.height/2+e.offsetY||0;return"percentage"===e.gradientUnits?t.transform(this.width,0,0,this.height,r,s):t.transform(1,0,0,1,r,s),i&&t.transform(i[0],i[1],i[2],i[3],i[4],i[5]),{offsetX:r,offsetY:s}}_renderPaintInOrder(t){"stroke"===this.paintFirst?(this._renderStroke(t),this._renderFill(t)):(this._renderFill(t),this._renderStroke(t))}_render(t){}_renderFill(t){this.fill&&(t.save(),this._setFillStyles(t,this),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())}_renderStroke(t){if(this.stroke&&0!==this.strokeWidth){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this.strokeUniform){let e=this.getObjectScaling();t.scale(1/e.x,1/e.y)}this._setLineDash(t,this.strokeDashArray),this._setStrokeStyles(t,this),t.stroke(),t.restore()}}_applyPatternForTransformedGradient(t,e){var i;let r=this._limitCacheSize(this._getCacheCanvasDimensions()),s=this.getCanvasRetinaScaling(),n=r.x/this.scaleX/s,o=r.y/this.scaleY/s,a=Tt({width:Math.ceil(n),height:Math.ceil(o)}),l=a.getContext("2d");l&&(l.beginPath(),l.moveTo(0,0),l.lineTo(n,0),l.lineTo(n,o),l.lineTo(0,o),l.closePath(),l.translate(n/2,o/2),l.scale(r.zoomX/this.scaleX/s,r.zoomY/this.scaleY/s),this._applyPatternGradientTransform(l,e),l.fillStyle=e.toLive(t),l.fill(),t.translate(-this.width/2-this.strokeWidth/2,-this.height/2-this.strokeWidth/2),t.scale(s*this.scaleX/r.zoomX,s*this.scaleY/r.zoomY),t.strokeStyle=null==(i=l.createPattern(a,"no-repeat"))?"":i)}_findCenterFromElement(){return new gt(this.left+this.width/2,this.top+this.height/2)}clone(t){let e=this.toObject(t);return this.constructor.fromObject(e)}cloneAsImage(t){let e=this.toCanvasElement(t);return new(at.getClass("image"))(e)}toCanvasElement(t={}){let e=Me(this),i=this.group,r=this.shadow,s=Math.abs,n=t.enableRetinaScaling?D():1,o=(t.multiplier||1)*n,a=t.canvasProvider||(t=>new _e(t,{enableRetinaScaling:!1,renderOnAddRemove:!1,skipOffscreen:!1}));delete this.group,t.withoutTransform&&De(this),t.withoutShadow&&(this.shadow=null),t.viewportTransform&&Fe(this,this.getViewportTransform()),this.setCoords();let l=Ct(),h=this.getBoundingRect(),c=this.shadow,u=new gt;if(c){let t=c.blur,e=c.nonScaling?new gt(1,1):this.getObjectScaling();u.x=2*Math.round(s(c.offsetX)+t)*s(e.x),u.y=2*Math.round(s(c.offsetY)+t)*s(e.y)}let d=h.width+u.x,g=h.height+u.y;l.width=Math.ceil(d),l.height=Math.ceil(g);let f=a(l);"jpeg"===t.format&&(f.backgroundColor="#fff"),this.setPositionByOrigin(new gt(f.width/2,f.height/2),R,R);let p=this.canvas;f._objects=[this],this.set("canvas",f),this.setCoords();let m=f.toCanvasElement(o||1,t);return this.set("canvas",p),this.shadow=r,i&&(this.group=i),this.set(e),this.setCoords(),f._objects=[],f.destroy(),m}toDataURL(t={}){return Ot(this.toCanvasElement(t),t.format||"png",t.quality||1)}toBlob(t={}){return kt(this.toCanvasElement(t),t.format||"png",t.quality||1)}isType(...t){return t.includes(this.constructor.type)||t.includes(this.type)}complexity(){return 1}toJSON(){return this.toObject()}rotate(t){let{centeredRotation:e,originX:i,originY:r}=this;if(e){let{x:t,y:e}=this.getRelativeCenterPoint();this.originX=R,this.originY=R,this.left=t,this.top=e}if(this.set("angle",t),e){let{x:t,y:e}=this.getPositionByOrigin(i,r);this.left=t,this.top=e,this.originX=i,this.originY=r}}setOnGroup(){}_setupCompositeOperation(t){this.globalCompositeOperation&&(t.globalCompositeOperation=this.globalCompositeOperation)}dispose(){lt.cancelByTarget(this),this.off(),this._set("canvas",void 0),this._cacheCanvas&&T().dispose(this._cacheCanvas),this._cacheCanvas=void 0,this._cacheContext=null}animate(t,e){return Object.entries(t).reduce((t,[i,r])=>(t[i]=this._animate(i,r,e),t),{})}_animate(t,e,i={}){let r=t.split("."),s=this.constructor.colorProperties.includes(r[r.length-1]),{abort:n,startValue:o,onChange:a,onComplete:l}=i,h={...i,target:this,startValue:o??r.reduce((t,e)=>t[e],this),endValue:e,abort:null==n?void 0:n.bind(this),onChange:(t,e,i)=>{r.reduce((e,i,s)=>(s===r.length-1&&(e[i]=t),e[i]),this),a&&a(t,e,i)},onComplete:(t,e,i)=>{this.setCoords(),l&&l(t,e,i)}};return s?jr(h):Mr(h)}isDescendantOf(t){let{parent:e,group:i}=this;return e===t||i===t||!!e&&e.isDescendantOf(t)||!!i&&i!==e&&i.isDescendantOf(t)}getAncestors(){let t=[],e=this;do{e=e.parent,e&&t.push(e)}while(e);return t}findCommonAncestors(t){if(this===t)return{fork:[],otherFork:[],common:[this,...this.getAncestors()]};let e=this.getAncestors(),i=t.getAncestors();if(0===e.length&&i.length>0&&this===i[i.length-1])return{fork:[],otherFork:[t,...i.slice(0,i.length-1)],common:[this]};for(let r,s=0;s<e.length;s++){if(r=e[s],r===t)return{fork:[this,...e.slice(0,s)],otherFork:[],common:e.slice(s)};for(let n=0;n<i.length;n++){if(this===i[n])return{fork:[],otherFork:[t,...i.slice(0,n)],common:[this,...e]};if(r===i[n])return{fork:[this,...e.slice(0,s)],otherFork:[t,...i.slice(0,n)],common:e.slice(s)}}}return{fork:[this,...e],otherFork:[t,...i],common:[]}}hasCommonAncestors(t){let e=this.findCommonAncestors(t);return e&&!!e.common.length}isInFrontOf(t){if(this===t)return;let e=this.findCommonAncestors(t);if(e.fork.includes(t))return!0;if(e.otherFork.includes(this))return!1;let i=e.common[0]||this.canvas;if(!i)return;let r=e.fork.pop(),s=e.otherFork.pop(),n=i._objects.indexOf(r),o=i._objects.indexOf(s);return n>-1&&n>o}toObject(e=[]){let i,r=e.concat(t.customProperties,this.constructor.customProperties||[]),s=y.NUM_FRACTION_DIGITS,{clipPath:n,fill:o,stroke:a,shadow:l,strokeDashArray:h,left:c,top:u,originX:d,originY:g,width:f,height:p,strokeWidth:m,strokeLineCap:b,strokeDashOffset:_,strokeLineJoin:v,strokeUniform:x,strokeMiterLimit:C,scaleX:w,scaleY:S,angle:T,flipX:O,flipY:k,opacity:D,visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:F,skewX:L,skewY:I}=this;n&&!n.excludeFromExport&&(i=n.toObject(r.concat("inverted","absolutePositioned")));let R=t=>Qt(t,s),B={...Kt(this,r),type:this.constructor.type,version:j,originX:d,originY:g,left:R(c),top:R(u),width:R(f),height:R(p),fill:ee(o)?o.toObject():o,stroke:ee(a)?a.toObject():a,strokeWidth:R(m),strokeDashArray:h&&h.concat(),strokeLineCap:b,strokeDashOffset:_,strokeLineJoin:v,strokeUniform:x,strokeMiterLimit:R(C),scaleX:R(w),scaleY:R(S),angle:R(T),flipX:O,flipY:k,opacity:R(D),shadow:l&&l.toObject(),visible:M,backgroundColor:E,fillRule:P,paintFirst:A,globalCompositeOperation:F,skewX:R(L),skewY:R(I),...i?{clipPath:i}:null};return this.includeDefaultValues?B:this._removeDefaultValues(B)}toDatalessObject(t){return this.toObject(t)}_removeDefaultValues(t){let e=this.constructor.getDefaults(),i=Object.keys(e).length>0?e:Object.getPrototypeOf(this);return Jt(t,(t,e)=>{if("left"===e||"top"===e||"type"===e)return!0;let r=i[e];return t!==r&&!(Array.isArray(t)&&Array.isArray(r)&&0===t.length&&0===r.length)})}toString(){return`#<${this.constructor.type}>`}static _fromObject({type:t,...e},{extraParam:i,...r}={}){return qt(e,r).then(t=>i?(delete t[i],new this(e[i],t)):new this(t))}static fromObject(t,e){return this._fromObject(t,e)}};p(Ar,"stateProperties",$i),p(Ar,"cacheProperties",Xi),p(Ar,"ownDefaults",Yi),p(Ar,"type","FabricObject"),p(Ar,"colorProperties",[it,rt,"backgroundColor"]),p(Ar,"customProperties",[]),at.setClass(Ar),at.setClass(Ar,"object");const Fr=(t,e)=>{var i;let{transform:{target:r}}=e;null==(i=r.canvas)||i.fire(`object:${t}`,{...e,target:r}),r.fire(t,e)},Lr=(t,e,i)=>(r,s,n,o)=>{let a=e(r,s,n,o);return a&&Fr(t,{...Ze(r,s,n,o),...i}),a};function Ir(t){return(e,i,r,s)=>{let{target:n,originX:o,originY:a}=i,l=n.getPositionByOrigin(o,a),h=t(e,i,r,s);return n.setPositionByOrigin(l,i.originX,i.originY),h}}const Rr=(t,e,i,r)=>(s,n,o,a)=>{let l=ei(n,n.originX,n.originY,o,a)[i],h=Ie(n[e]);if(0===h||h>0&&l<0||h<0&&l>0){let{target:e}=n,i=e.strokeWidth/(e.strokeUniform?e[r]:1),s=Ke(n)?2:1,o=e[t],a=Math.abs(l*s/e[r])-i;return e.set(t,Math.max(a,1)),o!==e[t]}return!1},Br=Rr("width","originX","x","scaleX"),$r=Rr("height","originY","y","scaleY"),Xr=Lr(U,Ir(Br)),Yr=Lr(U,Ir($r));function Wr(t,e,i,r,s){t.save();let{stroke:n,xSize:o,ySize:a,opName:l}=this.commonRenderProps(t,e,i,s,r),h=o;o>a?t.scale(1,a/o):a>o&&(h=a,t.scale(o/a,1)),t.beginPath(),t.arc(0,0,h/2,0,F,!1),t[l](),n&&t.stroke(),t.restore()}function Nr(t,e,i,r,s){t.save();let{stroke:n,xSize:o,ySize:a,opName:l}=this.commonRenderProps(t,e,i,s,r),h=o/2,c=a/2;t[`${l}Rect`](-h,-c,o,a),n&&t.strokeRect(-h,-c,o,a),t.restore()}var Vr=class{constructor(t){p(this,"visible",!0),p(this,"actionName",J),p(this,"angle",0),p(this,"x",0),p(this,"y",0),p(this,"offsetX",0),p(this,"offsetY",0),p(this,"sizeX",0),p(this,"sizeY",0),p(this,"touchSizeX",0),p(this,"touchSizeY",0),p(this,"cursorStyle","crosshair"),p(this,"withConnection",!1),Object.assign(this,t)}getTransformAnchorPoint(){var t;return null==(t=this.transformAnchorPoint)?new gt(.5-this.x,.5-this.y):t}shouldActivate(t,e,i,{tl:r,tr:s,br:n,bl:o}){var a;return(null==(a=e.canvas)?void 0:a.getActiveObject())===e&&e.isControlVisible(t)&&Er.isPointInPolygon(i,[r,s,n,o])}getActionHandler(t,e,i){return this.actionHandler}getMouseDownHandler(t,e,i){return this.mouseDownHandler}getMouseUpHandler(t,e,i){return this.mouseUpHandler}cursorStyleHandler(t,e,i,r){return e.cursorStyle}getActionName(t,e,i){return e.actionName}getVisibility(t,e){var i,r;return null==(i=null==(r=t._controlsVisibility)?void 0:r[e])?this.visible:i}setVisibility(t,e,i){this.visible=t}positionHandler(t,e,i,r){return new gt(this.x*t.x+this.offsetX,this.y*t.y+this.offsetY).transform(e)}calcCornerCoords(t,e,i,r,s,n){let o=Ft([$t(i,r),Xt({angle:t}),Yt((s?this.touchSizeX:this.sizeX)||e,(s?this.touchSizeY:this.sizeY)||e)]);return{tl:new gt(-.5,-.5).transform(o),tr:new gt(.5,-.5).transform(o),br:new gt(.5,.5).transform(o),bl:new gt(-.5,.5).transform(o)}}commonRenderProps(t,e,i,r,s={}){let{cornerSize:n,cornerColor:o,transparentCorners:a,cornerStrokeColor:l}=s,h=n||r.cornerSize,c=this.sizeX||h,u=this.sizeY||h,d=void 0===a?r.transparentCorners:a,g=d?rt:it,f=l||r.cornerStrokeColor,p=!d&&!!f;return t.fillStyle=o||r.cornerColor||"",t.strokeStyle=f||"",t.translate(e,i),t.rotate(Dt(r.getTotalAngle())),{stroke:p,xSize:c,ySize:u,transparentCorners:d,opName:g}}render(t,e,i,r,s){"circle"===((r=r||{}).cornerStyle||s.cornerStyle)?Wr.call(this,t,e,i,r,s):Nr.call(this,t,e,i,r,s)}};const zr=(t,e,i)=>i.lockRotation?qe:e.cursorStyle,Hr=Lr(z,Ir((t,{target:e,ex:i,ey:r,theta:s,originX:n,originY:o},a,l)=>{let h=e.getPositionByOrigin(n,o);if(Qe(e,"lockRotation"))return!1;let c=Math.atan2(r-h.y,i-h.x),u=Mt(Math.atan2(l-h.y,a-h.x)-c+s);if(e.snapAngle&&e.snapAngle>0){let t=e.snapAngle,i=e.snapThreshold||t,r=Math.ceil(u/t)*t,s=Math.floor(u/t)*t;Math.abs(u-s)<i?u=s:Math.abs(u-r)<i&&(u=r)}u<0&&(u=360+u),u%=360;let d=e.angle!==u;return e.angle=u,d}));function Gr(t,e){let i=e.canvas,r=t[i.uniScaleKey];return i.uniformScaling&&!r||!i.uniformScaling&&r}function Ur(t,e,i){let r=Qe(t,"lockScalingX"),s=Qe(t,"lockScalingY");if(r&&s||!e&&(r||s)&&i||r&&"x"===e||s&&"y"===e)return!0;let{width:n,height:o,strokeWidth:a}=t;return 0===n&&0===a&&"y"!==e||0===o&&0===a&&"x"!==e}const qr=["e","se","s","sw","w","nw","n","ne","e"],Kr=(t,e,i,r)=>{let s=Gr(t,i);return Ur(i,0!==e.x&&0===e.y?"x":0===e.x&&0!==e.y?"y":"",s)?qe:`${qr[ti(i,0,r)]}-resize`};function Jr(t,e,i,r,s={}){let n,o,a,l,h,c,u=e.target,d=s.by,g=Gr(t,u);if(Ur(u,d,g))return!1;if(e.gestureScale)o=e.scaleX*e.gestureScale,a=e.scaleY*e.gestureScale;else{if(n=ei(e,e.originX,e.originY,i,r),h="y"===d?1:Math.sign(n.x||e.signX||1),c="x"===d?1:Math.sign(n.y||e.signY||1),e.signX||(e.signX=h),e.signY||(e.signY=c),Qe(u,"lockScalingFlip")&&(e.signX!==h||e.signY!==c))return!1;if(l=u._getTransformedDimensions(),g&&!d){let t=Math.abs(n.x)+Math.abs(n.y),{original:i}=e,r=t/(Math.abs(l.x*i.scaleX/u.scaleX)+Math.abs(l.y*i.scaleY/u.scaleY));o=i.scaleX*r,a=i.scaleY*r}else o=Math.abs(n.x*u.scaleX/l.x),a=Math.abs(n.y*u.scaleY/l.y);Ke(e)&&(o*=2,a*=2),e.signX!==h&&"y"!==d&&(e.originX=Je(e.originX),o*=-1,e.signX=h),e.signY!==c&&"x"!==d&&(e.originY=Je(e.originY),a*=-1,e.signY=c)}let f=u.scaleX,p=u.scaleY;return d?("x"===d&&u.set("scaleX",o),"y"===d&&u.set("scaleY",a)):(!Qe(u,"lockScalingX")&&u.set("scaleX",o),!Qe(u,"lockScalingY")&&u.set("scaleY",a)),f!==u.scaleX||p!==u.scaleY}const Qr=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r))),Zr=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r,{by:"x"}))),ts=Lr(V,Ir((t,e,i,r)=>Jr(t,e,i,r,{by:"y"}))),es={x:{counterAxis:"y",scale:Q,skew:tt,lockSkewing:"lockSkewingX",origin:"originX",flip:"flipX"},y:{counterAxis:"x",scale:Z,skew:et,lockSkewing:"lockSkewingY",origin:"originY",flip:"flipY"}},is=["ns","nesw","ew","nwse"],rs=(t,e,i,r)=>0!==e.x&&Qe(i,"lockSkewingY")||0!==e.y&&Qe(i,"lockSkewingX")?qe:`${is[ti(i,0,r)%4]}-resize`;function ss(t,e,i,r,s){let{target:n}=i,{counterAxis:o,origin:a,lockSkewing:l,skew:h,flip:c}=es[t];if(Qe(n,l))return!1;let{origin:u,flip:d}=es[o],g=Ie(i[u])*(n[d]?-1:1),f=-Math.sign(g)*(n[c]?-1:1),p=-(0===n[h]&&ei(i,"center","center",r,s)[t]>0||n[h]>0?1:-1)*f*.5+.5;return Lr(G,Ir((e,i,r,s)=>function(t,{target:e,ex:i,ey:r,skewingSide:s,...n},o){let{skew:a}=es[t],l=o.subtract(new gt(i,r)).divide(new gt(e.scaleX,e.scaleY))[t],h=e[a],c=n[a],u=Math.tan(Dt(c)),d="y"===t?e._getTransformedDimensions({scaleX:1,scaleY:1,skewX:0}).x:e._getTransformedDimensions({scaleX:1,scaleY:1}).y,g=2*l*s/Math.max(d,1)+u,f=Mt(Math.atan(g));e.set(a,f);let p=h!==e[a];if(p&&"y"===t){let{skewX:t,scaleX:i}=e,r=e._getTransformedDimensions({skewY:h}),s=e._getTransformedDimensions(),n=0===t?1:r.x/s.x;1!==n&&e.set("scaleX",n*i)}return p}(t,i,new gt(r,s))))(e,{...i,[a]:p,skewingSide:f},r,s)}const ns=(t,e,i,r)=>ss("x",t,e,i,r),os=(t,e,i,r)=>ss("y",t,e,i,r);function as(t,e){return t[e.canvas.altActionKey]}const ls=(t,e,i)=>{let r=as(t,i);return 0===e.x?r?tt:Z:0===e.y?r?et:Q:""},hs=(t,e,i,r)=>as(t,i)?rs(0,e,i,r):Kr(t,e,i,r),cs=(t,e,i,r)=>as(t,e.target)?os(t,e,i,r):Zr(t,e,i,r),us=(t,e,i,r)=>as(t,e.target)?ns(t,e,i,r):ts(t,e,i,r),ds=()=>({ml:new Vr({x:-.5,y:0,cursorStyleHandler:hs,actionHandler:cs,getActionName:ls}),mr:new Vr({x:.5,y:0,cursorStyleHandler:hs,actionHandler:cs,getActionName:ls}),mb:new Vr({x:0,y:.5,cursorStyleHandler:hs,actionHandler:us,getActionName:ls}),mt:new Vr({x:0,y:-.5,cursorStyleHandler:hs,actionHandler:us,getActionName:ls}),tl:new Vr({x:-.5,y:-.5,cursorStyleHandler:Kr,actionHandler:Qr}),tr:new Vr({x:.5,y:-.5,cursorStyleHandler:Kr,actionHandler:Qr}),bl:new Vr({x:-.5,y:.5,cursorStyleHandler:Kr,actionHandler:Qr}),br:new Vr({x:.5,y:.5,cursorStyleHandler:Kr,actionHandler:Qr}),mtr:new Vr({x:0,y:-.5,actionHandler:Hr,cursorStyleHandler:zr,offsetY:-40,withConnection:!0,actionName:H})}),gs=()=>({mr:new Vr({x:.5,y:0,actionHandler:Xr,cursorStyleHandler:hs,actionName:U}),ml:new Vr({x:-.5,y:0,actionHandler:Xr,cursorStyleHandler:hs,actionName:U})}),fs=()=>({...ds(),...gs()});var ps=class t extends Ar{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,this.constructor.createControls(),t.ownDefaults),this.setOptions(e)}static createControls(){return{controls:ds()}}_updateCacheCanvas(){let t=this.canvas;if(this.noScaleCache&&t&&t._currentTransform){let e=t._currentTransform,i=e.target,r=e.action;if(this===i&&r&&r.startsWith("scale"))return!1}return super._updateCacheCanvas()}getActiveControl(){let t=this.__corner;return t?{key:t,control:this.controls[t],coord:this.oCoords[t]}:void 0}findControl(t,e=!1){if(!this.hasControls||!this.canvas)return;this.__corner=void 0;let i=Object.entries(this.oCoords);for(let r=i.length-1;r>=0;r--){let[s,n]=i[r],o=this.controls[s];if(o.shouldActivate(s,this,t,e?n.touchCorner:n.corner))return this.__corner=s,{key:s,control:o,coord:this.oCoords[s]}}}calcOCoords(){let t=this.getViewportTransform(),e=It(t),i=Rt(t),r=this.getCenterPoint(),s=At(At(t,At($t(r.x,r.y),Xt({angle:this.getTotalAngle()-(this.group&&this.flipX?180:0)}))),[1/e,0,0,1/i,0,0]),n=this.group?Bt(this.calcTransformMatrix()):void 0;n&&(n.scaleX=Math.abs(n.scaleX),n.scaleY=Math.abs(n.scaleY));let o=this._calculateCurrentDimensions(n),a={};return this.forEachControl((t,e)=>{let i=t.positionHandler(o,s,this,t);a[e]=Object.assign(i,this._calcCornerCoords(t,i))}),a}_calcCornerCoords(t,e){let i=this.getTotalAngle();return{corner:t.calcCornerCoords(i,this.cornerSize,e.x,e.y,!1,this),touchCorner:t.calcCornerCoords(i,this.touchCornerSize,e.x,e.y,!0,this)}}setCoords(){super.setCoords(),this.canvas&&(this.oCoords=this.calcOCoords())}forEachControl(t){for(let e in this.controls)t(this.controls[e],e,this)}drawSelectionBackground(t){if(!this.selectionBackgroundColor||this.canvas&&this.canvas._activeObject!==this)return;t.save();let e=this.getRelativeCenterPoint(),i=this._calculateCurrentDimensions(),r=this.getViewportTransform();t.translate(e.x,e.y),t.scale(1/r[0],1/r[3]),t.rotate(Dt(this.angle)),t.fillStyle=this.selectionBackgroundColor,t.fillRect(-i.x/2,-i.y/2,i.x,i.y),t.restore()}strokeBorders(t,e){t.strokeRect(-e.x/2,-e.y/2,e.x,e.y)}_drawBorders(t,e,i={}){let r={hasControls:this.hasControls,borderColor:this.borderColor,borderDashArray:this.borderDashArray,...i};t.save(),t.strokeStyle=r.borderColor,this._setLineDash(t,r.borderDashArray),this.strokeBorders(t,e),r.hasControls&&this.drawControlsConnectingLines(t,e),t.restore()}_renderControls(t,e={}){let{hasBorders:i,hasControls:r}=this,s={hasBorders:i,hasControls:r,...e},n=this.getViewportTransform(),o=s.hasBorders,a=s.hasControls,l=Bt(At(n,this.calcTransformMatrix()));t.save(),t.translate(l.translateX,l.translateY),t.lineWidth=this.borderScaleFactor,this.group===this.parent&&(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),this.flipX&&(l.angle-=180);let h=Lt(n);t.rotate(this.group?Dt(l.angle):Dt(this.angle)+h),o&&this.drawBorders(t,l,e),a&&this.drawControls(t,e),t.restore()}drawBorders(t,e,i){let r;if(i&&i.forActiveSelection||this.group){let t=je(this.width,this.height,zt(e)),i=this.isStrokeAccountedForInDimensions()?ft:(this.strokeUniform?(new gt).scalarAdd(this.canvas?this.canvas.getZoom():1):new gt(e.scaleX,e.scaleY)).scalarMultiply(this.strokeWidth);r=t.add(i).scalarAdd(this.borderScaleFactor).scalarAdd(2*this.padding)}else r=this._calculateCurrentDimensions().scalarAdd(this.borderScaleFactor);this._drawBorders(t,r,i)}drawControlsConnectingLines(t,e){let i=!1;t.beginPath(),this.forEachControl((r,s)=>{r.withConnection&&r.getVisibility(this,s)&&(i=!0,t.moveTo(r.x*e.x,r.y*e.y),t.lineTo(r.x*e.x+r.offsetX,r.y*e.y+r.offsetY))}),i&&t.stroke()}drawControls(t,e={}){t.save();let i=this.getCanvasRetinaScaling(),{cornerStrokeColor:r,cornerDashArray:s,cornerColor:n}=this,o={cornerStrokeColor:r,cornerDashArray:s,cornerColor:n,...e};t.setTransform(i,0,0,i,0,0),t.strokeStyle=t.fillStyle=o.cornerColor,this.transparentCorners||(t.strokeStyle=o.cornerStrokeColor),this._setLineDash(t,o.cornerDashArray),this.forEachControl((e,i)=>{if(e.getVisibility(this,i)){let r=this.oCoords[i];e.render(t,r.x,r.y,o,this)}}),t.restore()}isControlVisible(t){return this.controls[t]&&this.controls[t].getVisibility(this,t)}setControlVisible(t,e){this._controlsVisibility||(this._controlsVisibility={}),this._controlsVisibility[t]=e}setControlsVisibility(t={}){Object.entries(t).forEach(([t,e])=>this.setControlVisible(t,e))}clearContextTop(t){if(!this.canvas)return;let e=this.canvas.contextTop;if(!e)return;let i=this.canvas.viewportTransform;e.save(),e.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this.transform(e);let r=this.width+4,s=this.height+4;return e.clearRect(-r/2,-s/2,r,s),t||e.restore(),e}onDeselect(t){return!1}onSelect(t){return!1}shouldStartDragging(t){return!1}onDragStart(t){return!1}canDrop(t){return!1}renderDragSourceEffect(t){}renderDropTargetEffect(t){}};function ms(t,e){return e.forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(i=>{"constructor"!==i&&Object.defineProperty(t.prototype,i,Object.getOwnPropertyDescriptor(e.prototype,i)||Object.create(null))})}),t}p(ps,"ownDefaults",{noScaleCache:!0,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,cornerSize:13,touchCornerSize:24,transparentCorners:!0,cornerColor:"rgb(178,204,255)",cornerStrokeColor:"",cornerStyle:"rect",cornerDashArray:null,hasControls:!0,borderColor:"rgb(178,204,255)",borderDashArray:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,hasBorders:!0,selectionBackgroundColor:"",selectable:!0,evented:!0,perPixelTargetFind:!1,activeOn:"down",hoverCursor:null,moveCursor:null});var ys=class extends ps{};ms(ys,[bi]),at.setClass(ys),at.setClass(ys,"object");const bs=(t,e,i,r)=>{let s=2*(r=Math.round(r))+1,{data:n}=t.getImageData(e-r,i-r,s,s);for(let t=3;t<n.length;t+=4)if(n[t]>0)return!1;return!0};var _s=class{constructor(t){this.options=t,this.strokeProjectionMagnitude=this.options.strokeWidth/2,this.scale=new gt(this.options.scaleX,this.options.scaleY),this.strokeUniformScalar=this.options.strokeUniform?new gt(1/this.options.scaleX,1/this.options.scaleY):new gt(1,1)}createSideVector(t,e){let i=Xe(t,e);return this.options.strokeUniform?i.multiply(this.scale):i}projectOrthogonally(t,e,i){return this.applySkew(t.add(this.calcOrthogonalProjection(t,e,i)))}isSkewed(){return 0!==this.options.skewX||0!==this.options.skewY}applySkew(t){let e=new gt(t);return e.y+=e.x*Math.tan(Dt(this.options.skewY)),e.x+=e.y*Math.tan(Dt(this.options.skewX)),e}scaleUnitVector(t,e){return t.multiply(this.strokeUniformScalar).scalarMultiply(e)}};const vs=new gt;var xs=class t extends _s{static getOrthogonalRotationFactor(t,e){let i=e?We(t,e):Ne(t);return Math.abs(i)<P?-1:1}constructor(t,e,i,r){super(r),p(this,"AB",void 0),p(this,"AC",void 0),p(this,"alpha",void 0),p(this,"bisector",void 0),this.A=new gt(t),this.B=new gt(e),this.C=new gt(i),this.AB=this.createSideVector(this.A,this.B),this.AC=this.createSideVector(this.A,this.C),this.alpha=We(this.AB,this.AC),this.bisector=Ve($e(this.AB.eq(vs)?this.AC:this.AB,this.alpha/2))}calcOrthogonalProjection(e,i,r=this.strokeProjectionMagnitude){let s=ze(this.createSideVector(e,i)),n=t.getOrthogonalRotationFactor(s,this.bisector);return this.scaleUnitVector(s,r*n)}projectBevel(){let t=[];return(this.alpha%F===0?[this.B]:[this.B,this.C]).forEach(e=>{t.push(this.projectOrthogonally(this.A,e)),t.push(this.projectOrthogonally(this.A,e,-this.strokeProjectionMagnitude))}),t}projectMiter(){let t=[],e=Math.abs(this.alpha),i=1/Math.sin(e/2),r=this.scaleUnitVector(this.bisector,-this.strokeProjectionMagnitude*i),s=this.options.strokeUniform?Ye(this.scaleUnitVector(this.bisector,this.options.strokeMiterLimit)):this.options.strokeMiterLimit;return Ye(r)/this.strokeProjectionMagnitude<=s&&t.push(this.applySkew(this.A.add(r))),t.push(...this.projectBevel()),t}projectRoundNoSkew(e,i){let r=[],s=new gt(t.getOrthogonalRotationFactor(this.bisector),t.getOrthogonalRotationFactor(new gt(this.bisector.y,this.bisector.x)));return[new gt(1,0).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(s),new gt(0,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar).multiply(s)].forEach(t=>{Ue(t,e,i)&&r.push(this.A.add(t))}),r}projectRoundWithSkew(t,e){let i=[],{skewX:r,skewY:s,scaleX:n,scaleY:o,strokeUniform:a}=this.options,l=new gt(Math.tan(Dt(r)),Math.tan(Dt(s))),h=this.strokeProjectionMagnitude,c=a?h/o/Math.sqrt(1/o**2+1/n**2*l.y**2):h/Math.sqrt(1+l.y**2),u=new gt(Math.sqrt(Math.max(h**2-c**2,0)),c),d=a?h/Math.sqrt(1+l.x**2*(1/o)**2/(1/n+1/n*l.x*l.y)**2):h/Math.sqrt(1+l.x**2/(1+l.x*l.y)**2),g=new gt(d,Math.sqrt(Math.max(h**2-d**2,0)));return[g,g.scalarMultiply(-1),u,u.scalarMultiply(-1)].map(t=>this.applySkew(a?t.multiply(this.strokeUniformScalar):t)).forEach(r=>{Ue(r,t,e)&&i.push(this.applySkew(this.A).add(r))}),i}projectRound(){let t=[];t.push(...this.projectBevel());let e=this.alpha%F===0,i=this.applySkew(this.A),r=t[e?0:2].subtract(i),s=t[+!!e].subtract(i),n=He(r,e?this.applySkew(this.AB.scalarMultiply(-1)):this.applySkew(this.bisector.multiply(this.strokeUniformScalar).scalarMultiply(-1)))>0,o=n?r:s,a=n?s:r;return this.isSkewed()?t.push(...this.projectRoundWithSkew(o,a)):t.push(...this.projectRoundNoSkew(o,a)),t}projectPoints(){switch(this.options.strokeLineJoin){case"miter":return this.projectMiter();case"round":return this.projectRound();default:return this.projectBevel()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t,angle:this.alpha,bisector:this.bisector}))}},Cs=class extends _s{constructor(t,e,i){super(i),this.A=new gt(t),this.T=new gt(e)}calcOrthogonalProjection(t,e,i=this.strokeProjectionMagnitude){let r=this.createSideVector(t,e);return this.scaleUnitVector(ze(r),i)}projectButt(){return[this.projectOrthogonally(this.A,this.T,this.strokeProjectionMagnitude),this.projectOrthogonally(this.A,this.T,-this.strokeProjectionMagnitude)]}projectRound(){let t=[];if(!this.isSkewed()&&this.A.eq(this.T)){let e=new gt(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.applySkew(this.A.add(e)),this.applySkew(this.A.subtract(e)))}else t.push(...new xs(this.A,this.T,this.T,this.options).projectRound());return t}projectSquare(){let t=[];if(this.A.eq(this.T)){let e=new gt(1,1).scalarMultiply(this.strokeProjectionMagnitude).multiply(this.strokeUniformScalar);t.push(this.A.add(e),this.A.subtract(e))}else{let e=this.calcOrthogonalProjection(this.A,this.T,this.strokeProjectionMagnitude),i=this.scaleUnitVector(Ve(this.createSideVector(this.A,this.T)),-this.strokeProjectionMagnitude),r=this.A.add(i);t.push(r.add(e),r.subtract(e))}return t.map(t=>this.applySkew(t))}projectPoints(){switch(this.options.strokeLineCap){case"round":return this.projectRound();case"square":return this.projectSquare();default:return this.projectButt()}}project(){return this.projectPoints().map(t=>({originPoint:this.A,projectedPoint:t}))}};const ws=(t,e,i=!1)=>{let r=[];if(0===t.length)return r;let s=t.reduce((t,e)=>(t[t.length-1].eq(e)||t.push(new gt(e)),t),[new gt(t[0])]);if(1===s.length)i=!0;else if(!i){let t=s[0],e=((t,e)=>{for(let i=t.length-1;i>=0;i--)if(e(t[i]))return i;return-1})(s,e=>!e.eq(t));s.splice(e+1)}return s.forEach((t,s,n)=>{let o,a;0===s?(a=n[1],o=i?t:n[n.length-1]):s===n.length-1?(o=n[s-1],a=i?t:n[0]):(o=n[s-1],a=n[s+1]),i&&1===n.length?r.push(...new Cs(t,t,e).project()):!i||0!==s&&s!==n.length-1?r.push(...new xs(t,o,a,e).project()):r.push(...new Cs(t,0===s?a:o,e).project())}),r},Ss=t=>{let e={};return Object.keys(t).forEach(i=>{e[i]={},Object.keys(t[i]).forEach(r=>{e[i][r]={...t[i][r]}})}),e},Ts=(t,e,i=!1)=>t.fill!==e.fill||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth||t.fontSize!==e.fontSize||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.textDecorationThickness!==e.textDecorationThickness||t.textDecorationColor!==e.textDecorationColor||t.textBackgroundColor!==e.textBackgroundColor||t.deltaY!==e.deltaY||i&&(t.overline!==e.overline||t.underline!==e.underline||t.linethrough!==e.linethrough),Os=(t,e)=>{let i=e.split("\n"),r=[],s=-1,n={};t=Ss(t);for(let e=0;e<i.length;e++){let o=me(i[e]);if(t[e])for(let i=0;i<o.length;i++){s++;let o=t[e][i];o&&Object.keys(o).length>0&&(Ts(n,o,!0)?r.push({start:s,end:s+1,style:o}):r[r.length-1].end++),n=o||{}}else s+=o.length,n={}}return r},ks=(t,e)=>{if(!Array.isArray(t))return Ss(t);let i=e.split(W),r={},s=-1,n=0;for(let e=0;e<i.length;e++){let o=me(i[e]);for(let i=0;i<o.length;i++)s++,t[n]&&t[n].start<=s&&s<t[n].end&&(r[e]=r[e]||{},r[e][i]={...t[n].style},s===t[n].end-1&&n++)}return r},Ds=["display","transform",it,"fill-opacity","fill-rule","opacity",rt,"stroke-dasharray","stroke-linecap","stroke-dashoffset","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","id","paint-order","vector-effect","instantiated_by_use","clip-path"];function Ms(t,e){let i,r=t.nodeName,s=t.getAttribute("class"),n=t.getAttribute("id"),o="(?![a-zA-Z\\-]+)";if(i=RegExp("^"+r,"i"),e=e.replace(i,""),n&&e.length&&(i=RegExp("#"+n+o,"i"),e=e.replace(i,"")),s&&e.length){let t=s.split(" ");for(let r=t.length;r--;)i=RegExp("\\."+t[r]+o,"i"),e=e.replace(i,"")}return 0===e.length}function js(t,e){let i=!0,r=Ms(t,e.pop());return r&&e.length&&(i=function(t,e){let i,r=!0;for(;t.parentElement&&1===t.parentElement.nodeType&&e.length;)r&&(i=e.pop()),r=Ms(t=t.parentElement,i);return 0===e.length}(t,e)),r&&i&&0===e.length}function Es(t,e={}){let i={};for(let r in e)js(t,r.split(" "))&&(i={...i,...e[r]});return i}const Ps=t=>{var e;return null==(e=Ei[t])?t:e},As=RegExp(`(${Di})`,"gi"),Fs=`(${Di})`,Ls=String.raw`(skewX)\(${Fs}\)`,Is=String.raw`(skewY)\(${Fs}\)`,Rs=String.raw`(rotate)\(${Fs}(?: ${Fs} ${Fs})?\)`,Bs=String.raw`(scale)\(${Fs}(?: ${Fs})?\)`,$s=String.raw`(translate)\(${Fs}(?: ${Fs})?\)`,Xs=`(?:${String.raw`(matrix)\(${Fs} ${Fs} ${Fs} ${Fs} ${Fs} ${Fs}\)`}|${$s}|${Rs}|${Bs}|${Ls}|${Is})`,Ys=`(?:${Xs}*)`,Ws=String.raw`^\s*(?:${Ys}?)\s*$`,Ns=new RegExp(Ws),Vs=new RegExp(Xs),zs=new RegExp(Xs,"g");function Hs(t){let e=[];if(!(t=(t=>oi(t.replace(As," $1 ").replace(/,/gi," ")))(t).replace(/\s*([()])\s*/gi,"$1"))||t&&!Ns.test(t))return[...I];for(let i of t.matchAll(zs)){let t=Vs.exec(i[0]);if(!t)continue;let r=I,[,s,...n]=t.filter(t=>!!t),[o,a,l,h,c,u]=n.map(t=>parseFloat(t));switch(s){case"translate":r=$t(o,a);break;case H:r=Xt({angle:o},{x:a,y:l});break;case J:r=Yt(o,a);break;case tt:r=Nt(o);break;case et:r=Vt(o);break;case"matrix":r=[o,a,l,h,c,u]}e.push(r)}return Ft(e)}function Gs(t,e,i,r){let s,n=Array.isArray(e),o=e;if("fill"!==t&&"stroke"!==t||"none"!==e){if("strokeUniform"===t)return"non-scaling-stroke"===e;if("strokeDashArray"===t)o="none"===e?null:e.replace(/,/g," ").split(/\s+/).map(parseFloat);else if("transformMatrix"===t)o=i&&i.transformMatrix?At(i.transformMatrix,Hs(e)):Hs(e);else if("visible"===t)o="none"!==e&&"hidden"!==e,i&&!1===i.visible&&(o=!1);else if("opacity"===t)o=parseFloat(e),i&&void 0!==i.opacity&&(o*=i.opacity);else if("textAnchor"===t)o="start"===e?B:"end"===e?X:R;else if("charSpacing"===t||"textDecorationThickness"===t)s=pi(e,r)/r*1e3;else if("paintFirst"===t){let t=e.indexOf(it),i=e.indexOf(rt);o=it,(t>-1&&i>-1&&i<t||-1===t&&i>-1)&&(o=rt)}else{if("href"===t||"xlink:href"===t||"font"===t||"id"===t)return e;if("imageSmoothing"===t)return"optimizeQuality"===e;s=n?e.map(pi):pi(e,r)}}else o="";return!n&&isNaN(s)?o:s}function Us(t){let e={},i=t.getAttribute("style");return i&&("string"==typeof i?function(t,e){t.replace(/;\s*$/,"").split(";").forEach(t=>{if(!t)return;let[i,r]=t.split(":");e[i.trim().toLowerCase()]=r.trim()})}(i,e):function(t,e){Object.entries(t).forEach(([t,i])=>{void 0!==i&&(e[t.toLowerCase()]=i)})}(i,e)),e}const qs={stroke:"strokeOpacity",fill:"fillOpacity"};function Ks(t,e,i){if(!t)return{};let r,s={},n=16;t.parentNode&&Fi.test(t.parentNode.nodeName)&&(s=Ks(t.parentElement,e,i),s.fontSize&&(r=n=pi(s.fontSize)));let o={...e.reduce((e,i)=>{let r=t.getAttribute(i);return r&&(e[i]=r),e},{}),...Es(t,i),...Us(t)};o["clip-path"]&&t.setAttribute(Ai,o[Ai]),o["font-size"]&&(r=pi(o[Pi],n),o[Pi]=`${r}`);let a={};for(let t in o){let e=Ps(t);a[e]=Gs(e,o[t],s,r)}a&&a.font&&function(t,e){let i=t.match(ji);if(!i)return;let r=i[1],s=i[3],n=i[4],o=i[5],a=i[6];r&&(e.fontStyle=r),s&&(e.fontWeight=isNaN(parseFloat(s))?s:parseFloat(s)),n&&(e.fontSize=pi(n)),a&&(e.fontFamily=a),o&&(e.lineHeight="normal"===o?1:o)}(a.font,a);let l={...s,...a};return Fi.test(t.nodeName)?l:function(t){let e=ys.getDefaults();return Object.entries(qs).forEach(([i,r])=>{if(void 0===t[r]||""===t[i])return;if(void 0===t[i]){if(!e[i])return;t[i]=e[i]}if(0===t[i].indexOf("url("))return;let s=new gi(t[i]);t[i]=s.setAlpha(Qt(s.getAlpha()*t[r],2)).toRgba()}),t}(l)}const Js=["rx","ry"];var Qs=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e),this._initRxRy()}_initRxRy(){let{rx:t,ry:e}=this;t&&!e?this.ry=t:e&&!t&&(this.rx=e)}_render(t){let{width:e,height:i}=this,r=-e/2,s=-i/2,n=this.rx?Math.min(this.rx,e/2):0,o=this.ry?Math.min(this.ry,i/2):0,a=0!==n||0!==o;t.beginPath(),t.moveTo(r+n,s),t.lineTo(r+e-n,s),a&&t.bezierCurveTo(r+e-.4477152502*n,s,r+e,s+.4477152502*o,r+e,s+o),t.lineTo(r+e,s+i-o),a&&t.bezierCurveTo(r+e,s+i-.4477152502*o,r+e-.4477152502*n,s+i,r+e-n,s+i),t.lineTo(r+n,s+i),a&&t.bezierCurveTo(r+.4477152502*n,s+i,r,s+i-.4477152502*o,r,s+i-o),t.lineTo(r,s+o),a&&t.bezierCurveTo(r,s+.4477152502*o,r+.4477152502*n,s,r+n,s),t.closePath(),this._renderPaintInOrder(t)}toObject(t=[]){return super.toObject([...Js,...t])}_toSVG(){let{width:t,height:e,rx:i,ry:r}=this;return["<rect ","COMMON_PARTS",`x="${-t/2}" y="${-e/2}" rx="${fe(i)}" ry="${fe(r)}" width="${fe(t)}" height="${fe(e)}" />\n`]}static async fromElement(t,e,i){let{left:r=0,top:s=0,width:n=0,height:o=0,visible:a=!0,...l}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this({...e,...l,left:r,top:s,width:n,height:o,visible:!!(a&&n&&o)})}};p(Qs,"type","Rect"),p(Qs,"cacheProperties",[...Xi,...Js]),p(Qs,"ownDefaults",{rx:0,ry:0}),p(Qs,"ATTRIBUTE_NAMES",[...Ds,"x","y","rx","ry","width","height"]),at.setClass(Qs),at.setSVGClass(Qs);const Zs="initialization",tn="added",en=(t,e)=>{let{strokeUniform:i,strokeWidth:r,width:s,height:n,group:o}=e,a=o&&o!==t?Ee(o.calcTransformMatrix(),t.calcTransformMatrix()):null,l=a?e.getRelativeCenterPoint().transform(a):e.getRelativeCenterPoint(),h=!e.isStrokeAccountedForInDimensions(),c=i&&h?Ae(new gt(r,r),void 0,t.calcTransformMatrix()):ft,u=!i&&h?r:0,d=je(s+u,n+u,Ft([a,e.calcOwnMatrix()],!0)).add(c).scalarDivide(2);return[l.subtract(d),l.add(d)]};var rn=class{calcLayoutResult(t,e){if(this.shouldPerformLayout(t))return this.calcBoundingBox(e,t)}shouldPerformLayout({type:t,prevStrategy:e,strategy:i}){return"initialization"===t||"imperative"===t||!!e&&i!==e}shouldLayoutClipPath({type:t,target:{clipPath:e}}){return"initialization"!==t&&e&&!e.absolutePositioned}getInitialSize(t,e){return e.size}calcBoundingBox(t,e){let{type:i,target:r}=e;if("imperative"===i&&e.overrides)return e.overrides;if(0===t.length)return;let{left:s,top:n,width:o,height:a}=Se(t.map(t=>en(r,t)).reduce((t,e)=>t.concat(e),[])),l=new gt(o,a),h=new gt(s,n).add(l.scalarDivide(2));if("initialization"===i){let t=this.getInitialSize(e,{size:l,center:h});return{center:h,relativeCorrection:new gt(0,0),size:t}}return{center:h.transform(r.calcOwnMatrix()),size:l}}};p(rn,"type","strategy");var sn=class extends rn{shouldPerformLayout(t){return!0}};p(sn,"type","fit-content"),at.setClass(sn);const nn="layoutManager";var on=class{constructor(t=new sn){p(this,"strategy",void 0),this.strategy=t,this._subscriptions=new Map}performLayout(t){let e={bubbles:!0,strategy:this.strategy,...t,prevStrategy:this._prevLayoutStrategy,stopPropagation(){this.bubbles=!1}};this.onBeforeLayout(e);let i=this.getLayoutResult(e);i&&this.commitLayout(e,i),this.onAfterLayout(e,i),this._prevLayoutStrategy=e.strategy}attachHandlers(t,e){let{target:i}=e;return[st,N,U,z,V,G,K,q,"modifyPath"].map(e=>t.on(e,t=>this.performLayout("modified"===e?{type:"object_modified",trigger:e,e:t,target:i}:{type:"object_modifying",trigger:e,e:t,target:i})))}subscribe(t,e){this.unsubscribe(t,e);let i=this.attachHandlers(t,e);this._subscriptions.set(t,i)}unsubscribe(t,e){(this._subscriptions.get(t)||[]).forEach(t=>t()),this._subscriptions.delete(t)}unsubscribeTargets(t){t.targets.forEach(e=>this.unsubscribe(e,t))}subscribeTargets(t){t.targets.forEach(e=>this.subscribe(e,t))}onBeforeLayout(t){let{target:e,type:i}=t,{canvas:r}=e;if("initialization"===i||"added"===i?this.subscribeTargets(t):"removed"===i&&this.unsubscribeTargets(t),e.fire("layout:before",{context:t}),r&&r.fire("object:layout:before",{target:e,context:t}),"imperative"===i&&t.deep){let{strategy:i,...r}=t;e.forEachObject(t=>t.layoutManager&&t.layoutManager.performLayout({...r,bubbles:!1,target:t}))}}getLayoutResult(t){let{target:e,strategy:i,type:r}=t,s=i.calcLayoutResult(t,e.getObjects());if(!s)return;let n="initialization"===r?new gt:e.getRelativeCenterPoint(),{center:o,correction:a=new gt,relativeCorrection:l=new gt}=s;return{result:s,prevCenter:n,nextCenter:o,offset:n.subtract(o).add(a).transform("initialization"===r?I:Pt(e.calcOwnMatrix()),!0).add(l)}}commitLayout(t,e){let{target:i}=t,{result:{size:r},nextCenter:s}=e;var n,o;i.set({width:r.x,height:r.y}),this.layoutObjects(t,e),"initialization"===t.type?i.set({left:null==(n=t.x)?s.x+r.x*Ie(i.originX):n,top:null==(o=t.y)?s.y+r.y*Ie(i.originY):o}):(i.setPositionByOrigin(s,R,R),i.setCoords(),i.set("dirty",!0))}layoutObjects(t,e){let{target:i}=t;i.forEachObject(r=>{r.group===i&&this.layoutObject(t,e,r)}),t.strategy.shouldLayoutClipPath(t)&&this.layoutObject(t,e,i.clipPath)}layoutObject(t,{offset:e},i){i.set({left:i.left+e.x,top:i.top+e.y})}onAfterLayout(t,e){let{target:i,strategy:r,bubbles:s,prevStrategy:n,...o}=t,{canvas:a}=i;i.fire("layout:after",{context:t,result:e}),a&&a.fire("object:layout:after",{context:t,result:e,target:i});let l=i.parent;s&&null!=l&&l.layoutManager&&((o.path||(o.path=[])).push(i),l.layoutManager.performLayout({...o,target:l})),i.set("dirty",!0)}dispose(){let{_subscriptions:t}=this;t.forEach(t=>t.forEach(t=>t())),t.clear()}toObject(){return{type:nn,strategy:this.strategy.constructor.type}}toJSON(){return this.toObject()}};at.setClass(on,nn);var an=class extends on{performLayout(){}},ln=class t extends(mt(ys)){static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),p(this,"_activeObjects",[]),p(this,"__objectSelectionTracker",void 0),p(this,"__objectSelectionDisposer",void 0),Object.assign(this,t.ownDefaults),this.setOptions(i),this.groupInit(e,i)}groupInit(t,e){var i;this._objects=[...t],this.__objectSelectionTracker=this.__objectSelectionMonitor.bind(this,!0),this.__objectSelectionDisposer=this.__objectSelectionMonitor.bind(this,!1),this.forEachObject(t=>{this.enterGroup(t,!1)}),this.layoutManager=null==(i=e.layoutManager)?new on:i,this.layoutManager.performLayout({type:Zs,target:this,targets:[...t],x:e.left,y:e.top})}canEnterGroup(t){return t===this||this.isDescendantOf(t)?(b("error","Group: circular object trees are not supported, this call has no effect"),!1):-1===this._objects.indexOf(t)||(b("error","Group: duplicate objects are not supported inside group, this call has no effect"),!1)}_filterObjectsBeforeEnteringGroup(t){return t.filter((t,e,i)=>this.canEnterGroup(t)&&i.indexOf(t)===e)}add(...t){let e=this._filterObjectsBeforeEnteringGroup(t),i=super.add(...e);return this._onAfterObjectsChange(tn,e),i}insertAt(t,...e){let i=this._filterObjectsBeforeEnteringGroup(e),r=super.insertAt(t,...i);return this._onAfterObjectsChange(tn,i),r}remove(...t){let e=super.remove(...t);return this._onAfterObjectsChange("removed",e),e}_onObjectAdded(t){this.enterGroup(t,!0),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t,e){this.exitGroup(t,e),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onAfterObjectsChange(t,e){this.layoutManager.performLayout({type:t,targets:e,target:this})}_onStackOrderChanged(){this._set("dirty",!0)}_set(t,e){let i=this[t];return super._set(t,e),"canvas"===t&&i!==e&&(this._objects||[]).forEach(i=>{i._set(t,e)}),this}_shouldSetNestedCoords(){return this.subTargetCheck}removeAll(){return this._activeObjects=[],this.remove(...this._objects)}__objectSelectionMonitor(t,{target:e}){let i=this._activeObjects;if(t)i.push(e),this._set("dirty",!0);else if(i.length>0){let t=i.indexOf(e);t>-1&&(i.splice(t,1),this._set("dirty",!0))}}_watchObject(t,e){t&&this._watchObject(!1,e),t?(e.on("selected",this.__objectSelectionTracker),e.on("deselected",this.__objectSelectionDisposer)):(e.off("selected",this.__objectSelectionTracker),e.off("deselected",this.__objectSelectionDisposer))}enterGroup(t,e){t.group&&t.group.remove(t),t._set("parent",this),this._enterGroup(t,e)}_enterGroup(t,e){e&&ke(t,At(Pt(this.calcTransformMatrix()),t.calcTransformMatrix())),this._shouldSetNestedCoords()&&t.setCoords(),t._set("group",this),t._set("canvas",this.canvas),this._watchObject(!0,t);let i=this.canvas&&this.canvas.getActiveObject&&this.canvas.getActiveObject();i&&(i===t||t.isDescendantOf(i))&&this._activeObjects.push(t)}exitGroup(t,e){this._exitGroup(t,e),t._set("parent",void 0),t._set("canvas",void 0)}_exitGroup(t,e){t._set("group",void 0),e||(ke(t,At(this.calcTransformMatrix(),t.calcTransformMatrix())),t.setCoords()),this._watchObject(!1,t);let i=this._activeObjects.length>0?this._activeObjects.indexOf(t):-1;i>-1&&this._activeObjects.splice(i,1)}shouldCache(){let t=ys.prototype.shouldCache.call(this);if(t)for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow())return this.ownCaching=!1,!1;return t}willDrawShadow(){if(super.willDrawShadow())return!0;for(let t=0;t<this._objects.length;t++)if(this._objects[t].willDrawShadow())return!0;return!1}isOnACache(){return this.ownCaching||!!this.parent&&this.parent.isOnACache()}drawObject(t,e,i){this._renderBackground(t);for(let e=0;e<this._objects.length;e++){var r;let i=this._objects[e];null!=(r=this.canvas)&&r.preserveObjectStacking&&i.group!==this?(t.save(),t.transform(...Pt(this.calcTransformMatrix())),i.render(t),t.restore()):i.group===this&&i.render(t)}this._drawClipPath(t,this.clipPath,i)}setCoords(){super.setCoords(),this._shouldSetNestedCoords()&&this.forEachObject(t=>t.setCoords())}triggerLayout(t={}){this.layoutManager.performLayout({target:this,type:"imperative",...t})}render(t){this._transformDone=!0,super.render(t),this._transformDone=!1}__serializeObjects(t,e){let i=this.includeDefaultValues;return this._objects.filter(function(t){return!t.excludeFromExport}).map(function(r){let s=r.includeDefaultValues;r.includeDefaultValues=i;let n=r[t||"toObject"](e);return r.includeDefaultValues=s,n})}toObject(t=[]){let e=this.layoutManager.toObject();return{...super.toObject(["subTargetCheck","interactive",...t]),..."fit-content"!==e.strategy||this.includeDefaultValues?{layoutManager:e}:{},objects:this.__serializeObjects("toObject",t)}}toString(){return`#<Group: (${this.complexity()})>`}dispose(){this.layoutManager.unsubscribeTargets({targets:this.getObjects(),target:this}),this._activeObjects=[],this.forEachObject(t=>{this._watchObject(!1,t),t.dispose()}),super.dispose()}_createSVGBgRect(t){if(!this.backgroundColor)return"";let e=Qs.prototype._toSVG.call(this),i=e.indexOf("COMMON_PARTS");e[i]='for="group" ';let r=e.join("");return t?t(r):r}_toSVG(t){let e=["<g ","COMMON_PARTS"," >\n"],i=this._createSVGBgRect(t);i&&e.push("\t\t",i);for(let i=0;i<this._objects.length;i++)e.push("\t\t",this._objects[i].toSVG(t));return e.push("</g>\n"),e}getSvgStyles(){let t=void 0!==this.opacity&&1!==this.opacity?`opacity: ${fe(this.opacity)};`:"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")}toClipPathSVG(t){let e=[],i=this._createSVGBgRect(t);i&&e.push("\t",i);for(let i=0;i<this._objects.length;i++)e.push("\t",this._objects[i].toClipPathSVG(t));return this._createBaseClipPathSVGMarkup(e,{reviver:t})}static fromObject({type:t,objects:e=[],layoutManager:i,...r},s){return Promise.all([Ut(e,s),qt(r,s)]).then(([t,e])=>{let s=new this(t,{...r,...e,layoutManager:new an});return s.layoutManager=i?new(at.getClass(i.type))(new(at.getClass(i.strategy))):new on,s.layoutManager.subscribeTargets({type:Zs,target:s,targets:s.getObjects()}),s.setCoords(),s})}};p(ln,"type","Group"),p(ln,"ownDefaults",{strokeWidth:0,subTargetCheck:!1,interactive:!1}),at.setClass(ln);const hn=(t,e)=>t&&1===t.length?t[0]:new ln(t,e),cn=(t,e)=>Math.min(e.width/t.width,e.height/t.height),un=(t,e)=>Math.max(e.width/t.width,e.height/t.height),dn="\\s*,?\\s*",gn=`${dn}(${Di})`,fn=`${gn}${gn}${gn}${dn}([01])${dn}([01])${gn}${gn}`,pn={m:"l",M:"L"},mn=(t,e,i,r,s,n,o,a,l,h,c)=>{let u=ut(t),d=dt(t),g=ut(e),f=dt(e),p=i*s*g-r*n*f+o,m=r*s*g+i*n*f+a;return["C",h+l*(-i*s*d-r*n*u),c+l*(-r*s*d+i*n*u),p+l*(i*s*f+r*n*g),m+l*(r*s*f-i*n*g),p,m]},yn=(t,e,i,r)=>{let s=Math.atan2(e,t),n=Math.atan2(r,i);return n>=s?n-s:2*Math.PI-(s-n)};function bn(t,e,i,r,s,n,o,a){let l;if(y.cachesBoundsOfCurve&&(l=[...arguments].join(),M.boundsOfCurveCache[l]))return M.boundsOfCurveCache[l];let h=Math.sqrt,c=Math.abs,u=[],d=[[0,0],[0,0]],g=6*t-12*i+6*s,f=-3*t+9*i-9*s+3*o,p=3*i-3*t;for(let t=0;t<2;++t){if(t>0&&(g=6*e-12*r+6*n,f=-3*e+9*r-9*n+3*a,p=3*r-3*e),c(f)<1e-12){if(c(g)<1e-12)continue;let t=-p/g;0<t&&t<1&&u.push(t);continue}let i=g*g-4*p*f;if(i<0)continue;let s=h(i),o=(-g+s)/(2*f);0<o&&o<1&&u.push(o);let l=(-g-s)/(2*f);0<l&&l<1&&u.push(l)}let m=u.length,b=m,_=wn(t,e,i,r,s,n,o,a);for(;m--;){let{x:t,y:e}=_(u[m]);d[0][m]=t,d[1][m]=e}d[0][b]=t,d[1][b]=e,d[0][b+1]=o,d[1][b+1]=a;let v=[new gt(Math.min(...d[0]),Math.min(...d[1])),new gt(Math.max(...d[0]),Math.max(...d[1]))];return y.cachesBoundsOfCurve&&(M.boundsOfCurveCache[l]=v),v}const vn=(t,e,[i,r,s,n,o,a,l,h])=>{let c=((t,e,i,r,s,n,o)=>{if(0===i||0===r)return[];let a=0,l=0,h=0,c=Math.PI,u=o*L,d=dt(u),g=ut(u),f=.5*(-g*t-d*e),p=.5*(-g*e+d*t),m=i**2,y=r**2,b=p**2,_=f**2,v=m*y-m*b-y*_,x=Math.abs(i),C=Math.abs(r);if(v<0){let t=Math.sqrt(1-v/(m*y));x*=t,C*=t}else h=(s===n?-1:1)*Math.sqrt(v/(m*b+y*_));let w=h*x*p/C,S=-h*C*f/x,T=g*w-d*S+.5*t,O=d*w+g*S+.5*e,k=yn(1,0,(f-w)/x,(p-S)/C),D=yn((f-w)/x,(p-S)/C,(-f-w)/x,(-p-S)/C);0===n&&D>0?D-=2*c:1===n&&D<0&&(D+=2*c);let M=Math.ceil(Math.abs(D/c*2)),j=[],E=D/M,P=8/3*Math.sin(E/4)*Math.sin(E/4)/Math.sin(E/2),A=k+E;for(let t=0;t<M;t++)j[t]=mn(k,A,g,d,x,C,T,O,P,a,l),a=j[t][5],l=j[t][6],k=A,A+=E;return j})(l-t,h-e,r,s,o,a,n);for(let i=0,r=c.length;i<r;i++)c[i][1]+=t,c[i][2]+=e,c[i][3]+=t,c[i][4]+=e,c[i][5]+=t,c[i][6]+=e;return c},xn=t=>{let e,i=0,r=0,s=0,n=0,o=[],a=0,l=0;for(let h of t){let t,c=[...h];switch(c[0]){case"l":c[1]+=i,c[2]+=r;case"L":i=c[1],r=c[2],t=["L",i,r];break;case"h":c[1]+=i;case"H":i=c[1],t=["L",i,r];break;case"v":c[1]+=r;case"V":r=c[1],t=["L",i,r];break;case"m":c[1]+=i,c[2]+=r;case"M":i=c[1],r=c[2],s=c[1],n=c[2],t=["M",i,r];break;case"c":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r,c[5]+=i,c[6]+=r;case"C":a=c[3],l=c[4],i=c[5],r=c[6],t=["C",c[1],c[2],a,l,i,r];break;case"s":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r;case"S":"C"===e?(a=2*i-a,l=2*r-l):(a=i,l=r),i=c[3],r=c[4],t=["C",a,l,c[1],c[2],i,r],a=t[3],l=t[4];break;case"q":c[1]+=i,c[2]+=r,c[3]+=i,c[4]+=r;case"Q":a=c[1],l=c[2],i=c[3],r=c[4],t=["Q",a,l,i,r];break;case"t":c[1]+=i,c[2]+=r;case"T":"Q"===e?(a=2*i-a,l=2*r-l):(a=i,l=r),i=c[1],r=c[2],t=["Q",a,l,i,r];break;case"a":c[6]+=i,c[7]+=r;case"A":vn(i,r,c).forEach(t=>o.push(t)),i=c[6],r=c[7];break;case"z":case"Z":i=s,r=n,t=["Z"]}t?(o.push(t),e=t[0]):e=""}return o},Cn=(t,e,i,r)=>Math.sqrt((i-t)**2+(r-e)**2),wn=(t,e,i,r,s,n,o,a)=>l=>{let h=l**3,c=(t=>3*t**2*(1-t))(l),u=(t=>3*t*(1-t)**2)(l),d=(t=>(1-t)**3)(l);return new gt(o*h+s*c+i*u+t*d,a*h+n*c+r*u+e*d)},Sn=t=>t**2,Tn=t=>2*t*(1-t),On=t=>(1-t)**2,kn=(t,e,i,r,s,n,o,a)=>l=>{let h=Sn(l),c=Tn(l),u=On(l),d=3*(u*(i-t)+c*(s-i)+h*(o-s)),g=3*(u*(r-e)+c*(n-r)+h*(a-n));return Math.atan2(g,d)},Dn=(t,e,i,r,s,n)=>o=>{let a=Sn(o),l=Tn(o),h=On(o);return new gt(s*a+i*l+t*h,n*a+r*l+e*h)},Mn=(t,e,i,r,s,n)=>o=>{let a=1-o,l=2*(a*(i-t)+o*(s-i)),h=2*(a*(r-e)+o*(n-r));return Math.atan2(h,l)},jn=(t,e,i)=>{let r=new gt(e,i),s=0;for(let e=1;e<=100;e+=1){let i=t(e/100);s+=Cn(r.x,r.y,i.x,i.y),r=i}return s},En=t=>{let e,i,r=0,s=0,n=0,o=0,a=0,l=[];for(let h of t){let t={x:s,y:n,command:h[0],length:0};switch(h[0]){case"M":i=t,i.x=o=s=h[1],i.y=a=n=h[2];break;case"L":i=t,i.length=Cn(s,n,h[1],h[2]),s=h[1],n=h[2];break;case"C":e=wn(s,n,h[1],h[2],h[3],h[4],h[5],h[6]),i=t,i.iterator=e,i.angleFinder=kn(s,n,h[1],h[2],h[3],h[4],h[5],h[6]),i.length=jn(e,s,n),s=h[5],n=h[6];break;case"Q":e=Dn(s,n,h[1],h[2],h[3],h[4]),i=t,i.iterator=e,i.angleFinder=Mn(s,n,h[1],h[2],h[3],h[4]),i.length=jn(e,s,n),s=h[3],n=h[4];break;case"Z":i=t,i.destX=o,i.destY=a,i.length=Cn(s,n,o,a),s=o,n=a}r+=i.length,l.push(i)}return l.push({length:r,x:s,y:n}),l},Pn=(t,e,i=En(t))=>{let r=0;for(;e-i[r].length>0&&r<i.length-2;)e-=i[r].length,r++;let s=i[r],n=e/s.length,o=t[r];switch(s.command){case"M":return{x:s.x,y:s.y,angle:0};case"Z":return{...new gt(s.x,s.y).lerp(new gt(s.destX,s.destY),n),angle:Math.atan2(s.destY-s.y,s.destX-s.x)};case"L":return{...new gt(s.x,s.y).lerp(new gt(o[1],o[2]),n),angle:Math.atan2(o[2]-s.y,o[1]-s.x)};case"C":case"Q":return((t,e)=>{let i,r=0,s=0,n={x:t.x,y:t.y},o={...n},a=.01,l=0,h=t.iterator,c=t.angleFinder;for(;s<e&&a>1e-4;)o=h(r),l=r,i=Cn(n.x,n.y,o.x,o.y),i+s>e?(r-=a,a/=2):(n=o,r+=a,s+=i);return{...o,angle:c(l)}})(s,e)}},An=RegExp("[mzlhvcsqta][^mzlhvcsqta]*","gi"),Fn=new RegExp(fn,"g"),Ln=new RegExp(Di,"gi"),In={m:2,l:2,h:1,v:1,c:6,s:4,q:4,t:2,a:7},Rn=t=>{var e;let i=[],r=null==(e=t.match(An))?[]:e;for(let t of r){let e=t[0];if("z"===e||"Z"===e){i.push([e]);continue}let r=In[e.toLowerCase()],s=[];if("a"===e||"A"===e){let e;for(Fn.lastIndex=0;e=Fn.exec(t);)s.push(...e.slice(1))}else s=t.match(Ln)||[];for(let t=0;t<s.length;t+=r){let n=Array(r),o=pn[e];n[0]=t>0&&o?o:e;for(let e=0;e<r;e++)n[e+1]=parseFloat(s[t+e]);i.push(n)}}return i},Bn=(t,e=0)=>{let i,r=new gt(t[0]),s=new gt(t[1]),n=1,o=0,a=[],l=t.length,h=l>2;for(h&&(n=t[2].x<s.x?-1:t[2].x===s.x?0:1,o=t[2].y<s.y?-1:t[2].y===s.y?0:1),a.push(["M",r.x-n*e,r.y-o*e]),i=1;i<l;i++){if(!r.eq(s)){let t=r.midPointFrom(s);a.push(["Q",r.x,r.y,t.x,t.y])}r=t[i],i+1<t.length&&(s=t[i+1])}return h&&(n=r.x>t[i-2].x?1:r.x===t[i-2].x?0:-1,o=r.y>t[i-2].y?1:r.y===t[i-2].y?0:-1),a.push(["L",r.x+n*e,r.y+o*e]),a},$n=(t,e,i)=>(i&&(e=At(e,[1,0,0,1,-i.x,-i.y])),t.map(t=>{let i=[...t];for(let r=1;r<t.length-1;r+=2){let{x:s,y:n}=Et({x:t[r],y:t[r+1]},e);i[r]=s,i[r+1]=n}return i})),Xn=(t,e)=>{let i=2*Math.PI/t,r=-P;t%2==0&&(r+=i/2);let s=Array(t+1);for(let n=0;n<t;n++){let t=n*i+r,{x:o,y:a}=new gt(ut(t),dt(t)).scalarMultiply(e);s[n]=[0===n?"M":"L",o,a]}return s[t]=["Z"],s},Yn=(t,e)=>t.map(t=>t.map((t,i)=>0===i||void 0===e?t:Qt(t,e)).join(" ")).join(" "),Wn=(t,e)=>{var i;let r=t,s=e;r.inverted&&!s.inverted&&(r=e,s=t),Fe(s,null==(i=s.group)?void 0:i.calcTransformMatrix(),r.calcTransformMatrix());let n=r.inverted&&s.inverted;return n&&(r.inverted=s.inverted=!1),new ln([r],{clipPath:s,inverted:n})},Nn=(t,e)=>Math.floor(Math.random()*(e-t+1))+t,Vn=(t,e)=>{let i=t._findCenterFromElement();t.transformMatrix&&((t=>{if(t.transformMatrix){let{scaleX:e,scaleY:i,angle:r,skewX:s}=Bt(t.transformMatrix);t.flipX=!1,t.flipY=!1,t.set(Q,e),t.set(Z,i),t.angle=r,t.skewX=s,t.skewY=0}})(t),i=i.transform(t.transformMatrix)),delete t.transformMatrix,e&&(t.scaleX*=e.scaleX,t.scaleY*=e.scaleY,t.cropX=e.cropX,t.cropY=e.cropY,i.x+=e.offsetLeft,i.y+=e.offsetTop,t.width=e.width,t.height=e.height),t.setPositionByOrigin(i,R,R)};function zn(t,e){let i=t.style;i&&Object.entries(e).forEach(([t,e])=>i.setProperty(t,e))}d({addTransformToObject:()=>Oe,animate:()=>Mr,animateColor:()=>jr,applyTransformToObject:()=>ke,calcAngleBetweenVectors:()=>We,calcDimensionsMatrix:()=>zt,calcPlaneChangeMatrix:()=>Ee,calcVectorRotation:()=>Ne,cancelAnimFrame:()=>_t,capValue:()=>Bi,composeMatrix:()=>Ht,copyCanvasElement:()=>St,cos:()=>ut,createCanvasElement:()=>Ct,createImage:()=>wt,createRotateMatrix:()=>Xt,createScaleMatrix:()=>Yt,createSkewXMatrix:()=>Nt,createSkewYMatrix:()=>Vt,createTranslateMatrix:()=>$t,createVector:()=>Xe,crossProduct:()=>He,degreesToRadians:()=>Dt,dotProduct:()=>Ge,ease:()=>Wi,enlivenObjectEnlivables:()=>qt,enlivenObjects:()=>Ut,findScaleToCover:()=>un,findScaleToFit:()=>cn,getBoundsOfCurve:()=>bn,getOrthonormalVector:()=>ze,getPathSegmentsInfo:()=>En,getPointOnPath:()=>Pn,getPointer:()=>xe,getRandomInt:()=>Nn,getRegularPolygonPath:()=>Xn,getSmoothPathFromPoints:()=>Bn,getSvgAttributes:()=>fi,getUnitVector:()=>Ve,groupSVGElements:()=>hn,hasStyleChanged:()=>Ts,invertTransform:()=>Pt,isBetweenVectors:()=>Ue,isIdentityMatrix:()=>jt,isTouchEvent:()=>Ce,isTransparent:()=>bs,joinPath:()=>Yn,loadImage:()=>Gt,magnitude:()=>Ye,makeBoundingBoxFromPoints:()=>Se,makePathSimpler:()=>xn,matrixToSVG:()=>Zt,mergeClipPaths:()=>Wn,multiplyTransformMatrices:()=>At,multiplyTransformMatrixArray:()=>Ft,parsePath:()=>Rn,parsePreserveAspectRatioAttribute:()=>mi,parseUnit:()=>pi,pick:()=>Kt,projectStrokeOnPoints:()=>ws,qrDecompose:()=>Bt,radiansToDegrees:()=>Mt,removeFromArray:()=>ct,removeTransformFromObject:()=>Te,removeTransformMatrixForSvgParsing:()=>Vn,requestAnimFrame:()=>bt,resetObjectTransform:()=>De,rotateVector:()=>$e,saveObjectTransform:()=>Me,sendObjectToPlane:()=>Fe,sendPointToPlane:()=>Pe,sendVectorToPlane:()=>Ae,sin:()=>dt,sizeAfterTransform:()=>je,string:()=>de,stylesFromArray:()=>ks,stylesToArray:()=>Os,toBlob:()=>kt,toDataURL:()=>Ot,toFixed:()=>Qt,transformPath:()=>$n,transformPoint:()=>Et});var Hn=class extends ce{constructor(t,{allowTouchScrolling:e=!1,containerClass:i=""}={}){super(t),p(this,"upper",void 0),p(this,"container",void 0);let{el:r}=this.lower,s=this.createUpperCanvas();this.upper={el:s,ctx:s.getContext("2d")},this.applyCanvasStyle(r,{allowTouchScrolling:e}),this.applyCanvasStyle(s,{allowTouchScrolling:e,styles:{position:"absolute",left:"0",top:"0"}});let n=this.createContainerElement();n.classList.add(i),r.parentNode&&r.parentNode.replaceChild(n,r),n.append(r,s),this.container=n}createUpperCanvas(){let{el:t}=this.lower,e=Ct();return e.className=t.className,e.classList.remove("lower-canvas"),e.classList.add("upper-canvas"),e.setAttribute("data-fabric","top"),e.style.cssText=t.style.cssText,e.setAttribute("draggable","true"),e}createContainerElement(){let t=O().createElement("div");return t.setAttribute("data-fabric","wrapper"),zn(t,{position:"relative"}),he(t),t}applyCanvasStyle(t,e){let{styles:i,allowTouchScrolling:r}=e;zn(t,{...i,"touch-action":r?"manipulation":Y}),he(t)}setDimensions(t,e){super.setDimensions(t,e);let{el:i,ctx:r}=this.upper;ae(i,r,t,e)}setCSSDimensions(t){super.setCSSDimensions(t),le(this.upper.el,t),le(this.container,t)}cleanupDOM(t){let e=this.container,{el:i}=this.lower,{el:r}=this.upper;super.cleanupDOM(t),e.removeChild(r),e.removeChild(i),e.parentNode&&e.parentNode.replaceChild(i,e)}dispose(){super.dispose(),T().dispose(this.upper.el),delete this.upper,delete this.container}};const Gn=(t,e,i,r)=>{let{target:s,offsetX:n,offsetY:o}=e,a=i-n,l=r-o,h=!Qe(s,"lockMovementX")&&s.left!==a,c=!Qe(s,"lockMovementY")&&s.top!==l;return h&&s.set("left",a),c&&s.set("top",l),(h||c)&&Fr(N,Ze(t,e,i,r)),h||c},Un=q,qn=t=>function(e,i,r){let{points:s,pathOffset:n}=r;return new gt(s[t]).subtract(n).transform(At(r.getViewportTransform(),r.calcTransformMatrix()))},Kn=(t,e,i,r)=>{let{target:s,pointIndex:n}=e,o=s,a=Pe(new gt(i,r),void 0,o.calcOwnMatrix());return o.points[n]=a.add(o.pathOffset),o.setDimensions(),o.set("dirty",!0),!0},Jn=(t,e)=>function(i,r,s,n){let o=r.target,a=new gt(o.points[(t>0?t:o.points.length)-1]),l=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()),h=e(i,{...r,pointIndex:t},s,n),c=a.subtract(o.pathOffset).transform(o.calcOwnMatrix()).subtract(l);return o.left-=c.x,o.top-=c.y,h},Qn=t=>Lr(Un,Jn(t,Kn));function Zn(t,e={}){let i={};for(let r=0;r<("number"==typeof t?t:t.points.length);r++)i[`p${r}`]=new Vr({actionName:Un,positionHandler:qn(r),actionHandler:Qn(r),...e});return i}const to=(t,e,i)=>{let{path:r,pathOffset:s}=t,n=r[e];return new gt(n[i]-s.x,n[i+1]-s.y).transform(At(t.getViewportTransform(),t.calcTransformMatrix()))};function eo(t,e,i){let{commandIndex:r,pointIndex:s}=this;return to(i,r,s)}function io(t,e,i,r){let{target:s}=e,{commandIndex:n,pointIndex:o}=this,a=((t,e,i,r,s)=>{let{path:n,pathOffset:o}=t,a=n[(r>0?r:n.length)-1],l=new gt(a[s],a[s+1]),h=l.subtract(o).transform(t.calcOwnMatrix()),c=Pe(new gt(e,i),void 0,t.calcOwnMatrix());n[r][s]=c.x+o.x,n[r][s+1]=c.y+o.y,t.setDimensions();let u=l.subtract(t.pathOffset).transform(t.calcOwnMatrix()).subtract(h);return t.left-=u.x,t.top-=u.y,t.set("dirty",!0),!0})(s,i,r,n,o);return a&&Fr(this.actionName,{...Ze(t,e,i,r),commandIndex:n,pointIndex:o}),a}var ro=class extends Vr{constructor(t){super(t)}render(t,e,i,r,s){let n={...r,cornerColor:this.controlFill,cornerStrokeColor:this.controlStroke,transparentCorners:!this.controlFill};super.render(t,e,i,n,s)}},so=class extends ro{constructor(t){super(t)}render(t,e,i,r,s){let{path:n}=s,{commandIndex:o,pointIndex:a,connectToCommandIndex:l,connectToPointIndex:h}=this;t.save(),t.strokeStyle=this.controlStroke,this.connectionDashArray&&t.setLineDash(this.connectionDashArray);let[c]=n[o],u=to(s,l,h);if("Q"===c){let r=to(s,o,a+2);t.moveTo(r.x,r.y),t.lineTo(e,i)}else t.moveTo(e,i);t.lineTo(u.x,u.y),t.stroke(),t.restore(),super.render(t,e,i,r,s)}};const no=(t,e,i,r,s,n)=>new(i?so:ro)({commandIndex:t,pointIndex:e,actionName:"modifyPath",positionHandler:eo,actionHandler:io,connectToCommandIndex:s,connectToPointIndex:n,...r,...i?r.controlPointStyle:r.pointStyle});function oo(t,e={}){let i={},r="M";return t.path.forEach((t,s)=>{let n=t[0];switch("Z"!==n&&(i[`c_${s}_${n}`]=no(s,t.length-2,!1,e)),n){case"C":i[`c_${s}_C_CP_1`]=no(s,1,!0,e,s-1,(t=>"C"===t?5:"Q"===t?3:1)(r)),i[`c_${s}_C_CP_2`]=no(s,3,!0,e,s,5);break;case"Q":i[`c_${s}_Q_CP_1`]=no(s,1,!0,e,s,3)}r=n}),i}d({changeHeight:()=>Yr,changeObjectHeight:()=>$r,changeObjectWidth:()=>Br,changeWidth:()=>Xr,createObjectDefaultControls:()=>ds,createPathControls:()=>oo,createPolyActionHandler:()=>Qn,createPolyControls:()=>Zn,createPolyPositionHandler:()=>qn,createResizeControls:()=>gs,createTextboxDefaultControls:()=>fs,dragHandler:()=>Gn,factoryPolyActionHandler:()=>Jn,getLocalPoint:()=>ei,polyActionHandler:()=>Kn,renderCircleControl:()=>Wr,renderSquareControl:()=>Nr,rotationStyleHandler:()=>zr,rotationWithSnapping:()=>Hr,scaleCursorStyleHandler:()=>Kr,scaleOrSkewActionName:()=>ls,scaleSkewCursorStyleHandler:()=>hs,scalingEqually:()=>Qr,scalingX:()=>Zr,scalingXOrSkewingY:()=>cs,scalingY:()=>ts,scalingYOrSkewingX:()=>us,skewCursorStyleHandler:()=>rs,skewHandlerX:()=>ns,skewHandlerY:()=>os,wrapWithFireEvent:()=>Lr,wrapWithFixedAnchor:()=>Ir});var ao=class t extends _e{constructor(...t){super(...t),p(this,"_hoveredTargets",[]),p(this,"_currentTransform",null),p(this,"_groupSelector",null),p(this,"contextTopDirty",!1)}static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}get upperCanvasEl(){var t;return null==(t=this.elements.upper)?void 0:t.el}get contextTop(){var t;return null==(t=this.elements.upper)?void 0:t.ctx}get wrapperEl(){return this.elements.container}initElements(t){this.elements=new Hn(t,{allowTouchScrolling:this.allowTouchScrolling,containerClass:this.containerClass}),this._createCacheCanvas()}_onObjectAdded(t){this._objectsToRender=void 0,super._onObjectAdded(t)}_onObjectRemoved(t){this._objectsToRender=void 0,t===this._activeObject&&(this.fire("before:selection:cleared",{deselected:[t]}),this._discardActiveObject(),this.fire("selection:cleared",{deselected:[t]}),t.fire("deselected",{target:t})),t===this._hoveredTarget&&(this._hoveredTarget=void 0,this._hoveredTargets=[]),super._onObjectRemoved(t)}_onStackOrderChanged(){this._objectsToRender=void 0,super._onStackOrderChanged()}_chooseObjectsToRender(){let t=this._activeObject;return!this.preserveObjectStacking&&t?this._objects.filter(e=>!e.group&&e!==t).concat(t):this._objects}renderAll(){this.cancelRequestedRender(),this.destroyed||(!this.contextTopDirty||this._groupSelector||this.isDrawingMode||(this.clearContext(this.contextTop),this.contextTopDirty=!1),this.hasLostContext&&(this.renderTopLayer(this.contextTop),this.hasLostContext=!1),!this._objectsToRender&&(this._objectsToRender=this._chooseObjectsToRender()),this.renderCanvas(this.getContext(),this._objectsToRender))}renderTopLayer(t){t.save(),this.isDrawingMode&&this._isCurrentlyDrawing&&(this.freeDrawingBrush&&this.freeDrawingBrush._render(),this.contextTopDirty=!0),this.selection&&this._groupSelector&&(this._drawSelection(t),this.contextTopDirty=!0),t.restore()}renderTop(){let t=this.contextTop;this.clearContext(t),this.renderTopLayer(t),this.fire("after:render",{ctx:t})}setTargetFindTolerance(t){t=Math.round(t),this.targetFindTolerance=t;let e=this.getRetinaScaling(),i=Math.ceil((2*t+1)*e);this.pixelFindCanvasEl.width=this.pixelFindCanvasEl.height=i,this.pixelFindContext.scale(e,e)}isTargetTransparent(t,e,i){let r=this.targetFindTolerance,s=this.pixelFindContext;this.clearContext(s),s.save(),s.translate(-e+r,-i+r),s.transform(...this.viewportTransform);let n=t.selectionBackgroundColor;t.selectionBackgroundColor="",t.render(s),t.selectionBackgroundColor=n,s.restore();let o=Math.round(r*this.getRetinaScaling());return bs(s,o,o,o)}_isSelectionKeyPressed(t){let e=this.selectionKey;return!!e&&(Array.isArray(e)?!!e.find(e=>!!e&&!0===t[e]):t[e])}_shouldClearSelection(t,e){let i=this.getActiveObjects(),r=this._activeObject;return!!(!e||e&&r&&i.length>1&&-1===i.indexOf(e)&&r!==e&&!this._isSelectionKeyPressed(t)||e&&!e.evented||e&&!e.selectable&&r&&r!==e)}_shouldCenterTransform(t,e,i){if(!t)return;let r;return"scale"===e||"scaleX"===e||"scaleY"===e||"resizing"===e?r=this.centeredScaling||t.centeredScaling:"rotate"===e&&(r=this.centeredRotation||t.centeredRotation),r?!i:i}_getOriginFromCorner(t,e){let i=e?t.controls[e].getTransformAnchorPoint():{x:t.originX,y:t.originY};return e?(["ml","tl","bl"].includes(e)?i.x=X:["mr","tr","br"].includes(e)&&(i.x=B),["tl","mt","tr"].includes(e)?i.y=$:["bl","mb","br"].includes(e)&&(i.y="top"),i):i}_setupCurrentTransform(t,e,i){var r;let s=e.group?Pe(this.getScenePoint(t),void 0,e.group.calcTransformMatrix()):this.getScenePoint(t),{key:n="",control:o}=e.getActiveControl()||{},a=i&&o?null==(r=o.getActionHandler(t,e,o))?void 0:r.bind(o):Gn,l=((t,e,i,r)=>{if(!e||!t)return"drag";let s=r.controls[e];return s.getActionName(i,s,r)})(i,n,t,e),h=t[this.centeredKey],c=this._shouldCenterTransform(e,l,h)?{x:R,y:R}:this._getOriginFromCorner(e,n),{scaleX:u,scaleY:d,skewX:g,skewY:f,left:p,top:m,angle:y,width:b,height:_,cropX:v,cropY:x}=e,C={target:e,action:l,actionHandler:a,actionPerformed:!1,corner:n,scaleX:u,scaleY:d,skewX:g,skewY:f,offsetX:s.x-p,offsetY:s.y-m,originX:c.x,originY:c.y,ex:s.x,ey:s.y,lastX:s.x,lastY:s.y,theta:Dt(y),width:b,height:_,shiftKey:t.shiftKey,altKey:h,original:{...Me(e),originX:c.x,originY:c.y,cropX:v,cropY:x}};this._currentTransform=C,this.fire("before:transform",{e:t,transform:C})}setCursor(t){this.upperCanvasEl.style.cursor=t}_drawSelection(t){let{x:e,y:i,deltaX:r,deltaY:s}=this._groupSelector,n=new gt(e,i).transform(this.viewportTransform),o=new gt(e+r,i+s).transform(this.viewportTransform),a=this.selectionLineWidth/2,l=Math.min(n.x,o.x),h=Math.min(n.y,o.y),c=Math.max(n.x,o.x),u=Math.max(n.y,o.y);this.selectionColor&&(t.fillStyle=this.selectionColor,t.fillRect(l,h,c-l,u-h)),this.selectionLineWidth&&this.selectionBorderColor&&(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,l+=a,h+=a,c-=a,u-=a,ys.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(l,h,c-l,u-h))}findTarget(t){if(this._targetInfo)return this._targetInfo;if(this.skipTargetFind)return{subTargets:[],currentSubTargets:[]};let e=this.getScenePoint(t),i=this._activeObject,r=this.getActiveObjects(),s=this.searchPossibleTargets(this._objects,e),{subTargets:n,container:o,target:a}=s,l={...s,currentSubTargets:n,currentContainer:o,currentTarget:a};if(!i)return l;let h={...this.searchPossibleTargets([i],e),currentSubTargets:n,currentContainer:o,currentTarget:a};return i.findControl(this.getViewportPoint(t),Ce(t))?{...h,target:i}:h.target&&(r.length>1||!this.preserveObjectStacking||this.preserveObjectStacking&&t[this.altSelectionKey])?h:l}_pointIsInObjectSelectionArea(t,e){let i=t.getCoords(),r=this.getZoom(),s=t.padding/r;if(s){let[t,e,r,n]=i,o=Math.atan2(e.y-t.y,e.x-t.x),a=ut(o)*s,l=dt(o)*s,h=a+l,c=a-l;i=[new gt(t.x-c,t.y-h),new gt(e.x+h,e.y-c),new gt(r.x+c,r.y+h),new gt(n.x-h,n.y+c)]}return Er.isPointInPolygon(e,i)}_checkTarget(t,e){if(t&&t.visible&&t.evented&&this._pointIsInObjectSelectionArea(t,e)){if(!this.perPixelTargetFind&&!t.perPixelTargetFind||t.isEditing)return!0;{let i=e.transform(this.viewportTransform);if(!this.isTargetTransparent(t,i.x,i.y))return!0}}return!1}_searchPossibleTargets(t,e,i){let r=t.length;for(;r--;){let s=t[r];if(this._checkTarget(s,e)){if(pt(s)&&s.subTargetCheck){let{target:t}=this._searchPossibleTargets(s._objects,e,i);t&&i.push(t)}return{target:s,subTargets:i}}}return{subTargets:[]}}searchPossibleTargets(t,e){let i=this._searchPossibleTargets(t,e,[]);i.container=i.target;let{container:r,subTargets:s}=i;if(r&&pt(r)&&r.interactive&&s[0]){for(let t=s.length-1;t>0;t--){let e=s[t];if(!pt(e)||!e.interactive)return i.target=e,i}return i.target=s[0],i}return i}getViewportPoint(t){return this._viewportPoint?this._viewportPoint:this._getPointerImpl(t,!0)}getScenePoint(t){return this._scenePoint?this._scenePoint:this._getPointerImpl(t)}_getPointerImpl(t,e=!1){let i=this.upperCanvasEl,r=i.getBoundingClientRect(),s=xe(t),n=r.width||0,o=r.height||0;n&&o||("top"in r&&"bottom"in r&&(o=Math.abs(r.top-r.bottom)),"right"in r&&"left"in r&&(n=Math.abs(r.right-r.left))),this.calcOffset(),s.x-=this._offset.left,s.y-=this._offset.top,e||(s=Pe(s,void 0,this.viewportTransform));let a=this.getRetinaScaling();1!==a&&(s.x/=a,s.y/=a);let l=0===n||0===o?new gt(1,1):new gt(i.width/n,i.height/o);return s.multiply(l)}_setDimensionsImpl(t,e){this._resetTransformEventData(),super._setDimensionsImpl(t,e),this._isCurrentlyDrawing&&this.freeDrawingBrush&&this.freeDrawingBrush._setBrushStyles(this.contextTop)}_createCacheCanvas(){this.pixelFindCanvasEl=Ct(),this.pixelFindContext=this.pixelFindCanvasEl.getContext("2d",{willReadFrequently:!0}),this.setTargetFindTolerance(this.targetFindTolerance)}getTopContext(){return this.elements.upper.ctx}getSelectionContext(){return this.elements.upper.ctx}getSelectionElement(){return this.elements.upper.el}getActiveObject(){return this._activeObject}getActiveObjects(){let t=this._activeObject;return re(t)?t.getObjects():t?[t]:[]}_fireSelectionEvents(t,e){let i=!1,r=!1,s=this.getActiveObjects(),n=[],o=[];t.forEach(t=>{s.includes(t)||(i=!0,t.fire("deselected",{e,target:t}),o.push(t))}),s.forEach(r=>{t.includes(r)||(i=!0,r.fire("selected",{e,target:r}),n.push(r))}),t.length>0&&s.length>0?(r=!0,i&&this.fire("selection:updated",{e,selected:n,deselected:o})):s.length>0?(r=!0,this.fire("selection:created",{e,selected:n})):t.length>0&&(r=!0,this.fire("selection:cleared",{e,deselected:o})),r&&(this._objectsToRender=void 0)}setActiveObject(t,e){let i=this.getActiveObjects(),r=this._setActiveObject(t,e);return this._fireSelectionEvents(i,e),r}_setActiveObject(t,e){let i=this._activeObject;return!(i===t||!this._discardActiveObject(e,t)&&this._activeObject||t.onSelect({e})||(this._activeObject=t,re(t)&&i!==t&&t.set("canvas",this),t.setCoords(),0))}_discardActiveObject(t,e){let i=this._activeObject;return!!i&&!i.onDeselect({e:t,object:e})&&(this._currentTransform&&this._currentTransform.target===i&&this.endCurrentTransform(t),re(i)&&i===this._hoveredTarget&&(this._hoveredTarget=void 0),this._activeObject=void 0,!0)}discardActiveObject(t){let e=this.getActiveObjects(),i=this.getActiveObject();e.length&&this.fire("before:selection:cleared",{e:t,deselected:[i]});let r=this._discardActiveObject(t);return this._fireSelectionEvents(e,t),r}endCurrentTransform(t){let e=this._currentTransform;this._finalizeCurrentTransform(t),e&&e.target&&(e.target.isMoving=!1),this._currentTransform=null}_finalizeCurrentTransform(t){let e=this._currentTransform,i=e.target,r={e:t,target:i,transform:e,action:e.action};i._scaling&&(i._scaling=!1),i.setCoords(),e.actionPerformed&&(this.fire("object:modified",r),i.fire(st,r))}setViewportTransform(t){super.setViewportTransform(t);let e=this._activeObject;e&&e.setCoords()}destroy(){let t=this._activeObject;re(t)&&(t.removeAll(),t.dispose()),delete this._activeObject,super.destroy(),this.pixelFindContext=null,this.pixelFindCanvasEl=void 0}clear(){this.discardActiveObject(),this._activeObject=void 0,this.clearContext(this.contextTop),super.clear()}drawControls(t){let e=this._activeObject;e&&e._renderControls(t)}_toObject(t,e,i){let r=this._realizeGroupTransformOnObject(t),s=super._toObject(t,e,i);return t.set(r),s}_realizeGroupTransformOnObject(t){let{group:e}=t;if(e&&re(e)&&this._activeObject===e){let i=Kt(t,["angle","flipX","flipY",B,Q,Z,tt,et,"top"]);return Oe(t,e.calcOwnMatrix()),i}return{}}_setSVGObject(t,e,i){let r=this._realizeGroupTransformOnObject(e);super._setSVGObject(t,e,i),e.set(r)}};p(ao,"ownDefaults",{uniformScaling:!0,uniScaleKey:"shiftKey",centeredScaling:!1,centeredRotation:!1,centeredKey:"altKey",altActionKey:"shiftKey",selection:!0,selectionKey:"shiftKey",selectionColor:"rgba(100, 100, 255, 0.3)",selectionDashArray:[],selectionBorderColor:"rgba(255, 255, 255, 0.3)",selectionLineWidth:1,selectionFullyContained:!1,hoverCursor:"move",moveCursor:"move",defaultCursor:"default",freeDrawingCursor:"crosshair",notAllowedCursor:"not-allowed",perPixelTargetFind:!1,targetFindTolerance:0,skipTargetFind:!1,stopContextMenu:!0,fireRightClick:!0,fireMiddleClick:!0,enablePointerEvents:!1,containerClass:"canvas-container",preserveObjectStacking:!0});var lo=class{constructor(t){p(this,"targets",[]),p(this,"__disposer",void 0);let e=()=>{let{hiddenTextarea:e}=t.getActiveObject()||{};e&&e.focus()},i=t.upperCanvasEl;i.addEventListener("click",e),this.__disposer=()=>i.removeEventListener("click",e)}exitTextEditing(){this.target=void 0,this.targets.forEach(t=>{t.isEditing&&t.exitEditing()})}add(t){this.targets.push(t)}remove(t){this.unregister(t),ct(this.targets,t)}register(t){this.target=t}unregister(t){t===this.target&&(this.target=void 0)}onMouseMove(t){var e;null!=(e=this.target)&&e.isEditing&&this.target.updateSelectionOnMouseMove(t)}clear(){this.targets=[],this.target=void 0}dispose(){this.clear(),this.__disposer(),delete this.__disposer}};const ho={passive:!1},co=(t,e)=>({viewportPoint:t.getViewportPoint(e),scenePoint:t.getScenePoint(e)}),uo=(t,...e)=>t.addEventListener(...e),go=(t,...e)=>t.removeEventListener(...e),fo={mouse:{in:"over",out:"out",targetIn:"mouseover",targetOut:"mouseout",canvasIn:"mouse:over",canvasOut:"mouse:out"},drag:{in:"enter",out:"leave",targetIn:"dragenter",targetOut:"dragleave",canvasIn:"drag:enter",canvasOut:"drag:leave"}};var po=class extends ao{constructor(t,e={}){super(t,e),p(this,"_isClick",void 0),p(this,"textEditingManager",new lo(this)),["_onMouseDown","_onTouchStart","_onMouseMove","_onMouseUp","_onTouchEnd","_onResize","_onMouseWheel","_onMouseOut","_onMouseEnter","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragProgress","_onDragOver","_onDragEnter","_onDragLeave","_onDrop"].forEach(t=>{this[t]=this[t].bind(this)}),this.addOrRemove(uo)}_getEventPrefix(){return this.enablePointerEvents?"pointer":"mouse"}addOrRemove(t,e=!1){let i=this.upperCanvasEl,r=this._getEventPrefix();t(oe(i),"resize",this._onResize),t(i,r+"down",this._onMouseDown),t(i,`${r}move`,this._onMouseMove,ho),t(i,`${r}out`,this._onMouseOut),t(i,`${r}enter`,this._onMouseEnter),t(i,"wheel",this._onMouseWheel,{passive:!1}),t(i,"contextmenu",this._onContextMenu),e||(t(i,"click",this._onClick),t(i,"dblclick",this._onClick)),t(i,"dragstart",this._onDragStart),t(i,"dragend",this._onDragEnd),t(i,"dragover",this._onDragOver),t(i,"dragenter",this._onDragEnter),t(i,"dragleave",this._onDragLeave),t(i,"drop",this._onDrop),this.enablePointerEvents||t(i,"touchstart",this._onTouchStart,ho)}removeListeners(){this.addOrRemove(go);let t=this._getEventPrefix(),e=ne(this.upperCanvasEl);go(e,`${t}up`,this._onMouseUp),go(e,"touchend",this._onTouchEnd,ho),go(e,`${t}move`,this._onMouseMove,ho),go(e,"touchmove",this._onMouseMove,ho),clearTimeout(this._willAddMouseDown)}_onMouseWheel(t){this._cacheTransformEventData(t),this._handleEvent(t,"wheel"),this._resetTransformEventData()}_onMouseOut(t){let e=this._hoveredTarget,i={e:t,...co(this,t)};this.fire("mouse:out",{...i,target:e}),this._hoveredTarget=void 0,e&&e.fire("mouseout",{...i}),this._hoveredTargets.forEach(t=>{this.fire("mouse:out",{...i,target:t}),t&&t.fire("mouseout",{...i})}),this._hoveredTargets=[]}_onMouseEnter(t){let{target:e}=this.findTarget(t);this._currentTransform||e||(this.fire("mouse:over",{e:t,...co(this,t)}),this._hoveredTarget=void 0,this._hoveredTargets=[])}_onDragStart(t){this._isClick=!1;let e=this.getActiveObject();if(e&&e.onDragStart(t)){this._dragSource=e;let i={e:t,target:e};return this.fire("dragstart",i),e.fire("dragstart",i),void uo(this.upperCanvasEl,"drag",this._onDragProgress)}we(t)}_renderDragEffects(t,e,i){let r=!1,s=this._dropTarget;s&&s!==e&&s!==i&&(s.clearContextTop(),r=!0),null==e||e.clearContextTop(),i!==e&&(null==i||i.clearContextTop());let n=this.contextTop;n.save(),n.transform(...this.viewportTransform),e&&(n.save(),e.transform(n),e.renderDragSourceEffect(t),n.restore(),r=!0),i&&(n.save(),i.transform(n),i.renderDropTargetEffect(t),n.restore(),r=!0),n.restore(),r&&(this.contextTopDirty=!0)}_onDragEnd(t){let{currentSubTargets:e}=this.findTarget(t),i=!!t.dataTransfer&&"none"!==t.dataTransfer.dropEffect,r=i?this._activeObject:void 0,s={e:t,target:this._dragSource,subTargets:e,dragSource:this._dragSource,didDrop:i,dropTarget:r};go(this.upperCanvasEl,"drag",this._onDragProgress),this.fire("dragend",s),this._dragSource&&this._dragSource.fire("dragend",s),delete this._dragSource,this._onMouseUp(t)}_onDragProgress(t){let e={e:t,target:this._dragSource,dragSource:this._dragSource,dropTarget:this._draggedoverTarget};this.fire("drag",e),this._dragSource&&this._dragSource.fire("drag",e)}_onDragOver(t){let e,i="dragover",{currentContainer:r,currentSubTargets:s}=this.findTarget(t),n=this._dragSource,o={e:t,target:r,subTargets:s,dragSource:n,canDrop:!1,dropTarget:void 0};this.fire(i,o),this._fireEnterLeaveEvents(t,r,o),r&&(r.canDrop(t)&&(e=r),r.fire(i,o));for(let r=0;r<s.length;r++){let n=s[r];n.canDrop(t)&&(e=n),n.fire(i,o)}this._renderDragEffects(t,n,e),this._dropTarget=e}_onDragEnter(t){let{currentContainer:e,currentSubTargets:i}=this.findTarget(t),r={e:t,target:e,subTargets:i,dragSource:this._dragSource};this.fire("dragenter",r),this._fireEnterLeaveEvents(t,e,r)}_onDragLeave(t){let{currentSubTargets:e}=this.findTarget(t),i={e:t,target:this._draggedoverTarget,subTargets:e,dragSource:this._dragSource};this.fire("dragleave",i),this._fireEnterLeaveEvents(t,void 0,i),this._renderDragEffects(t,this._dragSource),this._dropTarget=void 0,this._hoveredTargets=[]}_onDrop(t){let{currentContainer:e,currentSubTargets:i}=this.findTarget(t),r=this._basicEventHandler("drop:before",{e:t,target:e,subTargets:i,dragSource:this._dragSource,...co(this,t)});r.didDrop=!1,r.dropTarget=void 0,this._basicEventHandler("drop",r),this.fire("drop:after",r)}_onContextMenu(t){let{target:e,subTargets:i}=this.findTarget(t),r=this._basicEventHandler("contextmenu:before",{e:t,target:e,subTargets:i});return this.stopContextMenu&&we(t),this._basicEventHandler("contextmenu",r),!1}_onClick(t){let e=t.detail;e>3||e<2||(this._cacheTransformEventData(t),2==e&&"dblclick"===t.type&&this._handleEvent(t,"dblclick"),3==e&&this._handleEvent(t,"tripleclick"),this._resetTransformEventData())}fireEventFromPointerEvent(t,e,i,r={}){this._cacheTransformEventData(t);let{target:s,subTargets:n}=this.findTarget(t),o={e:t,target:s,subTargets:n,...co(this,t),transform:this._currentTransform,...r};this.fire(e,o),s&&s.fire(i,o);for(let t=0;t<n.length;t++)n[t]!==s&&n[t].fire(i,o);this._resetTransformEventData()}getPointerId(t){let e=t.changedTouches;return e?e[0]&&e[0].identifier:this.enablePointerEvents?t.pointerId:-1}_isMainEvent(t){return!0===t.isPrimary||!1!==t.isPrimary&&("touchend"===t.type&&0===t.touches.length||!t.changedTouches||t.changedTouches[0].identifier===this.mainTouchId)}_onTouchStart(t){this._cacheTransformEventData(t);let e=!this.allowTouchScrolling,i=this._activeObject;void 0===this.mainTouchId&&(this.mainTouchId=this.getPointerId(t)),this.__onMouseDown(t);let{target:r}=this.findTarget(t);(this.isDrawingMode||i&&r===i)&&(e=!0),e&&t.preventDefault();let s=this.upperCanvasEl,n=this._getEventPrefix(),o=ne(s);uo(o,"touchend",this._onTouchEnd,ho),e&&uo(o,"touchmove",this._onMouseMove,ho),go(s,`${n}down`,this._onMouseDown),this._resetTransformEventData()}_onMouseDown(t){this._cacheTransformEventData(t),this.__onMouseDown(t);let e=this.upperCanvasEl,i=this._getEventPrefix();go(e,`${i}move`,this._onMouseMove,ho);let r=ne(e);uo(r,`${i}up`,this._onMouseUp),uo(r,`${i}move`,this._onMouseMove,ho),this._resetTransformEventData()}_onTouchEnd(t){if(t.touches.length>0)return;this._cacheTransformEventData(t),this.__onMouseUp(t),this._resetTransformEventData(),delete this.mainTouchId;let e=this._getEventPrefix(),i=ne(this.upperCanvasEl);go(i,"touchend",this._onTouchEnd,ho),go(i,"touchmove",this._onMouseMove,ho),this._willAddMouseDown&&clearTimeout(this._willAddMouseDown),this._willAddMouseDown=setTimeout(()=>{uo(this.upperCanvasEl,`${e}down`,this._onMouseDown),this._willAddMouseDown=0},400)}_onMouseUp(t){this._cacheTransformEventData(t),this.__onMouseUp(t);let e=this.upperCanvasEl,i=this._getEventPrefix();if(this._isMainEvent(t)){let t=ne(this.upperCanvasEl);go(t,`${i}up`,this._onMouseUp),go(t,`${i}move`,this._onMouseMove,ho),uo(e,`${i}move`,this._onMouseMove,ho)}this._resetTransformEventData()}_onMouseMove(t){this._cacheTransformEventData(t);let e=this.getActiveObject();!this.allowTouchScrolling&&(!e||!e.shouldStartDragging(t))&&t.preventDefault&&t.preventDefault(),this.__onMouseMove(t),this._resetTransformEventData()}_onResize(){this.calcOffset(),this._resetTransformEventData()}_shouldRender(t){let e=this.getActiveObject();return!!e!=!!t||e&&t&&e!==t}__onMouseUp(t){var e;this._handleEvent(t,"up:before");let i=this._currentTransform,r=this._isClick,{target:s}=this.findTarget(t),{button:n}=t;if(n)return void((this.fireMiddleClick&&1===n||this.fireRightClick&&2===n)&&this._handleEvent(t,"up"));if(this.isDrawingMode&&this._isCurrentlyDrawing)return void this._onMouseUpInDrawingMode(t);if(!this._isMainEvent(t))return;let o,a,l=!1;if(i&&(this._finalizeCurrentTransform(t),l=i.actionPerformed),!r){let e=s===this._activeObject;this.handleSelection(t),l||(l=this._shouldRender(s)||!e&&s===this._activeObject)}if(s){let{key:e,control:r}=s.findControl(this.getViewportPoint(t),Ce(t))||{};if(a=e,s.selectable&&s!==this._activeObject&&"up"===s.activeOn)this.setActiveObject(s,t),l=!0;else if(r){let e=r.getMouseUpHandler(t,s,r);e&&(o=this.getScenePoint(t),e.call(r,t,i,o.x,o.y))}s.isMoving=!1}if(i&&(i.target!==s||i.corner!==a)){let e=i.target&&i.target.controls[i.corner],r=e&&e.getMouseUpHandler(t,i.target,e);o=o||this.getScenePoint(t),r&&r.call(e,t,i,o.x,o.y)}this._setCursorFromEvent(t,s),this._handleEvent(t,"up"),this._groupSelector=null,this._currentTransform=null,s&&(s.__corner=void 0),l?this.requestRenderAll():r||null!=(e=this._activeObject)&&e.isEditing||this.renderTop()}_basicEventHandler(t,e){let{target:i,subTargets:r=[]}=e;this.fire(t,e),i&&i.fire(t,e);for(let s=0;s<r.length;s++)r[s]!==i&&r[s].fire(t,e);return e}_handleEvent(t,e,i){let{target:r,subTargets:s}=this.findTarget(t),n={e:t,target:r,subTargets:s,...co(this,t),transform:this._currentTransform,..."down:before"===e||"down"===e?i:{}};"up:before"!==e&&"up"!==e||(n.isClick=this._isClick),this.fire(`mouse:${e}`,n),r&&r.fire(`mouse${e}`,n);for(let t=0;t<s.length;t++)s[t]!==r&&s[t].fire(`mouse${e}`,n)}_onMouseDownInDrawingMode(t){this._isCurrentlyDrawing=!0,this.getActiveObject()&&(this.discardActiveObject(t),this.requestRenderAll());let e=this.getScenePoint(t);this.freeDrawingBrush&&this.freeDrawingBrush.onMouseDown(e,{e:t,pointer:e}),this._handleEvent(t,"down",{alreadySelected:!1})}_onMouseMoveInDrawingMode(t){if(this._isCurrentlyDrawing){let e=this.getScenePoint(t);this.freeDrawingBrush&&this.freeDrawingBrush.onMouseMove(e,{e:t,pointer:e})}this.setCursor(this.freeDrawingCursor),this._handleEvent(t,"move")}_onMouseUpInDrawingMode(t){let e=this.getScenePoint(t);this.freeDrawingBrush?this._isCurrentlyDrawing=!!this.freeDrawingBrush.onMouseUp({e:t,pointer:e}):this._isCurrentlyDrawing=!1,this._handleEvent(t,"up")}__onMouseDown(t){this._isClick=!0,this._handleEvent(t,"down:before");let{target:e}=this.findTarget(t),i=!!e&&e===this._activeObject,{button:r}=t;if(r)return void((this.fireMiddleClick&&1===r||this.fireRightClick&&2===r)&&this._handleEvent(t,"down",{alreadySelected:i}));if(this.isDrawingMode)return void this._onMouseDownInDrawingMode(t);if(!this._isMainEvent(t)||this._currentTransform)return;let s=this._shouldRender(e),n=!1;if(this.handleMultiSelection(t,e)?(e=this._activeObject,n=!0,s=!0):this._shouldClearSelection(t,e)&&this.discardActiveObject(t),this.selection&&(!e||!e.selectable&&!e.isEditing&&e!==this._activeObject)){let e=this.getScenePoint(t);this._groupSelector={x:e.x,y:e.y,deltaY:0,deltaX:0}}if(i=!!e&&e===this._activeObject,e){e.selectable&&"down"===e.activeOn&&this.setActiveObject(e,t);let r=e.findControl(this.getViewportPoint(t),Ce(t));if(e===this._activeObject&&(r||!n)){this._setupCurrentTransform(t,e,i);let s=r?r.control:void 0,n=this.getScenePoint(t),o=s&&s.getMouseDownHandler(t,e,s);o&&o.call(s,t,this._currentTransform,n.x,n.y)}}s&&(this._objectsToRender=void 0),this._handleEvent(t,"down",{alreadySelected:i}),s&&this.requestRenderAll()}_resetTransformEventData(){this._targetInfo=this._viewportPoint=this._scenePoint=void 0}_cacheTransformEventData(t){this._resetTransformEventData(),this._viewportPoint=this.getViewportPoint(t),this._scenePoint=Pe(this._viewportPoint,void 0,this.viewportTransform),this._targetInfo=this.findTarget(t),this._currentTransform&&(this._targetInfo.target=this._currentTransform.target)}__onMouseMove(t){if(this._isClick=!1,this._handleEvent(t,"move:before"),this.isDrawingMode)return void this._onMouseMoveInDrawingMode(t);if(!this._isMainEvent(t))return;let e=this._groupSelector;if(e){let i=this.getScenePoint(t);e.deltaX=i.x-e.x,e.deltaY=i.y-e.y,this.renderTop()}else if(this._currentTransform)this._transformObject(t);else{let{target:e}=this.findTarget(t);this._setCursorFromEvent(t,e),this._fireOverOutEvents(t,e)}this.textEditingManager.onMouseMove(t),this._handleEvent(t,"move")}_fireOverOutEvents(t,e){let{_hoveredTarget:i,_hoveredTargets:r}=this,{subTargets:s,currentTarget:n}=this.findTarget(t),o=Math.max(r.length,s.length);this.fireSyntheticInOutEvents("mouse",{e:t,target:e,oldTarget:i,actualTarget:n,oldActualTarget:this._hoveredActualTarget,fireCanvas:!0});for(let n=0;n<o;n++)s[n]===e||r[n]&&r[n]===i||this.fireSyntheticInOutEvents("mouse",{e:t,target:s[n],oldTarget:r[n]});this._hoveredActualTarget=n,this._hoveredTarget=e,this._hoveredTargets=s}_fireEnterLeaveEvents(t,e,i){let r=this._draggedoverTarget,s=this._hoveredTargets,{subTargets:n}=this.findTarget(t),o=Math.max(s.length,n.length);this.fireSyntheticInOutEvents("drag",{...i,target:e,oldTarget:r,fireCanvas:!0});for(let t=0;t<o;t++)this.fireSyntheticInOutEvents("drag",{...i,target:n[t],oldTarget:s[t]});this._draggedoverTarget=e}fireSyntheticInOutEvents(t,{target:e,oldTarget:i,actualTarget:r,oldActualTarget:s,fireCanvas:n,e:o,...a}){let{targetIn:l,targetOut:h,canvasIn:c,canvasOut:u}=fo[t],d=i!==e,g=s!==r,f=e&&d,p=r&&g,m=i&&d,y=s&&g,b={...a,e:o,...co(this,o)},_={...b,target:i,nextTarget:e,actualTarget:s,nextActualTarget:r};(m||y)&&n&&this.fire(u,_),m&&i.fire(h,_),y&&i!==s&&s.fire(h,_);let v={...b,target:e,previousTarget:i,actualTarget:r,previousActualTarget:s};(f||p)&&n&&this.fire(c,v),f&&e.fire(l,v),p&&r!==e&&r.fire(l,v)}_transformObject(t){let e=this.getScenePoint(t),i=this._currentTransform,r=i.target,s=r.group?Pe(e,void 0,r.group.calcTransformMatrix()):e;i.shiftKey=t.shiftKey,i.altKey=!!this.centeredKey&&t[this.centeredKey],this._performTransformAction(t,i,s),i.actionPerformed&&this.requestRenderAll()}_performTransformAction(t,e,i){let{action:r,actionHandler:s,target:n}=e,o=!!s&&s(t,e,i.x,i.y);o&&n.setCoords(),"drag"===r&&o&&(e.target.isMoving=!0,this.setCursor(e.target.moveCursor||this.moveCursor)),e.actionPerformed=e.actionPerformed||o}_setCursorFromEvent(t,e){if(!e)return void this.setCursor(this.defaultCursor);let i=e.hoverCursor||this.hoverCursor,r=re(this._activeObject)?this._activeObject:null,s=(!r||e.group!==r)&&e.findControl(this.getViewportPoint(t));if(s){let{control:i,coord:r}=s;this.setCursor(i.cursorStyleHandler(t,i,e,r))}else{if(e.subTargetCheck){let{subTargets:e}=this.findTarget(t);e.concat().reverse().forEach(t=>{i=t.hoverCursor||i})}this.setCursor(i)}}handleMultiSelection(t,e){let i=this._activeObject,r=re(i);if(i&&this._isSelectionKeyPressed(t)&&this.selection&&e&&e.selectable&&(i!==e||r)&&(r||!e.isDescendantOf(i)&&!i.isDescendantOf(e))&&!e.onSelect({e:t})&&!i.getActiveControl()){if(r){let r=i.getObjects(),s=[];if(e===i){let i=this.getScenePoint(t),n=this.searchPossibleTargets(r,i);if(n.target?(e=n.target,s=n.subTargets):(n=this.searchPossibleTargets(this._objects,i),e=n.target,s=n.subTargets),!e||!e.selectable)return!1}e.group===i?(i.remove(e),this._hoveredTarget=e,this._hoveredTargets=s,1===i.size()&&this._setActiveObject(i.item(0),t)):(i.multiSelectAdd(e),this._hoveredTarget=i,this._hoveredTargets=s),this._fireSelectionEvents(r,t)}else{i.isEditing&&i.exitEditing();let r=new(at.getClass("ActiveSelection"))([],{canvas:this});r.multiSelectAdd(i,e),this._hoveredTarget=r,this._setActiveObject(r,t),this._fireSelectionEvents([i],t)}return!0}return!1}handleSelection(t){if(!this.selection||!this._groupSelector)return!1;let{x:e,y:i,deltaX:r,deltaY:s}=this._groupSelector,n=new gt(e,i),o=n.add(new gt(r,s)),a=n.min(o),l=n.max(o).subtract(a),h=this.collectObjects({left:a.x,top:a.y,width:l.x,height:l.y},{includeIntersecting:!this.selectionFullyContained}),c=n.eq(o)?h[0]?[h[0]]:[]:h.length>1?h.filter(e=>!e.onSelect({e:t})).reverse():h;if(1===c.length)this.setActiveObject(c[0],t);else if(c.length>1){let e=at.getClass("ActiveSelection");this.setActiveObject(new e(c,{canvas:this}),t)}return this._groupSelector=null,!0}toCanvasElement(t=1,e){let{upper:i}=this.elements;i.ctx=void 0;let r=super.toCanvasElement(t,e);return i.ctx=i.el.getContext("2d"),r}clear(){this.textEditingManager.clear(),super.clear()}destroy(){this.removeListeners(),this.textEditingManager.dispose(),super.destroy()}};const mo={x1:0,y1:0,x2:0,y2:0},yo={...mo,r1:0,r2:0},bo=(t,e)=>isNaN(t)&&"number"==typeof e?e:t;function _o(t){return t&&/%$/.test(t)&&Number.isFinite(parseFloat(t))}function vo(t,e){return Bi(0,bo("number"==typeof t?t:"string"==typeof t?parseFloat(t)/(_o(t)?100:1):NaN,e),1)}const xo=/\s*;\s*/,Co=/\s*:\s*/;function wo(t,e){let i,r,s=t.getAttribute("style");if(s){let t=s.split(xo);""===t[t.length-1]&&t.pop();for(let e=t.length;e--;){let[s,n]=t[e].split(Co).map(t=>t.trim());"stop-color"===s?i=n:"stop-opacity"===s&&(r=n)}}i=i||t.getAttribute("stop-color")||"rgb(0,0,0)",r=bo(parseFloat(r||t.getAttribute("stop-opacity")||""),1);let n=new gi(i);return n.setAlpha(n.getAlpha()*r*e),{offset:vo(t.getAttribute("offset"),0),color:n.toRgba()}}function So(t,e){let i=[],r=t.getElementsByTagName("stop"),s=vo(e,1);for(let t=r.length;t--;)i.push(wo(r[t],s));return i}function To(t){return"linearGradient"===t.nodeName||"LINEARGRADIENT"===t.nodeName?"linear":"radial"}function Oo(t){return"userSpaceOnUse"===t.getAttribute("gradientUnits")?"pixels":"percentage"}function ko(t,e){return t.getAttribute(e)}function Do(t,e){return function(t,{width:e,height:i,gradientUnits:r}){let s;return Object.entries(t).reduce((t,[n,o])=>{if("Infinity"===o)s=1;else if("-Infinity"===o)s=0;else{let t="string"==typeof o;s=t?parseFloat(o):o,t&&_o(o)&&(s*=.01,"pixels"===r&&("x1"!==n&&"x2"!==n&&"r2"!==n||(s*=e),"y1"!==n&&"y2"!==n||(s*=i)))}return t[n]=s,t},{})}("linear"===To(t)?function(t){return{x1:ko(t,"x1")||0,y1:ko(t,"y1")||0,x2:ko(t,"x2")||"100%",y2:ko(t,"y2")||0}}(t):function(t){return{x1:ko(t,"fx")||ko(t,"cx")||"50%",y1:ko(t,"fy")||ko(t,"cy")||"50%",r1:0,x2:ko(t,"cx")||"50%",y2:ko(t,"cy")||"50%",r2:ko(t,"r")||"50%"}}(t),{...e,gradientUnits:Oo(t)})}var Mo=class{constructor(t){let{type:e="linear",gradientUnits:i="pixels",coords:r={},colorStops:s=[],offsetX:n=0,offsetY:o=0,gradientTransform:a,id:l}=t||{};Object.assign(this,{type:e,gradientUnits:i,coords:{..."radial"===e?yo:mo,...r},colorStops:s,offsetX:n,offsetY:o,gradientTransform:a,id:l?`${l}_${xt()}`:xt()})}addColorStop(t){for(let e in t)this.colorStops.push({offset:parseFloat(e),color:t[e]});return this}toObject(t){return{...Kt(this,t),type:this.type,coords:{...this.coords},colorStops:this.colorStops.map(t=>({...t})),offsetX:this.offsetX,offsetY:this.offsetY,gradientUnits:this.gradientUnits,gradientTransform:this.gradientTransform?[...this.gradientTransform]:void 0}}toSVG(t,{additionalTransform:e}={}){let i=[],r=this.gradientTransform?this.gradientTransform.concat():I.concat(),s="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox",n=this.colorStops.map(t=>({...t})).sort((t,e)=>t.offset-e.offset),o=-this.offsetX,a=-this.offsetY;var l;"objectBoundingBox"===s?(o/=t.width,a/=t.height):(o+=t.width/2,a+=t.height/2),(l=t)&&"function"==typeof l._renderPathCommands&&"percentage"!==this.gradientUnits&&(o-=t.pathOffset.x,a-=t.pathOffset.y),r[4]-=o,r[5]-=a;let h=[`id="SVGID_${fe(String(this.id))}"`,`gradientUnits="${s}"`,`gradientTransform="${e?e+" ":""}${Zt(r)}"`,""].join(" "),c=t=>parseFloat(String(t));if("linear"===this.type){let{x1:t,y1:e,x2:r,y2:s}=this.coords,n=c(t),o=c(e),a=c(r),l=c(s);i.push("<linearGradient ",h,' x1="',n,'" y1="',o,'" x2="',a,'" y2="',l,'">\n')}else if("radial"===this.type){let{x1:t,y1:e,x2:r,y2:s,r1:o,r2:a}=this.coords,l=c(t),u=c(e),d=c(r),g=c(s),f=c(o),p=c(a),m=f>p;i.push("<radialGradient ",h,' cx="',m?l:d,'" cy="',m?u:g,'" r="',m?f:p,'" fx="',m?d:l,'" fy="',m?g:u,'">\n'),m&&(n.reverse(),n.forEach(t=>{t.offset=1-t.offset}));let y=Math.min(f,p);if(y>0){let t=y/Math.max(f,p);n.forEach(e=>{e.offset+=t*(1-e.offset)})}}return n.forEach(({color:t,offset:e})=>{let r=String(t),s=ri(r)?r:new gi(r).toRgba();i.push(`<stop offset="${100*e}%" style="stop-color:${fe(s)};"/>\n`)}),i.push("linear"===this.type?"</linearGradient>":"</radialGradient>","\n"),i.join("")}toLive(t){let{x1:e,y1:i,x2:r,y2:s,r1:n,r2:o}=this.coords,a="linear"===this.type?t.createLinearGradient(e,i,r,s):t.createRadialGradient(e,i,n,r,s,o);return this.colorStops.forEach(({color:t,offset:e})=>{a.addColorStop(e,t)}),a}static async fromObject(t){let{colorStops:e,gradientTransform:i}=t;return new this({...t,colorStops:e?e.map(t=>({...t})):void 0,gradientTransform:i?[...i]:void 0})}static fromElement(t,e,i){let r=Oo(t),s=e._findCenterFromElement();return new this({id:t.getAttribute("id")||void 0,type:To(t),coords:Do(t,{width:i.viewBoxWidth||i.width,height:i.viewBoxHeight||i.height}),colorStops:So(t,i.opacity),gradientUnits:r,gradientTransform:Hs(t.getAttribute("gradientTransform")||""),..."pixels"===r?{offsetX:e.width/2-s.x,offsetY:e.height/2-s.y}:{offsetX:0,offsetY:0}})}};p(Mo,"type","Gradient"),at.setClass(Mo,"gradient"),at.setClass(Mo,"linear"),at.setClass(Mo,"radial");var jo=class{get type(){return"pattern"}set type(t){b("warn","Setting type has no effect",t)}constructor(t){p(this,"repeat","repeat"),p(this,"offsetX",0),p(this,"offsetY",0),p(this,"crossOrigin",""),this.id=xt(),Object.assign(this,t)}isImageSource(){return!!this.source&&"string"==typeof this.source.src}isCanvasSource(){return!!this.source&&!!this.source.toDataURL}sourceToString(){return this.isImageSource()?this.source.src:this.isCanvasSource()?this.source.toDataURL():""}toLive(t){return this.source&&(!this.isImageSource()||this.source.complete&&0!==this.source.naturalWidth&&0!==this.source.naturalHeight)?t.createPattern(this.source,this.repeat):null}toObject(t=[]){let{repeat:e,crossOrigin:i}=this;return{...Kt(this,t),type:"pattern",source:this.sourceToString(),repeat:e,crossOrigin:i,offsetX:Qt(this.offsetX,y.NUM_FRACTION_DIGITS),offsetY:Qt(this.offsetY,y.NUM_FRACTION_DIGITS),patternTransform:this.patternTransform?[...this.patternTransform]:null}}toSVG({width:t,height:e}){let{source:i,repeat:r,id:s}=this,n=bo(this.offsetX/t,0),o=bo(this.offsetY/e,0),a="repeat-y"===r||"no-repeat"===r?1+Math.abs(n||0):bo(i.width/t,0),l="repeat-x"===r||"no-repeat"===r?1+Math.abs(o||0):bo(i.height/e,0);return[`<pattern id="SVGID_${fe(s)}" x="${n}" y="${o}" width="${a}" height="${l}">`,`<image x="0" y="0" width="${i.width}" height="${i.height}" xlink:href="${fe(this.sourceToString())}"></image>`,"</pattern>",""].join("\n")}static async fromObject({type:t,source:e,patternTransform:i,...r},s){let n=await Gt(e,{...s,crossOrigin:r.crossOrigin});return new this({...r,patternTransform:i&&i.slice(0),source:n})}};p(jo,"type","Pattern"),at.setClass(jo),at.setClass(jo,"pattern");var Eo=class t extends ys{constructor(e,{path:i,left:r,top:s,...n}={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(n),this._setPath(e||[],!0),"number"==typeof r&&this.set("left",r),"number"==typeof s&&this.set("top",s)}_setPath(t,e){this.path=xn(Array.isArray(t)?t:Rn(t)),this.setBoundingBox(e)}_findCenterFromElement(){let t=this._calcBoundsFromPath();return new gt(t.left+t.width/2,t.top+t.height/2)}_renderPathCommands(t){let e=-this.pathOffset.x,i=-this.pathOffset.y;t.beginPath();for(let r of this.path)switch(r[0]){case"L":t.lineTo(r[1]+e,r[2]+i);break;case"M":t.moveTo(r[1]+e,r[2]+i);break;case"C":t.bezierCurveTo(r[1]+e,r[2]+i,r[3]+e,r[4]+i,r[5]+e,r[6]+i);break;case"Q":t.quadraticCurveTo(r[1]+e,r[2]+i,r[3]+e,r[4]+i);break;case"Z":t.closePath()}}_render(t){this._renderPathCommands(t),this._renderPaintInOrder(t)}toString(){return`#<Path (${this.complexity()}): { "top": ${this.top}, "left": ${this.left} }>`}toObject(t=[]){return{...super.toObject(t),path:this.path.map(t=>t.slice())}}toDatalessObject(t=[]){let e=this.toObject(t);return this.sourcePath&&(delete e.path,e.sourcePath=this.sourcePath),e}_toSVG(){return["<path ","COMMON_PARTS",`d="${Yn(this.path,y.NUM_FRACTION_DIGITS)}" stroke-linecap="round" />\n`]}_getOffsetTransform(){let t=y.NUM_FRACTION_DIGITS;return` translate(${Qt(-this.pathOffset.x,t)}, ${Qt(-this.pathOffset.y,t)})`}toClipPathSVG(t){let e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}toSVG(t){let e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})}complexity(){return this.path.length}setDimensions(){this.setBoundingBox()}setBoundingBox(t){let{width:e,height:i,pathOffset:r}=this._calcDimensions();this.set({width:e,height:i,pathOffset:r}),t&&this.setPositionByOrigin(r,"center","center")}_calcBoundsFromPath(){let t=[],e=0,i=0,r=0,s=0;for(let n of this.path)switch(n[0]){case"L":r=n[1],s=n[2],t.push({x:e,y:i},{x:r,y:s});break;case"M":r=n[1],s=n[2],e=r,i=s;break;case"C":t.push(...bn(r,s,n[1],n[2],n[3],n[4],n[5],n[6])),r=n[5],s=n[6];break;case"Q":t.push(...bn(r,s,n[1],n[2],n[1],n[2],n[3],n[4])),r=n[3],s=n[4];break;case"Z":r=e,s=i}return Se(t)}_calcDimensions(){let t=this._calcBoundsFromPath();return{...t,pathOffset:new gt(t.left+t.width/2,t.top+t.height/2)}}static fromObject(t){return this._fromObject(t,{extraParam:"path"})}static async fromElement(t,e,i){let{d:r,...s}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this(r,{...s,...e,left:void 0,top:void 0})}};p(Eo,"type","Path"),p(Eo,"cacheProperties",[...Xi,"path","fillRule"]),p(Eo,"ATTRIBUTE_NAMES",[...Ds,"d"]),at.setClass(Eo),at.setSVGClass(Eo);const Po=["radius","startAngle","endAngle","counterClockwise"];var Ao=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_set(t,e){return super._set(t,e),"radius"===t&&this.setRadius(e),this}_render(t){t.beginPath(),t.arc(0,0,this.radius,Dt(this.startAngle),Dt(this.endAngle),this.counterClockwise),this._renderPaintInOrder(t)}getRadiusX(){return this.get("radius")*this.get(Q)}getRadiusY(){return this.get("radius")*this.get(Z)}setRadius(t){this.radius=t,this.set({width:2*t,height:2*t})}toObject(t=[]){return super.toObject([...Po,...t])}_toSVG(){let{radius:t,startAngle:e,endAngle:i}=this,r=(i-e)%360;if(0===r)return["<circle ","COMMON_PARTS",'cx="0" cy="0" ','r="',`${fe(t)}`,'" />\n'];{let s=Dt(e),n=Dt(i),o=ut(s)*t,a=dt(s)*t,l=ut(n)*t,h=dt(n)*t;return[`<path d="M ${o} ${a} A ${t} ${t} 0 ${+(r>180)} ${+!this.counterClockwise} ${l} ${h}" `,"COMMON_PARTS"," />\n"]}}static async fromElement(t,e,i){let{left:r=0,top:s=0,radius:n=0,...o}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this({...o,radius:n,left:r-n,top:s-n})}static fromObject(t){return super._fromObject(t)}};p(Ao,"type","Circle"),p(Ao,"cacheProperties",[...Xi,...Po]),p(Ao,"ownDefaults",{radius:0,startAngle:0,endAngle:360,counterClockwise:!1}),p(Ao,"ATTRIBUTE_NAMES",["cx","cy","r",...Ds]),at.setClass(Ao),at.setSVGClass(Ao);const Fo=["x1","x2","y1","y2"];var Lo=class t extends ys{constructor([e,i,r,s]=[0,0,0,0],n={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(n),this.x1=e,this.x2=r,this.y1=i,this.y2=s,this._setWidthHeight();let{left:o,top:a}=n;"number"==typeof o&&this.set("left",o),"number"==typeof a&&this.set("top",a)}_setWidthHeight(){let{x1:t,y1:e,x2:i,y2:r}=this;this.width=Math.abs(i-t),this.height=Math.abs(r-e);let{left:s,top:n,width:o,height:a}=Se([{x:t,y:e},{x:i,y:r}]),l=new gt(s+o/2,n+a/2);this.setPositionByOrigin(l,R,R)}_set(t,e){return super._set(t,e),Fo.includes(t)&&this._setWidthHeight(),this}_render(t){t.beginPath();let e=this.calcLinePoints();t.moveTo(e.x1,e.y1),t.lineTo(e.x2,e.y2),t.lineWidth=this.strokeWidth;let i=t.strokeStyle;var r;te(this.stroke)?t.strokeStyle=this.stroke.toLive(t):t.strokeStyle=null==(r=this.stroke)?t.fillStyle:r,this.stroke&&this._renderStroke(t),t.strokeStyle=i}_findCenterFromElement(){return new gt((this.x1+this.x2)/2,(this.y1+this.y2)/2)}toObject(t=[]){return{...super.toObject(t),...this.calcLinePoints()}}_getNonTransformedDimensions(){let t=super._getNonTransformedDimensions();return"butt"===this.strokeLineCap&&(0===this.width&&(t.y-=this.strokeWidth),0===this.height&&(t.x-=this.strokeWidth)),t}calcLinePoints(){let{x1:t,x2:e,y1:i,y2:r,width:s,height:n}=this,o=t<=e?-.5:.5,a=i<=r?-.5:.5;return{x1:o*s,x2:o*-s,y1:a*n,y2:a*-n}}_toSVG(){let{x1:t,x2:e,y1:i,y2:r}=this.calcLinePoints();return["<line ","COMMON_PARTS",`x1="${t}" y1="${i}" x2="${e}" y2="${r}" />\n`]}static async fromElement(t,e,i){let{x1:r=0,y1:s=0,x2:n=0,y2:o=0,...a}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this([r,s,n,o],a)}static fromObject({x1:t,y1:e,x2:i,y2:r,...s}){return this._fromObject({...s,points:[t,e,i,r]},{extraParam:"points"})}};p(Lo,"type","Line"),p(Lo,"cacheProperties",[...Xi,...Fo]),p(Lo,"ATTRIBUTE_NAMES",Ds.concat(Fo)),at.setClass(Lo),at.setSVGClass(Lo);var Io=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_render(t){let e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderPaintInOrder(t)}_toSVG(){let t=this.width/2,e=this.height/2;return["<polygon ","COMMON_PARTS",'points="',`${-t} ${e},0 ${-e},${t} ${e}`,'" />']}};p(Io,"type","Triangle"),p(Io,"ownDefaults",{width:100,height:100}),at.setClass(Io),at.setSVGClass(Io);const Ro=["rx","ry"];var Bo=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e){super(),Object.assign(this,t.ownDefaults),this.setOptions(e)}_set(t,e){switch(super._set(t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this}getRx(){return this.get("rx")*this.get(Q)}getRy(){return this.get("ry")*this.get(Z)}toObject(t=[]){return super.toObject([...Ro,...t])}_toSVG(){return["<ellipse ","COMMON_PARTS",`cx="0" cy="0" rx="${fe(this.rx)}" ry="${fe(this.ry)}" />\n`]}_render(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,F,!1),t.restore(),this._renderPaintInOrder(t)}static async fromElement(t,e,i){let r=Ks(t,this.ATTRIBUTE_NAMES,i);return r.left=(r.left||0)-r.rx,r.top=(r.top||0)-r.ry,new this(r)}};p(Bo,"type","Ellipse"),p(Bo,"cacheProperties",[...Xi,...Ro]),p(Bo,"ownDefaults",{rx:0,ry:0}),p(Bo,"ATTRIBUTE_NAMES",[...Ds,"cx","cy","rx","ry"]),at.setClass(Bo),at.setSVGClass(Bo);const $o={exactBoundingBox:!1};var Xo=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),p(this,"strokeDiff",void 0),Object.assign(this,t.ownDefaults),this.setOptions(i),this.points=e;let{left:r,top:s}=i;this.initialized=!0,this.setBoundingBox(!0),"number"==typeof r&&this.set("left",r),"number"==typeof s&&this.set("top",s)}isOpen(){return!0}_projectStrokeOnPoints(t){return ws(this.points,t,this.isOpen())}_calcDimensions(t){t={scaleX:this.scaleX,scaleY:this.scaleY,skewX:this.skewX,skewY:this.skewY,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:this.strokeMiterLimit,strokeUniform:this.strokeUniform,strokeWidth:this.strokeWidth,...t||{}};let e=this.exactBoundingBox?this._projectStrokeOnPoints(t).map(t=>t.projectedPoint):this.points;if(0===e.length)return{left:0,top:0,width:0,height:0,pathOffset:new gt,strokeOffset:new gt,strokeDiff:new gt};let i=Se(e),r=zt({...t,scaleX:1,scaleY:1}),s=Se(this.points.map(t=>Et(t,r,!0))),n=new gt(this.scaleX,this.scaleY),o=i.left+i.width/2,a=i.top+i.height/2;return this.exactBoundingBox&&(o-=a*Math.tan(Dt(this.skewX)),a-=o*Math.tan(Dt(this.skewY))),{...i,pathOffset:new gt(o,a),strokeOffset:new gt(s.left,s.top).subtract(new gt(i.left,i.top)).multiply(n),strokeDiff:new gt(i.width,i.height).subtract(new gt(s.width,s.height)).multiply(n)}}_findCenterFromElement(){let t=Se(this.points);return new gt(t.left+t.width/2,t.top+t.height/2)}setDimensions(){this.setBoundingBox()}setBoundingBox(t){let{left:e,top:i,width:r,height:s,pathOffset:n,strokeOffset:o,strokeDiff:a}=this._calcDimensions();this.set({width:r,height:s,pathOffset:n,strokeOffset:o,strokeDiff:a}),t&&this.setPositionByOrigin(new gt(e+r/2,i+s/2),"center","center")}isStrokeAccountedForInDimensions(){return this.exactBoundingBox}_getNonTransformedDimensions(){return this.exactBoundingBox?new gt(this.width,this.height):super._getNonTransformedDimensions()}_getTransformedDimensions(t={}){if(this.exactBoundingBox){let n;if(Object.keys(t).some(t=>this.strokeUniform||this.constructor.layoutProperties.includes(t))){var e,i;let{width:r,height:s}=this._calcDimensions(t);n=new gt(null==(e=t.width)?r:e,null==(i=t.height)?s:i)}else{var r,s;n=new gt(null==(r=t.width)?this.width:r,null==(s=t.height)?this.height:s)}return n.multiply(new gt(t.scaleX||this.scaleX,t.scaleY||this.scaleY))}return super._getTransformedDimensions(t)}_set(t,e){let i=this.initialized&&this[t]!==e,r=super._set(t,e);return this.exactBoundingBox&&i&&(("scaleX"===t||"scaleY"===t)&&this.strokeUniform&&this.constructor.layoutProperties.includes("strokeUniform")||this.constructor.layoutProperties.includes(t))&&this.setDimensions(),r}toObject(t=[]){return{...super.toObject(t),points:this.points.map(({x:t,y:e})=>({x:t,y:e}))}}_toSVG(){let t=this.pathOffset.x,e=this.pathOffset.y,i=y.NUM_FRACTION_DIGITS,r=this.points.map(({x:r,y:s})=>`${Qt(r-t,i)},${Qt(s-e,i)}`).join(" ");return[`<${fe(this.constructor.type).toLowerCase()} `,"COMMON_PARTS",`points="${r}" />\n`]}_render(t){let e=this.points.length,i=this.pathOffset.x,r=this.pathOffset.y;if(e&&!isNaN(this.points[e-1].y)){t.beginPath(),t.moveTo(this.points[0].x-i,this.points[0].y-r);for(let s=0;s<e;s++){let e=this.points[s];t.lineTo(e.x-i,e.y-r)}!this.isOpen()&&t.closePath(),this._renderPaintInOrder(t)}}complexity(){return this.points.length}static async fromElement(t,e,i){let r=function(t){if(!t)return[];let e=t.replace(/,/g," ").trim().split(/\s+/),i=[];for(let t=0;t<e.length;t+=2)i.push({x:parseFloat(e[t]),y:parseFloat(e[t+1])});return i}(t.getAttribute("points")),{left:s,top:n,...o}=Ks(t,this.ATTRIBUTE_NAMES,i);return new this(r,{...o,...e})}static fromObject(t){return this._fromObject(t,{extraParam:"points"})}};p(Xo,"ownDefaults",$o),p(Xo,"type","Polyline"),p(Xo,"layoutProperties",[tt,et,"strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeWidth","strokeUniform","points"]),p(Xo,"cacheProperties",[...Xi,"points"]),p(Xo,"ATTRIBUTE_NAMES",[...Ds]),at.setClass(Xo),at.setSVGClass(Xo);var Yo=class extends Xo{isOpen(){return!1}};p(Yo,"ownDefaults",$o),p(Yo,"type","Polygon"),at.setClass(Yo),at.setSVGClass(Yo);var Wo=class extends ys{isEmptyStyles(t){if(!this.styles||void 0!==t&&!this.styles[t])return!0;let e=void 0===t?this.styles:{line:this.styles[t]};for(let t in e)for(let i in e[t])for(let r in e[t][i])return!1;return!0}styleHas(t,e){if(!this.styles||void 0!==e&&!this.styles[e])return!1;let i=void 0===e?this.styles:{0:this.styles[e]};for(let e in i)for(let r in i[e])if(void 0!==i[e][r][t])return!0;return!1}cleanStyle(t){if(!this.styles)return!1;let e,i,r=this.styles,s=0,n=!0,o=0;for(let o in r){e=0;for(let a in r[o]){let l=r[o][a]||{};s++,void 0===l[t]?n=!1:(i?l[t]!==i&&(n=!1):i=l[t],l[t]===this[t]&&delete l[t]),0===Object.keys(l).length?delete r[o][a]:e++}0===e&&delete r[o]}for(let t=0;t<this._textLines.length;t++)o+=this._textLines[t].length;n&&s===o&&(this[t]=i,this.removeStyle(t))}removeStyle(t){if(!this.styles)return;let e,i,r,s=this.styles;for(i in s){for(r in e=s[i],e)delete e[r][t],0===Object.keys(e[r]).length&&delete e[r];0===Object.keys(e).length&&delete s[i]}}_extendStyles(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t);this._getLineStyle(i)||this._setLineStyle(i);let s=Jt({...this._getStyleDeclaration(i,r),...e},t=>void 0!==t);this._setStyleDeclaration(i,r,s)}getSelectionStyles(t,e,i){let r=[];for(let s=t;s<(e||t);s++)r.push(this.getStyleAtPosition(s,i));return r}getStyleAtPosition(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t);return e?this.getCompleteStyleDeclaration(i,r):this._getStyleDeclaration(i,r)}setSelectionStyles(t,e,i){for(let r=e;r<(i||e);r++)this._extendStyles(r,t);this._forceClearCache=!0}_getStyleDeclaration(t,e){var i;let r=this.styles&&this.styles[t];return r&&null!=(i=r[e])?i:{}}getCompleteStyleDeclaration(t,e){return{...Kt(this,this.constructor._styleProperties),...this._getStyleDeclaration(t,e)}}_setStyleDeclaration(t,e,i){this.styles[t][e]=i}_deleteStyleDeclaration(t,e){delete this.styles[t][e]}_getLineStyle(t){return!!this.styles[t]}_setLineStyle(t){this.styles[t]={}}_deleteLineStyle(t){delete this.styles[t]}};p(Wo,"_styleProperties",Ti);const No=/  +/g,Vo=/"/g;function zo(t,e,i,r,s){return`\t\t${((t,{left:e,top:i,width:r,height:s},n=y.NUM_FRACTION_DIGITS)=>{let o=yi(it,t,!1),[a,l,h,c]=[e,i,r,s].map(t=>Qt(t,n));return`<rect ${o} x="${a}" y="${l}" width="${h}" height="${c}"></rect>`})(t,{left:e,top:i,width:r,height:s})}\n`}let Ho;var Go=class t extends Wo{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(),p(this,"__charBounds",[]),Object.assign(this,t.ownDefaults),this.setOptions(i),this.styles||(this.styles={}),this.text=e,this.initialized=!0,this.path&&this.setPathInfo(),this.initDimensions(),this.setCoords()}setPathInfo(){let t=this.path;t&&(t.segmentsInfo=En(t.path))}_splitText(){let t=this._splitTextIntoLines(this.text);return this.textLines=t.lines,this._textLines=t.graphemeLines,this._unwrappedTextLines=t._unwrappedLines,this._text=t.graphemeText,t}initDimensions(){this._splitText(),this._clearCache(),this.dirty=!0,this.path?(this.width=this.path.width,this.height=this.path.height):(this.width=this.calcTextWidth()||this.cursorWidth||this.MIN_TEXT_WIDTH,this.height=this.calcTextHeight()),this.textAlign.includes("justify")&&this.enlargeSpaces()}enlargeSpaces(){let t,e,i,r,s,n,o;for(let a=0,l=this._textLines.length;a<l;a++)if(("justify"===this.textAlign||a!==l-1&&!this.isEndOfWrapping(a))&&(r=0,s=this._textLines[a],e=this.getLineWidth(a),e<this.width&&(o=this.textLines[a].match(this._reSpacesAndTabs)))){i=o.length,t=(this.width-e)/i;for(let e=0;e<=s.length;e++)n=this.__charBounds[a][e],this._reSpaceAndTab.test(s[e])?(n.width+=t,n.kernedWidth+=t,n.left+=r,r+=t):n.left+=r}}isEndOfWrapping(t){return t===this._textLines.length-1}missingNewlineOffset(t){return 1}get2DCursorLocation(t,e){let i,r=e?this._unwrappedTextLines:this._textLines;for(i=0;i<r.length;i++){if(t<=r[i].length)return{lineIndex:i,charIndex:t};t-=r[i].length+this.missingNewlineOffset(i,e)}return{lineIndex:i-1,charIndex:r[i-1].length<t?r[i-1].length:t}}toString(){return`#<Text (${this.complexity()}): { "text": "${this.text}", "fontFamily": "${this.fontFamily}" }>`}_getCacheCanvasDimensions(){let t=super._getCacheCanvasDimensions(),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t}_render(t){let e=this.path;e&&!e.isNotVisible()&&e._render(t),this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")}_renderText(t){"stroke"===this.paintFirst?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))}_setTextStyles(t,e,i){if(t.textBaseline="alphabetic",this.path)switch(this.pathAlign){case R:t.textBaseline="middle";break;case"ascender":t.textBaseline="top";break;case"descender":t.textBaseline=$}t.font=this._getFontDeclaration(e,i)}calcTextWidth(){let t=this.getLineWidth(0);for(let e=1,i=this._textLines.length;e<i;e++){let i=this.getLineWidth(e);i>t&&(t=i)}return t}_renderTextLine(t,e,i,r,s,n){this._renderChars(t,e,i,r,s,n)}_renderTextLinesBackground(t){if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor"))return;let e=t.fillStyle,i=this._getLeftOffset(),r=this._getTopOffset();for(let e=0,s=this._textLines.length;e<s;e++){let s=this.getHeightOfLine(e);if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor",e)){r+=s;continue}let n,o,a=this._textLines[e].length,l=this._getLineLeftOffset(e),h=0,c=0,u=this.getValueOfPropertyAt(e,0,"textBackgroundColor"),d=this.getHeightOfLineImpl(e);for(let s=0;s<a;s++){let a=this.__charBounds[e][s];o=this.getValueOfPropertyAt(e,s,"textBackgroundColor"),this.path?(t.save(),t.translate(a.renderLeft,a.renderTop),t.rotate(a.angle),t.fillStyle=o,o&&t.fillRect(-a.width/2,-d*(1-this._fontSizeFraction),a.width,d),t.restore()):o===u?h+=a.kernedWidth:(n=i+l+c,"rtl"===this.direction&&(n=this.width-n-h),t.fillStyle=u,u&&t.fillRect(n,r,h,d),c=a.left,h=a.width,u=o)}o&&!this.path&&(n=i+l+c,"rtl"===this.direction&&(n=this.width-n-h),t.fillStyle=o,t.fillRect(n,r,h,d)),r+=s}t.fillStyle=e,this._removeShadow(t)}_measureChar(t,e,i,r){let s,n,o,a,l=M.getFontCache(e),h=this._getFontDeclaration(e),c=i?i+t:t,u=i&&h===this._getFontDeclaration(r),d=e.fontSize/this.CACHE_FONT_SIZE;if(i&&l.has(i)&&(o=l.get(i)),l.has(t)&&(a=s=l.get(t)),u&&l.has(c)&&(n=l.get(c),a=n-o),void 0===s||void 0===o||void 0===n){let r=(Ho||(Ho=Tt({width:0,height:0}).getContext("2d")),Ho);this._setTextStyles(r,e,!0),void 0===s&&(a=s=r.measureText(t).width,l.set(t,s)),void 0===o&&u&&i&&(o=r.measureText(i).width,l.set(i,o)),u&&void 0===n&&(n=r.measureText(c).width,l.set(c,n),a=n-o)}return{width:s*d,kernedWidth:a*d}}getHeightOfChar(t,e){return this.getValueOfPropertyAt(t,e,"fontSize")}measureLine(t){let e=this._measureLine(t);return 0!==this.charSpacing&&(e.width-=this._getWidthOfCharSpacing()),e.width<0&&(e.width=0),e}_measureLine(t){let e,i,r=0,s=this.pathSide===X,n=this.path,o=this._textLines[t],a=o.length,l=Array(a);this.__charBounds[t]=l;for(let s=0;s<a;s++){let n=o[s];i=this._getGraphemeBox(n,t,s,e),l[s]=i,r+=i.kernedWidth,e=n}if(l[a]={left:i?i.left+i.width:0,width:0,kernedWidth:0,height:this.fontSize,deltaY:0},n&&n.segmentsInfo){let t=0,e=n.segmentsInfo[n.segmentsInfo.length-1].length;switch(this.textAlign){case B:t=s?e-r:0;break;case R:t=(e-r)/2;break;case X:t=s?0:e-r}t+=this.pathStartOffset*(s?-1:1);for(let r=s?a-1:0;s?r>=0:r<a;s?r--:r++)i=l[r],t>e?t%=e:t<0&&(t+=e),this._setGraphemeOnPath(t,i),t+=i.kernedWidth}return{width:r,numOfSpaces:0}}_setGraphemeOnPath(t,e){let i=t+e.kernedWidth/2,r=this.path,s=Pn(r.path,i,r.segmentsInfo);e.renderLeft=s.x-r.pathOffset.x,e.renderTop=s.y-r.pathOffset.y,e.angle=s.angle+("right"===this.pathSide?Math.PI:0)}_getGraphemeBox(t,e,i,r,s){let n,o=this.getCompleteStyleDeclaration(e,i),a=r?this.getCompleteStyleDeclaration(e,i-1):{},l=this._measureChar(t,o,r,a),h=l.kernedWidth,c=l.width;0!==this.charSpacing&&(n=this._getWidthOfCharSpacing(),c+=n,h+=n);let u={width:c,left:0,height:o.fontSize,kernedWidth:h,deltaY:o.deltaY};if(i>0&&!s){let t=this.__charBounds[e][i-1];u.left=t.left+t.width+l.kernedWidth-l.width}return u}getHeightOfLineImpl(t){let e=this.__lineHeights;if(e[t])return e[t];let i=this.getHeightOfChar(t,0);for(let e=1,r=this._textLines[t].length;e<r;e++)i=Math.max(this.getHeightOfChar(t,e),i);return e[t]=i*this._fontSizeMult}getHeightOfLine(t){return this.getHeightOfLineImpl(t)*this.lineHeight}calcTextHeight(){let t=0;for(let e=0,i=this._textLines.length;e<i;e++)t+=e===i-1?this.getHeightOfLineImpl(e):this.getHeightOfLine(e);return t}_getLeftOffset(){return"ltr"===this.direction?-this.width/2:this.width/2}_getTopOffset(){return-this.height/2}_renderTextCommon(t,e){t.save();let i=0,r=this._getLeftOffset(),s=this._getTopOffset();for(let n=0,o=this._textLines.length;n<o;n++)this._renderTextLine(e,t,this._textLines[n],r+this._getLineLeftOffset(n),s+i+this.getHeightOfLineImpl(n),n),i+=this.getHeightOfLine(n);t.restore()}_renderTextFill(t){(this.fill||this.styleHas("fill"))&&this._renderTextCommon(t,"fillText")}_renderTextStroke(t){(this.stroke&&0!==this.strokeWidth||!this.isEmptyStyles())&&(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray),t.beginPath(),this._renderTextCommon(t,"strokeText"),t.closePath(),t.restore())}_renderChars(t,e,i,r,s,n){let o,a,l,h,c,u=this.textAlign.includes(ki),d=this.path,g=!u&&0===this.charSpacing&&this.isEmptyStyles(n)&&!d,f="ltr"===this.direction,p="ltr"===this.direction?1:-1,m=e.direction,y="",b=0;if(e.save(),m!==this.direction&&(e.canvas.setAttribute("dir",f?"ltr":"rtl"),e.direction=f?"ltr":"rtl",e.textAlign=f?B:X),s-=this.getHeightOfLineImpl(n)*this._fontSizeFraction,g)return this._renderChar(t,e,n,0,i.join(""),r,s),void e.restore();for(let g=0,f=i.length-1;g<=f;g++)h=g===f||this.charSpacing||d,y+=i[g],l=this.__charBounds[n][g],0===b?(r+=p*(l.kernedWidth-l.width),b+=l.width):b+=l.kernedWidth,u&&!h&&this._reSpaceAndTab.test(i[g])&&(h=!0),h||(o=o||this.getCompleteStyleDeclaration(n,g),a=this.getCompleteStyleDeclaration(n,g+1),h=Ts(o,a,!1)),h&&(d?(e.save(),e.translate(l.renderLeft,l.renderTop),e.rotate(l.angle),this._renderChar(t,e,n,g,y,-b/2,0),e.restore()):(c=r,this._renderChar(t,e,n,g,y,c,s)),y="",o=a,r+=p*b,b=0);e.restore()}_applyPatternGradientTransformText(t){let e=this.width+this.strokeWidth,i=this.height+this.strokeWidth,r=Tt({width:e,height:i}),s=r.getContext("2d");return r.width=e,r.height=i,s.beginPath(),s.moveTo(0,0),s.lineTo(e,0),s.lineTo(e,i),s.lineTo(0,i),s.closePath(),s.translate(e/2,i/2),s.fillStyle=t.toLive(s),this._applyPatternGradientTransform(s,t),s.fill(),s.createPattern(r,"no-repeat")}handleFiller(t,e,i){let r,s;return te(i)?"percentage"===i.gradientUnits||i.gradientTransform||i.patternTransform?(r=-this.width/2,s=-this.height/2,t.translate(r,s),t[e]=this._applyPatternGradientTransformText(i),{offsetX:r,offsetY:s}):(t[e]=i.toLive(t),this._applyPatternGradientTransform(t,i)):(t[e]=i,{offsetX:0,offsetY:0})}_setStrokeStyles(t,{stroke:e,strokeWidth:i}){return t.lineWidth=i,t.lineCap=this.strokeLineCap,t.lineDashOffset=this.strokeDashOffset,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,this.handleFiller(t,"strokeStyle",e)}_setFillStyles(t,{fill:e}){return this.handleFiller(t,"fillStyle",e)}_renderChar(t,e,i,r,s,n,o){let a=this._getStyleDeclaration(i,r),l=this.getCompleteStyleDeclaration(i,r),h="fillText"===t&&l.fill,c="strokeText"===t&&l.stroke&&l.strokeWidth;if(c||h){if(e.save(),e.font=this._getFontDeclaration(l),a.textBackgroundColor&&this._removeShadow(e),a.deltaY&&(o+=a.deltaY),h){let t=this._setFillStyles(e,l);e.fillText(s,n-t.offsetX,o-t.offsetY)}if(c){let t=this._setStrokeStyles(e,l);e.strokeText(s,n-t.offsetX,o-t.offsetY)}e.restore()}}setSuperscript(t,e){this._setScript(t,e,this.superscript)}setSubscript(t,e){this._setScript(t,e,this.subscript)}_setScript(t,e,i){let r=this.get2DCursorLocation(t,!0),s=this.getValueOfPropertyAt(r.lineIndex,r.charIndex,"fontSize"),n=this.getValueOfPropertyAt(r.lineIndex,r.charIndex,"deltaY"),o={fontSize:s*i.size,deltaY:n+s*i.baseline};this.setSelectionStyles(o,t,e)}_getLineLeftOffset(t){let e=this.getLineWidth(t),i=this.width-e,r=this.textAlign,s=this.direction,n=this.isEndOfWrapping(t),o=0;return"justify"===r||"justify-center"===r&&!n||"justify-right"===r&&!n||"justify-left"===r&&!n?0:("center"===r&&(o=i/2),"right"===r&&(o=i),"justify-center"===r&&(o=i/2),"justify-right"===r&&(o=i),"rtl"===s&&("right"===r||"justify-right"===r?o=0:"left"===r||"justify-left"===r?o=-i:"center"!==r&&"justify-center"!==r||(o=-i/2)),o)}_clearCache(){this._forceClearCache=!1,this.__lineWidths=[],this.__lineHeights=[],this.__charBounds=[]}getLineWidth(t){if(void 0!==this.__lineWidths[t])return this.__lineWidths[t];let{width:e}=this.measureLine(t);return this.__lineWidths[t]=e,e}_getWidthOfCharSpacing(){return 0===this.charSpacing?0:this.fontSize*this.charSpacing/1e3}getValueOfPropertyAt(t,e,i){var r;return null==(r=this._getStyleDeclaration(t,e)[i])?this[i]:r}_renderTextDecoration(t,e){if(!this[e]&&!this.styleHas(e))return;let i=this._getTopOffset(),r=this._getLeftOffset(),s=this.path,n=this._getWidthOfCharSpacing(),o="linethrough"===e?.5:+("overline"===e),a=this.offsets[e];for(let l=0,h=this._textLines.length;l<h;l++){let h=this.getHeightOfLine(l);if(!this[e]&&!this.styleHas(e,l)){i+=h;continue}let c,u=this._textLines[l],d=h/this.lineHeight,g=this._getLineLeftOffset(l),f=0,p=0,m=this.getValueOfPropertyAt(l,0,e),y=this.getValueOfPropertyAt(l,0,it),b=this.getValueOfPropertyAt(l,0,"textDecorationColor")||y,_=this.getValueOfPropertyAt(l,0,_i),v=m,x=b,C=_,w=i+d*(1-this._fontSizeFraction),S=this.getHeightOfChar(l,0),T=this.getValueOfPropertyAt(l,0,"deltaY");for(let i=0,n=u.length;i<n;i++){let n=this.__charBounds[l][i];v=this.getValueOfPropertyAt(l,i,e),c=this.getValueOfPropertyAt(l,i,it),x=this.getValueOfPropertyAt(l,i,"textDecorationColor")||c,C=this.getValueOfPropertyAt(l,i,_i);let h=this.getHeightOfChar(l,i),u=this.getValueOfPropertyAt(l,i,"deltaY");if(s&&v&&c){let e=this.fontSize*C/1e3;t.save(),t.fillStyle=x,t.translate(n.renderLeft,n.renderTop),t.rotate(n.angle),t.fillRect(-n.kernedWidth/2,a*h+u-o*e,n.kernedWidth,e),t.restore()}else if((v!==m||c!==y||x!==b||h!==S||C!==_||u!==T)&&p>0){let e=this.fontSize*_/1e3,i=r+g+f;"rtl"===this.direction&&(i=this.width-i-p),m&&b&&_&&(t.fillStyle=b,t.fillRect(i,w+a*S+T-o*e,p,e)),f=n.left,p=n.width,m=v,b=x,_=C,y=c,S=h,T=u}else p+=n.kernedWidth}let O=r+g+f;"rtl"===this.direction&&(O=this.width-O-p),t.fillStyle=x;let k=this.fontSize*C/1e3;v&&x&&C&&t.fillRect(O,w+a*S+T-o*k,p-n,k),i+=h}this._removeShadow(t)}_getFontDeclaration({fontFamily:e=this.fontFamily,fontStyle:i=this.fontStyle,fontWeight:r=this.fontWeight,fontSize:s=this.fontSize}={},n){let o=e.includes("'")||e.includes('"')||e.includes(",")||t.genericFonts.includes(e.toLowerCase())?e:`"${e}"`;return[i,r,`${n?this.CACHE_FONT_SIZE:s}px`,o].join(" ")}render(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._forceClearCache&&this.initDimensions(),super.render(t)))}graphemeSplit(t){return me(t)}_splitTextIntoLines(t){let e=t.split(this._reNewline),i=Array(e.length),r=["\n"],s=[];for(let t=0;t<e.length;t++)i[t]=this.graphemeSplit(e[t]),s=s.concat(i[t],r);return s.pop(),{_unwrappedLines:i,lines:e,graphemeText:s,graphemeLines:i}}toObject(t=[]){return{...super.toObject([...Si,...t]),styles:Os(this.styles,this.text),...this.path?{path:this.path.toObject()}:{}}}set(t,e){let{textLayoutProperties:i}=this.constructor;super.set(t,e);let r=!1,s=!1;if("object"==typeof t)for(let e in t)"path"===e&&this.setPathInfo(),r=r||i.includes(e),s=s||"path"===e;else r=i.includes(t),s="path"===t;return s&&this.setPathInfo(),r&&this.initialized&&(this.initDimensions(),this.setCoords()),this}complexity(){return 1}static async fromElement(e,i,r){let s=Ks(e,t.ATTRIBUTE_NAMES,r),{textAnchor:n=B,textDecoration:o="",dx:a=0,dy:l=0,top:h=0,left:c=0,fontSize:u=16,strokeWidth:d=1,...g}={...i,...s},f=new this(oi(e.textContent||"").trim(),{left:c+a,top:h+l,underline:o.includes("underline"),overline:o.includes("overline"),linethrough:o.includes("line-through"),strokeWidth:0,fontSize:u,...g}),p=f.getScaledHeight()/f.height,m=((f.height+f.strokeWidth)*f.lineHeight-f.height)*p,y=f.getScaledHeight()+m,b=0;return"center"===n&&(b=f.getScaledWidth()/2),"right"===n&&(b=f.getScaledWidth()),f.set({left:f.left-b,top:f.top-(y-f.fontSize*(.07+f._fontSizeFraction))/f.lineHeight,strokeWidth:d}),f}static fromObject(t){return this._fromObject({...t,styles:ks(t.styles||{},t.text)},{extraParam:"text"})}};p(Go,"textLayoutProperties",wi),p(Go,"cacheProperties",[...Xi,...Si]),p(Go,"ownDefaults",Oi),p(Go,"type","Text"),p(Go,"genericFonts",["serif","sans-serif","monospace","cursive","fantasy","system-ui","ui-serif","ui-sans-serif","ui-monospace","ui-rounded","math","emoji","fangsong"]),p(Go,"ATTRIBUTE_NAMES",Ds.concat("x","y","dx","dy","font-family","font-style","font-weight","font-size","letter-spacing","text-decoration","text-decoration-thickness","text-decoration-color","text-anchor")),ms(Go,[class extends bi{_toSVG(){let t=this._getSVGLeftTopOffsets(),e=this._getSVGTextAndBg(t.textTop,t.textLeft);return this._wrapSVGTextAndBg(e)}toSVG(t){let e=this._createBaseSVGMarkup(this._toSVG(),{reviver:t,noStyle:!0,withShadow:!0}),i=this.path;return i?e+i._createBaseSVGMarkup(i._toSVG(),{reviver:t,withShadow:!0,additionalTransform:Zt(this.calcOwnMatrix())}):e}_getSVGLeftTopOffsets(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}}_wrapSVGTextAndBg({textBgRects:t,textSpans:e}){let i=this.getSvgTextDecoration(this);return[t.join(""),'\t\t<text xml:space="preserve" ',`font-family="${fe(this.fontFamily.replace(Vo,"'"))}" `,`font-size="${fe(this.fontSize)}" `,this.fontStyle?`font-style="${fe(this.fontStyle)}" `:"",this.fontWeight?`font-weight="${fe(this.fontWeight)}" `:"",i?`text-decoration="${i}" `:"","rtl"===this.direction?'direction="rtl" ':"",'style="',this.getSvgStyles(!0),'"',this.addPaintOrder()," >",e.join(""),"</text>\n"]}_getSVGTextAndBg(t,e){let i,r=[],s=[],n=t;this.backgroundColor&&s.push(zo(this.backgroundColor,-this.width/2,-this.height/2,this.width,this.height));for(let t=0,o=this._textLines.length;t<o;t++)i=this._getLineLeftOffset(t),"rtl"===this.direction&&(i+=this.width),(this.textBackgroundColor||this.styleHas("textBackgroundColor",t))&&this._setSVGTextLineBg(s,t,e+i,n),this._setSVGTextLineText(r,t,e+i,n),n+=this.getHeightOfLine(t);return{textSpans:r,textBgRects:s}}_createTextCharSpan(t,e,i,r,s){let n=y.NUM_FRACTION_DIGITS,o=this.getSvgSpanStyles(e,t!==t.trim()||!!t.match(No)),a=o?`style="${o}"`:"",l=e.deltaY,h=l?` dy="${Qt(l,n)}" `:"",{angle:c,renderLeft:u,renderTop:d,width:g}=s,f="";if(void 0!==u){let t=g/2;c&&(f=` rotate="${Qt(Mt(c),n)}"`);let e=Xt({angle:Mt(c)});e[4]=u,e[5]=d;let s=new gt(-t,0).transform(e);i=s.x,r=s.y}return`<tspan x="${Qt(i,n)}" y="${Qt(r,n)}" ${h}${f}${a}>${fe(t)}</tspan>`}_setSVGTextLineText(t,e,i,r){let s,n,o,a,l,h=this.getHeightOfLine(e),c=this.textAlign.includes(ki),u=this._textLines[e],d="",g=0;r+=h*(1-this._fontSizeFraction)/this.lineHeight;for(let h=0,f=u.length-1;h<=f;h++)l=h===f||this.charSpacing||this.path,d+=u[h],o=this.__charBounds[e][h],0===g?(i+=o.kernedWidth-o.width,g+=o.width):g+=o.kernedWidth,c&&!l&&this._reSpaceAndTab.test(u[h])&&(l=!0),l||(s=s||this.getCompleteStyleDeclaration(e,h),n=this.getCompleteStyleDeclaration(e,h+1),l=Ts(s,n,!0)),l&&(a=this._getStyleDeclaration(e,h),t.push(this._createTextCharSpan(d,a,i,r,o)),d="",s=n,"rtl"===this.direction?i-=g:i+=g,g=0)}_setSVGTextLineBg(t,e,i,r){let s,n=this._textLines[e],o=this.getHeightOfLine(e)/this.lineHeight,a=0,l=0,h=this.getValueOfPropertyAt(e,0,"textBackgroundColor");for(let c=0;c<n.length;c++){let{left:n,width:u,kernedWidth:d}=this.__charBounds[e][c];s=this.getValueOfPropertyAt(e,c,"textBackgroundColor"),s===h?a+=d:(h&&t.push(zo(h,i+l,r,a,o)),l=n,a=u,h=s)}s&&t.push(zo(h,i+l,r,a,o))}getSvgStyles(t){let e=ri(this.textDecorationColor)?` text-decoration-color: ${fe(this[vi])};`:"";return`${super.getSvgStyles(t)} text-decoration-thickness: ${Qt(this.textDecorationThickness*this.getObjectScaling().y/10,y.NUM_FRACTION_DIGITS)}%;${e} white-space: pre;`}getSvgSpanStyles(t,e){let{fontFamily:i,strokeWidth:r,stroke:s,fill:n,fontSize:o,fontStyle:a,fontWeight:l,textDecorationThickness:h,textDecorationColor:c,linethrough:u,overline:d,underline:g}=t,f=this.getSvgTextDecoration({underline:g??this.underline,overline:d??this.overline,linethrough:u??this.linethrough}),p=h||this.textDecorationThickness,m=c||this.textDecorationColor,b=si(r),_=ni(i),v=si(o),x=ni(a),C=si(l)||ni(l),w=ni(m);return[s?yi(rt,s):"",b?`stroke-width: ${fe(b)}; `:"",_?`font-family: ${_.includes("'")||_.includes('"')?fe(_):`'${fe(_)}'`}; `:"",v?`font-size: ${fe(v)}px; `:"",x?`font-style: ${fe(x)}; `:"",C?`font-weight: ${fe(C)}; `:"",f?`text-decoration: ${f}; text-decoration-thickness: ${Qt(p*this.getObjectScaling().y/10,y.NUM_FRACTION_DIGITS)}%;${w?` text-decoration-color: ${fe(w)};`:""} `:"",n?yi(it,n):"",e?"white-space: pre; ":""].join("")}getSvgTextDecoration(t){return["overline","underline","line-through"].filter(e=>t[e.replace("-","")]).join(" ")}}]),at.setClass(Go),at.setSVGClass(Go);var Uo=class{constructor(t){p(this,"target",void 0),p(this,"__mouseDownInPlace",!1),p(this,"__dragStartFired",!1),p(this,"__isDraggingOver",!1),p(this,"__dragStartSelection",void 0),p(this,"__dragImageDisposer",void 0),p(this,"_dispose",void 0),this.target=t;let e=[this.target.on("dragenter",this.dragEnterHandler.bind(this)),this.target.on("dragover",this.dragOverHandler.bind(this)),this.target.on("dragleave",this.dragLeaveHandler.bind(this)),this.target.on("dragend",this.dragEndHandler.bind(this)),this.target.on("drop",this.dropHandler.bind(this))];this._dispose=()=>{e.forEach(t=>t()),this._dispose=void 0}}isPointerOverSelection(t){let e=this.target,i=e.getSelectionStartFromPointer(t);return e.isEditing&&i>=e.selectionStart&&i<=e.selectionEnd&&e.selectionStart<e.selectionEnd}start(t){return this.__mouseDownInPlace=this.isPointerOverSelection(t)}isActive(){return this.__mouseDownInPlace}end(t){let e=this.isActive();return e&&!this.__dragStartFired&&(this.target.setCursorByClick(t),this.target.initDelayedCursor(!0)),this.__mouseDownInPlace=!1,this.__dragStartFired=!1,this.__isDraggingOver=!1,e}getDragStartSelection(){return this.__dragStartSelection}setDragImage(t,{selectionStart:e,selectionEnd:i}){var r;let s=this.target,n=s.canvas,o=new gt(s.flipX?-1:1,s.flipY?-1:1),a=s._getCursorBoundaries(e),l=new gt(a.left+a.leftOffset,a.top+a.topOffset).multiply(o).transform(s.calcTransformMatrix()),h=n.getScenePoint(t).subtract(l),c=s.getCanvasRetinaScaling(),u=s.getBoundingRect(),d=l.subtract(new gt(u.left,u.top)),g=n.viewportTransform,f=d.add(h).transform(g,!0),p=s.backgroundColor,m=Ss(s.styles);s.backgroundColor="";let y={stroke:"transparent",fill:"transparent",textBackgroundColor:"transparent"};s.setSelectionStyles(y,0,e),s.setSelectionStyles(y,i,s.text.length),s.dirty=!0;let b=s.toCanvasElement({enableRetinaScaling:n.enableRetinaScaling,viewportTransform:!0});s.backgroundColor=p,s.styles=m,s.dirty=!0,zn(b,{position:"fixed",left:-b.width+"px",border:Y,width:b.width/c+"px",height:b.height/c+"px"}),this.__dragImageDisposer&&this.__dragImageDisposer(),this.__dragImageDisposer=()=>{b.remove()},ne(t.target||this.target.hiddenTextarea).body.appendChild(b),null==(r=t.dataTransfer)||r.setDragImage(b,f.x,f.y)}onDragStart(t){this.__dragStartFired=!0;let e=this.target,i=this.isActive();if(i&&t.dataTransfer){let i=this.__dragStartSelection={selectionStart:e.selectionStart,selectionEnd:e.selectionEnd},r=e._text.slice(i.selectionStart,i.selectionEnd).join(""),s={text:e.text,value:r,...i};t.dataTransfer.setData("text/plain",r),t.dataTransfer.setData("application/fabric",JSON.stringify({value:r,styles:e.getSelectionStyles(i.selectionStart,i.selectionEnd,!0)})),t.dataTransfer.effectAllowed="copyMove",this.setDragImage(t,s)}return e.abortCursorAnimation(),i}canDrop(t){if(this.target.editable&&!this.target.getActiveControl()&&!t.defaultPrevented){if(this.isActive()&&this.__dragStartSelection){let e=this.target.getSelectionStartFromPointer(t),i=this.__dragStartSelection;return e<i.selectionStart||e>i.selectionEnd}return!0}return!1}targetCanDrop(t){return this.target.canDrop(t)}dragEnterHandler({e:t}){let e=this.targetCanDrop(t);!this.__isDraggingOver&&e&&(this.__isDraggingOver=!0)}dragOverHandler(t){let{e}=t,i=this.targetCanDrop(e);!this.__isDraggingOver&&i?this.__isDraggingOver=!0:this.__isDraggingOver&&!i&&(this.__isDraggingOver=!1),this.__isDraggingOver&&(e.preventDefault(),t.canDrop=!0,t.dropTarget=this.target)}dragLeaveHandler(){(this.__isDraggingOver||this.isActive())&&(this.__isDraggingOver=!1)}dropHandler(t){var e;let{e:i}=t,r=i.defaultPrevented;this.__isDraggingOver=!1,i.preventDefault();let s=null==(e=i.dataTransfer)?void 0:e.getData("text/plain");if(s&&!r){let e=this.target,r=e.canvas,n=e.getSelectionStartFromPointer(i),{styles:o}=i.dataTransfer.types.includes("application/fabric")?JSON.parse(i.dataTransfer.getData("application/fabric")):{},a=s[Math.max(0,s.length-1)];if(this.__dragStartSelection){let t=this.__dragStartSelection.selectionStart,i=this.__dragStartSelection.selectionEnd;n>t&&n<=i?n=t:n>i&&(n-=i-t),e.removeChars(t,i),delete this.__dragStartSelection}e._reNewline.test(a)&&(e._reNewline.test(e._text[n])||n===e._text.length)&&(s=s.trimEnd()),t.didDrop=!0,t.dropTarget=e,e.insertChars(s,o,n),r.setActiveObject(e),e.enterEditing(i),e.selectionStart=Math.min(n+0,e._text.length),e.selectionEnd=Math.min(e.selectionStart+s.length,e._text.length),e.hiddenTextarea.value=e.text,e._updateTextarea(),e.hiddenTextarea.focus(),e.fire(K,{index:n+0,action:"drop"}),r.fire("text:changed",{target:e}),r.contextTopDirty=!0,r.requestRenderAll()}}dragEndHandler({e:t}){if(this.isActive()&&this.__dragStartFired&&this.__dragStartSelection){var e;let i=this.target,r=this.target.canvas,{selectionStart:s,selectionEnd:n}=this.__dragStartSelection,o=(null==(e=t.dataTransfer)?void 0:e.dropEffect)||"none";"none"===o?(i.selectionStart=s,i.selectionEnd=n,i._updateTextarea(),i.hiddenTextarea.focus()):(i.clearContextTop(),"move"===o&&(i.removeChars(s,n),i.selectionStart=i.selectionEnd=s,i.hiddenTextarea&&(i.hiddenTextarea.value=i.text),i._updateTextarea(),i.fire(K,{index:s,action:"dragend"}),r.fire("text:changed",{target:i}),r.requestRenderAll()),i.exitEditing())}this.__dragImageDisposer&&this.__dragImageDisposer(),delete this.__dragImageDisposer,delete this.__dragStartSelection,this.__isDraggingOver=!1}dispose(){this._dispose&&this._dispose()}};const qo=/[ \n\.,;!\?\-]/;var Ko=class extends Go{constructor(...t){super(...t),p(this,"_currentCursorOpacity",1)}initBehavior(){this._tick=this._tick.bind(this),this._onTickComplete=this._onTickComplete.bind(this),this.updateSelectionOnMouseMove=this.updateSelectionOnMouseMove.bind(this)}onDeselect(t){return this.isEditing&&this.exitEditing(),this.selected=!1,super.onDeselect(t)}_animateCursor({toValue:t,duration:e,delay:i,onComplete:r}){return Mr({startValue:this._currentCursorOpacity,endValue:t,duration:e,delay:i,onComplete:r,abort:()=>!this.canvas||this.selectionStart!==this.selectionEnd,onChange:t=>{this._currentCursorOpacity=t,this.renderCursorOrSelection()}})}_tick(t){this._currentTickState=this._animateCursor({toValue:0,duration:this.cursorDuration/2,delay:Math.max(t||0,100),onComplete:this._onTickComplete})}_onTickComplete(){var t;null==(t=this._currentTickCompleteState)||t.abort(),this._currentTickCompleteState=this._animateCursor({toValue:1,duration:this.cursorDuration,onComplete:this._tick})}initDelayedCursor(t){this.abortCursorAnimation(),this._tick(t?0:this.cursorDelay)}abortCursorAnimation(){let t=!1;[this._currentTickState,this._currentTickCompleteState].forEach(e=>{e&&!e.isDone()&&(t=!0,e.abort())}),this._currentCursorOpacity=1,t&&this.clearContextTop()}restartCursorIfNeeded(){[this._currentTickState,this._currentTickCompleteState].some(t=>!t||t.isDone())&&this.initDelayedCursor()}selectAll(){return this.selectionStart=0,this.selectionEnd=this._text.length,this._fireSelectionChanged(),this._updateTextarea(),this}cmdAll(){this.selectAll(),this.renderCursorOrSelection()}getSelectedText(){return this._text.slice(this.selectionStart,this.selectionEnd).join("")}findWordBoundaryLeft(t){let e=0,i=t-1;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i--;for(;/\S/.test(this._text[i])&&i>-1;)e++,i--;return t-e}findWordBoundaryRight(t){let e=0,i=t;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i++;for(;/\S/.test(this._text[i])&&i<this._text.length;)e++,i++;return t+e}findLineBoundaryLeft(t){let e=0,i=t-1;for(;!/\n/.test(this._text[i])&&i>-1;)e++,i--;return t-e}findLineBoundaryRight(t){let e=0,i=t;for(;!/\n/.test(this._text[i])&&i<this._text.length;)e++,i++;return t+e}searchWordBoundary(t,e){let i=this._text,r=t>0&&this._reSpace.test(i[t])&&(-1===e||!W.test(i[t-1]))?t-1:t,s=i[r];for(;r>0&&r<i.length&&!qo.test(s);)r+=e,s=i[r];return-1===e&&qo.test(s)&&r++,r}selectWord(t){var e;t=null==(e=t)?this.selectionStart:e;let i=this.searchWordBoundary(t,-1),r=Math.max(i,this.searchWordBoundary(t,1));this.selectionStart=i,this.selectionEnd=r,this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()}selectLine(t){var e;t=null==(e=t)?this.selectionStart:e;let i=this.findLineBoundaryLeft(t),r=this.findLineBoundaryRight(t);this.selectionStart=i,this.selectionEnd=r,this._fireSelectionChanged(),this._updateTextarea()}enterEditing(t){!this.isEditing&&this.editable&&(this.enterEditingImpl(),this.fire("editing:entered",t?{e:t}:void 0),this._fireSelectionChanged(),this.canvas&&(this.canvas.fire("text:editing:entered",{target:this,e:t}),this.canvas.requestRenderAll()))}enterEditingImpl(){this.canvas&&(this.canvas.calcOffset(),this.canvas.textEditingManager.exitTextEditing()),this.isEditing=!0,this.initHiddenTextarea(),this.hiddenTextarea.focus(),this.hiddenTextarea.value=this.text,this._updateTextarea(),this._saveEditingProps(),this._setEditingProps(),this._textBeforeEdit=this.text,this._tick()}updateSelectionOnMouseMove(t){if(this.getActiveControl())return;let e=this.hiddenTextarea;ne(e).activeElement!==e&&e.focus();let i=this.getSelectionStartFromPointer(t),r=this.selectionStart,s=this.selectionEnd;(i===this.__selectionStartOnMouseDown&&r!==s||r!==i&&s!==i)&&(i>this.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=i):(this.selectionStart=i,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===r&&this.selectionEnd===s||(this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}_setEditingProps(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0}fromStringToGraphemeSelection(t,e,i){let r=i.slice(0,t),s=this.graphemeSplit(r).length;if(t===e)return{selectionStart:s,selectionEnd:s};let n=i.slice(t,e);return{selectionStart:s,selectionEnd:s+this.graphemeSplit(n).length}}fromGraphemeToStringSelection(t,e,i){let r=i.slice(0,t).join("").length;return t===e?{selectionStart:r,selectionEnd:r}:{selectionStart:r,selectionEnd:r+i.slice(t,e).join("").length}}_updateTextarea(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){let t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}}updateFromTextArea(){let{hiddenTextarea:t,direction:e,textAlign:i,inCompositionMode:r}=this;if(!t)return;let s="justify"===i?"ltr"===e?B:X:i.replace("justify-",""),n=this.getPositionByOrigin(s,"top");this.cursorOffsetCache={},this.text=t.value,this.set("dirty",!0),this.initDimensions(),this.setPositionByOrigin(n,s,"top"),this.setCoords();let o=this.fromStringToGraphemeSelection(t.selectionStart,t.selectionEnd,t.value);this.selectionEnd=this.selectionStart=o.selectionEnd,r||(this.selectionStart=o.selectionStart),this.updateTextareaPosition()}updateTextareaPosition(){if(this.selectionStart===this.selectionEnd){let t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}}_calcTextareaPosition(){if(!this.canvas)return{left:"1px",top:"1px"};let t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),i=this.get2DCursorLocation(t),r=i.lineIndex,s=i.charIndex,n=this.getValueOfPropertyAt(r,s,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.getCanvasRetinaScaling(),l=this.canvas.upperCanvasEl,h=l.width/a,c=l.height/a,u=h-n,d=c-n,g=new gt(e.left+o,e.top+e.topOffset+n).transform(this.calcTransformMatrix()).transform(this.canvas.viewportTransform).multiply(new gt(l.clientWidth/h,l.clientHeight/c));return g.x<0&&(g.x=0),g.x>u&&(g.x=u),g.y<0&&(g.y=0),g.y>d&&(g.y=d),g.x+=this.canvas._offset.left,g.y+=this.canvas._offset.top,{left:`${g.x}px`,top:`${g.y}px`,fontSize:`${n}px`,charHeight:n}}_saveEditingProps(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}}_restoreEditingProps(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor||this.canvas.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor||this.canvas.moveCursor),delete this._savedProps)}exitEditingImpl(){let t=this.hiddenTextarea;this.selected=!1,this.isEditing=!1,t&&(t.blur&&t.blur(),t.parentNode&&t.parentNode.removeChild(t)),this.hiddenTextarea=null,this.abortCursorAnimation(),this.selectionStart!==this.selectionEnd&&this.clearContextTop(),this.selectionEnd=this.selectionStart,this._restoreEditingProps(),this._forceClearCache&&(this.initDimensions(),this.setCoords())}exitEditing(){let t=this._textBeforeEdit!==this.text;return this.exitEditingImpl(),this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this}_removeExtraneousStyles(){for(let t in this.styles)this._textLines[t]||delete this.styles[t]}removeStyleFromTo(t,e){let{lineIndex:i,charIndex:r}=this.get2DCursorLocation(t,!0),{lineIndex:s,charIndex:n}=this.get2DCursorLocation(e,!0);if(i!==s){if(this.styles[i])for(let t=r;t<this._unwrappedTextLines[i].length;t++)delete this.styles[i][t];if(this.styles[s])for(let t=n;t<this._unwrappedTextLines[s].length;t++){let e=this.styles[s][t];e&&(this.styles[i]||(this.styles[i]={}),this.styles[i][r+t-n]=e)}for(let t=i+1;t<=s;t++)delete this.styles[t];this.shiftLineStyles(s,i-s)}else if(this.styles[i]){let t=this.styles[i],e=n-r;for(let e=r;e<n;e++)delete t[e];for(let r in this.styles[i]){let i=parseInt(r,10);i>=n&&(t[i-e]=t[r],delete t[r])}}}shiftLineStyles(t,e){let i=Object.assign({},this.styles);for(let r in this.styles){let s=parseInt(r,10);s>t&&(this.styles[s+e]=i[s],i[s-e]||delete this.styles[s])}}insertNewlineStyleObject(t,e,i,r){let s={},n=this._unwrappedTextLines[t].length,o=n===e,a=!1;i||(i=1),this.shiftLineStyles(t,i);let l=this.styles[t]?this.styles[t][0===e?e:e-1]:void 0;for(let i in this.styles[t]){let r=parseInt(i,10);r>=e&&(a=!0,s[r-e]=this.styles[t][i],o&&0===e||delete this.styles[t][i])}let h=!1;for(a&&!o&&(this.styles[t+i]=s,h=!0),(h||n>e)&&i--;i>0;)r&&r[i-1]?this.styles[t+i]={0:{...r[i-1]}}:l?this.styles[t+i]={0:{...l}}:delete this.styles[t+i],i--;this._forceClearCache=!0}insertCharStyleObject(t,e,i,r){this.styles||(this.styles={});let s=this.styles[t],n=s?{...s}:{};i||(i=1);for(let t in n){let r=parseInt(t,10);r>=e&&(s[r+i]=n[r],n[r-i]||delete s[r])}if(this._forceClearCache=!0,r){for(;i--;)Object.keys(r[i]).length&&(this.styles[t]||(this.styles[t]={}),this.styles[t][e+i]={...r[i]});return}if(!s)return;let o=s[e?e-1:1];for(;o&&i--;)this.styles[t][e+i]={...o}}insertNewStyleBlock(t,e,i){let r,s=this.get2DCursorLocation(e,!0),n=[0],o=0;for(let e=0;e<t.length;e++)"\n"===t[e]?(o++,n[o]=0):n[o]++;for(n[0]>0&&(this.insertCharStyleObject(s.lineIndex,s.charIndex,n[0],i),i=i&&i.slice(n[0]+1)),o&&this.insertNewlineStyleObject(s.lineIndex,s.charIndex+n[0],o),r=1;r<o;r++)n[r]>0?this.insertCharStyleObject(s.lineIndex+r,0,n[r],i):i&&this.styles[s.lineIndex+r]&&i[0]&&(this.styles[s.lineIndex+r][0]=i[0]),i=i&&i.slice(n[r]+1);n[r]>0&&this.insertCharStyleObject(s.lineIndex+r,0,n[r],i)}removeChars(t,e=t+1){this.removeStyleFromTo(t,e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}insertChars(t,e,i,r=i){r>i&&this.removeStyleFromTo(i,r);let s=this.graphemeSplit(t);this.insertNewStyleBlock(s,i,e),this._text=[...this._text.slice(0,i),...s,...this._text.slice(r)],this.text=this._text.join(""),this.set("dirty",!0),this.initDimensions(),this.setCoords(),this._removeExtraneousStyles()}setSelectionStartEndWithShift(t,e,i){i<=t?(e===t?this._selectionDirection=B:"right"===this._selectionDirection&&(this._selectionDirection=B,this.selectionEnd=t),this.selectionStart=i):i>t&&i<e?"right"===this._selectionDirection?this.selectionEnd=i:this.selectionStart=i:(e===t?this._selectionDirection=X:"left"===this._selectionDirection&&(this._selectionDirection=X,this.selectionStart=e),this.selectionEnd=i)}},Jo=class extends Ko{initHiddenTextarea(){let t=this.canvas&&ne(this.canvas.getElement())||O(),e=t.createElement("textarea");Object.entries({autocapitalize:"off",autocorrect:"off",autocomplete:"off",spellcheck:"false","data-fabric":"textarea",wrap:"off",name:"fabricTextarea"}).map(([t,i])=>e.setAttribute(t,i));let{top:i,left:r,fontSize:s}=this._calcTextareaPosition();e.style.cssText=`position: absolute; top: ${i}; left: ${r}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${s};`,(this.hiddenTextareaContainer||t.body).appendChild(e),Object.entries({blur:"blur",keydown:"onKeyDown",keyup:"onKeyUp",input:"onInput",copy:"copy",cut:"copy",paste:"paste",compositionstart:"onCompositionStart",compositionupdate:"onCompositionUpdate",compositionend:"onCompositionEnd"}).map(([t,i])=>e.addEventListener(t,this[i].bind(this))),this.hiddenTextarea=e}blur(){this.abortCursorAnimation()}onKeyDown(t){if(!this.isEditing)return;let e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown)||!t.ctrlKey&&!t.metaKey)return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}onKeyUp(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())}onInput(t){let e=this.fromPaste,{value:i,selectionStart:r,selectionEnd:s}=this.hiddenTextarea;if(this.fromPaste=!1,t&&t.stopPropagation(),!this.isEditing)return;let n=()=>{this.updateFromTextArea(),this.fire(K),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())};if(""===this.hiddenTextarea.value)return this.styles={},void n();let o,a,l,h,c=this._splitTextIntoLines(i).graphemeText,u=this._text.length,d=c.length,g=this.selectionStart,f=this.selectionEnd,p=g!==f,m=d-u,b=this.fromStringToGraphemeSelection(r,s,i),_=g>b.selectionStart;p?(a=this._text.slice(g,f),m+=f-g):d<u&&(a=_?this._text.slice(f+m,f):this._text.slice(g,g-m));let v=c.slice(b.selectionEnd-m,b.selectionEnd);if(a&&a.length&&(v.length&&(o=this.getSelectionStyles(g,g+1,!1),o=v.map(()=>o[0])),p?(l=g,h=f):_?(l=f-a.length,h=f):(l=f,h=f+a.length),this.removeStyleFromTo(l,h)),v.length){let{copyPasteData:t}=T();e&&v.join("")===t.copiedText&&!y.disableStyleCopyPaste&&(o=t.copiedTextStyle),this.insertNewStyleBlock(v,g,o)}n()}onCompositionStart(){this.inCompositionMode=!0}onCompositionEnd(){this.inCompositionMode=!1}onCompositionUpdate({target:t}){let{selectionStart:e,selectionEnd:i}=t;this.compositionStart=e,this.compositionEnd=i,this.updateTextareaPosition()}copy(){if(this.selectionStart===this.selectionEnd)return;let{copyPasteData:t}=T();t.copiedText=this.getSelectedText(),y.disableStyleCopyPaste?t.copiedTextStyle=void 0:t.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd,!0),this._copyDone=!0}paste(){this.fromPaste=!0}_getWidthBeforeCursor(t,e){let i,r=this._getLineLeftOffset(t);return e>0&&(i=this.__charBounds[t][e-1],r+=i.left+i.width),r}getDownCursorOffset(t,e){let i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),s=r.lineIndex;if(s===this._textLines.length-1||t.metaKey||34===t.keyCode)return this._text.length-i;let n=r.charIndex,o=this._getWidthBeforeCursor(s,n),a=this._getIndexOnLine(s+1,o);return this._textLines[s].slice(n).length+a+1+this.missingNewlineOffset(s)}_getSelectionForOffset(t,e){return t.shiftKey&&this.selectionStart!==this.selectionEnd&&e?this.selectionEnd:this.selectionStart}getUpCursorOffset(t,e){let i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),s=r.lineIndex;if(0===s||t.metaKey||33===t.keyCode)return-i;let n=r.charIndex,o=this._getWidthBeforeCursor(s,n),a=this._getIndexOnLine(s-1,o),l=this._textLines[s].slice(0,n),h=this.missingNewlineOffset(s-1);return-this._textLines[s-1].length+a-l.length+(1-h)}_getIndexOnLine(t,e){let i,r,s=this._textLines[t],n=this._getLineLeftOffset(t),o=0;for(let a=0,l=s.length;a<l;a++)if(i=this.__charBounds[t][a].width,n+=i,n>e){r=!0;let t=n-i,s=n,l=Math.abs(t-e);o=Math.abs(s-e)<l?a:a-1;break}return r||(o=s.length-1),o}moveCursorDown(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)}moveCursorUp(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)}_moveCursorUpOrDown(t,e){let i=this[`get${t}CursorOffset`](e,this._selectionDirection===X);if(e.shiftKey?this.moveCursorWithShift(i):this.moveCursorWithoutShift(i),0!==i){let t=this.text.length;this.selectionStart=Bi(0,this.selectionStart,t),this.selectionEnd=Bi(0,this.selectionEnd,t),this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea()}}moveCursorWithShift(t){let e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t}moveCursorWithoutShift(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t}moveCursorLeft(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)}_move(t,e,i){let r;if(t.altKey)r=this[`findWordBoundary${i}`](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this[`findLineBoundary${i}`](this[e])}return void 0!==r&&this[e]!==r&&(this[e]=r,!0)}_moveLeft(t,e){return this._move(t,e,"Left")}_moveRight(t,e){return this._move(t,e,"Right")}moveCursorLeftWithoutShift(t){let e=!0;return this._selectionDirection=B,this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e}moveCursorLeftWithShift(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0===this.selectionStart?void 0:(this._selectionDirection=B,this._moveLeft(t,"selectionStart"))}moveCursorRight(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)}_moveCursorLeftOrRight(t,e){let i=`moveCursor${t}${e.shiftKey?"WithShift":"WithoutShift"}`;this._currentCursorOpacity=1,this[i](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())}moveCursorRightWithShift(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd===this._text.length?void 0:(this._selectionDirection=X,this._moveRight(t,"selectionEnd"))}moveCursorRightWithoutShift(t){let e=!0;return this._selectionDirection=X,this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e}};const Qo=t=>!!t.button;var Zo=class extends Jo{constructor(...t){super(...t),p(this,"draggableTextDelegate",void 0)}initBehavior(){this.on("mousedown",this._mouseDownHandler),this.on("mouseup",this.mouseUpHandler),this.on("mousedblclick",this.doubleClickHandler),this.on("mousetripleclick",this.tripleClickHandler),this.draggableTextDelegate=new Uo(this),super.initBehavior()}shouldStartDragging(){return this.draggableTextDelegate.isActive()}onDragStart(t){return this.draggableTextDelegate.onDragStart(t)}canDrop(t){return this.draggableTextDelegate.canDrop(t)}doubleClickHandler(t){this.isEditing&&(this.selectWord(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}tripleClickHandler(t){this.isEditing&&(this.selectLine(this.getSelectionStartFromPointer(t.e)),this.renderCursorOrSelection())}_mouseDownHandler({e:t,alreadySelected:e}){this.canvas&&this.editable&&!Qo(t)&&!this.getActiveControl()&&(this.draggableTextDelegate.start(t)||(this.canvas.textEditingManager.register(this),e&&(this.inCompositionMode=!1,this.setCursorByClick(t)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()),this.selected||(this.selected=e||this.isEditing)))}mouseUpHandler({e:t,transform:e}){let i=this.draggableTextDelegate.end(t);if(this.canvas){this.canvas.textEditingManager.unregister(this);let t=this.canvas._activeObject;if(t&&t!==this)return}!this.editable||this.group&&!this.group.interactive||e&&e.actionPerformed||Qo(t)||i||this.selected&&!this.getActiveControl()&&(this.enterEditing(t),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection())}setCursorByClick(t){let e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())}getSelectionStartFromPointer(t){let e=this.canvas.getScenePoint(t).transform(Pt(this.calcTransformMatrix())).add(new gt(-this._getLeftOffset(),-this._getTopOffset())),i=0,r=0,s=0;for(let t=0;t<this._textLines.length&&i<=e.y;t++)i+=this.getHeightOfLine(t),s=t,t>0&&(r+=this._textLines[t-1].length+this.missingNewlineOffset(t-1));let n=Math.abs(this._getLineLeftOffset(s)),o=this._textLines[s].length,a=this.__charBounds[s];for(let t=0;t<o;t++){let i=n+a[t].kernedWidth;if(e.x<=i){Math.abs(e.x-i)<=Math.abs(e.x-n)&&r++;break}n=i,r++}return Math.min(this.flipX?o-r:r,this._text.length)}};const ta="moveCursorUp",ea="moveCursorDown",ia="moveCursorLeft",ra="moveCursorRight",sa="exitEditing",na=(t,e)=>{let i=e.getRetinaScaling();t.setTransform(i,0,0,i,0,0);let r=e.viewportTransform;t.transform(r[0],r[1],r[2],r[3],r[4],r[5])},oa={selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"",cursorDelay:1e3,cursorDuration:600,caching:!0,hiddenTextareaContainer:null,keysMap:{9:sa,27:sa,33:ta,34:ea,35:ra,36:ia,37:ia,38:ta,39:ra,40:ea},keysMapRtl:{9:sa,27:sa,33:ta,34:ea,35:ia,36:ra,37:ra,38:ta,39:ia,40:ea},ctrlKeysMapDown:{65:"cmdAll"},ctrlKeysMapUp:{67:"copy",88:"cut"},_selectionDirection:null,_reSpace:/\s|\r?\n/,inCompositionMode:!1};var aa=class t extends Zo{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}get type(){let t=super.type;return"itext"===t?"i-text":t}constructor(e,i){super(e,{...t.ownDefaults,...i}),this.initBehavior()}_set(t,e){return this.isEditing&&this._savedProps&&t in this._savedProps?(this._savedProps[t]=e,this):("canvas"===t&&(this.canvas instanceof po&&this.canvas.textEditingManager.remove(this),e instanceof po&&e.textEditingManager.add(this)),super._set(t,e))}setSelectionStart(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)}setSelectionEnd(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)}_updateAndFire(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()}_fireSelectionChanged(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})}initDimensions(){this.isEditing&&this.initDelayedCursor(),super.initDimensions()}getSelectionStyles(t=this.selectionStart||0,e=this.selectionEnd,i){return super.getSelectionStyles(t,e,i)}setSelectionStyles(t,e=this.selectionStart||0,i=this.selectionEnd){return super.setSelectionStyles(t,e,i)}get2DCursorLocation(t=this.selectionStart,e){return super.get2DCursorLocation(t,e)}render(t){super.render(t),this.cursorOffsetCache={},this.renderCursorOrSelection()}toCanvasElement(t){let e=this.isEditing;this.isEditing=!1;let i=super.toCanvasElement(t);return this.isEditing=e,i}renderCursorOrSelection(){if(!this.isEditing||!this.canvas)return;let t=this.clearContextTop(!0);if(!t)return;let e,i=this._getCursorBoundaries(),r=this.findAncestorsWithClipPath(),s=r.length>0,n=t;if(s){e=Tt(t.canvas),n=e.getContext("2d"),na(n,this.canvas);let i=this.calcTransformMatrix();n.transform(i[0],i[1],i[2],i[3],i[4],i[5])}if(this.selectionStart!==this.selectionEnd||this.inCompositionMode?this.renderSelection(n,i):this.renderCursor(n,i),s)for(let e of r){let i=e.clipPath,r=Tt(t.canvas),s=r.getContext("2d");if(na(s,this.canvas),!i.absolutePositioned){let t=e.calcTransformMatrix();s.transform(t[0],t[1],t[2],t[3],t[4],t[5])}i.transform(s),i.drawObject(s,!0,{}),this.drawClipPathOnCache(n,i,r)}s&&(t.setTransform(1,0,0,1,0,0),t.drawImage(e,0,0)),this.canvas.contextTopDirty=!0,t.restore()}findAncestorsWithClipPath(){let t=[],e=this;for(;e;)e.clipPath&&t.push(e),e=e.parent;return t}_getCursorBoundaries(t=this.selectionStart,e){let i=this._getLeftOffset(),r=this._getTopOffset(),s=this._getCursorBoundariesOffsets(t,e);return{left:i,top:r,leftOffset:s.left,topOffset:s.top}}_getCursorBoundariesOffsets(t,e){return e?this.__getCursorBoundariesOffsets(t):this.cursorOffsetCache&&"top"in this.cursorOffsetCache?this.cursorOffsetCache:this.cursorOffsetCache=this.__getCursorBoundariesOffsets(t)}__getCursorBoundariesOffsets(t){let e=0,i=0,{charIndex:r,lineIndex:s}=this.get2DCursorLocation(t),{textAlign:n,direction:o}=this;for(let t=0;t<s;t++)e+=this.getHeightOfLine(t);let a=this._getLineLeftOffset(s),l=this.__charBounds[s][r];l&&(i=l.left),0!==this.charSpacing&&r===this._textLines[s].length&&(i-=this._getWidthOfCharSpacing());let h=a+(i>0?i:0);return"rtl"===o&&("right"===n||"justify"===n||"justify-right"===n?h*=-1:"left"===n||"justify-left"===n?h=a-(i>0?i:0):"center"!==n&&"justify-center"!==n||(h=a-(i>0?i:0))),{top:e,left:h}}renderCursorAt(t){this._renderCursor(this.canvas.contextTop,this._getCursorBoundaries(t,!0),t)}renderCursor(t,e){this._renderCursor(t,e,this.selectionStart)}getCursorRenderingData(t=this.selectionStart,e=this._getCursorBoundaries(t)){let i=this.get2DCursorLocation(t),r=i.lineIndex,s=i.charIndex>0?i.charIndex-1:0,n=this.getValueOfPropertyAt(r,s,"fontSize"),o=this.getObjectScaling().x*this.canvas.getZoom(),a=this.cursorWidth/o,l=this.getValueOfPropertyAt(r,s,"deltaY"),h=e.topOffset+(1-this._fontSizeFraction)*this.getHeightOfLine(r)/this.lineHeight-n*(1-this._fontSizeFraction);return{color:this.cursorColor||this.getValueOfPropertyAt(r,s,"fill"),opacity:this._currentCursorOpacity,left:e.left+e.leftOffset-a/2,top:h+e.top+l,width:a,height:n}}_renderCursor(t,e,i){let{color:r,opacity:s,left:n,top:o,width:a,height:l}=this.getCursorRenderingData(i,e);t.fillStyle=r,t.globalAlpha=s,t.fillRect(n,o,a,l)}renderSelection(t,e){let i={selectionStart:this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,selectionEnd:this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd};this._renderSelection(t,i,e)}renderDragSourceEffect(){let t=this.draggableTextDelegate.getDragStartSelection();this._renderSelection(this.canvas.contextTop,t,this._getCursorBoundaries(t.selectionStart,!0))}renderDropTargetEffect(t){let e=this.getSelectionStartFromPointer(t);this.renderCursorAt(e)}_renderSelection(t,e,i){let{textAlign:r,direction:s}=this,n=e.selectionStart,o=e.selectionEnd,a=r.includes(ki),l=this.get2DCursorLocation(n),h=this.get2DCursorLocation(o),c=l.lineIndex,u=h.lineIndex,d=l.charIndex<0?0:l.charIndex,g=h.charIndex<0?0:h.charIndex;for(let e=c;e<=u;e++){let n=this._getLineLeftOffset(e)||0,o=this.getHeightOfLine(e),l=0,h=0;if(e===c&&(l=this.__charBounds[c][d].left),e>=c&&e<u)h=a&&!this.isEndOfWrapping(e)?this.width:this.getLineWidth(e)||5;else if(e===u)if(0===g)h=this.__charBounds[u][g].left;else{let t=this._getWidthOfCharSpacing();h=this.__charBounds[u][g-1].left+this.__charBounds[u][g-1].width-t}let f=o;(this.lineHeight<1||e===u&&this.lineHeight>1)&&(o/=this.lineHeight);let p=i.left+n+l,m=o,y=0,b=h-l;this.inCompositionMode?(t.fillStyle=this.compositionColor||"black",m=1,y=o):t.fillStyle=this.selectionColor,"rtl"===s&&("right"===r||"justify"===r||"justify-right"===r?p=this.width-p-b:"left"===r||"justify-left"===r?p=i.left+n-h:"center"!==r&&"justify-center"!==r||(p=i.left+n-h)),t.fillRect(p,i.top+i.topOffset+y,b,m),i.topOffset+=f}}getCurrentCharFontSize(){let t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")}getCurrentCharColor(){let t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,it)}_getCurrentCharIndex(){let t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}dispose(){this.exitEditingImpl(),this.draggableTextDelegate.dispose(),super.dispose()}};p(aa,"ownDefaults",oa),p(aa,"type","IText"),at.setClass(aa),at.setClass(aa,"i-text");var la=class t extends aa{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(e,{...t.ownDefaults,...i})}static createControls(){return{controls:fs()}}initDimensions(){this.initialized&&(this.isEditing&&this.initDelayedCursor(),this._clearCache(),this.dynamicMinWidth=0,this._styleMap=this._generateStyleMap(this._splitText()),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this.textAlign.includes("justify")&&this.enlargeSpaces(),this.height=this.calcTextHeight())}_generateStyleMap(t){let e=0,i=0,r=0,s={};for(let n=0;n<t.graphemeLines.length;n++)"\n"===t.graphemeText[r]&&n>0?(i=0,r++,e++):!this.splitByGrapheme&&this._reSpaceAndTab.test(t.graphemeText[r])&&n>0&&(i++,r++),s[n]={line:e,offset:i},r+=t.graphemeLines[n].length,i+=t.graphemeLines[n].length;return s}styleHas(t,e){if(this._styleMap&&!this.isWrapping){let t=this._styleMap[e];t&&(e=t.line)}return super.styleHas(t,e)}isEmptyStyles(t){if(!this.styles)return!0;let e,i,r=0,s=!1,n=this._styleMap[t],o=this._styleMap[t+1];n&&(t=n.line,r=n.offset),o&&(e=o.line,s=e===t,i=o.offset);let a=void 0===t?this.styles:{line:this.styles[t]};for(let t in a)for(let e in a[t]){let n=parseInt(e,10);if(n>=r&&(!s||n<i))for(let i in a[t][e])return!1}return!0}_getStyleDeclaration(t,e){if(this._styleMap&&!this.isWrapping){let i=this._styleMap[t];if(!i)return{};t=i.line,e=i.offset+e}return super._getStyleDeclaration(t,e)}_setStyleDeclaration(t,e,i){let r=this._styleMap[t];super._setStyleDeclaration(r.line,r.offset+e,i)}_deleteStyleDeclaration(t,e){let i=this._styleMap[t];super._deleteStyleDeclaration(i.line,i.offset+e)}_getLineStyle(t){let e=this._styleMap[t];return!!this.styles[e.line]}_setLineStyle(t){let e=this._styleMap[t];super._setLineStyle(e.line)}_wrapText(t,e){this.isWrapping=!0;let i=this.getGraphemeDataForRender(t),r=[];for(let t=0;t<i.wordsData.length;t++)r.push(...this._wrapLine(t,e,i));return this.isWrapping=!1,r}getGraphemeDataForRender(t){let e=this.splitByGrapheme,i=e?"":" ",r=0;return{wordsData:t.map((t,s)=>{let n=0,o=e?this.graphemeSplit(t):this.wordSplit(t);return 0===o.length?[{word:[],width:0}]:o.map(t=>{let o=e?[t]:this.graphemeSplit(t),a=this._measureWord(o,s,n);return r=Math.max(a,r),n+=o.length+i.length,{word:o,width:a}})}),largestWordWidth:r}}_measureWord(t,e,i=0){let r,s=0;for(let n=0,o=t.length;n<o;n++)s+=this._getGraphemeBox(t[n],e,n+i,r,!0).kernedWidth,r=t[n];return s}wordSplit(t){return t.split(this._wordJoiners)}_wrapLine(t,e,{largestWordWidth:i,wordsData:r},s=0){let n=this._getWidthOfCharSpacing(),o=this.splitByGrapheme,a=[],l=o?"":" ",h=0,c=[],u=0,d=0,g=!0;e-=s;let f,p=Math.max(e,i,this.dynamicMinWidth),m=r[t];for(f=0;f<m.length;f++){let{word:e,width:i}=m[f];u+=e.length,h+=d+i-n,h>p&&!g?(a.push(c),c=[],h=i,g=!0):h+=n,g||o||c.push(l),c=c.concat(e),d=o?0:this._measureWord([l],t,u),u++,g=!1}return f&&a.push(c),i+s>this.dynamicMinWidth&&(this.dynamicMinWidth=i-n+s),a}isEndOfWrapping(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line}missingNewlineOffset(t,e){return this.splitByGrapheme&&!e?+!!this.isEndOfWrapping(t):1}_splitTextIntoLines(t){let e=super._splitTextIntoLines(t),i=this._wrapText(e.lines,this.width),r=Array(i.length);for(let t=0;t<i.length;t++)r[t]=i[t].join("");return e.lines=r,e.graphemeLines=i,e}getMinWidth(){return Math.max(this.minWidth,this.dynamicMinWidth)}_removeExtraneousStyles(){let t=new Map;for(let e in this._styleMap){let i=parseInt(e,10);if(this._textLines[i]){let i=this._styleMap[e].line;t.set(`${i}`,!0)}}for(let e in this.styles)t.has(e)||delete this.styles[e]}toObject(t=[]){return super.toObject(["minWidth","splitByGrapheme",...t])}};p(la,"type","Textbox"),p(la,"textLayoutProperties",[...aa.textLayoutProperties,"width"]),p(la,"ownDefaults",{minWidth:20,dynamicMinWidth:2,lockScalingFlip:!0,noScaleCache:!1,_wordJoiners:/[ \t\r]/,splitByGrapheme:!1}),at.setClass(la);var ha=class extends rn{shouldPerformLayout(t){return!!t.target.clipPath&&super.shouldPerformLayout(t)}shouldLayoutClipPath(){return!1}calcLayoutResult(t,e){let{target:i}=t,{clipPath:r,group:s}=i;if(!r||!this.shouldPerformLayout(t))return;let{width:n,height:o}=Se(en(i,r)),a=new gt(n,o);if(r.absolutePositioned)return{center:Pe(r.getRelativeCenterPoint(),void 0,s?s.calcTransformMatrix():void 0),size:a};{let s=r.getRelativeCenterPoint().transform(i.calcOwnMatrix(),!0);if(this.shouldPerformLayout(t)){let{center:i=new gt,correction:r=new gt}=this.calcBoundingBox(e,t)||{};return{center:i.add(s),correction:r.subtract(s),size:a}}return{center:i.getRelativeCenterPoint().add(s),size:a}}}};p(ha,"type","clip-path"),at.setClass(ha);var ca=class extends rn{getInitialSize({target:t},{size:e}){return new gt(t.width||e.x,t.height||e.y)}};p(ca,"type","fixed"),at.setClass(ca);var ua=class extends on{subscribeTargets(t){let e=t.target;t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{t.layoutManager.subscribeTargets({target:t,targets:[e]})})}unsubscribeTargets(t){let e=t.target,i=e.getObjects();t.targets.reduce((t,e)=>(e.parent&&t.add(e.parent),t),new Set).forEach(t=>{!i.some(e=>e.parent===t)&&t.layoutManager.unsubscribeTargets({target:t,targets:[e]})})}},da=class t extends ln{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e=[],i={}){super(),Object.assign(this,t.ownDefaults),this.setOptions(i);let{left:r,top:s,layoutManager:n}=i;this.groupInit(e,{left:r,top:s,layoutManager:n??new ua})}_shouldSetNestedCoords(){return!0}__objectSelectionMonitor(){}multiSelectAdd(...t){"selection-order"===this.multiSelectionStacking?this.add(...t):t.forEach(t=>{let e=this._objects.findIndex(e=>e.isInFrontOf(t)),i=-1===e?this.size():e;this.insertAt(i,t)})}canEnterGroup(t){return this.getObjects().some(e=>e.isDescendantOf(t)||t.isDescendantOf(e))?(b("error","ActiveSelection: circular object trees are not supported, this call has no effect"),!1):super.canEnterGroup(t)}enterGroup(t,e){t.parent&&t.parent===t.group?t.parent._exitGroup(t):t.group&&t.parent!==t.group&&t.group.remove(t),this._enterGroup(t,e)}exitGroup(t,e){this._exitGroup(t,e),t.parent&&t.parent._enterGroup(t,!0)}_onAfterObjectsChange(t,e){super._onAfterObjectsChange(t,e);let i=new Set;e.forEach(t=>{let{parent:e}=t;e&&i.add(e)}),"removed"===t?i.forEach(t=>{t._onAfterObjectsChange(tn,e)}):i.forEach(t=>{t._set("dirty",!0)})}onDeselect(){return this.removeAll(),!1}toString(){return`#<ActiveSelection: (${this.complexity()})>`}shouldCache(){return!1}isOnACache(){return!1}_renderControls(t,e,i){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;let r={hasControls:!1,...i,forActiveSelection:!0};for(let e=0;e<this._objects.length;e++)this._objects[e]._renderControls(t,r);super._renderControls(t,e),t.restore()}};p(da,"type","ActiveSelection"),p(da,"ownDefaults",{multiSelectionStacking:"canvas-stacking"}),at.setClass(da),at.setClass(da,"activeSelection");var ga=class{constructor(){p(this,"resources",{})}applyFilters(t,e,i,r,s){let n=s.getContext("2d",{willReadFrequently:!0,desynchronized:!0});if(!n)return;n.drawImage(e,0,0,i,r);let o={sourceWidth:i,sourceHeight:r,imageData:n.getImageData(0,0,i,r),originalEl:e,originalImageData:n.getImageData(0,0,i,r),canvasEl:s,ctx:n,filterBackend:this};t.forEach(t=>{t.applyTo(o)});let{imageData:a}=o;return a.width===i&&a.height===r||(s.width=a.width,s.height=a.height),n.putImageData(a,0,0),o}},fa=class{constructor({tileSize:t=y.textureSize}={}){p(this,"aPosition",new Float32Array([0,0,0,1,1,0,1,1])),p(this,"resources",{}),this.tileSize=t,this.setupGLContext(t,t),this.captureGPUInfo()}setupGLContext(t,e){this.dispose(),this.createWebGLCanvas(t,e)}createWebGLCanvas(t,e){let i=Tt({width:t,height:e}),r=i.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,depth:!1,stencil:!1,antialias:!1});r&&(r.clearColor(0,0,0,0),this.canvas=i,this.gl=r)}applyFilters(t,e,i,r,s,n){let o,a=this.gl,l=s.getContext("2d");if(!a||!l)return;n&&(o=this.getCachedTexture(n,e));let h={originalWidth:e.width||e.naturalWidth||0,originalHeight:e.height||e.naturalHeight||0,sourceWidth:i,sourceHeight:r,destinationWidth:i,destinationHeight:r,context:a,sourceTexture:this.createTexture(a,i,r,o?void 0:e),targetTexture:this.createTexture(a,i,r),originalTexture:o||this.createTexture(a,i,r,o?void 0:e),passes:t.length,webgl:!0,aPosition:this.aPosition,programCache:this.programCache,pass:0,filterBackend:this,targetCanvas:s},c=a.createFramebuffer();return a.bindFramebuffer(a.FRAMEBUFFER,c),t.forEach(t=>{t&&t.applyTo(h)}),function(t){let e=t.targetCanvas,i=e.width,r=e.height,s=t.destinationWidth,n=t.destinationHeight;i===s&&r===n||(e.width=s,e.height=n)}(h),this.copyGLTo2D(a,h),a.bindTexture(a.TEXTURE_2D,null),a.deleteTexture(h.sourceTexture),a.deleteTexture(h.targetTexture),a.deleteFramebuffer(c),l.setTransform(1,0,0,1,0,0),h}dispose(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()}clearWebGLCaches(){this.programCache={},this.textureCache={}}createTexture(t,e,i,r,s){let{NEAREST:n,TEXTURE_2D:o,RGBA:a,UNSIGNED_BYTE:l,CLAMP_TO_EDGE:h,TEXTURE_MAG_FILTER:c,TEXTURE_MIN_FILTER:u,TEXTURE_WRAP_S:d,TEXTURE_WRAP_T:g}=t,f=t.createTexture();return t.bindTexture(o,f),t.texParameteri(o,c,s||n),t.texParameteri(o,u,s||n),t.texParameteri(o,d,h),t.texParameteri(o,g,h),r?t.texImage2D(o,0,a,a,l,r):t.texImage2D(o,0,a,e,i,0,a,l,null),f}getCachedTexture(t,e,i){let{textureCache:r}=this;if(r[t])return r[t];{let s=this.createTexture(this.gl,e.width,e.height,e,i);return s&&(r[t]=s),s}}evictCachesForKey(t){this.textureCache[t]&&(this.gl.deleteTexture(this.textureCache[t]),delete this.textureCache[t])}copyGLTo2D(t,e){let i=t.canvas,r=e.targetCanvas,s=r.getContext("2d");if(!s)return;s.translate(0,r.height),s.scale(1,-1);let n=i.height-r.height;s.drawImage(i,0,n,r.width,r.height,0,0,r.width,r.height)}copyGLTo2DPutImageData(t,e){let i=e.targetCanvas.getContext("2d"),r=e.destinationWidth,s=e.destinationHeight,n=r*s*4;if(!i)return;let o=new Uint8Array(this.imageBuffer,0,n),a=new Uint8ClampedArray(this.imageBuffer,0,n);t.readPixels(0,0,r,s,t.RGBA,t.UNSIGNED_BYTE,o);let l=new ImageData(a,r,s);i.putImageData(l,0,0)}captureGPUInfo(){if(this.gpuInfo)return this.gpuInfo;let t=this.gl,e={renderer:"",vendor:""};if(!t)return e;let i=t.getExtension("WEBGL_debug_renderer_info");if(i){let r=t.getParameter(i.UNMASKED_RENDERER_WEBGL),s=t.getParameter(i.UNMASKED_VENDOR_WEBGL);r&&(e.renderer=r.toLowerCase()),s&&(e.vendor=s.toLowerCase())}return this.gpuInfo=e,e}};let pa;function ma(t=!0){return!pa&&t&&(pa=function(){let{WebGLProbe:t}=T();return t.queryWebGL(Ct()),y.enableGLFiltering&&t.isSupported(y.textureSize)?new fa({tileSize:y.textureSize}):new ga}()),pa}const ya=["cropX","cropY"];var ba=class t extends ys{static getDefaults(){return{...super.getDefaults(),...t.ownDefaults}}constructor(e,i){super(),p(this,"_lastScaleX",1),p(this,"_lastScaleY",1),p(this,"_filterScalingX",1),p(this,"_filterScalingY",1),this.filters=[],Object.assign(this,t.ownDefaults),this.setOptions(i),this.cacheKey=`texture${xt()}`,this.setElement("string"==typeof e?(this.canvas&&ne(this.canvas.getElement())||O()).getElementById(e):e,i)}getElement(){return this._element}setElement(t,e={}){this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._element=t,this._originalElement=t,this._setWidthHeight(e),0!==this.filters.length&&this.applyFilters(),this.resizeFilter&&this.applyResizeFilters()}removeTexture(t){let e=ma(!1);e instanceof fa&&e.evictCachesForKey(t)}dispose(){super.dispose(),this.removeTexture(this.cacheKey),this.removeTexture(`${this.cacheKey}_filtered`),this._cacheContext=null,["_originalElement","_element","_filteredEl","_cacheCanvas"].forEach(t=>{let e=this[t];e&&T().dispose(e),this[t]=void 0})}getCrossOrigin(){return this._originalElement&&(this._originalElement.crossOrigin||null)}getOriginalSize(){let t=this.getElement();return t?{width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}:{width:0,height:0}}_stroke(t){if(!this.stroke||0===this.strokeWidth)return;let e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,-i),t.lineTo(e,-i),t.lineTo(e,i),t.lineTo(-e,i),t.lineTo(-e,-i),t.closePath()}toObject(t=[]){let e=[];return this.filters.forEach(t=>{t&&e.push(t.toObject())}),{...super.toObject([...ya,...t]),src:this.getSrc(),crossOrigin:this.getCrossOrigin(),filters:e,...this.resizeFilter?{resizeFilter:this.resizeFilter.toObject()}:{}}}hasCrop(){return!!this.cropX||!!this.cropY||this.width<this._element.width||this.height<this._element.height}_toSVG(){let t=[],e=this._element,i=-this.width/2,r=-this.height/2,s=[],n=[],o="",a="";if(!e)return[];if(this.hasCrop()){let t=xt();s.push('<clipPath id="imageCrop_'+t+'">\n','\t<rect x="'+i+'" y="'+r+'" width="'+fe(this.width)+'" height="'+fe(this.height)+'" />\n',"</clipPath>\n"),o=' clip-path="url(#imageCrop_'+t+')" '}if(this.imageSmoothing||(a=' image-rendering="optimizeSpeed"'),t.push("\t<image ","COMMON_PARTS",`xlink:href="${fe(this.getSrc(!0))}" x="${i-this.cropX}" y="${r-this.cropY}" width="${e.width||e.naturalWidth}" height="${e.height||e.naturalHeight}"${a}${o}></image>\n`),this.stroke||this.strokeDashArray){let t=this.fill;this.fill=null,n=[`\t<rect x="${i}" y="${r}" width="${fe(this.width)}" height="${fe(this.height)}" style="${this.getSvgStyles()}" />\n`],this.fill=t}return s="fill"===this.paintFirst?s.concat(t,n):s.concat(n,t),s}getSrc(t){let e=t?this._element:this._originalElement;return e?e.toDataURL?e.toDataURL():this.srcFromAttribute?e.getAttribute("src")||"":e.src:this.src||""}getSvgSrc(t){return this.getSrc(t)}setSrc(t,{crossOrigin:e,signal:i}={}){return Gt(t,{crossOrigin:e,signal:i}).then(t=>{void 0!==e&&this.set({crossOrigin:e}),this.setElement(t)})}toString(){return`#<Image: { src: "${this.getSrc()}" }>`}applyResizeFilters(){let t=this.resizeFilter,e=this.minimumScaleTrigger,i=this.getTotalObjectScaling(),r=i.x,s=i.y,n=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||r>e&&s>e)return this._element=n,this._filterScalingX=1,this._filterScalingY=1,this._lastScaleX=r,void(this._lastScaleY=s);let o=Tt(n),{width:a,height:l}=n;this._element=o,this._lastScaleX=t.scaleX=r,this._lastScaleY=t.scaleY=s,ma().applyFilters([t],n,a,l,this._element),this._filterScalingX=o.width/this._originalElement.width,this._filterScalingY=o.height/this._originalElement.height}applyFilters(t=this.filters||[]){if(t=t.filter(t=>t&&!t.isNeutralState()),this.set("dirty",!0),this.removeTexture(`${this.cacheKey}_filtered`),0===t.length)return this._element=this._originalElement,this._filteredEl=void 0,this._filterScalingX=1,void(this._filterScalingY=1);let e=this._originalElement,i=e.naturalWidth||e.width,r=e.naturalHeight||e.height;if(this._element===this._originalElement){let t=Tt({width:i,height:r});this._element=t,this._filteredEl=t}else this._filteredEl&&(this._element=this._filteredEl,this._filteredEl.getContext("2d").clearRect(0,0,i,r),this._lastScaleX=1,this._lastScaleY=1);ma().applyFilters(t,this._originalElement,i,r,this._element,this.cacheKey),this._originalElement.width===this._element.width&&this._originalElement.height===this._element.height||(this._filterScalingX=this._element.width/this._originalElement.width,this._filterScalingY=this._element.height/this._originalElement.height)}_render(t){t.imageSmoothingEnabled=this.imageSmoothing,!0!==this.isMoving&&this.resizeFilter&&this._needsResize()&&this.applyResizeFilters(),this._stroke(t),this._renderPaintInOrder(t)}drawCacheOnCanvas(t){t.imageSmoothingEnabled=this.imageSmoothing,super.drawCacheOnCanvas(t)}shouldCache(){return this.needsItsOwnCache()}_renderFill(t){let e=this._element;if(!e)return;let i=this._filterScalingX,r=this._filterScalingY,s=this.width,n=this.height,o=Math.max(this.cropX,0),a=Math.max(this.cropY,0),l=e.naturalWidth||e.width,h=e.naturalHeight||e.height,c=o*i,u=a*r,d=Math.min(s*i,l-c),g=Math.min(n*r,h-u),f=-s/2,p=-n/2,m=Math.min(s,l/i-o),y=Math.min(n,h/r-a);e&&t.drawImage(e,c,u,d,g,f,p,m,y)}_needsResize(){let t=this.getTotalObjectScaling();return t.x!==this._lastScaleX||t.y!==this._lastScaleY}_resetWidthHeight(){this.set(this.getOriginalSize())}_setWidthHeight({width:t,height:e}={}){let i=this.getOriginalSize();this.width=t||i.width,this.height=e||i.height}parsePreserveAspectRatioAttribute(){let t,e=mi(this.preserveAspectRatio||""),i=this.width,r=this.height,s={width:i,height:r},n=this._element.width,o=this._element.height,a=1,l=1,h=0,c=0,u=0,d=0;return!e||"none"===e.alignX&&"none"===e.alignY?(a=i/n,l=r/o):("meet"===e.meetOrSlice&&(a=l=cn(this._element,s),t=(i-n*a)/2,"Min"===e.alignX&&(h=-t),"Max"===e.alignX&&(h=t),t=(r-o*l)/2,"Min"===e.alignY&&(c=-t),"Max"===e.alignY&&(c=t)),"slice"===e.meetOrSlice&&(a=l=un(this._element,s),t=n-i/a,"Mid"===e.alignX&&(u=t/2),"Max"===e.alignX&&(u=t),t=o-r/l,"Mid"===e.alignY&&(d=t/2),"Max"===e.alignY&&(d=t),n=i/a,o=r/l)),{width:n,height:o,scaleX:a,scaleY:l,offsetLeft:h,offsetTop:c,cropX:u,cropY:d}}static fromObject({filters:t,resizeFilter:e,src:i,crossOrigin:r,type:s,...n},o){return Promise.all([Gt(i,{...o,crossOrigin:r}),t&&Ut(t,o),e?Ut([e],o):[],qt(n,o)]).then(([t,e=[],[r],s={}])=>new this(t,{...n,src:i,filters:e,resizeFilter:r,...s}))}static fromURL(t,{crossOrigin:e=null,signal:i}={},r){return Gt(t,{crossOrigin:e,signal:i}).then(t=>new this(t,r))}static async fromElement(t,e={},i){let r=Ks(t,this.ATTRIBUTE_NAMES,i);return this.fromURL(r["xlink:href"]||r.href,e,r).catch(t=>(b("log","Unable to parse Image",t),null))}};p(ba,"type","Image"),p(ba,"cacheProperties",[...Xi,...ya]),p(ba,"ownDefaults",{strokeWidth:0,srcFromAttribute:!1,minimumScaleTrigger:.5,cropX:0,cropY:0,imageSmoothing:!0}),p(ba,"ATTRIBUTE_NAMES",[...Ds,"x","y","width","height","preserveAspectRatio","xlink:href","href","crossOrigin","image-rendering"]),at.setClass(ba),at.setSVGClass(ba),_n(["pattern","defs","symbol","metadata","clipPath","mask","desc"]);const _a=t=>void 0!==t.webgl,va="precision highp float",xa=`\n    ${va};\n    varying vec2 vTexCoord;\n    uniform sampler2D uTexture;\n    void main() {\n      gl_FragColor = texture2D(uTexture, vTexCoord);\n    }`,Ca=new RegExp(va,"g");var wa=class{get type(){return this.constructor.type}constructor({type:t,...e}={}){Object.assign(this,this.constructor.defaults,e)}getFragmentSource(){return xa}getVertexSource(){return"\n    attribute vec2 aPosition;\n    varying vec2 vTexCoord;\n    void main() {\n      vTexCoord = aPosition;\n      gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n    }"}createProgram(t,e=this.getFragmentSource(),i=this.getVertexSource()){let{WebGLProbe:{GLPrecision:r="highp"}}=T();"highp"!==r&&(e=e.replace(Ca,va.replace("highp",r)));let s=t.createShader(t.VERTEX_SHADER),n=t.createShader(t.FRAGMENT_SHADER),o=t.createProgram();if(!s||!n||!o)throw new _("Vertex, fragment shader or program creation error");if(t.shaderSource(s,i),t.compileShader(s),!t.getShaderParameter(s,t.COMPILE_STATUS))throw new _(`Vertex shader compile error for ${this.type}: ${t.getShaderInfoLog(s)}`);if(t.shaderSource(n,e),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new _(`Fragment shader compile error for ${this.type}: ${t.getShaderInfoLog(n)}`);if(t.attachShader(o,s),t.attachShader(o,n),t.linkProgram(o),!t.getProgramParameter(o,t.LINK_STATUS))throw new _(`Shader link error for "${this.type}" ${t.getProgramInfoLog(o)}`);let a=this.getUniformLocations(t,o)||{};return a.uStepW=t.getUniformLocation(o,"uStepW"),a.uStepH=t.getUniformLocation(o,"uStepH"),{program:o,attributeLocations:this.getAttributeLocations(t,o),uniformLocations:a}}getAttributeLocations(t,e){return{aPosition:t.getAttribLocation(e,"aPosition")}}getUniformLocations(t,e){let i=this.constructor.uniformLocations,r={};for(let s=0;s<i.length;s++)r[i[s]]=t.getUniformLocation(e,i[s]);return r}sendAttributeData(t,e,i){let r=e.aPosition,s=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,s),t.enableVertexAttribArray(r),t.vertexAttribPointer(r,2,t.FLOAT,!1,0,0),t.bufferData(t.ARRAY_BUFFER,i,t.STATIC_DRAW)}_setupFrameBuffer(t){let e=t.context;if(t.passes>1){let i=t.destinationWidth,r=t.destinationHeight;t.sourceWidth===i&&t.sourceHeight===r||(e.deleteTexture(t.targetTexture),t.targetTexture=t.filterBackend.createTexture(e,i,r)),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.targetTexture,0)}else e.bindFramebuffer(e.FRAMEBUFFER,null),e.finish()}_swapTextures(t){t.passes--,t.pass++;let e=t.targetTexture;t.targetTexture=t.sourceTexture,t.sourceTexture=e}isNeutralState(t){return!1}applyTo(t){_a(t)?(this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d(t){}getCacheKey(){return this.type}retrieveShader(t){let e=this.getCacheKey();return t.programCache[e]||(t.programCache[e]=this.createProgram(t.context)),t.programCache[e]}applyToWebGL(t){let e=t.context,i=this.retrieveShader(t);0===t.pass&&t.originalTexture?e.bindTexture(e.TEXTURE_2D,t.originalTexture):e.bindTexture(e.TEXTURE_2D,t.sourceTexture),e.useProgram(i.program),this.sendAttributeData(e,i.attributeLocations,t.aPosition),e.uniform1f(i.uniformLocations.uStepW,1/t.sourceWidth),e.uniform1f(i.uniformLocations.uStepH,1/t.sourceHeight),this.sendUniformData(e,i.uniformLocations),e.viewport(0,0,t.destinationWidth,t.destinationHeight),e.drawArrays(e.TRIANGLE_STRIP,0,4)}bindAdditionalTexture(t,e,i){t.activeTexture(i),t.bindTexture(t.TEXTURE_2D,e),t.activeTexture(t.TEXTURE0)}unbindAdditionalTexture(t,e){t.activeTexture(e),t.bindTexture(t.TEXTURE_2D,null),t.activeTexture(t.TEXTURE0)}sendUniformData(t,e){}createHelpLayer(t){if(!t.helpLayer){let{sourceWidth:e,sourceHeight:i}=t;t.helpLayer=Tt({width:e,height:i})}}toObject(){let t=Object.keys(this.constructor.defaults||{});return{type:this.type,...t.reduce((t,e)=>(t[e]=this[e],t),{})}}toJSON(){return this.toObject()}static async fromObject({type:t,...e},i){return new this(e)}};p(wa,"type","BaseFilter"),p(wa,"uniformLocations",[]);const Sa={multiply:"gl_FragColor.rgb *= uColor.rgb;\n",screen:"gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n",add:"gl_FragColor.rgb += uColor.rgb;\n",difference:"gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n",subtract:"gl_FragColor.rgb -= uColor.rgb;\n",lighten:"gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n",darken:"gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n",exclusion:"gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n",overlay:"\n    if (uColor.r < 0.5) {\n      gl_FragColor.r *= 2.0 * uColor.r;\n    } else {\n      gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n    }\n    if (uColor.g < 0.5) {\n      gl_FragColor.g *= 2.0 * uColor.g;\n    } else {\n      gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n    }\n    if (uColor.b < 0.5) {\n      gl_FragColor.b *= 2.0 * uColor.b;\n    } else {\n      gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n    }\n    ",tint:"\n    gl_FragColor.rgb *= (1.0 - uColor.a);\n    gl_FragColor.rgb += uColor.rgb;\n    "};var Ta=class extends wa{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return`\n      precision highp float;\n      uniform sampler2D uTexture;\n      uniform vec4 uColor;\n      varying vec2 vTexCoord;\n      void main() {\n        vec4 color = texture2D(uTexture, vTexCoord);\n        gl_FragColor = color;\n        if (color.a > 0.0) {\n          ${Sa[this.mode]}\n        }\n      }\n      `}applyTo2d({imageData:{data:t}}){let e=new gi(this.color).getSource(),i=this.alpha,r=e[0]*i,s=e[1]*i,n=e[2]*i,o=1-i;for(let e=0;e<t.length;e+=4){let i,a,l,h=t[e],c=t[e+1],u=t[e+2];switch(this.mode){case"multiply":i=h*r/255,a=c*s/255,l=u*n/255;break;case"screen":i=255-(255-h)*(255-r)/255,a=255-(255-c)*(255-s)/255,l=255-(255-u)*(255-n)/255;break;case"add":i=h+r,a=c+s,l=u+n;break;case"difference":i=Math.abs(h-r),a=Math.abs(c-s),l=Math.abs(u-n);break;case"subtract":i=h-r,a=c-s,l=u-n;break;case"darken":i=Math.min(h,r),a=Math.min(c,s),l=Math.min(u,n);break;case"lighten":i=Math.max(h,r),a=Math.max(c,s),l=Math.max(u,n);break;case"overlay":i=r<128?2*h*r/255:255-2*(255-h)*(255-r)/255,a=s<128?2*c*s/255:255-2*(255-c)*(255-s)/255,l=n<128?2*u*n/255:255-2*(255-u)*(255-n)/255;break;case"exclusion":i=r+h-2*r*h/255,a=s+c-2*s*c/255,l=n+u-2*n*u/255;break;case"tint":i=r+h*o,a=s+c*o,l=n+u*o}t[e]=i,t[e+1]=a,t[e+2]=l}}sendUniformData(t,e){let i=new gi(this.color).getSource();i[0]=this.alpha*i[0]/255,i[1]=this.alpha*i[1]/255,i[2]=this.alpha*i[2]/255,i[3]=this.alpha,t.uniform4fv(e.uColor,i)}};p(Ta,"defaults",{color:"#F95C63",mode:"multiply",alpha:1}),p(Ta,"type","BlendColor"),p(Ta,"uniformLocations",["uColor"]),at.setClass(Ta);const Oa={multiply:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform sampler2D uImage;\n    uniform vec4 uColor;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      vec4 color2 = texture2D(uImage, vTexCoord2);\n      color.rgba *= color2.rgba;\n      gl_FragColor = color;\n    }\n    ",mask:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform sampler2D uImage;\n    uniform vec4 uColor;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      vec4 color2 = texture2D(uImage, vTexCoord2);\n      color.a = color2.a;\n      gl_FragColor = color;\n    }\n    "};var ka=class extends wa{getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return Oa[this.mode]}getVertexSource(){return"\n    attribute vec2 aPosition;\n    varying vec2 vTexCoord;\n    varying vec2 vTexCoord2;\n    uniform mat3 uTransformMatrix;\n    void main() {\n      vTexCoord = aPosition;\n      vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n      gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n    }\n    "}applyToWebGL(t){let e=t.context,i=this.createTexture(t.filterBackend,this.image);this.bindAdditionalTexture(e,i,e.TEXTURE1),super.applyToWebGL(t),this.unbindAdditionalTexture(e,e.TEXTURE1)}createTexture(t,e){return t.getCachedTexture(e.cacheKey,e.getElement())}calculateMatrix(){let t=this.image,{width:e,height:i}=t.getElement();return[1/t.scaleX,0,0,0,1/t.scaleY,0,-t.left/e,-t.top/i,1]}applyTo2d({imageData:{data:t,width:e,height:i},filterBackend:{resources:r}}){let s=this.image;r.blendImage||(r.blendImage=Ct());let n=r.blendImage,o=n.getContext("2d");n.width!==e||n.height!==i?(n.width=e,n.height=i):o.clearRect(0,0,e,i),o.setTransform(s.scaleX,0,0,s.scaleY,s.left,s.top),o.drawImage(s.getElement(),0,0,e,i);let a=o.getImageData(0,0,e,i).data;for(let e=0;e<t.length;e+=4){let i=t[e],r=t[e+1],s=t[e+2],n=t[e+3],o=a[e],l=a[e+1],h=a[e+2],c=a[e+3];switch(this.mode){case"multiply":t[e]=i*o/255,t[e+1]=r*l/255,t[e+2]=s*h/255,t[e+3]=n*c/255;break;case"mask":t[e+3]=c}}}sendUniformData(t,e){let i=this.calculateMatrix();t.uniform1i(e.uImage,1),t.uniformMatrix3fv(e.uTransformMatrix,!1,i)}toObject(){return{...super.toObject(),image:this.image&&this.image.toObject()}}static async fromObject({type:t,image:e,...i},r){return ba.fromObject(e,r).then(t=>new this({...i,image:t}))}};p(ka,"type","BlendImage"),p(ka,"defaults",{mode:"multiply",alpha:1}),p(ka,"uniformLocations",["uTransformMatrix","uImage"]),at.setClass(ka);var Da=class extends wa{getFragmentSource(){return"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform vec2 uDelta;\n    varying vec2 vTexCoord;\n    const float nSamples = 15.0;\n    vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n    float random(vec3 scale) {\n      /* use the fragment position for a different seed per-pixel */\n      return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n    }\n    void main() {\n      vec4 color = vec4(0.0);\n      float totalC = 0.0;\n      float totalA = 0.0;\n      float offset = random(v3offset);\n      for (float t = -nSamples; t <= nSamples; t++) {\n        float percent = (t + offset - 0.5) / nSamples;\n        vec4 sample = texture2D(uTexture, vTexCoord + uDelta * percent);\n        float weight = 1.0 - abs(percent);\n        float alpha = weight * sample.a;\n        color.rgb += sample.rgb * alpha;\n        color.a += alpha;\n        totalA += weight;\n        totalC += alpha;\n      }\n      gl_FragColor.rgb = color.rgb / totalC;\n      gl_FragColor.a = color.a / totalA;\n    }\n  "}applyTo(t){_a(t)?(this.aspectRatio=t.sourceWidth/t.sourceHeight,t.passes++,this._setupFrameBuffer(t),this.horizontal=!0,this.applyToWebGL(t),this._swapTextures(t),this._setupFrameBuffer(t),this.horizontal=!1,this.applyToWebGL(t),this._swapTextures(t)):this.applyTo2d(t)}applyTo2d({imageData:{data:t,width:e,height:i}}){this.aspectRatio=e/i,this.horizontal=!0;let r=this.getBlurValue()*e,s=new Uint8ClampedArray(t),n=4*e;for(let e=0;e<t.length;e+=4){let i=0,o=0,a=0,l=0,h=0,c=e-e%n,u=c+n;for(let s=-14;s<15;s++){let n=s/15,d=4*Math.floor(r*n),g=1-Math.abs(n),f=e+d;f<c?f=c:f>u&&(f=u);let p=t[f+3]*g;i+=t[f]*p,o+=t[f+1]*p,a+=t[f+2]*p,l+=p,h+=g}s[e]=i/l,s[e+1]=o/l,s[e+2]=a/l,s[e+3]=l/h}this.horizontal=!1,r=this.getBlurValue()*i;for(let e=0;e<s.length;e+=4){let i=0,o=0,a=0,l=0,h=0,c=e%n,u=s.length-n+c;for(let t=-14;t<15;t++){let d=t/15,g=Math.floor(r*d)*n,f=1-Math.abs(d),p=e+g;p<c?p=c:p>u&&(p=u);let m=s[p+3]*f;i+=s[p]*m,o+=s[p+1]*m,a+=s[p+2]*m,l+=m,h+=f}t[e]=i/l,t[e+1]=o/l,t[e+2]=a/l,t[e+3]=l/h}}sendUniformData(t,e){let i=this.chooseRightDelta();t.uniform2fv(e.uDelta,i)}isNeutralState(){return 0===this.blur}getBlurValue(){let t=1,{horizontal:e,aspectRatio:i}=this;return e?i>1&&(t=1/i):i<1&&(t=i),t*this.blur*.12}chooseRightDelta(){let t=this.getBlurValue();return this.horizontal?[t,0]:[0,t]}};p(Da,"type","Blur"),p(Da,"defaults",{blur:0}),p(Da,"uniformLocations",["uDelta"]),at.setClass(Da);var Ma=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uBrightness;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color.rgb += uBrightness;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=Math.round(255*this.brightness);for(let i=0;i<t.length;i+=4)t[i]+=e,t[i+1]+=e,t[i+2]+=e}isNeutralState(){return 0===this.brightness}sendUniformData(t,e){t.uniform1f(e.uBrightness,this.brightness)}};p(Ma,"type","Brightness"),p(Ma,"defaults",{brightness:0}),p(Ma,"uniformLocations",["uBrightness"]),at.setClass(Ma);const ja={matrix:[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],colorsOnly:!0};var Ea=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  varying vec2 vTexCoord;\n  uniform mat4 uColorMatrix;\n  uniform vec4 uConstants;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color *= uColorMatrix;\n    color += uConstants;\n    gl_FragColor = color;\n  }"}applyTo2d(t){let e=t.imageData.data,i=this.matrix,r=this.colorsOnly;for(let t=0;t<e.length;t+=4){let s=e[t],n=e[t+1],o=e[t+2];if(e[t]=s*i[0]+n*i[1]+o*i[2]+255*i[4],e[t+1]=s*i[5]+n*i[6]+o*i[7]+255*i[9],e[t+2]=s*i[10]+n*i[11]+o*i[12]+255*i[14],!r){let r=e[t+3];e[t]+=r*i[3],e[t+1]+=r*i[8],e[t+2]+=r*i[13],e[t+3]=s*i[15]+n*i[16]+o*i[17]+r*i[18]+255*i[19]}}}sendUniformData(t,e){let i=this.matrix,r=[i[0],i[1],i[2],i[3],i[5],i[6],i[7],i[8],i[10],i[11],i[12],i[13],i[15],i[16],i[17],i[18]],s=[i[4],i[9],i[14],i[19]];t.uniformMatrix4fv(e.uColorMatrix,!1,r),t.uniform4fv(e.uConstants,s)}toObject(){return{...super.toObject(),matrix:[...this.matrix]}}};function Pa(t,e){var i;let r=(p(i=class extends Ea{toObject(){return{type:this.type,colorsOnly:this.colorsOnly}}},"type",t),p(i,"defaults",{colorsOnly:!1,matrix:e}),i);return at.setClass(r,t),r}p(Ea,"type","ColorMatrix"),p(Ea,"defaults",ja),p(Ea,"uniformLocations",["uColorMatrix","uConstants"]),at.setClass(Ea);const Aa=Pa("Brownie",[.5997,.34553,-.27082,0,.186,-.0377,.86095,.15059,0,-.1449,.24113,-.07441,.44972,0,-.02965,0,0,0,1,0]),Fa=Pa("Vintage",[.62793,.32021,-.03965,0,.03784,.02578,.64411,.03259,0,.02926,.0466,-.08512,.52416,0,.02023,0,0,0,1,0]),La=Pa("Kodachrome",[1.12855,-.39673,-.03992,0,.24991,-.16404,1.08352,-.05498,0,.09698,-.16786,-.56034,1.60148,0,.13972,0,0,0,1,0]),Ia=Pa("Technicolor",[1.91252,-.85453,-.09155,0,.04624,-.30878,1.76589,-.10601,0,-.27589,-.2311,-.75018,1.84759,0,.12137,0,0,0,1,0]),Ra=Pa("Polaroid",[1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0]),Ba=Pa("Sepia",[.393,.769,.189,0,0,.349,.686,.168,0,0,.272,.534,.131,0,0,0,0,0,1,0]),$a=Pa("BlackWhite",[1.5,1.5,1.5,0,-1,1.5,1.5,1.5,0,-1,1.5,1.5,1.5,0,-1,0,0,0,1,0]);var Xa=class extends wa{constructor(t={}){super(t),this.subFilters=t.subFilters||[]}applyTo(t){_a(t)&&(t.passes+=this.subFilters.length-1),this.subFilters.forEach(e=>{e.applyTo(t)})}toObject(){return{type:this.type,subFilters:this.subFilters.map(t=>t.toObject())}}isNeutralState(){return!this.subFilters.some(t=>!t.isNeutralState())}static fromObject(t,e){return Promise.all((t.subFilters||[]).map(t=>at.getClass(t.type).fromObject(t,e))).then(t=>new this({subFilters:t}))}};p(Xa,"type","Composed"),at.setClass(Xa);var Ya=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uContrast;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n    color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n    gl_FragColor = color;\n  }"}isNeutralState(){return 0===this.contrast}applyTo2d({imageData:{data:t}}){let e=Math.floor(255*this.contrast),i=259*(e+255)/(255*(259-e));for(let e=0;e<t.length;e+=4)t[e]=i*(t[e]-128)+128,t[e+1]=i*(t[e+1]-128)+128,t[e+2]=i*(t[e+2]-128)+128}sendUniformData(t,e){t.uniform1f(e.uContrast,this.contrast)}};p(Ya,"type","Contrast"),p(Ya,"defaults",{contrast:0}),p(Ya,"uniformLocations",["uContrast"]),at.setClass(Ya);const Wa={Convolute_3_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[9];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 3.0; h+=1.0) {\n        for (float w = 0.0; w < 3.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_3_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[9];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 3.0; h+=1.0) {\n        for (float w = 0.0; w < 3.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_5_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[25];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 5.0; h+=1.0) {\n        for (float w = 0.0; w < 5.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_5_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[25];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 5.0; h+=1.0) {\n        for (float w = 0.0; w < 5.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_7_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[49];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 7.0; h+=1.0) {\n        for (float w = 0.0; w < 7.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_7_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[49];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 7.0; h+=1.0) {\n        for (float w = 0.0; w < 7.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    ",Convolute_9_1:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[81];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 0);\n      for (float h = 0.0; h < 9.0; h+=1.0) {\n        for (float w = 0.0; w < 9.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n          color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n        }\n      }\n      gl_FragColor = color;\n    }\n    ",Convolute_9_0:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform float uMatrix[81];\n    uniform float uStepW;\n    uniform float uStepH;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = vec4(0, 0, 0, 1);\n      for (float h = 0.0; h < 9.0; h+=1.0) {\n        for (float w = 0.0; w < 9.0; w+=1.0) {\n          vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n          color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n        }\n      }\n      float alpha = texture2D(uTexture, vTexCoord).a;\n      gl_FragColor = color;\n      gl_FragColor.a = alpha;\n    }\n    "};var Na=class extends wa{getCacheKey(){return`${this.type}_${Math.sqrt(this.matrix.length)}_${+!!this.opaque}`}getFragmentSource(){return Wa[this.getCacheKey()]}applyTo2d(t){let e,i,r,s,n,o,a,l,h,c,u,d,g,f=t.imageData,p=f.data,m=this.matrix,y=Math.round(Math.sqrt(m.length)),b=Math.floor(y/2),_=f.width,v=f.height,x=t.ctx.createImageData(_,v),C=x.data,w=+!!this.opaque;for(u=0;u<v;u++)for(c=0;c<_;c++){for(n=4*(u*_+c),e=0,i=0,r=0,s=0,g=0;g<y;g++)for(d=0;d<y;d++)a=u+g-b,o=c+d-b,a<0||a>=v||o<0||o>=_||(l=4*(a*_+o),h=m[g*y+d],e+=p[l]*h,i+=p[l+1]*h,r+=p[l+2]*h,w||(s+=p[l+3]*h));C[n]=e,C[n+1]=i,C[n+2]=r,C[n+3]=w?p[n+3]:s}t.imageData=x}sendUniformData(t,e){t.uniform1fv(e.uMatrix,this.matrix)}toObject(){return{...super.toObject(),opaque:this.opaque,matrix:[...this.matrix]}}};p(Na,"type","Convolute"),p(Na,"defaults",{opaque:!1,matrix:[0,0,0,0,1,0,0,0,0]}),p(Na,"uniformLocations",["uMatrix","uOpaque","uHalfSize","uSize"]),at.setClass(Na);const Va="Gamma";var za=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform vec3 uGamma;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    vec3 correction = (1.0 / uGamma);\n    color.r = pow(color.r, correction.r);\n    color.g = pow(color.g, correction.g);\n    color.b = pow(color.b, correction.b);\n    gl_FragColor = color;\n    gl_FragColor.rgb *= color.a;\n  }\n"}constructor(t={}){super(t),this.gamma=t.gamma||this.constructor.defaults.gamma.concat()}applyTo2d({imageData:{data:t}}){let e=this.gamma,i=1/e[0],r=1/e[1],s=1/e[2];this.rgbValues||(this.rgbValues={r:new Uint8Array(256),g:new Uint8Array(256),b:new Uint8Array(256)});let n=this.rgbValues;for(let t=0;t<256;t++)n.r[t]=255*(t/255)**i,n.g[t]=255*(t/255)**r,n.b[t]=255*(t/255)**s;for(let e=0;e<t.length;e+=4)t[e]=n.r[t[e]],t[e+1]=n.g[t[e+1]],t[e+2]=n.b[t[e+2]]}sendUniformData(t,e){t.uniform3fv(e.uGamma,this.gamma)}isNeutralState(){let{gamma:t}=this;return 1===t[0]&&1===t[1]&&1===t[2]}toObject(){return{type:Va,gamma:this.gamma.concat()}}};p(za,"type",Va),p(za,"defaults",{gamma:[1,1,1]}),p(za,"uniformLocations",["uGamma"]),at.setClass(za);const Ha={average:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 color = texture2D(uTexture, vTexCoord);\n      float average = (color.r + color.b + color.g) / 3.0;\n      gl_FragColor = vec4(average, average, average, color.a);\n    }\n    ",lightness:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform int uMode;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 col = texture2D(uTexture, vTexCoord);\n      float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n      gl_FragColor = vec4(average, average, average, col.a);\n    }\n    ",luminosity:"\n    precision highp float;\n    uniform sampler2D uTexture;\n    uniform int uMode;\n    varying vec2 vTexCoord;\n    void main() {\n      vec4 col = texture2D(uTexture, vTexCoord);\n      float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n      gl_FragColor = vec4(average, average, average, col.a);\n    }\n    "};var Ga=class extends wa{applyTo2d({imageData:{data:t}}){for(let e,i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2];switch(this.mode){case"average":e=(r+s+n)/3;break;case"lightness":e=(Math.min(r,s,n)+Math.max(r,s,n))/2;break;case"luminosity":e=.21*r+.72*s+.07*n}t[i+2]=t[i+1]=t[i]=e}}getCacheKey(){return`${this.type}_${this.mode}`}getFragmentSource(){return Ha[this.mode]}sendUniformData(t,e){t.uniform1i(e.uMode,1)}isNeutralState(){return!1}};p(Ga,"type","Grayscale"),p(Ga,"defaults",{mode:"average"}),p(Ga,"uniformLocations",["uMode"]),at.setClass(Ga);const Ua={...ja,rotation:0};var qa=class extends Ea{calculateMatrix(){let t=this.rotation*Math.PI,e=ut(t),i=dt(t),r=1/3,s=Math.sqrt(r)*i,n=1-e;this.matrix=[e+n/3,r*n-s,r*n+s,0,0,r*n+s,e+r*n,r*n-s,0,0,r*n-s,r*n+s,e+r*n,0,0,0,0,0,1,0]}isNeutralState(){return 0===this.rotation}applyTo(t){this.calculateMatrix(),super.applyTo(t)}toObject(){return{type:this.type,rotation:this.rotation}}};p(qa,"type","HueRotation"),p(qa,"defaults",Ua),at.setClass(qa);var Ka=class extends wa{applyTo2d({imageData:{data:t}}){for(let e=0;e<t.length;e+=4)t[e]=255-t[e],t[e+1]=255-t[e+1],t[e+2]=255-t[e+2],this.alpha&&(t[e+3]=255-t[e+3])}getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform int uInvert;\n  uniform int uAlpha;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    if (uInvert == 1) {\n      if (uAlpha == 1) {\n        gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,1.0 -color.a);\n      } else {\n        gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n      }\n    } else {\n      gl_FragColor = color;\n    }\n  }\n"}isNeutralState(){return!this.invert}sendUniformData(t,e){t.uniform1i(e.uInvert,Number(this.invert)),t.uniform1i(e.uAlpha,Number(this.alpha))}};p(Ka,"type","Invert"),p(Ka,"defaults",{alpha:!1,invert:!0}),p(Ka,"uniformLocations",["uInvert","uAlpha"]),at.setClass(Ka);var Ja=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uStepH;\n  uniform float uNoise;\n  uniform float uSeed;\n  varying vec2 vTexCoord;\n  float rand(vec2 co, float seed, float vScale) {\n    return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n  }\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=this.noise;for(let i=0;i<t.length;i+=4){let r=(.5-Math.random())*e;t[i]+=r,t[i+1]+=r,t[i+2]+=r}}sendUniformData(t,e){t.uniform1f(e.uNoise,this.noise/255),t.uniform1f(e.uSeed,Math.random())}isNeutralState(){return 0===this.noise}};p(Ja,"type","Noise"),p(Ja,"defaults",{noise:0}),p(Ja,"uniformLocations",["uNoise","uSeed"]),at.setClass(Ja);var Qa=class extends wa{applyTo2d({imageData:{data:t,width:e,height:i}}){for(let r=0;r<i;r+=this.blocksize)for(let s=0;s<e;s+=this.blocksize){let n=4*r*e+4*s,o=t[n],a=t[n+1],l=t[n+2],h=t[n+3];for(let n=r;n<Math.min(r+this.blocksize,i);n++)for(let i=s;i<Math.min(s+this.blocksize,e);i++){let r=4*n*e+4*i;t[r]=o,t[r+1]=a,t[r+2]=l,t[r+3]=h}}}isNeutralState(){return 1===this.blocksize}getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uBlocksize;\n  uniform float uStepW;\n  uniform float uStepH;\n  varying vec2 vTexCoord;\n  void main() {\n    float blockW = uBlocksize * uStepW;\n    float blockH = uBlocksize * uStepH;\n    int posX = int(vTexCoord.x / blockW);\n    int posY = int(vTexCoord.y / blockH);\n    float fposX = float(posX);\n    float fposY = float(posY);\n    vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n    vec4 color = texture2D(uTexture, squareCoords);\n    gl_FragColor = color;\n  }\n"}sendUniformData(t,e){t.uniform1f(e.uBlocksize,this.blocksize)}};p(Qa,"type","Pixelate"),p(Qa,"defaults",{blocksize:4}),p(Qa,"uniformLocations",["uBlocksize"]),at.setClass(Qa);var Za=class extends wa{getFragmentSource(){return"\nprecision highp float;\nuniform sampler2D uTexture;\nuniform vec4 uLow;\nuniform vec4 uHigh;\nvarying vec2 vTexCoord;\nvoid main() {\n  gl_FragColor = texture2D(uTexture, vTexCoord);\n  if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n    gl_FragColor.a = 0.0;\n  }\n}\n"}applyTo2d({imageData:{data:t}}){let e=255*this.distance,i=new gi(this.color).getSource(),r=[i[0]-e,i[1]-e,i[2]-e],s=[i[0]+e,i[1]+e,i[2]+e];for(let e=0;e<t.length;e+=4){let i=t[e],n=t[e+1],o=t[e+2];i>r[0]&&n>r[1]&&o>r[2]&&i<s[0]&&n<s[1]&&o<s[2]&&(t[e+3]=0)}}sendUniformData(t,e){let i=new gi(this.color).getSource(),r=this.distance,s=[0+i[0]/255-r,0+i[1]/255-r,0+i[2]/255-r,1],n=[i[0]/255+r,i[1]/255+r,i[2]/255+r,1];t.uniform4fv(e.uLow,s),t.uniform4fv(e.uHigh,n)}};p(Za,"type","RemoveColor"),p(Za,"defaults",{color:"#FFFFFF",distance:.02,useAlpha:!1}),p(Za,"uniformLocations",["uLow","uHigh"]),at.setClass(Za);var tl=class extends wa{sendUniformData(t,e){t.uniform2fv(e.uDelta,this.horizontal?[1/this.width,0]:[0,1/this.height]),t.uniform1fv(e.uTaps,this.taps)}getFilterWindow(){let t=this.tempScale;return Math.ceil(this.lanczosLobes/t)}getCacheKey(){let t=this.getFilterWindow();return`${this.type}_${t}`}getFragmentSource(){let t=this.getFilterWindow();return this.generateShader(t)}getTaps(){let t=this.lanczosCreate(this.lanczosLobes),e=this.tempScale,i=this.getFilterWindow(),r=Array(i);for(let s=1;s<=i;s++)r[s-1]=t(s*e);return r}generateShader(t){let e=Array(t);for(let i=1;i<=t;i++)e[i-1]=`${i}.0 * uDelta`;return`\n      precision highp float;\n      uniform sampler2D uTexture;\n      uniform vec2 uDelta;\n      varying vec2 vTexCoord;\n      uniform float uTaps[${t}];\n      void main() {\n        vec4 color = texture2D(uTexture, vTexCoord);\n        float sum = 1.0;\n        ${e.map((t,e)=>`\n              color += texture2D(uTexture, vTexCoord + ${t}) * uTaps[${e}] + texture2D(uTexture, vTexCoord - ${t}) * uTaps[${e}];\n              sum += 2.0 * uTaps[${e}];\n            `).join("\n")}\n        gl_FragColor = color / sum;\n      }\n    `}applyToForWebgl(t){t.passes++,this.width=t.sourceWidth,this.horizontal=!0,this.dW=Math.round(this.width*this.scaleX),this.dH=t.sourceHeight,this.tempScale=this.dW/this.width,this.taps=this.getTaps(),t.destinationWidth=this.dW,super.applyTo(t),t.sourceWidth=t.destinationWidth,this.height=t.sourceHeight,this.horizontal=!1,this.dH=Math.round(this.height*this.scaleY),this.tempScale=this.dH/this.height,this.taps=this.getTaps(),t.destinationHeight=this.dH,super.applyTo(t),t.sourceHeight=t.destinationHeight}applyTo(t){_a(t)?this.applyToForWebgl(t):this.applyTo2d(t)}isNeutralState(){return 1===this.scaleX&&1===this.scaleY}lanczosCreate(t){return e=>{if(e>=t||e<=-t)return 0;if(e<1.1920929e-7&&e>-1.1920929e-7)return 1;let i=(e*=Math.PI)/t;return Math.sin(e)/e*Math.sin(i)/i}}applyTo2d(t){let e=t.imageData,i=this.scaleX,r=this.scaleY;this.rcpScaleX=1/i,this.rcpScaleY=1/r;let s,n=e.width,o=e.height,a=Math.round(n*i),l=Math.round(o*r);s="sliceHack"===this.resizeType?this.sliceByTwo(t,n,o,a,l):"hermite"===this.resizeType?this.hermiteFastResize(t,n,o,a,l):"bilinear"===this.resizeType?this.bilinearFiltering(t,n,o,a,l):"lanczos"===this.resizeType?this.lanczosResize(t,n,o,a,l):new ImageData(a,l),t.imageData=s}sliceByTwo(t,e,i,r,s){let n=t.imageData,o=.5,a=!1,l=!1,h=e*o,c=i*o,u=t.filterBackend.resources,d=0,g=0,f=e,p=0;u.sliceByTwo||(u.sliceByTwo=Ct());let m=u.sliceByTwo;(m.width<1.5*e||m.height<i)&&(m.width=1.5*e,m.height=i);let y=m.getContext("2d");for(y.clearRect(0,0,1.5*e,i),y.putImageData(n,0,0),r=Math.floor(r),s=Math.floor(s);!a||!l;)e=h,i=c,r<Math.floor(h*o)?h=Math.floor(h*o):(h=r,a=!0),s<Math.floor(c*o)?c=Math.floor(c*o):(c=s,l=!0),y.drawImage(m,d,g,e,i,f,p,h,c),d=f,g=p,p+=c;return y.getImageData(d,g,r,s)}lanczosResize(t,e,i,r,s){let n=t.imageData.data,o=t.ctx.createImageData(r,s),a=o.data,l=this.lanczosCreate(this.lanczosLobes),h=this.rcpScaleX,c=this.rcpScaleY,u=2/this.rcpScaleX,d=2/this.rcpScaleY,g=Math.ceil(h*this.lanczosLobes/2),f=Math.ceil(c*this.lanczosLobes/2),p={},m={x:0,y:0},y={x:0,y:0};return function t(b){let _,v,x,C,w,S,T,O,k,D,M;for(m.x=(b+.5)*h,y.x=Math.floor(m.x),_=0;_<s;_++){for(m.y=(_+.5)*c,y.y=Math.floor(m.y),w=0,S=0,T=0,O=0,k=0,v=y.x-g;v<=y.x+g;v++)if(!(v<0||v>=e)){D=Math.floor(1e3*Math.abs(v-m.x)),p[D]||(p[D]={});for(let t=y.y-f;t<=y.y+f;t++)t<0||t>=i||(M=Math.floor(1e3*Math.abs(t-m.y)),p[D][M]||(p[D][M]=l(Math.sqrt((D*u)**2+(M*d)**2)/1e3)),x=p[D][M],x>0&&(C=4*(t*e+v),w+=x,S+=x*n[C],T+=x*n[C+1],O+=x*n[C+2],k+=x*n[C+3]))}C=4*(_*r+b),a[C]=S/w,a[C+1]=T/w,a[C+2]=O/w,a[C+3]=k/w}return++b<r?t(b):o}(0)}bilinearFiltering(t,e,i,r,s){let n,o,a,l,h,c,u,d,g,f,p,m,y,b=0,_=this.rcpScaleX,v=this.rcpScaleY,x=4*(e-1),C=t.imageData.data,w=t.ctx.createImageData(r,s),S=w.data;for(u=0;u<s;u++)for(d=0;d<r;d++)for(h=Math.floor(_*d),c=Math.floor(v*u),g=_*d-h,f=v*u-c,y=4*(c*e+h),p=0;p<4;p++)n=C[y+p],o=C[y+4+p],a=C[y+x+p],l=C[y+x+4+p],m=n*(1-g)*(1-f)+o*g*(1-f)+a*f*(1-g)+l*g*f,S[b++]=m;return w}hermiteFastResize(t,e,i,r,s){let n=this.rcpScaleX,o=this.rcpScaleY,a=Math.ceil(n/2),l=Math.ceil(o/2),h=t.imageData.data,c=t.ctx.createImageData(r,s),u=c.data;for(let t=0;t<s;t++)for(let i=0;i<r;i++){let s,c=4*(i+t*r),d=0,g=0,f=0,p=0,m=0,y=0,b=(t+.5)*o;for(let r=Math.floor(t*o);r<(t+1)*o;r++){let t=Math.abs(b-(r+.5))/l,o=(i+.5)*n,c=t*t;for(let t=Math.floor(i*n);t<(i+1)*n;t++){let i=Math.abs(o-(t+.5))/a,n=Math.sqrt(c+i*i);n>1&&n<-1||(s=2*n*n*n-3*n*n+1,s>0&&(i=4*(t+r*e),y+=s*h[i+3],g+=s,h[i+3]<255&&(s=s*h[i+3]/250),f+=s*h[i],p+=s*h[i+1],m+=s*h[i+2],d+=s))}}u[c]=f/d,u[c+1]=p/d,u[c+2]=m/d,u[c+3]=y/g}return c}};p(tl,"type","Resize"),p(tl,"defaults",{resizeType:"hermite",scaleX:1,scaleY:1,lanczosLobes:3}),p(tl,"uniformLocations",["uDelta","uTaps"]),at.setClass(tl);var el=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uSaturation;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float rgMax = max(color.r, color.g);\n    float rgbMax = max(rgMax, color.b);\n    color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n    color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n    color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=-this.saturation;for(let i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2],o=Math.max(r,s,n);t[i]+=o===r?0:(o-r)*e,t[i+1]+=o===s?0:(o-s)*e,t[i+2]+=o===n?0:(o-n)*e}}sendUniformData(t,e){t.uniform1f(e.uSaturation,-this.saturation)}isNeutralState(){return 0===this.saturation}};p(el,"type","Saturation"),p(el,"defaults",{saturation:0}),p(el,"uniformLocations",["uSaturation"]),at.setClass(el);var il=class extends wa{getFragmentSource(){return"\n  precision highp float;\n  uniform sampler2D uTexture;\n  uniform float uVibrance;\n  varying vec2 vTexCoord;\n  void main() {\n    vec4 color = texture2D(uTexture, vTexCoord);\n    float max = max(color.r, max(color.g, color.b));\n    float avg = (color.r + color.g + color.b) / 3.0;\n    float amt = (abs(max - avg) * 2.0) * uVibrance;\n    color.r += max != color.r ? (max - color.r) * amt : 0.00;\n    color.g += max != color.g ? (max - color.g) * amt : 0.00;\n    color.b += max != color.b ? (max - color.b) * amt : 0.00;\n    gl_FragColor = color;\n  }\n"}applyTo2d({imageData:{data:t}}){let e=-this.vibrance;for(let i=0;i<t.length;i+=4){let r=t[i],s=t[i+1],n=t[i+2],o=Math.max(r,s,n),a=(r+s+n)/3,l=2*Math.abs(o-a)/255*e;t[i]+=o===r?0:(o-r)*l,t[i+1]+=o===s?0:(o-s)*l,t[i+2]+=o===n?0:(o-n)*l}}sendUniformData(t,e){t.uniform1f(e.uVibrance,-this.vibrance)}isNeutralState(){return 0===this.vibrance}};function rl(t,e){const i=document.createElement("canvas");return i.width=t,i.height=e,i}function sl(t){const e=t.getContext("2d");if(!e)throw new Error("The browser gave no 2D canvas.");return e}function nl(t){const e=new Map;return t.forEach(t=>{e.has(t.family)||e.set(t.family,{family:t.family,label:t.label||t.family})}),[...e.values()]}p(il,"type","Vibrance"),p(il,"defaults",{vibrance:0}),p(il,"uniformLocations",["uVibrance"]),at.setClass(il),d({BaseFilter:()=>wa,BlackWhite:()=>$a,BlendColor:()=>Ta,BlendImage:()=>ka,Blur:()=>Da,Brightness:()=>Ma,Brownie:()=>Aa,ColorMatrix:()=>Ea,Composed:()=>Xa,Contrast:()=>Ya,Convolute:()=>Na,Gamma:()=>za,Grayscale:()=>Ga,HueRotation:()=>qa,Invert:()=>Ka,Kodachrome:()=>La,Noise:()=>Ja,Pixelate:()=>Qa,Polaroid:()=>Ra,RemoveColor:()=>Za,Resize:()=>tl,Saturation:()=>el,Sepia:()=>Ba,Technicolor:()=>Ia,Vibrance:()=>il,Vintage:()=>Fa});const ol={woff2:"woff2",woff:"woff",ttf:"truetype",otf:"opentype"},al=t=>`"PrintBlob ${t}"`,ll=new Map;async function hl(t){const e=[...new Set(t.filter(t=>ll.has(t)))];await Promise.all(e.flatMap(t=>(ll.get(t)??[]).map(t=>t.load()))),await Promise.all(e.flatMap(t=>[document.fonts.load(`400 40px ${al(t)}`,"Aа"),document.fonts.load(`700 40px ${al(t)}`,"Aа")]))}function cl(t){const e=new Set,i=t=>{if(t&&"string"==typeof t.fontFamily){const i=t.fontFamily.match(/^"PrintBlob (.+)"$/);i?.[1]&&e.add(i[1])}(t?.objects??[]).forEach(i)};return Object.values(t??{}).forEach(i),[...e]}const ul="#1A1D22",dl="#FFFFFF",gl="#2645D6",fl=[{name:(0,e.__)("Black","printblob"),hex:ul},{name:(0,e.__)("White","printblob"),hex:dl},{name:(0,e.__)("Cobalt","printblob"),hex:gl},{name:(0,e.__)("Red","printblob"),hex:"#D7263D"},{name:(0,e.__)("Yellow","printblob"),hex:"#F4C20D"},{name:(0,e.__)("Green","printblob"),hex:"#1F8A4C"}],pl=t=>({"--printblob-swatch":t}),ml=JSON.parse('{"r_":["front"],"Ee":1000,"uQ":300,"LH":{"area":{"x":0.3,"y":0.3,"w":0.4,"h":0.4},"print_cm":{"w":28,"h":36}}}');ml.r_,ml.Ee;const yl=ml.uQ;ml.LH;const bl=["printblobKind","printblobAutoInk","printblobVector"];function _l(t){return new Qs({left:t.left+t.width/2,top:t.top+t.height/2,width:t.width,height:t.height,absolutePositioned:!0})}function vl(t){return{x:t.left+t.width/2,y:t.top+t.height/2}}async function xl(t,e,i,{vector:r=!1}={}){const s=await ba.fromURL(e),n=Math.min(.8*i.width/s.width,.8*i.height/s.height),o=vl(i);return s.set({left:o.x,top:o.y,scaleX:n,scaleY:n,printblobKind:"image",printblobVector:r}),t.add(s),t.setActiveObject(s),t.requestRenderAll(),s}function Cl(t,e,i,{family:r="Onest",color:s=ul}={}){const n=vl(i),o=new la(e,{left:n.x,top:n.y,width:.9*i.width,fontSize:56,lineHeight:1.1,fontFamily:al(r),fontWeight:700,fill:s,textAlign:"center",printblobKind:"text",printblobAutoInk:!0});return t.add(o),t.setActiveObject(o),t.requestRenderAll(),o}function wl(t){return"text"===t.printblobKind&&t instanceof la}function Sl(t,e){t.setActiveObject(e),e.enterEditing(),e.selectAll(),t.requestRenderAll()}function Tl(t,e){t.remove(e),t.discardActiveObject(),t.requestRenderAll()}function Ol(t){return t.toObject(bl)}function kl(t){return Boolean(t?.objects?.length)}async function Dl(t,e,i){t.discardActiveObject(),t.clear(),t.getWidth()===i.stage.width&&t.getHeight()===i.stage.height||t.setDimensions({width:i.stage.width,height:i.stage.height},{backstoreOnly:!0}),e&&await t.loadFromJSON(e),t.clipPath=_l(i.area),t.requestRenderAll()}function Ml(t,e){return t?{...t,objects:t.objects.map(t=>t.printblobAutoInk?{...t,fill:e}:t)}:t}function jl(t,e){if("image"!==t?.printblobKind||t.printblobVector)return null;const i=t.getScaledWidth()/e.area.width*e.printCm.width;return Math.round(t.width/(i/2.54))}Object.assign(ps.ownDefaults,{cornerColor:gl,cornerStrokeColor:"#FFFFFF",borderColor:gl,cornerStyle:"circle",cornerSize:22,touchCornerSize:36,transparentCorners:!1,borderScaleFactor:2,padding:6});const El=t=>("Image"===t.type||"image"===t.printblobKind)&&Boolean(t.src?.startsWith("data:"));function Pl(t){const e=t=>t?{...t,objects:t.objects.map(t=>El(t)?{...t,src:""}:t)}:null;return Object.fromEntries(Object.entries(t).map(([t,i])=>[t,e(i)]))}function Al(t){const e=(t?.objects||[]).filter(El).map(t=>t.src);return[...new Set(e)]}async function Fl(t,e){const i=new _e(document.createElement("canvas"),{width:e.stage.width,height:e.stage.height,enableRetinaScaling:!1,renderOnAddRemove:!1});return await i.loadFromJSON(t),i.getObjects().forEach(t=>t.set({objectCaching:!1})),i.clipPath=_l(e.area),i.renderAll(),i}const Ll=t=>new Promise((e,i)=>t.toBlob(t=>t?e(t):i(new Error("Export failed")),"image/png")),Il=Uint32Array.from({length:256},(t,e)=>{let i=e;for(let t=0;t<8;t++)i=1&i?3988292384^i>>>1:i>>>1;return i>>>0});async function Rl(t,e){const i=new Uint8Array(await t.arrayBuffer()),r=Math.round(e/.0254),s=new Uint8Array(21),n=new DataView(s.buffer);return n.setUint32(0,9),s.set([112,72,89,115],4),n.setUint32(8,r),n.setUint32(12,r),s[16]=1,n.setUint32(17,function(t){let e=4294967295;for(const i of t)e=Il[255&(e^i)]^e>>>8;return(4294967295^e)>>>0}(s.subarray(4,17))),new Blob([i.subarray(0,33),s,i.subarray(33)],{type:"image/png"})}function Bl(t,e,i,r){const s=t.toCanvasElement(i/e.area.width,{left:e.area.left,top:e.area.top,width:e.area.width,height:e.area.height}),n=rl(i,r);return sl(n).drawImage(s,0,0,i,r),n}async function $l(t,e,i){const r=Math.round(i*e.area.height/e.area.width);if(!t||!kl(t))return rl(i,r);const s=await Fl(t,e),n=Bl(s,e,i,r);return s.dispose(),n}async function Xl(t,e,i){const r=await Fl(t,e),s=Bl(r,e,e.printPx.width,e.printPx.height),n=rl(.8*e.stage.width,.8*e.stage.height),o=sl(n);return o.drawImage(i,0,0,n.width,n.height),o.drawImage(r.toCanvasElement(.8),0,0),r.dispose(),{print:await Rl(await Ll(s),yl),preview:await Ll(n)}}const Yl=(t,e)=>e?`${t} is-shown`:t;function Wl({selected:t,items:i,tool:r,printFonts:s,dpi:n,onChoose:a,onDone:l,onChange:h,onCentre:c,onLayer:u,onRemove:d}){const g=t&&wl(t)?t:null,f="image"===t?.printblobKind?t:null,p=(0,o.jsxs)("div",{className:"printblob-designer__row printblob-designer__row--actions",children:[(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:c,children:(0,e.__)("Centre","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:()=>u("up"),children:(0,e.__)("Bring forward","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:()=>u("down"),children:(0,e.__)("Send back","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button printblob-link-button--danger",onClick:d,children:(0,e.__)("Remove","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-link-button",onClick:l,children:/* translators: closes the controls of the chosen image or text, back to the list of what is on the side. */ /* translators: closes the controls of the chosen image or text, back to the list of what is on the side. */
    55(0,e.__)("Done","printblob")})]});return(0,o.jsxs)("div",{className:"printblob-designer__workbench printblob-stack",children:[(0,o.jsxs)("div",{className:Yl("printblob-designer__selection printblob-designer__selection--text",!r&&null!==g),children:[(0,o.jsxs)("div",{className:"printblob-designer__row",children:[(0,o.jsxs)("label",{className:"printblob-field",children:[(0,o.jsx)("span",{children:(0,e.__)("Font","printblob")}),(0,o.jsx)("select",{value:s.find(t=>al(t.family)===g?.fontFamily)?.family??s[0]?.family,onChange:async t=>{const e=t.target.value;await hl([e]),h({fontFamily:al(e)})},children:s.map(t=>(0,o.jsx)("option",{value:t.family,children:t.label},t.family))})]}),(0,o.jsx)("button",{type:"button",className:"printblob-toggle","aria-pressed":Number(g?.fontWeight)>=700,onClick:()=>h({fontWeight:Number(g?.fontWeight)>=700?400:700}),children:(0,e.__)("Bold","printblob")})]}),(0,o.jsxs)("fieldset",{className:"printblob-field",children:[(0,o.jsx)("legend",{children:(0,e.__)("Ink colour","printblob")}),(0,o.jsxs)("div",{className:"printblob-swatches",children:[fl.map(t=>(0,o.jsx)("button",{type:"button",className:"printblob-swatch",style:pl(t.hex),"aria-label":t.name,"aria-pressed":"string"==typeof g?.fill&&g.fill.toUpperCase()===t.hex,onClick:()=>h({fill:t.hex,printblobAutoInk:!1})},t.hex)),(0,o.jsx)("label",{className:"printblob-swatch printblob-swatch--custom","aria-label":(0,e.__)("Custom colour","printblob"),children:(0,o.jsx)("input",{type:"color",value:"string"==typeof g?.fill?g.fill:ul,onChange:t=>h({fill:t.target.value.toUpperCase(),printblobAutoInk:!1})})})]})]}),p]}),(0,o.jsxs)("div",{className:Yl("printblob-designer__selection printblob-designer__selection--image",!r&&null!==f),children:[p,f&&null!==n&&(0,o.jsx)("p",{className:n<150?"printblob-note printblob-note--warn":"printblob-note",children:n<150?(0,e.sprintf)(/* translators: %d: dots per inch. */ /* translators: %d: dots per inch. */
    66(0,e.__)("This image is %d DPI at this size, so it may print blurry. Make it smaller or upload a larger file.","printblob"),n):(0,e.sprintf)(/* translators: %d: dots per inch. */ /* translators: %d: dots per inch. */
    … …  
    88(0,e.__)("Choose what to change","printblob")}),(0,o.jsx)("ul",{children:i.map((t,i)=>(0,o.jsx)("li",{children:(0,o.jsx)("button",{type:"button",className:"printblob-designer__item",onClick:()=>a(t),children:wl(t)?(0,o.jsx)("span",{children:t.text}):(0,o.jsxs)(o.Fragment,{children:[t instanceof ba&&(0,o.jsx)("img",{src:t.getSrc(),alt:""}),(0,o.jsx)("span",{children:/* translators: a picture the customer placed on the product, in the list of what is on a printed side. */ /* translators: a picture the customer placed on the product, in the list of what is on a printed side. */
    99(0,e.__)("Image","printblob")})]})})},i))})]}):(0,o.jsx)("p",{className:"printblob-note",children:/* translators: shown where the controls appear while the printed side shown has nothing on it. */ /* translators: shown where the controls appear while the printed side shown has nothing on it. */
    10 (0,e.__)("Upload an image or add text to start.","printblob")})}),r]})}const Nl={"image/png":"png","image/jpeg":"jpg","image/webp":"webp"},Vl=Object.keys(Nl);function zl(t){const[e,i]=t.split(","),r=Uint8Array.from(atob(i),t=>t.charCodeAt(0));return new Blob([r],{type:e.slice(5).split(";")[0]})}const Hl=()=>new Promise(t=>window.requestAnimationFrame(()=>window.setTimeout(t,0)));function Gl(t,{color:e,size:i,options:r}){const s=[];return e&&s.push({attribute:t.attributes.color,value:e}),i&&s.push({attribute:t.attributes.size,value:i}),(t.options??[]).forEach(t=>s.push({attribute:t.attribute,value:r[t.field]??null})),s}async function Ul(t,e){try{const i=await t.json();return i?.description||i?.message||e}catch{return e}}const ql=t=>`printblob-design-${t}`;function Kl(t){try{const e=window.localStorage.getItem(ql(t));return(null===e?null:JSON.parse(e))||null}catch{return null}}function Jl(t,e){try{window.localStorage.setItem(ql(t),JSON.stringify(e))}catch{}}function Ql(t,e,i){return.2126*t+.7152*e+.0722*i}function Zl(t,e){if(t[e+3]<5)return!1;const i=t[e],r=t[e+1],s=t[e+2],n=Math.max(i,r,s),o=Math.min(i,r,s);return n>0&&(n-o)/n<.14}function th(t,e,i){const r=new Uint32Array(256);let s=0;for(let n=0;n<i;n++)for(let i=0;i<e;i++){const o=4*(n*e+i);Zl(t,o)&&(r[Math.round(Ql(t[o],t[o+1],t[o+2]))]++,s++)}let n=0;for(let t=0;t<256;t++)if(n+=r[t],n>=.7*s)return t/255;return 1}function eh(t){const e=t.replace("#",""),i=t=>parseInt(e.slice(t,t+2),16)/255;return[i(0),i(2),i(4)]}const ih=window.wp.hooks;let rh=0;function sh(e,i,r){const[s]=(0,t.useState)(()=>`printblob/designer/${e}/${++rh}`),[,n]=(0,t.useState)(0);return(0,t.useEffect)(()=>{const t=t=>t===e&&n(t=>t+1);return(0,ih.addAction)("hookAdded",s,t),(0,ih.addAction)("hookRemoved",s,t),n(t=>t+1),()=>{(0,ih.removeAction)("hookAdded",s),(0,ih.removeAction)("hookRemoved",s)}},[e,s]),function(t,e,i){const r=(0,ih.applyFilters)(t,{},i);return(e??[]).flatMap(t=>{const e=r[t.key];return e&&!1!==e.available?.()?[{...t,...e}]:[]})}(e,i,r)}const nh=t=>`attribute_${t}`,oh=(t,e)=>Object.entries(t.attributes).every(([t,i])=>""===i||t in e&&(null===e[t]||e[t]===i)),ah=(t,e)=>Object.fromEntries(t.map(t=>[t.key,e(t)]));function lh({config:a}){const u=(0,t.useMemo)(()=>function(t){const e=function(t){const e={};for(const i of["designs","storeApi"]){const r=t[i];if("string"!=typeof r)throw new TypeError(`The designer's configuration has no ${i} endpoint.`);e[i]=r}return e}(t);let i=null;const s=t=>{const e=t.headers.get("Nonce");return e&&(i=e),t};async function n(){return i||s(await fetch(`${e.storeApi}cart`,{credentials:"same-origin"})),String(i)}return{saveDesign:async function(t){const i=s(await fetch(e.designs,{method:"POST",credentials:"same-origin",headers:{Nonce:await n()},body:t}));if(!i.ok)throw new Error(await Ul(i,r().notSaved));return i.json()},addToCart:async function({id:t,productId:i,quantity:o,variation:a,design:l}){const h=s(await fetch(`${e.storeApi}cart/add-item`,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json",Nonce:await n()},body:JSON.stringify({id:i??t,quantity:o,variation:a,printblob_design:l})}));if(!h.ok)throw new Error(await Ul(h,r().notAdded));const c=await h.json();return document.body.dispatchEvent(new CustomEvent("wc-blocks_added_to_cart",{bubbles:!0,detail:{preserveCartData:!1}})),c}}}(a.endpoints),[a.endpoints]),d=(0,t.useMemo)(()=>ah(a.sides,t=>function(t,{recolor:e=!0}={}){let i=null;const r=new Map;let s=null;return{get ready(){return s??=new Promise((e,r)=>{const s=new Image;s.onload=()=>{const t=sl(rl(s.naturalWidth,s.naturalHeight));t.drawImage(s,0,0);const r=t.getImageData(0,0,s.naturalWidth,s.naturalHeight);i={photo:s,base:r,reference:th(r.data,r.width,r.height)},e()},s.onerror=()=>r(new Error("The product photo could not be loaded.")),s.crossOrigin="anonymous",s.src=t}),s},render:function(t){const s=e?t:"photo";let n=r.get(s);if(!n){if(!i)throw new Error("The product photo is not loaded yet.");const{base:o,reference:a}=i;n=rl(o.width,o.height);const l=e?function(t,e,i,r,s){const[n,o,a]=eh(r),l=.55-(n+o+a)/3*.35,h=new Uint8ClampedArray(t.length);h.set(t);for(let r=0;r<i;r++)for(let i=0;i<e;i++){const c=4*(r*e+i);if(!Zl(t,c))continue;const u=Ql(t[c],t[c+1],t[c+2])/255,d=u/s,g=(u-s)*l;h[c]=255*(n*d+g),h[c+1]=255*(o*d+g),h[c+2]=255*(a*d+g)}return h}(o.data,o.width,o.height,t,a):o.data;sl(n).putImageData(new ImageData(new Uint8ClampedArray(l),o.width,o.height),0,0),r.set(s,n)}return n},image:()=>i?.photo??null,pixels:()=>({data:i?.base??null,reference:i?.reference??1})}}(t.image,{recolor:t.recolor})),[a.sides]),g=(0,t.useRef)(null),f=(0,t.useMemo)(()=>nl(a.fonts),[a.fonts]),p=(0,t.useMemo)(()=>ah(a.sides,t=>t),[a.sides]),m=(0,t.useMemo)(()=>Kl(a.productId),[a.productId]),y=(0,t.useRef)(null),b=(0,t.useRef)(null),_=(0,t.useRef)(!1),v=(0,t.useRef)(!1),x=(0,t.useRef)(null),C=()=>ah(a.sides,()=>null),w=(0,t.useRef)({...C(),...m?.sides??{}}),[S,T]=(0,t.useState)(!1),[O,k]=(0,t.useState)(a.sides[0].key),[D,M]=(0,t.useState)(a.initialColor||m?.color||a.colors[0]?.slug||""),[j,E]=(0,t.useState)(m?.size??""),P=a.options??[],[A,F]=(0,t.useState)(()=>Object.fromEntries(P.map(t=>{const e=m?.options?.[t.field];return[t.field,t.choices.find(t=>t.value===e)?.value??t.choices[0]?.value??null]}))),[L,I]=(0,t.useState)(1),[R,B]=(0,t.useState)(null),[$,X]=(0,t.useState)([]),[Y,W]=(0,t.useState)({}),[N,V]=(0,t.useState)(()=>ah(a.sides,t=>kl(w.current[t.key]))),[z,H]=(0,t.useState)({state:"idle",message:""}),G=(t=>sh("printblob.designer.views",t.views,t))(a),[U,q]=(0,t.useState)(null),K=G.find(t=>t.key===U)?.Component??null,J=G.find(t=>t.initial)?.key??null,Q=(0,t.useRef)(!1),Z=(t=>sh("printblob.designer.tools",t.tools,t))(a),[tt,et]=(0,t.useState)(null),it=Z.find(t=>t.key===tt)?.Panel??null,rt=a.colors.find(t=>t.slug===D)?.hex??"#FFFFFF",st=p[O],nt=a.sides[0],ot=d[O],at=a.sizes.length>0,lt=nh(a.attributes.size),ht={[nh(a.attributes.color)]:D,[lt]:at&&!j?null:j,...A},ct=a.variations.length?((t,e)=>t.find(t=>!Object.values(e).includes(null)&&oh(t,e)))(a.variations,ht):null,ut=t=>!a.variations.length||((t,e)=>t.some(t=>t.inStock&&oh(t,e)))(a.variations,{...ht,...t}),dt=ct?ct.price:a.basePrice,gt=dt+a.sides.filter(t=>N[t.key]).reduce((t,e)=>t+e.price,0),ft=()=>X(b.current?[...b.current.getObjects()]:[]),pt=(0,t.useCallback)(t=>W(e=>({...e,...Object.fromEntries(t.map(t=>[t,(e[t]??0)+1]))})),[]),mt=(0,t.useMemo)(()=>a.sides.reduce((t,e)=>e.stage.height/e.stage.width>t.stage.height/t.stage.width?e:t),[a.sides]),yt=(0,t.useCallback)((t,e)=>$l(w.current[t],p[t],e),[p]),bt=(0,t.useCallback)(()=>{const t=b.current;t&&(w.current={...w.current,[O]:Ol(t)},V(t=>({...t,[O]:kl(w.current[O])})),pt([O]),Jl(a.productId,{sides:w.current,color:D,size:j,options:A}))},[O,D,j,A,a.productId,pt]);(0,t.useEffect)(()=>{let t,e=!1;return(async()=>{a.fonts.forEach(t=>{const e={weight:t.weight||"400",style:t.style||"normal",display:"block"};t.unicodeRange&&(e.unicodeRange=t.unicodeRange);const i=new FontFace(`PrintBlob ${t.family}`,`url(${t.url}) format("${function(t){const e=new URL(t,window.location.href).pathname.split(".").pop()?.toLowerCase()??"";return ol[e]??"woff2"}(t.url)}")`,e);document.fonts.add(i),ll.set(t.family,[...ll.get(t.family)??[],i])});const i=[nl(a.fonts)[0]?.family,...cl(a.initialText?{}:w.current)].filter(t=>Boolean(t));if(await Promise.all([hl(i),...Object.values(d).map(t=>t.ready)]),!e&&y.current){if(t=function(t,e){const i=new po(t,{width:e.stage.width,height:e.stage.height,preserveObjectStacking:!0,selectionColor:"rgba(38, 69, 214, 0.08)",selectionBorderColor:gl,controlsAboveOverlay:!0});return i.clipPath=_l(e.area),i.setDimensions({width:"100%",height:"auto"},{cssOnly:!0}),i}(y.current,nt),b.current=t,a.initialColor){const t=new URL(window.location.href);t.searchParams.delete("color"),window.history.replaceState(null,"",t)}if(a.initialText){w.current=C(),V(ah(a.sides,()=>!1));const t=new URL(window.location.href);t.searchParams.delete("text"),window.history.replaceState(null,"",t)}await Dl(t,w.current[nt.key],nt),a.initialText&&(Cl(t,a.initialText,nt.area,{family:nl(a.fonts)[0]?.family}),w.current={...w.current,[nt.key]:Ol(t)},Jl(a.productId,{...Kl(a.productId),sides:w.current}),V(t=>({...t,[nt.key]:!0})),pt([nt.key]),B(t.getActiveObject()??null)),ft(),T(!0)}})(),()=>{e=!0,t?.dispose(),b.current=null}},[]),(0,t.useEffect)(()=>{const t=b.current;if(!S||!t)return;const e=()=>{const e=t.getActiveObject()??null;B(e),e&&et(null)},i=()=>{_.current||(bt(),ft())};return t.on("selection:created",e),t.on("selection:updated",e),t.on("selection:cleared",e),t.on("object:modified",i),t.on("object:added",i),t.on("object:removed",i),t.on("text:changed",i),()=>{t.off("selection:created",e),t.off("selection:updated",e),t.off("selection:cleared",e),t.off("object:modified",i),t.off("object:added",i),t.off("object:removed",i),t.off("text:changed",i)}},[S,bt]),(0,t.useEffect)(()=>{Jl(a.productId,{sides:w.current,color:D,size:j,options:A})},[D,j,A,a.productId]),(0,t.useEffect)(()=>{S&&J&&!Q.current&&(Q.current=!0,q(J))},[S,J]);const _t=function(t){const[e,i,r]=eh(t).map(t=>t<=.03928?t/12.92:((t+.055)/1.055)**2.4);return.2126*e+.7152*i+.0722*r<.25}(rt),vt=_t?dl:ul;function xt(t){const e=b.current;var i;R&&e&&((i=R)instanceof aa&&i.isEditing&&i.exitEditing(),t(e,R))}function Ct(t){xt((e,i)=>{i.set(t),i.setCoords(),e.requestRenderAll(),bt(),ft()})}(0,t.useEffect)(()=>{const t=g.current;if(!S||!t)return;const e=ot.render(rt);t.width=e.width,t.height=e.height,t.getContext("2d")?.drawImage(e,0,0)},[S,rt,ot,O]),(0,t.useEffect)(()=>{const t=b.current;S&&t&&(t.getObjects().forEach(t=>t.printblobAutoInk&&t.set({fill:vt})),t.requestRenderAll(),w.current=Object.fromEntries(Object.entries(w.current).map(([e,i])=>[e,e===O?Ol(t):Ml(i,vt)])),pt(Object.keys(w.current)),ft())},[vt,S]),function(e,i){(0,t.useEffect)(()=>{const t=t=>{const r=e.current,s=r?.getActiveObject();if(!r||!s||(n=s)instanceof aa&&n.isEditing||t.target instanceof HTMLElement&&/^(INPUT|TEXTAREA|SELECT)$/.test(t.target.tagName))return;var n;const o=t.shiftKey?10:2,a={ArrowLeft:[-o,0],ArrowRight:[o,0],ArrowUp:[0,-o],ArrowDown:[0,o]}[t.key];a?(t.preventDefault(),s.set({left:s.left+a[0],top:s.top+a[1]}),s.setCoords(),r.requestRenderAll(),i()):"Delete"!==t.key&&"Backspace"!==t.key||(t.preventDefault(),Tl(r,s))};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,i])}(b,bt);const wt="busy"===z.state;return(0,o.jsxs)("div",{className:"printblob-designer__layout",children:[(0,o.jsxs)("div",{className:"printblob-designer__stage-column",children:[(0,o.jsxs)("div",{className:"printblob-designer__views",children:[(0,o.jsx)("div",{className:"printblob-designer__sides",role:"tablist","aria-label":(0,e.__)("Printed side","printblob"),children:a.sides.map(t=>(0,o.jsxs)("button",{type:"button",role:"tab","aria-selected":O===t.key,className:"printblob-designer__side",onClick:()=>async function(t){const e=b.current;if(t!==O&&e){w.current={...w.current,[O]:Ol(e)},_.current=!0;try{await Dl(e,w.current[t],p[t])}finally{_.current=!1}B(null),k(t),ft()}}(t.key),disabled:!S||wt,children:[t.label,(0,o.jsx)("span",{className:N[t.key]?"printblob-designer__side-dot is-shown":"printblob-designer__side-dot","aria-label":N[t.key]?(0,e.__)("has a print","printblob"):void 0})]},t.key))}),G.map(t=>(0,o.jsx)("button",{type:"button",className:`printblob-designer__side printblob-designer__side--view printblob-designer__side--${t.key}`,"aria-pressed":U===t.key,onClick:()=>q(e=>e===t.key?null:t.key),disabled:!S||wt,children:t.label},t.key))]}),(0,o.jsxs)("div",{className:"printblob-designer__stage",style:{aspectRatio:`${mt.stage.width} / ${mt.stage.height}`},children:[(0,o.jsxs)("div",{className:"printblob-designer__frame",style:{aspectRatio:`${st.stage.width} / ${st.stage.height}`},children:[(0,o.jsx)("canvas",{ref:g,className:"printblob-designer__shirt","aria-hidden":"true"}),(0,o.jsx)("div",{className:_t?"printblob-designer__area is-on-dark":"printblob-designer__area","aria-hidden":"true",style:{left:st.area.left/st.stage.width*100+"%",top:st.area.top/st.stage.height*100+"%",width:st.area.width/st.stage.width*100+"%",height:st.area.height/st.stage.height*100+"%"}},O),(0,o.jsx)("div",{className:"printblob-designer__canvas",children:(0,o.jsx)("canvas",{ref:y,"aria-label":(0,e.__)("Design area. Drag to move, use the corner handles to resize or rotate.","printblob")})})]}),!S&&(0,o.jsx)("p",{className:"printblob-designer__stage-loading",children:(0,e.__)("Loading the designer…","printblob")}),K&&S&&(0,o.jsx)(K,{config:a,mockups:d,colorHex:rt,side:O,renderSide:yt,revisions:Y})]}),(0,o.jsx)("p",{className:"printblob-designer__hint",children:(0,e.sprintf)(/* translators: 1: print area width in cm, 2: print area height in cm. */ /* translators: 1: print area width in cm, 2: print area height in cm. */
     10(0,e.__)("Upload an image or add text to start.","printblob")})}),r]})}const Nl={"image/png":"png","image/jpeg":"jpg","image/webp":"webp"},Vl=Object.keys(Nl);function zl(t){const[e,i]=t.split(","),r=Uint8Array.from(atob(i),t=>t.charCodeAt(0));return new Blob([r],{type:e.slice(5).split(";")[0]})}const Hl=()=>new Promise(t=>window.requestAnimationFrame(()=>window.setTimeout(t,0)));function Gl(t,{color:e,size:i,options:r}){const s=[];return e&&s.push({attribute:t.attributes.color,value:e}),i&&s.push({attribute:t.attributes.size,value:i}),(t.options??[]).forEach(t=>s.push({attribute:t.attribute,value:r[t.field]??null})),s}async function Ul(t,e){try{const i=await t.json();return i?.description||i?.message||e}catch{return e}}const ql=t=>`printblob-design-${t}`;function Kl(t){try{const e=window.localStorage.getItem(ql(t));return(null===e?null:JSON.parse(e))||null}catch{return null}}function Jl(t,e){try{window.localStorage.setItem(ql(t),JSON.stringify(e))}catch{}}function Ql(t,e,i){return.2126*t+.7152*e+.0722*i}function Zl(t,e){if(t[e+3]<5)return!1;const i=t[e],r=t[e+1],s=t[e+2],n=Math.max(i,r,s),o=Math.min(i,r,s);return n>0&&(n-o)/n<.14}function th(t,e,i){const r=new Uint32Array(256);let s=0;for(let n=0;n<i;n++)for(let i=0;i<e;i++){const o=4*(n*e+i);Zl(t,o)&&(r[Math.round(Ql(t[o],t[o+1],t[o+2]))]++,s++)}let n=0;for(let t=0;t<256;t++)if(n+=r[t],n>=.7*s)return t/255;return 1}function eh(t){const e=t.replace("#",""),i=t=>parseInt(e.slice(t,t+2),16)/255;return[i(0),i(2),i(4)]}const ih=window.wp.hooks;let rh=0;function sh(e,i,r){const[s]=(0,t.useState)(()=>`printblob/designer/${e}/${++rh}`),[,n]=(0,t.useState)(0);return(0,t.useEffect)(()=>{const t=t=>t===e&&n(t=>t+1);return(0,ih.addAction)("hookAdded",s,t),(0,ih.addAction)("hookRemoved",s,t),n(t=>t+1),()=>{(0,ih.removeAction)("hookAdded",s),(0,ih.removeAction)("hookRemoved",s)}},[e,s]),function(t,e,i){const r=(0,ih.applyFilters)(t,{},i);return(e??[]).flatMap(t=>{const e=r[t.key];return e&&!1!==e.available?.()?[{...t,...e}]:[]})}(e,i,r)}const nh=t=>`attribute_${t}`,oh=(t,e)=>Object.entries(t.attributes).every(([t,i])=>""===i||t in e&&(null===e[t]||e[t]===i)),ah=(t,e)=>Object.fromEntries(t.map(t=>[t.key,e(t)]));function lh({config:a}){const u=(0,t.useMemo)(()=>function(t){const e=function(t){const e={};for(const i of["designs","storeApi"]){const r=t[i];if("string"!=typeof r)throw new TypeError(`The designer's configuration has no ${i} endpoint.`);e[i]=r}return e}(t);let i=null;const s=t=>{const e=t.headers.get("Nonce");return e&&(i=e),t};async function n(){return i||s(await fetch(`${e.storeApi}cart`,{credentials:"same-origin"})),String(i)}return{saveDesign:async function(t){const i=s(await fetch(e.designs,{method:"POST",credentials:"same-origin",headers:{Nonce:await n()},body:t}));if(!i.ok)throw new Error(await Ul(i,r().notSaved));return i.json()},addToCart:async function({id:t,productId:i,quantity:o,variation:a,design:l}){const h=s(await fetch(`${e.storeApi}cart/add-item`,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json",Nonce:await n()},body:JSON.stringify({id:i??t,quantity:o,variation:a,printblob_design:l})}));if(!h.ok)throw new Error(await Ul(h,r().notAdded));const c=await h.json();return document.body.dispatchEvent(new CustomEvent("wc-blocks_added_to_cart",{bubbles:!0,detail:{preserveCartData:!1}})),c}}}(a.endpoints),[a.endpoints]),d=(0,t.useMemo)(()=>ah(a.sides,t=>function(t,{recolor:e=!0}={}){let i=null;const r=new Map;let s=null;return{get ready(){return s??=new Promise((e,r)=>{const s=new Image;s.onload=()=>{const t=sl(rl(s.naturalWidth,s.naturalHeight));t.drawImage(s,0,0);const r=t.getImageData(0,0,s.naturalWidth,s.naturalHeight);i={photo:s,base:r,reference:th(r.data,r.width,r.height)},e()},s.onerror=()=>r(new Error("The product photo could not be loaded.")),s.crossOrigin="anonymous",s.src=t}),s},render:function(t){const s=e?t:"photo";let n=r.get(s);if(!n){if(!i)throw new Error("The product photo is not loaded yet.");const{base:o,reference:a}=i;n=rl(o.width,o.height);const l=e?function(t,e,i,r,s){const[n,o,a]=eh(r),l=.55-(n+o+a)/3*.35,h=new Uint8ClampedArray(t.length);h.set(t);for(let r=0;r<i;r++)for(let i=0;i<e;i++){const c=4*(r*e+i);if(!Zl(t,c))continue;const u=Ql(t[c],t[c+1],t[c+2])/255,d=u/s,g=(u-s)*l;h[c]=255*(n*d+g),h[c+1]=255*(o*d+g),h[c+2]=255*(a*d+g)}return h}(o.data,o.width,o.height,t,a):o.data;sl(n).putImageData(new ImageData(new Uint8ClampedArray(l),o.width,o.height),0,0),r.set(s,n)}return n},image:()=>i?.photo??null,pixels:()=>({data:i?.base??null,reference:i?.reference??1})}}(t.image,{recolor:t.recolor})),[a.sides]),g=(0,t.useRef)(null),f=(0,t.useMemo)(()=>nl(a.fonts),[a.fonts]),p=(0,t.useMemo)(()=>ah(a.sides,t=>t),[a.sides]),m=(0,t.useMemo)(()=>Kl(a.productId),[a.productId]),y=(0,t.useRef)(null),b=(0,t.useRef)(null),_=(0,t.useRef)(!1),v=(0,t.useRef)(!1),x=(0,t.useRef)(null),C=()=>ah(a.sides,()=>null),w=(0,t.useRef)({...C(),...m?.sides??{}}),[S,T]=(0,t.useState)(!1),[O,k]=(0,t.useState)(a.sides[0].key),[D,M]=(0,t.useState)(a.initialColor||m?.color||a.colors[0]?.slug||""),[j,E]=(0,t.useState)(m?.size??""),P=a.options??[],[A,F]=(0,t.useState)(()=>Object.fromEntries(P.map(t=>{const e=m?.options?.[t.field];return[t.field,t.choices.find(t=>t.value===e)?.value??t.choices[0]?.value??null]}))),[L,I]=(0,t.useState)(1),[R,B]=(0,t.useState)(null),[$,X]=(0,t.useState)([]),[Y,W]=(0,t.useState)({}),[N,V]=(0,t.useState)(()=>ah(a.sides,t=>kl(w.current[t.key]))),[z,H]=(0,t.useState)({state:"idle",message:""}),G=(t=>sh("printblob.designer.views",t.views,t))(a),[U,q]=(0,t.useState)(null),K=G.find(t=>t.key===U)?.Component??null,J=G.find(t=>t.initial)?.key??null,Q=(0,t.useRef)(!1),Z=(t=>sh("printblob.designer.tools",t.tools,t))(a),[tt,et]=(0,t.useState)(null),it=Z.find(t=>t.key===tt)?.Panel??null,rt=a.colors.find(t=>t.slug===D)?.hex??"#FFFFFF",st=p[O],nt=a.sides[0],ot=d[O],at=a.sizes.length>0,lt=nh(a.attributes.size),ht={[nh(a.attributes.color)]:D,[lt]:at&&!j?null:j,...A},ct=a.variations.length?((t,e)=>t.find(t=>!Object.values(e).includes(null)&&oh(t,e)))(a.variations,ht):null,ut=t=>!a.variations.length||((t,e)=>t.some(t=>t.inStock&&oh(t,e)))(a.variations,{...ht,...t}),dt=ct?ct.price:a.basePrice,gt=dt+a.sides.filter(t=>N[t.key]).reduce((t,e)=>t+e.price,0),ft=()=>X(b.current?[...b.current.getObjects()]:[]),pt=(0,t.useCallback)(t=>W(e=>({...e,...Object.fromEntries(t.map(t=>[t,(e[t]??0)+1]))})),[]),mt=(0,t.useMemo)(()=>a.sides.reduce((t,e)=>e.stage.height/e.stage.width>t.stage.height/t.stage.width?e:t),[a.sides]),yt=(0,t.useCallback)((t,e)=>$l(w.current[t],p[t],e),[p]),bt=(0,t.useCallback)(()=>{const t=b.current;t&&(w.current={...w.current,[O]:Ol(t)},V(t=>({...t,[O]:kl(w.current[O])})),pt([O]),Jl(a.productId,{sides:w.current,color:D,size:j,options:A}))},[O,D,j,A,a.productId,pt]);(0,t.useEffect)(()=>{let t,e=!1;return(async()=>{a.fonts.forEach(t=>{const e={weight:t.weight||"400",style:t.style||"normal",display:"block"};t.unicodeRange&&(e.unicodeRange=t.unicodeRange);const i=new FontFace(`PrintBlob ${t.family}`,`url(${t.url}) format("${function(t){const e=new URL(t,window.location.href).pathname.split(".").pop()?.toLowerCase()??"";return ol[e]??"woff2"}(t.url)}")`,e);document.fonts.add(i),ll.set(t.family,[...ll.get(t.family)??[],i])});const i=[nl(a.fonts)[0]?.family,...cl(a.initialText?{}:w.current)].filter(t=>Boolean(t));if(await Promise.all([hl(i),...Object.values(d).map(t=>t.ready)]),!e&&y.current){if(t=function(t,e){const i=new po(t,{width:e.stage.width,height:e.stage.height,preserveObjectStacking:!0,selectionColor:"rgba(38, 69, 214, 0.08)",selectionBorderColor:gl,controlsAboveOverlay:!0});return i.clipPath=_l(e.area),i.setDimensions({width:"100%",height:"auto"},{cssOnly:!0}),i}(y.current,nt),b.current=t,a.initialColor){const t=new URL(window.location.href);t.searchParams.delete("color"),window.history.replaceState(null,"",t)}if(a.initialText){w.current=C(),V(ah(a.sides,()=>!1));const t=new URL(window.location.href);t.searchParams.delete("text"),window.history.replaceState(null,"",t)}await Dl(t,w.current[nt.key],nt),a.initialText&&(Cl(t,a.initialText,nt.area,{family:nl(a.fonts)[0]?.family}),w.current={...w.current,[nt.key]:Ol(t)},Jl(a.productId,{...Kl(a.productId),sides:w.current}),V(t=>({...t,[nt.key]:!0})),pt([nt.key]),B(t.getActiveObject()??null)),ft(),T(!0)}})(),()=>{e=!0,t?.dispose(),b.current=null}},[]),(0,t.useEffect)(()=>{const t=b.current;if(!S||!t)return;const e=()=>{const e=t.getActiveObject()??null;B(e),e&&et(null)},i=()=>{_.current||(bt(),ft())};return t.on("selection:created",e),t.on("selection:updated",e),t.on("selection:cleared",e),t.on("object:modified",i),t.on("object:added",i),t.on("object:removed",i),t.on("text:changed",i),()=>{t.off("selection:created",e),t.off("selection:updated",e),t.off("selection:cleared",e),t.off("object:modified",i),t.off("object:added",i),t.off("object:removed",i),t.off("text:changed",i)}},[S,bt]),(0,t.useEffect)(()=>{Jl(a.productId,{sides:w.current,color:D,size:j,options:A})},[D,j,A,a.productId]),(0,t.useEffect)(()=>{S&&J&&!Q.current&&(Q.current=!0,q(J))},[S,J]);const _t=function(t){const[e,i,r]=eh(t).map(t=>t<=.03928?t/12.92:((t+.055)/1.055)**2.4);return.2126*e+.7152*i+.0722*r<.25}(rt),vt=_t?dl:ul;function xt(t){const e=b.current;var i;R&&e&&((i=R)instanceof aa&&i.isEditing&&i.exitEditing(),t(e,R))}function Ct(t){xt((e,i)=>{i.set(t),i.setCoords(),e.requestRenderAll(),bt(),ft()})}(0,t.useEffect)(()=>{const t=g.current;if(!S||!t)return;const e=ot.render(rt);t.width=e.width,t.height=e.height,t.getContext("2d")?.drawImage(e,0,0)},[S,rt,ot,O]),(0,t.useEffect)(()=>{const t=b.current;S&&t&&(t.getObjects().forEach(t=>t.printblobAutoInk&&t.set({fill:vt})),t.requestRenderAll(),w.current=Object.fromEntries(Object.entries(w.current).map(([e,i])=>[e,e===O?Ol(t):Ml(i,vt)])),pt(Object.keys(w.current)),ft())},[vt,S]),function(e,i){(0,t.useEffect)(()=>{const t=t=>{const r=e.current,s=r?.getActiveObject();if(!r||!s||(n=s)instanceof aa&&n.isEditing||t.target instanceof HTMLElement&&/^(INPUT|TEXTAREA|SELECT)$/.test(t.target.tagName))return;var n;const o=t.shiftKey?10:2,a={ArrowLeft:[-o,0],ArrowRight:[o,0],ArrowUp:[0,-o],ArrowDown:[0,o]}[t.key];a?(t.preventDefault(),s.set({left:s.left+a[0],top:s.top+a[1]}),s.setCoords(),r.requestRenderAll(),i()):"Delete"!==t.key&&"Backspace"!==t.key||(t.preventDefault(),Tl(r,s))};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,i])}(b,bt);const wt="busy"===z.state;return(0,o.jsxs)("div",{className:"printblob-designer__layout",children:[(0,o.jsxs)("div",{className:"printblob-designer__stage-column",children:[(0,o.jsxs)("div",{className:"printblob-designer__views",children:[a.sides.length>1&&(0,o.jsx)("div",{className:"printblob-designer__sides",role:"tablist","aria-label":(0,e.__)("Printed side","printblob"),children:a.sides.map(t=>(0,o.jsxs)("button",{type:"button",role:"tab","aria-selected":O===t.key,className:"printblob-designer__side",onClick:()=>async function(t){const e=b.current;if(t!==O&&e){w.current={...w.current,[O]:Ol(e)},_.current=!0;try{await Dl(e,w.current[t],p[t])}finally{_.current=!1}B(null),k(t),ft()}}(t.key),disabled:!S||wt,children:[t.label,(0,o.jsx)("span",{className:N[t.key]?"printblob-designer__side-dot is-shown":"printblob-designer__side-dot","aria-label":N[t.key]?(0,e.__)("has a print","printblob"):void 0})]},t.key))}),G.map(t=>(0,o.jsx)("button",{type:"button",className:`printblob-designer__side printblob-designer__side--view printblob-designer__side--${t.key}`,"aria-pressed":U===t.key,onClick:()=>q(e=>e===t.key?null:t.key),disabled:!S||wt,children:t.label},t.key)),a.proChip&&(0,o.jsx)("a",{className:"printblob-designer__pro-chip",href:a.proChip.href,title:a.proChip.title,target:"_blank",rel:"noopener",children:a.proChip.label})]}),(0,o.jsxs)("div",{className:"printblob-designer__stage",style:{aspectRatio:`${mt.stage.width} / ${mt.stage.height}`},children:[(0,o.jsxs)("div",{className:"printblob-designer__frame",style:{aspectRatio:`${st.stage.width} / ${st.stage.height}`},children:[(0,o.jsx)("canvas",{ref:g,className:"printblob-designer__shirt","aria-hidden":"true"}),(0,o.jsx)("div",{className:_t?"printblob-designer__area is-on-dark":"printblob-designer__area","aria-hidden":"true",style:{left:st.area.left/st.stage.width*100+"%",top:st.area.top/st.stage.height*100+"%",width:st.area.width/st.stage.width*100+"%",height:st.area.height/st.stage.height*100+"%"}},O),(0,o.jsx)("div",{className:"printblob-designer__canvas",children:(0,o.jsx)("canvas",{ref:y,"aria-label":(0,e.__)("Design area. Drag to move, use the corner handles to resize or rotate.","printblob")})})]}),!S&&(0,o.jsx)("p",{className:"printblob-designer__stage-loading",children:(0,e.__)("Loading the designer…","printblob")}),K&&S&&(0,o.jsx)(K,{config:a,mockups:d,colorHex:rt,side:O,renderSide:yt,revisions:Y})]}),(0,o.jsx)("p",{className:"printblob-designer__hint",children:(0,e.sprintf)(/* translators: 1: print area width in cm, 2: print area height in cm. */ /* translators: 1: print area width in cm, 2: print area height in cm. */
    1111(0,e.__)("Print area %1$d × %2$d cm. Anything outside the dashed line is not printed.","printblob"),st.printCm.width,st.printCm.height)})]}),(0,o.jsxs)("div",{className:"printblob-designer__panel",children:[(0,o.jsx)("h1",{className:"printblob-designer__title",children:a.productName}),(0,o.jsx)("p",{className:"printblob-designer__price",children:i(gt,a.currency)}),(0,o.jsxs)("section",{className:"printblob-designer__section","aria-labelledby":"printblob-print-heading",children:[(0,o.jsx)("h2",{id:"printblob-print-heading",children:(0,e.__)("Your print","printblob")}),(0,o.jsxs)("div",{className:"printblob-designer__tools",children:[(0,o.jsx)("button",{type:"button",className:"printblob-button",onClick:()=>{q(null),x.current?.click()},disabled:!S||wt,children:(0,e.__)("Upload image","printblob")}),(0,o.jsx)("button",{type:"button",className:"printblob-button printblob-button--quiet",onClick:()=>{q(null),b.current&&Sl(b.current,Cl(b.current,(0,e.__)("Your text","printblob"),st.area,{color:vt,family:f[0]?.family}))},disabled:!S||wt,children:(0,e.__)("Add text","printblob")}),Z.map(t=>(0,o.jsx)("button",{type:"button",className:"printblob-button printblob-button--quiet","aria-expanded":tt===t.key,"aria-controls":`printblob-tool-${t.key}`,onClick:()=>et(tt===t.key?null:t.key),disabled:!S||wt,children:t.label},t.key)),(0,o.jsx)("input",{ref:x,type:"file",accept:Vl.join(","),onChange:async function(t){const e=t.target.files?.[0];t.target.value="",e&&(Vl.includes(e.type)?e.size>a.maxUploadBytes?H({state:"error",message:s(a.maxUploadBytes)}):(H({state:"idle",message:""}),b.current&&await xl(b.current,await function(t){return new Promise((e,i)=>{const r=new FileReader;r.onload=()=>"string"==typeof r.result?e(r.result):i(new Error("The image could not be read.")),r.onerror=()=>i(r.error),r.readAsDataURL(t)})}(e),st.area)):H({state:"error",message:r().imageType}))},hidden:!0})]}),(0,o.jsx)(Wl,{selected:R,items:$,tool:it&&S?(0,o.jsx)("div",{className:"printblob-designer__tool printblob-stack__fill is-shown",id:`printblob-tool-${tt}`,children:(0,o.jsx)(it,{config:a,addImage:async function(t,{vector:e=!1}={}){if(q(null),H({state:"idle",message:""}),b.current)return xl(b.current,t,st.area,{vector:e})},close:()=>et(null)})}):null,printFonts:f,dpi:R?jl(R,st):null,onChoose:function(t){const e=b.current;e&&(wl(t)?Sl(e,t):(e.setActiveObject(t),e.requestRenderAll()),B(t),et(null))},onDone:function(){const t=b.current;t?.discardActiveObject(),t?.requestRenderAll(),B(null)},onChange:Ct,onCentre:()=>Ct({left:vl(st.area).x}),onLayer:function(t){xt((e,i)=>{"up"===t?e.bringObjectForward(i):e.sendObjectBackwards(i),e.requestRenderAll(),bt(),ft()})},onRemove:()=>xt(Tl)})]}),a.colors.length>0&&(0,o.jsxs)("fieldset",{className:"printblob-designer__section",children:[(0,o.jsxs)("legend",{children:[(0,e.__)("Colour","printblob"),(0,o.jsx)(h,{names:a.colors.map(t=>t.name),chosen:a.colors.find(t=>t.slug===D)?.name??""})]}),(0,o.jsx)("div",{className:"printblob-swatches printblob-swatches--shirt",children:a.colors.map(t=>(0,o.jsx)("button",{type:"button",className:"printblob-swatch",style:pl(t.hex),"aria-label":t.name,"aria-pressed":D===t.slug,onClick:()=>M(t.slug),disabled:wt},t.slug))})]}),at&&(0,o.jsx)(c,{label:(0,e.__)("Size","printblob"),choices:a.sizes.map(t=>({key:t.slug,name:t.name,pressed:j===t.slug,disabled:!ut({[lt]:t.slug})||wt,onSelect:()=>E(t.slug)}))}),P.map(t=>(0,o.jsx)(c,{label:t.label,chosen:t.choices.find(e=>e.value===A[t.field])?.name??"",choices:t.choices.map(e=>({key:e.value,name:e.name,pressed:A[t.field]===e.value,disabled:!ut({[t.field]:e.value})||wt,onSelect:()=>F(i=>({...i,[t.field]:e.value}))}))},t.field)),(0,o.jsx)(l,{quantity:L,onQuantity:I,currency:a.currency,shirtPrice:dt,sides:a.sides,printed:N,unitPrice:gt,status:z,disabled:!S||wt,cartUrl:a.endpoints.cart,maxUploadBytes:a.maxUploadBytes,onAddToCart:async function(){const t=b.current;if(!t||v.current)return;w.current={...w.current,[O]:Ol(t)};const e=function(t,e){return t.sides.flatMap(t=>{const i=e[t.key];return i&&kl(i)?[{side:t,json:i}]:[]})}(a,w.current);if(!e.length)return void H({state:"error",message:r().nothingPrinted});if(at&&!j)return void H({state:"error",message:r().chooseSize});if(a.variations.length&&(!ct||!ct.inStock))return void H({state:"error",message:P.length?r().soldOutCombination:r().soldOut});v.current=!0;const[i,s,o]=n();try{H({state:"busy",message:i}),await Hl();const t={color:D,size:j,options:A},n=await async function(t,e,i,r,s){const n=new FormData;n.append("product_id",String(t.productId)),n.append("design",JSON.stringify({color:r.color,size:r.size,options:r.options,sides:Pl(e)}));for(const{side:e,json:r}of i){const i=await Xl(r,e,s(e));n.append(`${e.key}_print`,i.print,`${e.key}-print.png`),n.append(`${e.key}_preview`,i.preview,`${e.key}-preview.png`),t.sendUploads&&Al(r).forEach((t,i)=>{const r=zl(t);var s;n.append(`${e.key}_upload_${i}`,r,`${e.key}-upload-${i}.${s=r.type,Nl[s]??"png"}`)}),await Hl()}return n}(a,w.current,e,t,t=>d[t.key].render(rt));H({state:"busy",message:s});const l=await u.saveDesign(n);H({state:"busy",message:o}),await u.addToCart({id:ct?ct.id:a.productId,productId:a.productId,quantity:L,variation:Gl(a,t),design:l.token}),H({state:"added",message:r().added})}catch(t){H({state:"error",message:t instanceof Error?t.message:String(t)})}finally{v.current=!1}}})]})]})}document.querySelectorAll(".printblob-designer[data-printblob-config]").forEach(e=>{!function(e,i){e.classList.add("printblob-designer");const r=(0,t.createRoot)(e);(0,t.flushSync)(()=>r.render((0,t.createElement)(lh,{config:i})))}(e,JSON.parse(e.dataset.printblobConfig??""))})})();
  • printblob/trunk/changelog.txt

    r3750583 r3751408  
    22
    33The current and previous minor versions are in readme.txt.
     4
     5= 1.1.2 =
     6* In themes with a dark mode, the designer's Front and Back switch, its 3D button and its quieter buttons follow the dark colours: they stayed light, with light text that could not be read.
     7
     8= 1.1.1 =
     9* Saving designs is limited per shopper and per IP (30 and 300 an hour; filter `printblob_design_save_limits`), since every save stores files on the shop's server.
     10* A design preview larger than a browser makes is refused before it is processed.
     11* A design that fails part-way through saving leaves no files behind.
     12* Unordered designs are cleaned up twice a day, in batches until none are left, instead of 200 a day.
     13* Site Health checks that print files cannot be downloaded from the web, and gives the nginx rule when they can.
     14* Designs are part of WordPress's Export and Erase Personal Data tools (ordered designs follow WooCommerce's setting for order data), are deleted with their order, and the privacy policy guide says what is stored.
     15* The 3D button is shown only where the browser draws 3D on a graphics processor; where it would draw it in software and stutter, the designer works without it.
     16* Copyright: microcompanies, LLC.
     17
     18= 1.1.0 =
     19* New: a 3D view in the designer. The 3D button turns the product into a garment on a hanger, made from the mockup's front and back photos, with the customer's design printed on each side; drag to turn it, or use Front and Back. Its code loads only when it is opened. It can be turned off under WooCommerce › Settings › PrintBlob.
     20* The bundled t-shirt mockup has its own photo of the back (until now the front photo was used for both sides). Shops still using the bundled photos get it automatically; photos a shop uploaded are never changed.
     21* Mockups can record where the garment is open (sleeve ends, hem, neck) for the 3D view; the bundled t-shirt comes with them.
     22
     23Older entries are in changelog.txt.
    424
    525= 1.0.3 =
  • printblob/trunk/includes/class-cart.php

    r3750583 r3751408  
    6060        }
    6161
    62         /** @return array<string, array{preview_id:int, print_path:string, uploads?:string[]}> */
     62        /**
     63         * The printed sides of a cart item's design that its product offers now: a side the shop no longer offers (the
     64         * back once PrintBlob Pro is gone) is neither charged nor ordered.
     65         *
     66         * @return array<string, array{preview_id:int, print_path:string, uploads?:string[]}>
     67         */
    6368        public static function design_sides( array $cart_item ): array {
    64                 if ( empty( $cart_item[ self::ITEM_KEY ] ) ) {
     69                if ( empty( $cart_item[ self::ITEM_KEY ] ) || ! ( ( $cart_item['data'] ?? null ) instanceof \WC_Product ) ) {
    6570                        return array();
    6671                }
    6772                $design = Design_Store::find_by_token( (string) $cart_item[ self::ITEM_KEY ] );
    68                 return $design ? Design_Store::sides( $design->ID ) : array();
     73                return $design ? array_intersect_key( Design_Store::sides( $design->ID ), Mockups::sides_for( $cart_item['data'] ) ) : array();
    6974        }
    7075
  • printblob/trunk/includes/class-design-store.php

    r3750583 r3751408  
    543543        public static function mark_ordered( int $design_id, int $order_id ): void {
    544544                update_post_meta( $design_id, self::META_ORDER, $order_id );
     545        }
     546
     547        /**
     548         * Every order with a design, newest (highest ID) first.
     549         *
     550         * @return int[] Order IDs.
     551         */
     552        public static function order_ids(): array {
     553                global $wpdb;
     554                $ids = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT CAST(meta_value AS UNSIGNED) AS order_id FROM {$wpdb->postmeta} WHERE meta_key = %s ORDER BY order_id DESC", self::META_ORDER ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- The distinct orders the designs are saved with: no WordPress API lists distinct meta values, and the answer changes with every order.
     555                return array_values( array_filter( array_map( 'intval', $ids ) ) );
     556        }
     557
     558        /**
     559         * The orders with a design among WooCommerce orders matching a query.
     560         *
     561         * @param array $query wc_get_orders() arguments (status, date_created).
     562         * @return int[] Order IDs, newest first.
     563         */
     564        public static function orders_where( array $query ): array {
     565                $matching = wc_get_orders(
     566                        array(
     567                                'return' => 'ids',
     568                                'limit'  => -1,
     569                        ) + $query
     570                );
     571                return array_values( array_intersect( self::order_ids(), array_map( 'intval', (array) $matching ) ) );
     572        }
     573
     574        /**
     575         * Each designed item of an order and its print files: [ item ID => [ design ID, sides ] ].
     576         *
     577         * @return array<int, array{design:int, sides:array}>
     578         */
     579        public static function order_designs( \WC_Order $order ): array {
     580                $designs = array();
     581                foreach ( $order->get_items() as $item_id => $item ) {
     582                        $design = $item instanceof \WC_Order_Item_Product ? Order::design_for_item( $item ) : null;
     583                        if ( $design ) {
     584                                $designs[ (int) $item_id ] = array(
     585                                        'design' => $design->ID,
     586                                        'sides'  => self::sides( $design->ID ),
     587                                );
     588                        }
     589                }
     590                return $designs;
     591        }
     592
     593        /** How many print files an order has: one per printed side of each designed item. */
     594        public static function print_file_count( \WC_Order $order ): int {
     595                return array_sum( array_map( static fn( array $design ): int => count( $design['sides'] ), self::order_designs( $order ) ) );
    545596        }
    546597
  • printblob/trunk/includes/class-designer-data.php

    r3750583 r3751408  
    33 * The designer's data, written once in assets/ and read by its TypeScript and every host too: its fixed numbers
    44 * (designer.json: stage width, print DPI, a new side's area and print size, the editors' limits) and the bundled
    5  * t-shirt (mockups/tee.json).
     5 * t-shirt (mockups/tee.json) with its colours, sizes and starting prices (mockups/shirt.json).
    66 *
    77 * @package PrintBlob
    … …  
    2525        }
    2626
     27        /** @return array{colours:array<int, array{slug:string, name:string, hex:string}>, sizes:string[], price:string, print_price:string} */
     28        public static function shirt(): array {
     29                return self::read( 'mockups/shirt.json' );
     30        }
     31
    2732        /** A printed length in centimetres as pixels of the print file. */
    2833        public static function print_pixels( float $cm ): int {
  • printblob/trunk/includes/class-mockups.php

    r3750583 r3751408  
    33 * Mockups: the product photos customers design on.
    44 *
    5  * A mockup is a post (Products › Mockups) with a photo for each printable side, the print area drawn on
    6  * that photo, and the real print size in centimetres. Products with the designer on pick a mockup; the
    7  * designer, the print files and the cart previews all follow it.
     5 * A mockup is a post with a photo for each printable side, the print area drawn on that photo, and the real
     6 * print size in centimetres. Products with the designer on pick a mockup; the designer, the print files and the
     7 * cart previews all follow it. This plugin installs the bundled t-shirt and shows the shop's mockups under
     8 * PrintBlob › Mockups; making and editing mockups is PrintBlob Pro's (its mockup editor turns on the post type's
     9 * screens through `register_post_type_args`).
    810 *
    911 * Print areas are stored as fractions of the photo (0–1), so any photo size works. The designer works on
    … …  
    2325        public const PRODUCT_META   = '_printblob_mockup';
    2426        public const DEFAULT_OPTION = 'printblob_default_mockup';
     27        public const PAGE           = 'printblob-mockups';
     28        public const STYLE          = 'printblob-mockups';
    2529
    2630        /** Revision of the bundled photos the default mockup has been upgraded to (see use_bundled_photos()). */
    2731        private const BUNDLED_REVISION = 'webp-back-3d';
     32
     33        /** @var string The hook name of this plugin's Mockups screen, once the PrintBlob menu has it. */
     34        private static $page = '';
    2835
    2936        /**
    … …  
    3441        public static function sides(): array {
    3542                /**
    36                  * Filters the printable sides of products. Add-ons can add sides (e.g. sleeves); each side gets its
    37                  * own photo, print area, print size and price.
     43                 * Filters the printable sides of products. PrintBlob prints the front; add-ons add sides (PrintBlob Pro the
     44                 * back and the sleeves), each with its own photo, print area, print size and price.
    3845                 *
    3946                 * @param string[] $sides Side keys in display order.
    4047                 */
    41                 $sides = (array) apply_filters( 'printblob_sides', array( 'front', 'back' ) );
     48                $sides = (array) apply_filters( 'printblob_sides', Designer_Data::numbers()['sides'] );
    4249                return array_values( array_unique( array_map( 'sanitize_key', $sides ) ) );
    4350        }
    … …  
    4754                add_action( 'admin_init', array( __CLASS__, 'ensure_default' ) );
    4855                add_action( 'admin_init', array( __CLASS__, 'upgrade_bundled_photo' ) );
    49                 add_action( 'add_meta_boxes_' . self::POST_TYPE, array( __CLASS__, 'add_meta_box' ) );
    50                 add_action( 'save_post_' . self::POST_TYPE, array( __CLASS__, 'save' ) );
     56                add_action( 'printblob_admin_menu', array( __CLASS__, 'add_menu' ) );
    5157                add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_admin' ) );
    52                 add_filter( 'manage_' . self::POST_TYPE . '_posts_columns', array( __CLASS__, 'columns' ) );
    53                 add_action( 'manage_' . self::POST_TYPE . '_posts_custom_column', array( __CLASS__, 'render_column' ), 10, 2 );
    5458        }
    5559
    … …  
    7175                                ),
    7276                                'public'          => false,
    73                                 'show_ui'         => true,
    74                                 'show_in_menu'    => 'edit.php?post_type=product',
     77                                'show_ui'         => false,
     78                                'show_in_menu'    => false,
    7579                                'supports'        => array( 'title' ),
    7680                                'capability_type' => 'product',
    … …  
    218222        }
    219223
     224        /** The photo a mockup has for a side, whether or not this site prints that side: its attachment ID, or 0. */
     225        public static function photo( int $mockup_id, string $side ): int {
     226                $stored = get_post_meta( $mockup_id, self::META, true );
     227                return is_array( $stored ) ? (int) ( $stored['sides'][ $side ]['image'] ?? 0 ) : 0;
     228        }
     229
    220230        /** Kept for setup scripts written for 1.0.2: the same upgrade as use_bundled_photos(). */
    221231        public static function use_bundled_webp(): void {
    … …  
    353363        /* ---------------------------------------------------------------- Admin */
    354364
    355         public static function enqueue_admin(): void {
    356                 $screen = get_current_screen();
    357                 if ( ! $screen || self::POST_TYPE !== $screen->post_type || 'post' !== $screen->base ) {
     365        /** The PrintBlob menu's Mockups entry: the list PrintBlob Pro's editor opens, else this plugin's own screen. */
     366        public static function add_menu( string $menu ): void {
     367                $type = get_post_type_object( self::POST_TYPE );
     368                if ( $type && $type->show_ui ) {
     369                        $list = 'edit.php?post_type=' . self::POST_TYPE;
     370                        add_submenu_page( $menu, $type->labels->name, $type->labels->menu_name, $type->cap->edit_posts, $list );
     371                        add_filter(
     372                                'parent_file',
     373                                static function ( $file ) use ( $list, $menu ) {
     374                                        return $list === $file ? $menu : $file;
     375                                }
     376                        );
    358377                        return;
    359378                }
    360                 wp_enqueue_media();
    361                 wp_enqueue_style( 'printblob-mockup-editor', plugins_url( 'assets/admin/mockup-editor.css', FILE ), array(), VERSION );
    362                 $asset = include dirname( FILE ) . '/build/admin/mockup-editor.asset.php';
    363                 wp_enqueue_script( 'printblob-mockup-editor', plugins_url( 'build/admin/mockup-editor.js', FILE ), array_merge( $asset['dependencies'], array( 'media-editor' ) ), $asset['version'], true );
    364                 wp_localize_script(
    365                         'printblob-mockup-editor',
    366                         'printblobMockupEditor',
    367                         array(
    368                                 'title'  => __( 'Photo for this side', 'printblob' ),
    369                                 'button' => __( 'Use this photo', 'printblob' ),
    370                         )
    371                 );
    372         }
    373 
    374         public static function add_meta_box(): void {
    375                 add_meta_box( 'printblob-mockup', __( 'Printable sides', 'printblob' ), array( __CLASS__, 'render_meta_box' ), self::POST_TYPE, 'normal', 'high' );
    376         }
    377 
    378         public static function render_meta_box( \WP_Post $post ): void {
    379                 wp_nonce_field( 'printblob_mockup', 'printblob_mockup_nonce' );
    380                 $data = self::data( $post->ID );
     379                $page       = add_submenu_page( $menu, __( 'Mockups', 'printblob' ), __( 'Mockups', 'printblob' ), 'edit_products', self::PAGE, array( __CLASS__, 'render_page' ) );
     380                self::$page = $page ? $page : '';
     381        }
     382
     383        /** Where the shop's mockups are shown: PrintBlob Pro's list, else this plugin's Mockups screen. */
     384        public static function screen_url(): string {
     385                $type = get_post_type_object( self::POST_TYPE );
     386                return admin_url( $type && $type->show_ui ? 'edit.php?post_type=' . self::POST_TYPE : 'admin.php?page=' . self::PAGE );
     387        }
     388
     389        public static function enqueue_admin( string $hook ): void {
     390                wp_register_style( self::STYLE, plugins_url( 'assets/admin/mockups.css', FILE ), array(), VERSION );
     391                if ( '' !== self::$page && self::$page === $hook ) {
     392                        wp_enqueue_style( self::STYLE );
     393                }
     394        }
     395
     396        /** A print size as shop managers read it, e.g. "28 × 36 cm". */
     397        public static function print_size( array $print_cm ): string {
     398                /* translators: 1: width in cm, 2: height in cm. */
     399                return sprintf( __( '%1$s × %2$s cm', 'printblob' ), wc_format_localized_decimal( (string) $print_cm['w'] ), wc_format_localized_decimal( (string) $print_cm['h'] ) );
     400        }
     401
     402        public static function render_page(): void {
    381403                ?>
    382                 <p class="description"><?php esc_html_e( 'Upload a photo of the blank product for each side, then drag the blue box over the area that can be printed. Use the corner to resize it. A product on a transparent or plain white background works best.', 'printblob' ); ?></p>
    383                 <p>
    384                         <label>
    385                                 <input type="checkbox" name="printblob_mockup[recolor]" value="1" <?php checked( $data['recolor'] ); ?> />
    386                                 <?php esc_html_e( 'Recolour the photo to the colour the customer picks (for a white or light grey product photo)', 'printblob' ); ?>
    387                         </label>
    388                 </p>
    389                 <div class="printblob-mockup-sides">
    390                         <?php foreach ( $data['sides'] as $key => $side ) : ?>
    391                                 <?php $field = 'printblob_mockup[sides][' . $key . ']'; ?>
    392                                 <fieldset class="printblob-mockup-side" data-printblob-side>
    393                                         <legend><?php echo esc_html( self::side_label( $key ) ); ?></legend>
    394                                         <p>
    395                                                 <label>
    396                                                         <input type="checkbox" name="<?php echo esc_attr( $field ); ?>[enabled]" value="1" <?php checked( $side['enabled'] ); ?> />
    397                                                         <?php esc_html_e( 'Customers can print on this side', 'printblob' ); ?>
    398                                                 </label>
    399                                         </p>
    400                                         <input type="hidden" name="<?php echo esc_attr( $field ); ?>[image]" value="<?php echo esc_attr( (string) $side['image'] ); ?>" data-printblob-image-id />
    401                                         <?php foreach ( array( 'x', 'y', 'w', 'h' ) as $axis ) : ?>
    402                                                 <input type="hidden" name="<?php echo esc_attr( $field ); ?>[area][<?php echo esc_attr( $axis ); ?>]" value="<?php echo esc_attr( (string) $side['area'][ $axis ] ); ?>" data-printblob-area="<?php echo esc_attr( $axis ); ?>" />
     404                <div class="wrap printblob-mockups">
     405                        <h1><?php esc_html_e( 'Mockups', 'printblob' ); ?></h1>
     406                        <p><?php esc_html_e( 'The product photos customers design on, with the print area of each side and its print size. Choose a product’s mockup on its PrintBlob tab.', 'printblob' ); ?></p>
     407                        <div class="printblob-mockups__pro">
     408                                <h2><?php esc_html_e( 'Your own products — mugs, hoodies, bags, your own photos — with the PrintBlob Pro add-on', 'printblob' ); ?></h2>
     409                                <p><?php esc_html_e( 'PrintBlob Pro adds the mockup editor: a photo of your product for each side, the print area drawn on the photo, and the real print size in centimetres.', 'printblob' ); ?></p>
     410                                <p><a class="button button-primary" href="<?php echo esc_url( Pro::checkout_url( 'mockups' ) ); ?>" target="_blank" rel="noopener"><?php esc_html_e( 'Get PrintBlob Pro', 'printblob' ); ?></a></p>
     411                        </div>
     412                        <?php foreach ( self::choices() as $id => $title ) : ?>
     413                                <?php $data = self::data( (int) $id ); ?>
     414                                <h2><?php echo esc_html( $title ); ?></h2>
     415                                <?php if ( $data['recolor'] ) : ?>
     416                                        <p class="description"><?php esc_html_e( 'Recoloured to the colour the customer picks.', 'printblob' ); ?></p>
     417                                <?php endif; ?>
     418                                <div class="printblob-mockup-sides">
     419                                        <?php foreach ( $data['sides'] as $key => $side ) : ?>
     420                                                <?php
     421                                                if ( ! $side['enabled'] || ! $side['image'] ) {
     422                                                        continue;
     423                                                }
     424                                                ?>
     425                                                <figure class="printblob-mockup-side">
     426                                                        <div class="printblob-mockup-stage">
     427                                                                <img src="<?php echo esc_url( (string) wp_get_attachment_image_url( $side['image'], 'large' ) ); ?>" alt="" />
     428                                                                <svg class="printblob-mockup-stage__area" viewBox="0 0 1 1" preserveAspectRatio="none" aria-hidden="true" focusable="false"><rect x="<?php echo esc_attr( (string) $side['area']['x'] ); ?>" y="<?php echo esc_attr( (string) $side['area']['y'] ); ?>" width="<?php echo esc_attr( (string) $side['area']['w'] ); ?>" height="<?php echo esc_attr( (string) $side['area']['h'] ); ?>" vector-effect="non-scaling-stroke" /></svg>
     429                                                        </div>
     430                                                        <figcaption><strong><?php echo esc_html( self::side_label( $key ) ); ?></strong> <?php echo esc_html( self::print_size( $side['print_cm'] ) ); ?></figcaption>
     431                                                </figure>
    403432                                        <?php endforeach; ?>
    404                                         <div class="printblob-mockup-stage" data-printblob-stage>
    405                                                 <?php if ( $side['image'] ) : ?>
    406                                                         <img src="<?php echo esc_url( (string) wp_get_attachment_image_url( $side['image'], 'large' ) ); ?>" alt="" data-printblob-photo />
    407                                                 <?php else : ?>
    408                                                         <img src="" alt="" data-printblob-photo hidden />
    409                                                 <?php endif; ?>
    410                                                 <div class="printblob-mockup-area" data-printblob-box<?php echo $side['image'] ? '' : ' hidden'; ?>>
    411                                                         <span class="printblob-mockup-area__handle" data-printblob-handle aria-hidden="true"></span>
    412                                                 </div>
    413                                         </div>
    414                                         <p><button type="button" class="button" data-printblob-choose><?php esc_html_e( 'Choose photo', 'printblob' ); ?></button></p>
    415                                         <p class="printblob-mockup-size">
    416                                                 <label><?php esc_html_e( 'Print width (cm)', 'printblob' ); ?> <input type="number" min="1" max="200" step="0.5" name="<?php echo esc_attr( $field ); ?>[print_cm][w]" value="<?php echo esc_attr( (string) $side['print_cm']['w'] ); ?>" /></label>
    417                                                 <label><?php esc_html_e( 'Print height (cm)', 'printblob' ); ?> <input type="number" min="1" max="200" step="0.5" name="<?php echo esc_attr( $field ); ?>[print_cm][h]" value="<?php echo esc_attr( (string) $side['print_cm']['h'] ); ?>" /></label>
    418                                         </p>
    419                                 </fieldset>
     433                                </div>
    420434                        <?php endforeach; ?>
    421435                </div>
    422436                <?php
    423437        }
    424 
    425         public static function save( int $post_id ): void {
    426                 if ( ! isset( $_POST['printblob_mockup_nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['printblob_mockup_nonce'] ) ), 'printblob_mockup' )
    427                         || ! current_user_can( 'edit_post', $post_id ) || wp_is_post_revision( $post_id ) ) {
    428                         return;
    429                 }
    430                 $input   = isset( $_POST['printblob_mockup'] ) && is_array( $_POST['printblob_mockup'] ) ? wp_unslash( $_POST['printblob_mockup'] ) : array(); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Each value is sanitised below.
    431                 $clamp   = static fn( $value, float $min, float $max ): float => max( $min, min( $max, (float) $value ) );
    432                 $numbers = Designer_Data::numbers();
    433                 $start   = $numbers['new_side'];
    434                 $data    = array(
    435                         'recolor' => ! empty( $input['recolor'] ),
    436                         'sides'   => array(),
    437                 );
    438                 foreach ( self::sides() as $key ) {
    439                         $side                  = $input['sides'][ $key ] ?? array();
    440                         $x                     = $clamp( $side['area']['x'] ?? $start['area']['x'], 0, $numbers['area_start_max'] );
    441                         $y                     = $clamp( $side['area']['y'] ?? $start['area']['y'], 0, $numbers['area_start_max'] );
    442                         $image                 = absint( $side['image'] ?? 0 );
    443                         $data['sides'][ $key ] = array(
    444                                 'enabled'  => ! empty( $side['enabled'] ),
    445                                 'image'    => $image && wp_attachment_is_image( $image ) ? $image : 0,
    446                                 'area'     => array(
    447                                         'x' => round( $x, 4 ),
    448                                         'y' => round( $y, 4 ),
    449                                         'w' => round( $clamp( $side['area']['w'] ?? $start['area']['w'], $numbers['area_min'], 1 - $x ), 4 ),
    450                                         'h' => round( $clamp( $side['area']['h'] ?? $start['area']['h'], $numbers['area_min'], 1 - $y ), 4 ),
    451                                 ),
    452                                 'print_cm' => array(
    453                                         'w' => $clamp( $side['print_cm']['w'] ?? $start['print_cm']['w'], $numbers['print_cm_range']['min'], $numbers['print_cm_range']['max'] ),
    454                                         'h' => $clamp( $side['print_cm']['h'] ?? $start['print_cm']['h'], $numbers['print_cm_range']['min'], $numbers['print_cm_range']['max'] ),
    455                                 ),
    456                         );
    457                 }
    458                 update_post_meta( $post_id, self::META, $data );
    459         }
    460 
    461         public static function columns( array $columns ): array {
    462                 return array_slice( $columns, 0, 2, true ) + array( 'printblob_sides' => __( 'Sides', 'printblob' ) ) + array_slice( $columns, 2, null, true );
    463         }
    464 
    465         public static function render_column( string $column, int $post_id ): void {
    466                 if ( 'printblob_sides' !== $column ) {
    467                         return;
    468                 }
    469                 $labels = array();
    470                 foreach ( self::data( $post_id )['sides'] as $key => $side ) {
    471                         if ( $side['enabled'] && $side['image'] ) {
    472                                 /* translators: 1: side name, 2: width in cm, 3: height in cm. */
    473                                 $labels[] = sprintf( __( '%1$s (%2$s × %3$s cm)', 'printblob' ), self::side_label( $key ), wc_format_localized_decimal( $side['print_cm']['w'] ), wc_format_localized_decimal( $side['print_cm']['h'] ) );
    474                         }
    475                 }
    476                 echo esc_html( $labels ? implode( ', ', $labels ) : __( 'No sides set up', 'printblob' ) );
    477         }
    478438}
  • printblob/trunk/includes/class-onboarding.php

    r3750583 r3751408  
    33 * First steps after activation: a dismissible notice with the three things to set up.
    44 *
    5  * Shown to shop managers on the Plugins screen and PrintBlob's own screens (its settings tab and the mockups) until
    6  * dismissed.
     5 * Shown to shop managers on the Plugins screen and PrintBlob's own screens until dismissed, and only while no product has
     6 * the designer on: a shop that has set one up never sees it again.
    77 *
    88 * @package PrintBlob
    … …  
    3131                        return;
    3232                }
     33                echo wp_kses( self::notice_html(), self::NOTICE_HTML );
     34        }
     35
     36        /** What notice_html() prints. */
     37        public const NOTICE_HTML = array(
     38                'div'    => array( 'class' => true ),
     39                'p'      => array(),
     40                'strong' => array(),
     41                'ol'     => array(),
     42                'li'     => array(),
     43                'a'      => array(
     44                        'href'   => true,
     45                        'class'  => true,
     46                        'target' => true,
     47                        'rel'    => true,
     48                ),
     49        );
     50
     51        /** The first steps, while no product has the designer on; empty once one has. */
     52        public static function notice_html(): string {
     53                if ( Product_Settings::designer_products( 1 )['total'] > 0 ) {
     54                        return '';
     55                }
    3356                $dismiss = wp_nonce_url( admin_url( 'admin-post.php?action=printblob_dismiss_welcome' ), 'printblob_dismiss_welcome' );
    3457                $steps   = array(
    3558                        sprintf(
    36                                 /* translators: %s: link to Products › Mockups. */
    37                                 __( 'Check the t-shirt mockup or add your own product photos and print areas under %s.', 'printblob' ),
    38                                 '<a href="' . esc_url( admin_url( 'edit.php?post_type=' . Mockups::POST_TYPE ) ) . '">' . esc_html__( 'Products › Mockups', 'printblob' ) . '</a>'
     59                                /* translators: %s: link to PrintBlob › Mockups. */
     60                                esc_html__( 'Check the bundled product mockup under %s.', 'printblob' ),
     61                                '<a href="' . esc_url( Mockups::screen_url() ) . '">' . esc_html__( 'PrintBlob › Mockups', 'printblob' ) . '</a>'
    3962                        ),
    4063                        sprintf(
    4164                                /* translators: %s: link to Products. */
    42                                 __( 'Edit a product, open its PrintBlob designer tab, turn the designer on and set the print price per side (%s).', 'printblob' ),
     65                                esc_html__( 'Edit a product, open its PrintBlob designer tab, turn the designer on and set the print price per side (%s).', 'printblob' ),
    4366                                '<a href="' . esc_url( admin_url( 'edit.php?post_type=product' ) ) . '">' . esc_html__( 'Products', 'printblob' ) . '</a>'
    4467                        ),
    45                         __( 'Add the PrintBlob designer block to a page, or open the product: the designer shows on its page.', 'printblob' ),
     68                        esc_html__( 'Add the PrintBlob designer block to a page, or open the product: the designer shows on its page.', 'printblob' ),
    4669                );
    47                 ?>
    48                 <div class="notice notice-info">
    49                         <p><strong><?php esc_html_e( 'PrintBlob is ready. Three steps to your first designable product:', 'printblob' ); ?></strong></p>
    50                         <ol>
    51                                 <?php foreach ( $steps as $step ) : ?>
    52                                         <li><?php echo wp_kses( $step, array( 'a' => array( 'href' => true ) ) ); ?></li>
    53                                 <?php endforeach; ?>
    54                         </ol>
    55                         <p>
    56                                 <a class="button button-primary" href="<?php echo esc_url( Settings::url() ); ?>"><?php esc_html_e( 'PrintBlob settings', 'printblob' ); ?></a>
    57                                 <a class="button" href="<?php echo esc_url( FACTS['docs'] ); ?>" target="_blank" rel="noopener"><?php esc_html_e( 'Documentation', 'printblob' ); ?></a>
    58                                 <a href="<?php echo esc_url( $dismiss ); ?>" style="margin-left:8px"><?php esc_html_e( 'Dismiss', 'printblob' ); ?></a>
    59                         </p>
    60                 </div>
    61                 <?php
     70                $items   = implode( '', array_map( static fn( string $step ): string => '<li>' . $step . '</li>', $steps ) );
     71                return sprintf(
     72                        '<div class="notice notice-info printblob-welcome"><p><strong>%1$s</strong></p><ol>%2$s</ol><p><a class="button button-primary" href="%3$s">%4$s</a> <a class="button" href="%5$s" target="_blank" rel="noopener">%6$s</a> <a href="%7$s">%8$s</a></p></div>',
     73                        esc_html__( 'PrintBlob is ready. Three steps to your first designable product:', 'printblob' ),
     74                        $items,
     75                        esc_url( Quick_Setup::url() ),
     76                        esc_html__( 'Quick setup: all three in one click', 'printblob' ),
     77                        esc_url( FACTS['docs'] ),
     78                        esc_html__( 'Documentation', 'printblob' ),
     79                        esc_url( $dismiss ),
     80                        esc_html__( 'Dismiss', 'printblob' )
     81                );
    6282        }
    6383
  • printblob/trunk/includes/class-order.php

    r3750583 r3751408  
    110110                if ( ! $offered ) {
    111111                        $offered = true;
    112                         echo wp_kses_post( self::pro_hint() );
     112                        $order   = $item->get_order();
     113                        echo wp_kses_post( self::pro_hint( $order instanceof \WC_Order ? Design_Store::print_file_count( $order ) : 0 ) );
    113114                }
    114115        }
    115116
    116117        /**
    117          * One quiet line under an order's first designed item about what PrintBlob Pro adds there, while Pro is not active
    118          * and until this admin dismisses it. No prices or trial lengths.
     118         * One quiet line under an order's first designed item about the PrintBlob Pro add-on's ZIP of its print files, while
     119         * Pro is not active and until this admin dismisses it.
    119120         *
     121         * @param int       $files      The order's print files.
    120122         * @param bool|null $pro_active Whether Pro is active; Settings::pro_active() when null.
    121123         * @param int|null  $user_id    The admin; the current user when null.
    122124         */
    123         public static function pro_hint( ?bool $pro_active = null, ?int $user_id = null ): string {
    124                 if ( ( $pro_active ?? Settings::pro_active() ) || get_user_meta( $user_id ?? get_current_user_id(), self::PRO_HINT_DISMISSED, true ) ) {
     125        public static function pro_hint( int $files, ?bool $pro_active = null, ?int $user_id = null ): string {
     126                if ( $files < 1 || ( $pro_active ?? Settings::pro_active() ) || get_user_meta( $user_id ?? get_current_user_id(), self::PRO_HINT_DISMISSED, true ) ) {
    125127                        return '';
    126128                }
    127129                return sprintf(
    128130                        '<p class="printblob-pro-hint description">%1$s <a href="%2$s" target="_blank" rel="noopener">%3$s</a> · <a href="%4$s">%5$s</a></p>',
    129                         esc_html__( 'Download all print files of an order as one ZIP, and work through a print queue, with PrintBlob Pro.', 'printblob' ),
    130                         esc_url( FACTS['pricing'] ),
    131                         esc_html__( 'About PrintBlob Pro', 'printblob' ),
     131                        /* translators: %d: number of print files of the order. */
     132                        esc_html( sprintf( _n( 'This order’s %d print file in one ZIP, with PrintBlob Pro.', 'This order’s %d print files in one ZIP, with PrintBlob Pro.', $files, 'printblob' ), $files ) ),
     133                        esc_url( Pro::checkout_url( 'order-zip' ) ),
     134                        esc_html__( 'About the PrintBlob Pro add-on', 'printblob' ),
    132135                        esc_url( wp_nonce_url( admin_url( 'admin-post.php?action=printblob_dismiss_pro_hint' ), 'printblob_dismiss_pro_hint' ) ),
    133136                        esc_html__( 'Dismiss', 'printblob' )
  • printblob/trunk/includes/class-product-settings.php

    r3750583 r3751408  
    2222                add_action( 'woocommerce_admin_process_product_object', array( __CLASS__, 'save' ) );
    2323                add_filter( 'single_template_hierarchy', array( __CLASS__, 'designer_template' ) );
     24                add_action( 'init', array( __CLASS__, 'register_designer_template' ) );
     25                add_action( 'woocommerce_before_single_product', array( __CLASS__, 'classic_designer' ) );
    2426                // A designed shirt always has a print: listed prices include the cheapest printed side.
    2527                foreach ( array( 'price', 'regular_price', 'sale_price' ) as $printblob_kind ) {
    … …  
    8991
    9092        /**
    91          * Designer products use the theme's `single-product-designer` template when it has one;
    92          * otherwise the normal product template is used.
     93         * Designer products use the `single-product-designer` template: the theme's own when it has one, otherwise the one
     94         * PrintBlob registers for block themes (register_designer_template()). Classic themes get the designer through
     95         * WooCommerce's product hooks (classic_designer()).
    9396         */
    9497        public static function designer_template( array $templates ): array {
    … …  
    98101                }
    99102                return $templates;
     103        }
     104
     105        /** The product page of a designer product in a block theme: the theme's header and footer around the designer. */
     106        public static function register_designer_template(): void {
     107                if ( ! function_exists( 'register_block_template' ) || ! wp_is_block_theme() ) {
     108                        return;
     109                }
     110                register_block_template(
     111                        'printblob//single-product-designer',
     112                        array(
     113                                'title'       => __( 'Product with the PrintBlob designer', 'printblob' ),
     114                                'description' => __( 'The page of a product with the PrintBlob designer turned on: customers design their print, choose colour and size, and add it to the cart.', 'printblob' ),
     115                                'content'     => '<!-- wp:template-part {"slug":"header","tagName":"header"} /-->'
     116                                        . '<!-- wp:group {"tagName":"main","align":"wide","layout":{"type":"constrained"}} --><main class="wp-block-group alignwide">'
     117                                        . '<!-- wp:printblob/designer {"align":"wide"} /-->'
     118                                        . '<!-- wp:woocommerce/product-details {"align":"wide"} /-->'
     119                                        . '</main><!-- /wp:group -->'
     120                                        . '<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->',
     121                        )
     122                );
     123        }
     124
     125        /**
     126         * The product page of a designer product in a classic theme: the designer, which shows the product's name, price and
     127         * cart button itself, in place of WooCommerce's photos and summary.
     128         */
     129        public static function classic_designer(): void {
     130                $product = wc_get_product( get_the_ID() );
     131                if ( wp_is_block_theme() || ! $product || ! self::is_enabled( $product ) ) {
     132                        return;
     133                }
     134                remove_action( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_sale_flash', 10 );
     135                remove_action( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 20 );
     136                remove_all_actions( 'woocommerce_single_product_summary' );
     137                add_action(
     138                        'woocommerce_before_single_product_summary',
     139                        static function () use ( $product ): void {
     140                                echo render_block( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- The designer block's own markup, escaped in its render.php.
     141                                        array(
     142                                                'blockName'    => 'printblob/designer',
     143                                                'attrs'        => array( 'productId' => $product->get_id() ),
     144                                                'innerBlocks'  => array(),
     145                                                'innerHTML'    => '',
     146                                                'innerContent' => array(),
     147                                        )
     148                                );
     149                        }
     150                );
     151        }
     152
     153        /**
     154         * Products with the designer on, in any status but the trash, last changed first.
     155         *
     156         * @param int $limit How many IDs to return.
     157         * @return array{ids:int[], total:int}
     158         */
     159        public static function designer_products( int $limit ): array {
     160                $query = new \WP_Query(
     161                        array(
     162                                'post_type'      => 'product',
     163                                'post_status'    => 'any',
     164                                'posts_per_page' => $limit,
     165                                'fields'         => 'ids',
     166                                'orderby'        => 'modified',
     167                                'order'          => 'DESC',
     168                                'meta_key'       => self::META_ENABLED, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- The products with the designer on, for the overview and the first steps.
     169                                'meta_value'     => 'yes', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value -- As above.
     170                        )
     171                );
     172                return array(
     173                        'ids'   => array_map( 'intval', $query->posts ),
     174                        'total' => (int) $query->found_posts,
     175                );
    100176        }
    101177
    … …  
    137213                                'id'          => Mockups::PRODUCT_META,
    138214                                'label'       => __( 'Mockup', 'printblob' ),
    139                                 'description' => __( 'The product photo customers design on, with its print areas. Manage mockups under Products › Mockups.', 'printblob' ),
     215                                'description' => __( 'The product photo customers design on, with its print areas. The shop’s mockups are under PrintBlob › Mockups.', 'printblob' ),
    140216                                'desc_tip'    => true,
    141217                                'value'       => (string) ( $chosen ? $chosen : $default ),
    … …  
    155231                        );
    156232                }
     233                echo wp_kses( Pro::product_html( Mockups::sides() ), Pro::LOCK_HTML );
    157234                /**
    158235                 * Fires at the end of the product's PrintBlob tab, for other plugins' settings of the designer.
  • printblob/trunk/includes/class-review-request.php

    r3750583 r3751408  
    11<?php
    22/**
    3  * One request for a review on WordPress.org. Once the shop has its first order with a design, PrintBlob's own
    4  * screens (its settings tab and the mockup screens) ask once; following the request or dismissing it ends it for
    5  * good, for every admin. Nothing is offered for a review.
     3 * A request for a review on WordPress.org, on PrintBlob's own screens: once the shop has its first order with a design,
     4 * and once more at its tenth unless the first was followed or dismissed for good. Following a request, or dismissing it
     5 * for good, ends it for every admin. Nothing is offered for a review.
    66 *
    77 * @package PrintBlob
    … …  
    1414final class Review_Request {
    1515
    16         /** 'waiting' (no order with a design yet), 'due', or 'done' (followed or dismissed). */
     16        /**
     17         * 'waiting' (no order with a design yet), 'due' (the first request), 'later' (dismissed until the second milestone),
     18         * 'due-again' (the second request) or 'done' (followed, or dismissed for good).
     19         */
    1720        public const OPTION = 'printblob_review_request';
     21
     22        /** Orders with designs at which the request is made a second time. */
     23        public const SECOND_MILESTONE = 10;
    1824
    1925        public const REVIEW_URL = FACTS['reviews'];
    … …  
    2430        }
    2531
    26         /** An order with a design makes the request due, unless it has been answered. */
     32        /** An order with a design makes the first request due, and at the second milestone the second one. */
    2733        public static function order_with_design(): void {
    28                 if ( 'done' !== get_option( self::OPTION ) ) {
     34                $state = (string) get_option( self::OPTION, '' );
     35                if ( in_array( $state, array( '', 'waiting' ), true ) ) {
    2936                        update_option( self::OPTION, 'due', false );
     37                } elseif ( 'later' === $state && count( Design_Store::order_ids() ) >= self::SECOND_MILESTONE ) {
     38                        update_option( self::OPTION, 'due-again', false );
    3039                }
    3140        }
    … …  
    5867
    5968        public static function notice_html(): string {
    60                 if ( 'due' !== self::state() ) {
     69                $state = self::state();
     70                if ( ! in_array( $state, array( 'due', 'due-again' ), true ) ) {
    6171                        return '';
    6272                }
    6373                $answer = static fn( string $answer ): string => wp_nonce_url( admin_url( 'admin-post.php?action=printblob_review_request&answer=' . $answer ), 'printblob_review_request' );
     74                $later  = 'due' === $state
     75                        ? sprintf( ' <a class="button" href="%1$s">%2$s</a> <a href="%3$s">%4$s</a>', esc_url( $answer( 'dismiss' ) ), esc_html__( 'Dismiss', 'printblob' ), esc_url( $answer( 'never' ) ), esc_html__( 'Don’t ask again', 'printblob' ) )
     76                        : sprintf( ' <a class="button" href="%1$s">%2$s</a>', esc_url( $answer( 'never' ) ), esc_html__( 'Dismiss', 'printblob' ) );
    6477                return sprintf(
    65                         '<div class="notice notice-info printblob-review-request"><p>%1$s</p><p><a class="button button-primary" href="%2$s" target="_blank" rel="noopener">%3$s</a> <a class="button" href="%4$s">%5$s</a></p></div>',
    66                         esc_html__( 'Your shop has its first order with a PrintBlob design. If PrintBlob is useful to you, a review on WordPress.org helps other shops find it.', 'printblob' ),
     78                        '<div class="notice notice-info printblob-review-request"><p>%1$s</p><p><a class="button button-primary" href="%2$s" target="_blank" rel="noopener">%3$s</a>%4$s</p></div>',
     79                        'due' === $state
     80                                ? esc_html__( 'Your shop has its first order with a PrintBlob design. If PrintBlob is useful to you, a review on WordPress.org helps other shops find it.', 'printblob' )
     81                                /* translators: %d: number of orders with designs. */
     82                                : esc_html( sprintf( __( 'Your shop has had %d orders with PrintBlob designs. If PrintBlob is useful to you, a review on WordPress.org helps other shops find it.', 'printblob' ), self::SECOND_MILESTONE ) ),
    6783                        esc_url( $answer( 'review' ) ),
    6884                        esc_html__( 'Write a review', 'printblob' ),
    69                         esc_url( $answer( 'dismiss' ) ),
    70                         esc_html__( 'Dismiss', 'printblob' )
     85                        $later
    7186                );
    7287        }
    7388
    7489        /**
    75          * Records the admin's answer: following the request or dismissing it ends it for good.
     90         * Records the admin's answer. Following a request, "Don't ask again" and dismissing the second request end it for
     91         * good; dismissing the first waits for the second milestone, unless the shop has reached it already.
    7692         *
    77          * @param string $answer 'review' or 'dismiss'.
     93         * @param string $answer 'review', 'dismiss' or 'never'.
    7894         */
    7995        public static function answer( string $answer ): void {
    80                 if ( in_array( $answer, array( 'review', 'dismiss' ), true ) ) {
     96                if ( in_array( $answer, array( 'review', 'never' ), true ) ) {
    8197                        update_option( self::OPTION, 'done', false );
     98                } elseif ( 'dismiss' === $answer ) {
     99                        $first = 'due' === self::state() && count( Design_Store::order_ids() ) < self::SECOND_MILESTONE;
     100                        update_option( self::OPTION, $first ? 'later' : 'done', false );
    82101                }
    83102        }
  • printblob/trunk/includes/class-settings-page.php

    r3750583 r3751408  
    2828        protected function get_settings_for_default_section() {
    2929                $attributes = Settings::attribute_choices();
     30                $pro        = Settings::pro_rows();
    3031                $designer   = array(
    3132                        array(
    … …  
    3435                                'title' => __( 'Designer', 'printblob' ),
    3536                                'desc'  => sprintf(
    36                                         /* translators: %s: link to Products › Mockups. */
    37                                         __( 'Turn the designer on per product in its PrintBlob tab. Product photos and print areas are set up under %s.', 'printblob' ),
    38                                         '<a href="' . esc_url( admin_url( 'edit.php?post_type=' . Mockups::POST_TYPE ) ) . '">' . esc_html__( 'Products › Mockups', 'printblob' ) . '</a>'
     37                                        /* translators: %s: link to PrintBlob › Mockups. */
     38                                        __( 'Turn the designer on per product in its PrintBlob tab. The product photos and their print areas are under %s.', 'printblob' ),
     39                                        '<a href="' . esc_url( Mockups::screen_url() ) . '">' . esc_html__( 'PrintBlob › Mockups', 'printblob' ) . '</a>'
    3940                                ),
    4041                        ),
    … …  
    8990                                ),
    9091                        ),
     92                );
     93                return array_merge(
     94                        $designer,
     95                        $pro['fonts'],
    9196                        array(
    92                                 'id'   => 'printblob_designer',
    93                                 'type' => 'sectionend',
     97                                array(
     98                                        'id'   => 'printblob_designer',
     99                                        'type' => 'sectionend',
     100                                ),
    94101                        ),
     102                        $pro['panel']
    95103                );
    96                 return array_merge( $designer, Settings::pro_panel() );
    97104        }
    98105}
  • printblob/trunk/includes/class-settings.php

    r3750583 r3751408  
    2323                add_filter( 'plugin_action_links_' . plugin_basename( FILE ), array( __CLASS__, 'action_links' ) );
    2424                add_filter( 'plugin_row_meta', array( __CLASS__, 'row_meta' ), 10, 2 );
     25                add_action( 'woocommerce_admin_field_printblob_pro_lock', array( __CLASS__, 'pro_lock_field' ) );
    2526        }
    2627
    2728        /**
    28          * Links under the plugin's description: documentation, and PrintBlob Pro's plans while Pro is not active.
     29         * Links under the plugin's description: documentation, a request to rate PrintBlob, and, while Pro is not active,
     30         * PrintBlob Pro's 3D view and trial.
    2931         *
    3032         * @param string[]  $links      The row's links.
    … …  
    3739                }
    3840                $links[] = '<a href="' . esc_url( FACTS['docs'] ) . '" target="_blank" rel="noopener">' . esc_html__( 'Documentation', 'printblob' ) . '</a>';
     41                $links[] = '<a href="' . esc_url( FACTS['reviews'] ) . '" target="_blank" rel="noopener">' . esc_html__( 'Rate PrintBlob ★★★★★', 'printblob' ) . '</a>';
    3942                if ( ! ( $pro_active ?? self::pro_active() ) ) {
    40                         $links[] = '<a href="' . esc_url( FACTS['pricing'] ) . '" target="_blank" rel="noopener">' . esc_html__( 'PrintBlob Pro: sleeves, print queue, your own fonts', 'printblob' ) . '</a>';
     43                        $days = (int) FACTS['pro']['trial_days'];
     44                        /* translators: %d: days of PrintBlob Pro's free trial. */
     45                        $links[] = '<a href="' . esc_url( Pro::checkout_url( 'plugins-row' ) ) . '" target="_blank" rel="noopener">' . esc_html( sprintf( _n( 'PrintBlob Pro add-on: the 3D view and more, free for %d day', 'PrintBlob Pro add-on: the 3D view and more, free for %d days', $days, 'printblob' ), $days ) ) . '</a>';
    4146                }
    4247                return $links;
    … …  
    7782        }
    7883
    79         /** Whether a screen is PrintBlob's own: its settings tab, or a mockup screen. */
     84        /** Whether a screen is PrintBlob's own: its menu's pages, its settings tab, or a mockup screen. */
    8085        public static function own_screen( string $screen_id, string $post_type, string $tab ): bool {
    81                 return ( 'woocommerce_page_wc-settings' === $screen_id && 'printblob' === $tab ) || Mockups::POST_TYPE === $post_type;
     86                return Admin_Menu::SCREEN === $screen_id || str_starts_with( $screen_id, Admin_Menu::SCREEN_PREFIX )
     87                        || ( 'woocommerce_page_wc-settings' === $screen_id && 'printblob' === $tab ) || Mockups::POST_TYPE === $post_type;
    8288        }
    8389
    … …  
    96102
    97103        /**
    98          * The PrintBlob Pro panel at the end of the settings screen: what Pro adds and where its plans are, while Pro is not
    99          * active. No prices or trial lengths here; printblob.com's plans are the one source.
     104         * The settings screen's PrintBlob Pro rows while Pro is not active: "Upload your own fonts" switched off in the designer
     105         * section, and a panel at the end with what Pro adds, its trial and prices.
    100106         *
    101107         * @param bool|null $pro_active Whether Pro is active; self::pro_active() when null.
    102          * @return array[] WooCommerce settings rows, none while Pro is active.
     108         * @return array{fonts:array[], panel:array[]} WooCommerce settings rows, none while Pro is active.
    103109         */
    104         public static function pro_panel( ?bool $pro_active = null ): array {
     110        public static function pro_rows( ?bool $pro_active = null ): array {
    105111                if ( $pro_active ?? self::pro_active() ) {
    106                         return array();
     112                        return array(
     113                                'fonts' => array(),
     114                                'panel' => array(),
     115                        );
    107116                }
     117                $points = implode( '', array_map( static fn( string $point ): string => '<li>' . esc_html( $point ) . '</li>', Pro::points() ) );
    108118                return array(
    109                         array(
    110                                 'id'    => 'printblob_pro',
    111                                 'type'  => 'title',
    112                                 'title' => __( 'PrintBlob Pro', 'printblob' ),
    113                                 'desc'  => sprintf(
    114                                         '<p>%1$s</p><p><a class="button" href="%2$s" target="_blank" rel="noopener">%3$s</a></p>',
    115                                         esc_html__( 'PrintBlob Pro adds a 3D view of the product, sleeve printing, a print queue that downloads every print file of an order as one ZIP, and your own fonts, with automatic updates and priority support. It is a separate plugin from printblob.com; everything here works without it.', 'printblob' ),
    116                                         esc_url( FACTS['pricing'] ),
    117                                         esc_html__( 'PrintBlob Pro’s plans', 'printblob' )
     119                        'fonts' => array(
     120                                array(
     121                                        'id'    => 'printblob_pro_fonts',
     122                                        'type'  => 'printblob_pro_lock',
     123                                        'title' => __( 'Upload your own fonts', 'printblob' ),
     124                                        'from'  => 'settings-fonts',
    118125                                ),
    119126                        ),
    120                         array(
    121                                 'id'   => 'printblob_pro',
    122                                 'type' => 'sectionend',
     127                        'panel' => array(
     128                                array(
     129                                        'id'    => 'printblob_pro',
     130                                        'type'  => 'title',
     131                                        'title' => __( 'PrintBlob Pro', 'printblob' ),
     132                                        'desc'  => sprintf(
     133                                                '<p><strong>%1$s</strong> %2$s %3$s</p><ul class="ul-disc">%4$s</ul><p>%5$s <a href="%6$s">%7$s</a></p><p>%8$s</p>',
     134                                                esc_html( Pro::trial_text() ),
     135                                                esc_html( Pro::prices_text() . '.' ),
     136                                                esc_html( Pro::refund_text() ),
     137                                                $points,
     138                                                Pro::buttons_html( 'settings-panel' ),
     139                                                esc_url( Pro::compare_url() ),
     140                                                esc_html__( 'Compare free and Pro', 'printblob' ),
     141                                                esc_html( Pro::separate_text() )
     142                                        ),
     143                                ),
     144                                array(
     145                                        'id'   => 'printblob_pro',
     146                                        'type' => 'sectionend',
     147                                ),
    123148                        ),
    124149                );
     150        }
     151
     152        /**
     153         * A Pro row of the settings screen: its name and the control that opens the upgrade box.
     154         *
     155         * @param array $field The row: title and from (its placement).
     156         */
     157        public static function pro_lock_field( array $field ): void {
     158                ?>
     159                <tr>
     160                        <th scope="row" class="titledesc"><?php echo esc_html( $field['title'] ); ?></th>
     161                        <td class="forminp"><?php echo wp_kses( Pro::lock_html( (string) $field['from'] ), Pro::LOCK_HTML ); ?></td>
     162                </tr>
     163                <?php
    125164        }
    126165
  • printblob/trunk/includes/facts.json

    r3750583 r3751408  
    11{
    22        "docs": "https://printblob.com/docs/",
    3         "pricing": "https://printblob.com/pricing/",
    4         "reviews": "https://wordpress.org/support/plugin/printblob/reviews/#new-post"
     3        "reviews": "https://wordpress.org/support/plugin/printblob/reviews/#new-post",
     4        "get_pro": "https://printblob.com/get-pro/",
     5        "placements": [
     6                "overview-card",
     7                "overview-line",
     8                "compare",
     9                "menu",
     10                "plugins-row",
     11                "product-sleeves",
     12                "order-zip",
     13                "settings-panel",
     14                "mockups",
     15                "product-3d",
     16                "product-back",
     17                "settings-fonts",
     18                "queue-zip",
     19                "dashboard",
     20                "orders-milestone",
     21                "storefront-3d",
     22                "deactivate",
     23                "quick-setup"
     24        ],
     25        "feedback": {
     26                "url": "https://printblob.com/api/v1/feedback",
     27                "reasons": [
     28                        {
     29                                "id": "temporary",
     30                                "pro": []
     31                        },
     32                        {
     33                                "id": "not-working",
     34                                "pro": []
     35                        },
     36                        {
     37                                "id": "hard-to-use",
     38                                "pro": []
     39                        },
     40                        {
     41                                "id": "back-or-sleeves",
     42                                "pro": [
     43                                        "back",
     44                                        "sleeves"
     45                                ]
     46                        },
     47                        {
     48                                "id": "own-products",
     49                                "pro": [
     50                                        "own-products"
     51                                ]
     52                        },
     53                        {
     54                                "id": "3d",
     55                                "pro": [
     56                                        "3d"
     57                                ]
     58                        },
     59                        {
     60                                "id": "print-queue",
     61                                "pro": [
     62                                        "print-queue"
     63                                ]
     64                        },
     65                        {
     66                                "id": "other-plugin",
     67                                "pro": []
     68                        },
     69                        {
     70                                "id": "other",
     71                                "pro": []
     72                        }
     73                ],
     74                "text_max": 1000,
     75                "email_max": 254
     76        },
     77        "demo_3d": "https://printblob.com/#demo?view=3d",
     78        "menu_icon": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PHBhdGggZmlsbD0iI2E3YWFhZCIgZD0iTTE2LjQgNy42YzMuOS0uNCA3LjYgMiA4LjIgNS44LjUgMy0xLjIgNC40LTEgNyAuMiAyLjctMi4xIDQuNi01IDQuMy0yLjEtLjItMy0xLjUtNS4zLTEuMi0yLjguNC01LjMtMS01LjYtMy45LS4zLTIuNCAxLjMtMy40IDEuMi01LjUtLjItMy4zIDMuMy02LjIgNy41LTYuNVoiLz48cGF0aCBmaWxsPSIjYTdhYWFkIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yIDJoMjh2MjhoLTI4Wk00IDR2MjRoMjR2LTI0WiIvPjxjaXJjbGUgZmlsbD0iI2E3YWFhZCIgY3g9IjMiIGN5PSIzIiByPSIyLjYiLz48Y2lyY2xlIGZpbGw9IiNhN2FhYWQiIGN4PSIyOSIgY3k9IjMiIHI9IjIuNiIvPjxjaXJjbGUgZmlsbD0iI2E3YWFhZCIgY3g9IjMiIGN5PSIyOSIgcj0iMi42Ii8+PGNpcmNsZSBmaWxsPSIjYTdhYWFkIiBjeD0iMjkiIGN5PSIyOSIgcj0iMi42Ii8+PC9zdmc+",
     79        "pro": {
     80                "yearly": "$49",
     81                "lifetime": "$79",
     82                "trial_days": 14,
     83                "refund_days": 14,
     84                "features": [
     85                        {
     86                                "id": "own-products",
     87                                "name": "Your own products",
     88                                "point": "Your own products: mugs, hoodies, bags, on your own photos, with print areas drawn on them"
     89                        },
     90                        {
     91                                "id": "back",
     92                                "name": "Back printing",
     93                                "point": "Back printing, with its own photo, print area and price"
     94                        },
     95                        {
     96                                "id": "3d",
     97                                "name": "3D view",
     98                                "point": "A 3D view of the product, made from its own photos"
     99                        },
     100                        {
     101                                "id": "sleeves",
     102                                "name": "Sleeve printing",
     103                                "point": "Sleeve printing, with their own photos, print areas and prices"
     104                        },
     105                        {
     106                                "id": "print-queue",
     107                                "name": "Print queue",
     108                                "point": "A print queue, with each order’s print files in one ZIP"
     109                        },
     110                        {
     111                                "id": "fonts",
     112                                "name": "Custom fonts and Google Fonts",
     113                                "point": "Custom fonts and Google Fonts, in the designer and the print files"
     114                        },
     115                        {
     116                                "id": "page-builders",
     117                                "name": "Page builder widgets",
     118                                "point": "Page builder widgets: the designer anywhere in Elementor and Beaver Builder pages, and a shortcode for Divi, Bricks and the others"
     119                        }
     120                ],
     121                "services": [
     122                        "automatic updates",
     123                        "priority email support"
     124                ]
     125        }
    5126}
  • printblob/trunk/languages/printblob.pot

    r3751165 r3751408  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: PrintBlob – Product Designer for WooCommerce 1.2.5\n"
     5"Project-Id-Version: PrintBlob – Product Designer for WooCommerce 1.2.6\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/printblob\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    … …  
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-10-16T20:25:53+00:00\n"
     12"POT-Creation-Date: 2026-10-17T03:32:40+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
    … …  
    2727#. Description of the plugin
    2828#: printblob.php
    29 msgid "Customers design their own print on your products — photos, logos and text on the front and back — see it on the real product, and order it through WooCommerce with a print-ready file attached to the order."
     29msgid "Customers design their own t-shirt print — photos, logos and text — see it on the t-shirt, and order it through WooCommerce with a print-ready file attached to the order."
    3030msgstr ""
    3131
    … …  
    4141
    4242#: build/colors/render.php:45
    43 #: includes/class-order.php:162
     43#: includes/class-order.php:165
    4444msgid "Design"
    4545msgstr ""
    … …  
    5050
    5151#. translators: %s: attribute names, such as Material.
    52 #: build/designer/render.php:169
     52#: build/designer/render.php:175
    5353#, php-format
    5454msgid "The designer can’t show this product: its variations also depend on %s, which the designer doesn’t offer. Set it to “Any” in every variation, or stop using it for variations."
    5555msgstr ""
    5656
    57 #: build/designer/render.php:222
     57#: build/designer/render.php:233
    5858#: build/designer/view.js:10
    5959msgid "Loading the designer…"
    … …  
    6161
    6262#. translators: 1: print area width in cm, 2: print area height in cm.
    63 #: build/designer/render.php:227
     63#: build/designer/render.php:238
    6464#: build/designer/view.js:11
    6565#, php-format,js-format
    … …  
    6767msgstr ""
    6868
    69 #: build/designer/render.php:235
     69#: build/designer/render.php:246
    7070#: build/designer/view.js:11
    7171msgid "Your print"
    7272msgstr ""
    7373
    74 #: build/designer/render.php:237
     74#: build/designer/render.php:248
    7575#: build/designer/view.js:11
    7676msgid "Upload image"
    7777msgstr ""
    7878
    79 #: build/designer/render.php:238
     79#: build/designer/render.php:249
    8080#: build/designer/view.js:11
    8181msgid "Add text"
    8282msgstr ""
    8383
    84 #: build/designer/render.php:247
     84#: build/designer/render.php:258
    8585#: build/designer/view.js:5
    8686msgid "Font"
    8787msgstr ""
    8888
    89 #: build/designer/render.php:248
     89#: build/designer/render.php:259
    9090#: build/designer/view.js:5
    9191msgid "Bold"
    9292msgstr ""
    9393
    94 #: build/designer/render.php:251
     94#: build/designer/render.php:262
    9595#: build/designer/view.js:5
    9696msgid "Ink colour"
    9797msgstr ""
    9898
    99 #: build/designer/render.php:260
     99#: build/designer/render.php:271
    100100#: build/designer/view.js:4
    101101msgid "Centre"
    102102msgstr ""
    103103
    104 #: build/designer/render.php:260
     104#: build/designer/render.php:271
    105105#: build/designer/view.js:4
    106106msgid "Bring forward"
    107107msgstr ""
    108108
    109 #: build/designer/render.php:260
     109#: build/designer/render.php:271
    110110#: build/designer/view.js:4
    111111msgid "Send back"
    112112msgstr ""
    113113
    114 #: build/designer/render.php:260
     114#: build/designer/render.php:271
    115115#: includes/class-shirt-colors.php:104
    116116#: build/designer/view.js:4
    … …  
    119119
    120120#. translators: closes the controls of the chosen image or text, back to the list of what is on the side.
    121 #: build/designer/render.php:260
     121#: build/designer/render.php:271
     122#: includes/class-overview.php:169
    122123#: build/designer/view.js:5
    123124msgid "Done"
    … …  
    125126
    126127#. translators: shown where the controls appear while the printed side shown has nothing on it.
    127 #: build/designer/render.php:265
     128#: build/designer/render.php:276
    128129#: build/designer/view.js:10
    129130msgid "Upload an image or add text to start."
    130131msgstr ""
    131132
    132 #: build/designer/render.php:274
     133#: build/designer/render.php:285
     134#: includes/class-quick-setup.php:178
     135#: includes/class-quick-setup.php:502
    133136#: build/designer/view.js:11
    134137msgid "Colour"
    135138msgstr ""
    136139
    137 #: build/designer/render.php:284
     140#: build/designer/render.php:295
     141#: includes/class-quick-setup.php:179
     142#: includes/class-quick-setup.php:514
    138143#: build/designer/view.js:11
    139144msgid "Size"
    140145msgstr ""
    141146
    142 #: build/designer/render.php:305
     147#: build/designer/render.php:316
    143148#: build/designer/view.js:2
    144149msgid "Quantity"
    145150msgstr ""
    146151
    147 #: build/designer/render.php:310
     152#: build/designer/render.php:321
    148153#: includes/class-privacy.php:103
     154#: includes/class-quick-setup.php:524
    149155#: build/designer/index.js:1
    150156#: build/designer/view.js:2
    … …  
    153159
    154160#. translators: %s: printed side, e.g. Front.
    155 #: build/designer/render.php:316
     161#: build/designer/render.php:327
    156162#: build/designer/view.js:3
    157163#, php-format,js-format
    … …  
    160166
    161167#. translators: in the price breakdown, beside a side (e.g. "Back print") that has no design.
    162 #: build/designer/render.php:319
     168#: build/designer/render.php:330
    163169#: build/designer/view.js:4
    164170msgid "Not printed"
    165171msgstr ""
    166172
    167 #: build/designer/render.php:322
     173#: build/designer/render.php:333
    168174#: build/designer/view.js:4
    169175msgid "Total"
    170176msgstr ""
    171177
    172 #: build/designer/render.php:326
     178#: build/designer/render.php:337
    173179#: build/designer/view.js:2
    174180#: build/designer/view.js:4
    … …  
    176182msgstr ""
    177183
    178 #: build/designer/render.php:327
     184#: build/designer/render.php:338
    179185#: build/designer/view.js:2
    180186msgid "Preparing your print file…"
    181187msgstr ""
    182188
    183 #: build/designer/render.php:327
     189#: build/designer/render.php:338
    184190#: build/designer/view.js:2
    185191msgid "Saving your design…"
    186192msgstr ""
    187193
    188 #: build/designer/render.php:327
     194#: build/designer/render.php:338
    189195#: build/designer/view.js:2
    190196msgid "Adding to cart…"
    191197msgstr ""
    192198
    193 #: build/designer/render.php:332
     199#: build/designer/render.php:343
    194200#: build/designer/view.js:1
    195201msgid "Added to your cart."
    196202msgstr ""
    197203
    198 #: build/designer/render.php:332
     204#: build/designer/render.php:343
    199205#: build/designer/view.js:2
    200206msgid "View cart"
    201207msgstr ""
    202208
    203 #: build/designer/render.php:335
     209#: build/designer/render.php:346
    204210#: build/designer/view.js:1
    205211msgid "Add an image or text to the front or back first."
    206212msgstr ""
    207213
    208 #: build/designer/render.php:336
     214#: build/designer/render.php:347
    209215#: build/designer/view.js:1
    210216msgid "Choose a size."
    211217msgstr ""
    212218
    213 #: build/designer/render.php:337
     219#: build/designer/render.php:348
    214220#: build/designer/view.js:1
    215221msgid "This combination is sold out. Choose another."
    216222msgstr ""
    217223
    218 #: build/designer/render.php:338
     224#: build/designer/render.php:349
    219225#: build/designer/view.js:1
    220226msgid "This colour and size is sold out. Choose another."
    221227msgstr ""
    222228
    223 #: build/designer/render.php:339
     229#: build/designer/render.php:350
    224230#: build/designer/view.js:1
    225231msgid "Use a PNG, JPG or WebP image."
    226232msgstr ""
    227233
    228 #: build/designer/render.php:340
     234#: build/designer/render.php:351
    229235#: includes/class-design-store.php:435
    230236#: build/designer/view.js:1
    … …  
    232238msgstr ""
    233239
    234 #: build/designer/render.php:341
     240#: build/designer/render.php:352
    235241#: build/designer/view.js:1
    236242msgid "The product could not be added to the cart."
    … …  
    238244
    239245#. translators: %d: largest allowed file size in megabytes.
    240 #: build/designer/render.php:343
     246#: build/designer/render.php:354
    241247#: build/designer/view.js:2
    242248#, php-format,js-format
    … …  
    244250msgstr ""
    245251
    246 #: build/designer/render.php:354
     252#: build/designer/render.php:365
    247253msgid "The designer needs JavaScript. Turn it on in your browser to design your product."
     254msgstr ""
     255
     256#: includes/class-admin-menu.php:35
     257#: includes/class-dashboard-widget.php:69
     258#: includes/class-overview.php:180
     259#: includes/class-quick-setup.php:491
     260msgid "PrintBlob overview"
     261msgstr ""
     262
     263#: includes/class-admin-menu.php:37
     264msgid "Overview"
     265msgstr ""
     266
     267#: includes/class-admin-menu.php:38
     268msgid "PrintBlob settings"
     269msgstr ""
     270
     271#: includes/class-admin-menu.php:38
     272#: includes/class-settings.php:61
     273msgid "Settings"
     274msgstr ""
     275
     276#: includes/class-admin-menu.php:46
     277#: includes/class-dashboard-widget.php:71
     278#: includes/class-print-queue.php:86
     279msgid "Print queue"
     280msgstr ""
     281
     282#: includes/class-admin-menu.php:48
     283#: includes/class-overview.php:238
     284#: includes/class-settings.php:131
     285msgid "PrintBlob Pro"
     286msgstr ""
     287
     288#: includes/class-admin-menu.php:52
     289msgid "Get Pro"
     290msgstr ""
     291
     292#: includes/class-admin-menu.php:52
     293#: includes/class-deactivation-feedback.php:122
     294#: includes/class-mockups.php:410
     295msgid "Get PrintBlob Pro"
     296msgstr ""
     297
     298#. translators: %s: five stars, linking to PrintBlob's reviews on WordPress.org.
     299#: includes/class-admin-menu.php:92
     300#, php-format
     301msgid "If PrintBlob helps your shop, please rate it %s on WordPress.org."
     302msgstr ""
     303
     304#: includes/class-admin-menu.php:93
     305msgid "Rate PrintBlob on WordPress.org"
    248306msgstr ""
    249307
    … …  
    256314msgstr ""
    257315
    258 #: includes/class-cart.php:93
     316#: includes/class-cart.php:98
    259317#: includes/class-order.php:37
    260318msgid "Print"
    261319msgstr ""
    262320
    263 #: includes/class-cart.php:125
    264 #: includes/class-cart.php:137
     321#: includes/class-cart.php:130
     322#: includes/class-cart.php:142
    265323msgid "Your design"
     324msgstr ""
     325
     326#: includes/class-dashboard-widget.php:32
     327msgid "PrintBlob this week"
     328msgstr ""
     329
     330#. translators: %d: number of orders.
     331#: includes/class-dashboard-widget.php:66
     332#, php-format
     333msgid "%d order with a design this week"
     334msgid_plural "%d orders with designs this week"
     335msgstr[0] ""
     336msgstr[1] ""
     337
     338#: includes/class-dashboard-widget.php:74
     339#: includes/class-print-queue.php:125
     340#: includes/class-pro.php:130
     341#: includes/class-pro.php:251
     342#: includes/class-pro.php:322
     343#: includes/class-pro.php:408
     344#: includes/class-quick-setup.php:575
     345msgid "PrintBlob Pro add-on"
     346msgstr ""
     347
     348#: includes/class-dashboard-widget.php:76
     349#: includes/class-pro.php:99
     350#: includes/class-pro.php:122
     351#: includes/class-pro.php:414
     352msgid "Start your free trial"
     353msgstr ""
     354
     355#: includes/class-dashboard-widget.php:79
     356#: includes/class-onboarding.php:80
     357#: includes/class-order-milestones.php:56
     358#: includes/class-order.php:136
     359#: includes/class-review-request.php:75
     360#: includes/class-review-request.php:76
     361msgid "Dismiss"
     362msgstr ""
     363
     364#: includes/class-dashboard-widget.php:90
     365#: includes/class-order-milestones.php:63
     366#: includes/class-order.php:143
     367#: includes/class-overview.php:175
     368#: includes/class-print-queue.php:81
     369#: includes/class-pro.php:185
     370#: includes/class-pro.php:237
     371#: includes/class-quick-setup.php:97
     372#: includes/class-quick-setup.php:454
     373#: includes/class-review-request.php:107
     374msgid "You are not allowed to do this."
     375msgstr ""
     376
     377#: includes/class-deactivation-feedback.php:91
     378msgid "It’s only for a moment: I’m fixing something"
     379msgstr ""
     380
     381#: includes/class-deactivation-feedback.php:92
     382msgid "It didn’t work on my site"
     383msgstr ""
     384
     385#: includes/class-deactivation-feedback.php:93
     386msgid "It was hard to set up or use"
     387msgstr ""
     388
     389#: includes/class-deactivation-feedback.php:94
     390msgid "I need back or sleeve printing"
     391msgstr ""
     392
     393#: includes/class-deactivation-feedback.php:95
     394msgid "I need my own products"
     395msgstr ""
     396
     397#: includes/class-deactivation-feedback.php:96
     398msgid "I need a 3D view"
     399msgstr ""
     400
     401#: includes/class-deactivation-feedback.php:97
     402msgid "I need a print queue"
     403msgstr ""
     404
     405#: includes/class-deactivation-feedback.php:98
     406msgid "I found another plugin"
     407msgstr ""
     408
     409#: includes/class-deactivation-feedback.php:99
     410msgid "Something else"
     411msgstr ""
     412
     413#: includes/class-deactivation-feedback.php:104
     414msgid "Nothing is sent unless you press “Send and deactivate”. Then printblob.com receives the reason you chose, your note, your email address if you type one, the PrintBlob version and your WordPress language. Never your site’s address."
     415msgstr ""
     416
     417#: includes/class-deactivation-feedback.php:117
     418#: includes/class-pro.php:118
     419msgid "PrintBlob Pro add-on:"
     420msgstr ""
     421
     422#: includes/class-deactivation-feedback.php:140
     423msgid "Tell us more below if you like: what you needed, or what went wrong."
     424msgstr ""
     425
     426#: includes/class-deactivation-feedback.php:168
     427msgid "Why are you leaving?"
     428msgstr ""
     429
     430#: includes/class-deactivation-feedback.php:171
     431msgid "Your note (optional)"
     432msgstr ""
     433
     434#: includes/class-deactivation-feedback.php:173
     435msgid "Your email address, if you would like an answer (optional)"
     436msgstr ""
     437
     438#: includes/class-deactivation-feedback.php:177
     439msgid "Skip and deactivate"
     440msgstr ""
     441
     442#: includes/class-deactivation-feedback.php:178
     443msgid "Send and deactivate"
    266444msgstr ""
    267445
    … …  
    340518msgstr ""
    341519
    342 #: includes/class-design-store.php:588
    343 #: includes/class-design-store.php:613
     520#: includes/class-design-store.php:639
     521#: includes/class-design-store.php:664
    344522msgid "PrintBlob print files are private"
    345523msgstr ""
    346524
    347 #: includes/class-design-store.php:619
     525#: includes/class-design-store.php:670
    348526msgid "Customers’ print files cannot be downloaded from the web; shop managers download them from the order screen."
    349527msgstr ""
    350528
    351 #: includes/class-design-store.php:623
     529#: includes/class-design-store.php:674
    352530msgid "PrintBlob print files can be downloaded from the web"
    353531msgstr ""
    354532
    355 #: includes/class-design-store.php:625
     533#: includes/class-design-store.php:676
    356534msgid "This server does not apply the .htaccess file that protects the print folder (nginx ignores it). Anyone who learns a print file’s address could download it. Ask your host to add this rule to the site’s nginx configuration:"
    357535msgstr ""
    358536
    359 #: includes/class-design-store.php:628
     537#: includes/class-design-store.php:679
    360538msgid "PrintBlob could not check that print files are private"
    361539msgstr ""
    362540
    363 #: includes/class-design-store.php:630
     541#: includes/class-design-store.php:681
    364542msgid "The site could not request a test file from its own print folder, so it cannot tell whether print files are protected. On Apache the folder’s .htaccess protects them; on nginx, make sure the site’s configuration has this rule:"
    365543msgstr ""
    366544
    367 #: includes/class-mockups.php:61
     545#. translators: %s: mockup title.
     546#: includes/class-mockups.php:65
     547#: includes/class-mockups.php:74
     548#: includes/class-mockups.php:379
     549#: includes/class-mockups.php:405
     550#: includes/class-overview.php:122
     551msgid "Mockups"
     552msgstr ""
     553
     554#: includes/class-mockups.php:66
     555#: includes/class-product-settings.php:214
     556msgid "Mockup"
     557msgstr ""
     558
     559#: includes/class-mockups.php:67
     560#: includes/class-mockups.php:68
     561msgid "Add mockup"
     562msgstr ""
     563
     564#: includes/class-mockups.php:69
     565msgid "Edit mockup"
     566msgstr ""
     567
    368568#: includes/class-mockups.php:70
    369 msgid "Mockups"
    370 msgstr ""
    371 
    372 #: includes/class-mockups.php:62
    373 #: includes/class-product-settings.php:138
    374 msgid "Mockup"
    375 msgstr ""
    376 
    377 #: includes/class-mockups.php:63
    378 #: includes/class-mockups.php:64
    379 msgid "Add mockup"
    380 msgstr ""
    381 
    382 #: includes/class-mockups.php:65
    383 msgid "Edit mockup"
    384 msgstr ""
    385 
    386 #: includes/class-mockups.php:66
    387569msgid "New mockup"
    388570msgstr ""
    389571
    390 #: includes/class-mockups.php:67
     572#: includes/class-mockups.php:71
    391573msgid "Search mockups"
    392574msgstr ""
    393575
    394 #: includes/class-mockups.php:68
     576#: includes/class-mockups.php:72
    395577msgid "No mockups yet."
    396578msgstr ""
    397579
    398 #: includes/class-mockups.php:69
     580#: includes/class-mockups.php:73
    399581msgid "No mockups in the trash."
    400582msgstr ""
    401583
    402 #: includes/class-mockups.php:136
     584#: includes/class-mockups.php:140
     585#: includes/class-quick-setup.php:88
    403586msgid "T-shirt"
    404587msgstr ""
    405588
    406 #: includes/class-mockups.php:158
     589#: includes/class-mockups.php:162
    407590msgid "T-shirt mockup (back)"
    408591msgstr ""
    409592
    410 #: includes/class-mockups.php:158
     593#: includes/class-mockups.php:162
    411594msgid "T-shirt mockup"
    412595msgstr ""
    413596
    414 #: includes/class-mockups.php:310
     597#: includes/class-mockups.php:320
     598#: includes/class-pro.php:369
    415599msgid "Back"
    416600msgstr ""
    417601
    418 #: includes/class-mockups.php:310
     602#: includes/class-mockups.php:320
    419603msgid "Front"
    420604msgstr ""
    421605
    422 #: includes/class-mockups.php:368
    423 msgid "Photo for this side"
    424 msgstr ""
    425 
    426 #: includes/class-mockups.php:369
    427 #: includes/class-shirt-colors.php:93
    428 msgid "Use this photo"
    429 msgstr ""
    430 
    431 #: includes/class-mockups.php:375
    432 msgid "Printable sides"
    433 msgstr ""
    434 
    435 #: includes/class-mockups.php:382
    436 msgid "Upload a photo of the blank product for each side, then drag the blue box over the area that can be printed. Use the corner to resize it. A product on a transparent or plain white background works best."
    437 msgstr ""
    438 
    439 #: includes/class-mockups.php:386
    440 msgid "Recolour the photo to the colour the customer picks (for a white or light grey product photo)"
    441 msgstr ""
    442 
    443 #: includes/class-mockups.php:397
    444 msgid "Customers can print on this side"
    445 msgstr ""
    446 
    447 #: includes/class-mockups.php:414
    448 #: includes/class-shirt-colors.php:103
    449 msgid "Choose photo"
     606#. translators: 1: width in cm, 2: height in cm.
     607#: includes/class-mockups.php:399
     608#, php-format
     609msgid "%1$s × %2$s cm"
     610msgstr ""
     611
     612#: includes/class-mockups.php:406
     613msgid "The product photos customers design on, with the print area of each side and its print size. Choose a product’s mockup on its PrintBlob tab."
     614msgstr ""
     615
     616#: includes/class-mockups.php:408
     617msgid "Your own products — mugs, hoodies, bags, your own photos — with the PrintBlob Pro add-on"
     618msgstr ""
     619
     620#: includes/class-mockups.php:409
     621msgid "PrintBlob Pro adds the mockup editor: a photo of your product for each side, the print area drawn on the photo, and the real print size in centimetres."
    450622msgstr ""
    451623
    452624#: includes/class-mockups.php:416
    453 msgid "Print width (cm)"
    454 msgstr ""
    455 
    456 #: includes/class-mockups.php:417
    457 msgid "Print height (cm)"
    458 msgstr ""
    459 
    460 #: includes/class-mockups.php:462
    461 msgid "Sides"
    462 msgstr ""
    463 
    464 #. translators: 1: side name, 2: width in cm, 3: height in cm.
    465 #: includes/class-mockups.php:473
    466 #, php-format
    467 msgid "%1$s (%2$s × %3$s cm)"
    468 msgstr ""
    469 
    470 #: includes/class-mockups.php:476
    471 msgid "No sides set up"
    472 msgstr ""
    473 
    474 #. translators: %s: link to Products › Mockups.
    475 #: includes/class-onboarding.php:37
    476 #, php-format
    477 msgid "Check the t-shirt mockup or add your own product photos and print areas under %s."
    478 msgstr ""
    479 
    480 #: includes/class-onboarding.php:38
    481 #: includes/class-settings-page.php:38
    482 msgid "Products › Mockups"
     625msgid "Recoloured to the colour the customer picks."
     626msgstr ""
     627
     628#. translators: %s: link to PrintBlob › Mockups.
     629#: includes/class-onboarding.php:60
     630#, php-format
     631msgid "Check the bundled product mockup under %s."
     632msgstr ""
     633
     634#: includes/class-onboarding.php:61
     635#: includes/class-settings-page.php:39
     636msgid "PrintBlob › Mockups"
    483637msgstr ""
    484638
    485639#. translators: %s: link to Products.
    486 #: includes/class-onboarding.php:42
     640#: includes/class-onboarding.php:65
    487641#, php-format
    488642msgid "Edit a product, open its PrintBlob designer tab, turn the designer on and set the print price per side (%s)."
    489643msgstr ""
    490644
    491 #: includes/class-onboarding.php:43
     645#: includes/class-onboarding.php:66
     646#: includes/class-overview.php:106
    492647msgid "Products"
    493648msgstr ""
    494649
    495 #: includes/class-onboarding.php:45
     650#: includes/class-onboarding.php:68
    496651msgid "Add the PrintBlob designer block to a page, or open the product: the designer shows on its page."
    497652msgstr ""
    498653
    499 #: includes/class-onboarding.php:49
     654#: includes/class-onboarding.php:73
    500655msgid "PrintBlob is ready. Three steps to your first designable product:"
    501656msgstr ""
    502657
    503 #: includes/class-onboarding.php:56
    504 msgid "PrintBlob settings"
    505 msgstr ""
    506 
    507 #: includes/class-onboarding.php:57
    508 #: includes/class-settings.php:38
     658#: includes/class-onboarding.php:76
     659msgid "Quick setup: all three in one click"
     660msgstr ""
     661
     662#: includes/class-onboarding.php:78
     663#: includes/class-overview.php:244
     664#: includes/class-settings.php:40
    509665msgid "Documentation"
    510666msgstr ""
    511667
    512 #: includes/class-onboarding.php:58
    513 #: includes/class-order.php:133
    514 #: includes/class-review-request.php:70
    515 msgid "Dismiss"
     668#. translators: %d: number of orders with designs (10, 25 or 50).
     669#: includes/class-order-milestones.php:52
     670#, php-format
     671msgid "Your shop has had %d orders with PrintBlob designs. The PrintBlob Pro add-on’s print queue downloads each order’s print files as one ZIP."
    516672msgstr ""
    517673
    518674#. translators: %s: printed side, e.g. Front.
    519675#: includes/class-order.php:88
     676#: includes/class-print-queue.php:109
    520677#, php-format
    521678msgid "Download %s print file"
    … …  
    528685msgstr ""
    529686
    530 #: includes/class-order.php:129
    531 msgid "Download all print files of an order as one ZIP, and work through a print queue, with PrintBlob Pro."
    532 msgstr ""
    533 
    534 #: includes/class-order.php:131
    535 msgid "About PrintBlob Pro"
    536 msgstr ""
    537 
    538 #: includes/class-order.php:140
    539 #: includes/class-review-request.php:88
    540 msgid "You are not allowed to do this."
    541 msgstr ""
     687#. translators: %d: number of print files of the order.
     688#: includes/class-order.php:132
     689#, php-format
     690msgid "This order’s %d print file in one ZIP, with PrintBlob Pro."
     691msgid_plural "This order’s %d print files in one ZIP, with PrintBlob Pro."
     692msgstr[0] ""
     693msgstr[1] ""
     694
     695#: includes/class-order.php:134
     696msgid "About the PrintBlob Pro add-on"
     697msgstr ""
     698
     699#: includes/class-overview.php:38
     700#: includes/class-quick-setup.php:556
     701#: includes/class-settings-page.php:45
     702msgid "Designer page"
     703msgstr ""
     704
     705#. translators: %s: page title.
     706#: includes/class-overview.php:46
     707#, php-format
     708msgid "“%s”, the first published page with the designer block."
     709msgstr ""
     710
     711#. translators: %s: page title.
     712#: includes/class-overview.php:46
     713#: includes/class-overview.php:59
     714msgid "View"
     715msgstr ""
     716
     717#: includes/class-overview.php:47
     718msgid "No page is set and no published page has the designer block. Products with the designer still show it on their own page."
     719msgstr ""
     720
     721#: includes/class-overview.php:47
     722msgid "Choose a page"
     723msgstr ""
     724
     725#. translators: %s: page title.
     726#: includes/class-overview.php:52
     727#, php-format
     728msgid "“%s” is not published."
     729msgstr ""
     730
     731#. translators: %s: page title.
     732#: includes/class-overview.php:52
     733msgid "Edit the page"
     734msgstr ""
     735
     736#. translators: %s: page title.
     737#: includes/class-overview.php:56
     738#, php-format
     739msgid "“%s” has no PrintBlob designer block."
     740msgstr ""
     741
     742#. translators: %s: page title.
     743#: includes/class-overview.php:56
     744msgid "Add the block"
     745msgstr ""
     746
     747#. translators: %s: page title.
     748#: includes/class-overview.php:59
     749#, php-format
     750msgid "“%s” is published and shows the designer."
     751msgstr ""
     752
     753#: includes/class-overview.php:63
     754#: includes/class-quick-setup.php:500
     755msgid "Colours"
     756msgstr ""
     757
     758#: includes/class-overview.php:67
     759msgid "The colour attribute chosen in the settings does not exist."
     760msgstr ""
     761
     762#: includes/class-overview.php:67
     763#: includes/class-overview.php:90
     764msgid "Product attributes"
     765msgstr ""
     766
     767#: includes/class-overview.php:72
     768msgid "The colour attribute has no colours yet."
     769msgstr ""
     770
     771#: includes/class-overview.php:72
     772msgid "Add colours"
     773msgstr ""
     774
     775#. translators: 1: number of colours, 2: how many have a colour value, 3: how many have their own photo.
     776#: includes/class-overview.php:78
     777#, php-format
     778msgid "%1$d colour: %2$d with a colour value, %3$d with its own photo."
     779msgid_plural "%1$d colours: %2$d with a colour value, %3$d with their own photo."
     780msgstr[0] ""
     781msgstr[1] ""
     782
     783#: includes/class-overview.php:83
     784msgid "Edit colours"
     785msgstr ""
     786
     787#: includes/class-overview.php:83
     788msgid "Give each colour a value"
     789msgstr ""
     790
     791#: includes/class-overview.php:87
     792#: includes/class-quick-setup.php:512
     793msgid "Sizes"
     794msgstr ""
     795
     796#: includes/class-overview.php:90
     797msgid "The size attribute chosen in the settings does not exist. Without one, customers choose no size."
     798msgstr ""
     799
     800#. translators: %d: number of sizes.
     801#: includes/class-overview.php:99
     802#, php-format
     803msgid "%d size."
     804msgid_plural "%d sizes."
     805msgstr[0] ""
     806msgstr[1] ""
     807
     808#. translators: %d: number of sizes.
     809#: includes/class-overview.php:99
     810msgid "Edit sizes"
     811msgstr ""
     812
     813#. translators: %d: number of sizes.
     814#: includes/class-overview.php:99
     815msgid "Add sizes"
     816msgstr ""
     817
     818#: includes/class-overview.php:103
     819msgid "Products with the designer"
     820msgstr ""
     821
     822#: includes/class-overview.php:106
     823msgid "No product has the designer on. Edit a product, open its PrintBlob designer tab and turn the designer on."
     824msgstr ""
     825
     826#. translators: %d: number of products.
     827#: includes/class-overview.php:113
     828#, php-format
     829msgid "%d product:"
     830msgid_plural "%d products:"
     831msgstr[0] ""
     832msgstr[1] ""
     833
     834#: includes/class-overview.php:117
     835msgid "Default mockup"
     836msgstr ""
     837
     838#. translators: %s: mockup title.
     839#: includes/class-overview.php:122
     840#, php-format
     841msgid "“%s”, which products use unless they choose another."
     842msgstr ""
     843
     844#: includes/class-overview.php:123
     845msgid "The bundled product mockup is missing. It is made again the next time a shop manager opens the dashboard."
     846msgstr ""
     847
     848#: includes/class-overview.php:123
     849msgid "Dashboard"
     850msgstr ""
     851
     852#: includes/class-overview.php:132
     853msgid "Print files"
     854msgstr ""
     855
     856#: includes/class-overview.php:132
     857msgid "Site Health"
     858msgstr ""
     859
     860#: includes/class-overview.php:170
     861msgid "To do"
     862msgstr ""
     863
     864#: includes/class-overview.php:183
     865msgid "Set-up"
     866msgstr ""
     867
     868#: includes/class-overview.php:185
     869msgid "Quick setup: a designable product in one click"
     870msgstr ""
     871
     872#: includes/class-overview.php:204
     873msgid "Orders with designs"
     874msgstr ""
     875
     876#. translators: %d: number of orders.
     877#: includes/class-overview.php:208
     878#, php-format
     879msgid "%d order with a design this month."
     880msgid_plural "%d orders with designs this month."
     881msgstr[0] ""
     882msgstr[1] ""
     883
     884#. translators: %s: order number.
     885#: includes/class-overview.php:218
     886#: includes/class-print-queue.php:95
     887#, php-format
     888msgid "Order #%s"
     889msgstr ""
     890
     891#. translators: %d: number of print files.
     892#: includes/class-overview.php:227
     893#: includes/class-print-queue.php:69
     894#, php-format
     895msgid "%d print file"
     896msgid_plural "%d print files"
     897msgstr[0] ""
     898msgstr[1] ""
     899
     900#: includes/class-overview.php:233
     901msgid "No order has a design yet."
     902msgstr ""
     903
     904#. translators: %s: version number.
     905#: includes/class-overview.php:239
     906#, php-format
     907msgid "PrintBlob Pro %s is active."
     908msgstr ""
     909
     910#. translators: %s: version number.
     911#: includes/class-overview.php:240
     912msgid "Licence"
     913msgstr ""
     914
     915#: includes/class-print-queue.php:66
     916msgid "No processing order has a design waiting to print."
     917msgstr ""
     918
     919#. translators: %d: number of orders.
     920#: includes/class-print-queue.php:71
     921#, php-format
     922msgid "%d order"
     923msgid_plural "%d orders"
     924msgstr[0] ""
     925msgstr[1] ""
     926
     927#. translators: 1: number of print files, as "12 print files", 2: number of orders, as "5 orders".
     928#: includes/class-print-queue.php:73
     929#, php-format
     930msgid "You have %1$s in %2$s waiting: with PrintBlob Pro, one ZIP per order."
     931msgstr ""
     932
     933#. translators: 1: number of print files, as "12 print files", 2: number of orders, as "5 orders".
     934#: includes/class-print-queue.php:75
     935#, php-format
     936msgid "You have %1$s in %2$s waiting to print."
     937msgstr ""
     938
     939#. translators: %d: number of print files.
     940#: includes/class-print-queue.php:120
     941#, php-format
     942msgid "Download its %d print file as one ZIP"
     943msgid_plural "Download all %d print files of this order as one ZIP"
     944msgstr[0] ""
     945msgstr[1] ""
     946
     947#: includes/class-print-queue.php:121
     948msgid "Mark printed"
     949msgstr ""
     950
     951#. translators: %d: number of orders not listed.
     952#: includes/class-print-queue.php:133
     953#, php-format
     954msgid "%d more order is waiting."
     955msgid_plural "%d more orders are waiting."
     956msgstr[0] ""
     957msgstr[1] ""
    542958
    543959#: includes/class-privacy.php:32
    … …  
    582998msgstr ""
    583999
     1000#. translators: %d: days of PrintBlob Pro's free trial.
     1001#: includes/class-pro.php:60
     1002#, php-format
     1003msgid "Try PrintBlob Pro free for %d day"
     1004msgid_plural "Try PrintBlob Pro free for %d days"
     1005msgstr[0] ""
     1006msgstr[1] ""
     1007
     1008#. translators: 1: PrintBlob Pro's yearly price, e.g. $49, 2: its one-time price, e.g. $79.
     1009#: includes/class-pro.php:65
     1010#, php-format
     1011msgid "%1$s a year or %2$s once"
     1012msgstr ""
     1013
     1014#. translators: %d: days in which a PrintBlob Pro purchase is refunded in full.
     1015#: includes/class-pro.php:71
     1016#, php-format
     1017msgid "Full refund within %d day."
     1018msgid_plural "Full refund within %d days."
     1019msgstr[0] ""
     1020msgstr[1] ""
     1021
     1022#: includes/class-pro.php:75
     1023msgid "PrintBlob Pro is a separate plugin from printblob.com. Everything PrintBlob does works without it."
     1024msgstr ""
     1025
     1026#: includes/class-pro.php:101
     1027msgid "See it in 3D"
     1028msgstr ""
     1029
     1030#: includes/class-pro.php:124
     1031#: includes/class-pro.php:137
     1032#: includes/class-quick-setup.php:579
     1033#: includes/class-settings.php:140
     1034msgid "Compare free and Pro"
     1035msgstr ""
     1036
     1037#: includes/class-pro.php:140
     1038msgid "Show less"
     1039msgstr ""
     1040
     1041#: includes/class-pro.php:160
     1042msgid "A product with a printed design in PrintBlob Pro’s 3D view"
     1043msgstr ""
     1044
     1045#: includes/class-pro.php:176
     1046msgid "3D · Pro"
     1047msgstr ""
     1048
     1049#: includes/class-pro.php:177
     1050msgid "Only you see this, as the shop manager: your product in 3D with the PrintBlob Pro add-on, on printblob.com"
     1051msgstr ""
     1052
     1053#: includes/class-pro.php:200
     1054msgid "The designer on the product page or any page: photos, logos and text, moved, resized and rotated on the product"
     1055msgstr ""
     1056
     1057#: includes/class-pro.php:201
     1058msgid "Text typed on the product, in four bundled fonts"
     1059msgstr ""
     1060
     1061#: includes/class-pro.php:202
     1062msgid "Front printing on the bundled product, with its own print price"
     1063msgstr ""
     1064
     1065#: includes/class-pro.php:203
     1066msgid "Every colour of the product from one photo, and the Colours block"
     1067msgstr ""
     1068
     1069#: includes/class-pro.php:204
     1070msgid "A warning when a customer’s image is too small to print sharply"
     1071msgstr ""
     1072
     1073#: includes/class-pro.php:205
     1074msgid "A 300 DPI print file per side on every order, and the customer’s images as uploaded"
     1075msgstr ""
     1076
     1077#: includes/class-pro.php:206
     1078msgid "WooCommerce’s block cart and checkout, order emails and custom order tables"
     1079msgstr ""
     1080
     1081#: includes/class-pro.php:207
     1082msgid "Community support in the WordPress.org forum"
     1083msgstr ""
     1084
     1085#: includes/class-pro.php:240
     1086msgid "Included"
     1087msgstr ""
     1088
     1089#: includes/class-pro.php:241
     1090msgid "Not included"
     1091msgstr ""
     1092
     1093#: includes/class-pro.php:244
     1094msgid "PrintBlob and PrintBlob Pro"
     1095msgstr ""
     1096
     1097#: includes/class-pro.php:249
     1098msgid "What it does"
     1099msgstr ""
     1100
     1101#: includes/class-pro.php:250
     1102msgid "PrintBlob (free)"
     1103msgstr ""
     1104
     1105#. translators: %s: PrintBlob Pro's one-time price, e.g. $79.
     1106#: includes/class-pro.php:273
     1107#, php-format
     1108msgid "Buy once for %s"
     1109msgstr ""
     1110
     1111#: includes/class-pro.php:279
     1112msgid "PrintBlob Pro is active on this site."
     1113msgstr ""
     1114
     1115#: includes/class-pro.php:367
     1116msgid "3D view"
     1117msgstr ""
     1118
     1119#: includes/class-pro.php:370
     1120msgid "Left sleeve"
     1121msgstr ""
     1122
     1123#: includes/class-pro.php:371
     1124msgid "Right sleeve"
     1125msgstr ""
     1126
     1127#. translators: %s: product side, e.g. Left sleeve.
     1128#. translators: %s: product side (Front/Back).
     1129#: includes/class-pro.php:378
     1130#: includes/class-product-settings.php:226
     1131#, php-format
     1132msgid "Print price: %s"
     1133msgstr ""
     1134
     1135#: includes/class-pro.php:415
     1136msgid "See all Pro features"
     1137msgstr ""
     1138
     1139#: includes/class-pro.php:418
     1140msgid "Close"
     1141msgstr ""
     1142
     1143#: includes/class-product-settings.php:113
     1144msgid "Product with the PrintBlob designer"
     1145msgstr ""
     1146
    5841147#: includes/class-product-settings.php:114
     1148msgid "The page of a product with the PrintBlob designer turned on: customers design their print, choose colour and size, and add it to the cart."
     1149msgstr ""
     1150
     1151#: includes/class-product-settings.php:190
    5851152#: build/designer/index.js:1
    5861153msgid "PrintBlob designer"
    5871154msgstr ""
    5881155
    589 #: includes/class-product-settings.php:128
     1156#: includes/class-product-settings.php:204
    5901157#: includes/class-settings-page.php:24
    591 #: includes/class-settings-page.php:34
     1158#: includes/class-settings-page.php:35
    5921159msgid "Designer"
    5931160msgstr ""
    5941161
    595 #: includes/class-product-settings.php:129
     1162#: includes/class-product-settings.php:205
    5961163msgid "Customers design their own print on this product before adding it to the cart."
    5971164msgstr ""
    5981165
    599 #: includes/class-product-settings.php:139
    600 msgid "The product photo customers design on, with its print areas. Manage mockups under Products › Mockups."
    601 msgstr ""
    602 
    603 #. translators: %s: product side (Front/Back).
    604 #: includes/class-product-settings.php:150
    605 #, php-format
    606 msgid "Print price: %s"
    607 msgstr ""
    608 
    609 #: includes/class-product-settings.php:151
     1166#: includes/class-product-settings.php:215
     1167msgid "The product photo customers design on, with its print areas. The shop’s mockups are under PrintBlob › Mockups."
     1168msgstr ""
     1169
     1170#: includes/class-product-settings.php:227
    6101171msgid "Added to the product’s price when this side has a print."
    6111172msgstr ""
    6121173
    613 #: includes/class-review-request.php:66
     1174#: includes/class-quick-setup.php:41
     1175#: includes/class-quick-setup.php:466
     1176msgid "Quick setup"
     1177msgstr ""
     1178
     1179#: includes/class-quick-setup.php:117
     1180msgid "The form had expired. Open Quick setup again and run it from there."
     1181msgstr ""
     1182
     1183#: includes/class-quick-setup.php:120
     1184msgid "Only shop managers can run Quick setup."
     1185msgstr ""
     1186
     1187#: includes/class-quick-setup.php:148
     1188msgid "Give the product a name, and type its price and the print price as numbers, such as 18 and 6."
     1189msgstr ""
     1190
     1191#. translators: %s: mockup title.
     1192#: includes/class-quick-setup.php:155
     1193#: includes/class-quick-setup.php:163
     1194#, php-format
     1195msgid "Mockup “%s”"
     1196msgstr ""
     1197
     1198#: includes/class-quick-setup.php:159
     1199msgid "The bundled product mockup could not be added to the media library. Check that WordPress can write to the uploads folder (Tools › Site Health), then run Quick setup again."
     1200msgstr ""
     1201
     1202#: includes/class-quick-setup.php:192
     1203msgid "Printed with your own design."
     1204msgstr ""
     1205
     1206#: includes/class-quick-setup.php:217
     1207msgid "The product could not be saved. Check that WooCommerce is up to date and that Products › Add new works, then run Quick setup again."
     1208msgstr ""
     1209
     1210#. translators: %s: product name.
     1211#: includes/class-quick-setup.php:222
     1212#, php-format
     1213msgid "Product “%s”, with the designer on"
     1214msgstr ""
     1215
     1216#. translators: 1: number of variations, 2: number of colours, 3: number of sizes.
     1217#: includes/class-quick-setup.php:265
     1218#, php-format
     1219msgid "%1$d variations: %2$d colours in %3$d sizes"
     1220msgstr ""
     1221
     1222#. translators: %s: attribute name, e.g. Colour.
     1223#: includes/class-quick-setup.php:307
     1224#, php-format
     1225msgid "The %s attribute chosen is not one of the shop’s product attributes. Choose one from the list, or a new one."
     1226msgstr ""
     1227
     1228#. translators: %s: attribute name.
     1229#: includes/class-quick-setup.php:312
     1230#: includes/class-quick-setup.php:337
     1231#, php-format
     1232msgid "Attribute “%s”"
     1233msgstr ""
     1234
     1235#. translators: 1: attribute name, 2: WooCommerce's reason.
     1236#: includes/class-quick-setup.php:328
     1237#, php-format
     1238msgid "WooCommerce did not add the %1$s attribute: %2$s Add it under Products › Attributes, then choose it here."
     1239msgstr ""
     1240
     1241#. translators: 1: term name, e.g. Navy, 2: WordPress's reason.
     1242#: includes/class-quick-setup.php:349
     1243#, php-format
     1244msgid "“%1$s” could not be added: %2$s"
     1245msgstr ""
     1246
     1247#. translators: 1: attribute name, 2: term names, e.g. White, Black, Navy.
     1248#: includes/class-quick-setup.php:364
     1249#, php-format
     1250msgid "%1$s: %2$s"
     1251msgstr ""
     1252
     1253#. translators: %s: page title.
     1254#: includes/class-quick-setup.php:380
     1255#: includes/class-quick-setup.php:408
     1256#, php-format
     1257msgid "Designer page “%s”"
     1258msgstr ""
     1259
     1260#: includes/class-quick-setup.php:390
     1261msgid "Design your own"
     1262msgstr ""
     1263
     1264#. translators: %s: attribute name, e.g. Colour.
     1265#: includes/class-quick-setup.php:437
     1266#, php-format
     1267msgid "A new %s attribute"
     1268msgstr ""
     1269
     1270#. translators: %s: the shop's attribute name.
     1271#: includes/class-quick-setup.php:444
     1272#, php-format
     1273msgid "The shop’s “%s” attribute"
     1274msgstr ""
     1275
     1276#: includes/class-quick-setup.php:470
     1277msgid "Quick setup stopped:"
     1278msgstr ""
     1279
     1280#: includes/class-quick-setup.php:479
     1281msgid "Your shop is set up. Open the product and design on it."
     1282msgstr ""
     1283
     1284#: includes/class-quick-setup.php:483
     1285msgid "Made now"
     1286msgstr ""
     1287
     1288#: includes/class-quick-setup.php:487
     1289msgid "Already there, kept as it was"
     1290msgstr ""
     1291
     1292#: includes/class-quick-setup.php:491
     1293msgid "Open the product"
     1294msgstr ""
     1295
     1296#: includes/class-quick-setup.php:494
     1297msgid "One click makes a product your customers can design and order, on the bundled mockup. Choose what to use for each step: something new, or what your shop already has. Running it again makes nothing twice."
     1298msgstr ""
     1299
     1300#. translators: %s: colour names, e.g. White, Black, Navy.
     1301#: includes/class-quick-setup.php:506
     1302#, php-format
     1303msgid "Six colours, each with the colour value the designer recolours the product to: %s. Colours the attribute already has are kept."
     1304msgstr ""
     1305
     1306#. translators: %s: sizes, e.g. XS, S, M.
     1307#: includes/class-quick-setup.php:518
     1308#, php-format
     1309msgid "The sizes %s. Sizes the attribute already has are kept."
     1310msgstr ""
     1311
     1312#. translators: %s: currency symbol.
     1313#: includes/class-quick-setup.php:531
     1314#, php-format
     1315msgid "Price (%s)"
     1316msgstr ""
     1317
     1318#. translators: %s: currency symbol.
     1319#: includes/class-quick-setup.php:538
     1320#, php-format
     1321msgid "Front print price (%s)"
     1322msgstr ""
     1323
     1324#. translators: %s: product name.
     1325#: includes/class-quick-setup.php:548
     1326#, php-format
     1327msgid "“%s”, made by an earlier run, is kept: variations it lacks are added and the prices above apply to it."
     1328msgstr ""
     1329
     1330#: includes/class-quick-setup.php:549
     1331msgid "A variable product on the bundled mockup, with the designer on, a variation for every colour and size, and the mockup’s photos. Customers pay the price plus the print price when they print the front."
     1332msgstr ""
     1333
     1334#. translators: %s: page title.
     1335#: includes/class-quick-setup.php:563
     1336#, php-format
     1337msgid "“%s” stays the designer page."
     1338msgstr ""
     1339
     1340#: includes/class-quick-setup.php:564
     1341msgid "A page named “Design your own” with the designer block on the product, set as the designer page."
     1342msgstr ""
     1343
     1344#: includes/class-quick-setup.php:571
     1345msgid "Set up my shop"
     1346msgstr ""
     1347
     1348#: includes/class-quick-setup.php:577
     1349msgid "Your product has a back photo ready: turn on back printing, sleeves and the 3D view with PrintBlob Pro"
     1350msgstr ""
     1351
     1352#: includes/class-review-request.php:75
     1353msgid "Don’t ask again"
     1354msgstr ""
     1355
     1356#: includes/class-review-request.php:80
    6141357msgid "Your shop has its first order with a PrintBlob design. If PrintBlob is useful to you, a review on WordPress.org helps other shops find it."
    6151358msgstr ""
    6161359
    617 #: includes/class-review-request.php:68
     1360#. translators: %d: number of orders with designs.
     1361#: includes/class-review-request.php:82
     1362#, php-format
     1363msgid "Your shop has had %d orders with PrintBlob designs. If PrintBlob is useful to you, a review on WordPress.org helps other shops find it."
     1364msgstr ""
     1365
     1366#: includes/class-review-request.php:84
    6181367msgid "Write a review"
    6191368msgstr ""
    … …  
    6231372msgstr ""
    6241373
    625 #. translators: %s: link to Products › Mockups.
    626 #: includes/class-settings-page.php:37
    627 #, php-format
    628 msgid "Turn the designer on per product in its PrintBlob tab. Product photos and print areas are set up under %s."
    629 msgstr ""
    630 
    631 #: includes/class-settings-page.php:44
    632 msgid "Designer page"
    633 msgstr ""
    634 
    635 #: includes/class-settings-page.php:45
     1374#. translators: %s: link to PrintBlob › Mockups.
     1375#: includes/class-settings-page.php:38
     1376#, php-format
     1377msgid "Turn the designer on per product in its PrintBlob tab. The product photos and their print areas are under %s."
     1378msgstr ""
     1379
     1380#: includes/class-settings-page.php:46
    6361381msgid "Where the Colours block and colour links send customers. Leave empty to use the first page that contains the designer."
    6371382msgstr ""
    6381383
    639 #: includes/class-settings-page.php:53
     1384#: includes/class-settings-page.php:54
    6401385msgid "Colour attribute"
    6411386msgstr ""
    6421387
    643 #: includes/class-settings-page.php:54
     1388#: includes/class-settings-page.php:55
    6441389msgid "The product attribute whose terms are the product colours. Each colour gets a colour value and a photo on its edit screen."
    6451390msgstr ""
    6461391
    647 #: includes/class-settings-page.php:62
     1392#: includes/class-settings-page.php:63
    6481393msgid "Size attribute"
    6491394msgstr ""
    6501395
    651 #: includes/class-settings-page.php:63
     1396#: includes/class-settings-page.php:64
    6521397msgid "The product attribute that holds sizes, shown as size buttons in the designer."
    6531398msgstr ""
    6541399
    655 #: includes/class-settings-page.php:71
     1400#: includes/class-settings-page.php:72
    6561401msgid "Largest customer image (MB)"
    6571402msgstr ""
    6581403
    659 #: includes/class-settings-page.php:82
     1404#: includes/class-settings-page.php:83
    6601405msgid "Keep unordered designs (days)"
    6611406msgstr ""
    6621407
    663 #: includes/class-settings-page.php:83
     1408#: includes/class-settings-page.php:84
    6641409msgid "Designs added to a cart but never ordered are deleted after this many days. Ordered designs are kept with the order."
    6651410msgstr ""
    6661411
    667 #: includes/class-settings.php:40
    668 msgid "PrintBlob Pro: sleeves, print queue, your own fonts"
    669 msgstr ""
    670 
    671 #: includes/class-settings.php:56
    672 msgid "Settings"
    673 msgstr ""
    674 
    675 #: includes/class-settings.php:112
    676 msgid "PrintBlob Pro"
    677 msgstr ""
    678 
    679 #: includes/class-settings.php:115
    680 msgid "PrintBlob Pro adds a 3D view of the product, sleeve printing, a print queue that downloads every print file of an order as one ZIP, and your own fonts, with automatic updates and priority support. It is a separate plugin from printblob.com; everything here works without it."
    681 msgstr ""
    682 
    683 #: includes/class-settings.php:117
    684 msgid "PrintBlob Pro’s plans"
     1412#: includes/class-settings.php:41
     1413msgid "Rate PrintBlob ★★★★★"
     1414msgstr ""
     1415
     1416#. translators: %d: days of PrintBlob Pro's free trial.
     1417#: includes/class-settings.php:45
     1418#, php-format
     1419msgid "PrintBlob Pro add-on: the 3D view and more, free for %d day"
     1420msgid_plural "PrintBlob Pro add-on: the 3D view and more, free for %d days"
     1421msgstr[0] ""
     1422msgstr[1] ""
     1423
     1424#: includes/class-settings.php:123
     1425msgid "Upload your own fonts"
    6851426msgstr ""
    6861427
    6871428#: includes/class-shirt-colors.php:92
    6881429msgid "Product photo for this colour"
     1430msgstr ""
     1431
     1432#: includes/class-shirt-colors.php:93
     1433msgid "Use this photo"
     1434msgstr ""
     1435
     1436#: includes/class-shirt-colors.php:103
     1437msgid "Choose photo"
    6891438msgstr ""
    6901439
  • printblob/trunk/package.json

    r3751165 r3751408  
    99                "./build": "./build.mts",
    1010                "./designer/*.js": "./src/designer/app/*.ts",
     11                "./admin/*.js": "./src/admin/*.ts",
    1112                "./designer.scss": {
    1213                        "types": "./src/designer/stylesheet.d.ts",
  • printblob/trunk/printblob.php

    r3751165 r3751408  
    33 * Plugin Name:       PrintBlob – Product Designer for WooCommerce
    44 * Plugin URI:        https://printblob.com/
    5  * Description:       Customers design their own print on your products — photos, logos and text on the front and back — see it on the real product, and order it through WooCommerce with a print-ready file attached to the order.
    6  * Version:           1.2.6
     5 * Description:       Customers design their own t-shirt print — photos, logos and text — see it on the t-shirt, and order it through WooCommerce with a print-ready file attached to the order.
     6 * Version:           1.3.0
    77 * Requires at least: 7.0
    88 * Requires PHP:      7.4
    … …  
    3939require_once __DIR__ . '/includes/class-privacy.php';
    4040require_once __DIR__ . '/includes/class-review-request.php';
     41require_once __DIR__ . '/includes/class-pro.php';
     42require_once __DIR__ . '/includes/class-admin-menu.php';
     43require_once __DIR__ . '/includes/class-overview.php';
     44require_once __DIR__ . '/includes/class-print-queue.php';
     45require_once __DIR__ . '/includes/class-dashboard-widget.php';
     46require_once __DIR__ . '/includes/class-order-milestones.php';
     47require_once __DIR__ . '/includes/class-quick-setup.php';
     48require_once __DIR__ . '/includes/class-deactivation-feedback.php';
    4149
    4250add_action(
    … …  
    5664                Privacy::register();
    5765                Review_Request::register();
     66                Pro::register();
     67                Admin_Menu::register();
     68                Dashboard_Widget::register();
     69                Order_Milestones::register();
     70                Quick_Setup::register();
     71                Deactivation_Feedback::register();
    5872        }
    5973);
  • printblob/trunk/readme.txt

    r3751165 r3751408  
    55Tested up to: 7.1
    66Requires PHP: 7.4
    7 Stable tag: 1.2.6
     7Stable tag: 1.3.0
    88License: GPL-2.0-or-later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    1010
    11 Let customers design their own print — photos, logos and text — on your real product photos, and receive a print-ready 300 DPI file with every order.
     11Let customers design their own t-shirt print — photos, logos and text — and receive a print-ready 300 DPI file with every order.
    1212
    1313== Description ==
    1414
    15 Try it before you install: the [live demo on printblob.com](https://printblob.com/#demo) runs this exact designer.
     15Try it before you install: the [live demo on printblob.com](https://printblob.com/#demo) runs this designer, with PrintBlob Pro's back printing and 3D view added.
    1616
    17 PrintBlob adds a product designer to WooCommerce. Customers upload a photo or logo, type text in a choice of fonts, move and resize everything on the front and back of your product, pick a colour and size, and see the price update as they go. When they order, you get a print-ready PNG at 300 DPI for each printed side, attached to the order.
     17PrintBlob adds a product designer to WooCommerce. Customers upload a photo or logo, type text in a choice of fonts, move and resize everything on the front of the t-shirt, pick a colour and size, and see the price update as they go. When they order, you get a print-ready PNG at 300 DPI for each printed side, attached to the order.
    1818
    19 * **Your own product photos.** Set up mockups under Products › Mockups: a photo per side, the print area drawn right on the photo, and the real print size in centimetres.
    20 * **Every colour from one photo.** Photograph the product once in white; PrintBlob recolours it to each colour of your colour attribute, keeping folds and shading.
     19* **A t-shirt, ready to sell.** The bundled t-shirt mockup, front and back photos with its print area and real print size set, is ready the moment you activate. PrintBlob › Mockups shows it with its print area drawn on the photo.
     20* **Every colour from one photo.** The white t-shirt is recoloured to each colour of your colour attribute, keeping folds and shading.
    2121* **Print-ready files.** Each printed side becomes a transparent PNG at exactly the print size, 300 DPI. Customers are warned when an image is too small to print sharply.
    2222* **Works with WooCommerce.** Variable products, the block cart and checkout, order emails and the order screen (with download links for the print files). Compatible with High-Performance Order Storage.
    … …  
    2626= PrintBlob Pro =
    2727
    28 The [PrintBlob Pro](https://printblob.com/) add-on adds a 3D view of the product, made from the same front and back photos, sleeve printing, a production print queue and your own fonts.
     28The [PrintBlob Pro](https://printblob.com/) add-on adds your own products (mugs, hoodies, bags, on your own photos, with the print area drawn on each and its real print size), back printing, a 3D view of the product made from its front and back photos, sleeve printing, a production print queue and your own fonts.
    2929
    3030= Privacy =
    3131
    32 PrintBlob does not send data to any outside service. Customer images and designs are stored on your site: previews in the media library, print files in a protected folder. Designs that never become an order are deleted after the number of days set in the settings.
     32PrintBlob sends nothing to any outside service, with one exception you choose: when you deactivate it, a box asks why you are leaving. "Skip and deactivate" sends nothing. Only if you press "Send and deactivate" does it send printblob.com the reason you chose, your note, your email address if you typed one, the PrintBlob version and your WordPress language; never your site's address or your customers' data. How long printblob.com keeps it is in its privacy policy: https://printblob.com/legal/privacy/. Customer images and designs are stored on your site: previews in the media library, print files in a protected folder. Designs that never become an order are deleted after the number of days set in the settings.
    3333
    3434= Copyright =
    … …  
    4747
    48481. Install PrintBlob from Plugins › Add Plugin (search for "PrintBlob") and activate it. WooCommerce must be active.
    49 2. Open Products › Mockups. A t-shirt mockup is ready to use; add your own photos and print areas as needed.
     492. Open PrintBlob › Mockups. The t-shirt mockup is ready to use; your own products and photos come with PrintBlob Pro.
    50503. Edit a product, open its PrintBlob designer tab, turn the designer on, choose a mockup and set the print price per side.
    51514. Add colour values and photos to the terms of your colour attribute (Products › Attributes).
    … …  
    8989
    9090== Changelog ==
     91
     92= 1.3.0 =
     93* A PrintBlob menu with its own Overview: each set-up step marked done or to do, with the link that fixes it, the latest orders with designs, and this month's count. The same overview is under WooCommerce › PrintBlob.
     94* Quick setup: one click makes a designable product on the bundled t-shirt, with a colour and a size attribute, its variations and a designer page. Each step can use what the shop already has, and running it again makes nothing twice.
     95* The designer now shows on the product page of a designer product in any theme: block themes get a "Product with the PrintBlob designer" template, classic themes get the designer in place of the photos and summary.
     96* A Print queue screen lists processing orders with designs and their print files; a "PrintBlob this week" dashboard widget counts them.
     97* PrintBlob prints the front of the bundled t-shirt. Back printing and your own products (the mockup editor) are now part of the PrintBlob Pro add-on, beside sleeves, the 3D view and the print queue. Orders placed with a back print keep their print files, and mockups made earlier keep working.
     98* PrintBlob's own screens show what PrintBlob Pro adds, with its free trial, and a page compares free and Pro.
     99* When PrintBlob is deactivated, a box asks why. Nothing is sent unless the person presses Send.
    91100
    92101= 1.2.6 =
    … …  
    137146* The bundled t-shirt mockup's print areas are in assets/mockups/tee.json.
    138147
    139 = 1.1.2 =
    140 * In themes with a dark mode, the designer's Front and Back switch, its 3D button and its quieter buttons follow the dark colours: they stayed light, with light text that could not be read.
     148== Upgrade Notice ==
    141149
    142 = 1.1.1 =
    143 * Saving designs is limited per shopper and per IP (30 and 300 an hour; filter `printblob_design_save_limits`), since every save stores files on the shop's server.
    144 * A design preview larger than a browser makes is refused before it is processed.
    145 * A design that fails part-way through saving leaves no files behind.
    146 * Unordered designs are cleaned up twice a day, in batches until none are left, instead of 200 a day.
    147 * Site Health checks that print files cannot be downloaded from the web, and gives the nginx rule when they can.
    148 * Designs are part of WordPress's Export and Erase Personal Data tools (ordered designs follow WooCommerce's setting for order data), are deleted with their order, and the privacy policy guide says what is stored.
    149 * The 3D button is shown only where the browser draws 3D on a graphics processor; where it would draw it in software and stutter, the designer works without it.
    150 * Copyright: microcompanies, LLC.
    151 
    152 = 1.1.0 =
    153 * New: a 3D view in the designer. The 3D button turns the product into a garment on a hanger, made from the mockup's front and back photos, with the customer's design printed on each side; drag to turn it, or use Front and Back. Its code loads only when it is opened. It can be turned off under WooCommerce › Settings › PrintBlob.
    154 * The bundled t-shirt mockup has its own photo of the back (until now the front photo was used for both sides). Shops still using the bundled photos get it automatically; photos a shop uploaded are never changed.
    155 * Mockups can record where the garment is open (sleeve ends, hem, neck) for the 3D view; the bundled t-shirt comes with them.
    156 
    157 Older entries are in changelog.txt.
    158 
    159 == Upgrade Notice ==
     150= 1.3.0 =
     151Back printing and editing your own mockups move to the PrintBlob Pro add-on; existing orders and mockups keep working. Adds the PrintBlob menu, Quick setup and the designer on product pages in any theme.
    160152
    161153= 1.2.3 =
  • printblob/trunk/src/admin/term-image.ts

    r3750583 r3751408  
    11/* Media library picker for the colour term's shirt photo. */
    22import $ from 'jquery';
     3import { chooseImage, type MediaLabels } from './media.ts';
     4
     5declare const printblobTermImage: MediaLabels;
    36
    47$( document ).on( 'click', '[data-printblob-term-image] [data-printblob-choose]', function ( event ) {
    58        event.preventDefault();
    69        const field = $( this ).closest( '[data-printblob-term-image]' );
    7         const frame = wp.media( {
    8                 title: window.printblobTermImage.title,
    9                 button: { text: window.printblobTermImage.button },
    10                 library: { type: 'image' },
    11                 multiple: false,
    12         } );
    13         frame.on( 'select', function () {
    14                 const image = frame.state().get( 'selection' ).first().toJSON();
     10        chooseImage( printblobTermImage, ( image ) => {
    1511                const preview = image.sizes?.thumbnail?.url ?? image.url;
    1612                field.find( 'input[name="printblob_image"]' ).val( image.id );
    … …  
    1814                field.find( '[data-printblob-remove]' ).prop( 'hidden', false );
    1915        } );
    20         frame.open();
    2116} );
    2217
  • printblob/trunk/src/designer/app/App.tsx

    r3751165 r3751408  
    427427                        <div className="printblob-designer__stage-column">
    428428                                <div className="printblob-designer__views">
    429                                         <div className="printblob-designer__sides" role="tablist" aria-label={ __( 'Printed side', 'printblob' ) }>
    430                                                 { config.sides.map( ( entry ) => (
    431                                                         <button
    432                                                                 key={ entry.key }
    433                                                                 type="button"
    434                                                                 role="tab"
    435                                                                 aria-selected={ side === entry.key }
    436                                                                 className="printblob-designer__side"
    437                                                                 onClick={ () => switchSide( entry.key ) }
    438                                                                 disabled={ ! ready || busy }
    439                                                         >
    440                                                                 { entry.label }
    441                                                                 <span
    442                                                                         className={ filled[ entry.key ] ? 'printblob-designer__side-dot is-shown' : 'printblob-designer__side-dot' }
    443                                                                         aria-label={ filled[ entry.key ] ? __( 'has a print', 'printblob' ) : undefined }
    444                                                                 />
    445                                                         </button>
    446                                                 ) ) }
    447                                         </div>
     429                                        { config.sides.length > 1 && (
     430                                                <div className="printblob-designer__sides" role="tablist" aria-label={ __( 'Printed side', 'printblob' ) }>
     431                                                        { config.sides.map( ( entry ) => (
     432                                                                <button
     433                                                                        key={ entry.key }
     434                                                                        type="button"
     435                                                                        role="tab"
     436                                                                        aria-selected={ side === entry.key }
     437                                                                        className="printblob-designer__side"
     438                                                                        onClick={ () => switchSide( entry.key ) }
     439                                                                        disabled={ ! ready || busy }
     440                                                                >
     441                                                                        { entry.label }
     442                                                                        <span
     443                                                                                className={ filled[ entry.key ] ? 'printblob-designer__side-dot is-shown' : 'printblob-designer__side-dot' }
     444                                                                                aria-label={ filled[ entry.key ] ? __( 'has a print', 'printblob' ) : undefined }
     445                                                                        />
     446                                                                </button>
     447                                                        ) ) }
     448                                                </div>
     449                                        ) }
    448450                                        { views.map( ( view ) => (
    449451                                                <button
    … …  
    458460                                                </button>
    459461                                        ) ) }
     462                                        { config.proChip && (
     463                                                <a className="printblob-designer__pro-chip" href={ config.proChip.href } title={ config.proChip.title } target="_blank" rel="noopener">
     464                                                        { config.proChip.label }
     465                                                </a>
     466                                        ) }
    460467                                </div>
    461468                                <div className="printblob-designer__stage" style={ { aspectRatio: `${ tallest.stage.width } / ${ tallest.stage.height }` } }>
  • printblob/trunk/src/designer/app/sides.ts

    r3750583 r3751408  
    33import type { PrintSide, Size } from './types.ts';
    44
     5/** The sides PrintBlob prints, by key; add-ons add others. */
     6export const PRINTED_SIDES: readonly string[] = designer.sides;
    57export const STAGE_WIDTH = designer.stage_width;
    68export const PRINT_DPI = designer.print_dpi;
  • printblob/trunk/src/designer/app/types.ts

    r3750583 r3751408  
    9494        cart: string;
    9595        [endpoint: string]: unknown;
     96}
     97
     98export interface ProChip {
     99        label: string;
     100        title: string;
     101        href: string;
    96102}
    97103
    … …  
    118124        tools?: ListedExtension[];
    119125        options?: DesignerOption[];
     126        /** The "3D · Pro" link the host shows a shop manager while PrintBlob Pro is not active; never sent to customers. */
     127        proChip?: ProChip;
    120128        currency: CurrencyConfig;
    121129        endpoints: DesignerEndpoints;
  • printblob/trunk/src/designer/render.php

    r3751165 r3751408  
    149149$printblob_config = (array) apply_filters( 'printblob_designer_config', $printblob_config, $printblob_product );
    150150
     151// The "3D · Pro" link, for a shop manager while PrintBlob Pro is not active: decided here, so customers' pages never carry it.
     152$printblob_pro_chip = Pro::storefront_chip();
     153if ( $printblob_pro_chip ) {
     154        $printblob_config['proChip'] = $printblob_pro_chip;
     155}
     156
    151157// A variation that depends on an attribute the designer doesn't offer could only be ordered as the wrong one.
    152158$printblob_offered   = array_merge(
    … …  
    210216                <div class="printblob-designer__stage-column">
    211217                        <div class="printblob-designer__views" aria-hidden="true">
    212                                 <div class="printblob-designer__sides">
    213                                         <?php foreach ( $printblob_sides as $printblob_index => $printblob_entry ) : ?>
    214                                                 <span class="printblob-designer__side<?php echo 0 === $printblob_index ? ' is-current' : ''; ?>"><?php echo esc_html( (string) $printblob_entry['label'] ); ?><span class="printblob-designer__side-dot"></span></span>
    215                                         <?php endforeach; ?>
    216                                 </div>
     218                                <?php if ( count( $printblob_sides ) > 1 ) : ?>
     219                                        <div class="printblob-designer__sides">
     220                                                <?php foreach ( $printblob_sides as $printblob_index => $printblob_entry ) : ?>
     221                                                        <span class="printblob-designer__side<?php echo 0 === $printblob_index ? ' is-current' : ''; ?>"><?php echo esc_html( (string) $printblob_entry['label'] ); ?><span class="printblob-designer__side-dot"></span></span>
     222                                                <?php endforeach; ?>
     223                                        </div>
     224                                <?php endif; ?>
    217225                                <?php foreach ( (array) ( $printblob_config['views'] ?? array() ) as $printblob_view ) : ?>
    218226                                        <span class="printblob-designer__side printblob-designer__side--view printblob-designer__side--<?php echo esc_attr( (string) $printblob_view['key'] ); ?>"><?php echo esc_html( (string) $printblob_view['label'] ); ?></span>
    219227                                <?php endforeach; ?>
     228                                <?php if ( $printblob_pro_chip ) : ?>
     229                                        <a class="printblob-designer__pro-chip" href="<?php echo esc_url( $printblob_pro_chip['href'] ); ?>" title="<?php echo esc_attr( $printblob_pro_chip['title'] ); ?>" target="_blank" rel="noopener" tabindex="-1"><?php echo esc_html( $printblob_pro_chip['label'] ); ?></a>
     230                                <?php endif; ?>
    220231                        </div>
    221232                        <div class="printblob-designer__stage" style="aspect-ratio: <?php echo (int) $printblob_tallest['stage']['width']; ?> / <?php echo (int) $printblob_tallest['stage']['height']; ?>">
  • printblob/trunk/src/designer/view.scss

    r3751165 r3751408  
    135135}
    136136
     137// The shop manager's link to PrintBlob Pro's 3D view (Pro::storefront_chip()):
     138// customers never get it.
     139.printblob-designer__pro-chip {
     140        display: inline-flex;
     141        align-items: center;
     142        padding: 0.5rem 0.9rem;
     143        border-radius: 999px;
     144        box-shadow: inset 0 0 0 1px var(--printblob-seam);
     145        color: var(--printblob-cobalt);
     146        font-size: 0.875em;
     147        font-weight: 640;
     148        letter-spacing: 0.02em;
     149        line-height: 1.2;
     150        text-decoration: none;
     151
     152        &:focus-visible {
     153                outline: 2px solid var(--printblob-cobalt);
     154                outline-offset: 2px;
     155        }
     156}
     157
    137158// Always in the tab, shown once the side has a print, so the tab keeps its width.
    138159.printblob-designer__side-dot {
  • printblob/trunk/uninstall.php

    r3750583 r3751408  
    1313global $wpdb;
    1414
    15 foreach ( array( 'printblob_designer_page', 'printblob_color_attribute', 'printblob_size_attribute', 'printblob_max_upload_mb', 'printblob_keep_unordered_days', 'printblob_default_mockup', 'printblob_bundled_photo', 'printblob_show_welcome', 'printblob_review_request' ) as $printblob_option ) {
     15foreach ( array( 'printblob_designer_page', 'printblob_color_attribute', 'printblob_size_attribute', 'printblob_max_upload_mb', 'printblob_keep_unordered_days', 'printblob_default_mockup', 'printblob_bundled_photo', 'printblob_show_welcome', 'printblob_review_request', 'printblob_order_milestone_dismissed', 'printblob_quick_setup' ) as $printblob_option ) {
    1616        delete_option( $printblob_option );
    1717}
    1818$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", $wpdb->esc_like( '_transient_printblob_saves_' ) . '%', $wpdb->esc_like( '_transient_timeout_printblob_saves_' ) . '%' ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall: the hourly design-save counters carry a hash and the hour in their names, no API deletes transients by prefix, and nothing is cached afterwards.
    1919wp_clear_scheduled_hook( 'printblob_cleanup_designs' );
    20 delete_metadata( 'user', 0, 'printblob_pro_hint_dismissed', '', true );
     20delete_transient( 'printblob_print_folder_check' );
     21foreach ( get_users(
     22        array(
     23                'capability' => 'manage_woocommerce',
     24                'fields'     => 'ID',
     25        )
     26) as $printblob_user ) {
     27        delete_transient( 'printblob_quick_setup_result_' . $printblob_user );
     28}
     29foreach ( array( 'printblob_pro_hint_dismissed', 'printblob_pro_card_dismissed', 'printblob_dashboard_dismissed' ) as $printblob_user_meta ) {
     30        delete_metadata( 'user', 0, $printblob_user_meta, '', true );
     31}
    2132
    2233// Every post of a type, or every attachment of a post, by ID.
  • printblob/trunk/webpack.config.mts

    r3750583 r3751408  
    1414import { INK_COLORS } from './src/designer/app/ink.ts';
    1515
    16 const admin = { 'admin/mockup-editor': './src/admin/mockup-editor.ts', 'admin/term-image': './src/admin/term-image.ts' };
     16const admin = { 'admin/term-image': './src/admin/term-image.ts', 'admin/pro-box': './src/admin/pro-box.ts' };
    1717
    1818const withAdmin = async ( entry: Configuration[ 'entry' ] ): Promise< EntryObject > => {
Note: See TracChangeset for help on using the changeset viewer.