Changeset 3751408
- Timestamp:
- 10/17/2026 04:36:54 AM (17 hours ago)
- Location:
- printblob
- Files:
-
- 36 added
- 10 deleted
- 64 edited
- 1 copied
-
tags/1.3.0 (copied) (copied from printblob/trunk )
-
tags/1.3.0/assets/admin/admin.css (added)
-
tags/1.3.0/assets/admin/deactivation-feedback.css (added)
-
tags/1.3.0/assets/admin/deactivation-feedback.js (added)
-
tags/1.3.0/assets/admin/mockup-editor.css (deleted)
-
tags/1.3.0/assets/admin/mockups.css (added)
-
tags/1.3.0/assets/admin/pro-3d.webp (added)
-
tags/1.3.0/assets/designer.json (modified) (1 diff)
-
tags/1.3.0/assets/mockups/shirt.json (added)
-
tags/1.3.0/build/admin/mockup-editor.asset.php (deleted)
-
tags/1.3.0/build/admin/mockup-editor.js (deleted)
-
tags/1.3.0/build/admin/pro-box.asset.php (added)
-
tags/1.3.0/build/admin/pro-box.js (added)
-
tags/1.3.0/build/admin/term-image.asset.php (modified) (1 diff)
-
tags/1.3.0/build/admin/term-image.js (modified) (1 diff)
-
tags/1.3.0/build/designer/render.php (modified) (2 diffs)
-
tags/1.3.0/build/designer/view-rtl.css (modified) (1 diff)
-
tags/1.3.0/build/designer/view.asset.php (modified) (1 diff)
-
tags/1.3.0/build/designer/view.css (modified) (1 diff)
-
tags/1.3.0/build/designer/view.js (modified) (2 diffs)
-
tags/1.3.0/changelog.txt (modified) (1 diff)
-
tags/1.3.0/includes/class-admin-menu.php (added)
-
tags/1.3.0/includes/class-cart.php (modified) (1 diff)
-
tags/1.3.0/includes/class-dashboard-widget.php (added)
-
tags/1.3.0/includes/class-deactivation-feedback.php (added)
-
tags/1.3.0/includes/class-design-store.php (modified) (1 diff)
-
tags/1.3.0/includes/class-designer-data.php (modified) (2 diffs)
-
tags/1.3.0/includes/class-mockups.php (modified) (7 diffs)
-
tags/1.3.0/includes/class-onboarding.php (modified) (2 diffs)
-
tags/1.3.0/includes/class-order-milestones.php (added)
-
tags/1.3.0/includes/class-order.php (modified) (1 diff)
-
tags/1.3.0/includes/class-overview.php (added)
-
tags/1.3.0/includes/class-print-queue.php (added)
-
tags/1.3.0/includes/class-pro.php (added)
-
tags/1.3.0/includes/class-product-settings.php (modified) (5 diffs)
-
tags/1.3.0/includes/class-quick-setup.php (added)
-
tags/1.3.0/includes/class-review-request.php (modified) (4 diffs)
-
tags/1.3.0/includes/class-settings-page.php (modified) (3 diffs)
-
tags/1.3.0/includes/class-settings.php (modified) (4 diffs)
-
tags/1.3.0/includes/facts.json (modified) (1 diff)
-
tags/1.3.0/languages/printblob.pot (modified) (20 diffs)
-
tags/1.3.0/package.json (modified) (1 diff)
-
tags/1.3.0/printblob.php (modified) (3 diffs)
-
tags/1.3.0/readme.txt (modified) (5 diffs)
-
tags/1.3.0/src/admin/media.d.ts (deleted)
-
tags/1.3.0/src/admin/media.ts (added)
-
tags/1.3.0/src/admin/mockup-editor.ts (deleted)
-
tags/1.3.0/src/admin/pro-box.ts (added)
-
tags/1.3.0/src/admin/term-image.ts (modified) (2 diffs)
-
tags/1.3.0/src/designer/app/App.tsx (modified) (2 diffs)
-
tags/1.3.0/src/designer/app/sides.ts (modified) (1 diff)
-
tags/1.3.0/src/designer/app/types.ts (modified) (2 diffs)
-
tags/1.3.0/src/designer/render.php (modified) (2 diffs)
-
tags/1.3.0/src/designer/view.scss (modified) (1 diff)
-
tags/1.3.0/uninstall.php (modified) (1 diff)
-
tags/1.3.0/webpack.config.mts (modified) (1 diff)
-
trunk/assets/admin/admin.css (added)
-
trunk/assets/admin/deactivation-feedback.css (added)
-
trunk/assets/admin/deactivation-feedback.js (added)
-
trunk/assets/admin/mockup-editor.css (deleted)
-
trunk/assets/admin/mockups.css (added)
-
trunk/assets/admin/pro-3d.webp (added)
-
trunk/assets/designer.json (modified) (1 diff)
-
trunk/assets/mockups/shirt.json (added)
-
trunk/build/admin/mockup-editor.asset.php (deleted)
-
trunk/build/admin/mockup-editor.js (deleted)
-
trunk/build/admin/pro-box.asset.php (added)
-
trunk/build/admin/pro-box.js (added)
-
trunk/build/admin/term-image.asset.php (modified) (1 diff)
-
trunk/build/admin/term-image.js (modified) (1 diff)
-
trunk/build/designer/render.php (modified) (2 diffs)
-
trunk/build/designer/view-rtl.css (modified) (1 diff)
-
trunk/build/designer/view.asset.php (modified) (1 diff)
-
trunk/build/designer/view.css (modified) (1 diff)
-
trunk/build/designer/view.js (modified) (2 diffs)
-
trunk/changelog.txt (modified) (1 diff)
-
trunk/includes/class-admin-menu.php (added)
-
trunk/includes/class-cart.php (modified) (1 diff)
-
trunk/includes/class-dashboard-widget.php (added)
-
trunk/includes/class-deactivation-feedback.php (added)
-
trunk/includes/class-design-store.php (modified) (1 diff)
-
trunk/includes/class-designer-data.php (modified) (2 diffs)
-
trunk/includes/class-mockups.php (modified) (7 diffs)
-
trunk/includes/class-onboarding.php (modified) (2 diffs)
-
trunk/includes/class-order-milestones.php (added)
-
trunk/includes/class-order.php (modified) (1 diff)
-
trunk/includes/class-overview.php (added)
-
trunk/includes/class-print-queue.php (added)
-
trunk/includes/class-pro.php (added)
-
trunk/includes/class-product-settings.php (modified) (5 diffs)
-
trunk/includes/class-quick-setup.php (added)
-
trunk/includes/class-review-request.php (modified) (4 diffs)
-
trunk/includes/class-settings-page.php (modified) (3 diffs)
-
trunk/includes/class-settings.php (modified) (4 diffs)
-
trunk/includes/facts.json (modified) (1 diff)
-
trunk/languages/printblob.pot (modified) (20 diffs)
-
trunk/package.json (modified) (1 diff)
-
trunk/printblob.php (modified) (3 diffs)
-
trunk/readme.txt (modified) (5 diffs)
-
trunk/src/admin/media.d.ts (deleted)
-
trunk/src/admin/media.ts (added)
-
trunk/src/admin/mockup-editor.ts (deleted)
-
trunk/src/admin/pro-box.ts (added)
-
trunk/src/admin/term-image.ts (modified) (2 diffs)
-
trunk/src/designer/app/App.tsx (modified) (2 diffs)
-
trunk/src/designer/app/sides.ts (modified) (1 diff)
-
trunk/src/designer/app/types.ts (modified) (2 diffs)
-
trunk/src/designer/render.php (modified) (2 diffs)
-
trunk/src/designer/view.scss (modified) (1 diff)
-
trunk/uninstall.php (modified) (1 diff)
-
trunk/webpack.config.mts (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
printblob/tags/1.3.0/assets/designer.json
r3750583 r3751408 1 1 { 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" ], 3 4 "stage_width": 1000, 4 5 "print_dpi": 300, -
printblob/tags/1.3.0/build/admin/term-image.asset.php
r3750583 r3751408 3 3 'jquery' 4 4 ), 5 'version' => ' e08ff7b792227bd5f4fa'5 'version' => '26adf56b3d5ffb32e043' 6 6 ); -
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 149 149 $printblob_config = (array) apply_filters( 'printblob_designer_config', $printblob_config, $printblob_product ); 150 150 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(); 153 if ( $printblob_pro_chip ) { 154 $printblob_config['proChip'] = $printblob_pro_chip; 155 } 156 151 157 // A variation that depends on an attribute the designer doesn't offer could only be ordered as the wrong one. 152 158 $printblob_offered = array_merge( … … 210 216 <div class="printblob-designer__stage-column"> 211 217 <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; ?> 217 225 <?php foreach ( (array) ( $printblob_config['views'] ?? array() ) as $printblob_view ) : ?> 218 226 <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> 219 227 <?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; ?> 220 231 </div> 221 232 <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 6 6 'wp-i18n' 7 7 ), 8 'version' => ' 60ca96706854fdd0ab81'8 'version' => 'da6fbaf91134b31e3aec' 9 9 ); -
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 2 2 (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. */ 3 3 (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,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">");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,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">");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. */ 5 5 (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. */ 6 6 (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. */ … … 8 8 (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. */ 9 9 (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. */ 11 11 (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 2 2 3 3 The 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 23 Older entries are in changelog.txt. 4 24 5 25 = 1.0.3 = -
printblob/tags/1.3.0/includes/class-cart.php
r3750583 r3751408 60 60 } 61 61 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 */ 63 68 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 ) ) { 65 70 return array(); 66 71 } 67 72 $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(); 69 74 } 70 75 -
printblob/tags/1.3.0/includes/class-design-store.php
r3750583 r3751408 543 543 public static function mark_ordered( int $design_id, int $order_id ): void { 544 544 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 ) ) ); 545 596 } 546 597 -
printblob/tags/1.3.0/includes/class-designer-data.php
r3750583 r3751408 3 3 * The designer's data, written once in assets/ and read by its TypeScript and every host too: its fixed numbers 4 4 * (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). 6 6 * 7 7 * @package PrintBlob … … 25 25 } 26 26 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 27 32 /** A printed length in centimetres as pixels of the print file. */ 28 33 public static function print_pixels( float $cm ): int { -
printblob/tags/1.3.0/includes/class-mockups.php
r3750583 r3751408 3 3 * Mockups: the product photos customers design on. 4 4 * 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`). 8 10 * 9 11 * Print areas are stored as fractions of the photo (0–1), so any photo size works. The designer works on … … 23 25 public const PRODUCT_META = '_printblob_mockup'; 24 26 public const DEFAULT_OPTION = 'printblob_default_mockup'; 27 public const PAGE = 'printblob-mockups'; 28 public const STYLE = 'printblob-mockups'; 25 29 26 30 /** Revision of the bundled photos the default mockup has been upgraded to (see use_bundled_photos()). */ 27 31 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 = ''; 28 35 29 36 /** … … 34 41 public static function sides(): array { 35 42 /** 36 * Filters the printable sides of products. Add-ons can add sides (e.g. sleeves); each side gets its37 * 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. 38 45 * 39 46 * @param string[] $sides Side keys in display order. 40 47 */ 41 $sides = (array) apply_filters( 'printblob_sides', array( 'front', 'back' ));48 $sides = (array) apply_filters( 'printblob_sides', Designer_Data::numbers()['sides'] ); 42 49 return array_values( array_unique( array_map( 'sanitize_key', $sides ) ) ); 43 50 } … … 47 54 add_action( 'admin_init', array( __CLASS__, 'ensure_default' ) ); 48 55 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' ) ); 51 57 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 );54 58 } 55 59 … … 71 75 ), 72 76 'public' => false, 73 'show_ui' => true,74 'show_in_menu' => 'edit.php?post_type=product',77 'show_ui' => false, 78 'show_in_menu' => false, 75 79 'supports' => array( 'title' ), 76 80 'capability_type' => 'product', … … 218 222 } 219 223 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 220 230 /** Kept for setup scripts written for 1.0.2: the same upgrade as use_bundled_photos(). */ 221 231 public static function use_bundled_webp(): void { … … 353 363 /* ---------------------------------------------------------------- Admin */ 354 364 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 ); 358 377 return; 359 378 } 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 { 381 403 ?> 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> 403 432 <?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> 420 434 <?php endforeach; ?> 421 435 </div> 422 436 <?php 423 437 } 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 }478 438 } -
printblob/tags/1.3.0/includes/class-onboarding.php
r3750583 r3751408 3 3 * First steps after activation: a dismissible notice with the three things to set up. 4 4 * 5 * Shown to shop managers on the Plugins screen and PrintBlob's own screens (its settings tab and the mockups) until6 * 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. 7 7 * 8 8 * @package PrintBlob … … 31 31 return; 32 32 } 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 } 33 56 $dismiss = wp_nonce_url( admin_url( 'admin-post.php?action=printblob_dismiss_welcome' ), 'printblob_dismiss_welcome' ); 34 57 $steps = array( 35 58 sprintf( 36 /* translators: %s: link to Pr oducts› Mockups. */37 __( 'Check the t-shirt mockup or add your own product photos and print areasunder %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>' 39 62 ), 40 63 sprintf( 41 64 /* 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' ), 43 66 '<a href="' . esc_url( admin_url( 'edit.php?post_type=product' ) ) . '">' . esc_html__( 'Products', 'printblob' ) . '</a>' 44 67 ), 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' ), 46 69 ); 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 ); 62 82 } 63 83 -
printblob/tags/1.3.0/includes/class-order.php
r3750583 r3751408 110 110 if ( ! $offered ) { 111 111 $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 ) ); 113 114 } 114 115 } 115 116 116 117 /** 117 * One quiet line under an order's first designed item about what PrintBlob Pro adds there, while Pro is not active118 * 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. 119 120 * 121 * @param int $files The order's print files. 120 122 * @param bool|null $pro_active Whether Pro is active; Settings::pro_active() when null. 121 123 * @param int|null $user_id The admin; the current user when null. 122 124 */ 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 ) ) { 125 127 return ''; 126 128 } 127 129 return sprintf( 128 130 '<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' ), 132 135 esc_url( wp_nonce_url( admin_url( 'admin-post.php?action=printblob_dismiss_pro_hint' ), 'printblob_dismiss_pro_hint' ) ), 133 136 esc_html__( 'Dismiss', 'printblob' ) -
printblob/tags/1.3.0/includes/class-product-settings.php
r3750583 r3751408 22 22 add_action( 'woocommerce_admin_process_product_object', array( __CLASS__, 'save' ) ); 23 23 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' ) ); 24 26 // A designed shirt always has a print: listed prices include the cheapest printed side. 25 27 foreach ( array( 'price', 'regular_price', 'sale_price' ) as $printblob_kind ) { … … 89 91 90 92 /** 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()). 93 96 */ 94 97 public static function designer_template( array $templates ): array { … … 98 101 } 99 102 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 ); 100 176 } 101 177 … … 137 213 'id' => Mockups::PRODUCT_META, 138 214 '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' ), 140 216 'desc_tip' => true, 141 217 'value' => (string) ( $chosen ? $chosen : $default ), … … 155 231 ); 156 232 } 233 echo wp_kses( Pro::product_html( Mockups::sides() ), Pro::LOCK_HTML ); 157 234 /** 158 235 * 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 1 1 <?php 2 2 /** 3 * One request for a review on WordPress.org. Once the shop has its first order with a design, PrintBlob's own4 * screens (its settings tab and the mockup screens) ask once; following the request or dismissing it ends it for5 * 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. 6 6 * 7 7 * @package PrintBlob … … 14 14 final class Review_Request { 15 15 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 */ 17 20 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; 18 24 19 25 public const REVIEW_URL = FACTS['reviews']; … … 24 30 } 25 31 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. */ 27 33 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 ) ) { 29 36 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 ); 30 39 } 31 40 } … … 58 67 59 68 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 ) ) { 61 71 return ''; 62 72 } 63 73 $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' ) ); 64 77 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 ) ), 67 83 esc_url( $answer( 'review' ) ), 68 84 esc_html__( 'Write a review', 'printblob' ), 69 esc_url( $answer( 'dismiss' ) ), 70 esc_html__( 'Dismiss', 'printblob' ) 85 $later 71 86 ); 72 87 } 73 88 74 89 /** 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. 76 92 * 77 * @param string $answer 'review' or 'dismiss'.93 * @param string $answer 'review', 'dismiss' or 'never'. 78 94 */ 79 95 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 ) ) { 81 97 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 ); 82 101 } 83 102 } -
printblob/tags/1.3.0/includes/class-settings-page.php
r3750583 r3751408 28 28 protected function get_settings_for_default_section() { 29 29 $attributes = Settings::attribute_choices(); 30 $pro = Settings::pro_rows(); 30 31 $designer = array( 31 32 array( … … 34 35 'title' => __( 'Designer', 'printblob' ), 35 36 'desc' => sprintf( 36 /* translators: %s: link to Pr oducts› Mockups. */37 __( 'Turn the designer on per product in its PrintBlob tab. Product photos and print areas are set upunder %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>' 39 40 ), 40 41 ), … … 89 90 ), 90 91 ), 92 ); 93 return array_merge( 94 $designer, 95 $pro['fonts'], 91 96 array( 92 'id' => 'printblob_designer', 93 'type' => 'sectionend', 97 array( 98 'id' => 'printblob_designer', 99 'type' => 'sectionend', 100 ), 94 101 ), 102 $pro['panel'] 95 103 ); 96 return array_merge( $designer, Settings::pro_panel() );97 104 } 98 105 } -
printblob/tags/1.3.0/includes/class-settings.php
r3750583 r3751408 23 23 add_filter( 'plugin_action_links_' . plugin_basename( FILE ), array( __CLASS__, 'action_links' ) ); 24 24 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' ) ); 25 26 } 26 27 27 28 /** 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. 29 31 * 30 32 * @param string[] $links The row's links. … … 37 39 } 38 40 $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>'; 39 42 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>'; 41 46 } 42 47 return $links; … … 77 82 } 78 83 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. */ 80 85 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; 82 88 } 83 89 … … 96 102 97 103 /** 98 * The PrintBlob Pro panel at the end of the settings screen: what Pro adds and where its plans are, while Pro is not99 * 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. 100 106 * 101 107 * @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. 103 109 */ 104 public static function pro_ panel( ?bool $pro_active = null ): array {110 public static function pro_rows( ?bool $pro_active = null ): array { 105 111 if ( $pro_active ?? self::pro_active() ) { 106 return array(); 112 return array( 113 'fonts' => array(), 114 'panel' => array(), 115 ); 107 116 } 117 $points = implode( '', array_map( static fn( string $point ): string => '<li>' . esc_html( $point ) . '</li>', Pro::points() ) ); 108 118 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', 118 125 ), 119 126 ), 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 ), 123 148 ), 124 149 ); 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 125 164 } 126 165 -
printblob/tags/1.3.0/includes/facts.json
r3750583 r3751408 1 1 { 2 2 "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 } 5 126 } -
printblob/tags/1.3.0/languages/printblob.pot
r3751165 r3751408 3 3 msgid "" 4 4 msgstr "" 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" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/printblob\n" 7 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" … … 10 10 "Content-Type: text/plain; charset=UTF-8\n" 11 11 "Content-Transfer-Encoding: 8bit\n" 12 "POT-Creation-Date: 2026-10-1 6T20:25:53+00:00\n"12 "POT-Creation-Date: 2026-10-17T03:32:40+00:00\n" 13 13 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 14 "X-Generator: WP-CLI 2.12.0\n" … … 27 27 #. Description of the plugin 28 28 #: 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."29 msgid "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." 30 30 msgstr "" 31 31 … … 41 41 42 42 #: build/colors/render.php:45 43 #: includes/class-order.php:16 243 #: includes/class-order.php:165 44 44 msgid "Design" 45 45 msgstr "" … … 50 50 51 51 #. translators: %s: attribute names, such as Material. 52 #: build/designer/render.php:1 6952 #: build/designer/render.php:175 53 53 #, php-format 54 54 msgid "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." 55 55 msgstr "" 56 56 57 #: build/designer/render.php:2 2257 #: build/designer/render.php:233 58 58 #: build/designer/view.js:10 59 59 msgid "Loading the designer…" … … 61 61 62 62 #. translators: 1: print area width in cm, 2: print area height in cm. 63 #: build/designer/render.php:2 2763 #: build/designer/render.php:238 64 64 #: build/designer/view.js:11 65 65 #, php-format,js-format … … 67 67 msgstr "" 68 68 69 #: build/designer/render.php:2 3569 #: build/designer/render.php:246 70 70 #: build/designer/view.js:11 71 71 msgid "Your print" 72 72 msgstr "" 73 73 74 #: build/designer/render.php:2 3774 #: build/designer/render.php:248 75 75 #: build/designer/view.js:11 76 76 msgid "Upload image" 77 77 msgstr "" 78 78 79 #: build/designer/render.php:2 3879 #: build/designer/render.php:249 80 80 #: build/designer/view.js:11 81 81 msgid "Add text" 82 82 msgstr "" 83 83 84 #: build/designer/render.php:2 4784 #: build/designer/render.php:258 85 85 #: build/designer/view.js:5 86 86 msgid "Font" 87 87 msgstr "" 88 88 89 #: build/designer/render.php:2 4889 #: build/designer/render.php:259 90 90 #: build/designer/view.js:5 91 91 msgid "Bold" 92 92 msgstr "" 93 93 94 #: build/designer/render.php:2 5194 #: build/designer/render.php:262 95 95 #: build/designer/view.js:5 96 96 msgid "Ink colour" 97 97 msgstr "" 98 98 99 #: build/designer/render.php:2 6099 #: build/designer/render.php:271 100 100 #: build/designer/view.js:4 101 101 msgid "Centre" 102 102 msgstr "" 103 103 104 #: build/designer/render.php:2 60104 #: build/designer/render.php:271 105 105 #: build/designer/view.js:4 106 106 msgid "Bring forward" 107 107 msgstr "" 108 108 109 #: build/designer/render.php:2 60109 #: build/designer/render.php:271 110 110 #: build/designer/view.js:4 111 111 msgid "Send back" 112 112 msgstr "" 113 113 114 #: build/designer/render.php:2 60114 #: build/designer/render.php:271 115 115 #: includes/class-shirt-colors.php:104 116 116 #: build/designer/view.js:4 … … 119 119 120 120 #. 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 122 123 #: build/designer/view.js:5 123 124 msgid "Done" … … 125 126 126 127 #. translators: shown where the controls appear while the printed side shown has nothing on it. 127 #: build/designer/render.php:2 65128 #: build/designer/render.php:276 128 129 #: build/designer/view.js:10 129 130 msgid "Upload an image or add text to start." 130 131 msgstr "" 131 132 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 133 136 #: build/designer/view.js:11 134 137 msgid "Colour" 135 138 msgstr "" 136 139 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 138 143 #: build/designer/view.js:11 139 144 msgid "Size" 140 145 msgstr "" 141 146 142 #: build/designer/render.php:3 05147 #: build/designer/render.php:316 143 148 #: build/designer/view.js:2 144 149 msgid "Quantity" 145 150 msgstr "" 146 151 147 #: build/designer/render.php:3 10152 #: build/designer/render.php:321 148 153 #: includes/class-privacy.php:103 154 #: includes/class-quick-setup.php:524 149 155 #: build/designer/index.js:1 150 156 #: build/designer/view.js:2 … … 153 159 154 160 #. translators: %s: printed side, e.g. Front. 155 #: build/designer/render.php:3 16161 #: build/designer/render.php:327 156 162 #: build/designer/view.js:3 157 163 #, php-format,js-format … … 160 166 161 167 #. translators: in the price breakdown, beside a side (e.g. "Back print") that has no design. 162 #: build/designer/render.php:3 19168 #: build/designer/render.php:330 163 169 #: build/designer/view.js:4 164 170 msgid "Not printed" 165 171 msgstr "" 166 172 167 #: build/designer/render.php:3 22173 #: build/designer/render.php:333 168 174 #: build/designer/view.js:4 169 175 msgid "Total" 170 176 msgstr "" 171 177 172 #: build/designer/render.php:3 26178 #: build/designer/render.php:337 173 179 #: build/designer/view.js:2 174 180 #: build/designer/view.js:4 … … 176 182 msgstr "" 177 183 178 #: build/designer/render.php:3 27184 #: build/designer/render.php:338 179 185 #: build/designer/view.js:2 180 186 msgid "Preparing your print file…" 181 187 msgstr "" 182 188 183 #: build/designer/render.php:3 27189 #: build/designer/render.php:338 184 190 #: build/designer/view.js:2 185 191 msgid "Saving your design…" 186 192 msgstr "" 187 193 188 #: build/designer/render.php:3 27194 #: build/designer/render.php:338 189 195 #: build/designer/view.js:2 190 196 msgid "Adding to cart…" 191 197 msgstr "" 192 198 193 #: build/designer/render.php:3 32199 #: build/designer/render.php:343 194 200 #: build/designer/view.js:1 195 201 msgid "Added to your cart." 196 202 msgstr "" 197 203 198 #: build/designer/render.php:3 32204 #: build/designer/render.php:343 199 205 #: build/designer/view.js:2 200 206 msgid "View cart" 201 207 msgstr "" 202 208 203 #: build/designer/render.php:3 35209 #: build/designer/render.php:346 204 210 #: build/designer/view.js:1 205 211 msgid "Add an image or text to the front or back first." 206 212 msgstr "" 207 213 208 #: build/designer/render.php:3 36214 #: build/designer/render.php:347 209 215 #: build/designer/view.js:1 210 216 msgid "Choose a size." 211 217 msgstr "" 212 218 213 #: build/designer/render.php:3 37219 #: build/designer/render.php:348 214 220 #: build/designer/view.js:1 215 221 msgid "This combination is sold out. Choose another." 216 222 msgstr "" 217 223 218 #: build/designer/render.php:3 38224 #: build/designer/render.php:349 219 225 #: build/designer/view.js:1 220 226 msgid "This colour and size is sold out. Choose another." 221 227 msgstr "" 222 228 223 #: build/designer/render.php:3 39229 #: build/designer/render.php:350 224 230 #: build/designer/view.js:1 225 231 msgid "Use a PNG, JPG or WebP image." 226 232 msgstr "" 227 233 228 #: build/designer/render.php:3 40234 #: build/designer/render.php:351 229 235 #: includes/class-design-store.php:435 230 236 #: build/designer/view.js:1 … … 232 238 msgstr "" 233 239 234 #: build/designer/render.php:3 41240 #: build/designer/render.php:352 235 241 #: build/designer/view.js:1 236 242 msgid "The product could not be added to the cart." … … 238 244 239 245 #. translators: %d: largest allowed file size in megabytes. 240 #: build/designer/render.php:3 43246 #: build/designer/render.php:354 241 247 #: build/designer/view.js:2 242 248 #, php-format,js-format … … 244 250 msgstr "" 245 251 246 #: build/designer/render.php:3 54252 #: build/designer/render.php:365 247 253 msgid "The designer needs JavaScript. Turn it on in your browser to design your product." 254 msgstr "" 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 260 msgid "PrintBlob overview" 261 msgstr "" 262 263 #: includes/class-admin-menu.php:37 264 msgid "Overview" 265 msgstr "" 266 267 #: includes/class-admin-menu.php:38 268 msgid "PrintBlob settings" 269 msgstr "" 270 271 #: includes/class-admin-menu.php:38 272 #: includes/class-settings.php:61 273 msgid "Settings" 274 msgstr "" 275 276 #: includes/class-admin-menu.php:46 277 #: includes/class-dashboard-widget.php:71 278 #: includes/class-print-queue.php:86 279 msgid "Print queue" 280 msgstr "" 281 282 #: includes/class-admin-menu.php:48 283 #: includes/class-overview.php:238 284 #: includes/class-settings.php:131 285 msgid "PrintBlob Pro" 286 msgstr "" 287 288 #: includes/class-admin-menu.php:52 289 msgid "Get Pro" 290 msgstr "" 291 292 #: includes/class-admin-menu.php:52 293 #: includes/class-deactivation-feedback.php:122 294 #: includes/class-mockups.php:410 295 msgid "Get PrintBlob Pro" 296 msgstr "" 297 298 #. translators: %s: five stars, linking to PrintBlob's reviews on WordPress.org. 299 #: includes/class-admin-menu.php:92 300 #, php-format 301 msgid "If PrintBlob helps your shop, please rate it %s on WordPress.org." 302 msgstr "" 303 304 #: includes/class-admin-menu.php:93 305 msgid "Rate PrintBlob on WordPress.org" 248 306 msgstr "" 249 307 … … 256 314 msgstr "" 257 315 258 #: includes/class-cart.php:9 3316 #: includes/class-cart.php:98 259 317 #: includes/class-order.php:37 260 318 msgid "Print" 261 319 msgstr "" 262 320 263 #: includes/class-cart.php:1 25264 #: includes/class-cart.php:1 37321 #: includes/class-cart.php:130 322 #: includes/class-cart.php:142 265 323 msgid "Your design" 324 msgstr "" 325 326 #: includes/class-dashboard-widget.php:32 327 msgid "PrintBlob this week" 328 msgstr "" 329 330 #. translators: %d: number of orders. 331 #: includes/class-dashboard-widget.php:66 332 #, php-format 333 msgid "%d order with a design this week" 334 msgid_plural "%d orders with designs this week" 335 msgstr[0] "" 336 msgstr[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 345 msgid "PrintBlob Pro add-on" 346 msgstr "" 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 352 msgid "Start your free trial" 353 msgstr "" 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 361 msgid "Dismiss" 362 msgstr "" 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 374 msgid "You are not allowed to do this." 375 msgstr "" 376 377 #: includes/class-deactivation-feedback.php:91 378 msgid "It’s only for a moment: I’m fixing something" 379 msgstr "" 380 381 #: includes/class-deactivation-feedback.php:92 382 msgid "It didn’t work on my site" 383 msgstr "" 384 385 #: includes/class-deactivation-feedback.php:93 386 msgid "It was hard to set up or use" 387 msgstr "" 388 389 #: includes/class-deactivation-feedback.php:94 390 msgid "I need back or sleeve printing" 391 msgstr "" 392 393 #: includes/class-deactivation-feedback.php:95 394 msgid "I need my own products" 395 msgstr "" 396 397 #: includes/class-deactivation-feedback.php:96 398 msgid "I need a 3D view" 399 msgstr "" 400 401 #: includes/class-deactivation-feedback.php:97 402 msgid "I need a print queue" 403 msgstr "" 404 405 #: includes/class-deactivation-feedback.php:98 406 msgid "I found another plugin" 407 msgstr "" 408 409 #: includes/class-deactivation-feedback.php:99 410 msgid "Something else" 411 msgstr "" 412 413 #: includes/class-deactivation-feedback.php:104 414 msgid "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." 415 msgstr "" 416 417 #: includes/class-deactivation-feedback.php:117 418 #: includes/class-pro.php:118 419 msgid "PrintBlob Pro add-on:" 420 msgstr "" 421 422 #: includes/class-deactivation-feedback.php:140 423 msgid "Tell us more below if you like: what you needed, or what went wrong." 424 msgstr "" 425 426 #: includes/class-deactivation-feedback.php:168 427 msgid "Why are you leaving?" 428 msgstr "" 429 430 #: includes/class-deactivation-feedback.php:171 431 msgid "Your note (optional)" 432 msgstr "" 433 434 #: includes/class-deactivation-feedback.php:173 435 msgid "Your email address, if you would like an answer (optional)" 436 msgstr "" 437 438 #: includes/class-deactivation-feedback.php:177 439 msgid "Skip and deactivate" 440 msgstr "" 441 442 #: includes/class-deactivation-feedback.php:178 443 msgid "Send and deactivate" 266 444 msgstr "" 267 445 … … 340 518 msgstr "" 341 519 342 #: includes/class-design-store.php: 588343 #: includes/class-design-store.php:6 13520 #: includes/class-design-store.php:639 521 #: includes/class-design-store.php:664 344 522 msgid "PrintBlob print files are private" 345 523 msgstr "" 346 524 347 #: includes/class-design-store.php:6 19525 #: includes/class-design-store.php:670 348 526 msgid "Customers’ print files cannot be downloaded from the web; shop managers download them from the order screen." 349 527 msgstr "" 350 528 351 #: includes/class-design-store.php:6 23529 #: includes/class-design-store.php:674 352 530 msgid "PrintBlob print files can be downloaded from the web" 353 531 msgstr "" 354 532 355 #: includes/class-design-store.php:6 25533 #: includes/class-design-store.php:676 356 534 msgid "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:" 357 535 msgstr "" 358 536 359 #: includes/class-design-store.php:6 28537 #: includes/class-design-store.php:679 360 538 msgid "PrintBlob could not check that print files are private" 361 539 msgstr "" 362 540 363 #: includes/class-design-store.php:6 30541 #: includes/class-design-store.php:681 364 542 msgid "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:" 365 543 msgstr "" 366 544 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 551 msgid "Mockups" 552 msgstr "" 553 554 #: includes/class-mockups.php:66 555 #: includes/class-product-settings.php:214 556 msgid "Mockup" 557 msgstr "" 558 559 #: includes/class-mockups.php:67 560 #: includes/class-mockups.php:68 561 msgid "Add mockup" 562 msgstr "" 563 564 #: includes/class-mockups.php:69 565 msgid "Edit mockup" 566 msgstr "" 567 368 568 #: includes/class-mockups.php:70 369 msgid "Mockups"370 msgstr ""371 372 #: includes/class-mockups.php:62373 #: includes/class-product-settings.php:138374 msgid "Mockup"375 msgstr ""376 377 #: includes/class-mockups.php:63378 #: includes/class-mockups.php:64379 msgid "Add mockup"380 msgstr ""381 382 #: includes/class-mockups.php:65383 msgid "Edit mockup"384 msgstr ""385 386 #: includes/class-mockups.php:66387 569 msgid "New mockup" 388 570 msgstr "" 389 571 390 #: includes/class-mockups.php: 67572 #: includes/class-mockups.php:71 391 573 msgid "Search mockups" 392 574 msgstr "" 393 575 394 #: includes/class-mockups.php: 68576 #: includes/class-mockups.php:72 395 577 msgid "No mockups yet." 396 578 msgstr "" 397 579 398 #: includes/class-mockups.php: 69580 #: includes/class-mockups.php:73 399 581 msgid "No mockups in the trash." 400 582 msgstr "" 401 583 402 #: includes/class-mockups.php:136 584 #: includes/class-mockups.php:140 585 #: includes/class-quick-setup.php:88 403 586 msgid "T-shirt" 404 587 msgstr "" 405 588 406 #: includes/class-mockups.php:1 58589 #: includes/class-mockups.php:162 407 590 msgid "T-shirt mockup (back)" 408 591 msgstr "" 409 592 410 #: includes/class-mockups.php:1 58593 #: includes/class-mockups.php:162 411 594 msgid "T-shirt mockup" 412 595 msgstr "" 413 596 414 #: includes/class-mockups.php:310 597 #: includes/class-mockups.php:320 598 #: includes/class-pro.php:369 415 599 msgid "Back" 416 600 msgstr "" 417 601 418 #: includes/class-mockups.php:3 10602 #: includes/class-mockups.php:320 419 603 msgid "Front" 420 604 msgstr "" 421 605 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 609 msgid "%1$s × %2$s cm" 610 msgstr "" 611 612 #: includes/class-mockups.php:406 613 msgid "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." 614 msgstr "" 615 616 #: includes/class-mockups.php:408 617 msgid "Your own products — mugs, hoodies, bags, your own photos — with the PrintBlob Pro add-on" 618 msgstr "" 619 620 #: includes/class-mockups.php:409 621 msgid "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." 450 622 msgstr "" 451 623 452 624 #: 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" 625 msgid "Recoloured to the colour the customer picks." 626 msgstr "" 627 628 #. translators: %s: link to PrintBlob › Mockups. 629 #: includes/class-onboarding.php:60 630 #, php-format 631 msgid "Check the bundled product mockup under %s." 632 msgstr "" 633 634 #: includes/class-onboarding.php:61 635 #: includes/class-settings-page.php:39 636 msgid "PrintBlob › Mockups" 483 637 msgstr "" 484 638 485 639 #. translators: %s: link to Products. 486 #: includes/class-onboarding.php: 42640 #: includes/class-onboarding.php:65 487 641 #, php-format 488 642 msgid "Edit a product, open its PrintBlob designer tab, turn the designer on and set the print price per side (%s)." 489 643 msgstr "" 490 644 491 #: includes/class-onboarding.php:43 645 #: includes/class-onboarding.php:66 646 #: includes/class-overview.php:106 492 647 msgid "Products" 493 648 msgstr "" 494 649 495 #: includes/class-onboarding.php: 45650 #: includes/class-onboarding.php:68 496 651 msgid "Add the PrintBlob designer block to a page, or open the product: the designer shows on its page." 497 652 msgstr "" 498 653 499 #: includes/class-onboarding.php: 49654 #: includes/class-onboarding.php:73 500 655 msgid "PrintBlob is ready. Three steps to your first designable product:" 501 656 msgstr "" 502 657 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 659 msgid "Quick setup: all three in one click" 660 msgstr "" 661 662 #: includes/class-onboarding.php:78 663 #: includes/class-overview.php:244 664 #: includes/class-settings.php:40 509 665 msgid "Documentation" 510 666 msgstr "" 511 667 512 # : includes/class-onboarding.php:58513 #: includes/class-order .php:133514 # : includes/class-review-request.php:70515 msgid " Dismiss"668 #. translators: %d: number of orders with designs (10, 25 or 50). 669 #: includes/class-order-milestones.php:52 670 #, php-format 671 msgid "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." 516 672 msgstr "" 517 673 518 674 #. translators: %s: printed side, e.g. Front. 519 675 #: includes/class-order.php:88 676 #: includes/class-print-queue.php:109 520 677 #, php-format 521 678 msgid "Download %s print file" … … 528 685 msgstr "" 529 686 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 690 msgid "This order’s %d print file in one ZIP, with PrintBlob Pro." 691 msgid_plural "This order’s %d print files in one ZIP, with PrintBlob Pro." 692 msgstr[0] "" 693 msgstr[1] "" 694 695 #: includes/class-order.php:134 696 msgid "About the PrintBlob Pro add-on" 697 msgstr "" 698 699 #: includes/class-overview.php:38 700 #: includes/class-quick-setup.php:556 701 #: includes/class-settings-page.php:45 702 msgid "Designer page" 703 msgstr "" 704 705 #. translators: %s: page title. 706 #: includes/class-overview.php:46 707 #, php-format 708 msgid "“%s”, the first published page with the designer block." 709 msgstr "" 710 711 #. translators: %s: page title. 712 #: includes/class-overview.php:46 713 #: includes/class-overview.php:59 714 msgid "View" 715 msgstr "" 716 717 #: includes/class-overview.php:47 718 msgid "No page is set and no published page has the designer block. Products with the designer still show it on their own page." 719 msgstr "" 720 721 #: includes/class-overview.php:47 722 msgid "Choose a page" 723 msgstr "" 724 725 #. translators: %s: page title. 726 #: includes/class-overview.php:52 727 #, php-format 728 msgid "“%s” is not published." 729 msgstr "" 730 731 #. translators: %s: page title. 732 #: includes/class-overview.php:52 733 msgid "Edit the page" 734 msgstr "" 735 736 #. translators: %s: page title. 737 #: includes/class-overview.php:56 738 #, php-format 739 msgid "“%s” has no PrintBlob designer block." 740 msgstr "" 741 742 #. translators: %s: page title. 743 #: includes/class-overview.php:56 744 msgid "Add the block" 745 msgstr "" 746 747 #. translators: %s: page title. 748 #: includes/class-overview.php:59 749 #, php-format 750 msgid "“%s” is published and shows the designer." 751 msgstr "" 752 753 #: includes/class-overview.php:63 754 #: includes/class-quick-setup.php:500 755 msgid "Colours" 756 msgstr "" 757 758 #: includes/class-overview.php:67 759 msgid "The colour attribute chosen in the settings does not exist." 760 msgstr "" 761 762 #: includes/class-overview.php:67 763 #: includes/class-overview.php:90 764 msgid "Product attributes" 765 msgstr "" 766 767 #: includes/class-overview.php:72 768 msgid "The colour attribute has no colours yet." 769 msgstr "" 770 771 #: includes/class-overview.php:72 772 msgid "Add colours" 773 msgstr "" 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 778 msgid "%1$d colour: %2$d with a colour value, %3$d with its own photo." 779 msgid_plural "%1$d colours: %2$d with a colour value, %3$d with their own photo." 780 msgstr[0] "" 781 msgstr[1] "" 782 783 #: includes/class-overview.php:83 784 msgid "Edit colours" 785 msgstr "" 786 787 #: includes/class-overview.php:83 788 msgid "Give each colour a value" 789 msgstr "" 790 791 #: includes/class-overview.php:87 792 #: includes/class-quick-setup.php:512 793 msgid "Sizes" 794 msgstr "" 795 796 #: includes/class-overview.php:90 797 msgid "The size attribute chosen in the settings does not exist. Without one, customers choose no size." 798 msgstr "" 799 800 #. translators: %d: number of sizes. 801 #: includes/class-overview.php:99 802 #, php-format 803 msgid "%d size." 804 msgid_plural "%d sizes." 805 msgstr[0] "" 806 msgstr[1] "" 807 808 #. translators: %d: number of sizes. 809 #: includes/class-overview.php:99 810 msgid "Edit sizes" 811 msgstr "" 812 813 #. translators: %d: number of sizes. 814 #: includes/class-overview.php:99 815 msgid "Add sizes" 816 msgstr "" 817 818 #: includes/class-overview.php:103 819 msgid "Products with the designer" 820 msgstr "" 821 822 #: includes/class-overview.php:106 823 msgid "No product has the designer on. Edit a product, open its PrintBlob designer tab and turn the designer on." 824 msgstr "" 825 826 #. translators: %d: number of products. 827 #: includes/class-overview.php:113 828 #, php-format 829 msgid "%d product:" 830 msgid_plural "%d products:" 831 msgstr[0] "" 832 msgstr[1] "" 833 834 #: includes/class-overview.php:117 835 msgid "Default mockup" 836 msgstr "" 837 838 #. translators: %s: mockup title. 839 #: includes/class-overview.php:122 840 #, php-format 841 msgid "“%s”, which products use unless they choose another." 842 msgstr "" 843 844 #: includes/class-overview.php:123 845 msgid "The bundled product mockup is missing. It is made again the next time a shop manager opens the dashboard." 846 msgstr "" 847 848 #: includes/class-overview.php:123 849 msgid "Dashboard" 850 msgstr "" 851 852 #: includes/class-overview.php:132 853 msgid "Print files" 854 msgstr "" 855 856 #: includes/class-overview.php:132 857 msgid "Site Health" 858 msgstr "" 859 860 #: includes/class-overview.php:170 861 msgid "To do" 862 msgstr "" 863 864 #: includes/class-overview.php:183 865 msgid "Set-up" 866 msgstr "" 867 868 #: includes/class-overview.php:185 869 msgid "Quick setup: a designable product in one click" 870 msgstr "" 871 872 #: includes/class-overview.php:204 873 msgid "Orders with designs" 874 msgstr "" 875 876 #. translators: %d: number of orders. 877 #: includes/class-overview.php:208 878 #, php-format 879 msgid "%d order with a design this month." 880 msgid_plural "%d orders with designs this month." 881 msgstr[0] "" 882 msgstr[1] "" 883 884 #. translators: %s: order number. 885 #: includes/class-overview.php:218 886 #: includes/class-print-queue.php:95 887 #, php-format 888 msgid "Order #%s" 889 msgstr "" 890 891 #. translators: %d: number of print files. 892 #: includes/class-overview.php:227 893 #: includes/class-print-queue.php:69 894 #, php-format 895 msgid "%d print file" 896 msgid_plural "%d print files" 897 msgstr[0] "" 898 msgstr[1] "" 899 900 #: includes/class-overview.php:233 901 msgid "No order has a design yet." 902 msgstr "" 903 904 #. translators: %s: version number. 905 #: includes/class-overview.php:239 906 #, php-format 907 msgid "PrintBlob Pro %s is active." 908 msgstr "" 909 910 #. translators: %s: version number. 911 #: includes/class-overview.php:240 912 msgid "Licence" 913 msgstr "" 914 915 #: includes/class-print-queue.php:66 916 msgid "No processing order has a design waiting to print." 917 msgstr "" 918 919 #. translators: %d: number of orders. 920 #: includes/class-print-queue.php:71 921 #, php-format 922 msgid "%d order" 923 msgid_plural "%d orders" 924 msgstr[0] "" 925 msgstr[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 930 msgid "You have %1$s in %2$s waiting: with PrintBlob Pro, one ZIP per order." 931 msgstr "" 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 936 msgid "You have %1$s in %2$s waiting to print." 937 msgstr "" 938 939 #. translators: %d: number of print files. 940 #: includes/class-print-queue.php:120 941 #, php-format 942 msgid "Download its %d print file as one ZIP" 943 msgid_plural "Download all %d print files of this order as one ZIP" 944 msgstr[0] "" 945 msgstr[1] "" 946 947 #: includes/class-print-queue.php:121 948 msgid "Mark printed" 949 msgstr "" 950 951 #. translators: %d: number of orders not listed. 952 #: includes/class-print-queue.php:133 953 #, php-format 954 msgid "%d more order is waiting." 955 msgid_plural "%d more orders are waiting." 956 msgstr[0] "" 957 msgstr[1] "" 542 958 543 959 #: includes/class-privacy.php:32 … … 582 998 msgstr "" 583 999 1000 #. translators: %d: days of PrintBlob Pro's free trial. 1001 #: includes/class-pro.php:60 1002 #, php-format 1003 msgid "Try PrintBlob Pro free for %d day" 1004 msgid_plural "Try PrintBlob Pro free for %d days" 1005 msgstr[0] "" 1006 msgstr[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 1011 msgid "%1$s a year or %2$s once" 1012 msgstr "" 1013 1014 #. translators: %d: days in which a PrintBlob Pro purchase is refunded in full. 1015 #: includes/class-pro.php:71 1016 #, php-format 1017 msgid "Full refund within %d day." 1018 msgid_plural "Full refund within %d days." 1019 msgstr[0] "" 1020 msgstr[1] "" 1021 1022 #: includes/class-pro.php:75 1023 msgid "PrintBlob Pro is a separate plugin from printblob.com. Everything PrintBlob does works without it." 1024 msgstr "" 1025 1026 #: includes/class-pro.php:101 1027 msgid "See it in 3D" 1028 msgstr "" 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 1034 msgid "Compare free and Pro" 1035 msgstr "" 1036 1037 #: includes/class-pro.php:140 1038 msgid "Show less" 1039 msgstr "" 1040 1041 #: includes/class-pro.php:160 1042 msgid "A product with a printed design in PrintBlob Pro’s 3D view" 1043 msgstr "" 1044 1045 #: includes/class-pro.php:176 1046 msgid "3D · Pro" 1047 msgstr "" 1048 1049 #: includes/class-pro.php:177 1050 msgid "Only you see this, as the shop manager: your product in 3D with the PrintBlob Pro add-on, on printblob.com" 1051 msgstr "" 1052 1053 #: includes/class-pro.php:200 1054 msgid "The designer on the product page or any page: photos, logos and text, moved, resized and rotated on the product" 1055 msgstr "" 1056 1057 #: includes/class-pro.php:201 1058 msgid "Text typed on the product, in four bundled fonts" 1059 msgstr "" 1060 1061 #: includes/class-pro.php:202 1062 msgid "Front printing on the bundled product, with its own print price" 1063 msgstr "" 1064 1065 #: includes/class-pro.php:203 1066 msgid "Every colour of the product from one photo, and the Colours block" 1067 msgstr "" 1068 1069 #: includes/class-pro.php:204 1070 msgid "A warning when a customer’s image is too small to print sharply" 1071 msgstr "" 1072 1073 #: includes/class-pro.php:205 1074 msgid "A 300 DPI print file per side on every order, and the customer’s images as uploaded" 1075 msgstr "" 1076 1077 #: includes/class-pro.php:206 1078 msgid "WooCommerce’s block cart and checkout, order emails and custom order tables" 1079 msgstr "" 1080 1081 #: includes/class-pro.php:207 1082 msgid "Community support in the WordPress.org forum" 1083 msgstr "" 1084 1085 #: includes/class-pro.php:240 1086 msgid "Included" 1087 msgstr "" 1088 1089 #: includes/class-pro.php:241 1090 msgid "Not included" 1091 msgstr "" 1092 1093 #: includes/class-pro.php:244 1094 msgid "PrintBlob and PrintBlob Pro" 1095 msgstr "" 1096 1097 #: includes/class-pro.php:249 1098 msgid "What it does" 1099 msgstr "" 1100 1101 #: includes/class-pro.php:250 1102 msgid "PrintBlob (free)" 1103 msgstr "" 1104 1105 #. translators: %s: PrintBlob Pro's one-time price, e.g. $79. 1106 #: includes/class-pro.php:273 1107 #, php-format 1108 msgid "Buy once for %s" 1109 msgstr "" 1110 1111 #: includes/class-pro.php:279 1112 msgid "PrintBlob Pro is active on this site." 1113 msgstr "" 1114 1115 #: includes/class-pro.php:367 1116 msgid "3D view" 1117 msgstr "" 1118 1119 #: includes/class-pro.php:370 1120 msgid "Left sleeve" 1121 msgstr "" 1122 1123 #: includes/class-pro.php:371 1124 msgid "Right sleeve" 1125 msgstr "" 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 1132 msgid "Print price: %s" 1133 msgstr "" 1134 1135 #: includes/class-pro.php:415 1136 msgid "See all Pro features" 1137 msgstr "" 1138 1139 #: includes/class-pro.php:418 1140 msgid "Close" 1141 msgstr "" 1142 1143 #: includes/class-product-settings.php:113 1144 msgid "Product with the PrintBlob designer" 1145 msgstr "" 1146 584 1147 #: includes/class-product-settings.php:114 1148 msgid "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." 1149 msgstr "" 1150 1151 #: includes/class-product-settings.php:190 585 1152 #: build/designer/index.js:1 586 1153 msgid "PrintBlob designer" 587 1154 msgstr "" 588 1155 589 #: includes/class-product-settings.php: 1281156 #: includes/class-product-settings.php:204 590 1157 #: includes/class-settings-page.php:24 591 #: includes/class-settings-page.php:3 41158 #: includes/class-settings-page.php:35 592 1159 msgid "Designer" 593 1160 msgstr "" 594 1161 595 #: includes/class-product-settings.php: 1291162 #: includes/class-product-settings.php:205 596 1163 msgid "Customers design their own print on this product before adding it to the cart." 597 1164 msgstr "" 598 1165 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 1167 msgid "The product photo customers design on, with its print areas. The shop’s mockups are under PrintBlob › Mockups." 1168 msgstr "" 1169 1170 #: includes/class-product-settings.php:227 610 1171 msgid "Added to the product’s price when this side has a print." 611 1172 msgstr "" 612 1173 613 #: includes/class-review-request.php:66 1174 #: includes/class-quick-setup.php:41 1175 #: includes/class-quick-setup.php:466 1176 msgid "Quick setup" 1177 msgstr "" 1178 1179 #: includes/class-quick-setup.php:117 1180 msgid "The form had expired. Open Quick setup again and run it from there." 1181 msgstr "" 1182 1183 #: includes/class-quick-setup.php:120 1184 msgid "Only shop managers can run Quick setup." 1185 msgstr "" 1186 1187 #: includes/class-quick-setup.php:148 1188 msgid "Give the product a name, and type its price and the print price as numbers, such as 18 and 6." 1189 msgstr "" 1190 1191 #. translators: %s: mockup title. 1192 #: includes/class-quick-setup.php:155 1193 #: includes/class-quick-setup.php:163 1194 #, php-format 1195 msgid "Mockup “%s”" 1196 msgstr "" 1197 1198 #: includes/class-quick-setup.php:159 1199 msgid "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." 1200 msgstr "" 1201 1202 #: includes/class-quick-setup.php:192 1203 msgid "Printed with your own design." 1204 msgstr "" 1205 1206 #: includes/class-quick-setup.php:217 1207 msgid "The product could not be saved. Check that WooCommerce is up to date and that Products › Add new works, then run Quick setup again." 1208 msgstr "" 1209 1210 #. translators: %s: product name. 1211 #: includes/class-quick-setup.php:222 1212 #, php-format 1213 msgid "Product “%s”, with the designer on" 1214 msgstr "" 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 1219 msgid "%1$d variations: %2$d colours in %3$d sizes" 1220 msgstr "" 1221 1222 #. translators: %s: attribute name, e.g. Colour. 1223 #: includes/class-quick-setup.php:307 1224 #, php-format 1225 msgid "The %s attribute chosen is not one of the shop’s product attributes. Choose one from the list, or a new one." 1226 msgstr "" 1227 1228 #. translators: %s: attribute name. 1229 #: includes/class-quick-setup.php:312 1230 #: includes/class-quick-setup.php:337 1231 #, php-format 1232 msgid "Attribute “%s”" 1233 msgstr "" 1234 1235 #. translators: 1: attribute name, 2: WooCommerce's reason. 1236 #: includes/class-quick-setup.php:328 1237 #, php-format 1238 msgid "WooCommerce did not add the %1$s attribute: %2$s Add it under Products › Attributes, then choose it here." 1239 msgstr "" 1240 1241 #. translators: 1: term name, e.g. Navy, 2: WordPress's reason. 1242 #: includes/class-quick-setup.php:349 1243 #, php-format 1244 msgid "“%1$s” could not be added: %2$s" 1245 msgstr "" 1246 1247 #. translators: 1: attribute name, 2: term names, e.g. White, Black, Navy. 1248 #: includes/class-quick-setup.php:364 1249 #, php-format 1250 msgid "%1$s: %2$s" 1251 msgstr "" 1252 1253 #. translators: %s: page title. 1254 #: includes/class-quick-setup.php:380 1255 #: includes/class-quick-setup.php:408 1256 #, php-format 1257 msgid "Designer page “%s”" 1258 msgstr "" 1259 1260 #: includes/class-quick-setup.php:390 1261 msgid "Design your own" 1262 msgstr "" 1263 1264 #. translators: %s: attribute name, e.g. Colour. 1265 #: includes/class-quick-setup.php:437 1266 #, php-format 1267 msgid "A new %s attribute" 1268 msgstr "" 1269 1270 #. translators: %s: the shop's attribute name. 1271 #: includes/class-quick-setup.php:444 1272 #, php-format 1273 msgid "The shop’s “%s” attribute" 1274 msgstr "" 1275 1276 #: includes/class-quick-setup.php:470 1277 msgid "Quick setup stopped:" 1278 msgstr "" 1279 1280 #: includes/class-quick-setup.php:479 1281 msgid "Your shop is set up. Open the product and design on it." 1282 msgstr "" 1283 1284 #: includes/class-quick-setup.php:483 1285 msgid "Made now" 1286 msgstr "" 1287 1288 #: includes/class-quick-setup.php:487 1289 msgid "Already there, kept as it was" 1290 msgstr "" 1291 1292 #: includes/class-quick-setup.php:491 1293 msgid "Open the product" 1294 msgstr "" 1295 1296 #: includes/class-quick-setup.php:494 1297 msgid "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." 1298 msgstr "" 1299 1300 #. translators: %s: colour names, e.g. White, Black, Navy. 1301 #: includes/class-quick-setup.php:506 1302 #, php-format 1303 msgid "Six colours, each with the colour value the designer recolours the product to: %s. Colours the attribute already has are kept." 1304 msgstr "" 1305 1306 #. translators: %s: sizes, e.g. XS, S, M. 1307 #: includes/class-quick-setup.php:518 1308 #, php-format 1309 msgid "The sizes %s. Sizes the attribute already has are kept." 1310 msgstr "" 1311 1312 #. translators: %s: currency symbol. 1313 #: includes/class-quick-setup.php:531 1314 #, php-format 1315 msgid "Price (%s)" 1316 msgstr "" 1317 1318 #. translators: %s: currency symbol. 1319 #: includes/class-quick-setup.php:538 1320 #, php-format 1321 msgid "Front print price (%s)" 1322 msgstr "" 1323 1324 #. translators: %s: product name. 1325 #: includes/class-quick-setup.php:548 1326 #, php-format 1327 msgid "“%s”, made by an earlier run, is kept: variations it lacks are added and the prices above apply to it." 1328 msgstr "" 1329 1330 #: includes/class-quick-setup.php:549 1331 msgid "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." 1332 msgstr "" 1333 1334 #. translators: %s: page title. 1335 #: includes/class-quick-setup.php:563 1336 #, php-format 1337 msgid "“%s” stays the designer page." 1338 msgstr "" 1339 1340 #: includes/class-quick-setup.php:564 1341 msgid "A page named “Design your own” with the designer block on the product, set as the designer page." 1342 msgstr "" 1343 1344 #: includes/class-quick-setup.php:571 1345 msgid "Set up my shop" 1346 msgstr "" 1347 1348 #: includes/class-quick-setup.php:577 1349 msgid "Your product has a back photo ready: turn on back printing, sleeves and the 3D view with PrintBlob Pro" 1350 msgstr "" 1351 1352 #: includes/class-review-request.php:75 1353 msgid "Don’t ask again" 1354 msgstr "" 1355 1356 #: includes/class-review-request.php:80 614 1357 msgid "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." 615 1358 msgstr "" 616 1359 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 1363 msgid "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." 1364 msgstr "" 1365 1366 #: includes/class-review-request.php:84 618 1367 msgid "Write a review" 619 1368 msgstr "" … … 623 1372 msgstr "" 624 1373 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 1377 msgid "Turn the designer on per product in its PrintBlob tab. The product photos and their print areas are under %s." 1378 msgstr "" 1379 1380 #: includes/class-settings-page.php:46 636 1381 msgid "Where the Colours block and colour links send customers. Leave empty to use the first page that contains the designer." 637 1382 msgstr "" 638 1383 639 #: includes/class-settings-page.php:5 31384 #: includes/class-settings-page.php:54 640 1385 msgid "Colour attribute" 641 1386 msgstr "" 642 1387 643 #: includes/class-settings-page.php:5 41388 #: includes/class-settings-page.php:55 644 1389 msgid "The product attribute whose terms are the product colours. Each colour gets a colour value and a photo on its edit screen." 645 1390 msgstr "" 646 1391 647 #: includes/class-settings-page.php:6 21392 #: includes/class-settings-page.php:63 648 1393 msgid "Size attribute" 649 1394 msgstr "" 650 1395 651 #: includes/class-settings-page.php:6 31396 #: includes/class-settings-page.php:64 652 1397 msgid "The product attribute that holds sizes, shown as size buttons in the designer." 653 1398 msgstr "" 654 1399 655 #: includes/class-settings-page.php:7 11400 #: includes/class-settings-page.php:72 656 1401 msgid "Largest customer image (MB)" 657 1402 msgstr "" 658 1403 659 #: includes/class-settings-page.php:8 21404 #: includes/class-settings-page.php:83 660 1405 msgid "Keep unordered designs (days)" 661 1406 msgstr "" 662 1407 663 #: includes/class-settings-page.php:8 31408 #: includes/class-settings-page.php:84 664 1409 msgid "Designs added to a cart but never ordered are deleted after this many days. Ordered designs are kept with the order." 665 1410 msgstr "" 666 1411 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 1413 msgid "Rate PrintBlob ★★★★★" 1414 msgstr "" 1415 1416 #. translators: %d: days of PrintBlob Pro's free trial. 1417 #: includes/class-settings.php:45 1418 #, php-format 1419 msgid "PrintBlob Pro add-on: the 3D view and more, free for %d day" 1420 msgid_plural "PrintBlob Pro add-on: the 3D view and more, free for %d days" 1421 msgstr[0] "" 1422 msgstr[1] "" 1423 1424 #: includes/class-settings.php:123 1425 msgid "Upload your own fonts" 685 1426 msgstr "" 686 1427 687 1428 #: includes/class-shirt-colors.php:92 688 1429 msgid "Product photo for this colour" 1430 msgstr "" 1431 1432 #: includes/class-shirt-colors.php:93 1433 msgid "Use this photo" 1434 msgstr "" 1435 1436 #: includes/class-shirt-colors.php:103 1437 msgid "Choose photo" 689 1438 msgstr "" 690 1439 -
printblob/tags/1.3.0/package.json
r3751165 r3751408 9 9 "./build": "./build.mts", 10 10 "./designer/*.js": "./src/designer/app/*.ts", 11 "./admin/*.js": "./src/admin/*.ts", 11 12 "./designer.scss": { 12 13 "types": "./src/designer/stylesheet.d.ts", -
printblob/tags/1.3.0/printblob.php
r3751165 r3751408 3 3 * Plugin Name: PrintBlob – Product Designer for WooCommerce 4 4 * 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.65 * 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 7 7 * Requires at least: 7.0 8 8 * Requires PHP: 7.4 … … 39 39 require_once __DIR__ . '/includes/class-privacy.php'; 40 40 require_once __DIR__ . '/includes/class-review-request.php'; 41 require_once __DIR__ . '/includes/class-pro.php'; 42 require_once __DIR__ . '/includes/class-admin-menu.php'; 43 require_once __DIR__ . '/includes/class-overview.php'; 44 require_once __DIR__ . '/includes/class-print-queue.php'; 45 require_once __DIR__ . '/includes/class-dashboard-widget.php'; 46 require_once __DIR__ . '/includes/class-order-milestones.php'; 47 require_once __DIR__ . '/includes/class-quick-setup.php'; 48 require_once __DIR__ . '/includes/class-deactivation-feedback.php'; 41 49 42 50 add_action( … … 56 64 Privacy::register(); 57 65 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(); 58 72 } 59 73 ); -
printblob/tags/1.3.0/readme.txt
r3751165 r3751408 5 5 Tested up to: 7.1 6 6 Requires PHP: 7.4 7 Stable tag: 1. 2.67 Stable tag: 1.3.0 8 8 License: GPL-2.0-or-later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html 10 10 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.11 Let customers design their own t-shirt print — photos, logos and text — and receive a print-ready 300 DPI file with every order. 12 12 13 13 == Description == 14 14 15 Try it before you install: the [live demo on printblob.com](https://printblob.com/#demo) runs this exact designer.15 Try 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. 16 16 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.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 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. 18 18 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 itto 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. 21 21 * **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. 22 22 * **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. … … 26 26 = PrintBlob Pro = 27 27 28 The [PrintBlob Pro](https://printblob.com/) add-on adds a 3D view of the product, made from the samefront and back photos, sleeve printing, a production print queue and your own fonts.28 The [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. 29 29 30 30 = Privacy = 31 31 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.32 PrintBlob 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. 33 33 34 34 = Copyright = … … 47 47 48 48 1. Install PrintBlob from Plugins › Add Plugin (search for "PrintBlob") and activate it. WooCommerce must be active. 49 2. Open Pr oducts › Mockups. A t-shirt mockup is ready to use; add your own photos and print areas as needed.49 2. Open PrintBlob › Mockups. The t-shirt mockup is ready to use; your own products and photos come with PrintBlob Pro. 50 50 3. Edit a product, open its PrintBlob designer tab, turn the designer on, choose a mockup and set the print price per side. 51 51 4. Add colour values and photos to the terms of your colour attribute (Products › Attributes). … … 89 89 90 90 == 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. 91 100 92 101 = 1.2.6 = … … 137 146 * The bundled t-shirt mockup's print areas are in assets/mockups/tee.json. 138 147 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 == 141 149 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 = 151 Back 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. 160 152 161 153 = 1.2.3 = -
printblob/tags/1.3.0/src/admin/term-image.ts
r3750583 r3751408 1 1 /* Media library picker for the colour term's shirt photo. */ 2 2 import $ from 'jquery'; 3 import { chooseImage, type MediaLabels } from './media.ts'; 4 5 declare const printblobTermImage: MediaLabels; 3 6 4 7 $( document ).on( 'click', '[data-printblob-term-image] [data-printblob-choose]', function ( event ) { 5 8 event.preventDefault(); 6 9 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 ) => { 15 11 const preview = image.sizes?.thumbnail?.url ?? image.url; 16 12 field.find( 'input[name="printblob_image"]' ).val( image.id ); … … 18 14 field.find( '[data-printblob-remove]' ).prop( 'hidden', false ); 19 15 } ); 20 frame.open();21 16 } ); 22 17 -
printblob/tags/1.3.0/src/designer/app/App.tsx
r3751165 r3751408 427 427 <div className="printblob-designer__stage-column"> 428 428 <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 ) } 448 450 { views.map( ( view ) => ( 449 451 <button … … 458 460 </button> 459 461 ) ) } 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 ) } 460 467 </div> 461 468 <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 3 3 import type { PrintSide, Size } from './types.ts'; 4 4 5 /** The sides PrintBlob prints, by key; add-ons add others. */ 6 export const PRINTED_SIDES: readonly string[] = designer.sides; 5 7 export const STAGE_WIDTH = designer.stage_width; 6 8 export const PRINT_DPI = designer.print_dpi; -
printblob/tags/1.3.0/src/designer/app/types.ts
r3750583 r3751408 94 94 cart: string; 95 95 [endpoint: string]: unknown; 96 } 97 98 export interface ProChip { 99 label: string; 100 title: string; 101 href: string; 96 102 } 97 103 … … 118 124 tools?: ListedExtension[]; 119 125 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; 120 128 currency: CurrencyConfig; 121 129 endpoints: DesignerEndpoints; -
printblob/tags/1.3.0/src/designer/render.php
r3751165 r3751408 149 149 $printblob_config = (array) apply_filters( 'printblob_designer_config', $printblob_config, $printblob_product ); 150 150 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(); 153 if ( $printblob_pro_chip ) { 154 $printblob_config['proChip'] = $printblob_pro_chip; 155 } 156 151 157 // A variation that depends on an attribute the designer doesn't offer could only be ordered as the wrong one. 152 158 $printblob_offered = array_merge( … … 210 216 <div class="printblob-designer__stage-column"> 211 217 <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; ?> 217 225 <?php foreach ( (array) ( $printblob_config['views'] ?? array() ) as $printblob_view ) : ?> 218 226 <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> 219 227 <?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; ?> 220 231 </div> 221 232 <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 135 135 } 136 136 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 137 158 // Always in the tab, shown once the side has a print, so the tab keeps its width. 138 159 .printblob-designer__side-dot { -
printblob/tags/1.3.0/uninstall.php
r3750583 r3751408 13 13 global $wpdb; 14 14 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 ) {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', 'printblob_order_milestone_dismissed', 'printblob_quick_setup' ) as $printblob_option ) { 16 16 delete_option( $printblob_option ); 17 17 } 18 18 $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. 19 19 wp_clear_scheduled_hook( 'printblob_cleanup_designs' ); 20 delete_metadata( 'user', 0, 'printblob_pro_hint_dismissed', '', true ); 20 delete_transient( 'printblob_print_folder_check' ); 21 foreach ( 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 } 29 foreach ( 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 } 21 32 22 33 // Every post of a type, or every attachment of a post, by ID. -
printblob/tags/1.3.0/webpack.config.mts
r3750583 r3751408 14 14 import { INK_COLORS } from './src/designer/app/ink.ts'; 15 15 16 const admin = { 'admin/ mockup-editor': './src/admin/mockup-editor.ts', 'admin/term-image': './src/admin/term-image.ts' };16 const admin = { 'admin/term-image': './src/admin/term-image.ts', 'admin/pro-box': './src/admin/pro-box.ts' }; 17 17 18 18 const withAdmin = async ( entry: Configuration[ 'entry' ] ): Promise< EntryObject > => { -
printblob/trunk/assets/designer.json
r3750583 r3751408 1 1 { 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" ], 3 4 "stage_width": 1000, 4 5 "print_dpi": 300, -
printblob/trunk/build/admin/term-image.asset.php
r3750583 r3751408 3 3 'jquery' 4 4 ), 5 'version' => ' e08ff7b792227bd5f4fa'5 'version' => '26adf56b3d5ffb32e043' 6 6 ); -
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 149 149 $printblob_config = (array) apply_filters( 'printblob_designer_config', $printblob_config, $printblob_product ); 150 150 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(); 153 if ( $printblob_pro_chip ) { 154 $printblob_config['proChip'] = $printblob_pro_chip; 155 } 156 151 157 // A variation that depends on an attribute the designer doesn't offer could only be ordered as the wrong one. 152 158 $printblob_offered = array_merge( … … 210 216 <div class="printblob-designer__stage-column"> 211 217 <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; ?> 217 225 <?php foreach ( (array) ( $printblob_config['views'] ?? array() ) as $printblob_view ) : ?> 218 226 <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> 219 227 <?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; ?> 220 231 </div> 221 232 <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 6 6 'wp-i18n' 7 7 ), 8 'version' => ' 60ca96706854fdd0ab81'8 'version' => 'da6fbaf91134b31e3aec' 9 9 ); -
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 2 2 (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. */ 3 3 (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,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">");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,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">");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. */ 5 5 (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. */ 6 6 (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. */ … … 8 8 (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. */ 9 9 (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. */ 11 11 (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 2 2 3 3 The 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 23 Older entries are in changelog.txt. 4 24 5 25 = 1.0.3 = -
printblob/trunk/includes/class-cart.php
r3750583 r3751408 60 60 } 61 61 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 */ 63 68 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 ) ) { 65 70 return array(); 66 71 } 67 72 $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(); 69 74 } 70 75 -
printblob/trunk/includes/class-design-store.php
r3750583 r3751408 543 543 public static function mark_ordered( int $design_id, int $order_id ): void { 544 544 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 ) ) ); 545 596 } 546 597 -
printblob/trunk/includes/class-designer-data.php
r3750583 r3751408 3 3 * The designer's data, written once in assets/ and read by its TypeScript and every host too: its fixed numbers 4 4 * (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). 6 6 * 7 7 * @package PrintBlob … … 25 25 } 26 26 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 27 32 /** A printed length in centimetres as pixels of the print file. */ 28 33 public static function print_pixels( float $cm ): int { -
printblob/trunk/includes/class-mockups.php
r3750583 r3751408 3 3 * Mockups: the product photos customers design on. 4 4 * 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`). 8 10 * 9 11 * Print areas are stored as fractions of the photo (0–1), so any photo size works. The designer works on … … 23 25 public const PRODUCT_META = '_printblob_mockup'; 24 26 public const DEFAULT_OPTION = 'printblob_default_mockup'; 27 public const PAGE = 'printblob-mockups'; 28 public const STYLE = 'printblob-mockups'; 25 29 26 30 /** Revision of the bundled photos the default mockup has been upgraded to (see use_bundled_photos()). */ 27 31 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 = ''; 28 35 29 36 /** … … 34 41 public static function sides(): array { 35 42 /** 36 * Filters the printable sides of products. Add-ons can add sides (e.g. sleeves); each side gets its37 * 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. 38 45 * 39 46 * @param string[] $sides Side keys in display order. 40 47 */ 41 $sides = (array) apply_filters( 'printblob_sides', array( 'front', 'back' ));48 $sides = (array) apply_filters( 'printblob_sides', Designer_Data::numbers()['sides'] ); 42 49 return array_values( array_unique( array_map( 'sanitize_key', $sides ) ) ); 43 50 } … … 47 54 add_action( 'admin_init', array( __CLASS__, 'ensure_default' ) ); 48 55 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' ) ); 51 57 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 );54 58 } 55 59 … … 71 75 ), 72 76 'public' => false, 73 'show_ui' => true,74 'show_in_menu' => 'edit.php?post_type=product',77 'show_ui' => false, 78 'show_in_menu' => false, 75 79 'supports' => array( 'title' ), 76 80 'capability_type' => 'product', … … 218 222 } 219 223 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 220 230 /** Kept for setup scripts written for 1.0.2: the same upgrade as use_bundled_photos(). */ 221 231 public static function use_bundled_webp(): void { … … 353 363 /* ---------------------------------------------------------------- Admin */ 354 364 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 ); 358 377 return; 359 378 } 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 { 381 403 ?> 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> 403 432 <?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> 420 434 <?php endforeach; ?> 421 435 </div> 422 436 <?php 423 437 } 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 }478 438 } -
printblob/trunk/includes/class-onboarding.php
r3750583 r3751408 3 3 * First steps after activation: a dismissible notice with the three things to set up. 4 4 * 5 * Shown to shop managers on the Plugins screen and PrintBlob's own screens (its settings tab and the mockups) until6 * 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. 7 7 * 8 8 * @package PrintBlob … … 31 31 return; 32 32 } 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 } 33 56 $dismiss = wp_nonce_url( admin_url( 'admin-post.php?action=printblob_dismiss_welcome' ), 'printblob_dismiss_welcome' ); 34 57 $steps = array( 35 58 sprintf( 36 /* translators: %s: link to Pr oducts› Mockups. */37 __( 'Check the t-shirt mockup or add your own product photos and print areasunder %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>' 39 62 ), 40 63 sprintf( 41 64 /* 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' ), 43 66 '<a href="' . esc_url( admin_url( 'edit.php?post_type=product' ) ) . '">' . esc_html__( 'Products', 'printblob' ) . '</a>' 44 67 ), 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' ), 46 69 ); 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 ); 62 82 } 63 83 -
printblob/trunk/includes/class-order.php
r3750583 r3751408 110 110 if ( ! $offered ) { 111 111 $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 ) ); 113 114 } 114 115 } 115 116 116 117 /** 117 * One quiet line under an order's first designed item about what PrintBlob Pro adds there, while Pro is not active118 * 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. 119 120 * 121 * @param int $files The order's print files. 120 122 * @param bool|null $pro_active Whether Pro is active; Settings::pro_active() when null. 121 123 * @param int|null $user_id The admin; the current user when null. 122 124 */ 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 ) ) { 125 127 return ''; 126 128 } 127 129 return sprintf( 128 130 '<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' ), 132 135 esc_url( wp_nonce_url( admin_url( 'admin-post.php?action=printblob_dismiss_pro_hint' ), 'printblob_dismiss_pro_hint' ) ), 133 136 esc_html__( 'Dismiss', 'printblob' ) -
printblob/trunk/includes/class-product-settings.php
r3750583 r3751408 22 22 add_action( 'woocommerce_admin_process_product_object', array( __CLASS__, 'save' ) ); 23 23 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' ) ); 24 26 // A designed shirt always has a print: listed prices include the cheapest printed side. 25 27 foreach ( array( 'price', 'regular_price', 'sale_price' ) as $printblob_kind ) { … … 89 91 90 92 /** 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()). 93 96 */ 94 97 public static function designer_template( array $templates ): array { … … 98 101 } 99 102 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 ); 100 176 } 101 177 … … 137 213 'id' => Mockups::PRODUCT_META, 138 214 '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' ), 140 216 'desc_tip' => true, 141 217 'value' => (string) ( $chosen ? $chosen : $default ), … … 155 231 ); 156 232 } 233 echo wp_kses( Pro::product_html( Mockups::sides() ), Pro::LOCK_HTML ); 157 234 /** 158 235 * 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 1 1 <?php 2 2 /** 3 * One request for a review on WordPress.org. Once the shop has its first order with a design, PrintBlob's own4 * screens (its settings tab and the mockup screens) ask once; following the request or dismissing it ends it for5 * 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. 6 6 * 7 7 * @package PrintBlob … … 14 14 final class Review_Request { 15 15 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 */ 17 20 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; 18 24 19 25 public const REVIEW_URL = FACTS['reviews']; … … 24 30 } 25 31 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. */ 27 33 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 ) ) { 29 36 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 ); 30 39 } 31 40 } … … 58 67 59 68 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 ) ) { 61 71 return ''; 62 72 } 63 73 $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' ) ); 64 77 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 ) ), 67 83 esc_url( $answer( 'review' ) ), 68 84 esc_html__( 'Write a review', 'printblob' ), 69 esc_url( $answer( 'dismiss' ) ), 70 esc_html__( 'Dismiss', 'printblob' ) 85 $later 71 86 ); 72 87 } 73 88 74 89 /** 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. 76 92 * 77 * @param string $answer 'review' or 'dismiss'.93 * @param string $answer 'review', 'dismiss' or 'never'. 78 94 */ 79 95 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 ) ) { 81 97 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 ); 82 101 } 83 102 } -
printblob/trunk/includes/class-settings-page.php
r3750583 r3751408 28 28 protected function get_settings_for_default_section() { 29 29 $attributes = Settings::attribute_choices(); 30 $pro = Settings::pro_rows(); 30 31 $designer = array( 31 32 array( … … 34 35 'title' => __( 'Designer', 'printblob' ), 35 36 'desc' => sprintf( 36 /* translators: %s: link to Pr oducts› Mockups. */37 __( 'Turn the designer on per product in its PrintBlob tab. Product photos and print areas are set upunder %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>' 39 40 ), 40 41 ), … … 89 90 ), 90 91 ), 92 ); 93 return array_merge( 94 $designer, 95 $pro['fonts'], 91 96 array( 92 'id' => 'printblob_designer', 93 'type' => 'sectionend', 97 array( 98 'id' => 'printblob_designer', 99 'type' => 'sectionend', 100 ), 94 101 ), 102 $pro['panel'] 95 103 ); 96 return array_merge( $designer, Settings::pro_panel() );97 104 } 98 105 } -
printblob/trunk/includes/class-settings.php
r3750583 r3751408 23 23 add_filter( 'plugin_action_links_' . plugin_basename( FILE ), array( __CLASS__, 'action_links' ) ); 24 24 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' ) ); 25 26 } 26 27 27 28 /** 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. 29 31 * 30 32 * @param string[] $links The row's links. … … 37 39 } 38 40 $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>'; 39 42 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>'; 41 46 } 42 47 return $links; … … 77 82 } 78 83 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. */ 80 85 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; 82 88 } 83 89 … … 96 102 97 103 /** 98 * The PrintBlob Pro panel at the end of the settings screen: what Pro adds and where its plans are, while Pro is not99 * 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. 100 106 * 101 107 * @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. 103 109 */ 104 public static function pro_ panel( ?bool $pro_active = null ): array {110 public static function pro_rows( ?bool $pro_active = null ): array { 105 111 if ( $pro_active ?? self::pro_active() ) { 106 return array(); 112 return array( 113 'fonts' => array(), 114 'panel' => array(), 115 ); 107 116 } 117 $points = implode( '', array_map( static fn( string $point ): string => '<li>' . esc_html( $point ) . '</li>', Pro::points() ) ); 108 118 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', 118 125 ), 119 126 ), 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 ), 123 148 ), 124 149 ); 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 125 164 } 126 165 -
printblob/trunk/includes/facts.json
r3750583 r3751408 1 1 { 2 2 "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 } 5 126 } -
printblob/trunk/languages/printblob.pot
r3751165 r3751408 3 3 msgid "" 4 4 msgstr "" 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" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/printblob\n" 7 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" … … 10 10 "Content-Type: text/plain; charset=UTF-8\n" 11 11 "Content-Transfer-Encoding: 8bit\n" 12 "POT-Creation-Date: 2026-10-1 6T20:25:53+00:00\n"12 "POT-Creation-Date: 2026-10-17T03:32:40+00:00\n" 13 13 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 14 "X-Generator: WP-CLI 2.12.0\n" … … 27 27 #. Description of the plugin 28 28 #: 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."29 msgid "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." 30 30 msgstr "" 31 31 … … 41 41 42 42 #: build/colors/render.php:45 43 #: includes/class-order.php:16 243 #: includes/class-order.php:165 44 44 msgid "Design" 45 45 msgstr "" … … 50 50 51 51 #. translators: %s: attribute names, such as Material. 52 #: build/designer/render.php:1 6952 #: build/designer/render.php:175 53 53 #, php-format 54 54 msgid "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." 55 55 msgstr "" 56 56 57 #: build/designer/render.php:2 2257 #: build/designer/render.php:233 58 58 #: build/designer/view.js:10 59 59 msgid "Loading the designer…" … … 61 61 62 62 #. translators: 1: print area width in cm, 2: print area height in cm. 63 #: build/designer/render.php:2 2763 #: build/designer/render.php:238 64 64 #: build/designer/view.js:11 65 65 #, php-format,js-format … … 67 67 msgstr "" 68 68 69 #: build/designer/render.php:2 3569 #: build/designer/render.php:246 70 70 #: build/designer/view.js:11 71 71 msgid "Your print" 72 72 msgstr "" 73 73 74 #: build/designer/render.php:2 3774 #: build/designer/render.php:248 75 75 #: build/designer/view.js:11 76 76 msgid "Upload image" 77 77 msgstr "" 78 78 79 #: build/designer/render.php:2 3879 #: build/designer/render.php:249 80 80 #: build/designer/view.js:11 81 81 msgid "Add text" 82 82 msgstr "" 83 83 84 #: build/designer/render.php:2 4784 #: build/designer/render.php:258 85 85 #: build/designer/view.js:5 86 86 msgid "Font" 87 87 msgstr "" 88 88 89 #: build/designer/render.php:2 4889 #: build/designer/render.php:259 90 90 #: build/designer/view.js:5 91 91 msgid "Bold" 92 92 msgstr "" 93 93 94 #: build/designer/render.php:2 5194 #: build/designer/render.php:262 95 95 #: build/designer/view.js:5 96 96 msgid "Ink colour" 97 97 msgstr "" 98 98 99 #: build/designer/render.php:2 6099 #: build/designer/render.php:271 100 100 #: build/designer/view.js:4 101 101 msgid "Centre" 102 102 msgstr "" 103 103 104 #: build/designer/render.php:2 60104 #: build/designer/render.php:271 105 105 #: build/designer/view.js:4 106 106 msgid "Bring forward" 107 107 msgstr "" 108 108 109 #: build/designer/render.php:2 60109 #: build/designer/render.php:271 110 110 #: build/designer/view.js:4 111 111 msgid "Send back" 112 112 msgstr "" 113 113 114 #: build/designer/render.php:2 60114 #: build/designer/render.php:271 115 115 #: includes/class-shirt-colors.php:104 116 116 #: build/designer/view.js:4 … … 119 119 120 120 #. 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 122 123 #: build/designer/view.js:5 123 124 msgid "Done" … … 125 126 126 127 #. translators: shown where the controls appear while the printed side shown has nothing on it. 127 #: build/designer/render.php:2 65128 #: build/designer/render.php:276 128 129 #: build/designer/view.js:10 129 130 msgid "Upload an image or add text to start." 130 131 msgstr "" 131 132 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 133 136 #: build/designer/view.js:11 134 137 msgid "Colour" 135 138 msgstr "" 136 139 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 138 143 #: build/designer/view.js:11 139 144 msgid "Size" 140 145 msgstr "" 141 146 142 #: build/designer/render.php:3 05147 #: build/designer/render.php:316 143 148 #: build/designer/view.js:2 144 149 msgid "Quantity" 145 150 msgstr "" 146 151 147 #: build/designer/render.php:3 10152 #: build/designer/render.php:321 148 153 #: includes/class-privacy.php:103 154 #: includes/class-quick-setup.php:524 149 155 #: build/designer/index.js:1 150 156 #: build/designer/view.js:2 … … 153 159 154 160 #. translators: %s: printed side, e.g. Front. 155 #: build/designer/render.php:3 16161 #: build/designer/render.php:327 156 162 #: build/designer/view.js:3 157 163 #, php-format,js-format … … 160 166 161 167 #. translators: in the price breakdown, beside a side (e.g. "Back print") that has no design. 162 #: build/designer/render.php:3 19168 #: build/designer/render.php:330 163 169 #: build/designer/view.js:4 164 170 msgid "Not printed" 165 171 msgstr "" 166 172 167 #: build/designer/render.php:3 22173 #: build/designer/render.php:333 168 174 #: build/designer/view.js:4 169 175 msgid "Total" 170 176 msgstr "" 171 177 172 #: build/designer/render.php:3 26178 #: build/designer/render.php:337 173 179 #: build/designer/view.js:2 174 180 #: build/designer/view.js:4 … … 176 182 msgstr "" 177 183 178 #: build/designer/render.php:3 27184 #: build/designer/render.php:338 179 185 #: build/designer/view.js:2 180 186 msgid "Preparing your print file…" 181 187 msgstr "" 182 188 183 #: build/designer/render.php:3 27189 #: build/designer/render.php:338 184 190 #: build/designer/view.js:2 185 191 msgid "Saving your design…" 186 192 msgstr "" 187 193 188 #: build/designer/render.php:3 27194 #: build/designer/render.php:338 189 195 #: build/designer/view.js:2 190 196 msgid "Adding to cart…" 191 197 msgstr "" 192 198 193 #: build/designer/render.php:3 32199 #: build/designer/render.php:343 194 200 #: build/designer/view.js:1 195 201 msgid "Added to your cart." 196 202 msgstr "" 197 203 198 #: build/designer/render.php:3 32204 #: build/designer/render.php:343 199 205 #: build/designer/view.js:2 200 206 msgid "View cart" 201 207 msgstr "" 202 208 203 #: build/designer/render.php:3 35209 #: build/designer/render.php:346 204 210 #: build/designer/view.js:1 205 211 msgid "Add an image or text to the front or back first." 206 212 msgstr "" 207 213 208 #: build/designer/render.php:3 36214 #: build/designer/render.php:347 209 215 #: build/designer/view.js:1 210 216 msgid "Choose a size." 211 217 msgstr "" 212 218 213 #: build/designer/render.php:3 37219 #: build/designer/render.php:348 214 220 #: build/designer/view.js:1 215 221 msgid "This combination is sold out. Choose another." 216 222 msgstr "" 217 223 218 #: build/designer/render.php:3 38224 #: build/designer/render.php:349 219 225 #: build/designer/view.js:1 220 226 msgid "This colour and size is sold out. Choose another." 221 227 msgstr "" 222 228 223 #: build/designer/render.php:3 39229 #: build/designer/render.php:350 224 230 #: build/designer/view.js:1 225 231 msgid "Use a PNG, JPG or WebP image." 226 232 msgstr "" 227 233 228 #: build/designer/render.php:3 40234 #: build/designer/render.php:351 229 235 #: includes/class-design-store.php:435 230 236 #: build/designer/view.js:1 … … 232 238 msgstr "" 233 239 234 #: build/designer/render.php:3 41240 #: build/designer/render.php:352 235 241 #: build/designer/view.js:1 236 242 msgid "The product could not be added to the cart." … … 238 244 239 245 #. translators: %d: largest allowed file size in megabytes. 240 #: build/designer/render.php:3 43246 #: build/designer/render.php:354 241 247 #: build/designer/view.js:2 242 248 #, php-format,js-format … … 244 250 msgstr "" 245 251 246 #: build/designer/render.php:3 54252 #: build/designer/render.php:365 247 253 msgid "The designer needs JavaScript. Turn it on in your browser to design your product." 254 msgstr "" 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 260 msgid "PrintBlob overview" 261 msgstr "" 262 263 #: includes/class-admin-menu.php:37 264 msgid "Overview" 265 msgstr "" 266 267 #: includes/class-admin-menu.php:38 268 msgid "PrintBlob settings" 269 msgstr "" 270 271 #: includes/class-admin-menu.php:38 272 #: includes/class-settings.php:61 273 msgid "Settings" 274 msgstr "" 275 276 #: includes/class-admin-menu.php:46 277 #: includes/class-dashboard-widget.php:71 278 #: includes/class-print-queue.php:86 279 msgid "Print queue" 280 msgstr "" 281 282 #: includes/class-admin-menu.php:48 283 #: includes/class-overview.php:238 284 #: includes/class-settings.php:131 285 msgid "PrintBlob Pro" 286 msgstr "" 287 288 #: includes/class-admin-menu.php:52 289 msgid "Get Pro" 290 msgstr "" 291 292 #: includes/class-admin-menu.php:52 293 #: includes/class-deactivation-feedback.php:122 294 #: includes/class-mockups.php:410 295 msgid "Get PrintBlob Pro" 296 msgstr "" 297 298 #. translators: %s: five stars, linking to PrintBlob's reviews on WordPress.org. 299 #: includes/class-admin-menu.php:92 300 #, php-format 301 msgid "If PrintBlob helps your shop, please rate it %s on WordPress.org." 302 msgstr "" 303 304 #: includes/class-admin-menu.php:93 305 msgid "Rate PrintBlob on WordPress.org" 248 306 msgstr "" 249 307 … … 256 314 msgstr "" 257 315 258 #: includes/class-cart.php:9 3316 #: includes/class-cart.php:98 259 317 #: includes/class-order.php:37 260 318 msgid "Print" 261 319 msgstr "" 262 320 263 #: includes/class-cart.php:1 25264 #: includes/class-cart.php:1 37321 #: includes/class-cart.php:130 322 #: includes/class-cart.php:142 265 323 msgid "Your design" 324 msgstr "" 325 326 #: includes/class-dashboard-widget.php:32 327 msgid "PrintBlob this week" 328 msgstr "" 329 330 #. translators: %d: number of orders. 331 #: includes/class-dashboard-widget.php:66 332 #, php-format 333 msgid "%d order with a design this week" 334 msgid_plural "%d orders with designs this week" 335 msgstr[0] "" 336 msgstr[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 345 msgid "PrintBlob Pro add-on" 346 msgstr "" 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 352 msgid "Start your free trial" 353 msgstr "" 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 361 msgid "Dismiss" 362 msgstr "" 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 374 msgid "You are not allowed to do this." 375 msgstr "" 376 377 #: includes/class-deactivation-feedback.php:91 378 msgid "It’s only for a moment: I’m fixing something" 379 msgstr "" 380 381 #: includes/class-deactivation-feedback.php:92 382 msgid "It didn’t work on my site" 383 msgstr "" 384 385 #: includes/class-deactivation-feedback.php:93 386 msgid "It was hard to set up or use" 387 msgstr "" 388 389 #: includes/class-deactivation-feedback.php:94 390 msgid "I need back or sleeve printing" 391 msgstr "" 392 393 #: includes/class-deactivation-feedback.php:95 394 msgid "I need my own products" 395 msgstr "" 396 397 #: includes/class-deactivation-feedback.php:96 398 msgid "I need a 3D view" 399 msgstr "" 400 401 #: includes/class-deactivation-feedback.php:97 402 msgid "I need a print queue" 403 msgstr "" 404 405 #: includes/class-deactivation-feedback.php:98 406 msgid "I found another plugin" 407 msgstr "" 408 409 #: includes/class-deactivation-feedback.php:99 410 msgid "Something else" 411 msgstr "" 412 413 #: includes/class-deactivation-feedback.php:104 414 msgid "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." 415 msgstr "" 416 417 #: includes/class-deactivation-feedback.php:117 418 #: includes/class-pro.php:118 419 msgid "PrintBlob Pro add-on:" 420 msgstr "" 421 422 #: includes/class-deactivation-feedback.php:140 423 msgid "Tell us more below if you like: what you needed, or what went wrong." 424 msgstr "" 425 426 #: includes/class-deactivation-feedback.php:168 427 msgid "Why are you leaving?" 428 msgstr "" 429 430 #: includes/class-deactivation-feedback.php:171 431 msgid "Your note (optional)" 432 msgstr "" 433 434 #: includes/class-deactivation-feedback.php:173 435 msgid "Your email address, if you would like an answer (optional)" 436 msgstr "" 437 438 #: includes/class-deactivation-feedback.php:177 439 msgid "Skip and deactivate" 440 msgstr "" 441 442 #: includes/class-deactivation-feedback.php:178 443 msgid "Send and deactivate" 266 444 msgstr "" 267 445 … … 340 518 msgstr "" 341 519 342 #: includes/class-design-store.php: 588343 #: includes/class-design-store.php:6 13520 #: includes/class-design-store.php:639 521 #: includes/class-design-store.php:664 344 522 msgid "PrintBlob print files are private" 345 523 msgstr "" 346 524 347 #: includes/class-design-store.php:6 19525 #: includes/class-design-store.php:670 348 526 msgid "Customers’ print files cannot be downloaded from the web; shop managers download them from the order screen." 349 527 msgstr "" 350 528 351 #: includes/class-design-store.php:6 23529 #: includes/class-design-store.php:674 352 530 msgid "PrintBlob print files can be downloaded from the web" 353 531 msgstr "" 354 532 355 #: includes/class-design-store.php:6 25533 #: includes/class-design-store.php:676 356 534 msgid "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:" 357 535 msgstr "" 358 536 359 #: includes/class-design-store.php:6 28537 #: includes/class-design-store.php:679 360 538 msgid "PrintBlob could not check that print files are private" 361 539 msgstr "" 362 540 363 #: includes/class-design-store.php:6 30541 #: includes/class-design-store.php:681 364 542 msgid "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:" 365 543 msgstr "" 366 544 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 551 msgid "Mockups" 552 msgstr "" 553 554 #: includes/class-mockups.php:66 555 #: includes/class-product-settings.php:214 556 msgid "Mockup" 557 msgstr "" 558 559 #: includes/class-mockups.php:67 560 #: includes/class-mockups.php:68 561 msgid "Add mockup" 562 msgstr "" 563 564 #: includes/class-mockups.php:69 565 msgid "Edit mockup" 566 msgstr "" 567 368 568 #: includes/class-mockups.php:70 369 msgid "Mockups"370 msgstr ""371 372 #: includes/class-mockups.php:62373 #: includes/class-product-settings.php:138374 msgid "Mockup"375 msgstr ""376 377 #: includes/class-mockups.php:63378 #: includes/class-mockups.php:64379 msgid "Add mockup"380 msgstr ""381 382 #: includes/class-mockups.php:65383 msgid "Edit mockup"384 msgstr ""385 386 #: includes/class-mockups.php:66387 569 msgid "New mockup" 388 570 msgstr "" 389 571 390 #: includes/class-mockups.php: 67572 #: includes/class-mockups.php:71 391 573 msgid "Search mockups" 392 574 msgstr "" 393 575 394 #: includes/class-mockups.php: 68576 #: includes/class-mockups.php:72 395 577 msgid "No mockups yet." 396 578 msgstr "" 397 579 398 #: includes/class-mockups.php: 69580 #: includes/class-mockups.php:73 399 581 msgid "No mockups in the trash." 400 582 msgstr "" 401 583 402 #: includes/class-mockups.php:136 584 #: includes/class-mockups.php:140 585 #: includes/class-quick-setup.php:88 403 586 msgid "T-shirt" 404 587 msgstr "" 405 588 406 #: includes/class-mockups.php:1 58589 #: includes/class-mockups.php:162 407 590 msgid "T-shirt mockup (back)" 408 591 msgstr "" 409 592 410 #: includes/class-mockups.php:1 58593 #: includes/class-mockups.php:162 411 594 msgid "T-shirt mockup" 412 595 msgstr "" 413 596 414 #: includes/class-mockups.php:310 597 #: includes/class-mockups.php:320 598 #: includes/class-pro.php:369 415 599 msgid "Back" 416 600 msgstr "" 417 601 418 #: includes/class-mockups.php:3 10602 #: includes/class-mockups.php:320 419 603 msgid "Front" 420 604 msgstr "" 421 605 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 609 msgid "%1$s × %2$s cm" 610 msgstr "" 611 612 #: includes/class-mockups.php:406 613 msgid "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." 614 msgstr "" 615 616 #: includes/class-mockups.php:408 617 msgid "Your own products — mugs, hoodies, bags, your own photos — with the PrintBlob Pro add-on" 618 msgstr "" 619 620 #: includes/class-mockups.php:409 621 msgid "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." 450 622 msgstr "" 451 623 452 624 #: 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" 625 msgid "Recoloured to the colour the customer picks." 626 msgstr "" 627 628 #. translators: %s: link to PrintBlob › Mockups. 629 #: includes/class-onboarding.php:60 630 #, php-format 631 msgid "Check the bundled product mockup under %s." 632 msgstr "" 633 634 #: includes/class-onboarding.php:61 635 #: includes/class-settings-page.php:39 636 msgid "PrintBlob › Mockups" 483 637 msgstr "" 484 638 485 639 #. translators: %s: link to Products. 486 #: includes/class-onboarding.php: 42640 #: includes/class-onboarding.php:65 487 641 #, php-format 488 642 msgid "Edit a product, open its PrintBlob designer tab, turn the designer on and set the print price per side (%s)." 489 643 msgstr "" 490 644 491 #: includes/class-onboarding.php:43 645 #: includes/class-onboarding.php:66 646 #: includes/class-overview.php:106 492 647 msgid "Products" 493 648 msgstr "" 494 649 495 #: includes/class-onboarding.php: 45650 #: includes/class-onboarding.php:68 496 651 msgid "Add the PrintBlob designer block to a page, or open the product: the designer shows on its page." 497 652 msgstr "" 498 653 499 #: includes/class-onboarding.php: 49654 #: includes/class-onboarding.php:73 500 655 msgid "PrintBlob is ready. Three steps to your first designable product:" 501 656 msgstr "" 502 657 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 659 msgid "Quick setup: all three in one click" 660 msgstr "" 661 662 #: includes/class-onboarding.php:78 663 #: includes/class-overview.php:244 664 #: includes/class-settings.php:40 509 665 msgid "Documentation" 510 666 msgstr "" 511 667 512 # : includes/class-onboarding.php:58513 #: includes/class-order .php:133514 # : includes/class-review-request.php:70515 msgid " Dismiss"668 #. translators: %d: number of orders with designs (10, 25 or 50). 669 #: includes/class-order-milestones.php:52 670 #, php-format 671 msgid "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." 516 672 msgstr "" 517 673 518 674 #. translators: %s: printed side, e.g. Front. 519 675 #: includes/class-order.php:88 676 #: includes/class-print-queue.php:109 520 677 #, php-format 521 678 msgid "Download %s print file" … … 528 685 msgstr "" 529 686 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 690 msgid "This order’s %d print file in one ZIP, with PrintBlob Pro." 691 msgid_plural "This order’s %d print files in one ZIP, with PrintBlob Pro." 692 msgstr[0] "" 693 msgstr[1] "" 694 695 #: includes/class-order.php:134 696 msgid "About the PrintBlob Pro add-on" 697 msgstr "" 698 699 #: includes/class-overview.php:38 700 #: includes/class-quick-setup.php:556 701 #: includes/class-settings-page.php:45 702 msgid "Designer page" 703 msgstr "" 704 705 #. translators: %s: page title. 706 #: includes/class-overview.php:46 707 #, php-format 708 msgid "“%s”, the first published page with the designer block." 709 msgstr "" 710 711 #. translators: %s: page title. 712 #: includes/class-overview.php:46 713 #: includes/class-overview.php:59 714 msgid "View" 715 msgstr "" 716 717 #: includes/class-overview.php:47 718 msgid "No page is set and no published page has the designer block. Products with the designer still show it on their own page." 719 msgstr "" 720 721 #: includes/class-overview.php:47 722 msgid "Choose a page" 723 msgstr "" 724 725 #. translators: %s: page title. 726 #: includes/class-overview.php:52 727 #, php-format 728 msgid "“%s” is not published." 729 msgstr "" 730 731 #. translators: %s: page title. 732 #: includes/class-overview.php:52 733 msgid "Edit the page" 734 msgstr "" 735 736 #. translators: %s: page title. 737 #: includes/class-overview.php:56 738 #, php-format 739 msgid "“%s” has no PrintBlob designer block." 740 msgstr "" 741 742 #. translators: %s: page title. 743 #: includes/class-overview.php:56 744 msgid "Add the block" 745 msgstr "" 746 747 #. translators: %s: page title. 748 #: includes/class-overview.php:59 749 #, php-format 750 msgid "“%s” is published and shows the designer." 751 msgstr "" 752 753 #: includes/class-overview.php:63 754 #: includes/class-quick-setup.php:500 755 msgid "Colours" 756 msgstr "" 757 758 #: includes/class-overview.php:67 759 msgid "The colour attribute chosen in the settings does not exist." 760 msgstr "" 761 762 #: includes/class-overview.php:67 763 #: includes/class-overview.php:90 764 msgid "Product attributes" 765 msgstr "" 766 767 #: includes/class-overview.php:72 768 msgid "The colour attribute has no colours yet." 769 msgstr "" 770 771 #: includes/class-overview.php:72 772 msgid "Add colours" 773 msgstr "" 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 778 msgid "%1$d colour: %2$d with a colour value, %3$d with its own photo." 779 msgid_plural "%1$d colours: %2$d with a colour value, %3$d with their own photo." 780 msgstr[0] "" 781 msgstr[1] "" 782 783 #: includes/class-overview.php:83 784 msgid "Edit colours" 785 msgstr "" 786 787 #: includes/class-overview.php:83 788 msgid "Give each colour a value" 789 msgstr "" 790 791 #: includes/class-overview.php:87 792 #: includes/class-quick-setup.php:512 793 msgid "Sizes" 794 msgstr "" 795 796 #: includes/class-overview.php:90 797 msgid "The size attribute chosen in the settings does not exist. Without one, customers choose no size." 798 msgstr "" 799 800 #. translators: %d: number of sizes. 801 #: includes/class-overview.php:99 802 #, php-format 803 msgid "%d size." 804 msgid_plural "%d sizes." 805 msgstr[0] "" 806 msgstr[1] "" 807 808 #. translators: %d: number of sizes. 809 #: includes/class-overview.php:99 810 msgid "Edit sizes" 811 msgstr "" 812 813 #. translators: %d: number of sizes. 814 #: includes/class-overview.php:99 815 msgid "Add sizes" 816 msgstr "" 817 818 #: includes/class-overview.php:103 819 msgid "Products with the designer" 820 msgstr "" 821 822 #: includes/class-overview.php:106 823 msgid "No product has the designer on. Edit a product, open its PrintBlob designer tab and turn the designer on." 824 msgstr "" 825 826 #. translators: %d: number of products. 827 #: includes/class-overview.php:113 828 #, php-format 829 msgid "%d product:" 830 msgid_plural "%d products:" 831 msgstr[0] "" 832 msgstr[1] "" 833 834 #: includes/class-overview.php:117 835 msgid "Default mockup" 836 msgstr "" 837 838 #. translators: %s: mockup title. 839 #: includes/class-overview.php:122 840 #, php-format 841 msgid "“%s”, which products use unless they choose another." 842 msgstr "" 843 844 #: includes/class-overview.php:123 845 msgid "The bundled product mockup is missing. It is made again the next time a shop manager opens the dashboard." 846 msgstr "" 847 848 #: includes/class-overview.php:123 849 msgid "Dashboard" 850 msgstr "" 851 852 #: includes/class-overview.php:132 853 msgid "Print files" 854 msgstr "" 855 856 #: includes/class-overview.php:132 857 msgid "Site Health" 858 msgstr "" 859 860 #: includes/class-overview.php:170 861 msgid "To do" 862 msgstr "" 863 864 #: includes/class-overview.php:183 865 msgid "Set-up" 866 msgstr "" 867 868 #: includes/class-overview.php:185 869 msgid "Quick setup: a designable product in one click" 870 msgstr "" 871 872 #: includes/class-overview.php:204 873 msgid "Orders with designs" 874 msgstr "" 875 876 #. translators: %d: number of orders. 877 #: includes/class-overview.php:208 878 #, php-format 879 msgid "%d order with a design this month." 880 msgid_plural "%d orders with designs this month." 881 msgstr[0] "" 882 msgstr[1] "" 883 884 #. translators: %s: order number. 885 #: includes/class-overview.php:218 886 #: includes/class-print-queue.php:95 887 #, php-format 888 msgid "Order #%s" 889 msgstr "" 890 891 #. translators: %d: number of print files. 892 #: includes/class-overview.php:227 893 #: includes/class-print-queue.php:69 894 #, php-format 895 msgid "%d print file" 896 msgid_plural "%d print files" 897 msgstr[0] "" 898 msgstr[1] "" 899 900 #: includes/class-overview.php:233 901 msgid "No order has a design yet." 902 msgstr "" 903 904 #. translators: %s: version number. 905 #: includes/class-overview.php:239 906 #, php-format 907 msgid "PrintBlob Pro %s is active." 908 msgstr "" 909 910 #. translators: %s: version number. 911 #: includes/class-overview.php:240 912 msgid "Licence" 913 msgstr "" 914 915 #: includes/class-print-queue.php:66 916 msgid "No processing order has a design waiting to print." 917 msgstr "" 918 919 #. translators: %d: number of orders. 920 #: includes/class-print-queue.php:71 921 #, php-format 922 msgid "%d order" 923 msgid_plural "%d orders" 924 msgstr[0] "" 925 msgstr[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 930 msgid "You have %1$s in %2$s waiting: with PrintBlob Pro, one ZIP per order." 931 msgstr "" 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 936 msgid "You have %1$s in %2$s waiting to print." 937 msgstr "" 938 939 #. translators: %d: number of print files. 940 #: includes/class-print-queue.php:120 941 #, php-format 942 msgid "Download its %d print file as one ZIP" 943 msgid_plural "Download all %d print files of this order as one ZIP" 944 msgstr[0] "" 945 msgstr[1] "" 946 947 #: includes/class-print-queue.php:121 948 msgid "Mark printed" 949 msgstr "" 950 951 #. translators: %d: number of orders not listed. 952 #: includes/class-print-queue.php:133 953 #, php-format 954 msgid "%d more order is waiting." 955 msgid_plural "%d more orders are waiting." 956 msgstr[0] "" 957 msgstr[1] "" 542 958 543 959 #: includes/class-privacy.php:32 … … 582 998 msgstr "" 583 999 1000 #. translators: %d: days of PrintBlob Pro's free trial. 1001 #: includes/class-pro.php:60 1002 #, php-format 1003 msgid "Try PrintBlob Pro free for %d day" 1004 msgid_plural "Try PrintBlob Pro free for %d days" 1005 msgstr[0] "" 1006 msgstr[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 1011 msgid "%1$s a year or %2$s once" 1012 msgstr "" 1013 1014 #. translators: %d: days in which a PrintBlob Pro purchase is refunded in full. 1015 #: includes/class-pro.php:71 1016 #, php-format 1017 msgid "Full refund within %d day." 1018 msgid_plural "Full refund within %d days." 1019 msgstr[0] "" 1020 msgstr[1] "" 1021 1022 #: includes/class-pro.php:75 1023 msgid "PrintBlob Pro is a separate plugin from printblob.com. Everything PrintBlob does works without it." 1024 msgstr "" 1025 1026 #: includes/class-pro.php:101 1027 msgid "See it in 3D" 1028 msgstr "" 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 1034 msgid "Compare free and Pro" 1035 msgstr "" 1036 1037 #: includes/class-pro.php:140 1038 msgid "Show less" 1039 msgstr "" 1040 1041 #: includes/class-pro.php:160 1042 msgid "A product with a printed design in PrintBlob Pro’s 3D view" 1043 msgstr "" 1044 1045 #: includes/class-pro.php:176 1046 msgid "3D · Pro" 1047 msgstr "" 1048 1049 #: includes/class-pro.php:177 1050 msgid "Only you see this, as the shop manager: your product in 3D with the PrintBlob Pro add-on, on printblob.com" 1051 msgstr "" 1052 1053 #: includes/class-pro.php:200 1054 msgid "The designer on the product page or any page: photos, logos and text, moved, resized and rotated on the product" 1055 msgstr "" 1056 1057 #: includes/class-pro.php:201 1058 msgid "Text typed on the product, in four bundled fonts" 1059 msgstr "" 1060 1061 #: includes/class-pro.php:202 1062 msgid "Front printing on the bundled product, with its own print price" 1063 msgstr "" 1064 1065 #: includes/class-pro.php:203 1066 msgid "Every colour of the product from one photo, and the Colours block" 1067 msgstr "" 1068 1069 #: includes/class-pro.php:204 1070 msgid "A warning when a customer’s image is too small to print sharply" 1071 msgstr "" 1072 1073 #: includes/class-pro.php:205 1074 msgid "A 300 DPI print file per side on every order, and the customer’s images as uploaded" 1075 msgstr "" 1076 1077 #: includes/class-pro.php:206 1078 msgid "WooCommerce’s block cart and checkout, order emails and custom order tables" 1079 msgstr "" 1080 1081 #: includes/class-pro.php:207 1082 msgid "Community support in the WordPress.org forum" 1083 msgstr "" 1084 1085 #: includes/class-pro.php:240 1086 msgid "Included" 1087 msgstr "" 1088 1089 #: includes/class-pro.php:241 1090 msgid "Not included" 1091 msgstr "" 1092 1093 #: includes/class-pro.php:244 1094 msgid "PrintBlob and PrintBlob Pro" 1095 msgstr "" 1096 1097 #: includes/class-pro.php:249 1098 msgid "What it does" 1099 msgstr "" 1100 1101 #: includes/class-pro.php:250 1102 msgid "PrintBlob (free)" 1103 msgstr "" 1104 1105 #. translators: %s: PrintBlob Pro's one-time price, e.g. $79. 1106 #: includes/class-pro.php:273 1107 #, php-format 1108 msgid "Buy once for %s" 1109 msgstr "" 1110 1111 #: includes/class-pro.php:279 1112 msgid "PrintBlob Pro is active on this site." 1113 msgstr "" 1114 1115 #: includes/class-pro.php:367 1116 msgid "3D view" 1117 msgstr "" 1118 1119 #: includes/class-pro.php:370 1120 msgid "Left sleeve" 1121 msgstr "" 1122 1123 #: includes/class-pro.php:371 1124 msgid "Right sleeve" 1125 msgstr "" 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 1132 msgid "Print price: %s" 1133 msgstr "" 1134 1135 #: includes/class-pro.php:415 1136 msgid "See all Pro features" 1137 msgstr "" 1138 1139 #: includes/class-pro.php:418 1140 msgid "Close" 1141 msgstr "" 1142 1143 #: includes/class-product-settings.php:113 1144 msgid "Product with the PrintBlob designer" 1145 msgstr "" 1146 584 1147 #: includes/class-product-settings.php:114 1148 msgid "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." 1149 msgstr "" 1150 1151 #: includes/class-product-settings.php:190 585 1152 #: build/designer/index.js:1 586 1153 msgid "PrintBlob designer" 587 1154 msgstr "" 588 1155 589 #: includes/class-product-settings.php: 1281156 #: includes/class-product-settings.php:204 590 1157 #: includes/class-settings-page.php:24 591 #: includes/class-settings-page.php:3 41158 #: includes/class-settings-page.php:35 592 1159 msgid "Designer" 593 1160 msgstr "" 594 1161 595 #: includes/class-product-settings.php: 1291162 #: includes/class-product-settings.php:205 596 1163 msgid "Customers design their own print on this product before adding it to the cart." 597 1164 msgstr "" 598 1165 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 1167 msgid "The product photo customers design on, with its print areas. The shop’s mockups are under PrintBlob › Mockups." 1168 msgstr "" 1169 1170 #: includes/class-product-settings.php:227 610 1171 msgid "Added to the product’s price when this side has a print." 611 1172 msgstr "" 612 1173 613 #: includes/class-review-request.php:66 1174 #: includes/class-quick-setup.php:41 1175 #: includes/class-quick-setup.php:466 1176 msgid "Quick setup" 1177 msgstr "" 1178 1179 #: includes/class-quick-setup.php:117 1180 msgid "The form had expired. Open Quick setup again and run it from there." 1181 msgstr "" 1182 1183 #: includes/class-quick-setup.php:120 1184 msgid "Only shop managers can run Quick setup." 1185 msgstr "" 1186 1187 #: includes/class-quick-setup.php:148 1188 msgid "Give the product a name, and type its price and the print price as numbers, such as 18 and 6." 1189 msgstr "" 1190 1191 #. translators: %s: mockup title. 1192 #: includes/class-quick-setup.php:155 1193 #: includes/class-quick-setup.php:163 1194 #, php-format 1195 msgid "Mockup “%s”" 1196 msgstr "" 1197 1198 #: includes/class-quick-setup.php:159 1199 msgid "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." 1200 msgstr "" 1201 1202 #: includes/class-quick-setup.php:192 1203 msgid "Printed with your own design." 1204 msgstr "" 1205 1206 #: includes/class-quick-setup.php:217 1207 msgid "The product could not be saved. Check that WooCommerce is up to date and that Products › Add new works, then run Quick setup again." 1208 msgstr "" 1209 1210 #. translators: %s: product name. 1211 #: includes/class-quick-setup.php:222 1212 #, php-format 1213 msgid "Product “%s”, with the designer on" 1214 msgstr "" 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 1219 msgid "%1$d variations: %2$d colours in %3$d sizes" 1220 msgstr "" 1221 1222 #. translators: %s: attribute name, e.g. Colour. 1223 #: includes/class-quick-setup.php:307 1224 #, php-format 1225 msgid "The %s attribute chosen is not one of the shop’s product attributes. Choose one from the list, or a new one." 1226 msgstr "" 1227 1228 #. translators: %s: attribute name. 1229 #: includes/class-quick-setup.php:312 1230 #: includes/class-quick-setup.php:337 1231 #, php-format 1232 msgid "Attribute “%s”" 1233 msgstr "" 1234 1235 #. translators: 1: attribute name, 2: WooCommerce's reason. 1236 #: includes/class-quick-setup.php:328 1237 #, php-format 1238 msgid "WooCommerce did not add the %1$s attribute: %2$s Add it under Products › Attributes, then choose it here." 1239 msgstr "" 1240 1241 #. translators: 1: term name, e.g. Navy, 2: WordPress's reason. 1242 #: includes/class-quick-setup.php:349 1243 #, php-format 1244 msgid "“%1$s” could not be added: %2$s" 1245 msgstr "" 1246 1247 #. translators: 1: attribute name, 2: term names, e.g. White, Black, Navy. 1248 #: includes/class-quick-setup.php:364 1249 #, php-format 1250 msgid "%1$s: %2$s" 1251 msgstr "" 1252 1253 #. translators: %s: page title. 1254 #: includes/class-quick-setup.php:380 1255 #: includes/class-quick-setup.php:408 1256 #, php-format 1257 msgid "Designer page “%s”" 1258 msgstr "" 1259 1260 #: includes/class-quick-setup.php:390 1261 msgid "Design your own" 1262 msgstr "" 1263 1264 #. translators: %s: attribute name, e.g. Colour. 1265 #: includes/class-quick-setup.php:437 1266 #, php-format 1267 msgid "A new %s attribute" 1268 msgstr "" 1269 1270 #. translators: %s: the shop's attribute name. 1271 #: includes/class-quick-setup.php:444 1272 #, php-format 1273 msgid "The shop’s “%s” attribute" 1274 msgstr "" 1275 1276 #: includes/class-quick-setup.php:470 1277 msgid "Quick setup stopped:" 1278 msgstr "" 1279 1280 #: includes/class-quick-setup.php:479 1281 msgid "Your shop is set up. Open the product and design on it." 1282 msgstr "" 1283 1284 #: includes/class-quick-setup.php:483 1285 msgid "Made now" 1286 msgstr "" 1287 1288 #: includes/class-quick-setup.php:487 1289 msgid "Already there, kept as it was" 1290 msgstr "" 1291 1292 #: includes/class-quick-setup.php:491 1293 msgid "Open the product" 1294 msgstr "" 1295 1296 #: includes/class-quick-setup.php:494 1297 msgid "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." 1298 msgstr "" 1299 1300 #. translators: %s: colour names, e.g. White, Black, Navy. 1301 #: includes/class-quick-setup.php:506 1302 #, php-format 1303 msgid "Six colours, each with the colour value the designer recolours the product to: %s. Colours the attribute already has are kept." 1304 msgstr "" 1305 1306 #. translators: %s: sizes, e.g. XS, S, M. 1307 #: includes/class-quick-setup.php:518 1308 #, php-format 1309 msgid "The sizes %s. Sizes the attribute already has are kept." 1310 msgstr "" 1311 1312 #. translators: %s: currency symbol. 1313 #: includes/class-quick-setup.php:531 1314 #, php-format 1315 msgid "Price (%s)" 1316 msgstr "" 1317 1318 #. translators: %s: currency symbol. 1319 #: includes/class-quick-setup.php:538 1320 #, php-format 1321 msgid "Front print price (%s)" 1322 msgstr "" 1323 1324 #. translators: %s: product name. 1325 #: includes/class-quick-setup.php:548 1326 #, php-format 1327 msgid "“%s”, made by an earlier run, is kept: variations it lacks are added and the prices above apply to it." 1328 msgstr "" 1329 1330 #: includes/class-quick-setup.php:549 1331 msgid "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." 1332 msgstr "" 1333 1334 #. translators: %s: page title. 1335 #: includes/class-quick-setup.php:563 1336 #, php-format 1337 msgid "“%s” stays the designer page." 1338 msgstr "" 1339 1340 #: includes/class-quick-setup.php:564 1341 msgid "A page named “Design your own” with the designer block on the product, set as the designer page." 1342 msgstr "" 1343 1344 #: includes/class-quick-setup.php:571 1345 msgid "Set up my shop" 1346 msgstr "" 1347 1348 #: includes/class-quick-setup.php:577 1349 msgid "Your product has a back photo ready: turn on back printing, sleeves and the 3D view with PrintBlob Pro" 1350 msgstr "" 1351 1352 #: includes/class-review-request.php:75 1353 msgid "Don’t ask again" 1354 msgstr "" 1355 1356 #: includes/class-review-request.php:80 614 1357 msgid "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." 615 1358 msgstr "" 616 1359 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 1363 msgid "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." 1364 msgstr "" 1365 1366 #: includes/class-review-request.php:84 618 1367 msgid "Write a review" 619 1368 msgstr "" … … 623 1372 msgstr "" 624 1373 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 1377 msgid "Turn the designer on per product in its PrintBlob tab. The product photos and their print areas are under %s." 1378 msgstr "" 1379 1380 #: includes/class-settings-page.php:46 636 1381 msgid "Where the Colours block and colour links send customers. Leave empty to use the first page that contains the designer." 637 1382 msgstr "" 638 1383 639 #: includes/class-settings-page.php:5 31384 #: includes/class-settings-page.php:54 640 1385 msgid "Colour attribute" 641 1386 msgstr "" 642 1387 643 #: includes/class-settings-page.php:5 41388 #: includes/class-settings-page.php:55 644 1389 msgid "The product attribute whose terms are the product colours. Each colour gets a colour value and a photo on its edit screen." 645 1390 msgstr "" 646 1391 647 #: includes/class-settings-page.php:6 21392 #: includes/class-settings-page.php:63 648 1393 msgid "Size attribute" 649 1394 msgstr "" 650 1395 651 #: includes/class-settings-page.php:6 31396 #: includes/class-settings-page.php:64 652 1397 msgid "The product attribute that holds sizes, shown as size buttons in the designer." 653 1398 msgstr "" 654 1399 655 #: includes/class-settings-page.php:7 11400 #: includes/class-settings-page.php:72 656 1401 msgid "Largest customer image (MB)" 657 1402 msgstr "" 658 1403 659 #: includes/class-settings-page.php:8 21404 #: includes/class-settings-page.php:83 660 1405 msgid "Keep unordered designs (days)" 661 1406 msgstr "" 662 1407 663 #: includes/class-settings-page.php:8 31408 #: includes/class-settings-page.php:84 664 1409 msgid "Designs added to a cart but never ordered are deleted after this many days. Ordered designs are kept with the order." 665 1410 msgstr "" 666 1411 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 1413 msgid "Rate PrintBlob ★★★★★" 1414 msgstr "" 1415 1416 #. translators: %d: days of PrintBlob Pro's free trial. 1417 #: includes/class-settings.php:45 1418 #, php-format 1419 msgid "PrintBlob Pro add-on: the 3D view and more, free for %d day" 1420 msgid_plural "PrintBlob Pro add-on: the 3D view and more, free for %d days" 1421 msgstr[0] "" 1422 msgstr[1] "" 1423 1424 #: includes/class-settings.php:123 1425 msgid "Upload your own fonts" 685 1426 msgstr "" 686 1427 687 1428 #: includes/class-shirt-colors.php:92 688 1429 msgid "Product photo for this colour" 1430 msgstr "" 1431 1432 #: includes/class-shirt-colors.php:93 1433 msgid "Use this photo" 1434 msgstr "" 1435 1436 #: includes/class-shirt-colors.php:103 1437 msgid "Choose photo" 689 1438 msgstr "" 690 1439 -
printblob/trunk/package.json
r3751165 r3751408 9 9 "./build": "./build.mts", 10 10 "./designer/*.js": "./src/designer/app/*.ts", 11 "./admin/*.js": "./src/admin/*.ts", 11 12 "./designer.scss": { 12 13 "types": "./src/designer/stylesheet.d.ts", -
printblob/trunk/printblob.php
r3751165 r3751408 3 3 * Plugin Name: PrintBlob – Product Designer for WooCommerce 4 4 * 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.65 * 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 7 7 * Requires at least: 7.0 8 8 * Requires PHP: 7.4 … … 39 39 require_once __DIR__ . '/includes/class-privacy.php'; 40 40 require_once __DIR__ . '/includes/class-review-request.php'; 41 require_once __DIR__ . '/includes/class-pro.php'; 42 require_once __DIR__ . '/includes/class-admin-menu.php'; 43 require_once __DIR__ . '/includes/class-overview.php'; 44 require_once __DIR__ . '/includes/class-print-queue.php'; 45 require_once __DIR__ . '/includes/class-dashboard-widget.php'; 46 require_once __DIR__ . '/includes/class-order-milestones.php'; 47 require_once __DIR__ . '/includes/class-quick-setup.php'; 48 require_once __DIR__ . '/includes/class-deactivation-feedback.php'; 41 49 42 50 add_action( … … 56 64 Privacy::register(); 57 65 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(); 58 72 } 59 73 ); -
printblob/trunk/readme.txt
r3751165 r3751408 5 5 Tested up to: 7.1 6 6 Requires PHP: 7.4 7 Stable tag: 1. 2.67 Stable tag: 1.3.0 8 8 License: GPL-2.0-or-later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html 10 10 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.11 Let customers design their own t-shirt print — photos, logos and text — and receive a print-ready 300 DPI file with every order. 12 12 13 13 == Description == 14 14 15 Try it before you install: the [live demo on printblob.com](https://printblob.com/#demo) runs this exact designer.15 Try 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. 16 16 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.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 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. 18 18 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 itto 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. 21 21 * **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. 22 22 * **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. … … 26 26 = PrintBlob Pro = 27 27 28 The [PrintBlob Pro](https://printblob.com/) add-on adds a 3D view of the product, made from the samefront and back photos, sleeve printing, a production print queue and your own fonts.28 The [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. 29 29 30 30 = Privacy = 31 31 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.32 PrintBlob 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. 33 33 34 34 = Copyright = … … 47 47 48 48 1. Install PrintBlob from Plugins › Add Plugin (search for "PrintBlob") and activate it. WooCommerce must be active. 49 2. Open Pr oducts › Mockups. A t-shirt mockup is ready to use; add your own photos and print areas as needed.49 2. Open PrintBlob › Mockups. The t-shirt mockup is ready to use; your own products and photos come with PrintBlob Pro. 50 50 3. Edit a product, open its PrintBlob designer tab, turn the designer on, choose a mockup and set the print price per side. 51 51 4. Add colour values and photos to the terms of your colour attribute (Products › Attributes). … … 89 89 90 90 == 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. 91 100 92 101 = 1.2.6 = … … 137 146 * The bundled t-shirt mockup's print areas are in assets/mockups/tee.json. 138 147 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 == 141 149 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 = 151 Back 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. 160 152 161 153 = 1.2.3 = -
printblob/trunk/src/admin/term-image.ts
r3750583 r3751408 1 1 /* Media library picker for the colour term's shirt photo. */ 2 2 import $ from 'jquery'; 3 import { chooseImage, type MediaLabels } from './media.ts'; 4 5 declare const printblobTermImage: MediaLabels; 3 6 4 7 $( document ).on( 'click', '[data-printblob-term-image] [data-printblob-choose]', function ( event ) { 5 8 event.preventDefault(); 6 9 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 ) => { 15 11 const preview = image.sizes?.thumbnail?.url ?? image.url; 16 12 field.find( 'input[name="printblob_image"]' ).val( image.id ); … … 18 14 field.find( '[data-printblob-remove]' ).prop( 'hidden', false ); 19 15 } ); 20 frame.open();21 16 } ); 22 17 -
printblob/trunk/src/designer/app/App.tsx
r3751165 r3751408 427 427 <div className="printblob-designer__stage-column"> 428 428 <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 ) } 448 450 { views.map( ( view ) => ( 449 451 <button … … 458 460 </button> 459 461 ) ) } 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 ) } 460 467 </div> 461 468 <div className="printblob-designer__stage" style={ { aspectRatio: `${ tallest.stage.width } / ${ tallest.stage.height }` } }> -
printblob/trunk/src/designer/app/sides.ts
r3750583 r3751408 3 3 import type { PrintSide, Size } from './types.ts'; 4 4 5 /** The sides PrintBlob prints, by key; add-ons add others. */ 6 export const PRINTED_SIDES: readonly string[] = designer.sides; 5 7 export const STAGE_WIDTH = designer.stage_width; 6 8 export const PRINT_DPI = designer.print_dpi; -
printblob/trunk/src/designer/app/types.ts
r3750583 r3751408 94 94 cart: string; 95 95 [endpoint: string]: unknown; 96 } 97 98 export interface ProChip { 99 label: string; 100 title: string; 101 href: string; 96 102 } 97 103 … … 118 124 tools?: ListedExtension[]; 119 125 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; 120 128 currency: CurrencyConfig; 121 129 endpoints: DesignerEndpoints; -
printblob/trunk/src/designer/render.php
r3751165 r3751408 149 149 $printblob_config = (array) apply_filters( 'printblob_designer_config', $printblob_config, $printblob_product ); 150 150 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(); 153 if ( $printblob_pro_chip ) { 154 $printblob_config['proChip'] = $printblob_pro_chip; 155 } 156 151 157 // A variation that depends on an attribute the designer doesn't offer could only be ordered as the wrong one. 152 158 $printblob_offered = array_merge( … … 210 216 <div class="printblob-designer__stage-column"> 211 217 <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; ?> 217 225 <?php foreach ( (array) ( $printblob_config['views'] ?? array() ) as $printblob_view ) : ?> 218 226 <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> 219 227 <?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; ?> 220 231 </div> 221 232 <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 135 135 } 136 136 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 137 158 // Always in the tab, shown once the side has a print, so the tab keeps its width. 138 159 .printblob-designer__side-dot { -
printblob/trunk/uninstall.php
r3750583 r3751408 13 13 global $wpdb; 14 14 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 ) {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', 'printblob_order_milestone_dismissed', 'printblob_quick_setup' ) as $printblob_option ) { 16 16 delete_option( $printblob_option ); 17 17 } 18 18 $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. 19 19 wp_clear_scheduled_hook( 'printblob_cleanup_designs' ); 20 delete_metadata( 'user', 0, 'printblob_pro_hint_dismissed', '', true ); 20 delete_transient( 'printblob_print_folder_check' ); 21 foreach ( 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 } 29 foreach ( 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 } 21 32 22 33 // Every post of a type, or every attachment of a post, by ID. -
printblob/trunk/webpack.config.mts
r3750583 r3751408 14 14 import { INK_COLORS } from './src/designer/app/ink.ts'; 15 15 16 const admin = { 'admin/ mockup-editor': './src/admin/mockup-editor.ts', 'admin/term-image': './src/admin/term-image.ts' };16 const admin = { 'admin/term-image': './src/admin/term-image.ts', 'admin/pro-box': './src/admin/pro-box.ts' }; 17 17 18 18 const withAdmin = async ( entry: Configuration[ 'entry' ] ): Promise< EntryObject > => {
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)