{"version":3,"file":"drag_drop_buy.pack.js","mappings":"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","sources":["webpack:///../common/ts/apps/delivery/components/ProductProductionTime/ProductProductionTime.ts","webpack:///../common/ts/apps/delivery/components/ProductProductionTime/ProductProductionTime.html.ts","webpack:///../common/ts/apps/delivery/components/init.ts","webpack:///../common/ts/apps/products_shared/components/Price/Price.ts","webpack:///../common/ts/apps/products_shared/components/Price/Price.html.ts","webpack:///../common/ts/apps/products_shared/components/QuantityBreaks/QuantityBreaks.ts","webpack:///../common/ts/apps/products_shared/components/QuantityBreaks/QuantityBreaks.html.ts","webpack:///../common/ts/apps/products_shared/services/ConfiguredProductServiceAbstract.ts","webpack:///../common/ts/apps/products_shared/services/ProductServiceAbstract.ts","webpack:///../common/ts/apps/products_shared/services/PriceQuote.ts","webpack:///../common/ts/apps/products_shared/services/init.ts","webpack:///../common/ts/apps/svgcustom/apps/ProductPageLoaderAbstract.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddUserShape/AddUserShape.html.ts","webpack:///../common/ts/apps/svgcustom/components/SetupPage/SelectDesign/SelectDesign.ts","webpack:///../common/ts/apps/svgcustom/components/SetupPage/SelectDesign/SelectDesign.html.ts","webpack:///../common/ts/apps/svgcustom/components/SetupPage/UploadFile/UploadFile.ts","webpack:///../common/ts/apps/svgcustom/components/SetupPage/UploadFile/UploadFile.html.ts","webpack:///../common/ts/apps/svgcustom/components/SetupPage/SelectFile/SelectFile.ts","webpack:///../common/ts/apps/svgcustom/components/SetupPage/SelectFile/SelectFile.html.ts","webpack:///../common/ts/apps/svgcustom/components/SetupPage/SelectTemplate/SelectTemplate.ts","webpack:///../common/ts/apps/svgcustom/components/SetupPage/SelectTemplate/SelectTemplate.html.ts","webpack:///../common/ts/apps/svgcustom/components/SetupPage/SelectAutosave/SelectAutosave.ts","webpack:///../common/ts/apps/svgcustom/components/SetupPage/SelectAutosave/SelectAutosave.html.ts","webpack:///../common/ts/apps/svgcustom/components/SetupPage/init.ts","webpack:///../common/ts/apps/svgcustom/components/TemplateFinalizeOptions/Options.html.ts","webpack:///../common/ts/apps/svgcustom/components/TemplateFinalizeOptions/Options.ts","webpack:///../common/ts/apps/svgcustom/components/TemplateSetupOptionsShapes/TemplateSetupOptionsShapes.html.ts","webpack:///../common/ts/apps/svgcustom/components/TemplateSetupOptionsShapes/TemplateSetupOptionsShapes.ts","webpack:///../common/ts/apps/svgcustom/components/AddClipartComponent/AddClipartComponent.ts","webpack:///../common/ts/apps/svgcustom/components/AddClipartComponent/AddClipartComponent.html.ts","webpack:///../common/ts/apps/svgcustom/components/ColorPicker/ColorPicker.ts","webpack:///../common/ts/apps/svgcustom/components/ColorPicker/ColorPicker.html.ts","webpack:///../common/ts/apps/svgcustom/components/PaperCanvas/PaperCanvas.ts","webpack:///../common/ts/apps/svgcustom/components/SubCanvasPreview/SubCanvasPreview.ts","webpack:///../common/ts/apps/svgcustom/components/SubCanvasPreview/SubCanvasPreview.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AbstractDesignToolController.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddClipart/AddClipart.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddClipart/AddCliaprt.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddFile/AddFile.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddFile/AddFile.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddQRCode/AddQrCode.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddQRCode/AddQrCode.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddText/AddText.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddText/AddText.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/BackgroundColors/BackgroundColors.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/BackgroundColors/BackgroundColors.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Crop/Crop.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Crop/Crop.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditClipart/EditClipart.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditClipart/EditClipart.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditFile/EditFile.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditFile/EditFile.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditQRCode/EditQRCode.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditQRCode/EditQRCode.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditText/EditText.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditText/EditText.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Layers/Layers.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Layers/Layers.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Sides/Sides.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Sides/Sides.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/FooterActions/FooterActions.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/FooterActions/FooterActions.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementActionController.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementAlignment/ElementAlignment.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementAlignment/ElementAlignment.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementLayerPosition/ElementLayerPosition.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementLayerPosition/ElementLayerPosition.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementTextAlignment/ElementTextAlignment.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementTextAlignment/ElementTextAlignment.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementFit/ElementFit.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementFit/ElementFit.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementScaleSize/ElementScaleSize.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementScaleSize/ElementScaleSize.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementInvert/ElementInvert.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementInvert/ElementInvert.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementMaintainProportion/ElementMaintainProportion.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementMaintainProportion/ElementMaintainProportion.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementColor/ElementColor.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementColor/ElementColor.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementColor/ElementMaterialColors.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ClipartColors/ClipartColors.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ClipartColors/ClipartColors.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/CodeForm/CodeForm.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/CodeForm/CodeForm.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/CodeFormData/CodeFormData.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/CodeFormData/CodeFormData.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/CodeFormType/CodeFormType.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/CodeFormType/CodeFromType.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/ToolNavigation/ToolNavigation.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/ToolNavigation/ToolNavigation.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementOffsetPath/ElementOffsetPath.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementOffsetPath/ElementOffsetPath.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementToggleBackground/ElementToggleBackground.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/Actions/ElementToggleBackground/ElementToggleBackground.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/DirectUpload/DirectUpload.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/DirectUpload/DirectUpload.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/LayerRemove/LayerRemove.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/LayerRemove/LayerRemove.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/SelectLayerBar/SelectLayerBar.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/SelectLayerBar/SelectLayerBar.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddVariableDataModal/AddVariableDataModal.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddVariableDataModal/AddVariableDataModal.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditVariableDataModal/EditVariableDataModa.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditVariableDataModal/EditVariableDataModal.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/AddUserShape/AddUserShape.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditUserShape/EditUserShape.html.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/EditUserShape/EditUserShape.ts","webpack:///../common/ts/apps/svgcustom/components/FontModal/FontModal.ts","webpack:///../common/ts/apps/svgcustom/components/FontModal/FontModal.html.ts","webpack:///../common/ts/apps/svgcustom/components/custom.init.ts","webpack:///../common/ts/apps/svgcustom/components/DesignTool/init.ts","webpack:///../common/ts/apps/svgcustom/services/CustomService.ts","webpack:///../common/ts/apps/svgcustom/services/PaperCanvasWorkspace.ts","webpack:///../common/ts/apps/svgcustom/services/SelectionStateManager.ts","webpack:///../common/ts/apps/svgcustom/services/PaperCanvasService.ts","webpack:///../common/ts/apps/svgcustom/services/AbstractSelectionManager.ts","webpack:///../common/ts/apps/svgcustom/services/SelectionManager.ts","webpack:///../common/ts/apps/svgcustom/services/AutosaveService.ts","webpack:///../common/ts/apps/svgcustom/tool/RasterElement.ts","webpack:///../common/ts/apps/svgcustom/tool/ClipMaskElement.ts","webpack:///../common/ts/apps/svgcustom/tool/TextElement.ts","webpack:///../common/ts/apps/svgcustom/tool/SVGCanvasElement.ts","webpack:///../common/ts/apps/svgcustom/tool/BackgroundShapeElement.ts","webpack:///../common/ts/apps/svgcustom/tool/UserShapeElement.ts","webpack:///../common/ts/apps/svgcustom/helpers/DesignToolElementFactory.ts","webpack:///../common/ts/apps/svgcustom/services/CustomEditorService.ts","webpack:///../common/ts/apps/svgcustom/services/ElementManager.ts","webpack:///../common/ts/apps/svgcustom/services/FontService.ts","webpack:///../common/ts/apps/svgcustom/tool/DragDropBuyElement.ts","webpack:///../common/ts/apps/svgcustom/services/DragDropBuyService.ts","webpack:///../common/ts/apps/svgcustom/services/ClipperService.ts","webpack:///../common/ts/apps/svgcustom/helpers/LetteringValidator.ts","webpack:///../common/ts/apps/svgcustom/services/LetteringToolService.ts","webpack:///../common/ts/core/services/MultiWorkerService.ts","webpack:///../common/ts/apps/svgcustom/services/ClipperWorkerService.ts","webpack:///../common/ts/apps/svgcustom/services/ColorService.ts","webpack:///../common/ts/apps/svgcustom/services/ToolStateService.ts","webpack:///../common/ts/apps/svgcustom/services/PointSelectionManager.ts","webpack:///../common/ts/apps/svgcustom/services/ColorSelectionManager.ts","webpack:///../common/ts/apps/svgcustom/services/custom.init.ts","webpack:///../common/ts/apps/svgcustom/tool/BaseElement.ts","webpack:///../common/ts/apps/svgcustom/tool/ClipartElement.ts","webpack:///../common/ts/core/adapters/VueUtils.ts","webpack:///../common/ts/core/utils/VectorUtils.ts","webpack:///../common/ts/apps/svgcustom/apps/DDBToolPageApp.ts","webpack:///../common/ts/apps/svgcustom/apps/DDBOptionsApp.ts","webpack:///../common/integrations/ts/DragDropBuy.ts","webpack:///./integrations/ts/DragDropBuy.ts"],"sourcesContent":["import VueComponent, {data, method} from '../../../../core/adapters/VueComponent';\nimport {html} from './ProductProductionTime.html';\nimport {Services} from '../../../../core/services/Services';\nimport {Http} from '../../../../core/services/Http';\n\nclass ProductProductionTimeController extends VueComponent {\n\n    @data()\n    standard: number;\n\n    @data()\n    rush: number;\n\n    @data()\n    message: string;\n\n    @data()\n    loaded: boolean;\n\n    @data()\n    backordered: boolean;\n\n    // Do not store the product service in the data. There is some odd bug\n    // that bricks the component and prevents it from updating the html.\n    // @data()\n    // product_service;\n\n    constructor(componet) {\n        super(componet);\n\n        Services.waitOn('product-service-loaded').then(() => {\n            let product_service: any = Services.get('ProductService');\n            product_service.configured.bind('change:material', this.updateTimes.bind(this), this);\n            product_service.configured.bind('change:quantity', this.updateTimes.bind(this), this);\n            product_service.configured.bind('change:width', this.updateTimes.bind(this), this);\n            product_service.configured.bind('change:height', this.updateTimes.bind(this), this);\n\n            this.backordered = product_service.configured.material?.backordered;\n            product_service.configured.bind('change:material', () => {\n                this.backordered = product_service.configured.material?.backordered;\n            }, this);\n            this.updateTimes();\n        });\n    }\n\n    @method()\n    updateTimes() {\n        let product_service: any = Services.get('ProductService');\n        if (!product_service.configured.material || !product_service.configured.quantity) {\n            return;\n        }\n\n        // Sanity check\n        if (product_service.configured.quantity > 500000) {\n            this.message = 'Please contact customer service for a production time estimate.';\n            return;\n        }\n\n        let size = null;\n        if (product_service.configured.width && product_service.configured.height) {\n            size = product_service.configured.width * product_service.configured.height;\n        }\n\n        Services.get<Http>('$http').request({\n            method: 'GET',\n            url: '/delivery/api/get-production-times-basic/',\n            params: {\n                material: product_service.configured.material.id,\n                quantity: product_service.configured.quantity,\n                size: size\n            }\n        }).then((response) => {\n            this.message = response.data.message;\n            this.standard = response.data.standard;\n            this.rush = response.data.rush;\n            this.$forceUpdate();\n        });\n    }\n\n    @method()\n    hidden() {\n        if (!Services.isRegistered('ProductService')) {\n            return false;\n        }\n\n        let product_service: any = Services.get('ProductService');\n        return !product_service.configured?.material;\n    }\n}\n\nexport default function ProductProductionTime() {\n    return {\n        tag: 'product-production-time',\n        controller: ProductProductionTimeController,\n        template: html\n    }\n}","export const html:string = `\n<div class=\"pill pill-rounded pill-lg\" :class=\"{'pill-green': !backordered, 'pill-warning': backordered}\" v-if=\"!hidden()\">\n    <span v-if=\"message\">\n        {{ message }}\n    </span>\n    <span v-if=\"backordered\">\n        Out of stock\n    </span>\n    <span v-if=\"!backordered && !message && rush != standard\">\n        Ships in {{ rush }} to {{ standard }} days\n    </span>\n    <span v-if=\"!backordered && !message && rush == standard\">\n        Ships within {{ standard }} days\n    </span>\n</div>\n`;","import VueApp from '../../../core/adapters/VueApp';\nimport ProductProductionTime from './ProductProductionTime/ProductProductionTime';\n\nexport default function registerComponents(vue_app: VueApp) {\n    vue_app.registerComponent(ProductProductionTime);\n}\n","import {html} from './Price.html';\nimport IVueComponent from '../../../../core/adapters/IVueComponent';\nimport VueComponent, {prop} from '../../../../core/adapters/VueComponent';\nimport {ConfiguredProductAbstract} from '../../../svgcustom/models/abstract/ConfiguredProductAbstract';\n\nclass PriceController extends VueComponent {\n    @prop()\n    productService: ConfiguredProductAbstract;\n\n    @prop()\n    unit: boolean;\n\n    @prop()\n    total: boolean;\n\n    constructor(component) {\n        super(component);\n\n        // Inefficient but we need to make sure this is always up to date\n        this.productService.bind('change:price', this.$forceUpdate.bind(this), this);\n    }\n}\n\nexport default function Price(): IVueComponent {\n\n    return {\n        controller: PriceController,\n        template: html,\n        tag: 'price'\n    };\n}\n","export const html: string = `\n<span v-if=\"productService && !unit\" :class=\"{'h2 strong': total, 'h5': !total}\">{{ $filters.currency(productService.price.price + productService.optionsPrice, productService.currency) }}</span>\n<span v-if=\"productService && !unit && !total\" :class=\"{'h2': total, 'h5': !total}\">({{ $filters.currency(productService.price.unitPrice, productService.currency) }} each)</span>\n<span v-if=\"productService && unit && !total\" :class=\"{'h2 strong': total, 'h5': !total}\">{{ $filters.currency(productService.price.unitPrice + productService.optionsUnitValue, productService.currency) }} each</span>\n`;","import {html} from './QuantityBreaks.html';\nimport VueComponent, {computed, data, method, prop} from '../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../core/adapters/IVueComponent';\nimport ConfiguredProductServiceAbstract from '../../services/ConfiguredProductServiceAbstract';\n\nexport class QuantityOptionsController extends VueComponent {\n    @prop()\n    productService: ConfiguredProductServiceAbstract;\n\n    @data()\n    quantity_options: any[];\n\n    @data()\n    show_more: boolean;\n\n    @data()\n    show_all: boolean;\n\n    constructor(component) {\n        super(component);\n\n        if (this.productService) {\n            this.productService.bind('change:price', () => {\n                this.quantity_options = this.calcQuantityOptions();\n            }, this);\n            this.productService.setup_complete.then(() => {\n                this.quantity_options = this.calcQuantityOptions();\n            })\n        }\n        else {\n            console.error('Undefined product service');\n        }\n        this.updateQuantityOptions();\n    }\n\n    @method()\n    updateQuantityOptions() {\n        this.quantity_options = this.calcQuantityOptions();\n    }\n\n    @method()\n    checkView() {\n        if (!this.show_all) {\n            this.$el?.parentElement?.scrollIntoView();\n        }\n    }\n\n    calcQuantityOptions(): any[] {\n        if (!this.productService || !this.productService.pricing) {\n            return [];\n        }\n\n        let pricing = this.productService.pricing;\n\n        // Remove the quantities that are lower than the min quantity and alter lower bracket to be the min\n        let to_pop = [];\n        for (let i = 0; i < pricing.length-1; i++) {\n            let current = pricing[i];\n            let next = pricing[i+1];\n\n            if (current.quantity <= this.productService.base.minimum_quantity) {\n                if (next.quantity <= this.productService.base.minimum_quantity) {\n                    to_pop.push(current);\n                }\n                else {\n                    current.quantity = this.productService.base.minimum_quantity;\n                }\n            }\n        }\n\n        for (const item of to_pop) {\n            pricing.splice(pricing.indexOf(item), 1);\n        }\n\n        this.show_more = pricing.length > 3;\n\n        if (!this.show_all && pricing.length > 3) {\n            let index = 0;\n            for (const item of pricing) {\n                if (this.productService.base.default_quantity >= item.quantity) {\n                    index++;\n                }\n            }\n\n            if (index < 2) {\n                index = 2;\n            }\n\n            return pricing.slice(index - 2, index + 1)\n        }\n\n        return pricing;\n    }\n}\n\nexport default function QuantityBreaks(): IVueComponent {\n    return {\n        controller: QuantityOptionsController,\n        template: html,\n        tag: 'quantity-breaks'\n    };\n}","export const html: string = `\n<template v-if=\"quantity_options && quantity_options.length > 1\">\n    <div class=\"option-list hide-radio\">\n        <label class=\"flex-left space-between no-wrap\" v-for=\"tier in quantity_options\">\n            <input :aria-label=\"'Select quantity: ' + tier.quantity\" type=\"radio\" name=\"size\" v-model=\"productService.quantity\" :value=\"tier.quantity\"/>\n            <span>\n                {{ tier.quantity }}\n            </span>\n            <span v-if=\"tier.quantity < 2\">{{ $filters.currency(tier.price, productService.configured.currency) }}</span>\n            <span v-if=\"tier.quantity > 1\">{{ $filters.currency(tier.unitPrice, productService.configured.currency) }} each</span>\n        </label>\n    </div>\n    <button class=\"btn-link rotate-icon\" type=\"button\" @click=\"show_all = !show_all; updateQuantityOptions(); checkView()\" v-if=\"show_more\">\n        {{ show_all ? 'Hide price breaks' : 'View all price breaks' }}\n        <svg class=\"icon\" fill=\"none\" height=\"20\" viewBox=\"0 0 20 20\" width=\"20\" xmlns=\"http://www.w3.org/2000/svg\" :class=\"show_all ? 'flip' : ''\">\n            <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"var(--brand-secondary, #6941C6)\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.66667\"></path>\n        </svg>\n    </button>\n</template>\n`;","import APIResponse from '../../../core/models/APIResponse';\nimport {Services} from '../../../core/services/Services';\nimport MessageList from '../../../core/utils/MessageList';\nimport PricingTier from '../../../core/utils/PricingTier';\nimport PriceQuote from './PriceQuote';\nimport ButtonProcessingState from '../../../core/utils/ButtonProcessingState';\nimport {clamp, isEmptyString, lerp, roundHalfUp, toFixedCeil, toFixedCeilStable} from '../../../core/utils/utils';\nimport ProductServiceAbstract from './ProductServiceAbstract';\nimport {ConfigurableProductAttributeAbstract} from '../../product/models/abstract/ProductAttributeAbstract';\nimport {ConfiguredProductAbstract} from '../../svgcustom/models/abstract/ConfiguredProductAbstract';\nimport {Color} from '../../svgcustom/models/Color';\nimport {IDeferred, IPromise} from '../../../core/utils/SimplePromise';\nimport ConfiguredRetailPackage from '../../packaging/models/ConfiguredRetailPackage';\nimport {RetailPackage} from '../../packaging/models/RetailPackage';\nimport {Collection} from '../../../core/models/Collection';\nimport {ColorMap} from '../../svgcustom/models/ColorMap';\nimport {DisplayTypeEnum, ProductTypeEnum} from '../../svgcustom/models/enums';\nimport AbstractProductOption from '../../svgcustom/models/AbstractProductOption';\nimport {ProductAbstract} from '../../svgcustom/models/abstract/ProductAbstract';\nimport {FontService} from '../../svgcustom/services/FontService';\nimport RouteService from \"../../../core/services/RouteService\";\n\n/*\n    Configured Product Service Abstract\n\n    This is a abstract class that defines all shared functionality for any product that has a base and configured class.\n    This applies to:\n        Custom/Template\n        ConfiguredClipartProduct/ClipartProduct\n\n    This should only deal with the models not paperjs or any canvas/rendering service.\n */\n\nexport default abstract class ConfiguredProductServiceAbstract extends ProductServiceAbstract {\n    public declare base: ConfigurableProductAttributeAbstract;\n    public declare configured: ConfiguredProductAbstract;\n\n    public declare base_class: typeof ConfigurableProductAttributeAbstract;\n    public declare configured_class: typeof ConfiguredProductAbstract;\n\n    public declare setup_complete: IPromise<void>;\n    protected declare setup_complete_deferred: IDeferred<void>;\n\n    public proportions_ratio: number;\n\n    public price_tier: PricingTier;\n    public pricing: PricingTier[];\n\n    private price_quote_uuid: string;\n    private price_quote_timeout;\n\n    private available_packages: any[] = [];\n    private packages: APIResponse<RetailPackage>;\n\n    abstract configured_option_model: string;\n\n    private price_quote_key;\n\n    constructor(base_class, configured_class, base_key) {\n        super(base_class, configured_class, base_key);\n    }\n\n    override get optionsPrice(): number {\n        return this.configured.calcOptionsPrice(this.price.price, this.show_retail);\n    }\n\n    override setupFromData(base_data, configured_data, all_data): void {\n        let base = null;\n        let configured = null;\n\n        if (base_data) {\n            base = new (this.base_class as any)(base_data);\n        }\n        if (configured_data) {\n            configured = new this.configured_class(configured_data);\n        }\n\n        if (!base && configured) {\n            base = configured[this.base_key];\n        }\n        if (!configured) {\n            configured = new this.configured_class();\n            configured.configure = true;\n            configured.currency = all_data.currency;\n        }\n\n        this.currency = all_data.currency;\n\n        this.setupExtraData(all_data);\n        this.setupFromProduct(base, configured);\n    }\n\n    override setupExtraData(all_data): void {}\n\n    override setupFromProduct(base, configured): void {\n        this.base = base;\n        this.configured = configured;\n\n        this.setupConfiguredFromBase();\n    }\n\n    override nextUrl() {\n        return this.configured.getNextURL();\n    }\n\n    get show_wholesale_prices(): boolean {\n        return false;\n    }\n\n    get color_map(): ColorMap {\n        if (this.configured.material_color && this.configured.material?.color_maps?.length) {\n            return this.configured.material.color_maps.find(v => v.key.id == this.configured.material_color.id);\n        }\n\n        return null;\n    }\n\n    get product_color_set(): Collection<Color> {\n        if (this.color_map) {\n            return this.color_map.values;\n        }\n\n        return this.configured.material.design_colors;\n    }\n\n    get colors_available() {\n        if (this.color_map) {\n            return this.color_map.values;\n        }\n\n        return this.configured.material.design_colors;\n    }\n\n    get colors_available_for_material() {\n        return this.configured.material.material_colors;\n    }\n\n    /*\n        This will create a new product and start the setup process\n     */\n    createNewFromBase(): void {\n        this.configured = new this.configured_class();\n\n        this.setupConfiguredFromBase();\n    }\n\n    /*\n        Setup and validate options on the configured class.\n     */\n    override setupConfiguredFromBase(needs_additional_setup=false): void {\n        super.setupConfiguredFromBase(needs_additional_setup);\n\n        // Make sure we are using the same object and its fully built\n        this.configured[this.base_key] = this.base;\n\n        // First check if the material is no longer valid\n        let material = this.configured.material;\n        if (material && !this.base.materials.getItemFromID(this.configured.material.id)) {\n            if (this.configured.material.name) {\n                this.errors.add('material', `The material ${material.name} is no longer available for this product and has been reverted to the default.`);\n            }\n            material = null;\n        }\n\n        // Validate that a default material is set and that it's an option that is available\n        if (!material && this.base.default_material) {\n            material = this.base.materials.getItemFromURI(this.base.default_material);\n        }\n        if (!material) {\n            material = this.base.materials[0];\n        }\n\n        // Make sure the material object is the same one in the list so equals evaluation will work\n        this.configured.material = this.base.materials.getItemFromID(material.id);\n        this.configured.type = this.base.type;\n\n        // Validate size\n        if (!this.configured.width) {\n            if (this.base.default_width) {\n                this.configured.width = this.base.default_width;\n            }\n        }\n        if (!this.configured.height) {\n            if (this.base.default_height) {\n                this.configured.height = this.base.default_height;\n            }\n        }\n\n        // If no minimum or default quantity was defined, set it to 1\n        if (!this.base.minimum_quantity) {\n            this.base.minimum_quantity = 1;\n        }\n        if (!this.base.default_quantity) {\n            this.base.default_quantity = 1;\n        }\n\n        let query_quantity = Number(Services.get<RouteService>('RouteService').current.params.get('quantity'))\n        if (query_quantity) {\n            this.configured.quantity = query_quantity;\n        }\n\n        // Validate the quantity from the configured product\n        if (!this.configured.quantity) {\n            this.configured.quantity = this.base.default_quantity;\n        }\n        if (this.configured.quantity < this.base.minimum_quantity) {\n            this.errors.add('quantity', `The minimum quantity for this product is ${this.base.minimum_quantity}`);\n            this.configured.quantity = this.base.minimum_quantity;\n        }\n\n        this.setupProductOptions();\n\n        // Setup watch bindings\n        this.configured.bind('change:material', this.updatePricing.bind(this), this);\n        this.configured.bind('change:material', this.checkMaterialColor.bind(this), this);\n        this.configured.bind('change:material', this.checkBackorderedMaterial.bind(this), this);\n        this.configured.bind('change:material_color', this.validateMaxSize.bind(this), this);\n\n        this.checkMaterialColor();\n\n        this.updatePricing(true);\n        this.checkWarnings();\n        this.checkBackorderedMaterial();\n\n        this.configured.bind('change:width', () => {\n            setTimeout(() => {\n                this.updatePricing();\n            });\n        }, this);\n        this.configured.bind('change:height', () => {\n            setTimeout(() => {\n                this.updatePricing();\n            });\n        }, this);\n        this.configured.bind('change:quantity', this.checkWarnings.bind(this), this);\n\n        if (this.base.limited_quantity) {\n            this.configured.quantity = this.base.limited_quantity;\n        }\n\n        if (!needs_additional_setup) {\n            this.setup_complete_deferred.resolve();\n        }\n    }\n\n    checkBackorderedMaterial() {\n        if (!this.warnings) {\n            this.warnings = new MessageList();\n        }\n\n        if (this.configured.material.backordered) {\n            this.warnings.add('material', 'This material is out of stock and is on backorder. Please contact customer service for an estimated ship date.')\n        }\n        else {\n            this.warnings.remove('material')\n        }\n    }\n\n    checkMaterialColor() {\n        if (!this.configured.material_color || !this.configured.material.design_colors.getItemFromID(this.configured.material_color.id)) {\n            this.configured.material_color = this.configured.material.design_colors.find(v => v.default) || this.configured.material.design_colors[0];\n        }\n    }\n\n    async setupRetailPackaging() {\n        await this.setup_complete;\n\n        // Already setup, don't call again to prevent duplicating listeners\n        if (this.packages) {\n            await this.packages.$promise;\n            return;\n        }\n\n        this.resetPackages();\n        await this.packages.$promise;\n\n        this.bind('change:size', this.updatePackages.bind(this), this);\n        this.configured.bind('change:material', this.resetPackages.bind(this), this);\n    }\n\n    private resetPackages() {\n        this.packages = Services.get<typeof RetailPackage>('RetailPackage').objects.filter({material: this.configured.material.id});\n        this.available_packages = [];\n\n        this.packages.$promise.then(() => {\n            this.updatePackages();\n            this.trigger('sync');\n        })\n    }\n\n    hasPackageOptions() {\n        return this.packages && this.packages.items.length > 0;\n    }\n\n    updatePackages() {\n        let old_packages = this.available_packages;\n\n        this.available_packages = [];\n        for (const item of this.packages.items) {\n            let size = item.getValidSizeFor(this.width, this.height);\n\n            if (!size) {\n                continue;\n            }\n\n            let configured;\n            if (this.configured.retail_package && this.configured.retail_package.package.id == item.id) {\n                configured = this.configured.retail_package;\n                configured.size = size;\n            }\n            else {\n                for (const old_package of old_packages) {\n                    if (old_package.package.id == item.id) {\n                        configured = old_package\n                        if (old_package.size != size) {\n                            old_package.size = size;\n                        }\n                        break;\n                    }\n                }\n            }\n            if (!configured) {\n                configured = new ConfiguredRetailPackage({\n                    package: item,\n                    size: size\n                })\n            }\n\n            configured.fetchQuote();\n            this.available_packages.push(configured);\n        }\n    }\n\n    validateMaxSize() {\n        if (!this.errors) {\n            this.errors = new MessageList();\n        }\n        this.errors.remove('size');\n\n        let errors = false;\n        let skip_material_check = this.configured.material_color && this.configured.material_color.sizeIsRestricted();\n        if (!skip_material_check) {\n            if (!this.configured.material.sizeIsValid(this.configured.width, this.configured.height)) {\n                this.errors.merge(this.configured.material.errors.list);\n                errors = true;\n            }\n        }\n        else {\n            if (!this.configured.material_color.sizeIsValid(this.configured.width, this.configured.height)) {\n                this.errors.merge(this.configured.material_color.errors.list);\n                errors = true;\n            }\n        }\n        this.trigger('sync');\n        return !errors;\n    }\n\n    forceUpdatePricing() {\n        this.price_quote_key = null;\n        this.updatePricing();\n    }\n\n    updatePricing(keep_errors?): void {\n        if (!keep_errors) {\n            this.errors.reset();\n        }\n\n        if (!this.configured.material || !this.width || !this.height || !this.configured.material.quantityIsValid(this.configured.quantity)) {\n            return;\n        }\n\n        if (!this.validateMaxSize()) {\n            return;\n        }\n\n        const quoted_material = this.configured.material.id;\n        const quoted_width = this.configured.cleaned.width;\n        const quoted_height = this.configured.cleaned.height;\n\n        const PriceQuoteService = Services.get<PriceQuote>('PriceQuote');\n\n        // Prevent duplicates. This happens with the change:width, change:height bindings and forced aspect ratios.\n        let key = `${quoted_width}-${quoted_height}-${quoted_material}-${this.show_retail}`;\n        if (this.price_quote_key == key) {\n            // Reset priceTier\n            this.price_tier = null;\n            this.price;\n            this.trigger('change:price');\n            return;\n        }\n        this.price_quote_key = key;\n\n        this.price_quote_uuid = PriceQuoteService.uuid();\n        this.price_tier = null;\n        PriceQuoteService.getPriceQuote(\n            quoted_width,\n            quoted_height,\n            quoted_material,\n            this.price_quote_uuid,\n            this.show_retail\n        ).then((response) => {\n            // Only accept pricing data from the last submitted request\n            if (response.data.uuid != this.price_quote_uuid) {\n                return;\n            }\n\n            let prices = response.data.prices;\n            if (!prices) {\n                return;\n            }\n\n            let quantities = response.data.quantities;\n            quantities.unshift(1);\n\n            // shift sq inches breakpoint\n            const sqInch = prices.shift();\n            if (sqInch < this.configured.sqInches) {\n                return;\n            }\n\n            this.pricing = [];\n            for (let i = 0; i < prices.length; i++) {\n                this.pricing.push(new PricingTier(quantities[i], roundHalfUp(prices[i] * (this.designHasVariableData() ? this.configured.material.variable_data_charge + 1 : 1))));\n            }\n\n            // Reset priceTier\n            this.price_tier = null;\n            this.price;\n            this.trigger('change:price');\n        }, (response) => {\n            this.errors.reset();\n\n            if (response && response['data']) {\n                this.errors.merge(new MessageList(response['data']['errors']).list);\n            }\n\n            return response;\n        });\n    }\n\n    designHasVariableData() {\n        return this.configured.variable_data;\n    }\n\n    get price(): PricingTier {\n        if (this.price_tier)\n            return this.price_tier;\n\n        // Can't calculate the price without pricing list\n        if (!this.pricing) {\n            return new PricingTier(0, 0);\n        }\n\n        let tier = this.pricing[0];\n        let next_tier = null;\n        for (let i = 0; i < this.pricing.length; i++) {\n            let t = this.pricing[i];\n            if (t.quantity <= parseInt('' + this.configured.quantity)) {\n                tier = t;\n                if (i + 1 < this.pricing.length) {\n                    next_tier = this.pricing[i+1];\n                }\n                else {\n                    next_tier = null;\n                }\n            }\n        }\n\n        if (next_tier && tier.quantity != this.configured.quantity) {\n            // We need to do a linear interpolation on the total price instead of the unit.\n            // The total lerp creates a smooth fit curve for the unit price.\n            // Doing a lerp on the unit price will create an inverted parabola on the total price that can cause the total price to decrease\n            // This needs to match the backend calculations\n            let percent = (this.configured.quantity - tier.quantity) / (next_tier.quantity - tier.quantity);\n            // We use ceil on the new unit price so that the price drops exactly on the new tier\n            // Rounding issues can still cause the total price to decrease and the quantity increases but this is unavoidable with prices fixed to the unit price\n\n            // Update: I needed to create a special to fixed ceil function that will round the shifted value to try and reduce rounding issues\n            // I don't think it's perfect, but it seems to resolve most of the rounding issues and match the backend Decimal result\n            let value = toFixedCeilStable(lerp(tier.price, next_tier.price, percent) / this.configured.quantity);\n            this.price_tier = new PricingTier(this.configured.quantity, value);\n        }\n        else {\n            this.price_tier = new PricingTier(this.configured.quantity, tier.unitPrice);\n        }\n\n        return this.price_tier;\n    }\n\n    override async preSave() {\n        if (this.configured.retail_package && !this.configured.retail_package.id) {\n            await this.configured.retail_package.save();\n        }\n    }\n\n    override checkWarnings(): void {\n        super.checkWarnings();\n\n        if (this.base.remaining_stock != null) {\n            if (this.quantity > this.base.remaining_stock) {\n                if (this.base.allow_backorders) {\n                    this.warnings.add('quantity', `This product is on backorder and only ${this.base.remaining_stock} are left in stock.`);\n                }\n                else if (this.outOfStock()) {\n                    if (this.base.remaining_stock <= 0) {\n                        this.warnings.add('quantity', 'This product is out of stock.')\n                    }\n                    else {\n                        this.warnings.add('quantity', `This product only has ${this.base.remaining_stock} left in stock.`);\n                    }\n                }\n            }\n        }\n    }\n\n    public outOfStock(): boolean {\n        return this.base.remaining_stock != null && !this.base.allow_backorders && this.quantity > this.base.remaining_stock;\n    }\n\n    public disabled(): boolean {\n        return !this.setup_complete.isResolved() || this.outOfStock();\n    }\n\n    async save($event?, skip_validation?) {\n        const state = new ButtonProcessingState($event);\n        state.process();\n\n        // Remove any save before exit warnings\n        window.onbeforeunload = null;\n\n        if (!skip_validation) {\n            this.validate();\n            if (this.hasErrors) {\n                state.resolved();\n                return;\n            }\n        }\n\n        await this.preSave();\n\n        // When we're saving, we need to make sure there aren't any more\n        // changes to the design.\n        this.saving = true;\n\n        this.configured.save().then((response) => {\n            this.onSaveSuccess(response);\n\n            if (this.add_to_cart) {\n                this.configured.addToCart().then(() => {\n                    this.saving = !this.pageTransition(response);\n                    state.resolved();\n                }, (response: any) => {\n                    if (response.data && response.data.errors) {\n                        this.errors.merge(response.data.errors);\n                    }\n                    else if (response.data && response.data.error) {\n                        this.errors.add('__all__', response.data.error)\n                    }\n                    else {\n                        this.errors.add('__all__', 'Unable to add the product to the cart');\n                    }\n\n                    state.resolved();\n                    this.saving = false;\n                    return response;\n                });\n            }\n            else {\n                this.saving = !this.pageTransition(response);\n                state.resolved();\n            }\n        }, (error: any) => {\n            let response = error;\n            if (error.response) {\n                response = error.response;\n            }\n\n            this.saving = false;\n            state.resolved();\n\n            // We really need to standardize these...\n            if (response.data && response.data.errors) {\n                this.errors.merge(response.data.errors);\n            }\n            if (response.data && response.data.error) {\n                this.errors.add('__all__', response.data.error);\n            }\n            if (response.data && response.data.error_message) {\n                this.errors.add('__all__', response.data.error_message);\n            }\n\n            this.errors.merge(this.configured.errors.list);\n\n            this.onSaveFailure(response);\n        });\n    }\n\n    get allow_custom_sizes(): boolean {\n        return true\n    }\n    \n    get show_custom_sizes(): boolean {\n        return true;\n    }\n\n    /*\n        Optional size bindings to add additional functionality for size change checks.\n        It's used with the vinyl lettering tool for the font lock functionality.\n     */\n    protected onHeightChange() {}\n    protected onWidthChange() {}\n\n    get height(): number {\n        return this.configured.height;\n    }\n    set height(height) {\n        if (height === this.configured.height)\n            return;\n\n        this.price_tier = null;\n\n        // Don't clamp the configured height and width because we need max precision\n        this.configured.height = height;\n\n        // Lock the ratio if lock_ratio is set and the users are not locked to a set size\n        if (this.proportions_ratio || this.base.hasLockRatio) {\n            this.configured.width = this.configured.height * (this.proportions_ratio || this.base.lockRatio);\n        }\n        this.onHeightChange();\n\n        this.trigger('change:height');\n        this.trigger('change:size');\n    }\n\n    get width(): number {\n        return this.configured.width;\n    }\n    set width(width) {\n        if (width === this.configured.width) {\n            return;\n        }\n\n        this.price_tier = null;\n\n        // Don't clamp the configured height and width because we need max precision for converted values\n        this.configured.width = width;\n\n        // Lock the ratio if lock_ratio is set and the users are not locked to a set size\n        if (this.proportions_ratio || this.base.hasLockRatio) {\n            this.configured.height = this.configured.width / (this.proportions_ratio || this.base.lockRatio);\n        }\n        this.onWidthChange();\n\n        this.trigger('change:width');\n        this.trigger('change:size');\n    }\n\n    /*\n        Unit converted height and width access based on user preferences. This should be used instead of the normal\n        width and height. We must check for the empty string case differently without converting the value to allow\n        for clearing out the input without it being forced back to 0.\n     */\n    get unit_width() {\n        if (isEmptyString(this.width)) {\n            return this.width;\n        }\n\n        return clamp(this.ups.convertSizeFromInches(this.width));\n    }\n    set unit_width(v) {\n        if (isEmptyString(v)) {\n            this.width = v;\n        }\n        else {\n            this.width = this.ups.convertSizeToInches(v);\n        }\n    }\n\n    get unit_height() {\n        if (isEmptyString(this.height)) {\n            return this.height;\n        }\n\n        return clamp(this.ups.convertSizeFromInches(this.height));\n    }\n    set unit_height(v) {\n        if (isEmptyString(v)) {\n            this.height = v;\n        }\n        else {\n            this.height = this.ups.convertSizeToInches(v);\n        }\n    }\n\n    get quantity(): number {\n        return this.configured.quantity;\n    }\n\n    set quantity(v) {\n        this.configured.quantity = v;\n\n        this.updatePricing();\n        this.trigger('change:quantity');\n    }\n\n    toggleLockedProportions() {\n        if (!this.allow_custom_sizes) {\n            return;\n        }\n\n        if (this.proportions_ratio) {\n            this.proportions_ratio = null;\n        }\n        else {\n            this.proportions_ratio = this.width / this.height;\n        }\n    }\n\n    setLockedProportions(v) {\n        if (!this.allow_custom_sizes) {\n            return;\n        }\n        if (v) {\n            this.proportions_ratio = this.width / this.height;\n        }\n        else {\n            this.proportions_ratio = null;\n        }\n    }\n\n    updateCanvas() {}\n\n    isPromotionalTextDisabled(): boolean {\n        if (!this.setup_complete.isResolved()) {\n            return false;\n        }\n\n        return !!this.configured.material.disable_promotional_text;\n    }\n\n    adjustSizeToPackage() {\n        if (this.packages.items.length == 0) {\n            return;\n        }\n\n        let item = this.packages.items[0];\n\n        if (item.available_sizes.length == 0) {\n            return;\n        }\n\n        let size = item.available_sizes[0];\n\n        if (!this.proportions_ratio) {\n            this.proportions_ratio = this.width / this.height;\n        }\n\n        if (this.width > this.height) {\n            this.width = size.max_product_width - 0.25;\n        }\n        else {\n            this.height = size.max_product_width - 0.25;\n        }\n    }\n\n    adjustedPackageSize() {\n        // Used to show a preview of what the size will be adjusted to.\n        // Use adjustSizeToPackage to adjust the size of the product to the package.\n\n        if (!this.packages || this.packages.items.length == 0) {\n            return;\n        }\n\n        let item = this.packages.items[0];\n\n        if (item.available_sizes.length == 0) {\n            return;\n        }\n\n        let size = item.available_sizes[0];\n\n        let proportions_ratio = this.proportions_ratio || this.width / this.height;\n        if (this.width > this.height) {\n            return {\n                width: Number(size.max_product_width - 0.25).toFixed(2),\n                height: Number((size.max_product_width - 0.25) * (1 / proportions_ratio)).toFixed(2)\n            }\n        }\n        else {\n            return {\n                width: Number((size.max_product_width - 0.25) * proportions_ratio).toFixed(2),\n                height: Number(size.max_product_width - 0.25).toFixed(2),\n            }\n        }\n    }\n\n\n    materialSelectionMap() {\n        let map = {};\n\n        for (const material of this.base.materials) {\n            if (!material.adhesive) {\n                continue;\n            }\n\n            let name = material.material_name || material.name;\n            if (!map[name]) {\n                map[name] = {}\n            }\n            map[name][material.adhesive] = material;\n        }\n\n        return map;\n    }\n\n    materialTypes() {\n        return Object.keys(this.materialSelectionMap()).sort();\n    }\n\n    adhesiveTypes() {\n        let data = this.materialSelectionMap()[this.material_name] || [];\n        return Object.keys(data).sort((a, b) => {\n            return data[a].order - data[b].order;\n        });\n    }\n\n    get material_name() {\n        return this.configured.material.material_name || this.configured.material.name;\n    }\n    set material_name(v) {\n        let map = this.materialSelectionMap();\n        this.configured.material = map[v][Object.keys(map[v])[0]];\n    }\n\n    get adhesive_type() {\n        return this.configured.material.adhesive;\n    }\n    set adhesive_type(v) {\n        let map = this.materialSelectionMap();\n        this.configured.material = map[this.material_name][v];\n    }\n\n    setupProductOptions() {\n        if (!this.configured_option_model) {\n            return;\n        }\n\n        // Unify the template and custom product's option sets\n        const ConfiguredOptionModel = Services.get<typeof AbstractProductOption>(this.configured_option_model);\n\n        for (const option_set of (this.base as ProductAbstract).options) {\n            // I have no idea what is causing this but somehow customers are getting empty option sets added\n            if (!option_set || !option_set.id) {\n                continue;\n            }\n\n            let found = false;\n            for (const custom_option of this.configured.options) {\n                if (option_set.equals(custom_option.option_set)) {\n                    found = true;\n                    break;\n                }\n            }\n\n            if (!found) {\n                let default_option = null;\n\n                if (option_set.display_type != DisplayTypeEnum.CHECKBOX) {\n                    default_option = option_set.options[0];\n                    for (const option of option_set.options) {\n                        if (option.default) {\n                            default_option = option;\n                            break;\n                        }\n                    }\n                }\n\n                // Ugh... There isn't a good way to define a concrete class that implements an abstract class and is not the abstract class\n                // @ts-ignore \"Cannot create an instance of an abstract class.\"\n                const option = new ConfiguredOptionModel({\n                    option_set: option_set,\n                    option: default_option,\n                    configured: this.configured\n                });\n\n                this.configured.options.push(option);\n            }\n        }\n\n        // Make sure the option selected is form the option set.\n        // Otherwise, vue won't see them as the same item and option selections won't work until they interact with it.\n        for (let option of this.configured.options) {\n            if (option.option_set && option.option && option.option_set.options.length > 0) {\n                option.option = option.option_set.options.getItemFromID(option.option.id) as any || option;\n            }\n\n            option.option_set?.validateDisplayType();\n        }\n    }\n\n    proportionsLocked() {\n        return this.proportions_ratio != null;\n    }\n}\n","import MessageList from '../../../core/utils/MessageList';\nimport {Services} from '../../../core/services/Services';\nimport UserProfileService from '../../userprofile/services/UserProfileService';\nimport PricingTier from '../../../core/utils/PricingTier';\nimport {ProductAttributeAbstract} from '../../product/models/abstract/ProductAttributeAbstract';\nimport {Model} from '../../../core/models/Model';\nimport {IDeferred, IPromise, SimplePromise} from '../../../core/utils/SimplePromise';\nimport {Analytics} from '../../../core/services/Analytics';\nimport {EventDispatcher} from '../../../core/utils/EventDispatcher';\n\nexport default abstract class ProductServiceAbstract extends EventDispatcher {\n    public base: ProductAttributeAbstract;\n    public configured: Model;\n\n    public base_class: typeof ProductAttributeAbstract;\n    public configured_class: typeof Model;\n    public base_key: string; // The key to access the base object on the configured class, ex: template, clipart_product\n\n    public errors: MessageList;\n    public warnings: MessageList;\n\n    public setup_complete: IPromise<void>;\n    protected setup_complete_deferred: IDeferred<void>;\n\n    public ups: UserProfileService;\n\n    public saving: boolean;\n    public auto_page_transition: boolean;\n    public add_to_cart: boolean;\n\n    public page_change_params;\n\n    currency: string;\n\n    protected show_retail_value: boolean = false;\n\n    constructor(base_class, configured_class, base_key) {\n        super();\n\n        this.setup_complete_deferred = SimplePromise.defer<void>();\n        this.setup_complete = this.setup_complete_deferred.promise;\n\n        this.errors = new MessageList();\n        this.warnings = new MessageList();\n        this.ups = Services.get<UserProfileService>('UserProfileService');\n\n        this.base_class = base_class;\n        this.configured_class = configured_class;\n        this.base_key = base_key;\n        this.auto_page_transition = true;\n        this.add_to_cart = true;\n\n        this.setup_complete.then(() => {\n            if (this.price.price == 0) {\n                this.once('change:price', () => {\n                    Services.get<Analytics>('Analytics').trackProductPage(this.base.sku, this.price.price);\n                }, this);\n            }\n            else {\n                Services.get<Analytics>('Analytics').trackProductPage(this.base.sku, this.price.price);\n            }\n        });\n\n        window.addEventListener('pageshow', (event) => {\n            // The page was loaded from cache, reset any states that prevent the user from using the page\n            if (event.persisted) {\n                this.saving = false;\n                this.trigger('sync');\n            }\n        });\n    }\n\n    revalidateOnError() {\n        if (this.errors && this.errors.length > 0) {\n            this.validate();\n        }\n    }\n\n    setupFromData(base_data, configured_data, all_data): void {\n        let base = null;\n        let configured = null;\n\n        if (base_data) {\n            base = new this.base_class(base_data);\n        }\n        if (configured_data) {\n            configured = new this.configured_class(configured_data);\n        }\n\n        if (!base && configured) {\n            base = configured[this.base_key];\n        }\n        if (!configured) {\n            configured = new this.configured_class();\n        }\n\n        this.currency = all_data.currency;\n\n        this.setupExtraData(all_data);\n        this.setupFromProduct(base, configured);\n    }\n\n    setupExtraData(all_data): void {}\n\n    setupFromProduct(base, configured): void {\n        this.base = base;\n        this.configured = configured;\n        this.setupConfiguredFromBase();\n    }\n\n    setupConfiguredFromBase(needs_additional_setup=false): void {}\n\n    abstract save($event?): void;\n\n    // Available hooks for saving\n    onSaveSuccess(response): void {}\n    onSaveFailure(response): void {\n        this.page_change_params = null;\n    }\n    async preSave() {};\n\n    nextUrl() {\n        return '/cart/'\n    }\n\n    pageTransition(response): boolean {\n        if (this.auto_page_transition) {\n            const next_url = new URL(window.location.origin + this.nextUrl());\n            const current_url = new URL(window.location.href);\n\n            if (current_url.searchParams.get('q')) {\n                next_url.searchParams.append('q', current_url.searchParams.get('q'));\n            }\n\n            if (this.page_change_params) {\n                for (const key of Object.keys(this.page_change_params)) {\n                    next_url.searchParams.append(key, this.page_change_params[key]);\n                }\n            }\n\n            Services.get<Analytics>('Analytics').trackAddedProductToCart(this.base.sku, this.price.price, this.quantity);\n\n            this.onSaveSuccess(response);\n\n            window.location.assign(next_url.href);\n\n            return true;\n        }\n\n        return false;\n    }\n\n    preValidate() {\n        return;\n    }\n\n    validate(): boolean {\n        if (!this.errors) {\n            this.errors = new MessageList();\n        }\n        if (!this.warnings) {\n            this.warnings = new MessageList();\n        }\n\n        this.preValidate();\n\n        this.errors.reset();\n        this.warnings.reset();\n        this.configured.validate();\n\n        this.trigger('validate', this.errors);\n\n        this.errors.merge(this.configured.errors.list);\n\n        return !this.hasErrors;\n    }\n\n    checkWarnings() {\n        if (!this.warnings) {\n            this.warnings = new MessageList();\n        }\n\n        this.warnings.reset();\n    }\n\n    get hasErrors(): boolean {\n        return this.errors.length > 0;\n    }\n\n    abstract price: PricingTier;\n    abstract quantity: number;\n\n    get optionsPrice(): number {\n        return 0;\n    }\n\n    get optionsUnitValue(): number {\n        return 0;\n    }\n\n    get show_retail() {\n        return this.show_retail_value;\n    }\n    set show_retail(v) {\n        this.show_retail_value = v;\n        this.updatePricing();\n    }\n\n    abstract updatePricing();\n}\n","import {uuid4} from '../../../core/utils/uuid';\nimport {Http} from '../../../core/services/Http';\nimport {IPromise, SimplePromise} from '../../../core/utils/SimplePromise';\nimport PricingTier from '../../../core/utils/PricingTier';\n\nexport default class PriceQuote {\n    static $inject = [\n        '$http'\n    ];\n\n    public $http: Http;\n\n    constructor($http) {\n        this.$http = $http;\n    }\n\n    uuid() {\n        return uuid4();\n    }\n\n    // Raw quote request\n    getPriceQuote(width, height, material_id, uuid, show_retail=false) {\n        return this.$http.request({\n            url: '/custom/api/v1/price-quote/',\n            method: 'POST',\n            data: {\n                uuid: uuid,\n                width: width,\n                height: height,\n                material_id: material_id,\n                show_retail: show_retail\n            }\n        });\n    }\n\n    // Processed quote\n    quoteRetailPackage(package_id, size_id, show_retail=false): IPromise<{pricing: PricingTier[], currency: string}> {\n        const deferred = SimplePromise.defer<{pricing: PricingTier[], currency: string}>();\n\n        this.$http.request({\n            url: '/packaging/api/v1/price-quote/',\n            method: 'POST',\n            data: {\n                package_id: package_id,\n                size_id: size_id,\n                show_retail: show_retail\n            }\n        }).then((response) => {\n            let prices = response.data.prices;\n            if (!prices) {\n                deferred.reject(null);\n                return;\n            }\n\n            let quantities = response.data.quantities;\n            quantities.unshift(1);\n\n            // shift sq inches breakpoint\n            const sqInch = prices.shift();\n\n            let pricing = [];\n            for (let i = 0; i < prices.length; i++) {\n                pricing.push(new PricingTier(quantities[i], prices[i]));\n            }\n            deferred.resolve({\n                'pricing': pricing,\n                'currency': response.data.currency\n            });\n        }, (error) => {\n            deferred.reject(null);\n        })\n\n        return deferred.promise;\n    }\n}\n","import {IServices} from '../../../core/services/Services';\nimport PriceQuote from './PriceQuote';\n\nexport default function registerServices(services: IServices) {\n    services.singleton('PriceQuote', PriceQuote);\n}","import VueApp from '../../../core/adapters/VueApp';\nimport {data, method, prop} from '../../../core/adapters/VueComponent';\nimport ProductServiceAbstract from '../../products_shared/services/ProductServiceAbstract';\nimport {Services} from '../../../core/services/Services';\nimport UserProfileService from '../../userprofile/services/UserProfileService';\nimport {modal} from \"../../../core/utils/Modal\";\n\nexport default class ProductPageLoaderAbstract extends VueApp {\n    protected base_data_key: string;\n    protected configured_data_key: string;\n    protected product_data: any;\n\n    @prop()\n    defaultPrice: string;\n\n    @data()\n    product_service: ProductServiceAbstract;\n\n    @data()\n    image_display: number;\n\n    @data()\n    ups: UserProfileService;\n\n    constructor() {\n        super();\n\n        this.ups = Services.get<UserProfileService>('UserProfileService');\n\n        Services.waitOn('product-service-loaded').then(() => {\n            this.product_service = Services.get<ProductServiceAbstract>('ProductService');\n        })\n    }\n\n    static override init(product_service: ProductServiceAbstract, base_data_key = 'product', configured_data_key = 'configured_product') {\n        super.init();\n\n        let product_data = null;\n        let product_data_element = document.getElementById(\"product-data\");\n        if (product_data_element && product_data_element.textContent) {\n            product_data = JSON.parse(atob(product_data_element.textContent.replace(/(\\r\\n\\t|\\n|\\r\\t|\\s)/gm, '')));\n            product_data_element.remove()\n        }\n\n        if (!product_data) {\n            return;\n        }\n\n        product_service.setupFromData(product_data[base_data_key], product_data[configured_data_key], product_data);\n\n        Services.registerObject('ProductService', product_service);\n        Services.resolve('product-service-loaded');\n    }\n\n    @method()\n    scrollToTestimonials($event) {\n        if (document.getElementById('featured-testimonial-component')) {\n            document.getElementById('featured-testimonial-component').scrollIntoView({behavior: 'smooth', block: 'start'});\n        }\n        else {\n            window.location.href = '/testimonials/'\n        }\n    }\n\n    withinViewport() {\n        let el = document.querySelector('.product-options');\n        if (!el) {\n            return true;\n        }\n        return el.getBoundingClientRect().y >= 0;\n    }\n\n    @method()\n    checkScrollPosition() {\n        // Safari has issues with the scroll position changing.\n        // In chrome and firefox, it will keep the same relative scroll position, so when the page scroll height changes, you are still viewing the same thing.\n        // Safari keeps the same absolute scroll position so when the scroll height changes, the viewport jumps to some random thing on the screen...\n        setTimeout(() => {\n            if (!this.withinViewport()) {\n                document.querySelector('.product-options')?.scrollIntoView({behavior: 'smooth', block: 'start'});\n            }\n        })\n    }\n\n    @method()\n    register() {\n        modal.register();\n    }\n}\n\n","export enum ShapeType {\n    polygon = 0,\n    star = 1,\n    ellipse = 2,\n    rectangle = 3\n}\n\nexport const html:string = `\n<div class=\"tool-action-header\">\n    <tool-navigation></tool-navigation>\n    <h3 class=\"full-width align-center\">Add Shape</h3>\n</div>\n<select-layer-bar :product-service=\"productService\"></select-layer-bar>\n<div class=\"inner-drag-content\">\n    <fieldset class=\"input-group single-option\">\n        <legend>Shape Type</legend>\n        <div class=\"toggle-group toggle-sm\">\n            <label for=\"shape-type-ellipse\">\n                <input id=\"shape-type-ellipse\" :value=\"${ShapeType.ellipse}\" name=\"text-type\" type=\"radio\" v-model=\"shape_type\" @change=\"buildShapePath()\" />\n                <div class=\"flex-full-center column spacing-sm\">\n                    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path d=\"M11.9 20.9C16.8706 20.9 20.9 16.8706 20.9 11.9C20.9 6.92943 16.8706 2.89999 11.9 2.89999C6.92946 2.89999 2.90002 6.92943 2.90002 11.9C2.90002 16.8706 6.92946 20.9 11.9 20.9Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linejoin=\"round\"/>\n                    </svg>\n                    Ellipse\n                </div>\n            </label>\n            <label for=\"shape-type-polygon\">\n                <input id=\"shape-type-polygon\" :value=\"${ShapeType.polygon}\" name=\"text-type\" type=\"radio\" v-model=\"shape_type\" @change=\"buildShapePath(5)\"/>\n                <div class=\"flex-full-center column spacing-sm\">\n                    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path d=\"M11.0605 2.93203C11.3983 2.68689 11.5672 2.56432 11.7518 2.51696C11.9148 2.47514 12.0858 2.47514 12.2488 2.51696C12.4334 2.56432 12.6023 2.68689 12.9401 2.93203L21.0586 8.82396C21.397 9.06956 21.5663 9.19235 21.6686 9.3535C21.7589 9.49579 21.8119 9.65862 21.8224 9.82684C21.8344 10.0174 21.7697 10.2162 21.6404 10.6138L18.5401 20.1449C18.4109 20.5421 18.3463 20.7407 18.2247 20.8876C18.1173 21.0173 17.979 21.1178 17.8224 21.1798C17.6451 21.25 17.4362 21.25 17.0186 21.25H6.98203C6.56437 21.25 6.35554 21.25 6.17822 21.1798C6.02164 21.1178 5.88325 21.0173 5.77589 20.8876C5.65429 20.7407 5.58969 20.5421 5.4605 20.1449L2.36021 10.6138C2.23086 10.2162 2.16619 10.0174 2.17817 9.82684C2.18874 9.65862 2.24166 9.49579 2.33202 9.3535C2.43434 9.19235 2.60355 9.06956 2.94196 8.82396L11.0605 2.93203Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                    </svg>\n                    Polygon\n                </div>\n            </label>\n            <label for=\"shape-type-rectangle\">\n                <input id=\"shape-type-rectangle\" :value=\"${ShapeType.rectangle}\" name=\"text-type\" type=\"radio\" v-model=\"shape_type\" @change=\"buildShapePath(4)\" />\n                <div class=\"flex-full-center column spacing-sm\">\n                    <svg width=\"24\" height=\"24\" viewBox=\"0 0 22 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path d=\"M21 1H1V17H21V1Z\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linejoin=\"round\"/>\n                    </svg>\n                    Rectangle\n                </div>\n            </label>\n            <label for=\"shape-type-star\">\n                <input id=\"shape-type-star\" :value=\"${ShapeType.star}\" name=\"text-type\" type=\"radio\" v-model=\"shape_type\" @change=\"buildShapePath(5)\"/>\n                <div class=\"flex-full-center column spacing-sm\">\n                    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path d=\"M11.2827 3.4533C11.5131 2.98636 11.6284 2.75289 11.7848 2.6783C11.9209 2.6134 12.0791 2.6134 12.2152 2.6783C12.3717 2.75289 12.4869 2.98636 12.7174 3.4533L14.9041 7.88327C14.9721 8.02112 15.0061 8.09004 15.0558 8.14356C15.0999 8.19094 15.1527 8.22933 15.2113 8.25661C15.2776 8.28741 15.3536 8.29852 15.5057 8.32076L20.397 9.03569C20.9121 9.11098 21.1696 9.14862 21.2888 9.27442C21.3925 9.38388 21.4412 9.53428 21.4215 9.68376C21.3988 9.85556 21.2124 10.0372 20.8395 10.4004L17.3014 13.8464C17.1912 13.9538 17.136 14.0075 17.1004 14.0714C17.0689 14.128 17.0487 14.1902 17.0409 14.2545C17.0321 14.3271 17.0451 14.403 17.0711 14.5547L17.906 19.4221C17.994 19.9355 18.038 20.1922 17.9553 20.3445C17.8833 20.477 17.7554 20.57 17.6071 20.5975C17.4366 20.6291 17.2061 20.5078 16.7451 20.2654L12.3724 17.9658C12.2361 17.8942 12.168 17.8583 12.0962 17.8443C12.0327 17.8318 11.9673 17.8318 11.9038 17.8443C11.832 17.8583 11.7639 17.8942 11.6277 17.9658L7.25492 20.2654C6.79392 20.5078 6.56341 20.6291 6.39297 20.5975C6.24468 20.57 6.11672 20.477 6.04474 20.3445C5.962 20.1922 6.00603 19.9355 6.09407 19.4221L6.92889 14.5547C6.95491 14.403 6.96793 14.3271 6.95912 14.2545C6.95132 14.1902 6.93111 14.128 6.89961 14.0714C6.86402 14.0075 6.80888 13.9538 6.69859 13.8464L3.16056 10.4004C2.78766 10.0372 2.60121 9.85556 2.57853 9.68376C2.55879 9.53428 2.60755 9.38388 2.71125 9.27442C2.83044 9.14862 3.08797 9.11098 3.60304 9.03569L8.49431 8.32076C8.64642 8.29852 8.72248 8.28741 8.78872 8.25661C8.84736 8.22933 8.90016 8.19094 8.94419 8.14356C8.99391 8.09004 9.02793 8.02112 9.09597 7.88327L11.2827 3.4533Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n                    </svg>\n                    Star\n                </div>\n            </label>\n        </div>\n    </fieldset>\n    \n    <div class=\"grid\">\n        <div class=\"xs-6 flex-left column\">\n            <div class=\"input-group\">\n                <label>Preview</label>\n                <svg width=\"100\" height=\"100\" xmlns=\"http://www.w3.org/2000/svg\" :viewBox=\"viewbox\">\n                    <path stroke=\"var(--icon-strong, #98A2B3)\" :stroke-width=\"stroke_width\" fill=\"transparent\" v-if=\"shape_type != ${ShapeType.ellipse}\" :d=\"svg_path\"></path>\n                    <ellipse stroke=\"var(--icon-strong, #98A2B3)\" :stroke-width=\"stroke_width\" fill=\"transparent\" v-if=\"shape_type == ${ShapeType.ellipse}\" :cx=\"shape_size/2\" :cy=\"shape_size/2\" :rx=\"shape_size/2\" :ry=\"shape_size/2\"></ellipse>\n                </svg>\n            </div>\n        </div>\n        <div class=\"xs-6\">\n            <div class=\"input-group\" v-if=\"shape_type != ${ShapeType.ellipse} && shape_type != ${ShapeType.rectangle}\">\n                <label>Sides</label>\n                <input type=\"number\" v-model=\"side_count\" @change=\"buildShapePath()\">\n            </div>\n            <div class=\"input-group\" v-if=\"shape_type != ${ShapeType.ellipse}\">\n                <label>Corner Roundness</label>\n                <input type=\"number\" v-model=\"roundness\" @change=\"buildShapePath()\">\n            </div>\n        </div>\n    </div>\n    \n    <button class=\"btn-base btn-primary-action\" @click=\"addElement()\">Add Shape</button>\n</div>\n`;","import VueComponent, {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './SelectDesign.html';\nimport APIResponse from '../../../../../core/models/APIResponse';\nimport {UserFile} from '../../../models/UserFile';\nimport {Services} from '../../../../../core/services/Services';\nimport CustomService from '../../../services/CustomService';\n\nclass SelectDesignController extends VueComponent {\n\n    @prop({\n        emit: true\n    })\n    step: number;\n\n    @prop({\n        emit: true\n    })\n    action: string;\n\n    @prop()\n    files: boolean;\n\n    @prop()\n    reorders: boolean;\n\n    @prop()\n    autosaves: boolean;\n\n    @prop()\n    productService: CustomService;\n\n    @data()\n    selected_action: string;\n\n    override mounted() {\n        super.mounted();\n        this.selected_action = 'upload';\n        this.productService.setup_complete.then(() => {\n            if (this.productService.base.disable_upload || this.productService.base.design_only) {\n                this.selected_action = 'new-design';\n            }\n            else {\n                this.selected_action = 'upload';\n            }\n        })\n    }\n\n    @method()\n    back() {\n        this.step = this.step - 1;\n    }\n\n    @method()\n    nextStep() {\n        if (this.selected_action == 'new-design') {\n            this.productService.configured.configure = true;\n            this.productService.save();\n        }\n        else {\n            this.action = this.selected_action;\n            this.step = this.step + 1;\n        }\n    }\n}\n\nexport default function SelectDesign(): IVueComponent {\n    return {\n        template: html,\n        controller: SelectDesignController,\n        tag: 'setup-select-design'\n    }\n}","export const html: string = `\n<div class=\"flex-left column spacing-xl no-wrap space-between full-width full-height\">\n    <div class=\"flex-left column spacing-sm stretch no-wrap full-width\">\n        <div class=\"flex-left\">\n            <button class=\"btn-icon\" type=\"button\" @click=\"back()\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M15 18L9 12L15 6\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n        </div>\n        <fieldset class=\"input-group\">\n            <legend class=\"h4\">Design</legend>\n            <div class=\"option-cards\">\n                <label class=\"flex-left no-wrap centered\" v-if=\"!productService.base.disable_upload && !productService.base.design_only\">\n                    <input type=\"radio\" value=\"upload\" name=\"design_option\" v-model=\"selected_action\">\n                    <span class=\"flex-left full-width column spacing-xxs inline\">\n                        Upload a print-ready design\n                        <span class=\"text-sm\">(eps, ai, pdf, psd, svg, png, jpg, heif or tif)</span>\n                    </span>\n                </label>\n                <label class=\"flex-left no-wrap centered\" v-if=\"!productService.base.disable_upload && files && !productService.base.design_only\">\n                    <input type=\"radio\" value=\"previous-file\" name=\"design_option\" v-model=\"selected_action\">\n                    <span class=\"flex-left full-width column spacing-xxs inline\">\n                        Use a previously uploaded file\n                        <span class=\"text-sm\">Select a file from your past uploads</span>\n                    </span>\n                </label>\n                <label class=\"flex-left no-wrap centered\" v-if=\"!productService.base.disable_design\">\n                    <input type=\"radio\" value=\"new-design\" name=\"design_option\" v-model=\"selected_action\">\n                    <span class=\"flex-left full-width column spacing-xxs inline\">\n                        Start a new design\n                        <span class=\"text-sm\">Create and customize your product online</span>\n                    </span>\n                </label>\n                <label class=\"flex-left no-wrap centered\" v-if=\"!productService.base.disable_design && autosaves\">\n                    <input type=\"radio\" value=\"existing-design\" name=\"design_option\" v-model=\"selected_action\">\n                    <span class=\"flex-left full-width column spacing-xxs inline\">\n                        Continue editing a saved design\n                        <span class=\"text-sm\">Resume a work-in-progress</span>\n                    </span>\n                </label>\n            </div>\n        </fieldset>\n    </div>\n    <div class=\"flex-left column no-wrap full-width\">\n        <message-list :errors=\"productService.errors\" :all=\"true\">\n            <button type=\"button\" class=\"btn-base btn-primary-action full-width btn-large\" @click=\"nextStep();\" :disabled=\"productService.saving || !selected_action\">{{ productService.saving ? 'Saving' : 'Continue'  }}</button>\n        </message-list>\n    </div>\n</div>\n`;","import VueComponent, {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './UploadFile.html';\nimport CustomService from '../../../services/CustomService';\nimport {UserFile} from '../../../models/UserFile';\nimport {ToolTypeEnum} from '../../../models/enums';\nimport {processRequestError} from '../../../../../core/utils/utils';\n\nclass UploadFileController extends VueComponent {\n\n    @prop({\n        emit: true\n    })\n    step: number;\n\n    @prop()\n    productService: CustomService;\n\n    @data()\n    upload_success_callback;\n\n    @data()\n    upload_failure_callback;\n\n    constructor(component) {\n        super(component);\n\n        this.upload_success_callback = this.uploadSuccess.bind(this);\n        this.upload_failure_callback = this.uploadFailure.bind(this);\n    }\n\n    @method()\n    back() {\n        this.step = this.step - 1;\n    }\n\n    async uploadSuccess(response: any) {\n        const user_file = UserFile.objects.get({id: response.data.user_file});\n        await user_file.$promise;\n\n        this.productService.configured.tool_type = ToolTypeEnum.UPLOAD;\n        this.productService.configured.user_file = user_file;\n        if (this.productService.base.auto_background_removal) {\n            this.productService.remove_background = true;\n        }\n        this.productService.save();\n    }\n\n    uploadFailure(error) {\n        if (!error || !error.response) {\n            return;\n        }\n\n        this.productService.errors = processRequestError(error);\n        if (error.response.data) {\n            if (error.response.data.errors) {\n                this.productService.errors = processRequestError(error);\n            }\n            if (error.response.data.error) {\n                this.productService.errors.add('file', error.response.data.error);\n            }\n        }\n    }\n}\n\nexport default function UploadFile(): IVueComponent {\n    return {\n        template: html,\n        controller: UploadFileController,\n        tag: 'setup-upload-file'\n    }\n}","export const html: string = `\n<div class=\"flex-left column spacing-xl no-wrap space-between full-width full-height\">\n    <div class=\"flex-left column spacing-lg stretch no-wrap full-width\">\n        <div class=\"flex-left\">\n            <button class=\"btn-icon\" type=\"button\" @click=\"back()\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M15 18L9 12L15 6\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n        </div>\n        <div class=\"card info padded-card-xs text-sm\" v-if=\"productService.base.type == 0\">\n            <div class=\"flex-left-center spacing-sm no-wrap\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M12 16V12M12 8H12.01M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12Z\" stroke=\"var(--info-weak, #2E90FA)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n                This is a one-color product. We'll make your design in the color you chose, not the colors in your file.\n            </div>\n        </div>\n        <file-upload url=\"/custom/api/v1/upload/\" :success=\"upload_success_callback\" :failure=\"upload_failure_callback\"></file-upload>\n        <message-list :errors=\"productService.errors\" :all=\"true\"></message-list>\n    </div>\n</div>\n`;","import VueComponent, {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './SelectFile.html';\nimport CustomService from '../../../services/CustomService';\nimport {UserFile} from '../../../models/UserFile';\nimport {ToolTypeEnum} from '../../../models/enums';\nimport APIResponse from '../../../../../core/models/APIResponse';\nimport {Services} from '../../../../../core/services/Services';\n\nclass SelectFileController extends VueComponent {\n\n    @prop({\n        emit: true\n    })\n    step: number;\n\n    @prop()\n    productService: CustomService;\n\n    @data()\n    user_files: APIResponse<UserFile>;\n\n    @data()\n    limit: number = 16;\n\n    @data()\n    page: number = 1;\n\n    @data()\n    search: string;\n\n    constructor(component) {\n        super(component);\n        this.filter(this.page);\n    }\n\n    @method()\n    back() {\n        this.step = this.step - 1;\n    }\n\n    @method()\n    selectUserFile(user_file) {\n        this.productService.configured.tool_type = ToolTypeEnum.UPLOAD;\n        this.productService.configured.user_file = user_file;\n        this.goToFinalize();\n    }\n\n    @method()\n    goToFinalize() {\n        this.productService.configured.tool_type = ToolTypeEnum.UPLOAD;\n\n        if (this.productService.base.auto_background_removal) {\n            this.productService.remove_background = true;\n        }\n\n        this.productService.save();\n    }\n\n    @method()\n    filter(page?) {\n        if (page) {\n            this.page = page;\n        }\n        this.user_files = Services.get<typeof UserFile>('UserFile').objects.filter({\n            limit: this.limit,\n            offset: this.limit * (this.page - 1),\n            name__icontains: this.search,\n            hidden: false\n        });\n    }\n\n    @method()\n    removeUserFile(file: UserFile) {\n        file.remove().then(() => {\n            this.user_files.items.removeItemFromID(file.id);\n            this.filter();\n        });\n    }\n}\n\nexport default function SelectFile(): IVueComponent {\n    return {\n        template: html,\n        controller: SelectFileController,\n        tag: 'setup-select-file'\n    }\n}","export const html:string = `\n<div class=\"flex-left column spacing-md no-wrap space-between full-width full-height\">\n    <div class=\"flex-left column spacing-sm stretch no-wrap full-width\">\n        <div class=\"flex-left\">\n            <button class=\"btn-icon\" type=\"button\" @click=\"back()\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M15 18L9 12L15 6\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n        </div>\n        <h4>My files</h4>\n        <message-list :errors=\"productService.errors\" :all=\"true\"></message-list>\n        <input class=\"search\" type=\"text\" v-model=\"search\" @keydown.enter.prevent=\"filter(1)\">\n        <div class=\"spacing-none scrollbar inset-section\" style=\"max-height: 485px; overflow-y: auto;\">\n            <template v-for=\"(item, $index) in user_files.items\">\n                <div class=\"flex-left no-wrap full-width stretch space-between spacing-sm inset-item inset-hover\">\n                    <button type=\"button\" class=\"btn-clear flex-left-center no-wrap spacing-sm full-width btn-square-sm\" @click=\"selectUserFile(item)\">\n                        <div class=\"card background no-overflow flex-full-center no-shrink\" style=\"width: 80px; height: 80px; padding: 4px\">\n                            <img :src=\"item.raster\" :alt=\"item.name\" class=\"full-width full-height\"/>\n                        </div>\n                        <span class=\"align-left full-width text-wrap text-sm\">{{ item.name }}</span>\n                    </button>\n                    <button type=\"button\" class=\"btn-icon no-shrink flex-full-center\" @click.prevent=\"removeUserFile(item)\">\n                        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                            <path d=\"M17 7L7 17M7 7L17 17\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                        </svg>\n                    </button>\n                </div>\n                <hr class=\"padding-none\" v-if=\"$index != user_files.items.length - 1\">\n            </template>\n        </div>\n    </div>\n    <div class=\"flex-center full-width\">\n        <callback-paginator :total=\"user_files.totalCount\" :limit=\"limit\" v-model:page=\"page\" :small=\"true\" :callback=\"filter\"></callback-paginator>\n    </div>\n</div>\n`;","import VueComponent, {method, prop} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './SelectTemplate.html';\nimport CustomService from '../../../services/CustomService';\n\nclass SelectTemplateController extends VueComponent {\n    @prop({\n        emit: true\n    })\n    step: number;\n\n    @prop()\n    productService: CustomService;\n\n    @method()\n    back() {\n        this.step = this.step - 1;\n    }\n\n    @method()\n    selectTemplate(template) {\n        this.productService.useDesign(template);\n    }\n}\n\nexport default function SelectTemplate(): IVueComponent {\n    return {\n        controller: SelectTemplateController,\n        tag: 'setup-select-template',\n        template: html,\n    }\n}","export const html:string = `\n<div class=\"flex-left column spacing-xl no-wrap space-between full-width full-height\">\n    <div class=\"flex-left column spacing-sm stretch no-wrap full-width\">\n        <div class=\"flex-left\">\n            <button class=\"btn-icon\" type=\"button\" @click=\"back()\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M15 18L9 12L15 6\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n        </div>\n        <h4>Select template</h4>\n        <div class=\"grid\">\n            <div class=\"xs-6 card padded-card-xs shadow-sm flex-center space-between column\" v-for=\"template in productService.similar_templates.items\">\n                <img :src=\"template.thumbnail_url\" :alt=\"template.name\">\n                <div class=\"flex-center column full-width align-center\">\n                    <span class=\"text-sm\">{{ template.name }}</span>\n                    <button type=\"button\" class=\"btn-base btn-secondary-action full-width\" @click=\"selectTemplate(template)\">Use design</button>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n`;","import VueComponent, {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport CustomService from '../../../services/CustomService';\nimport {Services} from '../../../../../core/services/Services';\nimport CustomAutosave from '../../../models/CustomAutosave';\nimport APIResponse from '../../../../../core/models/APIResponse';\nimport {html} from './SelectAutosave.html';\nimport * as url from 'url';\n\n\nclass SelectAutosaveController extends VueComponent {\n\n    @prop({\n        emit: true\n    })\n    step: number;\n\n    @prop()\n    productService: CustomService;\n\n    @data()\n    autosaves: APIResponse<CustomAutosave>;\n\n    @data()\n    limit: number = 16;\n\n    @data()\n    page: number = 1;\n\n    constructor(component) {\n        super(component);\n        this.filter();\n    }\n\n    @method()\n    back() {\n        this.step = this.step - 1;\n    }\n\n    @method()\n    filter() {\n        this.autosaves = Services.get<typeof CustomAutosave>('CustomAutosave').objects.filter({\n            template: this.productService.base.id,\n            no_data: true,\n            limit: this.limit,\n            offset: this.limit * (this.page - 1),\n        });\n    }\n\n    @method()\n    selectAutosave(autosave: CustomAutosave) {\n        this.productService.page_change_params = {\n            load_save: autosave.id\n        }\n        let url = new URL(window.location.origin + this.productService.base.tool_url);\n        url.searchParams.set('load_save', `${autosave.id}`);\n        window.location.href = url.toString();\n    }\n\n    @method()\n    removeAutosave(autosave: CustomAutosave) {\n        this.autosaves.items.removeItemFromID(autosave.id);\n        autosave.delete();\n    }\n}\n\nexport default function SelectAutosave(): IVueComponent {\n    return {\n        template: html,\n        controller: SelectAutosaveController,\n        tag: 'setup-select-autosave'\n    }\n}","export const html: string = `\n<div class=\"flex-left column spacing-md no-wrap space-between full-width full-height\">\n    <div class=\"flex-left column spacing-sm stretch no-wrap full-width\">\n        <div class=\"flex-left\">\n            <button class=\"btn-icon\" type=\"button\" @click=\"back()\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M15 18L9 12L15 6\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n        </div>\n        \n        <h4>Saved designs</h4>   \n        <message-list :errors=\"productService.errors\" :all=\"true\"></message-list>\n        <div class=\"spacing-none scrollbar inset-section\" style=\"max-height: 485px; overflow-y: auto;\">\n            <template v-for=\"(item, $index) in autosaves.items\">\n                <div class=\"flex-left no-wrap full-width stretch space-between spacing-sm inset-item inset-hover\">\n                    <button type=\"button\" class=\"btn-clear flex-left-center no-wrap spacing-sm full-width btn-square-sm\" @click=\"selectAutosave(item)\">\n                        <div class=\"card background no-overflow flex-full-center no-shrink\" style=\"width: 80px; height: 80px; padding: 4px\">\n                            <img :src=\"item.preview\" :alt=\"item.name\" class=\"full-width full-height\"/>\n                        </div>\n                        <span class=\"align-left full-width text-wrap text-sm\">{{ item.name || $filters.date(item.created) }}</span>\n                    </button>\n                    <button type=\"button\" class=\"btn-icon no-shrink flex-full-center\" @click.prevent=\"removeAutosave(item)\">\n                        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                            <path d=\"M17 7L7 17M7 7L17 17\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                        </svg>\n                    </button>\n                </div>\n                <hr class=\"padding-none\" v-if=\"$index != autosaves.items.length - 1\">\n            </template>\n        </div>\n    </div>\n    <div class=\"flex-center full-width\">\n        <callback-paginator :total=\"autosaves.totalCount\" :limit=\"limit\" v-model:page=\"page\" :small=\"true\" :callback=\"filter\"></callback-paginator>\n    </div> \n</div>\n`;","\n\n/*\n    Only components that are used on the setup page\n */\nimport VueApp from '../../../../core/adapters/VueApp';\nimport SelectDesign from './SelectDesign/SelectDesign';\nimport UploadFile from './UploadFile/UploadFile';\nimport Price from '../../../products_shared/components/Price/Price';\nimport QuantityBreaks from '../../../products_shared/components/QuantityBreaks/QuantityBreaks';\nimport SelectFile from './SelectFile/SelectFile';\nimport SelectTemplate from './SelectTemplate/SelectTemplate';\nimport SelectAutosave from './SelectAutosave/SelectAutosave';\nimport ProductProductionTime from '../../../delivery/components/ProductProductionTime/ProductProductionTime';\nimport TemplateSetupOptionsShapes from '../TemplateSetupOptionsShapes/TemplateSetupOptionsShapes';\n\nexport default function registerComponents(vue_app: VueApp) {\n    vue_app.registerComponent(SelectDesign);\n    vue_app.registerComponent(UploadFile);\n    vue_app.registerComponent(Price);\n    vue_app.registerComponent(QuantityBreaks);\n    vue_app.registerComponent(SelectFile);\n    vue_app.registerComponent(SelectTemplate);\n    vue_app.registerComponent(SelectAutosave);\n    vue_app.registerComponent(ProductProductionTime);\n    vue_app.registerComponent(TemplateSetupOptionsShapes);\n}","import {DisplayTypeEnum} from '../../models/enums';\nimport {TemplateOptionChargeOption} from '../../models/TemplateOption';\n\nexport const html:string = `\n\n<div class=\"input-group\" v-for=\"custom_option in filteredOptions(${DisplayTypeEnum.FIXED_VALUE})\">\n    <label>{{ custom_option.option_set.name }}</label>\n    <message-list :errors=\"errors\" field=\"hidden\">\n        <div class=\"flex-left-center spacing-sm\">\n            {{ custom_option.option.name }}\n            <span v-if=\"custom_option.option && custom_option.option.charge_option == ${TemplateOptionChargeOption.CHARGE_PERCENTAGE} && !hidePrice(custom_option)\">\n                ({{ custom_option.option.percent > 0 ? '+' + $filters.shortNumber(custom_option.option.percent) + '%' : 'included' }})\n            </span>\n            <span v-if=\"custom_option.option && custom_option.option.charge_option == ${TemplateOptionChargeOption.CHARGE_TOTAL} && !hidePrice(custom_option)\">\n                ({{ custom_option.option.amount > 0 ? '+' + $filters.currency(custom_option.option.amount, productService.configured.currency) : 'included' }})\n            </span>\n            <span v-if=\"custom_option.option && custom_option.option.charge_option == ${TemplateOptionChargeOption.CHARGE_UNIT} && !hidePrice(custom_option)\">\n                ({{ custom_option.option.amount > 0 ? '+' + $filters.currency(custom_option.option.display_value(productService.show_retail), productService.configured.currency) + ' each' : 'included' }})\n            </span>\n        </div>\n    </message-list>\n</div>\n\n<div class=\"input-group\" v-if=\"productService.base.option_laminate && productService.configured.material?.can_laminate\">\n    <fieldset class=\"input-group single-option\">\n        <legend>Lamination</legend>\n        <div class=\"toggle-group\">\n            <label :for=\"'lamination-' + item.id\" v-for=\"item in lamination_options\">\n                <input :id=\"'lamination-' + item.id\" :value=\"item.id\" name=\"lamination\" type=\"radio\" v-model=\"productService.configured.option_laminate\">\n                {{ item.label }}\n            </label>\n        </div>\n    </fieldset>\n</div>\n\n<div class=\"input-group\" v-if=\"reverseCut && productService.base.option_reverse_cut\">\n    <fieldset class=\"input-group single-option\">\n        <legend>Invert Design</legend>\n        <div class=\"toggle-group\">\n            <label for=\"invert-no\">\n                <input id=\"invert-no\" :value=\"false\" name=\"invert\" type=\"radio\" v-model=\"productService.configured.option_reverse_cut\">\n                No\n            </label>\n            <label for=\"invert-yes\">\n                <input id=\"invert-yes\" :value=\"true\" name=\"invert\" type=\"radio\" v-model=\"productService.configured.option_reverse_cut\">\n                Yes\n            </label>\n        </div>\n    </fieldset>\n</div>\n\n<div class=\"input-group\" v-if=\"productService.base.option_border && !productService.base.offset_path_uses_material_color\">\n\n    <fieldset class=\"input-group single-option\">\n        <legend>Add Border</legend>\n        <div class=\"toggle-group\">\n            <label for=\"border-no\">\n                <input id=\"invert-no\" :value=\"false\" name=\"border\" type=\"radio\" v-model=\"productService.configured.option_border\">\n                No\n            </label>\n            <label for=\"border-yes\">\n                <input id=\"invert-yes\" :value=\"true\" name=\"border\" type=\"radio\" v-model=\"productService.configured.option_border\">\n                Yes\n            </label>\n        </div>\n    </fieldset>\n</div>\n\n\n<div class=\"input-group\" v-for=\"custom_option in filteredOptions(${DisplayTypeEnum.TOGGLE_BUTTON})\">\n    <label>{{ custom_option.option_set.name }}</label>\n    <message-list :errors=\"errors\" field=\"hidden\">\n        <div class=\"flex-left-center spacing-sm\">\n            <input type=\"checkbox\" class=\"input-toggle\" :checked=\"optionChecked(custom_option)\" v-model=\"custom_option.toggle_value\" @change=\"toggleSingleOption(custom_option, custom_option.toggle_value)\">\n            {{ custom_option.option_set.short_description }}\n            \n            <span v-if=\"togglePriceOption(custom_option) && togglePriceOption(custom_option).charge_option == ${TemplateOptionChargeOption.CHARGE_PERCENTAGE} && !hidePrice(custom_option)\">\n                ({{ togglePriceOption(custom_option).percent > 0 ? '+' + $filters.shortNumber(togglePriceOption(custom_option).percent) + '%' : '(included)' }})\n            </span>\n            <span v-if=\"togglePriceOption(custom_option) && togglePriceOption(custom_option).charge_option == ${TemplateOptionChargeOption.CHARGE_TOTAL} && !hidePrice(custom_option)\">\n                ({{ togglePriceOption(custom_option).amount > 0 ? '+' + $filters.currency(togglePriceOption(custom_option).amount, productService.configured.currency) : '(included)' }})\n            </span>\n            <span v-if=\"togglePriceOption(custom_option) && togglePriceOption(custom_option).charge_option == ${TemplateOptionChargeOption.CHARGE_UNIT} && !hidePrice(custom_option)\">\n                ({{ togglePriceOption(custom_option).amount > 0 ? '+' + $filters.currency(togglePriceOption(custom_option).display_value(productService.show_retail), productService.configured.currency) + ' each' : '(included)' }})\n            </span>\n        </div>\n    </message-list>\n</div>\n\n<div class=\"input-group\" v-for=\"custom_option in filteredOptions(${DisplayTypeEnum.RADIO})\">\n    <fieldset class=\"input-group single-option\">\n        <legend>{{ custom_option.option_set.name }}</legend>\n        <div class=\"text-xs\" v-if=\"custom_option.option_set.short_description\">{{ custom_option.option_set.short_description }}</div>\n        <message-list field=\"option\" :errors=\"custom_option.errors\">\n            <div class=\"toggle-group\">\n                <label :for=\"idForOptionSet(custom_option, item)\" v-for=\"item in filteredOptionItems(custom_option)\" class=\"flex-full-center column no-wrap spacing-none\">\n                    <div v-html=\"item.icon\" v-if=\"item.icon\"></div>\n                    <input :id=\"idForOptionSet(custom_option, item)\" :value=\"item.id\" :name=\"custom_option.option_set.name\" type=\"radio\" v-model=\"custom_option.option_id\" :disabled=\"!custom_option.option_set.optionEligible(productService.configured.width, productService.configured.height) || custom_option.isDisabled(productService.configured.material)\">\n                    {{ item.name }}\n                    \n                    <span class=\"text-sm\" v-if=\"item.charge_option == ${TemplateOptionChargeOption.CHARGE_PERCENTAGE} && !hidePrice(custom_option)\">\n                        {{ item.percent > 0 ? '+' + $filters.shortNumber(item.percent) + '%' : '(included)' }}\n                    </span>\n                    <span class=\"text-sm\" v-if=\"item.charge_option == ${TemplateOptionChargeOption.CHARGE_TOTAL} && !hidePrice(custom_option)\">\n                        {{ item.amount > 0 ? '+' + $filters.currency(item.amount, productService.configured.currency) : '(included)' }}\n                    </span>\n                    <span class=\"text-sm\" v-if=\"item.charge_option == ${TemplateOptionChargeOption.CHARGE_UNIT} && !hidePrice(custom_option)\">\n                        {{ item.amount > 0 ? '+' + $filters.currency(item.display_value(productService.show_retail), productService.configured.currency) + ' each' : '(included)' }}\n                    </span>\n                </label>\n            </div>\n        </message-list>\n        <div class=\"flex-left no-wrap full-width\" :class=\"custom_option.option && custom_option.option.help_text ? 'space-between' : ''\">\n            <div class=\"text-sm\" v-if=\"custom_option.option && custom_option.option.help_text\">{{ custom_option.option.help_text }}</div>\n        </div>\n    </fieldset>\n</div>\n\n<div class=\"input-group\" v-for=\"custom_option in filteredOptions(${DisplayTypeEnum.DROPDOWN})\">\n    <label>{{ custom_option.option_set.name }}</label>\n    <message-list field=\"option\" :errors=\"custom_option.errors\">\n        <generic-dropdown \n            v-if=\"!readOnly\" \n            :items=\"filteredOptionItems(custom_option)\" \n            v-model:selected=\"custom_option.option\" \n            :name-function=\"getOptionItemNameCallback(productService, custom_option.option_set)\" \n            :disabled=\"!custom_option.option_set.optionEligible(productService.configured.width, productService.configured.height) || custom_option.isDisabled(productService.configured.material)\">\n        </generic-dropdown>\n        <span v-if=\"readOnly\">{{ getOptionItemName(productService, custom_option.option_set, custom_option.option) }}</span>\n    </message-list>\n</div>\n\n<fieldset class=\"input-group\" v-for=\"custom_option in filteredOptions(${DisplayTypeEnum.INCREMENTAL_OPTION})\">\n    <legend>{{ custom_option.option_set.name }}</legend>\n    <message-list field=\"option\" :errors=\"custom_option.errors\">\n        <div class=\"flex-left-center no-wrap full-width\">\n            <div class=\"toggle-group grow\">\n                <button type=\"button\" @click=\"lastOption(custom_option)\" :disabled=\"firstOptionSelected(custom_option)\">\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path d=\"M4.16667 10H15.8333\" stroke=\"#98A2B3\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                    </svg>\n                </button>\n                <span class=\"option-value\">{{ custom_option.option.name }}</span>\n                <button type=\"button\" @click=\"nextOption(custom_option)\" :disabled=\"lastOptionSelected(custom_option)\">\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path d=\"M10 4.16675V15.8334M4.16667 10.0001H15.8333\" stroke=\"#98A2B3\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                    </svg>\n                </button>\n            </div>\n            <span class=\"no-shrink\" v-if=\"custom_option.option && custom_option.option.charge_option == ${TemplateOptionChargeOption.CHARGE_PERCENTAGE} && !hidePrice(custom_option)\">\n                {{ custom_option.option.percent > 0 ? '+' + $filters.shortNumber(custom_option.option.percent) + '%' : '(included)' }}\n            </span>\n            <span class=\"no-shrink\" v-if=\"custom_option.option && custom_option.option.charge_option == ${TemplateOptionChargeOption.CHARGE_TOTAL} && !hidePrice(custom_option)\">\n                {{ custom_option.option.amount > 0 ? '+' + $filters.currency(custom_option.option.amount, productService.configured.currency) : '(included)' }}\n            </span>\n            <span class=\"no-shrink\" v-if=\"custom_option.option && custom_option.option.charge_option == ${TemplateOptionChargeOption.CHARGE_UNIT} && !hidePrice(custom_option)\">\n                {{ custom_option.option.amount > 0 ? '+' + $filters.currency(custom_option.option.display_value(productService.show_retail), productService.configured.currency) + ' each' : '(included)' }}\n            </span>\n        </div>\n    </message-list>\n</fieldset>\n`;","import {html} from './Options.html';\nimport VueComponent, {computed, data, method, prop} from '../../../../core/adapters/VueComponent';\nimport {TemplateOptionSet} from '../../models/TemplateOptionSet';\nimport {CustomOption} from '../../models/CustomOption';\nimport {TemplateOption, TemplateOptionChargeOption} from '../../models/TemplateOption';\nimport VueApp from '../../../../core/adapters/VueApp';\nimport ConfiguredProductServiceAbstract from '../../../products_shared/services/ConfiguredProductServiceAbstract';\nimport {CustomLamination, DisplayTypeEnum} from '../../models/enums';\n\nexport class TemplateFinalizeOptionsController extends VueComponent {\n    @data()\n    infoTitle;\n\n    @data()\n    showInfoBool;\n\n    @data()\n    optionItemNameCallback;\n\n    @data()\n    show_border_description: boolean;\n\n    @data()\n    show_lamination_description: boolean;\n\n    @prop()\n    productService: ConfiguredProductServiceAbstract;\n\n    @prop()\n    priceQuote;\n\n    @prop()\n    readOnly;\n\n    @prop()\n    hideRetailPackaging: boolean;\n\n    @prop()\n    reverseCut: boolean;\n\n    @data()\n    lamination_options = [];\n\n    override beforeMount() {\n        super.beforeMount()\n\n        this.lamination_options = this.productService.configured.laminationOptions;\n        if (this.productService.configured.option_laminate == CustomLamination.NONE) {\n            this.lamination_options.push({\n                label: 'None',\n                id: CustomLamination.NONE\n            })\n        }\n    }\n\n    @method()\n    getOptionName(templateOptionSet, index, customService){\n        if (customService.custom.options && customService.custom.options[index] && customService.custom.options[index].option) {\n            if (customService.custom.options[index].option.name == undefined) {\n                customService.custom.options[index].option = templateOptionSet.options[0];\n            }\n\n            return templateOptionSet.name;\n        }\n\n        return null;\n    }\n\n    @method()\n    getOptionItemNameCallback(customService, option_set: TemplateOptionSet) {\n        // Curry the custom service object because we won't have access to it in the dropdown\n        return (item) => {\n            return this.getOptionItemName(customService, option_set, item);\n        }\n    }\n\n    @method()\n    getOptionItemName(customService, option_set: TemplateOptionSet, item: TemplateOption) {\n        if (item) {\n            if (item.charge_option == TemplateOptionChargeOption.CHARGE_PERCENTAGE && item.percent == 0) {\n                return item.name;\n            }\n            if (item.charge_option != TemplateOptionChargeOption.CHARGE_PERCENTAGE && item.amount == 0) {\n                return item.name;\n            }\n\n            if (item.charge_option === TemplateOptionChargeOption.CHARGE_UNIT) {\n                let formatted = VueApp.GLOBAL_FILTERS.currency(item.display_value(customService.show_retail, option_set.quantityBreakIndex(customService.quantity)), this.productService.configured.currency);\n                return item.name + \"   (+\" + formatted + \" each)\";\n            }\n            else if (item.charge_option === TemplateOptionChargeOption.CHARGE_TOTAL) {\n                let formatted = VueApp.GLOBAL_FILTERS.currency(item.display_value(customService.show_retail, option_set.quantityBreakIndex(customService.quantity)), this.productService.configured.currency);\n                return item.name + \"   (+\" + formatted + \")\";\n            }\n            else if (item.charge_option === TemplateOptionChargeOption.CHARGE_PERCENTAGE){\n                return item.name + \"   (+\" +  Number(item.display_value(true, option_set.quantityBreakIndex(customService.quantity))).toString() + \"%)\";\n            }\n        }\n\n        return item.name\n    }\n\n    @computed()\n    hasOptions() {\n        let laminate = this.productService.base['option_laminate'] && this.productService.configured.material.can_laminate;\n        let border = this.productService.base['option_border'];\n        let options = this.productService.configured.options.length > 0;\n\n        return laminate || border || options;\n    }\n\n    @method()\n    idForOptionSet(custom_option, item) {\n        return `${custom_option.option_set.name}-${item.id}`.toLowerCase().split(' ').join('-')\n    }\n\n    @method()\n    toggleOption(custom_option: CustomOption, item: TemplateOption) {\n        if (custom_option.option == item) {\n            custom_option.option = null;\n        }\n        else {\n            custom_option.option = item;\n        }\n\n        custom_option.errors.reset();\n    }\n\n    @method()\n    filteredOptions(type: DisplayTypeEnum) {\n        return this.productService.configured.options.filter(v =>\n            v.option_set.display_type == type &&\n            !v.isDisabled(this.productService.configured.material) &&\n            v.option_set.optionEligible(this.productService.configured.width, this.productService.configured.height) &&\n            v.option_set.options.length > 0 &&\n            v.option_set.sizeIsValid(this.productService.width, this.productService.height, true)\n        );\n    }\n\n    @method()\n    filteredOptionItems(option_set: CustomOption) {\n        return option_set.option_set.options.filter(v => v.sizeIsValid(this.productService.width, this.productService.height, true));\n    }\n\n    @method()\n    optionChecked(custom_option: CustomOption) {\n        return custom_option.option.option_value == 'true'\n    }\n\n    @method()\n    toggleSingleOption(custom_option: CustomOption, value: boolean) {\n        custom_option.option = custom_option.option_set.options.find(v => v.option_value == (value ? 'true' : 'false'));\n    }\n\n    @method()\n    hidePrice(custom_option: CustomOption) {\n        return custom_option.option_set.options.find(v => {\n            if (v.charge_option == TemplateOptionChargeOption.CHARGE_PERCENTAGE) {\n                return v.percent > 0;\n            }\n            else {\n                return v.amount > 0\n            }\n        }) == null;\n    }\n\n    @method()\n    togglePriceOption(custom_option: CustomOption) {\n         return custom_option.option_set.options.find(v => v.option_value == 'true');\n    }\n\n    @method()\n    lastOption(custom_option: CustomOption) {\n        if (this.firstOptionSelected(custom_option)) {\n            return;\n        }\n\n        custom_option.option = custom_option.option_set.options[custom_option.option_set.options.indexOf(custom_option.option) - 1];\n    }\n\n    @method()\n    nextOption(custom_option: CustomOption) {\n        if (this.lastOptionSelected(custom_option)) {\n            return;\n        }\n\n        custom_option.option = custom_option.option_set.options[custom_option.option_set.options.indexOf(custom_option.option) + 1];\n    }\n\n    @method()\n    firstOptionSelected(custom_option: CustomOption) {\n        return custom_option.option_set.options.indexOf(custom_option.option) == 0;\n    }\n\n    @method()\n    lastOptionSelected(custom_option: CustomOption) {\n        return custom_option.option_set.options.indexOf(custom_option.option) == custom_option.option_set.options.length - 1;\n    }\n}\n\nexport default function TemplateFinalizeOptions() {\n    return {\n        controller: TemplateFinalizeOptionsController,\n        template: html,\n        tag: 'template-finalize-options'\n    }\n}\n","import {ClipTypeEnum} from '../../models/enums';\n\nexport const html:string = `\n<fieldset class=\"input-group single-option\" v-if=\"templateShapes().length > 1\">\n    <legend>Select Shape</legend>\n    <div class=\"toggle-items grid spacing-sm\">\n        <label :for=\"'shape-' + shape.id\" v-for=\"shape in $filters.orderBy(templateShapes(), 'order')\" class=\"flex-full-center column spacing-xs xs-3\">\n            <input :id=\"'shape-' + shape.id\" :value=\"shape\" :checked=\"isShapeSelected(shape)\" @change=\"setNewShape(shape)\" name=\"shape-selection\" type=\"radio\"/>\n            <span class=\"contents\" v-if=\"shape.icon\" v-html=\"shape.icon\"></span>\n            {{ shape.name }}\n        </label>\n    </div>\n</fieldset>\n<div class=\"input-group\" v-for=\"shape in customShapes().filter(v => v.template_shape.clip_type == ${ClipTypeEnum.ROUNDED_CORNER})\" :key=\"shape.template_shape.id\">\n    <label>Roundness</label>\n    <fieldset class=\"input-group single-option\">\n        <div class=\"toggle-group\">\n            <button @click.prevent=\"scaleRoundness(shape, -1)\" class=\"icon-option\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M5 12H19\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n            <button @click.prevent=\"scaleRoundness(shape, 1)\" class=\"icon-option\">\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M9.99999 4.16663V15.8333M4.16666 9.99996H15.8333\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n        </div>\n    </fieldset>\n</div>\n<template v-if=\"templateShapes().length > 1 && showSize\">\n    <div class=\"flex-left spacing-xs full-width\">\n        <div class=\"text-sm full-width\">Width & Height</div>\n        <message-list :errors=\"productService.errors\" field=\"size,max_size,width,height,max_sqin\">\n            <div class=\"flex-left no-wrap wrap-xs spacing-md size-group space-between full-width\">\n                <div class=\"flex-left spacing-sm no-wrap wrap-xxs\">\n                    <div class=\"input-group inline-label\">\n                        <label aria-label=\"Width\" for=\"width\">W</label>\n                        <input :disabled=\"!productService.allow_custom_sizes\"\n                               type=\"number\"\n                               class=\"form-control\"\n                               id=\"width\"\n                               aria-label=\"Width\"\n                               min=\"0\"\n                               step=\"0.01\"\n                               placeholder=\"Width\"\n                               v-model=\"productService.unit_width\"\n                               @change=\"productService.revalidateOnError()\">\n                    </div>\n                    <div class=\"input-group inline-label\">\n                        <label aria-label=\"Height\" for=\"height\">H</label>\n                        <input :disabled=\"!productService.allow_custom_sizes\"\n                               type=\"number\"\n                               class=\"form-control\"\n                               id=\"height\"\n                               aria-label=\"Height\"\n                               min=\"0\"\n                               step=\"0.01\"\n                               placeholder=\"Height\"\n                               v-model=\"productService.unit_height\"\n                               @change=\"productService.revalidateOnError()\">\n                    </div>\n                    \n                    <button v-tooltip :tooltip-content=\"productService.proportions_ratio == null ? 'Lock Size Ratio' : 'Unlock Size Ratio'\"\n                            type=\"button\"\n                            aria-label=\"Lock Size Ratio\"\n                            class=\"btn-base btn-secondary-action\"\n                            @click=\"productService.toggleLockedProportions()\"\n                            :class=\"{'disabled': !productService.allow_custom_sizes }\">\n\n                            <span v-if=\"!productService.proportionsLocked()\">\n                                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                    <path d=\"M7 11V7C7 4.2 9.2 2 12 2C14.8 2 15.8 3.2 16.6 5M12 15.5V17.5M8.8 22H15.2C16.9 22 17.7 22 18.4 21.7C19 21.4 19.4 21 19.7 20.4C20 19.8 20 18.9 20 17.2V15.8C20 14.1 20 13.3 19.7 12.6C19.4 12 19 11.6 18.4 11.3C17.8 11 16.9 11 15.2 11H8.8C7.1 11 6.3 11 5.6 11.3C5 11.6 4.6 12 4.3 12.6C4 13.2 4 14.1 4 15.8V17.2C4 18.9 4 19.7 4.3 20.4C4.6 21 5 21.4 5.6 21.7C6.2 22 7.1 22 8.8 22Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                </svg>\n                            </span>\n                            <span v-if=\"productService.proportionsLocked()\" v-cloak>\n                                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                    <path d=\"M17 11V9C17 6.23858 14.7614 4 12 4C9.23858 4 7 6.23858 7 9V11M12 15.5V17.5M8.8 22H15.2C16.8802 22 17.7202 22 18.362 21.673C18.9265 21.3854 19.3854 20.9265 19.673 20.362C20 19.7202 20 18.8802 20 17.2V15.8C20 14.1198 20 13.2798 19.673 12.638C19.3854 12.0735 18.9265 11.6146 18.362 11.327C17.7202 11 16.8802 11 15.2 11H8.8C7.11984 11 6.27976 11 5.63803 11.327C5.07354 11.6146 4.6146 12.0735 4.32698 12.638C4 13.2798 4 14.1198 4 15.8V17.2C4 18.8802 4 19.7202 4.32698 20.362C4.6146 20.9265 5.07354 21.3854 5.63803 21.673C6.27976 22 7.11984 22 8.8 22Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                </svg>\n                            </span>\n                    </button>\n                </div>\n            </div>\n        </message-list>\n    </div>\n</template>\n`;\n","import {html} from './TemplateSetupOptionsShapes.html';\nimport VueComponent, {computed, data, method, prop} from '../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../core/adapters/IVueComponent';\nimport {TemplateShape} from '../../models/TemplateShape';\nimport {Services} from '../../../../core/services/Services';\nimport {CustomShape} from '../../models/CustomShape';\nimport CustomEditorService from '../../services/CustomEditorService';\nimport PaperCanvasService from '../../services/PaperCanvasService';\nimport {ClipTypeEnum} from '../../models/enums';\nimport UserProfileService from \"../../../userprofile/services/UserProfileService\";\n\nexport class ShapesController extends VueComponent {\n\n    @prop()\n    productService: CustomEditorService;\n\n    @prop()\n    side: number;\n\n    @data()\n    ups: UserProfileService;\n\n    @prop()\n    showSize: boolean;\n\n    constructor(component) {\n        super(component);\n\n        this.ups = Services.get<UserProfileService>('UserProfileService');\n    }\n\n    @method()\n    setNewShape(shape: TemplateShape) {\n        if (this.productService.configured.custom_shapes.find(v => v.template_shape.id == shape.id)) {\n            return;\n        }\n\n        let to_remove = this.productService.configured.custom_shapes.find(v => v.template_shape.side?.id == shape.side?.id);\n        let index = this.productService.configured.custom_shapes.indexOf(to_remove);\n        this.productService.configured.custom_shapes.splice(index, 1);\n        to_remove.trigger('remove');\n\n\n        let custom_shape = new (Services.get<typeof CustomShape>('CustomShape'))();\n        custom_shape.template_shape = shape;\n        custom_shape.bindToConfigured(this.productService.configured);\n        custom_shape.loadDefaultsFromTemplate(to_remove.carryOverData());\n\n        this.productService.configured.custom_shapes.push(custom_shape);\n        this.productService.setupShapeElement(custom_shape);\n        this.productService.fitShape(custom_shape);\n        this.productService.checkSharedShapeSides(custom_shape);\n        this.productService.checkSharedShapeAttributes(custom_shape);\n\n        if (shape.clip_type == ClipTypeEnum.ROUNDED_CORNER) {\n            custom_shape.clip_radius = 7;\n        }\n\n        if (Services.isRegistered('PaperCanvasService')) {\n            Services.get<PaperCanvasService>('PaperCanvasService').trigger('sync');\n        }\n    }\n\n    defaultSideId() {\n        let lowest = null;\n        for (const item of this.productService.base.template_shapes) {\n            if (!item.side) {\n                continue;\n            }\n\n            if (!lowest) {\n                lowest = item.side;\n                continue;\n            }\n\n            if (lowest.side.order > item.side.order) {\n                lowest = item;\n            }\n        }\n        return lowest?.side?.id;\n    }\n\n    @method()\n    templateShapes() {\n        let selected_side = this.side;\n        if (this.side == 0) {\n            selected_side = undefined;\n        }\n        if (!selected_side) {\n            selected_side = this.defaultSideId();\n        }\n\n        return this.productService.base.template_shapes.filter(v => v.side?.id == selected_side);\n    }\n\n    @method()\n    customShapes() {\n        let selected_side = this.side;\n        if (this.side == 0) {\n            selected_side = undefined;\n        }\n        if (!selected_side) {\n            selected_side = this.defaultSideId();\n        }\n\n        if (!this.productService.configured.custom_shapes) {\n            return [];\n        }\n\n        return this.productService.configured.custom_shapes.filter(v => v.template_shape.side?.id == selected_side);\n    }\n\n    @method()\n    isShapeSelected(shape: TemplateShape) {\n        if (!this.productService.configured.custom_shapes) {\n            return false;\n        }\n\n        return this.productService.configured.custom_shapes.find(v => v.template_shape?.id == shape.id)\n    }\n\n    @method()\n    scaleRoundness(shape, amount) {\n        shape.clip_radius = Math.max(Math.min((shape.clip_radius || 7) + amount, 40), 1);\n    }\n}\n\nexport default function TemplateSetupOptionsShapes(): IVueComponent {\n    return {\n        controller: ShapesController,\n        template: html,\n        tag: 'template-setup-options-shapes'\n    }\n};\n","import VueComponent, {computed, data, method, prop} from '../../../../core/adapters/VueComponent';\nimport APIResponse from '../../../../core/models/APIResponse';\nimport {Clipart, EClipartColorChoiceEnum} from '../../models/Clipart';\nimport CustomEditorService from '../../services/CustomEditorService';\nimport Company from '../../../../core/services/Company';\nimport {Http} from '../../../../core/services/Http';\nimport {ClipartCategory} from '../../models/ClipartCategory';\nimport {ProductTypeEnum} from '../../models/enums';\nimport {ClipartCategoryGraphic} from '../../models/ClipartCategoryGraphic';\nimport IVueComponent from '../../../../core/adapters/IVueComponent';\nimport {html} from './AddClipartComponent.html';\nimport {Services} from '../../../../core/services/Services';\n\n\nclass AddClipartComponentController extends VueComponent {\n\n    @prop()\n    productService: CustomEditorService;\n\n    @prop()\n    activeTab: string;\n\n    @data()\n    company: Company;\n\n    @data()\n    search_query: string;\n\n    @data()\n    searched_query: string;\n\n    @data()\n    shape_categories: ClipartCategory[];\n\n    @data()\n    clipart: APIResponse<ClipartCategoryGraphic>;\n\n    @data()\n    limit: number;\n\n    @data()\n    page : number;\n\n    @data()\n    category: ClipartCategory;\n\n    @data()\n    category_breadcrumbs: any[];\n\n    @data()\n    page_change_callback;\n\n    @data()\n    searching: boolean;\n\n    @data()\n    filtered_categories: ClipartCategory[];\n\n    @data()\n    back_action: () => boolean;\n\n    constructor(component) {\n        super(component);\n\n        this.page_change_callback = this.paginationFunction.bind(this);\n\n        this.search_query = '';\n        this.searched_query = '';\n        this.shape_categories = [];\n        this.category_breadcrumbs = [];\n\n        this.productService.setup_complete.then(() => {\n            this.productService.clipart_categories.$promise.then(() => {\n                this.filterSubCategories();\n                for (const category of this.productService.clipart_categories.items) {\n                    if (category.shapes) {\n                        this.shape_categories.push(category);\n                    }\n                }\n            });\n        });\n\n        this.page = 1;\n        this.limit = 80;\n\n        this.clipart = null;\n        this.reset();\n\n        this.back_action = () => {\n            if (this.search_query) {\n                this.search_query = '';\n                this.search(1);\n                return true;\n            }\n\n            if (this.category_breadcrumbs.length == 0) {\n                return false;\n            }\n\n            this.category_breadcrumbs.pop();\n            this.selectCategory(this.category_breadcrumbs.length == 0 ? null : this.category_breadcrumbs[this.category_breadcrumbs.length - 1]);\n            return true;\n        }\n    }\n\n    @method()\n    search(page?): void {\n        this.page = page || this.page || 1;\n        this.limit = this.limit || 20;\n        this.search_query = this.search_query || '';\n        this.searched_query = this.search_query;\n        this.searching = true;\n\n        const q = {\n            query: this.search_query,\n            limit: this.limit,\n            offset: this.limit * (this.page - 1)\n        };\n\n        if (this.category) {\n            q['search_category'] = this.category.id;\n        }\n\n        if (this.productService.base.type === ProductTypeEnum.CUTOUT) {\n            q['colors'] = EClipartColorChoiceEnum.SINGLE_COLOR;\n        }\n\n        q['show_licensed'] = this.productService.configured.marketplace_elements.length == 0;\n\n        if (window.location.href.indexOf('/dashboard/') != -1) {\n            q['show_licensed'] = false;\n        }\n\n        this.clipart = null;\n        Services.get<Http>('$http').request({\n            url: '/custom/api/v1/clipart-category-graphic-search/',\n            method: 'GET',\n            params: q\n        }).then((response) => {\n            this.clipart = Services.get<typeof ClipartCategoryGraphic>('ClipartCategoryGraphic').objects.from(response.data.data);\n            this.searching = false;\n        }, (err) => {\n            this.searching = false;\n            return err;\n        });\n    }\n\n    @method()\n    addClipart(clipart): void {\n        if (clipart.graphic.resource_uri.indexOf('/marketplace/api/v1/artwork/') != -1) {\n            this.productService.createMarketplaceElement({\n                name: clipart.name,\n                artwork: clipart.graphic,\n                selectable: true,\n                maintain_proportion: true\n            });\n        }\n        else {\n            this.productService.createClipartElement({\n                name: clipart.name,\n                clipart: clipart.graphic,\n                selectable: true,\n                maintain_proportion: true\n            });\n        }\n    }\n\n    @method()\n    reset() {\n        this.search_query = '';\n        this.searched_query = '';\n        this.clipart = null;\n        this.category = null;\n        this.page = 1;\n    }\n\n    paginationFunction(page){\n        this.page = page;\n        this.search();\n        this.updateCategoryBreadcrumbs();\n    }\n\n    @method()\n    onCategoryChange() {\n        this.updateCategoryBreadcrumbs();\n        this.filterSubCategories();\n        if (this.filtered_categories.length == 0) {\n            this.search();\n        }\n    }\n\n    @method()\n    selectCategory(category) {\n        this.category = category;\n        this.page = 1;\n\n        this.onCategoryChange();\n    }\n\n    @method()\n    removeCategory() {\n        this.category = null;\n        this.search();\n        this.updateCategoryBreadcrumbs();\n    }\n\n    public updateCategoryBreadcrumbs() {\n        this.category_breadcrumbs = [];\n\n        if (!this.category) {\n            return;\n        }\n\n        let current_category = this.category;\n        while (current_category && current_category.parent != null) {\n            this.category_breadcrumbs.push(current_category);\n\n            current_category = this.productService.clipart_categories.items.getItemFromURI(current_category.parent);\n\n            if (this.category_breadcrumbs.indexOf(current_category) != -1) {\n                this.category_breadcrumbs.reverse();\n                return;\n            }\n        }\n\n        this.category_breadcrumbs.push(current_category);\n        this.category_breadcrumbs.reverse();\n    }\n\n    @method()\n    filterSubCategories() {\n        let items = [];\n        let uri_check = null;\n\n        if (!this.productService.clipart_categories) {\n            this.filtered_categories = items;\n        }\n\n        if (this.category) {\n            uri_check = this.category.buildResourceURI();\n        }\n\n        for (const item of this.productService.clipart_categories.items) {\n            if (item.parent == uri_check) {\n                items.push(item);\n            }\n        }\n\n        this.filtered_categories = items.filter(v => !!v.image);\n    }\n}\n\nexport default function AddClipartComponent(): IVueComponent {\n\n    return {\n        controller: AddClipartComponentController,\n        template: html,\n        tag: 'add-clipart-component'\n    };\n}\n","export const html:string = `\n<tool-navigation :active-tab=\"activeTab\" :action=\"back_action\"></tool-navigation>\n\n<div class=\"input-group\">\n    <label>Search designs</label>\n    <input type=\"text\" class=\"search\" v-model=\"search_query\" @keydown.enter=\"search()\" :disabled=\"searching\"/>\n</div>\n\n<h4 v-if=\"search_query && clipart && clipart.$resolved && clipart.items.length == 0\" class=\"results\">No Results for \"{{ searched_query }}\"</h4>\n\n<div class=\"col-xs-12 col-full clipart-search-breadcrumbs\" v-show=\"category_breadcrumbs.length > 0\">\n    <span><a @click=\"selectCategory(null)\">All Categories</a></span>\n    <span v-for=\"item in category_breadcrumbs\"> &gt; <a @click=\"selectCategory(item)\">{{ item.name }}</a></span>\n</div>\n\n<div class=\"flex-left column spacing-sm full-width stretch\" v-show=\"shape_categories.length > 0 && searched_query == '' && category == null\">\n    <h3>Designs</h3>\n    <ul class=\"item-list\">\n        <li v-for=\"shape_category in $filters.orderBy(shape_categories, 'name')\" @click=\"selectCategory(shape_category)\" class=\"col-xs-6 col-sm-4 clipart-preview category-preview\">\n            <a>\n                <div class=\"img-wrapper smaller-wrapper\">\n                    <img class=\"clipart-art\" :src=\"shape_category.image\"/>\n                </div>\n            </a>\n            <div class=\"clipart-name\">{{ categoryshape_category }}</div>\n        </li>\n   </ul>\n</div>\n<div class=\"flex-left column spacing-sm full-width stretch\" v-if=\"filtered_categories\" v-show=\"filtered_categories.length > 0 && searched_query == ''\">\n    <h3>Categories</h3>\n    <div class=\"flex-left column spacing-none full-width no-wrap stretch\">\n        <template v-for=\"(category, $index) in $filters.orderBy(filtered_categories, 'name')\" :key=\"category.id\">\n            <button class=\"btn-clear flex-left-center spacing-sm full-width align-left wrap inset-section inset-hover\" @click=\"selectCategory(category, $event)\">\n                <div class=\"card background no-overflow flex-full-center no-wrap no-shrink\" style=\"width: 54px; height: 54px; padding: 4px\">\n                    <img :src=\"category.image\" width=\"54px\" height=\"54px\" :alt=\"category.name\">\n                </div>\n                <span>{{ category.name }}</span>\n            </button>\n            <hr class=\"padding-none\" v-if=\"$index != filtered_categories.length - 1\">\n        </template>\n    </div>\n    \n</div>\n<div class=\"flex-left column spacing-sm full-width stretch\" v-if=\"filtered_categories\" v-show=\"!searching && (filtered_categories.length == 0 || searched_query != '') && clipart && clipart.items.length != 0\">\n    <h3>Clipart</h3>\n    \n    <div class=\"grid\" v-if=\"clipart\">\n        <button class=\"btn-abstract xs-3 card card-hover flex-full-center\" style=\"width: 100%; padding: 4px; aspect-ratio: 1\" v-for=\"graphic in clipart.items.filter(v => v.preview)\" @click=\"addClipart(graphic)\">\n            <img :src=\"graphic.preview\" style=\"max-height: 100%\" :alt=\"graphic.name\">\n        </button>\n    </div>\n    \n    <div class=\"flex-full-center\">\n        <callback-paginator :total=\"clipart ? clipart.totalCount : 0\" :limit=\"limit\" v-model:page=\"page\" :callback=\"page_change_callback\"></callback-paginator>\n    </div>\n</div>\n`;\n","import VueComponent, {data, method, prop} from '../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../core/adapters/IVueComponent';\nimport {html} from './ColorPicker.html';\nimport {Services} from '../../../../core/services/Services';\nimport PaperCanvasService from '../../services/PaperCanvasService';\n\nclass ColorPickerComponent extends VueComponent {\n    /*\n        3rd party color pickers are too restrictive to be styled or are too large with features we won't use.\n        Fine... I'll do it my self\n\n        HSV is actually fairly simple, and it can be represented by two gradient for saturation+value.\n        Y-axis: Fully transparency to black with a white background\n        X-axis: White to hue/color\n        CSS: background-image: linear-gradient(transparent, black), linear-gradient(90deg, white, color);\n\n        The saturation is similar. Color is represented as a circle in deg, which is flatted to a line.\n        CSS: linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red)\n     */\n\n    @prop({\n        emit: true,\n        watch: true\n    })\n    color: string;\n\n    @prop()\n    change: (value: string) => void;\n\n    @prop()\n    side: string;\n\n    @data()\n    hue: number = 0; // 0 to 360\n\n    @data()\n    saturation: number = 0; // 0 to 1\n\n    @data()\n    value: number = 0; // 0 to 1\n\n    hue_element;\n    sv_element;\n    hue_mouse_move;\n    sv_mouse_move;\n    mouse_up;\n    test_canvas;\n\n    constructor(v) {\n        super(v);\n        this.hue_mouse_move = this.selectHue.bind(this);\n        this.sv_mouse_move = this.selectSV.bind(this);\n\n        // There is no direct way to convert a named color to a hex value so we need to use a canvas to parse the color names for us\n        // This is not added to the document so it should not be visible\n        this.test_canvas = document.createElement('canvas');\n    }\n\n    override mounted() {\n        super.mounted();\n        this.hue_element = this.$el.querySelector('.hue');\n        this.sv_element = this.$el.querySelector('.saturation-value');\n        this.mouse_up = this.endAllSelection.bind(this);\n        window.addEventListener('mouseup', this.mouse_up);\n        window.addEventListener('touchend', this.mouse_up);\n        this.parseInput();\n        this.bind('change:color', this.parseInput.bind(this), this);\n    }\n\n    override beforeUnmount() {\n        super.beforeUnmount();\n        this.test_canvas.remove();\n    }\n\n    parseInput() {\n        // Hex only uses 8 bits per color chanel while our hsv implementation ues 32. So to prevent\n        // jumping around lets check if our current 32 bit value around down to the same 8 bit value.\n        if (this.hex() == this.color) {\n            return;\n        }\n\n        if (this.color) {\n            let color = this.color;\n            if (color.charAt(0) != '#') {\n                color = this.colorNameToHex(color);\n            }\n            if (color && color.charAt(0) == '#') {\n                // Incorrect length, not valid, do nothing\n                if (!(color.length == 7 || color.length == 4)) {\n                    return;\n                }\n\n                let values;\n                if (color.length == 7) {\n                    values = [color.slice(1,3), color.slice(3,5), color.slice(5,7)];\n                }\n                if (color.length == 4) {\n                    values = [color.charAt(1) + color.charAt(1), color.charAt(2) + color.charAt(2), color.charAt(3) + color.charAt(3)];\n                }\n\n                values = values.map(v => parseInt(v, 16) || 0);\n                values = values.map(v => v/255);\n\n                let hsv = this.rgb2hsv(values[0], values[1], values[2]);\n\n                this.hue = hsv[0];\n                this.saturation = hsv[1];\n                this.value = hsv[2];\n            }\n        }\n    }\n\n    updateColor() {\n        let rgb = this.hsv2rgb(this.hue, this.saturation, this.value);\n\n        // Convert from 0-1 to 0-255 then to base 16. Also correct missing 0 padding.\n        let hex = `#${rgb.map(v => (Math.floor(v * 255)).toString(16)).map(v => v.length == 1 ? `0${v}` : v).join('')}`;\n\n        if (this.change) {\n            this.change(hex);\n        }\n    }\n\n    colorNameToHex(name) {\n        if (!name) {\n            return null;\n        }\n\n        // Black is used as an invalid color so if the name is black then we need to return the hex manually\n        if (name.toLowerCase() == 'black') {\n            return '#000000';\n        }\n\n        // Let the browser parse the color for us\n        let ctx = this.test_canvas.getContext('2d');\n        ctx.fillStyle = name;\n        let hex = ctx.fillStyle;\n        if (!hex || hex == '#000000') {\n            return null;\n        }\n\n        // lch, oklch, lab and oklab are not converted to hex for some reason\n        // PaperJS also does not correctly parse these colors either so for now lets just ignore them\n        // We could add on some color library like colorjs.io but it's large for something that isn't important\n        return hex.charAt(0) == '#' ? hex : null;\n    }\n\n    override unmounted() {\n        window.removeEventListener('mouseup', this.mouse_up);\n        window.removeEventListener('touchend', this.mouse_up);\n        super.unmounted();\n    }\n\n    @method()\n    endAllSelection() {\n        window.removeEventListener('mousemove', this.hue_mouse_move);\n        window.removeEventListener('mousemove', this.sv_mouse_move);\n        window.removeEventListener('touchmove', this.hue_mouse_move);\n        window.removeEventListener('touchmove', this.sv_mouse_move);\n    }\n\n    @method()\n    backgroundGradient() {\n        let color = this.rgb2css(this.hsv2rgb(this.hue, 1, 1));\n        return `background-image: linear-gradient(transparent, black), linear-gradient(90deg, white, ${color});`\n    }\n\n    @method()\n    selectHue($event) {\n        if (!this.hue_element || !$event) {\n            return;\n        }\n\n        $event.preventDefault();\n\n        if (window['TouchEvent'] && $event instanceof TouchEvent) {\n            if ($event.touches && $event.touches.length > 0) {\n                $event = $event.touches[0];\n            }\n        }\n\n        let bounds = this.hue_element.getBoundingClientRect();\n        let x = (this.clamp($event.pageX, bounds.x, bounds.x + bounds.width) - bounds.x) / bounds.width;\n        this.hue = x * 365;\n        this.updateColor();\n    }\n\n    @method()\n    hueButtonStyling() {\n        let color = this.rgb2css(this.hsv2rgb(this.hue, 1, 1));\n        return `left: calc(${100 * this.hue / 365}% - 10px); background-color: ${color};`;\n    }\n\n    @method()\n    svButtonStyling() {\n        let color = this.rgb2css(this.hsv2rgb(this.hue, this.saturation, this.value));\n        return `left: calc(${this.saturation * 100}% - 10px); top: calc(${(1-this.value) * 100}% - 10px); background-color: ${color};`\n    }\n\n    @method()\n    onHueSelection($event) {\n        this.selectHue($event);\n        window.addEventListener('mousemove', this.hue_mouse_move);\n        window.addEventListener('touchmove', this.hue_mouse_move);\n    }\n\n    @method()\n    endHueSelection($event) {\n        this.selectHue($event);\n        window.removeEventListener('mousemove', this.hue_mouse_move);\n        window.removeEventListener('touchmove', this.hue_mouse_move);\n    }\n\n    @method()\n    selectSV($event) {\n        if (!this.sv_element || !$event) {\n            return;\n        }\n\n        $event.preventDefault();\n\n        if (window['TouchEvent'] && $event instanceof TouchEvent) {\n            if ($event.touches && $event.touches.length > 0) {\n                $event = $event.touches[0];\n            }\n        }\n\n        let bounds = this.sv_element.getBoundingClientRect();\n        this.saturation = (this.clamp($event.pageX, bounds.x, bounds.x + bounds.width) - bounds.x) / bounds.width;\n        this.value = 1 - ((this.clamp($event.pageY, bounds.y, bounds.y + bounds.height) - bounds.y) / bounds.height);\n        this.updateColor();\n    }\n\n    @method()\n    onSVSelection($event) {\n        this.endAllSelection();\n        this.selectSV($event);\n        window.addEventListener('mousemove', this.sv_mouse_move);\n        window.addEventListener('touchmove', this.sv_mouse_move);\n    }\n\n    @method()\n    endSVSelection($event) {\n        this.endAllSelection();\n        this.selectSV($event);\n        window.removeEventListener('mousemove', this.sv_mouse_move);\n        window.removeEventListener('touchmove', this.sv_mouse_move);\n    }\n\n    rgb2css(value) {\n        let f = (v) => {\n            return Math.floor(v * 255);\n        }\n        return `rgb(${f(value[0])}, ${f(value[1])}, ${f(value[2])})`;\n    }\n\n    hsv2rgb(h: number, s: number, v: number) {\n        // h [0-360]\n        // s,v [0-1]\n\n        // Clamp incorrect values\n        s = this.clamp(s, 0, 1);\n        v = this.clamp(v, 0, 1);\n        if (h == null) {\n            h = 0;\n        }\n\n        // https://stackoverflow.com/a/54024653\n        let f= (n) => {\n            let k = (n+h/60) % 6;\n            return v - v*s*Math.max(Math.min(k,4-k,1), 0);\n        };\n\n        return [f(5),f(3),f(1)];\n    }\n\n    rgb2hsv(r: number, g: number, b: number) {\n        // Clamp incorrect values\n        r = this.clamp(r, 0, 1);\n        g = this.clamp(g, 0, 1);\n        b = this.clamp(b, 0, 1);\n\n        // https://stackoverflow.com/a/54070620\n        let v=Math.max(r,g,b), c=v-Math.min(r,g,b);\n        let h= c && ((v==r) ? (g-b)/c : ((v==g) ? 2+(b-r)/c : 4+(r-g)/c));\n        return [60*(h<0?h+6:h), v&&c/v, v];\n    }\n\n    hex() {\n        let rgb = this.hsv2rgb(this.hue, this.saturation, this.value);\n\n        // Convert from 0-1 to 0-255 in base 16. Also correct missing 0 padding.\n        return `#${rgb.map(v => (Math.floor(v * 255)).toString(16)).map(v => v.length == 1 ? `0${v}` : v).join('')}`;\n    }\n\n    clamp(v, min, max) {\n        return Math.min(Math.max(v, min), max);\n    }\n}\n\nexport default function ColorPicker(): IVueComponent {\n    return {\n        controller: ColorPickerComponent,\n        tag: 'color-picker',\n        template: html\n    }\n}\n","export const html:string = `\n<div class=\"flex-left column no-wrap full-width stretch color-picker\">\n    <div class=\"hue\" @mousedown=\"onHueSelection($event)\" @touchstart=\"onHueSelection($event)\" style=\"touch-action: none;\">\n        <button :style=\"hueButtonStyling()\" id=\"hue-value\"></button>\n    </div>\n    <div class=\"saturation-value\" :style=\"backgroundGradient()\" @mousedown=\"onSVSelection($event)\" @touchstart=\"onSVSelection($event)\" style=\"touch-action: none;\">\n        <button :style=\"svButtonStyling()\" id=\"sv-value\"></button>    \n    </div>\n</div>\n`;","import VueComponent, {data, prop} from '../../../../core/adapters/VueComponent';\nimport PaperCanvasService from '../../services/PaperCanvasService';\nimport {Services} from '../../../../core/services/Services';\nimport IVueComponent from '../../../../core/adapters/IVueComponent';\n\n/*\n * This directive's main purpose is to set up a PaperJS canvas and tool.\n * PaperService is then passed the canvas and handles all of the heavy lifting.\n */\n\nclass PaperCanvasController extends VueComponent {\n\n    @data()\n    canvas_service;\n\n    @prop()\n    blank: boolean;\n\n    constructor(c) {\n        super(c);\n\n        this.canvas_service = Services.get<PaperCanvasService>('PaperCanvasService');\n    }\n\n    override async mounted() {\n        super.mounted();\n\n        this.canvas_service.setupPaperFromCanvas(this.$el);\n\n        if (window.location.origin.indexOf('localhost') != -1) {\n            window.onbeforeunload = () => {\n                return 'Are you sure you wish to leave this page? Your design will be lost.' //override generic string use in certain browsers.\n            }\n        }\n    }\n}\n\nexport default function PaperCanvas(): IVueComponent {\n    return {\n        controller: PaperCanvasController,\n        tag: 'paper-canvas',\n        template: `<canvas id=\"vector-canvas\" :style=\"{'background-color': blank ? '' : canvas_service.canvas_background_color}\"></canvas>`\n    };\n}\n","import {html} from './SubCanvasPreview.html';\nimport PaperCanvasService from '../../services/PaperCanvasService';\nimport VueComponent, {data, prop} from '../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../core/adapters/IVueComponent';\nimport {Services} from '../../../../core/services/Services';\nimport {getInnerHeight, getInnerWidth} from '../../../../core/utils/utils';\nimport {IDeferred, IPromise, SimplePromise} from '../../../../core/utils/SimplePromise';\nimport {uuid4} from '../../../../core/utils/uuid';\nimport {disableVueForImport} from '../../../../core/adapters/VueUtils';\n\nclass SubCanvasPreviewController extends VueComponent {\n\n    @prop()\n    side;\n\n    private setup_complete: IPromise<void>;\n    private setup_deferred: IDeferred<void>;\n    private paperScope;\n    private layer;\n    private width;\n    private height;\n    private initilized: boolean;\n    private delay;\n    private paper_import;\n    private paper;\n\n    constructor(component) {\n        super(component);\n        this.setup_deferred = SimplePromise.defer();\n        this.setup_complete = this.setup_deferred.promise;\n\n        this.paper_import = import('paper');\n\n        Services.get<PaperCanvasService>('PaperCanvasService').bind('design-change', async () => {\n            // Don't let this try to update faster than 100ms due to how expensive it is\n            if (this.delay) {\n                clearTimeout(this.delay);\n            }\n            this.delay = setTimeout(() => {\n                this.reloadLayer();\n            }, 100);\n        }, this);\n    }\n\n    override mounted() {\n        // Reset the canvas because vue reuses dom elements...\n        const canvas = this.$el;\n        canvas.style.height = null\n        canvas.style.width = '100%';\n\n        this.paper_import.then((paper) => {\n            disableVueForImport(paper);\n            this.paper = paper;\n            this.setupCanvas();\n        });\n    }\n\n    async setupCanvas() {\n        await Services.get<PaperCanvasService>('PaperCanvasService').setup_complete\n\n        const canvas = this.$el;\n        this.width = getInnerWidth(canvas);\n        this.height = getInnerHeight(canvas);\n\n        canvas.style.width = `${this.width}px`;\n        canvas.style.height = `${this.height}px`;\n\n        this.paperScope = new this.paper.PaperScope();\n        this.paperScope.activate();\n        this.paperScope.setup(canvas);\n\n        // Setup high quality down sampling for better scaling\n        const ctx = this.paperScope.view.element.getContext('2d');\n        ctx.imageSmoothingQuality = 'medium';\n        ctx.imageSmoothingEnabled = true;\n\n        this.layer = new this.paper.Layer();\n        this.initilized = true;\n\n        this.setup_deferred.resolve();\n\n        this.reloadLayer();\n    }\n\n    async reloadLayer() {\n        await this.setup_complete;\n\n        let side = this.side;\n        if (!side) {\n            let canvas_service = Services.get<PaperCanvasService>('PaperCanvasService');\n            if (canvas_service) {\n                side = canvas_service.layer_sides[canvas_service.active_side];\n            }\n        }\n\n        if (!side?.projectLayer) {\n            return;\n        }\n\n        this.layer.removeChildren();\n\n        let clone;\n        if (side.clipViewArea) {\n            let _opacity = side.clipViewArea.opacity;\n            side.clipViewArea.opacity = 0;\n            clone = side.projectLayer.clone({insert: false});\n            side.clipViewArea.opacity = _opacity;\n        }\n        else {\n            clone = side.projectLayer.clone({insert: false});\n        }\n\n        clone.visible = true;\n        this.layer.addChild(clone);\n        this.layer.fitBounds(new this.paper.Rectangle(0, 0, this.width, this.height));\n    }\n}\n\nexport default function SubCanvasPreview(): IVueComponent {\n    return {\n        controller: SubCanvasPreviewController,\n        template: html,\n        tag: 'sub-canvas-preview'\n    };\n}\n","export const html: string = `\n<canvas style=\"width: 100%; max-height: 100%\"></canvas>\n`;","import VueComponent, {data, method, prop} from '../../../../core/adapters/VueComponent';\nimport {SymbolTypeName} from '../../models/abstract/VariableDataElementAbstract';\nimport CustomEditorService from '../../services/CustomEditorService';\nimport {ElementManager} from '../../services/ElementManager';\nimport PaperCanvasService from '../../services/PaperCanvasService';\nimport {Services} from '../../../../core/services/Services';\nimport {ProductTypeEnum} from '../../models/enums';\nimport {SelectionManager} from '../../services/SelectionManager';\nimport MessageList from '../../../../core/utils/MessageList';\nimport {TextElement} from '../../tool/TextElement';\nimport {Color} from '../../models/Color';\n\nexport default abstract class AbstractDesignToolController extends VueComponent {\n    static override emits_list = ['updateSelection'];\n\n    @prop()\n    element: any;\n\n    @prop()\n    productService: CustomEditorService;\n\n    @prop({\n        emit: true\n    })\n    activeTab: string;\n\n    @data()\n    element_manager: ElementManager;\n\n    @data()\n    canvas_service: PaperCanvasService;\n\n    @data()\n    selection_manager: SelectionManager;\n\n    @data()\n    text_types = [\n        SymbolTypeName.NORMAL_TEXT,\n        SymbolTypeName.NUMBER_RANGE,\n        SymbolTypeName.CSV_TEXT\n    ];\n\n    @data()\n    limited_text_types = [\n        SymbolTypeName.NORMAL_TEXT\n    ];\n\n    @data()\n    errors: MessageList;\n\n    constructor(component) {\n        super(component);\n\n        this.element_manager = Services.get<ElementManager>('ElementManager');\n        this.canvas_service = Services.get<PaperCanvasService>('PaperCanvasService');\n        this.selection_manager = Services.get<SelectionManager>('SelectionManager');\n\n        this.errors = new MessageList();\n    }\n\n    override mounted() {\n        super.mounted();\n        this.resetScrollPosition();\n    }\n\n    resetScrollPosition() {\n        let toolbar = document.querySelector('.floating-tool-bar');\n        if (toolbar) {\n            toolbar.scrollTop = 0;\n        }\n    }\n\n    @method()\n    isSingleColor() {\n        return this.productService.base.type == ProductTypeEnum.CUTOUT;\n    }\n\n    @method()\n    changeStrokeWidth(item: any, change: number) {\n        let new_width = item.stroke_width + change;\n        if (new_width < 0) {\n            new_width = 0;\n        }\n        if (new_width > 10) {\n            new_width = 10;\n        }\n\n       item.stroke_width = new_width;\n    }\n\n    @method()\n    elementHasAdvancedOptions() {\n        if (!this.element) {\n            return false;\n        }\n\n        return (this.element.model.can_remove == true || this.element.model.can_remove == undefined) && !this.element.isImmutable();\n    }\n\n    @method()\n    public isSelectionUserShape() {\n        return !this.selection_manager.isMultiSelection && this.selection_manager.selection && this.selection_manager.selection.isUserShapeType();\n    }\n\n    @method()\n    public isSelectionText() {\n        return !this.selection_manager.isMultiSelection && this.selection_manager.selection && this.selection_manager.selection.isTextType();\n    }\n\n    @method()\n    public isSelectionRaster() {\n        return !this.selection_manager.isMultiSelection && this.selection_manager.selection && this.selection_manager.selection.isRasterType();\n    }\n\n    @method()\n    public isSelectionQRCode() {\n        return !this.selection_manager.isMultiSelection && this.selection_manager.selection && this.selection_manager.selection.isQRCodeType();\n    }\n\n    @method()\n    public isSelectionClipart() {\n        return !this.selection_manager.isMultiSelection && this.selection_manager.selection && this.selection_manager.selection.isClipartType();\n    }\n\n    @method()\n    public isSelectionMarketplace() {\n        return !this.selection_manager.isMultiSelection && this.selection_manager.selection && this.selection_manager.selection.isMarketplaceType();\n    }\n\n    @method()\n    public isSelectionShape() {\n        return !this.selection_manager.isMultiSelection && this.selection_manager.selection && this.selection_manager.selection.isShapeType();\n    }\n\n    @method()\n    public isSelectionCrop() {\n        return !this.selection_manager.isMultiSelection && this.selection_manager.selection && this.selection_manager.selection.isCropType();\n    }\n\n    @method()\n    public isSelectionNone() {\n        return !this.selection_manager.selection;\n    }\n\n    @method()\n    moveElementDown($event, selected_element?) {\n        if ($event) {\n            $event.preventDefault();\n        }\n\n        if (selected_element) {\n            this.element_manager.moveElementDown(selected_element, $event);\n        }\n        else {\n            this.element_manager.moveElementDown(this.element, $event);\n        }\n    }\n\n    @method()\n    moveElementUp($event, selected_element?) {\n        if ($event) {\n            $event.preventDefault();\n        }\n\n        if (selected_element) {\n            this.element_manager.moveElementUp(selected_element, $event);\n        }\n        else {\n            this.element_manager.moveElementUp(this.element, $event);\n        }\n    }\n\n    @method()\n    sides() {\n        if (!this.canvas_service.sides) {\n            return [];\n        }\n\n        return this.canvas_service.sides.map(v => v.model).filter(v => v);\n    }\n}\n","import AbstractDesignToolController from '../AbstractDesignToolController';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './AddCliaprt.html';\nimport {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport Company from '../../../../../core/services/Company';\nimport {ClipartCategory} from '../../../models/ClipartCategory';\nimport APIResponse from '../../../../../core/models/APIResponse';\nimport {ClipartCategoryGraphic} from '../../../models/ClipartCategoryGraphic';\nimport {ProductTypeEnum} from '../../../models/enums';\nimport {EClipartColorChoiceEnum} from '../../../models/Clipart';\nimport {Services} from '../../../../../core/services/Services';\nimport {Http} from '../../../../../core/services/Http';\n\nclass DesignToolAddClipartController extends AbstractDesignToolController {\n\n    @data()\n    company: Company;\n\n    @data()\n    search_query: string;\n\n    @data()\n    searched_query: string;\n\n    @data()\n    shape_categories: ClipartCategory[];\n\n    @data()\n    clipart: APIResponse<ClipartCategoryGraphic>;\n\n    @data()\n    limit: number;\n\n    @data()\n    page : number;\n\n    @data()\n    category: ClipartCategory;\n\n    @data()\n    category_breadcrumbs: any[];\n\n    @data()\n    page_change_callback;\n\n    @data()\n    searching: boolean;\n\n    @data()\n    filtered_categories: ClipartCategory[];\n\n    @data()\n    back_action: () => boolean;\n\n    constructor(component) {\n        super(component);\n\n        this.page_change_callback = this.paginationFunction.bind(this);\n\n        this.search_query = '';\n        this.searched_query = '';\n        this.shape_categories = [];\n        this.category_breadcrumbs = [];\n\n        this.productService.setup_complete.then(() => {\n            this.productService.clipart_categories.$promise.then(() => {\n                this.filterSubCategories();\n                for (const category of this.productService.clipart_categories.items) {\n                    if (category.shapes) {\n                        this.shape_categories.push(category);\n                    }\n                }\n            });\n        });\n\n        this.page = 1;\n        this.limit = 80;\n\n        this.clipart = null;\n        this.reset();\n\n        this.back_action = () => {\n            if (this.search_query) {\n                this.search_query = '';\n                this.search(1);\n                return true;\n            }\n\n            if (this.category_breadcrumbs.length == 0) {\n                return false;\n            }\n\n            this.category_breadcrumbs.pop();\n            this.selectCategory(this.category_breadcrumbs.length == 0 ? null : this.category_breadcrumbs[this.category_breadcrumbs.length - 1]);\n            return true;\n        }\n    }\n\n    @method()\n    search(page?): void {\n        this.page = page || this.page || 1;\n        this.limit = this.limit || 20;\n        this.search_query = this.search_query || '';\n        this.searched_query = this.search_query;\n        this.searching = true;\n\n        const q = {\n            query: this.search_query,\n            limit: this.limit,\n            offset: this.limit * (this.page - 1)\n        };\n\n        if (this.category) {\n            q['search_category'] = this.category.id;\n        }\n\n        if (this.productService.base.type === ProductTypeEnum.CUTOUT) {\n            q['colors'] = EClipartColorChoiceEnum.SINGLE_COLOR;\n        }\n\n        q['show_licensed'] = this.productService.configured.marketplace_elements.length == 0;\n\n        if (window.location.href.indexOf('/dashboard/') != -1) {\n            q['show_licensed'] = false;\n        }\n\n        this.clipart = null;\n        Services.get<Http>('$http').request({\n            url: '/custom/api/v1/clipart-category-graphic-search/',\n            method: 'GET',\n            params: q\n        }).then((response) => {\n            this.clipart = Services.get<typeof ClipartCategoryGraphic>('ClipartCategoryGraphic').objects.from(response.data.data);\n            this.searching = false;\n        }, (err) => {\n            this.searching = false;\n            return err;\n        });\n    }\n\n    @method()\n    addClipart(clipart): void {\n        if (clipart.graphic.resource_uri.indexOf('/marketplace/api/v1/artwork/') != -1) {\n            this.productService.createMarketplaceElement({\n                name: clipart.name,\n                artwork: clipart.graphic,\n                selectable: true,\n                maintain_proportion: true\n            });\n        }\n        else {\n            this.productService.createClipartElement({\n                name: clipart.name,\n                clipart: clipart.graphic,\n                selectable: true,\n                maintain_proportion: true\n            });\n        }\n    }\n\n    @method()\n    reset() {\n        this.search_query = '';\n        this.searched_query = '';\n        this.clipart = null;\n        this.category = null;\n        this.page = 1;\n    }\n\n    paginationFunction(page){\n        this.page = page;\n        this.search();\n        this.updateCategoryBreadcrumbs();\n    }\n\n    @method()\n    onCategoryChange() {\n        this.updateCategoryBreadcrumbs();\n        this.filterSubCategories();\n        if (this.filtered_categories.length == 0) {\n            this.search();\n        }\n    }\n\n    @method()\n    selectCategory(category) {\n        this.category = category;\n        this.page = 1;\n\n        this.onCategoryChange();\n    }\n\n    @method()\n    removeCategory() {\n        this.category = null;\n        this.search();\n        this.updateCategoryBreadcrumbs();\n    }\n\n    public updateCategoryBreadcrumbs() {\n        this.category_breadcrumbs = [];\n\n        if (!this.category) {\n            return;\n        }\n\n        let current_category = this.category;\n        while (current_category && current_category.parent != null) {\n            this.category_breadcrumbs.push(current_category);\n\n            current_category = this.productService.clipart_categories.items.getItemFromURI(current_category.parent);\n\n            if (this.category_breadcrumbs.indexOf(current_category) != -1) {\n                this.category_breadcrumbs.reverse();\n                return;\n            }\n        }\n\n        this.category_breadcrumbs.push(current_category);\n        this.category_breadcrumbs.reverse();\n    }\n\n    @method()\n    filterSubCategories() {\n        let items = [];\n        let uri_check = null;\n\n        if (!this.productService.clipart_categories) {\n            this.filtered_categories = items;\n        }\n\n        if (this.category) {\n            uri_check = this.category.buildResourceURI();\n        }\n\n        for (const item of this.productService.clipart_categories.items) {\n            if (item.parent == uri_check) {\n                items.push(item);\n            }\n        }\n\n        this.filtered_categories = items.filter(v => !!v.image);\n    }\n}\n\n\nexport default function DesignToolAddClipart(): IVueComponent {\n    'use strict';\n\n    return {\n        controller: DesignToolAddClipartController,\n        template: html,\n        tag: 'design-tool-add-clipart'\n    };\n}","export const html:string = `\n<div class=\"tool-action-header\">\n    <tool-navigation :active-tab=\"activeTab\" :action=\"back_action\"></tool-navigation>\n    <h3 class=\"full-width align-center\">Add Graphic</h3>\n</div>\n<select-layer-bar :product-service=\"productService\"></select-layer-bar>\n<div class=\"inner-drag-content\">\n    <div class=\"input-group\">\n        <label>Search designs</label>\n        <input type=\"text\" class=\"search\" v-model=\"search_query\" @keydown.enter=\"search()\" :disabled=\"searching\"/>\n    </div>\n    \n    <h4 v-if=\"search_query && clipart && clipart.$resolved && clipart.items.length == 0\" class=\"results\">No Results for \"{{ searched_query }}\"</h4>\n    \n    <div class=\"col-xs-12 col-full clipart-search-breadcrumbs\" v-show=\"category_breadcrumbs.length > 0\">\n        <span><a @click=\"selectCategory(null)\">All Categories</a></span>\n        <span v-for=\"item in category_breadcrumbs\"> &gt; <a @click=\"selectCategory(item)\">{{ item.name }}</a></span>\n    </div>\n    \n    <div class=\"flex-left column spacing-sm full-width stretch\" v-show=\"shape_categories.length > 0 && searched_query == '' && category == null\">\n        <h3>Designs</h3>\n        <ul class=\"item-list\">\n            <li v-for=\"shape_category in $filters.orderBy(shape_categories, 'name')\" @click=\"selectCategory(shape_category)\" class=\"col-xs-6 col-sm-4 clipart-preview category-preview\">\n                <a>\n                    <div class=\"img-wrapper smaller-wrapper\">\n                        <img class=\"clipart-art\" :src=\"shape_category.image\"/>\n                    </div>\n                </a>\n                <div class=\"clipart-name\">{{ categoryshape_category }}</div>\n            </li>\n       </ul>\n    </div>\n    <div class=\"flex-left column spacing-sm full-width stretch\" v-if=\"filtered_categories\" v-show=\"filtered_categories.length > 0 && searched_query == ''\">\n        <h3>Categories</h3>\n        <div class=\"flex-left column spacing-none full-width no-wrap stretch\">\n            <template v-for=\"(category, $index) in $filters.orderBy(filtered_categories, 'name')\" :key=\"category.id\">\n                <button class=\"btn-clear flex-left-center spacing-sm full-width align-left wrap inset-section inset-hover\" @click=\"selectCategory(category, $event)\">\n                    <div class=\"card background no-overflow flex-full-center no-wrap no-shrink\" style=\"width: 54px; height: 54px; padding: 4px\">\n                        <img :src=\"category.image\" width=\"54px\" height=\"54px\" :alt=\"category.name\">\n                    </div>\n                    <span>{{ category.name }}</span>\n                </button>\n                <hr class=\"padding-none\" v-if=\"$index != filtered_categories.length - 1\">\n            </template>\n        </div>\n        \n    </div>\n    <div class=\"flex-left column spacing-sm full-width stretch\" v-if=\"filtered_categories\" v-show=\"!searching && (filtered_categories.length == 0 || searched_query != '') && clipart && clipart.items.length != 0\">\n        <h3>Clipart</h3>\n        \n        <div class=\"grid\" v-if=\"clipart\">\n            <div class=\"xs-3\" v-for=\"graphic in clipart.items.filter(v => v.preview)\">\n                <button class=\"btn-abstract card card-hover flex-full-center\" style=\"width: 100%; padding: 4px;\" @click=\"addClipart(graphic)\">\n                    <img :src=\"graphic.preview\" style=\"width: 100%; object-fit: scale-down; aspect-ratio: 1\" :alt=\"graphic.name\">\n                </button>\n            </div>\n        </div>\n        \n        <div class=\"flex-full-center\">\n            <callback-paginator :total=\"clipart ? clipart.totalCount : 0\" :limit=\"limit\" v-model:page=\"page\" :callback=\"page_change_callback\"></callback-paginator>\n        </div>\n    </div>\n</div>\n`;\n","import {html} from './AddFile.html';\nimport VueComponent, {data, prop, method} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport CustomEditorService from '../../../services/CustomEditorService';\nimport {UserFile} from '../../../models/UserFile';\nimport MessageList from '../../../../../core/utils/MessageList';\nimport {eventToFiles, processRequestError} from '../../../../../core/utils/utils';\nimport {Http} from '../../../../../core/services/Http';\nimport {Services} from '../../../../../core/services/Services';\n\nclass AddFileComponentController extends VueComponent {\n    static override $inject = [\n        '$http',\n        'UserFile',\n    ];\n\n    @prop()\n    productService: CustomEditorService;\n\n    @prop()\n    activeTab: string;\n\n    @data()\n    errors: MessageList;\n\n    @data()\n    percent_loaded: number;\n\n    @data()\n    user_files: any;\n\n    @data()\n    method: 'my-files'|'upload' = 'upload';\n\n    @data()\n    search: string;\n\n    @data()\n    limit;\n\n    @data()\n    page;\n\n    @data()\n    paginator_callback;\n\n    @data()\n    file_to_form_data;\n\n    @data()\n    upload_success;\n\n    @data()\n    upload_failure;\n\n    userFileModel: typeof UserFile;\n    $http: Http;\n\n    constructor(component, $http: Http, userFileModel: typeof UserFile) {\n        super(component);\n\n        this.userFileModel = userFileModel;\n        this.$http = $http;\n\n        this.page = 1;\n        this.limit = 15;\n        this.search = \"\";\n        this.errors = new MessageList();\n        this.paginator_callback = this.paginationFunction.bind(this);\n\n        this.changeMethod('upload');\n\n        this.file_to_form_data = (file: File) => {\n            let form_data = new FormData()\n            form_data.append('file', file);\n\n            if (this.productService.configured.id) {\n                form_data.append('custom', `${this.productService.configured.id}`);\n            }\n\n            return form_data;\n        }\n        this.upload_success = async (response) => {\n            const user_file = UserFile.objects.get({\n                id: response.data.user_file\n            });\n\n            await user_file.$promise;\n\n            if (user_file.raster) {\n                // When this is slow to upload, the user can change to a different component which will\n                // cause this component to be garbage collected, so to be safe we will need to get the service manually.\n                Services.get<CustomEditorService>('ProductService').createUserFileElement({\n                    user_file: user_file\n                });\n            }\n            else {\n                alert('Failed to upload file.')\n            }\n        }\n        this.upload_failure = (error) => {\n            this.errors = processRequestError(error, 'file')\n        }\n    }\n\n\n\n    @method()\n    addFile(user_file) {\n        this.productService.createUserFileElement({\n            user_file: user_file\n        });\n    }\n\n    @method()\n    changeMethod(method, $event?) {\n        if($event)\n            $event.preventDefault();\n\n        this.method = method;\n\n        if (this.method == 'my-files' && !this.user_files) {\n            this.getFiles();\n        }\n    }\n\n    @method()\n    getFiles() {\n        let q = {\n            limit: this.limit,\n            offset: this.limit * (this.page - 1),\n            name__icontains: this.search,\n            customer: this.productService.configured.user_id,\n            hidden: false,\n            failed_to_raster: false,\n            unable_to_raster: false\n        };\n\n        this.user_files = this.userFileModel.objects.filter(q);\n    }\n\n    paginationFunction(page) {\n        this.page = page;\n        this.getFiles();\n    }\n\n    @method()\n    removeFile(file: UserFile) {\n        this.user_files.items.removeItemFromID(file.id);\n        file.remove().then(() => {\n            this.getFiles();\n        });\n    }\n}\n\nexport default function DesignToolAddFile(): IVueComponent {\n\n    return {\n        controller: AddFileComponentController,\n        template: html,\n        tag: 'design-tool-add-file'\n    };\n}\n","export const html: string = `\n<div class=\"tool-action-header\">\n    <tool-navigation></tool-navigation>\n    <h3 class=\"full-width align-center\">Add File</h3>\n</div>\n<select-layer-bar :product-service=\"productService\"></select-layer-bar>\n<div class=\"inner-drag-content\">    \n    <div class=\"card info padded-card-xs text-sm\" v-if=\"productService.base.type == 0\">\n        <div class=\"flex-left-center spacing-sm no-wrap\">\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M12 16V12M12 8H12.01M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12Z\" stroke=\"var(--info-weak, #2E90FA)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n            This is a one-color product. We'll make your design in the color you chose, not the colors in your file.\n        </div>\n    </div>\n    <fieldset class=\"input-group single-option\">\n        <legend>File Selection</legend>\n        <div class=\"toggle-group toggle-sm\">\n            <label for=\"upload-new-file\">\n                <input id=\"upload-new-file\" :value=\"'upload'\" name=\"file-selection-type\" type=\"radio\" v-model=\"method\"/>\n                Upload New File\n            </label>\n            <label for=\"select-previous-file\">\n                <input id=\"select-previous-file\" :value=\"'my-files'\" name=\"file-selection-type\" type=\"radio\" v-model=\"method\" @change=\"getFiles\"/>\n                Previous File\n            </label>\n        </div>\n    </fieldset>\n    \n    <file-upload v-if=\"method == 'upload'\" url=\"/custom/api/v1/upload/\" :form-data=\"file_to_form_data\" :success=\"upload_success\" :failure=\"upload_failure\" :auto-reset=\"true\"></file-upload>\n    \n    <div class=\"input-group\" v-if=\"method == 'my-files'\"> \n        <label>Search previous uploads</label>\n        <input type=\"text\" class=\"search\" v-model=\"search\" @keydown.enter=\"getFiles()\">\n    </div>\n    \n    <div class=\"spacing-none\" v-if=\"method == 'my-files' && user_files\">\n        <template v-for=\"(user_file, $index) in user_files.items\" >\n            <div class=\"inset-section flex-left no-wrap full-width stretch space-between spacing-sm inset-hover\">\n                <button class=\"btn-clear flex-left-center no-wrap spacing-sm full-width btn-square-sm\" @click=\"addFile(user_file)\">\n                    <div class=\"card background no-overflow flex-full-center no-shrink\" style=\"width: 54px; height: 54px; padding: 4px\">\n                        <img :src=\"user_file.preview\" width=\"50px\" height=\"50px\" :alt=\"user_file.file_name\"/>\n                    </div>\n                    <span class=\"align-left full-width text-wrap\">{{ user_file.file_name }}</span>\n                </button>\n                <button class=\"btn-icon no-shrink flex-full-center\" @click.prevent=\"removeFile(user_file)\">\n                    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path d=\"M17 7L7 17M7 7L17 17\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                    </svg>\n                </button>\n            </div>\n            <hr class=\"padding-none\" v-if=\"$index != user_files.items.length - 1\">\n        </template>\n    </div>\n    \n    <div class=\"flex-full-center full-width\" v-if=\"user_files && method == 'my-files'\">\n        <callback-paginator :total=\"user_files.totalCount\" :limit=\"limit\" :page=\"page\" :callback=\"paginator_callback\"></callback-paginator>\n    </div>\n</div>\n`;","import {SymbolType} from \"../../../models/enums\";\n\nexport const html: string = `\n<div class=\"tool-action-header\">\n    <tool-navigation></tool-navigation>\n    <h3 class=\"full-width align-center\">Add QR Code</h3>\n</div>\n<select-layer-bar :product-service=\"productService\"></select-layer-bar>\n<div class=\"inner-drag-content\">\n    <code-form-type :code=\"code\" :variable-data=\"symbol\"></code-form-type>\n    \n    <fieldset class=\"input-group single-option\">\n        <legend>Data Type</legend>\n        <div class=\"toggle-group toggle-sm\">\n            <label for=\"normal-text\">\n                <input id=\"normal-text\" :value=\"${SymbolType.NONE}\" name=\"text-type\" type=\"radio\" v-model=\"symbol\"/>\n                Text\n            </label>\n            <label for=\"number-range-text\">\n                <input id=\"number-range-text\" :value=\"${SymbolType.NUMBER_RANGE}\" name=\"text-type\" type=\"radio\" v-model=\"symbol\"/>\n                Data Range\n            </label>\n            <label for=\"csv-list-text\">\n                <input id=\"csv-list-text\" :value=\"${SymbolType.CSV_LIST}\" name=\"text-type\" type=\"radio\" v-model=\"symbol\"/>\n                CSV List\n            </label>\n        </div>\n    </fieldset>\n    \n    <code-form-data v-if=\"symbol == ${SymbolType.NONE}\" :errors=\"errors\" :code-data=\"code.data_json\" :bar-code-type=\"code.barcode_type\" :qr-code-type=\"code.qrcode_type\" :code-type=\"code.code_type\"></code-form-data>\n    \n    <code-form-data v-if=\"symbol == ${SymbolType.NUMBER_RANGE}\" :errors=\"errors\" :code-data=\"variable_data_start\" :bar-code-type=\"code.barcode_type\" :qr-code-type=\"code.qrcode_type\" :code-type=\"code.code_type\" :prefix=\"'Starting '\"></code-form-data>\n    <code-form-data v-if=\"symbol == ${SymbolType.NUMBER_RANGE}\" :errors=\"errors\" :code-data=\"variable_data_end\" :bar-code-type=\"code.barcode_type\" :qr-code-type=\"code.qrcode_type\" :code-type=\"code.code_type\" :prefix=\"'Ending '\"></code-form-data>\n            \n    <div class=\"input-group\" v-if=\"symbol == ${SymbolType.CSV_LIST}\">\n        <label for=\"text-input\">CSV File</label>\n        <message-list field=\"text,csv\" :errors=\"errors\">\n            <file-upload :extensions=\"['csv']\" url=\"/custom/api/csv-to-json/\" :success=\"upload_success\" :failure=\"upload_failure\" :auto-reset=\"true\"></file-upload>\n        </message-list>\n    </div>\n    \n    <i class=\"text-sm text-icon\" v-if=\"(symbol == ${SymbolType.NUMBER_RANGE}) && range\">Total quantity: {{ range }}</i>\n    \n    <button v-if=\"symbol != ${SymbolType.CSV_LIST}\" class=\"btn-base btn-primary-action\" @click=\"save()\">Add To Design</button>\n</div>\n`;\n","import {html} from './AddQrCode.html';\nimport VueComponent, {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport CustomEditorService from '../../../services/CustomEditorService';\nimport {CodeType, QRCode, QRCodeType} from '../../../models/QRCode';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {Services} from '../../../../../core/services/Services';\nimport {SymbolType} from \"../../../models/enums\";\nimport MessageList from \"../../../../../core/utils/MessageList\";\nimport {processRequestError} from \"../../../../../core/utils/utils\";\nimport {modal} from \"../../../../../core/utils/Modal\";\n\nexport class AddQrCodeComponentController extends VueComponent {\n\n    @data()\n    code: QRCode;\n\n    @data()\n    on_save;\n\n    @data()\n    symbol: SymbolType;\n\n    @data()\n    errors: MessageList;\n\n    @prop()\n    productService: CustomEditorService;\n\n    @data()\n    variable_data_start;\n\n    @data()\n    variable_data_end;\n\n    @data()\n    range;\n\n    constructor(component) {\n        super(component);\n\n        this.code = new (Services.get<typeof QRCode>('QRCode'))();\n        this.code.code_type = CodeType.QR_CODE;\n        this.code.qrcode_type = QRCodeType.WEBSITE;\n        this.code.data_json = {};\n        this.variable_data_start = {};\n        this.variable_data_end = {};\n        this.symbol = SymbolType.NONE;\n    }\n\n    @method()\n    variableDataMessage(type: string) {\n        if (this.productService.configured.defined_quantity) {\n            return 'Only one element of this kind is allowed per design.'\n        }\n        if (type == 'range') {\n            return 'Each product will have a number from a range.'\n        }\n        if (type == 'csv') {\n            return 'Each product will have a value from a list.'\n        }\n    }\n\n    @method()\n    upload_failure(error) {\n        this.errors = MessageList.fromRequest(error);\n    }\n\n    @method()\n    upload_success(response) {\n        this.productService.add_variable_data_file = response.data;\n        this.productService.add_variable_data_callback = (data) => {\n            if (data) {\n                this.save(data);\n            }\n        }\n        modal.open('add-variable-data-modal');\n    }\n\n    @method()\n    save(data?) {\n        this.code.errors.reset();\n        this.code.cleanData();\n\n        if (this.symbol == SymbolType.NONE) {\n            this.code.data_json = JSON.stringify(this.code.data_json);\n        }\n        if (this.symbol == SymbolType.NUMBER_RANGE) {\n            this.code.data_json = JSON.stringify(this.variable_data_start);\n        }\n        if (this.symbol == SymbolType.CSV_LIST && data && data.length > 0) {\n            let fields = this.code.codeFields();\n            this.code.data_json = JSON.stringify({[fields[0]]: data[0]})\n        }\n\n        this.code.save().then(() => {\n            let custom_qr_code = this.productService.createQRCodeElement({\n                qrcode: this.code,\n                symbol: this.symbol\n            });\n            if (this.symbol == SymbolType.NUMBER_RANGE) {\n                custom_qr_code.variable_data = [this.variable_data_start, this.variable_data_end];\n            }\n            if (this.symbol == SymbolType.CSV_LIST) {\n                custom_qr_code.setCSVData(data);\n            }\n        }, (error) => {\n            this.errors = processRequestError(error);\n        });\n\n        this.code.data_json = JSON.parse(this.code.data_json);\n    }\n}\n\nexport default function DesignToolAddQrCode(): IVueComponent {\n\n    return {\n        controller: AddQrCodeComponentController,\n        template: html,\n        tag: 'design-tool-add-qr'\n    };\n}\n","import {SymbolType} from '../../../models/enums';\n\nexport const html:string = `\n<div class=\"tool-action-header\">\n    <tool-navigation></tool-navigation>\n    <h3 class=\"full-width align-center\">Add Text</h3>\n</div>\n<select-layer-bar :product-service=\"productService\"></select-layer-bar>\n<div class=\"inner-drag-content\">\n    <fieldset class=\"input-group single-option\">\n        <legend>Text Type</legend>\n        <div class=\"toggle-group toggle-sm\">\n            <label for=\"normal-text\">\n                <input id=\"normal-text\" :value=\"${SymbolType.NONE}\" name=\"text-type\" type=\"radio\" v-model=\"new_text_type\" @change=\"resetErrors()\"/>\n                Text\n            </label>\n            <label for=\"number-range-text\">\n                <input id=\"number-range-text\" :value=\"${SymbolType.NUMBER_RANGE}\" name=\"text-type\" type=\"radio\" v-model=\"new_text_type\" @change=\"resetErrors()\"/>\n                Number Range\n            </label>\n            <label for=\"csv-list-text\">\n                <input id=\"csv-list-text\" :value=\"${SymbolType.CSV_LIST}\" name=\"text-type\" type=\"radio\" v-model=\"new_text_type\" @change=\"resetErrors()\"/>\n                CSV List\n            </label>\n        </div>\n    </fieldset>\n    \n    <div class=\"input-group\" v-if=\"new_text_type == ${SymbolType.NONE}\">\n        <label for=\"text-input\">Text</label>\n        <message-list field=\"text\" :errors=\"errors\">\n            <textarea :rows=\"textRows()\" id=\"text-input\" v-model=\"new_text\" placeholder=\"Your text here\"></textarea>\n        </message-list>\n    </div>\n    \n    <div class=\"input-group\" v-if=\"new_text_type == ${SymbolType.CSV_LIST}\">\n        <label for=\"text-input\">CSV File</label>\n        <message-list field=\"text,csv\" :errors=\"errors\">\n            <file-upload :extensions=\"['csv']\" url=\"/custom/api/csv-to-json/\" :success=\"upload_success\" :failure=\"upload_failure\" :auto-reset=\"true\"></file-upload>\n        </message-list>\n    </div>\n    \n    <div class=\"flex-left-center spacing-sm text-sm\" v-if=\"new_text_type == ${SymbolType.CSV_LIST}\">\n        Don't have a CSV file? <button @click=\"blankVariableData()\" class=\"btn-link\">Create one here.</button>\n    </div>\n    \n    <div class=\"flex-left no-wrap\" v-if=\"new_text_type == ${SymbolType.NUMBER_RANGE}\">\n        <div class=\"input-group\">\n            <label for=\"range-start\">Starting value</label>\n            <message-list field=\"symbol_range_start\" :errors=\"errors\">\n                <input type=\"text\" class=\"shorted-text-types full-width\" v-model=\"new_text\" placeholder=\"A-0001\">\n            </message-list>\n        </div>\n        <div class=\"input-group\">\n            <label for=\"range-start\">Ending value</label>\n            <message-list field=\"symbol_range_end\" :errors=\"errors\">\n                <input type=\"text\" class=\"shorted-text-types full-width\" v-model=\"new_text_end\" placeholder=\"A-1000\">\n            </message-list>\n            <i class=\"text-sm text-icon\" v-if=\"rangeQuantity()\">Total quantity: {{ rangeQuantity() }}</i>\n        </div>\n    </div>\n    \n    \n    <button v-if=\"new_text_type != ${SymbolType.CSV_LIST}\" class=\"btn-base btn-primary-action btn-large full-width\" @click=\"addText()\">Add Text</button>\n</div>\n`;","import AbstractDesignToolController from '../AbstractDesignToolController';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './AddText.html';\nimport {data, method} from '../../../../../core/adapters/VueComponent';\nimport {SymbolType} from '../../../models/enums';\nimport {Services} from '../../../../../core/services/Services';\nimport {SelectionManager} from '../../../services/SelectionManager';\nimport {TextElement} from '../../../tool/TextElement';\nimport MessageList from '../../../../../core/utils/MessageList';\nimport {CustomText} from '../../../models/CustomText';\nimport {modal} from \"../../../../../core/utils/Modal\";\nimport {processRequestError} from \"../../../../../core/utils/utils\";\n\nclass DesignToolAddTextController extends AbstractDesignToolController {\n\n    @data()\n    new_text_type: SymbolType;\n\n    @data()\n    new_text: string;\n\n    @data()\n    new_text_end: string;\n\n    custom_text: CustomText;\n\n    constructor(component) {\n        super(component);\n\n        this.new_text_type = SymbolType.NONE;\n        this.custom_text = new (Services.get<typeof CustomText>('CustomText'))();\n    }\n\n    @method()\n    isSingleTextInput() {\n        return this.new_text_type == SymbolType.NONE;\n    }\n\n    @method()\n    resetErrors() {\n        this.errors = new MessageList();\n    }\n\n    validate() {\n        this.errors = new MessageList();\n        if (this.new_text_type == SymbolType.NUMBER_RANGE) {\n            if (!this.new_text || this.new_text.trim() == '') {\n                this.errors.add('symbol_range_start', 'This field is required.')\n            }\n            if (!this.new_text_end || this.new_text_end.trim() == '') {\n                this.errors.add('symbol_range_end', 'This field is required.')\n            }\n        }\n        else if (this.new_text_type == SymbolType.NONE) {\n            if (!this.new_text || !this.new_text.trim()) {\n                this.errors.add('text', 'This field is required');\n            }\n        }\n    }\n\n    @method()\n    addText(csv_data): void {\n        this.validate();\n        if (this.errors.length != 0) {\n            return;\n        }\n\n        let data;\n        if (this.new_text_type == SymbolType.NUMBER_RANGE) {\n            data = {\n                text: 'Number Range',\n                symbol_range_start: this.new_text,\n                symbol_range_end: this.new_text_end,\n                symbol: this.new_text_type\n            }\n        }\n        else if (this.new_text_type == SymbolType.CSV_LIST) {\n            data = {\n                text: 'CSV Data',\n                symbol: this.new_text_type,\n                csv_data: csv_data\n            }\n        }\n        else {\n            data = {\n                text: this.new_text,\n                symbol: this.new_text_type\n            };\n        }\n\n        let text_element = this.productService.createTextElement(data);\n\n        let element = Services.get<SelectionManager>('SelectionManager').selection as TextElement;\n        element.model.maintain_proportion = true;\n        element.font_scale = true;\n        element.auto_scale = false;\n\n        this.new_text = '';\n        this.new_text_end = '';\n        this.new_text_type = SymbolType.NONE;\n    }\n\n    @method()\n    textRows() {\n        if (!this.new_text) {\n            return 2;\n        }\n\n        return Math.max(this.new_text.split('\\n').length, 2);\n    }\n\n    @method()\n    variableDataMessage(type: string) {\n        if (this.productService.configured.defined_quantity) {\n            return 'Only one element of this kind is allowed per design.'\n        }\n        if (type == 'range') {\n            return 'Each product will have a number from a range.'\n        }\n        if (type == 'csv') {\n            return 'Each product will have a value from a list.'\n        }\n    }\n\n    @method()\n    rangeQuantity() {\n        this.custom_text.symbol_range_start = this.new_text;\n        this.custom_text.symbol_range_end = this.new_text_end;\n        this.custom_text.text = this.new_text;\n        this.custom_text.symbol = this.new_text_type;\n        return this.custom_text.range;\n    }\n\n    @method()\n    upload_success(response) {\n        this.productService.add_variable_data_file = response.data;\n        this.productService.add_variable_data_callback = this.addText.bind(this);\n        modal.open('add-variable-data-modal');\n    }\n\n    @method()\n    upload_failure(error) {\n        this.errors = processRequestError(error);\n    }\n\n    @method()\n    blankVariableData() {\n        this.addText(['Data']);\n        setTimeout(() => {\n            modal.open('edit-variable-data-modal');\n        });\n    }\n}\n\n\nexport default function DesignToolAddText(): IVueComponent {\n\n    return {\n        controller: DesignToolAddTextController,\n        template: html,\n        tag: 'design-tool-add-text'\n    };\n}\n","import {ClipTypeEnum} from '../../../models/enums';\n\nexport const html:string = `\n<div class=\"tool-action-header\">\n    <tool-navigation></tool-navigation>\n    <h3 class=\"full-width align-center\">Background</h3>\n</div>\n<div class=\"inner-drag-content\"> \n    <template-setup-options-shapes :side=\"canvas_service.active_side\" :product-service=\"productService\" :show-size=\"true\"></template-setup-options-shapes>\n    <template v-for=\"shape_element in element_manager.shapeElements.filter(v => v.model.template_shape.clip_type != ${ClipTypeEnum.CONTOUR})\">\n        <div class=\"flex-left column full-width stretch spacing-none\">\n            <div class=\"flex-left column no-wrap spacing-none full-width stretch\">\n                <button class=\"inset-section inset-hover btn-clear flex-left-center space-between\" @click=\"shape_element.edit_background = !shape_element.edit_background\">\n                    <div class=\"flex-left no-wrap tool-color-button\">\n                        <div class=\"card flex-full-center no-shrink\" v-if=\"!isSingleColor() && !productService.base.show_material_color\" style=\"height: 44px; width: 44px\">\n                            <div class=\"btn-color circle\" style=\"width: 24px; height: 24px\" :style=\"'background: ' + (shape_element.model.background_shape_fill ? shape_element.model.background_shape_fill.background : shape_element.model.background_shape_custom_fill_color)\"></div>\n                        </div>\n                        <div class=\"btn-material\" v-if=\"!(!isSingleColor() && !productService.base.show_material_color)\">\n                            <div class=\"material-preview\" style=\"width: 44px; height: 44px\" :style=\"'background: ' + (shape_element.model.background_shape_fill ? shape_element.model.background_shape_fill.background : shape_element.model.background_shape_custom_fill_color)\"></div>\n                        </div>\n                        <div class=\"flex-left column no-wrap spacing-xs\">\n                            <b class=\"text-sm\">{{ shape_element.model.name }} Background Color</b>\n                            <span class=\"color-name\">{{ shape_element.model.background_shape_fill ? shape_element.model.background_shape_fill.name : shape_element.model.background_shape_custom_fill_color || 'None' }}</span>\n                        </div>\n                    </div>\n                    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"input-transition\" :class=\"shape_element.edit_background ? 'flip' : ''\">\n                        <path d=\"M6 9L12 15L18 9\" stroke=\"#B9C0D4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                    </svg>\n                </button>\n                <hr class=\"padding-none\" v-show=\"!shape_element.edit_background\">\n                <div class=\"inset-section inset-shadow inset-dropdown\" :class=\"shape_element.edit_background ? 'open' : ''\">\n                    <div class=\"inset-padding flex-left column stretch\">\n                        <tool-element-color v-if=\"!isSingleColor() && !productService.base.show_material_color\" v-model:selected=\"shape_element.model.background_shape_fill\" v-model:custom=\"shape_element.model.background_shape_custom_fill_color\" :colors=\"productService.colors_available\"></tool-element-color>\n                        <tool-element-material-color v-if=\"!isSingleColor() && productService.base.show_material_color\" v-model:selected=\"shape_element.model.background_shape_fill\" :colors=\"productService.colors_available_for_material\" :product-color=\"true\" :change=\"update_product_color\"></tool-element-material-color>\n                        <tool-element-color v-if=\"isSingleColor()\" v-model:selected=\"productService.configured.material_color\" :limited=\"true\" :colors=\"productService.colors_available\"></tool-element-color>\n                    </div>\n                </div>\n            </div>\n            \n            <div class=\"flex-left column no-wrap spacing-none full-width stretch\" v-if=\"shape_element.has_border\">\n                <button class=\"inset-section inset-hover btn-clear flex-left-center space-between\" @click=\"shape_element.edit_border = !shape_element.edit_border\">\n                    <div class=\"flex-left no-wrap tool-color-button\">\n                        <div class=\"card flex-full-center no-shrink\" style=\"height: 44px; width: 44px\">\n                            <div class=\"btn-color circle\" style=\"width: 24px; height: 24px\" :style=\"'background: ' + (shape_element.model.background_shape_border_color ? shape_element.model.background_shape_border_color.background : shape_element.model.background_shape_custom_border_color)\"></div>\n                        </div>\n                        <div class=\"flex-left column no-wrap spacing-xs\">\n                            <b class=\"text-sm\">{{ shape_element.model.name }} Border Color</b>\n                            <span class=\"color-name\">{{ shape_element.model.background_shape_border_color ? shape_element.model.background_shape_border_color.name : shape_element.model.background_shape_custom_border_color || 'None' }}</span>\n                        </div>\n                    </div>\n                    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"input-transition\" :class=\"shape_element.edit_border ? 'flip' : ''\">\n                        <path d=\"M6 9L12 15L18 9\" stroke=\"#B9C0D4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                    </svg>\n                </button>\n                <hr class=\"padding-none\" v-show=\"!shape_element.edit_border\">\n                <div class=\"inset-section inset-shadow inset-dropdown\" :class=\"shape_element.edit_border ? 'open' : ''\">\n                    <div class=\"inset-padding flex-left column stretch\">\n                        <tool-element-color v-model:selected=\"shape_element.model.background_shape_border_color\" v-model:custom=\"shape_element.model.background_shape_custom_border_color\" :colors=\"productService.colors_available\" :change=\"onBorderChange(shape_element)\"></tool-element-color>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"flex-left column spacing-xs\" v-if=\"shape_element.has_border\">\n            <b class=\"text-strong\">Border</b>\n            <div class=\"flex-left column no-wrap spacing-md full-width\">\n                <div class=\"flex-left no-wrap full-width space-between\">\n                    <div class=\"input-group\">\n                        <label>Border Margin</label>\n                        <fieldset class=\"input-group single-option\">\n                            <div class=\"toggle-group\">\n                                <button @click.prevent=\"scaleBorderMargin(shape_element, 0.9)\" class=\"icon-option\">\n                                    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                        <path d=\"M5 12H19\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                    </svg>\n                                </button>\n                                <button @click.prevent=\"scaleBorderMargin(shape_element, 1.10)\" class=\"icon-option\">\n                                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                        <path d=\"M9.99999 4.16663V15.8333M4.16666 9.99996H15.8333\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                    </svg>\n                                </button>\n                            </div>\n                        </fieldset>\n                    </div>\n                    <div class=\"input-group\">\n                        <label>Border Size</label>\n                        <fieldset class=\"input-group single-option\">\n                            <div class=\"toggle-group\">\n                                <button @click.prevent=\"scaleBorder(shape_element, 0.9)\" class=\"icon-option\">\n                                    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                        <path d=\"M5 12H19\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                    </svg>\n                                </button>\n                                <button @click.prevent=\"scaleBorder(shape_element, 1.10)\" class=\"icon-option\">\n                                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                        <path d=\"M9.99999 4.16663V15.8333M4.16666 9.99996H15.8333\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                    </svg>\n                                </button>\n                            </div>\n                        </fieldset>\n                    </div>\n                    <div class=\"input-group\">\n                        <label>Show/Hide</label>\n                        <fieldset class=\"input-group single-option\">\n                            <div class=\"toggle-group\">\n                                <label for=\"show-offset-path\" @click.prevent=\"shape_element.resetBorder()\">\n                                    <input id=\"show-offset-path\" name=\"offset-path-visibility\" type=\"radio\" :checked=\"shape_element.model.background_shape_border\"/>\n                                    <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                        <path d=\"M2.92012 12.7132C2.78394 12.4975 2.71584 12.3897 2.67772 12.2234C2.64909 12.0985 2.64909 11.9015 2.67772 11.7766C2.71584 11.6103 2.78394 11.5025 2.92012 11.2868C4.04553 9.50484 7.3954 5 12.5004 5C17.6054 5 20.9553 9.50484 22.0807 11.2868C22.2169 11.5025 22.285 11.6103 22.3231 11.7766C22.3517 11.9015 22.3517 12.0985 22.3231 12.2234C22.285 12.3897 22.2169 12.4975 22.0807 12.7132C20.9553 14.4952 17.6054 19 12.5004 19C7.3954 19 4.04553 14.4952 2.92012 12.7132Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                        <path d=\"M12.5004 15C14.1573 15 15.5004 13.6569 15.5004 12C15.5004 10.3431 14.1573 9 12.5004 9C10.8435 9 9.5004 10.3431 9.5004 12C9.5004 13.6569 10.8435 15 12.5004 15Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                    </svg>\n                                </label>\n                                <label for=\"show-offset-path\" @click.prevent=\"removeBackgroundBorder(shape_element)\">\n                                    <input id=\"hide-offset-path\" name=\"offset-path-visibility\" type=\"radio\" :checked=\"!shape_element.model.background_shape_border\"/>\n                                    <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                        <path d=\"M11.2429 5.09232C11.6494 5.03223 12.0686 5 12.5004 5C17.6054 5 20.9553 9.50484 22.0807 11.2868C22.2169 11.5025 22.285 11.6103 22.3231 11.7767C22.3518 11.9016 22.3517 12.0987 22.3231 12.2236C22.2849 12.3899 22.2164 12.4985 22.0792 12.7156C21.7793 13.1901 21.3222 13.8571 20.7165 14.5805M7.22432 6.71504C5.06225 8.1817 3.59445 10.2194 2.92111 11.2853C2.78428 11.5019 2.71587 11.6102 2.67774 11.7765C2.6491 11.9014 2.64909 12.0984 2.67771 12.2234C2.71583 12.3897 2.78393 12.4975 2.92013 12.7132C4.04554 14.4952 7.39541 19 12.5004 19C14.5588 19 16.3319 18.2676 17.7888 17.2766M3.50042 3L21.5004 21M10.3791 9.87868C9.8362 10.4216 9.50042 11.1716 9.50042 12C9.50042 13.6569 10.8436 15 12.5004 15C13.3288 15 14.0788 14.6642 14.6217 14.1213\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                    </svg>\n                                </label>\n                            </div>\n                        </fieldset>\n                    </div>\n                </div>\n                <div class=\"inset-section inset-shadow inset-dropdown\" :class=\"edit_color ? 'open' : ''\">\n                    <div class=\"inset-padding flex-left column stretch\">\n                        <tool-element-color :change=\"on_color_change\" v-model:selected=\"productService.configured.offset_path_fill_color\" v-model:custom=\"productService.configured.offset_path_custom_fill_color\" :colors=\"productService.colors_available\"></tool-element-color>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </template>\n    \n    <template v-for=\"clipart in element_manager.editableBackgroundClipartElements\">\n        <tool-clipart-colors :element=\"clipart\"></tool-clipart-colors>\n    </template>\n</div>\n`;\n","import AbstractDesignToolController from '../AbstractDesignToolController';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './BackgroundColors.html';\nimport {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport {CustomClipartRegion} from '../../../models/CustomClipartRegion';\nimport {ClipTypeEnum} from '../../../models/enums';\n\nclass DesignToolBackgroundColorsController extends AbstractDesignToolController {\n\n    @data()\n    update_product_color;\n\n    constructor(props) {\n        super(props);\n\n        this.update_product_color = (color) => {\n            this.productService.configured.material_color = color;\n        }\n    }\n\n    override mounted() {\n        super.mounted();\n        this.selection_manager.bind('click', this.updateSelected.bind(this), this)\n        this.updateSelected();\n    }\n\n    override unmounted() {\n        this.selection_manager.unbindWithContext('click', this);\n        super.unmounted();\n    }\n\n    updateSelected() {\n        if (!this.selection_manager.mouse_down_point) {\n            return;\n        }\n\n        for (const shape of this.element_manager.shapeElements.filter(v => v.model.template_shape.clip_type != ClipTypeEnum.CONTOUR)) {\n            shape['edit_border'] = shape.isBorderSelected(this.selection_manager.mouse_down_point);\n            shape['edit_background'] = !shape['edit_border'] && shape.isBackgroundSelected(this.selection_manager.mouse_down_point);\n        }\n    }\n\n    @method()\n    onBorderChange(item) {\n        return () => {\n            if (!item.model.background_shape_border) {\n                item.resetBorder();\n            }\n        }\n    }\n\n    @method()\n    removeBackgroundBorder(item) {\n        item.model.background_shape_border = false;\n        item.updatePaper();\n    }\n\n    @method()\n    scaleBorder(item, percentage: number) {\n        let new_value =  Math.ceil(item.model.background_shape_border_size * percentage);\n\n        if (item.model.background_shape_border_size != new_value) {\n            item.model.background_shape_border_size = new_value;\n        }\n        else {\n            if (percentage > 1) {\n                item.model.background_shape_border_size += 1;\n            }\n            else {\n                item.model.background_shape_border_size -= 1;\n            }\n        }\n\n        if (item.model.background_shape_border_size > 150) {\n            item.model.background_shape_border_size = 150;\n        }\n        else if (item.model.background_shape_border_size < 0) {\n            item.model.background_shape_border_size = 0;\n        }\n\n        if (item.model.background_shape_border_margin < item.model.background_shape_border_size) {\n            item.model.background_shape_border_margin = item.model.background_shape_border_size;\n        }\n    }\n\n    @method()\n    scaleBorderMargin(item, percentage: number) {\n        item.model.background_shape_border_margin = Math.max(Math.min(item.model.background_shape_border_margin * percentage, 150), item.model.background_shape_border_size)\n    }\n\n    @method()\n    regionStyle(region: CustomClipartRegion) {\n        let color = region.color ? region.color.background : 'transparent';\n\n        return `background: ${color}`;\n    }\n}\n\n\nexport default function DesignToolBackgroundColors(): IVueComponent {\n\n    return {\n        controller: DesignToolBackgroundColorsController,\n        template: html,\n        tag: 'design-tool-background-colors'\n    };\n}\n","import AbstractDesignToolController from '../AbstractDesignToolController';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './Crop.html';\nimport {method} from '../../../../../core/adapters/VueComponent';\nimport {ClipMaskElement} from '../../../tool/ClipMaskElement';\nimport {ClipartElement} from '../../../tool/ClipartElement';\n\nclass DesignToolCropController extends AbstractDesignToolController {\n    @method()\n    changeClipMask($event, clipart) {\n        if ($event) {\n            $event.preventDefault();\n        }\n\n        let _element = this.element as ClipMaskElement;\n        let current_mask = _element.mask;\n\n        let options = {\n            'clipart': clipart,\n            'maintain_proportion': false,\n            'x_scale_inverted': false,\n            'y_scale_inverted': false,\n            'template_clipart': null,\n            'x': current_mask.x,\n            'y': current_mask.y,\n            'z': current_mask.z,\n            'width': current_mask.width,\n            'height': current_mask.height,\n            'regions': null,\n            'rotation': 0\n        };\n\n        // If we are editing a saved mask then we need to remove the clipart from the list so the server can delete it\n        if (current_mask.model.id) {\n            this.productService.configured.clipart_elements.removeItemFromID(current_mask.model.id)\n        }\n\n        let mask_clipart_model = this.productService.createClipartElement(options, false, false);\n        let mask_clipart = new ClipartElement(mask_clipart_model.clipart.clipart, mask_clipart_model);\n        let _old_mask = _element.changeClipMask(mask_clipart);\n\n        let index = this.productService.configured.clipart_elements.indexOf(_old_mask);\n        if (index != -1) {\n            this.productService.configured.clipart_elements.splice(index, 1);\n        }\n\n        this.selection_manager.select(_element);\n        _element.edit_state = true;\n\n        this.$emit('updateSelection');\n        this.selection_manager.drawControls();\n    }\n}\n\n\nexport default function DesignToolCrop(): IVueComponent {\n\n    return {\n        controller: DesignToolCropController,\n        template: html,\n        tag: 'design-tool-crop'\n    };\n}\n","export const html:string = `\n<div class=\"tool-tab\">\n    <label><i class=\"fa fa-crop\"></i> Crop</label>\n    <div class=\"full-width\">\n        <span>Crop Shapes</span>\n        <div class=\"important-options-area\">\n            <div class=\"crop-selection\">\n                <div class=\"crop-item\" :class=\"{'active-mask': element.mask.model.clipart.id == mask.id}\" @click=\"changeClipMask($event, mask)\" v-for=\"mask in productService.clip_mask_elements.items\">\n                    <img :src=\"mask.clipart\">\n                    <span>{{ mask.name }}</span>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n`;","import AbstractDesignToolController from '../AbstractDesignToolController';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './EditClipart.html';\nimport {data, method} from '../../../../../core/adapters/VueComponent';\nimport {CustomMarketplace} from '../../../models/CustomMarketplace';\n\nclass DesignToolEditClipartController extends AbstractDesignToolController {\n\n    @data()\n    toggle_background_callback;\n\n    constructor(component) {\n        super(component);\n\n        this.toggle_background_callback = this.toggleBackground.bind(this);\n    }\n\n    @method()\n    switchClipart($event){\n        if ($event)\n            $event.preventDefault();\n\n        this.productService.element_to_replace = this.element;\n        this.activeTab = 'clipart-new';\n    }\n\n    @method()\n    async toggleBackground() {\n        let selected = this.element;\n        let model: CustomMarketplace = this.element.model;\n\n        if (!model.removed_background && model.artwork && !model.artwork.public_raster_remove_bg) {\n            await model.artwork.removeBackground();\n        }\n\n        model.removed_background = !model.removed_background;\n\n        selected.remove();\n\n        this.productService.addMarketplaceElement(model);\n    }\n}\n\n\nexport default function DesignToolEditClipart(): IVueComponent {\n\n    return {\n        controller: DesignToolEditClipartController,\n        template: html,\n        tag: 'design-tool-edit-clipart'\n    };\n}\n","export const html:string = `\n<div class=\"tool-action-header\">\n    <tool-navigation :active-tab=\"activeTab\"></tool-navigation>\n    <h3 class=\"full-width align-center\">Edit Artwork</h3>\n    <layer-remove></layer-remove>\n</div>\n<div class=\"inner-drag-content\">\n    <div class=\"flex-left column full-width stretch\" v-if=\"isSelectionMarketplace()\">\n        <b>Licensed Graphic</b>\n        <div class=\"flex-full-center full-width\">\n            <div class=\"shutterstock-badge card flex-center spacing-none align-center shadow-sm no-overflow\">\n                <div class=\"slogan\">Powered By Shutterstock</div>\n                <div class=\"artist\">Artist: {{ element.model.artwork.artist.name }}</div>\n            </div>\n        </div>\n    </div>\n\n    <tool-clipart-colors :element=\"element\"></tool-clipart-colors>\n    \n    <template v-if=\"elementHasAdvancedOptions()\">\n        <div class=\"flex-left no-wrap full-width space-between\">\n            <tool-alignment :element=\"element\"></tool-alignment>\n            <tool-layer-position :element=\"element\"></tool-layer-position>\n        </div>\n        <div class=\"flex-left no-wrap full-width space-between\">\n            <element-scale-size :element=\"element\"></element-scale-size>\n            <element-maintain-proportion :element=\"element\"></element-maintain-proportion>    \n        </div>\n        \n        <div class=\"flex-left no-wrap full-width space-between\">\n            <element-fit :element=\"element\"></element-fit>\n            <element-invert :element=\"element\"></element-invert>\n        </div> \n    </template>\n    \n    <element-toggle-background :element=\"element\" :action=\"toggle_background_callback\" v-if=\"isSelectionMarketplace() && !productService.base.disable_remove_background\"></element-toggle-background>\n    \n    <element-offset-path :element=\"element\" :product-service=\"productService\"></element-offset-path>\n    \n    <design-tool-footer-actions\n        :product-service=\"productService\"\n        :element=\"element\"\n        :active-tab=\"activeTab\">\n    </design-tool-footer-actions>\n    \n    <slot></slot>\n</div>\n`;\n","import AbstractDesignToolController from '../AbstractDesignToolController';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './EditFile.html';\nimport {data, method} from '../../../../../core/adapters/VueComponent';\nimport {UserFile} from '../../../models/UserFile';\nimport MessageList from '../../../../../core/utils/MessageList';\nimport {processRequestError} from '../../../../../core/utils/utils';\nimport ButtonProcessingState from '../../../../../core/utils/ButtonProcessingState';\nimport {ClipMaskElement} from '../../../tool/ClipMaskElement';\nimport {ClipartElement} from '../../../tool/ClipartElement';\nimport {Services} from '../../../../../core/services/Services';\nimport {SelectionManager} from '../../../services/SelectionManager';\n\nclass DesignToolEditFileController extends AbstractDesignToolController {\n\n    @data()\n    low_dpi: boolean;\n\n    @data()\n    toggle_background_callback;\n\n    dpi_check: () => void;\n    bound_element;\n\n    constructor(component) {\n        super(component);\n\n        this.toggle_background_callback = this.toggleBackground.bind(this);\n    }\n\n\n    isElementLowQuality() {\n        if (!this.element || !this.element.model.user_file) {\n            return false;\n        }\n\n        let user_file = this.element.model.user_file;\n        if (user_file.original_background_file) {\n            user_file = user_file.original_background_file;\n        }\n\n        if (user_file.is_vector) {\n            return false;\n        }\n\n        let product_size = this.productService.getProductSizeFromCanvas();\n        let used_canvas_size = this.element_manager.getUsedSize();\n\n        if (used_canvas_size.width == 0 || used_canvas_size.height == 0) {\n            return false;\n        }\n\n        let width_percent = this.element.model.width / used_canvas_size.width;\n        let height_percent = this.element.model.height / used_canvas_size.height;\n\n        let element_width = width_percent * product_size.width;\n        let element_height = height_percent * product_size.height;\n\n        let width_dpi = user_file.width / element_width;\n        let height_dpi = user_file.height / element_height;\n\n        return isNaN(width_dpi) || width_dpi < 200;\n    }\n\n    override mounted() {\n        super.mounted();\n\n        this.dpi_check = () => {\n            this.low_dpi = this.isElementLowQuality();\n        }\n\n        this.element.model.bind('change', this.dpi_check, this);\n        if (this.element.raster_loaded && !this.element.raster_loaded.isResolved()) {\n            this.element.raster_loaded.then(this.dpi_check)\n        }\n        this.dpi_check();\n\n        // The selected model can change before unmount is called so we need to keep a reference to remove listeners\n        this.bound_element = this.element;\n    }\n\n    override unmounted() {\n        if (this.bound_element?.model?.unbind) {\n            this.bound_element.model.unbind('change', this.dpi_check);\n        }\n        super.unmounted();\n    }\n\n    @method()\n    switchCustomFile($event) {\n        if ($event) {\n            $event.preventDefault();\n        }\n\n        this.productService.element_to_replace = this.element;\n        this.activeTab = 'upload-new'\n    }\n\n    @method()\n    toggleBackground() {\n        let selected_element = this.element;\n        let user_file: UserFile = selected_element.model.user_file;\n        return user_file.toggleRemoveBackground().then((new_file: UserFile) => {\n            let options = {\n                user_file: new_file,\n                x: selected_element.model.x,\n                y: selected_element.model.y\n            };\n            if (this.productService) {\n                this.productService.createUserFileElement(options);\n                selected_element.remove();\n            }\n        }, (error) => {\n            if (!this.errors) {\n                this.errors = new MessageList();\n            }\n\n            this.errors.merge(processRequestError(error));\n        })\n    }\n\n    @method()\n    toClipMask(clipart) {\n        this.productService.createClipMaskElement(this.element, clipart);\n    }\n\n    @method()\n    removeClipping() {\n        let _element = this.element as ClipMaskElement;\n        let el = this.element.element;\n        _element.remove(false);\n        this.selection_manager.select(el);\n    }\n\n    @method()\n    doneEditingClipping() {\n        let _element = this.element as ClipMaskElement\n        _element.edit_state = false;\n        this.selection_manager.deactivate();\n\n        setTimeout(() => {\n            // Need to get service again since the component will be garbage collected\n            Services.get<SelectionManager>('SelectionManager').select(_element);\n        })\n    }\n\n    @method()\n    editingClipping() {\n        this.element.edit_state = true;\n    }\n}\n\n\nexport default function DesignToolEditFile(): IVueComponent {\n\n    return {\n        controller: DesignToolEditFileController,\n        template: html,\n        tag: 'design-tool-edit-file'\n    };\n}\n","export const html:string = `\n<div class=\"tool-action-header\">\n    <tool-navigation :active-tab=\"activeTab\"></tool-navigation>\n    <h3 class=\"full-width align-center\">Edit File</h3>\n    <layer-remove></layer-remove>\n</div>\n<div class=\"inner-drag-content\">    \n    <div class=\"card warning padded-card-xs flex-left-center no-wrap spacing-sm\" v-if=\"low_dpi\">\n        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <path d=\"M12 9.27445V13.1332M12 16.9919H12.0097M10.6509 4.34657L2.63708 18.0515C2.19258 18.8117 1.97033 19.1917 2.00318 19.5037C2.03183 19.7758 2.17581 20.023 2.39928 20.1839C2.65549 20.3683 3.09907 20.3683 3.98622 20.3683H20.0138C20.9009 20.3683 21.3445 20.3683 21.6007 20.1839C21.8242 20.023 21.9682 19.7758 21.9968 19.5037C22.0297 19.1917 21.8074 18.8117 21.3629 18.0515L13.3491 4.34656C12.9062 3.58913 12.6848 3.21041 12.3959 3.08321C12.1439 2.97226 11.8561 2.97226 11.6041 3.08321C11.3152 3.21041 11.0938 3.58913 10.6509 4.34657Z\" stroke=\"#F79009\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n        </svg>\n        <span class=\"text-sm text-warning\">\n            This image may appear blurry when printed. \n            Reduce the size to improve the resolution or upload a higher quality version.\n        </span>\n    </div>\n    \n    <div class=\"flex-left no-wrap full-width space-between\">\n        <tool-alignment :element=\"element\"></tool-alignment>\n        <tool-layer-position :element=\"element\"></tool-layer-position>\n    </div>\n    \n    <div class=\"flex-left no-wrap full-width space-between\">\n        <element-scale-size :element=\"element\"></element-scale-size>\n        <element-maintain-proportion :element=\"element\"></element-maintain-proportion>\n        <element-fit :element=\"element\"></element-fit>\n    </div>\n    \n    <div class=\"flex-left no-wrap full-width space-between\">\n        <element-invert :element=\"element\"></element-invert>        \n        <element-toggle-background :element=\"element\" :action=\"toggle_background_callback\" v-if=\"element.model.user_file && !element.model.user_file.is_vector && !productService.base.disable_remove_background\"></element-toggle-background>\n    </div>\n    \n    <div class=\"input-group\">\n        <label>Crop Image</label>\n        <fieldset class=\"input-group single-option\">\n            <div class=\"toggle-group\">\n                <label :for=\"'mask-' + mask.id\" class=\"icon-option\" v-for=\"mask in productService.clip_mask_elements.items\" @click.prevent=\"toClipMask(mask)\">\n                    <input :id=\"'mask-' + mask.id\" type=\"radio\" :checked=\"element.mask && element.mask.model.clipart.id == mask.id\">\n                    <img :src=\"mask.clipart\" :alt=\"mask.name\" width=\"20px\" height=\"20px\">\n                </label>\n            </div>\n        </fieldset>\n    </div>\n    \n    <div class=\"flex-left full-width no-wrap\" v-show=\"element.mask\">\n        <button class=\"btn-base btn-secondary-action full-width btn-small\" @click=\"removeClipping()\">\n            <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M14.1667 5.83334L5.83334 14.1667M5.83334 5.83334L14.1667 14.1667\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n            Remove Crop\n        </button>\n        <button class=\"btn-base btn btn-secondary-action full-width btn-small\" @click=\"editingClipping()\" v-show=\"!element.edit_state\">\n            <svg width=\"21\" height=\"20\" viewBox=\"0 0 21 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M16.3333 5.83333V14.1667M4.66667 5.83333V14.1667M14.6667 4.16667L6.33333 4.16667M14.6667 15.8333H6.33333M4.33333 5.83333H5C5.46671 5.83333 5.70007 5.83333 5.87833 5.74251C6.03513 5.66261 6.16261 5.53513 6.24251 5.37833C6.33333 5.20007 6.33333 4.96671 6.33333 4.5V3.83333C6.33333 3.36662 6.33333 3.13327 6.24251 2.95501C6.16261 2.79821 6.03513 2.67072 5.87833 2.59083C5.70007 2.5 5.46671 2.5 5 2.5H4.33333C3.86662 2.5 3.63327 2.5 3.45501 2.59083C3.29821 2.67072 3.17072 2.79821 3.09083 2.95501C3 3.13327 3 3.36662 3 3.83333V4.5C3 4.96671 3 5.20007 3.09083 5.37833C3.17072 5.53513 3.29821 5.66261 3.45501 5.74251C3.63327 5.83333 3.86662 5.83333 4.33333 5.83333ZM4.33333 17.5H5C5.46671 17.5 5.70007 17.5 5.87833 17.4092C6.03513 17.3293 6.16261 17.2018 6.24251 17.045C6.33333 16.8667 6.33333 16.6334 6.33333 16.1667V15.5C6.33333 15.0333 6.33333 14.7999 6.24251 14.6217C6.16261 14.4649 6.03513 14.3374 5.87833 14.2575C5.70007 14.1667 5.46671 14.1667 5 14.1667H4.33333C3.86662 14.1667 3.63327 14.1667 3.45501 14.2575C3.29821 14.3374 3.17072 14.4649 3.09083 14.6217C3 14.7999 3 15.0333 3 15.5V16.1667C3 16.6334 3 16.8667 3.09083 17.045C3.17072 17.2018 3.29821 17.3293 3.45501 17.4092C3.63327 17.5 3.86662 17.5 4.33333 17.5ZM16 5.83333H16.6667C17.1334 5.83333 17.3667 5.83333 17.545 5.74251C17.7018 5.66261 17.8293 5.53513 17.9092 5.37833C18 5.20007 18 4.96671 18 4.5V3.83333C18 3.36662 18 3.13327 17.9092 2.95501C17.8293 2.79821 17.7018 2.67072 17.545 2.59083C17.3667 2.5 17.1334 2.5 16.6667 2.5H16C15.5333 2.5 15.2999 2.5 15.1217 2.59083C14.9649 2.67072 14.8374 2.79821 14.7575 2.95501C14.6667 3.13327 14.6667 3.36662 14.6667 3.83333V4.5C14.6667 4.96671 14.6667 5.20007 14.7575 5.37833C14.8374 5.53513 14.9649 5.66261 15.1217 5.74251C15.2999 5.83333 15.5333 5.83333 16 5.83333ZM16 17.5H16.6667C17.1334 17.5 17.3667 17.5 17.545 17.4092C17.7018 17.3293 17.8293 17.2018 17.9092 17.045C18 16.8667 18 16.6334 18 16.1667V15.5C18 15.0333 18 14.7999 17.9092 14.6217C17.8293 14.4649 17.7018 14.3374 17.545 14.2575C17.3667 14.1667 17.1334 14.1667 16.6667 14.1667H16C15.5333 14.1667 15.2999 14.1667 15.1217 14.2575C14.9649 14.3374 14.8374 14.4649 14.7575 14.6217C14.6667 14.7999 14.6667 15.0333 14.6667 15.5V16.1667C14.6667 16.6334 14.6667 16.8667 14.7575 17.045C14.8374 17.2018 14.9649 17.3293 15.1217 17.4092C15.2999 17.5 15.5333 17.5 16 17.5Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n            Edit Crop\n        </button>\n        <button class=\"btn-base btn btn-secondary-action full-width btn-small\" @click=\"doneEditingClipping()\" v-show=\"element.edit_state\">\n            <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M16.6667 5L7.50001 14.1667L3.33334 10\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n            Apply Crop\n        </button>\n    </div>\n    \n    <element-offset-path :element=\"element\" :product-service=\"productService\"></element-offset-path>\n    \n    <design-tool-footer-actions\n        :product-service=\"productService\"\n        :element=\"element\"\n        :active-tab=\"activeTab\">\n    </design-tool-footer-actions>\n    \n    <slot></slot>\n</div>\n`;\n","import {SymbolType} from '../../../models/enums';\nimport {CodeType, QRCodeType} from '../../../models/QRCode';\n\nexport const html:string = `\n<div class=\"tool-action-header\">\n    <tool-navigation :active-tab=\"activeTab\" :action=\"back_action\"></tool-navigation>\n    <h3 class=\"full-width align-center\">Edit code</h3>\n    <layer-remove></layer-remove>\n</div>\n<div class=\"inner-drag-content\"> \n    <template v-if=\"!edit_state\">\n        <div class=\"flex-left no-wrap full-width\">\n            <element-scale-size :element=\"element\"></element-scale-size>\n            <tool-alignment :element=\"element\"></tool-alignment>\n            <tool-layer-position :element=\"element\"></tool-layer-position>\n        </div>\n        \n        <error-list class=\"warning\" field=\"size\" :errors=\"element.model.errors\"></error-list>\n        \n        <div class=\"input-group\">\n            <h4 v-if=\"element.model.qrcode.code_type == ${CodeType.QR_CODE}\">QR Code Info</h4>\n            <h4 v-if=\"element.model.qrcode.code_type == ${CodeType.BAR_CODE}\">Barcode Info</h4>\n            <div class=\"flex-left no-wrap full-width stretch\">\n            \n                <div class=\"flex-left column no-wrap spacing-xs grow text-wrap\">\n                    <template v-if=\"element.model.symbol == ${SymbolType.CSV_LIST}\">\n                        <div class=\"flex-left column spacing-none\"><b>Data Type:</b> <button class=\"btn-link\" @click=\"editVariableData()\">CSV List</button></div>\n                        <div class=\"flex-left column spacing-none\" v-if=\"element.model.range\"><b>Total quantity:</b> {{ element.model.range }}</div>\n                    </template>\n                    <template v-if=\"element.model.symbol == ${SymbolType.NUMBER_RANGE}\">\n                        <div class=\"flex-left column spacing-none\" v-for=\"item in display_fields.filter(v => element.model.variable_data_start[v.field])\"><b>Starting {{ item.name }}:</b>{{ element.model.variable_data_start[item.field] }}</div>\n                        <div class=\"flex-left column spacing-none\" v-for=\"item in display_fields.filter(v => element.model.variable_data_end[v.field])\"><b>Ending {{ item.name }}:</b>{{ element.model.variable_data_end[item.field] }}</div>\n                        <div class=\"flex-left column spacing-none\" v-if=\"element.model.range\"><b>Total quantity:</b> {{ element.model.range }}</div>\n                    </template>\n                    <template v-if=\"element.model.symbol == ${SymbolType.NONE}\">\n                        <div class=\"flex-left column spacing-none\" v-for=\"item in display_fields.filter(v => element.model.qrcode.data_json[v.field])\"><b>{{ item.name }}</b>{{ element.model.qrcode.data_json[item.field] }}</div>\n                    </template>\n                    <div class=\"flex-left column spacing-none\"><b>Size:</b>{{ size() }}</div>\n                </div>\n                \n                <div class=\"flex-center column no-shrink spacing-sm\">\n                    <div class=\"card padded-card-xs no-shrink light\" style=\"width: 116px; height: 116px;\">\n                        <img width=\"100px\" style=\"aspect-ratio: 1\" v-if=\"element.model.qrcode.id\" :src=\"'/custom/api/v1/qr-clipart/' + element.model.qrcode.id + '.svg'\" alt=\"qr-code\">\n                    </div>\n                    <button class=\"btn-link\" @click=\"edit_state = true\">Edit {{ element.model.qrcode.code_type == ${CodeType.QR_CODE} ? 'QR Code' : 'Bar Code' }}</button>\n                </div>\n            </div>\n        </div>\n        \n        <design-tool-footer-actions\n            :product-service=\"productService\"\n            :element=\"element\"\n            :active-tab=\"activeTab\">\n        </design-tool-footer-actions>\n            \n        <slot></slot>\n    </template>\n    \n    <template v-if=\"edit_state\">\n        <code-form-type :code=\"element.model.qrcode\" :variable-data=\"element.model.symbol\"></code-form-type>\n        \n        <fieldset class=\"input-group single-option\">\n            <legend>Data Type</legend>\n            <div class=\"toggle-group toggle-sm\">\n                <label for=\"normal-text\">\n                    <input id=\"normal-text\" :value=\"${SymbolType.NONE}\" name=\"text-type\" type=\"radio\" v-model=\"element.model.symbol\"/>\n                    Text\n                </label>\n                <label for=\"number-range-text\">\n                    <input id=\"number-range-text\" :value=\"${SymbolType.NUMBER_RANGE}\" name=\"text-type\" type=\"radio\" v-model=\"element.model.symbol\" @change=\"onVariableDataChange()\"/>\n                    Data Range\n                </label>\n                <label for=\"csv-list-text\">\n                    <input id=\"csv-list-text\" :value=\"${SymbolType.CSV_LIST}\" name=\"text-type\" type=\"radio\" v-model=\"element.model.symbol\" @change=\"onVariableDataChange()\"/>\n                    CSV List\n                </label>\n            </div>\n        </fieldset>\n        \n        <code-form-data v-if=\"element.model.symbol == ${SymbolType.NONE}\" :errors=\"element.model.errors\" :code-data=\"element.model.qrcode.data_json\" :bar-code-type=\"element.model.qrcode.barcode_type\" :qr-code-type=\"element.model.qrcode.qrcode_type\" :code-type=\"element.model.qrcode.code_type\"></code-form-data>\n        \n        <code-form-data v-if=\"element.model.symbol == ${SymbolType.NUMBER_RANGE}\" :errors=\"element.model.errors\" :code-data=\"element.model.variable_data_start\" :bar-code-type=\"element.model.qrcode.barcode_type\" :qr-code-type=\"element.model.qrcode.qrcode_type\" :code-type=\"element.model.qrcode.code_type\" :prefix=\"'Starting '\"></code-form-data>\n        <code-form-data v-if=\"element.model.symbol == ${SymbolType.NUMBER_RANGE}\" :errors=\"element.model.errors\" :code-data=\"element.model.variable_data_end\" :bar-code-type=\"element.model.qrcode.barcode_type\" :qr-code-type=\"element.model.qrcode.qrcode_type\" :code-type=\"element.model.qrcode.code_type\" :prefix=\"'Ending '\"></code-form-data>\n                \n        <div class=\"input-group\" v-if=\"element.model.symbol == ${SymbolType.CSV_LIST}\">\n            <label for=\"text-input\">CSV File</label>\n            <message-list field=\"text,csv\" :errors=\"errors\">\n                <file-upload :extensions=\"['csv']\" url=\"/custom/api/csv-to-json/\" :success=\"upload_success\" :failure=\"upload_failure\" :auto-reset=\"true\"></file-upload>\n            </message-list>\n        </div>\n        \n        <i class=\"text-sm text-icon\" v-if=\"(element.model.symbol == ${SymbolType.NUMBER_RANGE}) && element.model.range\">Total quantity: {{ element.model.range }}</i>\n        \n        <button class=\"btn-base btn-secondary-action full-width\" v-if=\"element.model.symbol != ${SymbolType.CSV_LIST}\" @click=\"saveCode()\">Save Changes</button>\n    </template>\n</div>\n`;\n","import AbstractDesignToolController from '../AbstractDesignToolController';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './EditQRCode.html';\nimport {data, method} from '../../../../../core/adapters/VueComponent';\nimport {CustomQRCode} from '../../../models/CustomQRCode';\nimport {processRequestError} from '../../../../../core/utils/utils';\nimport {SymbolType} from '../../../models/enums';\nimport {CodeType, QRCodeType} from '../../../models/QRCode';\nimport {modal} from \"../../../../../core/utils/Modal\";\nimport MessageList from \"../../../../../core/utils/MessageList\";\n\nclass DesignToolEditQRCodeController extends AbstractDesignToolController {\n\n    @data()\n    show_type_option: boolean;\n\n    @data()\n    paste_data: string;\n\n    @data()\n    edit_state: boolean;\n\n    timeout_id;\n\n    @data()\n    variable_data_csv;\n\n    @data()\n    display_fields = [\n        {name: 'Name', field: 'name'},\n        {name: 'Title', field: 'title'},\n        {name: 'Email', field: 'email'},\n        {name: 'Home Telephone', field: 'phone_home'},\n        {name: 'Home Address', field: 'home_address_1'},\n        {name: 'Home City', field: 'home_city'},\n        {name: 'Home State', field: 'home_state'},\n        {name: 'Home Zip', field: 'home_zip'},\n        {name: 'Home Country', field: 'home_country'},\n        {name: 'Company', field: 'company'},\n        {name: 'Work Phone', field: 'phone_work'},\n        {name: 'Work Address', field: 'work_address_1'},\n        {name: 'Work City', field: 'work_city'},\n        {name: 'Work State', field: 'work_state'},\n        {name: 'Work Zip', field: 'work_zip'},\n        {name: 'Work Country', field: 'work_country'},\n        {name: 'Website URL', field: 'url'},\n        {name: 'Text Cell Phone Number', field: 'sms'},\n        {name: 'Text Message', field: 'smsm'},\n        {name: 'Custom', field: 'custom'},\n        {name: 'Type', field: 'barcode_type_name'},\n        {name: 'Value', field: 'value'}\n    ]\n\n    @data()\n    back_action;\n\n    constructor(component) {\n        super(component);\n\n        this.back_action = () => {\n            if (this.edit_state) {\n                this.edit_state = false;\n                return true;\n            }\n            return false;\n        }\n    }\n\n    @method()\n    saveCode() {\n        this.element.model.qrcode.data_json = JSON.stringify(this.element.model.variable_data[0]);\n\n        this.element.model.qrcode.save().then(() => {\n            this.edit_state = !this.edit_state;\n            this.element.setup(this.element.model.qrcode.svg);\n        });\n\n        this.element.model.qrcode.data_json = JSON.parse(this.element.model.qrcode.data_json);\n    }\n\n    override beforeMount() {\n        super.beforeMount();\n\n        this.element.model.qrcode.bind('change:qrcode_type', () => {\n            if (this.element.model.qrcode.qrcode_type == QRCodeType.TEXT_MESSAGE || this.element.model.qrcode.qrcode_type == QRCodeType.CONTACT) {\n                this.element.model.symbol = SymbolType.NONE;\n            }\n        }, this);\n    }\n\n    @method()\n    variableDataMessage(type: string) {\n        if (this.productService.configured.defined_quantity && this.element.model.symbol == SymbolType.NONE) {\n            return 'Only one element of this kind is allowed per design.'\n        }\n        if (type == 'range') {\n            return 'Each product will have a number from a range.'\n        }\n        if (type == 'csv') {\n            return 'Each product will have a value from a list.'\n        }\n    }\n\n    @method()\n    onVariableDataChange() {\n        if (this.element.model.symbol == SymbolType.NUMBER_RANGE) {\n            this.element.model.variable_data = [Object.create(null), Object.create(null)];\n        }\n        else if (this.element.model.symbol == SymbolType.NONE) {\n            this.element.model.variable_data = [];\n        }\n    }\n\n    onSizeChange() {\n        clearTimeout(this.timeout_id);\n        this.timeout_id = setTimeout(() => {\n            this.productService.validateCodeSizes();\n            this.$forceUpdate();\n        }, 100);\n    }\n\n    override mounted() {\n        super.mounted();\n\n        this.element.model.bind('change:x', this.onSizeChange.bind(this), this);\n        this.element.model.bind('change:y', this.onSizeChange.bind(this), this);\n\n        this.productService.validateCodeSizes();\n\n        // Needed for the size to display correctly\n        this.element.once('updatePaper', () => {\n            this.$forceUpdate();\n        }, this);\n    }\n\n    @method()\n    dataKeys() {\n        let model: CustomQRCode = this.element.model;\n\n        if (!model.variable_data || model.variable_data.length == 0) {\n            return [];\n        }\n\n        return Object.keys(model.variable_data[0]);\n    }\n\n    @method()\n    addRow() {\n        let item = {};\n\n        for (const row of this.dataKeys()) {\n            item[row] = '';\n        }\n\n        // Just in case something broke, reset it\n        if (!this.element.model.variable_data) {\n            this.element.model.variable_data = [this.element.model.qrcode.data_json];\n        }\n\n        this.element.model.variable_data.push(item);\n    }\n\n    @method()\n    toReadableName(item) {\n        return item.split('_').join(' ')\n    }\n\n    @method()\n    size() {\n        let size = this.element.measurements(this.productService.width, this.productService.height);\n        return `${Number(size.width).toFixed(2)}\"x${Number(size.height).toFixed(2)}`\n    }\n\n    @method()\n    variableDataEnabled() {\n        if (this.productService.configured.defined_quantity && this.element.model.symbol == SymbolType.NONE) {\n            return false;\n        }\n        if (this.element.model.qrcode.code_type == CodeType.BAR_CODE) {\n            return true;\n        }\n        return !(this.element.model.qrcode.qrcode_type == QRCodeType.TEXT_MESSAGE || this.element.model.qrcode.qrcode_type == QRCodeType.CONTACT);\n    }\n\n    @method()\n    upload_failure(error) {\n        this.errors = MessageList.fromRequest(error);\n    }\n\n    @method()\n    upload_success(response) {\n        this.productService.add_variable_data_file = response.data;\n        this.productService.add_variable_data_callback = (data) => {\n            if (data) {\n                this.element.model.setCSVData(data);\n                this.saveCode();\n            }\n        }\n        modal.open('add-variable-data-modal');\n    }\n\n    @method()\n    editVariableData() {\n        modal.open('edit-variable-data-modal')\n    }\n}\n\n\nexport default function DesignToolEditQRCode(): IVueComponent {\n    return {\n        controller: DesignToolEditQRCodeController,\n        template: html,\n        tag: 'design-tool-edit-qr'\n    };\n}\n","import {SymbolType} from '../../../models/enums';\n\nexport const html:string = `\n<div class=\"tool-action-header\">\n    <tool-navigation></tool-navigation>\n    <h3 class=\"full-width align-center\">Edit Text</h3>\n    <layer-remove></layer-remove>\n</div>\n<div class=\"inner-drag-content\">\n    <fieldset class=\"input-group single-option\">\n        <legend>Text Type</legend>\n        <div class=\"toggle-group toggle-sm\">\n            <label for=\"normal-text\">\n                <input id=\"normal-text\" :value=\"${SymbolType.NONE}\" name=\"text-type\" type=\"radio\" v-model=\"element.model.symbol\" @change=\"fillInDataDefaults\"/>\n                Text\n            </label>\n            <label for=\"number-range-text\">\n                <input id=\"number-range-text\" :value=\"${SymbolType.NUMBER_RANGE}\" name=\"text-type\" type=\"radio\" v-model=\"element.model.symbol\" @change=\"fillInDataDefaults\"/>\n                Number Range\n            </label>\n            <label for=\"csv-list-text\">\n                <input id=\"csv-list-text\" :value=\"${SymbolType.CSV_LIST}\" name=\"text-type\" type=\"radio\" v-model=\"element.model.symbol\" @change=\"fillInDataDefaults\"/>\n                CSV List\n            </label>\n        </div>\n    </fieldset>\n    \n    <div class=\"input-group\" v-if=\"!elementIsRange() && !elementIsCSV()\">\n        <label>{{ textTypeDisplay() }}</label>\n        <textarea id=\"text-focus\" :rows=\"textRows()\" v-model=\"element.model.text\"></textarea>\n        <i class=\"text-sm text-icon\" v-if=\"(element.model.symbol == ${SymbolType.NUMBER_RANGE} || element.model.symbol == ${SymbolType.CSV_LIST}) && element.model.range\">Total quantity: {{ element.model.range }}</i>\n    </div>\n    \n    <div class=\"input-group\" v-if=\"elementIsCSV() && !csv_upload_state\">\n        <label>{{ textTypeDisplay() }}</label>\n        <message-list :warnings=\"csvErrors()\" field=\"__all__\"></message-list>\n        <div class=\"card no-overflow\">\n            <div class=\"table-responsive\" style=\"max-height: 200px; overflow: scroll;\">\n                <table class=\"table table-transparent-body table-sm\" style=\"table-layout: fixed;\">\n                    <thead>\n                        <tr>\n                            <th style=\"width: 80px\">Row</th>\n                            <th>Data</th>\n                        </tr>\n                    </thead>\n                    <tbody v-for=\"index in $filters.range(0, productService.quantity)\">\n                        <tr>\n                            <th>\n                                <button class=\"btn-link plain-link\" @click=\"productService.viewRow(index)\" :class=\"{'strong': productService.visible_row == index}\" v-tooltip :tooltip-content=\"'View Row'\">\n                                    {{ index + 1 }}\n                                </button>\n                            </th>\n                            <td :class=\"{empty: !String(element.model.csv_data?.[index] ?? '').trim()}\">\n                                {{ element.model.csv_data?.[index] ?? '' }}\n                            </td>\n                        </tr>\n                    </tbody>\n                </table>\n            </div>\n        </div>\n    </div>\n    \n    <div class=\"input-group\" v-if=\"elementIsCSV() && csv_upload_state\">\n        <label for=\"text-input\">CSV File</label>\n        <message-list field=\"text,csv\" :errors=\"errors\">\n            <file-upload :extensions=\"['csv']\" url=\"/custom/api/csv-to-json/\" :success=\"upload_success\" :failure=\"upload_failure\" :auto-reset=\"true\"></file-upload>\n        </message-list>\n        <button class=\"btn-base btn-secondary-action full-width\" @click=\"csv_upload_state = false\">Cancel</button>\n    </div>\n    \n    <div class=\"input-group\" v-if=\"elementIsCSV() && !csv_upload_state\">\n        <label>CSV Actions</label>\n        <div class=\"flex-left no-wrap\">\n            <button class=\"btn-base btn-secondary-action full-width\" @click=\"variableDataModal()\">Edit</button>\n            <button class=\"btn-base btn-secondary-action full-width\" @click=\"csv_upload_state = true\">Replace</button>\n        </div>\n    </div>\n    \n    <div class=\"input-group\" v-if=\"elementIsRange()\">\n        <label>Starting Value</label>\n        <message-list :errors=\"errors\" field=\"range_start\">\n            <input id=\"text-focus\" v-model=\"element.model.symbol_range_start\" @change=\"checkRange()\">\n        </message-list>\n    </div>\n    \n    <div class=\"input-group\" v-if=\"elementIsRange()\">\n        <label>Ending Value</label>\n        <message-list field=\"range,range_end\" :warnings=\"warnings\" :errors=\"errors\">\n            <input v-model=\"element.model.symbol_range_end\"  @change=\"checkRange()\">\n        </message-list>\n        <i class=\"text-sm text-icon\" v-if=\"(element.model.symbol == ${SymbolType.NUMBER_RANGE} || element.model.symbol == ${SymbolType.CSV_LIST}) && element.model.range\">Total quantity: {{ element.model.range }}</i>\n    </div>\n    \n    <div class=\"flex-left spacing-xs no-wrap full-width space-between\">\n        <div class=\"input-group full-width\">\n            <label>Font</label>\n            <div class=\"flex-left no-wrap spacing-xs\">\n                <font-dropdown :items=\"productService.font_service.combined_fonts\" v-model:selected=\"element.model.font\"></font-dropdown>\n            </div>\n        </div>\n        <div class=\"input-group full-width\" v-if=\"element.model.font && element.model.font.versions.length > 0\">\n            <label>Weight</label>\n            <div class=\"flex-left no-wrap spacing-xs\">\n                <generic-dropdown :items=\"element.model.font.versions\" v-model:selected=\"element.model.font_version\" :name-function=\"font_version_name\" :none=\"element.model.font.subfamily\"></generic-dropdown>\n            </div>\n        </div>\n        <div class=\"input-group fit-width\">\n            <label>&nbsp;</label>\n            <button class=\"btn-base btn-secondary-action\" @click=\"openFontModal()\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M21 21L16.65 16.65M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z\" stroke=\"#667085\"\n                          stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n        </div>\n    </div>\n    \n    <div class=\"flex-left no-wrap full-width space-between\">\n        <div class=\"input-group fit-content\">\n            <label>Color</label>\n            <button class=\"btn-base btn-secondary-action btn-square\" @click=\"edit_text_color = !edit_text_color\">\n                <div class=\"color-circle circle no-shrink\" style=\"background-size: cover\" :style=\"{'background': isSingleColor() && productService.configured.material_color ? productService.configured.material_color.background : element.model.color_code}\"></div>\n            </button>\n        </div>\n        <element-scale-size style=\"width: 33%\" :element=\"element\"></element-scale-size>\n        <tool-text-alignment style=\"width: 66%\" :element=\"element\"></tool-text-alignment>\n    </div>\n    \n    <div>    \n        <div class=\"inset-section inset-shadow inset-dropdown\" :class=\"edit_text_color ? 'open' : ''\">\n            <div class=\"inset-padding flex-left column stretch\">\n                <tool-element-color v-if=\"!isSingleColor()\" :limited=\"productService.base.disable_custom_colors\" v-model:selected=\"element.model.color\" v-model:custom=\"element.model.custom_color\" :colors=\"productService.colors_available\"></tool-element-color>\n                <tool-element-color v-if=\"isSingleColor()\" :limited=\"true\" v-model:selected=\"productService.configured.material_color\" :colors=\"productService.colors_available\"></tool-element-color>\n                <hr v-if=\"!isSingleColor() && !productService.base.disable_stroke && !element.model.definesQuantity && !productService.base.disable_custom_colors\">\n                <div class=\"flex-left column spacing-xs\" v-if=\"!isSingleColor() && !productService.base.disable_stroke && !element.model.definesQuantity && !productService.base.disable_custom_colors\">\n                    <b>Stroke Options</b>\n                    <div class=\"flex-left no-wrap full-width space-between\">\n                        <div class=\"input-group fit-content\">\n                            <label>Color</label>\n                            <button class=\"btn-base btn-secondary-action btn-square\" @click=\"edit_stroke = !edit_stroke\">\n                                <div class=\"color-circle circle no-shrink\" style=\"background-size: cover\" :style=\"{'background': element.model.strokeColor ? element.model.strokeColor : element.model.custom_stroke_color}\"></div>\n                            </button>\n                        </div>\n                        <div class=\"input-group\">\n                            <label>Size</label>\n                            <fieldset class=\"input-group single-option\">\n                                <div class=\"toggle-group\">\n                                    <button @click.prevent=\"changeStrokeWidth(element.model, -1)\" class=\"icon-option\">\n                                        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                            <path d=\"M5 12H19\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                        </svg>\n                                    </button>\n                                    <button @click.prevent=\"changeStrokeWidth(element.model, 1)\" class=\"icon-option\">\n                                        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                            <path d=\"M9.99999 4.16663V15.8333M4.16666 9.99996H15.8333\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                        </svg>\n                                    </button>\n                                </div>\n                            </fieldset>\n                        </div>\n                        <div class=\"input-group\">\n                            <label>Remove Stroke</label>\n                            <button class=\"btn-base btn-secondary-action\" @click=\"element.model.removeStroke()\">\n                                <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                    <path d=\"M13.3333 4.99984V4.33317C13.3333 3.39975 13.3333 2.93304 13.1517 2.57652C12.9919 2.26292 12.7369 2.00795 12.4233 1.84816C12.0668 1.6665 11.6001 1.6665 10.6667 1.6665H9.33333C8.39991 1.6665 7.9332 1.6665 7.57668 1.84816C7.26308 2.00795 7.00811 2.26292 6.84832 2.57652C6.66667 2.93304 6.66667 3.39975 6.66667 4.33317V4.99984M8.33333 9.58317V13.7498M11.6667 9.58317V13.7498M2.5 4.99984H17.5M15.8333 4.99984V14.3332C15.8333 15.7333 15.8333 16.4334 15.5608 16.9681C15.3212 17.4386 14.9387 17.821 14.4683 18.0607C13.9335 18.3332 13.2335 18.3332 11.8333 18.3332H8.16667C6.76654 18.3332 6.06647 18.3332 5.53169 18.0607C5.06129 17.821 4.67883 17.4386 4.43915 16.9681C4.16667 16.4334 4.16667 15.7333 4.16667 14.3332V4.99984\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                </svg>\n                                Remove\n                            </button>\n                        </div>\n                    </div>\n                </div>\n                <tool-element-color v-if=\"!isSingleColor() && !productService.base.disable_stroke && !element.model.definesQuantity && edit_stroke\" v-model:selected=\"element.model.strokeColor\" v-model:custom=\"element.model.custom_stroke_color\" :colors=\"productService.colors_available\"></tool-element-color>\n            </div>\n        </div>\n    </div>\n    \n    <div class=\"flex-left no-wrap full-width\">\n        <div class=\"input-group\" v-show=\"!element.model.isVariableData()\">\n            <label>Text Arc</label>\n            <fieldset class=\"input-group single-option\" v-if=\"usePathIcons()\">\n                <div class=\"toggle-group\">\n                    <button @click=\"element.model.path = item\" class=\"icon-option\" v-for=\"item in productService.text_paths.items.filter(v => v.order <= 0)\" :class=\"{selected: element.model.path && element.model.path.id == item.id}\">\n                        <span v-html=\"item.icon\"></span>\n                    </button>\n                    <button @click=\"element.model.path = null\" class=\"icon-option\" :class=\"{selected: element.model.path == null}\">\n                        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                            <path d=\"M22.474 16H1.52574C1.2389 16 0.999878 15.7741 0.999878 15.4824C0.999878 15.1906 1.22934 14.9647 1.52574 14.9647H22.474C22.7609 14.9647 22.9999 15.1906 22.9999 15.4824C22.9999 15.7741 22.7704 16 22.474 16Z\" fill=\"var(--icon-strong, #98A2B3)\"/>\n                            <path d=\"M3.89687 13.1765L5.88558 8.09414H6.62178L8.73477 13.1765H7.96033L7.35798 11.633H5.19718L4.63308 13.1765H3.89687ZM5.3884 11.0871H7.13807L6.60265 9.67531C6.44012 9.25178 6.31582 8.89414 6.23933 8.6212C6.17241 8.95061 6.0768 9.27061 5.96206 9.59061L5.39796 11.0777L5.3884 11.0871Z\" fill=\"var(--icon-strong, #98A2B3)\"/>\n                            <path d=\"M10.2933 13.1765V8.09414H12.2342C12.6262 8.09414 12.9417 8.1412 13.1807 8.24473C13.4197 8.34825 13.6014 8.50825 13.7448 8.71531C13.8882 8.92237 13.9456 9.15767 13.9456 9.38355C13.9456 9.60002 13.8882 9.80708 13.7639 9.99531C13.6396 10.1835 13.4675 10.3435 13.219 10.4565C13.5345 10.5506 13.7735 10.7012 13.936 10.9177C14.0986 11.1341 14.1846 11.3883 14.1846 11.6894C14.1846 11.9247 14.1368 12.1506 14.0316 12.3577C13.9265 12.5647 13.8022 12.7247 13.6492 12.8282C13.4962 12.9318 13.3146 13.0259 13.0851 13.0824C12.8556 13.1388 12.5784 13.1671 12.2533 13.1671H10.2837L10.2933 13.1765ZM10.9817 10.2306H12.1003C12.4063 10.2306 12.6166 10.2118 12.7505 10.1741C12.9226 10.1271 13.0564 10.0424 13.1425 9.92002C13.2285 9.79766 13.2763 9.65649 13.2763 9.47767C13.2763 9.29884 13.2381 9.15767 13.152 9.03531C13.066 8.91296 12.9512 8.81884 12.7983 8.77178C12.6453 8.72473 12.3871 8.69649 12.0143 8.69649H10.9817V10.2306ZM10.9817 12.5741H12.2724C12.4923 12.5741 12.6453 12.5741 12.7409 12.5459C12.8939 12.5177 13.0277 12.4706 13.1329 12.4047C13.2381 12.3388 13.3241 12.2447 13.3911 12.1224C13.458 12 13.4962 11.8588 13.4962 11.6894C13.4962 11.5012 13.4484 11.3318 13.3528 11.1906C13.2572 11.0494 13.1138 10.9553 12.9417 10.8988C12.7696 10.8424 12.5114 10.8141 12.1864 10.8141H10.9912V12.5647L10.9817 12.5741Z\" fill=\"var(--icon-strong, #98A2B3)\"/>\n                            <path d=\"M19.6343 11.3976L20.3132 11.5671C20.1698 12.1223 19.9116 12.5365 19.5387 12.8282C19.1659 13.12 18.7069 13.2612 18.1715 13.2612C17.6361 13.2612 17.158 13.1482 16.8138 12.9223C16.4696 12.6965 16.2019 12.3765 16.0203 11.9529C15.8386 11.5294 15.743 11.0776 15.743 10.5882C15.743 10.0612 15.8482 9.6 16.049 9.2047C16.2497 8.80941 16.5461 8.50823 16.9286 8.31059C17.311 8.11294 17.7221 8 18.1811 8C18.6974 8 19.1276 8.13176 19.4814 8.38588C19.8351 8.64 20.0837 9.00706 20.2176 9.47765L19.5483 9.63764C19.424 9.27059 19.2519 8.99765 19.0224 8.82823C18.793 8.65882 18.5061 8.57412 18.1619 8.57412C17.7604 8.57412 17.4353 8.66823 17.1676 8.85647C16.8999 9.0447 16.7182 9.29882 16.6035 9.60941C16.4888 9.92 16.441 10.2494 16.441 10.5882C16.441 11.0212 16.5079 11.3976 16.6322 11.7176C16.7565 12.0376 16.9573 12.2823 17.225 12.4423C17.4927 12.6023 17.7891 12.6776 18.1046 12.6776C18.487 12.6776 18.8121 12.5647 19.0798 12.3482C19.3475 12.1318 19.5292 11.8118 19.6152 11.3788L19.6343 11.3976Z\" fill=\"var(--icon-strong, #98A2B3)\"/>\n                            <path d=\"M22.474 16H1.52574C1.2389 16 0.999878 15.7741 0.999878 15.4824C0.999878 15.1906 1.22934 14.9647 1.52574 14.9647H22.474C22.7609 14.9647 22.9999 15.1906 22.9999 15.4824C22.9999 15.7741 22.7704 16 22.474 16Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"0.75\" stroke-linejoin=\"round\"/>\n                            <path d=\"M3.89687 13.1765L5.88558 8.09414H6.62178L8.73477 13.1765H7.96033L7.35798 11.633H5.19718L4.63308 13.1765H3.89687ZM5.3884 11.0871H7.13807L6.60265 9.67531C6.44012 9.25178 6.31582 8.89414 6.23933 8.6212C6.17241 8.95061 6.0768 9.27061 5.96206 9.59061L5.39796 11.0777L5.3884 11.0871Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"0.75\" stroke-linejoin=\"round\"/>\n                            <path d=\"M10.2933 13.1765V8.09414H12.2342C12.6262 8.09414 12.9417 8.1412 13.1807 8.24473C13.4197 8.34825 13.6014 8.50825 13.7448 8.71531C13.8882 8.92237 13.9456 9.15767 13.9456 9.38355C13.9456 9.60002 13.8882 9.80708 13.7639 9.99531C13.6396 10.1835 13.4675 10.3435 13.219 10.4565C13.5345 10.5506 13.7735 10.7012 13.936 10.9177C14.0986 11.1341 14.1846 11.3883 14.1846 11.6894C14.1846 11.9247 14.1368 12.1506 14.0316 12.3577C13.9265 12.5647 13.8022 12.7247 13.6492 12.8282C13.4962 12.9318 13.3146 13.0259 13.0851 13.0824C12.8556 13.1388 12.5784 13.1671 12.2533 13.1671H10.2837L10.2933 13.1765ZM10.9817 10.2306H12.1003C12.4063 10.2306 12.6166 10.2118 12.7505 10.1741C12.9226 10.1271 13.0564 10.0424 13.1425 9.92002C13.2285 9.79766 13.2763 9.65649 13.2763 9.47767C13.2763 9.29884 13.2381 9.15767 13.152 9.03531C13.066 8.91296 12.9512 8.81884 12.7983 8.77178C12.6453 8.72473 12.3871 8.69649 12.0143 8.69649H10.9817V10.2306ZM10.9817 12.5741H12.2724C12.4923 12.5741 12.6453 12.5741 12.7409 12.5459C12.8939 12.5177 13.0277 12.4706 13.1329 12.4047C13.2381 12.3388 13.3241 12.2447 13.3911 12.1224C13.458 12 13.4962 11.8588 13.4962 11.6894C13.4962 11.5012 13.4484 11.3318 13.3528 11.1906C13.2572 11.0494 13.1138 10.9553 12.9417 10.8988C12.7696 10.8424 12.5114 10.8141 12.1864 10.8141H10.9912V12.5647L10.9817 12.5741Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"0.75\" stroke-linejoin=\"round\"/>\n                            <path d=\"M19.6343 11.3976L20.3132 11.5671C20.1698 12.1223 19.9116 12.5365 19.5387 12.8282C19.1659 13.12 18.7069 13.2612 18.1715 13.2612C17.6361 13.2612 17.158 13.1482 16.8138 12.9223C16.4696 12.6965 16.2019 12.3765 16.0203 11.9529C15.8386 11.5294 15.743 11.0776 15.743 10.5882C15.743 10.0612 15.8482 9.6 16.049 9.2047C16.2497 8.80941 16.5461 8.50823 16.9286 8.31059C17.311 8.11294 17.7221 8 18.1811 8C18.6974 8 19.1276 8.13176 19.4814 8.38588C19.8351 8.64 20.0837 9.00706 20.2176 9.47765L19.5483 9.63764C19.424 9.27059 19.2519 8.99765 19.0224 8.82823C18.793 8.65882 18.5061 8.57412 18.1619 8.57412C17.7604 8.57412 17.4353 8.66823 17.1676 8.85647C16.8999 9.0447 16.7182 9.29882 16.6035 9.60941C16.4888 9.92 16.441 10.2494 16.441 10.5882C16.441 11.0212 16.5079 11.3976 16.6322 11.7176C16.7565 12.0376 16.9573 12.2823 17.225 12.4423C17.4927 12.6023 17.7891 12.6776 18.1046 12.6776C18.487 12.6776 18.8121 12.5647 19.0798 12.3482C19.3475 12.1318 19.5292 11.8118 19.6152 11.3788L19.6343 11.3976Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"0.75\" stroke-linejoin=\"round\"/>\n                        </svg>\n                    </button>\n                    <button @click=\"element.model.path = item\" class=\"icon-option\" v-for=\"item in productService.text_paths.items.filter(v => v.order > 0)\" :class=\"{selected: element.model.path && element.model.path.id == item.id}\">\n                        <span v-html=\"item.icon\"></span>\n                    </button>\n                </div>\n            </fieldset>\n            <generic-dropdown v-if=\"!usePathIcons()\" :items=\"productService.text_paths.items\" v-model:selected=\"element.model.path\" none=\"Straight\"></generic-dropdown>\n        </div>\n        \n        <div class=\"input-group\" style=\"width: 50%\" v-show=\"!element.model.isVariableData() && element.model.path\">\n            <label>Text Arc Size</label>\n            <fieldset class=\"input-group single-option\">\n                <div class=\"toggle-group\">\n                    <button @click=\"element.model.path_scale = element.model.path_scale * 1.05\" class=\"icon-option\">\n                        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                            <path d=\"M9.99999 4.16663V15.8333M4.16666 9.99996H15.8333\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                        </svg>\n                    </button>\n                    <button @click=\"element.model.path_scale = element.model.path_scale * 0.95\" class=\"icon-option\">\n                        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                            <path d=\"M5 12H19\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                        </svg>\n                    </button>\n                </div>\n            </fieldset>\n        </div>\n        \n        <element-maintain-proportion style=\"width: 50%\" v-show=\"!element.model.path\" :element=\"element\" :on-change=\"proportions_callback\"></element-maintain-proportion>\n    </div>\n    \n    <div class=\"flex-left no-wrap full-width\">\n        <tool-alignment :element=\"element\"></tool-alignment>\n        <tool-layer-position :element=\"element\"></tool-layer-position>\n    </div>\n    \n    <element-offset-path :element=\"element\" :product-service=\"productService\"></element-offset-path>\n    \n    <design-tool-footer-actions\n        :product-service=\"productService\"\n        :element=\"element\"\n        :active-tab=\"activeTab\">\n    </design-tool-footer-actions>\n        \n    <slot></slot>\n</div>\n`;\n","import AbstractDesignToolController from '../AbstractDesignToolController';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './EditText.html';\nimport {data, method} from '../../../../../core/adapters/VueComponent';\nimport {SymbolType} from '../../../models/enums';\nimport MessageList from '../../../../../core/utils/MessageList';\nimport {modal} from \"../../../../../core/utils/Modal\";\nimport {FontService} from \"../../../services/FontService\";\nimport {Services} from \"../../../../../core/services/Services\";\nimport {Font} from \"../../../models/Font\";\nimport {FontVersion} from \"../../../models/FontVersion\";\nimport {processRequestError} from \"../../../../../core/utils/utils\";\n\nclass DesignToolEditTextController extends AbstractDesignToolController {\n\n    @data()\n    show_stroke: boolean;\n\n    @data()\n    in_advanced: boolean;\n\n    @data()\n    show_text_type_option: boolean;\n\n    @data()\n    warnings: MessageList;\n\n    @data()\n    edit_text_color: boolean;\n\n    @data()\n    proportions_callback;\n\n    @data()\n    edit_stroke: boolean;\n\n    @data()\n    font_version_name;\n\n    @data()\n    csv_upload_state: boolean;\n\n    constructor(c) {\n        super(c);\n        this.proportions_callback = () => {\n            if (!this.element) {\n                return;\n            }\n\n            this.element.font_scale = this.element.maintain_proportion;\n            this.element.auto_scale = false;\n        }\n        this.font_version_name = (v: FontVersion) => {return v?.formattedName() || 'Default'};\n    }\n\n    override mounted() {\n        super.mounted();\n        this.checkRange();\n    }\n\n    @method()\n    textTypeDisplay() {\n        if (!this.element) {\n            return 'Custom Text';\n        }\n\n        if (this.element.model.symbol == SymbolType.CSV_LIST) {\n            return 'CSV List';\n        }\n        else {\n            return 'Custom Text';\n        }\n    }\n\n    @method()\n    elementIsRange() {\n        if (!this.element) {\n            return false;\n        }\n\n        return this.element.model.symbol == SymbolType.NUMBER_RANGE;\n    }\n\n    @method()\n    elementIsCSV() {\n        if (!this.element) {\n            return false;\n        }\n\n        return this.element.model.symbol == SymbolType.CSV_LIST;\n    }\n\n    @method()\n    checkRange() {\n        if (!this.element) {\n            return;\n        }\n\n        this.warnings = new MessageList();\n        this.errors = new MessageList();\n\n        if (this.element.model.multipleRangeSegments()) {\n            this.warnings.add('range', 'Multiple numbers detected. Please verify the quantity.')\n        }\n\n        if (this.element.model.rangeStartInvalid()) {\n            this.errors.add('range_start', 'Invalid number range. Please provide a valid starting number.')\n        }\n        if (this.element.model.rangeEndInvalid()) {\n            this.errors.add('range_end', 'Invalid number range. Please provide a valid ending number.')\n        }\n    }\n\n    @method()\n    textRows() {\n        if (!this.element || !this.element.model.text) {\n            return 2;\n        }\n\n        return Math.max(this.element.model.text.split('\\n').length, 2);\n    }\n\n    @method()\n    variableDataMessage(type: string) {\n        if (this.productService.configured.defined_quantity && this.element.model.symbol == SymbolType.NONE) {\n            return 'Only one element of this kind is allowed per design.'\n        }\n        if (type == 'range') {\n            return 'Each product will have a number from a range.'\n        }\n        if (type == 'csv') {\n            return 'Each product will have a value from a list.'\n        }\n    }\n\n    @method()\n    variableDataEnabled() {\n        return !(this.productService.configured.defined_quantity && this.element.model.symbol == SymbolType.NONE);\n    }\n\n    setupRange() {\n        if (!this.element.model.symbol_range_start && !this.element.model.symbol_range_end) {\n            // If both are empty create a number range based on their quantity\n            let quantity = Number(this.productService.configured.getField('quantity').initial_value || 1).toFixed(0);\n            let start = 'A-'\n            for (let i = 0; i < quantity.length - 1; i++) {\n                start += '0'\n            }\n            start += '1'\n            this.element.model.symbol_range_start = start;\n            this.element.model.symbol_range_end = 'A-' + quantity;\n        }\n        if (!this.element.model.symbol_range_start) {\n            this.element.model.symbol_range_start = this.element.model.text;\n        }\n        if (!this.element.model.symbol_range_end) {\n            this.element.model.symbol_range_end = this.element.model.text;\n        }\n    }\n\n    @method()\n    usePathIcons() {\n        return !this.productService.text_paths.items.find(v => !v.icon);\n    }\n\n    @method()\n    openFontModal() {\n        Services.get<FontService>('FontService').font_selection_callback = (font: Font) => {\n            font.load();\n            this.element.model.font = font;\n            this.element.model.font_version = null;\n        }\n        modal.open('font-search-modal')\n    }\n\n    @method()\n    csvErrors() {\n        if (this.element.model.symbol == SymbolType.CSV_LIST) {\n            if (this.element.model.csv_data && (this.element.model.csv_data.length != this.productService.quantity || this.element.model.emptyValues())) {\n                return new MessageList({\n                    '__all__': ['Empty values in csv data',]\n                })\n            }\n        }\n        return null;\n    }\n\n    @method()\n    fillInDataDefaults() {\n        switch (this.element.model.symbol) {\n            case SymbolType.NONE:\n                if (!this.element.model.text) {\n                    this.element.model.text = 'Custom Text'\n                }\n                return;\n\n            case SymbolType.NUMBER_RANGE:\n                return this.setupRange();\n\n            case SymbolType.CSV_LIST:\n                if (!this.element.model.csv_data || this.element.model.csv_data.length == 0) {\n                    this.element.model.csv_data = [this.element.model.text || 'CSV Text']\n                    this.csv_upload_state = true;\n                }\n                return;\n        }\n    }\n\n    @method()\n    upload_success(response) {\n        this.productService.add_variable_data_file = response.data;\n        this.productService.add_variable_data_callback = (data) => {\n            if (data) {\n                this.element.model.csv_data = data;\n                this.csv_upload_state = false;\n            }\n        }\n        modal.open('add-variable-data-modal');\n    }\n\n    @method()\n    upload_failure(error) {\n        this.errors = processRequestError(error);\n    }\n\n    @method()\n    variableDataModal() {\n        modal.open('edit-variable-data-modal');\n    }\n}\n\n\nexport default function DesignToolEditText(): IVueComponent {\n\n    return {\n        controller: DesignToolEditTextController,\n        template: html,\n        tag: 'design-tool-edit-text'\n    };\n}\n","import AbstractDesignToolController from '../AbstractDesignToolController';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './Layers.html';\nimport {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport * as inspector from 'inspector';\nimport {yieldThread} from '../../../../../core/utils/utils';\n\nclass DesignToolLayersController extends AbstractDesignToolController {\n\n    @prop()\n    all: boolean;\n\n    @data()\n    background_image;\n\n    override mounted() {\n        super.mounted();\n\n\n        if (this.hasSides() || this.hasBackgroundColors()) {\n            // This can take a while and isn't necessary for page interaction so lets yield and let things render\n            // then work on exporting the canvas. On 6x cpu slowdown INP goes from 296ms to 90ms.\n            yieldThread().then(() => {\n                // We need to generate a preview of the product/background on the current side\n                // These can be a conglomerate of multiple different elements. All the elements\n                // that show up in the background/sides tab should also be in the immutable layer\n                // so we can just clone that to a svg data url.\n\n                // Not setup?\n                if (!this.canvas_service || !this.canvas_service.immutableLayer) {\n                    this.background_image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORA==';\n                    return;\n                }\n\n                let svg_source = this.canvas_service.immutableLayer.exportSVG({\n                    embedImages: true,\n                }) as SVGElement;\n\n                // This seems to happen paper js doesn't export a correct svg\n                // So instead of showing a broken svg, just return a 1x1 transparent png\n                if (svg_source.tagName != 'svg') {\n                    this.background_image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORA==';\n                    return;\n                }\n\n                // The viewbox isn't exported so we need to recreate it\n                let bounds = this.canvas_service.projectLayer.bounds;\n                svg_source.setAttribute('x', `${bounds.x}px`);\n                svg_source.setAttribute('y', `${bounds.y}px`);\n                svg_source.setAttribute('width', `${bounds.width}px`);\n                svg_source.setAttribute('height', `${bounds.height}px`);\n                svg_source.setAttribute('viewBox', `${bounds.x} ${bounds.y} ${bounds.width} ${bounds.height}`);\n                svg_source.querySelectorAll('[__v_skip]').forEach(v => v.removeAttribute('__v_skip'));\n\n                // Its more processing power to convert to a data url, but it's safer\n                // We don't want potentially user controlled elements to make its way into the dom which could result in XSS\n                this.background_image = `data:image/svg+xml,${encodeURIComponent(new XMLSerializer().serializeToString(svg_source))}`;\n            })\n        }\n    }\n\n    @method()\n    selectLayer(element, $event) {\n        if (this.selection_manager.selection == element) {\n            // Force tab change\n            this.selection_manager.trigger('selection:change', element);\n            return;\n        }\n\n        this.selection_manager.select(element, $event);\n    }\n\n    @method()\n    hasSides() {\n        return (this.canvas_service.sides.length > 1 || this.canvas_service.sides[0].id != 0) && (!this.productService.configured.custom_shapes || this.productService.configured.custom_shapes.length == 0);\n    }\n\n    @method()\n    hasBackgroundColors() {\n        let has_shape_elements = this.element_manager.shapeElements.length > 0;\n        let has_custom_sahpes = this.productService.base && this.productService.base.template_shapes && this.productService.base.template_shapes.length > 0;\n        let has_background_clipart = this.element_manager.backgroundClipartElements.length > 0;\n\n        return (has_shape_elements || has_custom_sahpes || has_background_clipart) && !this.hasSides();\n    }\n\n    @method()\n    viewSides() {\n        this.selection_manager.deactivate();\n        this.selection_manager.removeSelection();\n        this.$emit('updateSelection', 'product');\n    }\n\n    @method()\n    viewBackground() {\n        this.selection_manager.deactivate();\n        this.selection_manager.removeSelection();\n        this.$emit('updateSelection', 'background');\n    }\n}\n\n\nexport default function DesignToolLayers(): IVueComponent {\n\n    return {\n        controller: DesignToolLayersController,\n        template: html,\n        tag: 'design-tool-layers'\n    };\n}\n","export const html:string = `\n<div class=\"tool-action-header\">\n    <tool-navigation></tool-navigation>\n    <h3 class=\"full-width align-center\">Layers</h3>\n</div>\n<select-layer-bar :product-service=\"productService\"></select-layer-bar>\n<div class=\"inner-drag-content\" style=\"padding-top: 0\">\n    <div class=\"flex-left column full-width stretch spacing-none\">\n        <template v-for=\"(element_layer, $index) in $filters.orderBy(element_manager.elements.filter(v => all || !v.isImmutable()), 'z', true)\"> \n            <div class=\"inset-section inset-hover flex-left-center no-wrap space-between spacing-xs stretch\" :class=\"{'layer-errors': element_layer.model.errors && element_layer.model.errors.length > 0, 'selected-layer': selection_manager.isMultiSelected(element_layer), 'immutable': element_layer.isImmutable()}\">\n                 \n                <div class=\"flex-left-center no-wrap grow\" @click=\"selectLayer(element_layer, $event)\" style=\"user-select: none;\">\n                    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" v-if=\"element_layer.isTextType()\">\n                        <path d=\"M4 7C4 6.06812 4 5.60218 4.15224 5.23463C4.35523 4.74458 4.74458 4.35523 5.23463 4.15224C5.60218 4 6.06812 4 7 4H17C17.9319 4 18.3978 4 18.7654 4.15224C19.2554 4.35523 19.6448 4.74458 19.8478 5.23463C20 5.60218 20 6.06812 20 7M9 20H15M12 4V20\" :stroke=\"element_layer.model.color ? '#' + element_layer.model.color.code : 'var(--text-strong, #101828)'\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                    </svg>\n                   \n                    <template v-if=\"element_layer.isUserShapeType()\">\n                        <div class=\"flex-full-center\" v-html=\"element_layer.toIcon()\"></div>    \n                        <span>Custom Shape</span>\n                    </template>\n                    \n                    <span v-if=\"element_layer.isShapeType()\">\n                        Shape\n                    </span>\n                    \n                    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" v-if=\"((element_layer.isRasterType() || element_layer.isMarketplaceType()) && !element_layer.url) || (element_layer.isClipartType() && !element_layer.url)\">\n                        <path d=\"M4 16.2422C2.79401 15.435 2 14.0602 2 12.5C2 10.1564 3.79151 8.23129 6.07974 8.01937C6.54781 5.17213 9.02024 3 12 3C14.9798 3 17.4522 5.17213 17.9203 8.01937C20.2085 8.23129 22 10.1564 22 12.5C22 14.0602 21.206 15.435 20 16.2422M8 16L12 12M12 12L16 16M12 12V21\" stroke=\"#6941C6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                    </svg>\n                    \n                    <div class=\"card flex-full-center no-shrink\" style=\"padding: 4px; height: 40px; width: 40px\" v-if=\"(element_layer.isRasterType() || element_layer.isMarketplaceType()) && element_layer.url\">\n                        <img v-if=\"(element_layer.isRasterType() || element_layer.isMarketplaceType()) && element_layer.url\" :src=\"element_layer.url\" alt=\"File\" width=\"36px\" height=\"36px\">\n                    </div>\n                    \n                    <div class=\"card flex-full-center no-shrink\" style=\"padding: 4px; height: 40px; width: 40px\" v-if=\"element_layer.isClipartType() && element_layer.url\">\n                        <img v-if=\"(element_layer.isRasterType() || element_layer.isMarketplaceType()) && element_layer.url\" :src=\"element_layer.url\" alt=\"File\" width=\"36px\" height=\"36px\">\n                    </div>\n                    \n                    <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" v-if=\"element_layer.isQRCodeType()\">\n                        <path d=\"M7.25 6.5H7.26M18.25 6.5H18.26M7.25 17.5H7.26M13.75 13H13.76M18.25 17.5H18.26M17.75 21H21.75V17M14.75 16.5V21M21.75 14H17.25M16.35 10H20.15C20.7101 10 20.9901 10 21.204 9.89101C21.3922 9.79513 21.5451 9.64215 21.641 9.45399C21.75 9.24008 21.75 8.96005 21.75 8.4V4.6C21.75 4.03995 21.75 3.75992 21.641 3.54601C21.5451 3.35785 21.3922 3.20487 21.204 3.10899C20.9901 3 20.7101 3 20.15 3H16.35C15.7899 3 15.5099 3 15.296 3.10899C15.1078 3.20487 14.9549 3.35785 14.859 3.54601C14.75 3.75992 14.75 4.03995 14.75 4.6V8.4C14.75 8.96005 14.75 9.24008 14.859 9.45399C14.9549 9.64215 15.1078 9.79513 15.296 9.89101C15.5099 10 15.7899 10 16.35 10ZM5.35 10H9.15C9.71005 10 9.99008 10 10.204 9.89101C10.3922 9.79513 10.5451 9.64215 10.641 9.45399C10.75 9.24008 10.75 8.96005 10.75 8.4V4.6C10.75 4.03995 10.75 3.75992 10.641 3.54601C10.5451 3.35785 10.3922 3.20487 10.204 3.10899C9.99008 3 9.71005 3 9.15 3H5.35C4.78995 3 4.50992 3 4.29601 3.10899C4.10785 3.20487 3.95487 3.35785 3.85899 3.54601C3.75 3.75992 3.75 4.03995 3.75 4.6V8.4C3.75 8.96005 3.75 9.24008 3.85899 9.45399C3.95487 9.64215 4.10785 9.79513 4.29601 9.89101C4.50992 10 4.78995 10 5.35 10ZM5.35 21H9.15C9.71005 21 9.99008 21 10.204 20.891C10.3922 20.7951 10.5451 20.6422 10.641 20.454C10.75 20.2401 10.75 19.9601 10.75 19.4V15.6C10.75 15.0399 10.75 14.7599 10.641 14.546C10.5451 14.3578 10.3922 14.2049 10.204 14.109C9.99008 14 9.71005 14 9.15 14H5.35C4.78995 14 4.50992 14 4.29601 14.109C4.10785 14.2049 3.95487 14.3578 3.85899 14.546C3.75 14.7599 3.75 15.0399 3.75 15.6V19.4C3.75 19.9601 3.75 20.2401 3.85899 20.454C3.95487 20.6422 4.10785 20.7951 4.29601 20.891C4.50992 21 4.78995 21 5.35 21Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                    </svg>\n                    \n                    <span v-if=\"element_layer.isCropType()\">\n                        Crop\n                    </span>\n                    \n                    <span class=\"text-wrap\">{{ $filters.clamp(element_layer.model.label, 20) }}</span>\n                </div>\n                <div class=\"flex-left no-wrap spacing-none\">\n                    <button class=\"btn-icon touch-spacing\" @click=\"moveElementUp($event, element_layer)\">\n                        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                            <path d=\"M12 19V5M12 5L5 12M12 5L19 12\" stroke=\"var(--icon-weak, #B9C0D4)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                        </svg>\n                    </button>\n                    <button class=\"btn-icon touch-spacing\" @click=\"moveElementDown($event, element_layer)\">\n                        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                            <path d=\"M12 5V19M12 19L19 12M12 19L5 12\" stroke=\"var(--icon-weak, #B9C0D4)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                        </svg>\n                    </button>\n                    <button class=\"btn-icon touch-spacing\" @click=\"element_layer.remove($event)\">\n                        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                            <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#B9C0D4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                        </svg>\n                    </button>\n                </div>\n            </div>\n            <hr class=\"padding-none\" v-if=\"$index != element_manager.elements.filter(v => all || !v.isImmutable()).length - 1\">\n        </template>\n        <template v-if=\"hasSides()\">\n            <hr class=\"padding-none\" v-if=\"element_manager.elements.filter(v => all || !v.isImmutable()).length != 0\">\n            <div class=\"inset-section inset-hover flex-left-center no-wrap\" @click=\"viewSides()\" style=\"user-select: none;\">\n                <div class=\"card flex-full-center no-shrink\" style=\"padding: 4px; height: 40px; width: 40px\">\n                    <img :src=\"background_image\" width=\"36px\" height=\"36px\" alt=\"Edit Product\" v-if=\"background_image\">\n                </div>\n                <span class=\"text-wrap\">Product</span>\n            </div>\n        </template>\n        <template v-if=\"hasBackgroundColors()\">\n            <hr class=\"padding-none\" v-if=\"element_manager.elements.filter(v => all || !v.isImmutable()).length != 0\">\n            <div class=\"inset-section inset-hover flex-left-center no-wrap\" @click=\"viewBackground()\" style=\"user-select: none;\">\n                <div class=\"card flex-full-center no-shrink\" style=\"padding: 4px; height: 40px; width: 40px\">\n                    <img :src=\"background_image\" width=\"36px\" height=\"36px\" alt=\"Edit Background\" v-if=\"background_image\">\n                </div>\n                <span class=\"text-wrap\">Background</span>\n            </div>\n        </template>\n    </div>\n</div>\n`;","import IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './Sides.html';\nimport AbstractDesignToolController from '../AbstractDesignToolController';\nimport {data, method} from '../../../../../core/adapters/VueComponent';\n\nclass DesignToolSidesController extends AbstractDesignToolController {\n    @data()\n    updateBackgroundColorCallback;\n\n    constructor(props) {\n        super(props);\n\n        this.updateBackgroundColorCallback = this.updateBackgroundColor.bind(this);\n    }\n\n\n    @method()\n    updateBackgroundColor(color, clipart_region) {\n        for (const item of this.element_manager.allBackgroundClipartElements) {\n            for (const template_region of item.model.regions) {\n                if ((template_region as any).region.selector == clipart_region.region.selector) {\n                    template_region.color = color;\n                }\n            }\n        }\n\n        this.productService.configured.material_color = color;\n        this.canvas_service.trigger('design-change');\n    }\n}\n\n\nexport default function DesignToolSides(): IVueComponent {\n\n    return {\n        controller: DesignToolSidesController,\n        template: html,\n        tag: 'design-tool-sides'\n    };\n}\n","export const html:string = `\n<div class=\"tool-action-header\">\n    <tool-navigation></tool-navigation>\n    <h3 class=\"full-width align-center\">Product</h3>\n</div>\n<div class=\"inner-drag-content\">\n    <div v-if=\"canvas_service.sides.length > 1\" class=\"flex-left full-width toggle-items\">\n        <template v-for=\"side in canvas_service.sides\">\n            <button @click=\"canvas_service.selectSide(side.id)\" :class=\"{'selected': side.id == canvas_service.active_side}\" class=\"flex-center column spacing-xs\">\n                <sub-canvas-preview style=\"max-width: 100px\" :service=\"productService.canvasService\" :side=\"side\"></sub-canvas-preview>\n                <span class=\"text-sm\">{{ side.name }}</span>\n            </button>\n        </template>\n    </div>\n    \n    <template v-for=\"clipart in element_manager.editableBackgroundClipartElements\">\n        <tool-clipart-colors :element=\"clipart\"></tool-clipart-colors>\n    </template>\n    \n    <slot></slot>\n</div>\n`;\n","import AbstractDesignToolController from '../AbstractDesignToolController';\nimport {computed, data, method} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './FooterActions.html';\n\nclass FooterActionsController extends AbstractDesignToolController {\n\n    @method()\n    duplicateItem($event) {\n        if ($event) {\n            $event.preventDefault();\n        }\n\n        let clone = null;\n        if (this.isSelectionClipart()) {\n            clone = this.productService.createClipartElement(this.element.model);\n        }\n        else if (this.isSelectionRaster()) {\n            clone = this.productService.createUserFileElement(this.element.model);\n        }\n        else if (this.isSelectionQRCode()) {\n            let data = this.element.model.getData();\n\n            // The code will need to be cloned so both elements don't point to the same code\n            if (data.qrcode?.id) {\n                data.qrcode.id = null;\n                data.qrcode.resource_uri = null;\n                if (data.qrcode.data_json) {\n                    data.qrcode.data_json = JSON.stringify(data.qrcode.data_json);\n                }\n                data.qrcode.save();\n            }\n            clone = this.productService.createQRCodeElement(data);\n        }\n        else if (this.isSelectionText()) {\n            clone = this.productService.createTextElement(this.element.model);\n        }\n        else if (this.isSelectionUserShape()) {\n            clone = this.productService.createUserShapeElement(this.element.model);\n        }\n\n        if (clone) {\n            clone.x -= 20;\n            clone.y -= 20;\n        }\n\n        this.element_manager.fixZ();\n        this.element_manager.sort();\n    }\n}\n\nexport default function DesignToolFooterActions(): IVueComponent {\n\n    return {\n        controller: FooterActionsController,\n        template: html,\n        tag: 'design-tool-footer-actions'\n    };\n}\n","export const html:string = `\n<hr>\n<div class=\"input-group\">\n    <label>Layer Actions</label>\n    <div class=\"flex-left full-width no-wrap\">\n        <button class=\"btn-base btn-secondary-action full-width spacing-sm\" @click=\"duplicateItem()\" v-if=\"!isSelectionMarketplace()\">\n            <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M13.3334 6.66663V4.33329C13.3334 3.39987 13.3334 2.93316 13.1517 2.57664C12.9919 2.26304 12.7369 2.00807 12.4233 1.84828C12.0668 1.66663 11.6001 1.66663 10.6667 1.66663H4.33335C3.39993 1.66663 2.93322 1.66663 2.5767 1.84828C2.2631 2.00807 2.00813 2.26304 1.84834 2.57664C1.66669 2.93316 1.66669 3.39987 1.66669 4.33329V10.6666C1.66669 11.6 1.66669 12.0668 1.84834 12.4233C2.00813 12.7369 2.2631 12.9918 2.5767 13.1516C2.93322 13.3333 3.39993 13.3333 4.33335 13.3333H6.66669M9.33335 18.3333H15.6667C16.6001 18.3333 17.0668 18.3333 17.4233 18.1516C17.7369 17.9918 17.9919 17.7369 18.1517 17.4233C18.3334 17.0668 18.3334 16.6 18.3334 15.6666V9.33329C18.3334 8.39987 18.3334 7.93316 18.1517 7.57664C17.9919 7.26304 17.7369 7.00807 17.4233 6.84828C17.0668 6.66663 16.6001 6.66663 15.6667 6.66663H9.33335C8.39993 6.66663 7.93322 6.66663 7.5767 6.84828C7.2631 7.00807 7.00813 7.26304 6.84834 7.57664C6.66669 7.93316 6.66669 8.39987 6.66669 9.33329V15.6666C6.66669 16.6 6.66669 17.0668 6.84834 17.4233C7.00813 17.7369 7.2631 17.9918 7.5767 18.1516C7.93322 18.3333 8.39993 18.3333 9.33335 18.3333Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n            Duplicate\n        </button>\n    </div>\n</div>\n`;","import VueComponent, {prop} from '../../../../../core/adapters/VueComponent';\n\nexport class ElementActionController extends VueComponent {\n    @prop()\n    element;\n}","import IVueComponent from '../../../../../../core/adapters/IVueComponent';\nimport {html} from './ElementAlignment.html';\nimport {ElementActionController} from '../ElementActionController';\n\n\nexport default function ElementAlignment(): IVueComponent {\n    return {\n        tag: 'tool-alignment',\n        template: html,\n        controller: ElementActionController\n    }\n}","export const html:string = `\n<div class=\"input-group\">\n    <label>Alignment</label>\n    <fieldset class=\"input-group single-option\">\n        <div class=\"toggle-group\">\n            <button @click=\"element.centerVertically()\" class=\"icon-option\">\n                <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M3.25 12H21.25M12.25 2V8.5M12.25 8.5L16.25 4.5M12.25 8.5L8.25 4.5M12.25 22V15.5M12.25 15.5L16.25 19.5M12.25 15.5L8.25 19.5\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n            <button @click=\"element.centerHorizontally()\" class=\"icon-option\">\n                <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M12.75 3V21M22.75 12H16.25M16.25 12L20.25 16M16.25 12L20.25 8M2.75 12H9.25M9.25 12L5.25 16M9.25 12L5.25 8\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n        </div>\n    </fieldset>\n</div>\n`;","import IVueComponent from '../../../../../../core/adapters/IVueComponent';\nimport {html} from './ElementLayerPosition.html';\nimport {ElementActionController} from '../ElementActionController';\nimport {method} from '../../../../../../core/adapters/VueComponent';\nimport {Services} from '../../../../../../core/services/Services';\nimport {ElementManager} from '../../../../services/ElementManager';\nimport {toRaw} from 'vue';\n\n\nclass ElementLayerPositionController extends ElementActionController {\n    @method()\n    moveElementDown() {\n        Services.get<ElementManager>('ElementManager').moveElementDown(toRaw(this.element));\n    }\n\n    @method()\n    moveElementUp() {\n        Services.get<ElementManager>('ElementManager').moveElementUp(toRaw(this.element));\n    }\n}\n\n\nexport default function ElementLayerPosition(): IVueComponent {\n    return {\n        tag: 'tool-layer-position',\n        template: html,\n        controller: ElementLayerPositionController\n    }\n}","export const html:string = `\n<div class=\"input-group\">\n    <label>Layer Position</label>\n    <fieldset class=\"input-group single-option\">\n        <div class=\"toggle-group\">\n            <button @click=\"moveElementUp()\" class=\"icon-option\">\n                <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M10.77 4.90002L2.08997 9.22002L10.77 13.56L19.15 9.23002L10.77 4.90002Z\" fill=\"var(--stroke-strong, #D0D5DD)\"/>\n                    <path d=\"M21.25 7V1M21.25 1L18.75 3.6M21.25 1L23.75 3.6M6.25 11.74L1.75 14L10.43 18.36C10.55 18.42 10.61 18.45 10.67 18.46C10.72 18.47 10.78 18.47 10.84 18.46C10.9 18.45 10.96 18.42 11.08 18.36L19.76 14L15.26 11.74M6.25 16.26L1.75 18.52L10.43 22.88C10.55 22.94 10.61 22.97 10.67 22.98C10.72 22.99 10.78 22.99 10.84 22.98C10.9 22.97 10.96 22.94 11.08 22.88L19.76 18.52L15.26 16.26M1.75 9.47L10.43 5.11C10.55 5.05 10.61 5.02 10.67 5.01C10.72 5 10.78 5 10.84 5.01C10.9 5.02 10.96 5.05 11.08 5.11L19.76 9.47L11.08 13.83C10.96 13.89 10.9 13.92 10.84 13.93C10.79 13.94 10.73 13.94 10.67 13.93C10.61 13.92 10.55 13.89 10.43 13.83L1.75 9.47Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n            <button @click=\"moveElementDown()\" class=\"icon-option\">\n                <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M5.75002 16.26L1.52002 18.39L10.25 22.74L19.03 18.41L14.75 16.26L10.17 18.47L5.75002 16.26Z\" fill=\"var(--stroke-strong, #D0D5DD)\"/>\n                    <path d=\"M20.75 1V7M20.75 7L23.25 4.4M20.75 7L18.25 4.4M5.75 11.74L1.25 14L9.93 18.36C10.05 18.42 10.11 18.45 10.17 18.46C10.22 18.47 10.28 18.47 10.34 18.46C10.4 18.45 10.46 18.42 10.58 18.36L19.26 14L14.76 11.74M5.75 16.26L1.25 18.52L9.93 22.88C10.05 22.94 10.11 22.97 10.17 22.98C10.22 22.99 10.28 22.99 10.34 22.98C10.4 22.97 10.46 22.94 10.58 22.88L19.26 18.52L14.76 16.26M1.25 9.47L9.93 5.11C10.05 5.05 10.11 5.02 10.17 5.01C10.22 5 10.28 5 10.34 5.01C10.4 5.02 10.46 5.05 10.58 5.11L19.26 9.47L10.58 13.83C10.46 13.89 10.4 13.92 10.34 13.93C10.29 13.94 10.23 13.94 10.17 13.93C10.11 13.92 10.05 13.89 9.93 13.83L1.25 9.47Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n        </div>\n    </fieldset>\n</div>\n`;","import IVueComponent from '../../../../../../core/adapters/IVueComponent';\nimport {ElementActionController} from '../ElementActionController';\nimport {html} from './ElementTextAlignment.html';\n\nexport default function ElementTextAlignment(): IVueComponent {\n    return {\n        tag: 'tool-text-alignment',\n        controller: ElementActionController,\n        template: html\n    }\n}","export const html: string = `\n<fieldset class=\"input-group single-option\">\n    <legend>Text Alignment</legend>\n    <div class=\"toggle-group toggle-sm\">\n        <label for=\"left-text-align\" class=\"icon-option\">\n            <input id=\"left-text-align\" :value=\"0\" name=\"text-alignment\" type=\"radio\" :checked=\"element.model.text_alignment == 0\" v-model=\"element.model.text_alignment\"/>\n            <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M16.3333 10H3.33331M20.3333 6H3.33331M20.3333 14H3.33331M16.3333 18H3.33331\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n        </label>\n        <label for=\"center-text-align\" class=\"icon-option\">\n            <input id=\"center-text-align\" :value=\"1\" name=\"text-alignment\" type=\"radio\" :checked=\"element.model.text_alignment == 1\" v-model=\"element.model.text_alignment\"/>\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M18 10H6M21 6H3M21 14H3M18 18H6\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n        </label>\n        <label for=\"right-text-align\" class=\"icon-option\">\n            <input id=\"right-text-align\" :value=\"2\" name=\"text-alignment\" type=\"radio\" :checked=\"element.model.text_alignment == 2\" v-model=\"element.model.text_alignment\"/>\n            <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M21.6666 10H8.66663M21.6666 6H4.66663M21.6666 14H4.66663M21.6666 18H8.66663\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n        </label>\n    </div>\n</fieldset>\n`;","import VueComponent, {method} from '../../../../../../core/adapters/VueComponent';\nimport {ElementActionController} from '../ElementActionController';\nimport {Services} from '../../../../../../core/services/Services';\nimport PaperCanvasService from '../../../../services/PaperCanvasService';\nimport IVueComponent from '../../../../../../core/adapters/IVueComponent';\nimport {html} from './ElementFit.html';\n\nclass ElementFitWidthController extends ElementActionController {\n    @method()\n    fitWidth(): void {\n        this.element.centerVertically();\n        this.element.centerHorizontally();\n        this.element.height *= Services.get<PaperCanvasService>('PaperCanvasService').workspace.artboard.width / this.element.width;\n        this.element.width = Services.get<PaperCanvasService>('PaperCanvasService').workspace.artboard.width;\n    }\n\n    @method()\n    fitHeight(): void {\n        this.element.centerVertically();\n        this.element.centerHorizontally();\n        this.element.width *= Services.get<PaperCanvasService>('PaperCanvasService').workspace.artboard.height / this.element.height;\n        this.element.height = Services.get<PaperCanvasService>('PaperCanvasService').workspace.artboard.height;\n    }\n}\n\nexport default function ElementFit(): IVueComponent {\n    return {\n        tag: 'element-fit',\n        template: html,\n        controller: ElementFitWidthController\n    }\n}","export const html:string = `\n<div class=\"input-group full-width\">\n    <label>Fit</label>\n    <fieldset class=\"input-group single-option\">\n        <div class=\"toggle-group\">\n            <button class=\"icon-option\" aria-label=\"Fit to full height\" @click=\"fitHeight()\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M12 18L12 6M12 18L9 16M12 18L15 16M12 6L9 8M12 6L15 8M21 3H3M21 21H3\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n            <button class=\"icon-option\" aria-label=\"Fit to full width\" @click=\"fitWidth()\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M6 12H18M6 12L8 9M6 12L8 15M18 12L16 9M18 12L16 15M21 21V3M3 21V3\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n        </div>\n    </fieldset>\n</div>\n`;","import VueComponent, {method} from '../../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../../core/adapters/IVueComponent';\nimport {html} from './ElementScaleSize.html';\nimport {ElementActionController} from '../ElementActionController';\nimport {Services} from '../../../../../../core/services/Services';\nimport PaperCanvasService from '../../../../services/PaperCanvasService';\n\nclass ElementScaleSizeController extends ElementActionController {\n\n    @method()\n    scaleSize(percentage: number) {\n        if (this.element.width && this.element.height && !this.element.model.path) {\n            // Scale based on percentage of the canvas so the button will always increase the same amount\n            let canvas_width = Services.get<PaperCanvasService>('PaperCanvasService').rootLayer.bounds.width * percentage;\n            let scale = 1 + (canvas_width / this.element.width);\n\n            if (scale > 1.15) {\n                scale = 1.15;\n            }\n            if (scale < 0.85) {\n                scale = 0.85\n            }\n\n            this.element.width = this.element.width * scale;\n            this.element.height = this.element.height * scale;\n        }\n        else {\n            if (percentage > 0) {\n                this.element.model.size += 10;\n            } else {\n                this.element.model.size -= 10;\n            }\n        }\n    }\n}\n\nexport default function ElementScaleSize(): IVueComponent {\n    return {\n        tag: 'element-scale-size',\n        template: html,\n        controller: ElementScaleSizeController\n    }\n}","export const html:string = `\n<div class=\"input-group\">\n    <label>Size</label>\n    <fieldset class=\"input-group single-option\">\n        <div class=\"toggle-group\">\n            <button @click.prevent=\"scaleSize(-0.05)\" class=\"icon-option\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M5 12H19\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n            <button @click.prevent=\"scaleSize(0.05)\" class=\"icon-option\">\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M9.99999 4.16663V15.8333M4.16666 9.99996H15.8333\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n        </div>\n    </fieldset>\n</div>\n`;","import IVueComponent from '../../../../../../core/adapters/IVueComponent';\nimport {ElementActionController} from '../ElementActionController';\nimport {html} from './ElementInvert.html';\n\nexport default function ElementInvert(): IVueComponent {\n    return {\n        tag: 'element-invert',\n        controller: ElementActionController,\n        template: html\n    }\n}","export const html:string = `\n<div class=\"input-group\">\n    <label>Invert</label>\n    <button class=\"btn-base btn-secondary-action spacing-sm\" @click=\"element.model.x_scale_inverted = !element.model.x_scale_inverted\">\n        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <path d=\"M12 3V6M12 10.5V13.5M12 18V21M3.28777 7.99059L7.67567 11.3659C7.95617 11.5817 8.09641 11.6895 8.14681 11.821C8.19098 11.9363 8.19098 12.0637 8.14681 12.179C8.09641 12.3105 7.95617 12.4183 7.67567 12.6341L3.28777 16.0094C2.87415 16.3276 2.66735 16.4867 2.49387 16.4845C2.34295 16.4827 2.20094 16.4128 2.10745 16.2943C2 16.1581 2 15.8971 2 15.3753V8.62469C2 8.10286 2 7.84195 2.10745 7.70574C2.20094 7.58724 2.34295 7.51732 2.49387 7.51547C2.66735 7.51334 2.87415 7.67243 3.28777 7.99059ZM20.7122 7.99059L16.3243 11.3659C16.0438 11.5817 15.9036 11.6895 15.8532 11.821C15.809 11.9363 15.809 12.0637 15.8532 12.179C15.9036 12.3105 16.0438 12.4183 16.3243 12.6341L20.7122 16.0094C21.1258 16.3276 21.3327 16.4867 21.5061 16.4845C21.6571 16.4827 21.7991 16.4128 21.8925 16.2943C22 16.1581 22 15.8971 22 15.3753V8.62469C22 8.10286 22 7.84195 21.8925 7.70574C21.7991 7.58724 21.6571 7.51732 21.5061 7.51547C21.3327 7.51334 21.1258 7.67243 20.7122 7.99059Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n        </svg>\n        Flip Image\n    </button>\n</div>\n`;","import {ElementActionController} from '../ElementActionController';\nimport IVueComponent from '../../../../../../core/adapters/IVueComponent';\nimport {html} from './ElementMaintainProportion.html';\nimport {method, prop} from '../../../../../../core/adapters/VueComponent';\n\nclass ElementMaintainProportionController extends ElementActionController {\n    @prop()\n    onChange;\n\n    @method()\n    onUpdate() {\n        if (this.onChange) {\n            this.onChange();\n        }\n    }\n}\n\nexport default function ElementMaintainProportion(): IVueComponent {\n    return {\n        tag: 'element-maintain-proportion',\n        controller: ElementMaintainProportionController,\n        template: html\n    }\n}","export const html:string = `\n<div class=\"input-group full-width\">\n    <label>Proportions</label>\n    <fieldset class=\"input-group single-option\">\n        <div class=\"toggle-group\">\n            <label for=\"lock-proportions\" class=\"icon-option\">\n                <input type=\"radio\" id=\"lock-proportions\" v-model=\"element.model.maintain_proportion\" :value=\"true\" @change=\"onUpdate()\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M17 11V9C17 6.23858 14.7614 4 12 4C9.23858 4 7 6.23858 7 9V11M12 15.5V17.5M8.8 22H15.2C16.8802 22 17.7202 22 18.362 21.673C18.9265 21.3854 19.3854 20.9265 19.673 20.362C20 19.7202 20 18.8802 20 17.2V15.8C20 14.1198 20 13.2798 19.673 12.638C19.3854 12.0735 18.9265 11.6146 18.362 11.327C17.7202 11 16.8802 11 15.2 11H8.8C7.11984 11 6.27976 11 5.63803 11.327C5.07354 11.6146 4.6146 12.0735 4.32698 12.638C4 13.2798 4 14.1198 4 15.8V17.2C4 18.8802 4 19.7202 4.32698 20.362C4.6146 20.9265 5.07354 21.3854 5.63803 21.673C6.27976 22 7.11984 22 8.8 22Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </label>\n            <label for=\"unlock-proportions\" class=\"icon-option\">\n                <input type=\"radio\" id=\"unlock-proportions\" v-model=\"element.model.maintain_proportion\" :value=\"false\" @change=\"onUpdate()\">\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M7 11V7C7 4.2 9.2 2 12 2C14.8 2 15.8 3.2 16.6 5M12 15.5V17.5M8.8 22H15.2C16.9 22 17.7 22 18.4 21.7C19 21.4 19.4 21 19.7 20.4C20 19.8 20 18.9 20 17.2V15.8C20 14.1 20 13.3 19.7 12.6C19.4 12 19 11.6 18.4 11.3C17.8 11 16.9 11 15.2 11H8.8C7.1 11 6.3 11 5.6 11.3C5 11.6 4.6 12 4.3 12.6C4 13.2 4 14.1 4 15.8V17.2C4 18.9 4 19.7 4.3 20.4C4.6 21 5 21.4 5.6 21.7C6.2 22 7.1 22 8.8 22Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </label>\n        </div>\n    </fieldset>\n</div>\n`;","import VueComponent, {data, method, prop} from '../../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../../core/adapters/IVueComponent';\nimport {html as html_standard} from './ElementColor.html';\nimport {html as html_materials} from './ElementMaterialColors.html';\nimport {Color} from '../../../../models/Color';\nimport {Services} from '../../../../../../core/services/Services';\nimport CustomEditorService from '../../../../services/CustomEditorService';\nimport {uuid4} from '../../../../../../core/utils/uuid';\nimport ColorService from '../../../../services/ColorService';\nimport {SelectionManager} from '../../../../services/SelectionManager';\nimport {Collection} from '../../../../../../core/models/Collection';\nimport {SelectionStateManager} from \"../../../../services/SelectionStateManager\";\n\nclass ElementColorController extends VueComponent {\n\n    @prop()\n    colors: Collection<Color>;\n\n    @prop({\n        emit: true,\n    })\n    selected: Color;\n\n    @prop({\n        emit: true,\n        watch: true\n    })\n    custom: string;\n\n    @prop()\n    limited: boolean;\n\n    @prop()\n    change: (color: any) => void;\n\n    @data()\n    custom_color;\n\n    @data()\n    color_picker: boolean;\n\n    @data()\n    on_color_change;\n\n    @data()\n    productColor: boolean;\n\n    @data()\n    picker_uuid: string;\n\n    @data()\n    product_service;\n\n    @data()\n    color_cache: {[key: symbol|string]: string[]} = {};\n\n    @data()\n    hover_color;\n\n    @data()\n    eye_dropper: boolean;\n\n    escape_binding;\n    mouse_move_binding;\n    selection_manager: SelectionStateManager;\n\n    constructor(component) {\n        super(component);\n        // Duplicate ids causes multiple instances of the color picker to not show up\n        this.picker_uuid = uuid4();\n        this.product_service = Services.get('ProductService');\n        this.selection_manager = Services.get<SelectionStateManager>('SelectionStateManager');\n    }\n\n    override mounted() {\n        super.mounted();\n\n        this.on_color_change = (v) => {\n            this.custom = v;\n        }\n        this.bind('change:custom', () => {\n            this.custom_color = this.custom;\n            if (this.change && this.custom) {\n                this.change(this.custom);\n            }\n        }, this);\n\n        if (this.custom) {\n            this.color_picker = true;\n            this.custom_color = this.custom;\n        }\n\n        this.bind('change:custom', this.updateColorsCache.bind(this), this);\n        this.bind('change:selected', this.updateColorsCache.bind(this), this);\n        this.updateColorsCache();\n\n        window.addEventListener('keydown', this.escape_binding);\n    }\n\n    override unmounted() {\n        window.removeEventListener('keydown', this.escape_binding);\n        this.selection_manager.toggleElementManager();\n        super.unmounted();\n    }\n\n    @method()\n    useEyeDropper() {\n        this.eye_dropper = true;\n        this.selection_manager.toggleColorManager((color: string) => {\n            this.hover_color = color;\n            this.selectColor(this.hover_color);\n            this.eye_dropper = false;\n        }, (color: string) => {\n            this.hover_color = color;\n        });\n    }\n\n    @method()\n    updateColor() {\n        this.custom = this.custom_color;\n        this.selection_manager.unbindWithContext('selection:mouse_move', this);\n    }\n\n    @method()\n    selectColor(color: Color|string) {\n        if (!(color instanceof Color)) {\n            let search = this.colors.find(v => `#${v.code}` == color);\n            if (search) {\n                color = search;\n            }\n        }\n\n        if (color instanceof Color) {\n            if (this.selected == color) {\n                this.color_cache = null;\n                this.updateColorsCache();\n            }\n            this.selected = color;\n\n            if (this.productColor) {\n                Services.get<CustomEditorService>('ProductService').configured.material_color = color;\n            }\n        }\n        else {\n            if (this.custom == color) {\n                this.color_cache = null;\n                this.updateColorsCache();\n            }\n            this.custom = color;\n        }\n\n        if (this.change) {\n            this.change(color);\n        }\n    }\n\n    @method()\n    customColor() {\n        if (this.eye_dropper) {\n            return this.hover_color;\n        }\n        if (this.selected) {\n            return this.selected.background;\n        }\n        if (this.custom_color) {\n            return this.custom_color;\n        }\n        return this.custom;\n    }\n\n    @method()\n    colorName() {\n        if (this.eye_dropper) {\n            return this.hover_color;\n        }\n        if (this.selected) {\n            return this.selected.name;\n        }\n        if (this.custom_color) {\n            return this.custom_color;\n        }\n        return this.custom;\n    }\n\n    @method()\n    usePicker() {\n        this.updateColorsCache();\n        this.color_picker = true;\n        if (this.selected) {\n            this.custom_color = `#${this.selected.code}`;\n        }\n    }\n\n    @method()\n    colorToCode(color: Color|string) {\n        if (color instanceof Color) {\n            return `#${color.code}`;\n        }\n        return color;\n    }\n\n    @method()\n    isSelected(color: Color|string) {\n        if (!color) {\n            return false;\n        }\n\n        if (color instanceof Color) {\n            return this.selected && this.selected.id == color.id;\n        }\n        else {\n            return this.custom_color == color;\n        }\n    }\n\n    @method()\n    updateColorsCache() {\n        let color = this.custom_color || (this.selected ? `#${this.selected.code}` : null);\n        if (!color) {\n            return {};\n        }\n\n        if (this.color_cache) {\n            if (Object.values(this.color_cache).find(set => set && set.find(v => v == color))) {\n                return this.color_cache;\n            }\n        }\n\n        this.color_cache = {\n            monochromatic: Services.get<ColorService>('ColorService').monochromatic(color, 6),\n            shades: Services.get<ColorService>('ColorService').shades(color, 6),\n            tints: Services.get<ColorService>('ColorService').tints(color, 6),\n            tones: Services.get<ColorService>('ColorService').tones(color, 6),\n            complementary: Services.get<ColorService>('ColorService').complementary(color)\n        }\n    }\n\n    @method()\n    monochromaticColors() {\n        if (!this.color_cache) {\n            return [];\n        }\n        return this.color_cache['monochromatic'] || [];\n    }\n\n    @method()\n    shades() {\n        if (!this.color_cache) {\n            return [];\n        }\n        return this.color_cache['shades'] || [];\n    }\n\n    @method()\n    tints() {\n        if (!this.color_cache) {\n            return [];\n        }\n        return this.color_cache['tints'] || [];\n    }\n\n    @method()\n    tones() {\n        if (!this.color_cache) {\n            return [];\n        }\n        return this.color_cache['tones'] || [];\n    }\n\n    @method()\n    complementaryColors() {\n        if (!this.color_cache) {\n            return [];\n        }\n        return this.color_cache['complementary'] || [];\n    }\n}\n\nexport function ElementColor(): IVueComponent {\n    return {\n        tag: 'tool-element-color',\n        controller: ElementColorController,\n        template: html_standard\n    }\n}\nexport function ElementMaterialColor(): IVueComponent {\n    return {\n        tag: 'tool-element-material-color',\n        controller: ElementColorController,\n        template: html_materials\n    }\n}","export const html:string = `\n<div class=\"contents\">\n    <div class=\"flex-left-center full-width no-wrap\">\n        <div class=\"flex-left-center spacing-sm full-width no-wrap\">\n            <span class=\"circle no-shrink\" :style=\"'background: ' + customColor()\" style=\"width: 43px; height: 43px; box-shadow: var(--card-shadow-sm)\"></span>\n            <span v-if=\"!color_picker\">{{ colorName() }}</span>\n            <input v-model=\"custom_color\" v-if=\"color_picker\" @change=\"updateColor()\" type=\"text\" style=\"width: 100%\">\n        </div>\n        <button class=\"btn-base btn-secondary-action btn-square no-shrink flex-full-center\" :class=\"eye_dropper ? 'active' : null\" style=\"width: 44px; height: 44px\" v-if=\"!limited\" @click=\"useEyeDropper()\">\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M10.5 6.49981L17.5 13.4998M2 21.9998C2 21.9998 6.5 21.4998 9 18.9998L21 6.99982C22.1046 5.89525 22.1046 4.10438 21 2.99982C19.8954 1.89525 18.1046 1.89524 17 2.99981L5 14.9998C2.5 17.4998 2 21.9998 2 21.9998Z\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n        </button>\n        <button class=\"btn-icon\" v-if=\"!limited\" v-show=\"!color_picker\" @click=\"usePicker()\">\n            <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M2.41453e-08 4C1.08102e-08 1.79086 1.79086 0 4 0L40 0C42.2091 0 44 1.79086 44 4L44 40C44 42.2091 42.2091 44 40 44L4 44C1.79086 44 2.54789e-07 42.2091 2.41454e-07 40L2.41453e-08 4Z\" :fill=\"'url(#' + picker_uuid + ')'\"/>\n                <defs>\n                    <linearGradient :id=\"picker_uuid\" x1=\"44\" y1=\"43.9998\" x2=\"2.53793e-07\" y2=\"43.9998\" gradientUnits=\"userSpaceOnUse\">\n                        <stop offset=\"0\" stop-color=\"#F00000\"/>\n                        <stop offset=\"0.046875\" stop-color=\"#FF005E\"/>\n                        <stop offset=\"0.046975\" stop-color=\"#FC0072\"/>\n                        <stop offset=\"0.0885417\" stop-color=\"#EA00FA\"/>\n                        <stop offset=\"0.0886417\" stop-color=\"#E000FB\"/>\n                        <stop offset=\"0.130208\" stop-color=\"#9A00FF\"/>\n                        <stop offset=\"0.182292\" stop-color=\"#3100FF\"/>\n                        <stop offset=\"0.182392\" stop-color=\"#2D01FF\"/>\n                        <stop offset=\"0.234375\" stop-color=\"#060CFF\"/>\n                        <stop offset=\"0.234475\" stop-color=\"#0431FF\"/>\n                        <stop offset=\"0.28125\" stop-color=\"#007CFF\"/>\n                        <stop offset=\"0.333333\" stop-color=\"#008EFF\"/>\n                        <stop offset=\"0.385417\" stop-color=\"#228BDE\"/>\n                        <stop offset=\"0.432292\" stop-color=\"#00DBFF\"/>\n                        <stop offset=\"0.479167\" stop-color=\"#00F5FF\"/>\n                        <stop offset=\"0.536458\" stop-color=\"#00FFB5\"/>\n                        <stop offset=\"0.583333\" stop-color=\"#00FF68\"/>\n                        <stop offset=\"0.640625\" stop-color=\"#00FF22\"/>\n                        <stop offset=\"0.692708\" stop-color=\"#2AFF00\"/>\n                        <stop offset=\"0.739583\" stop-color=\"#ACFF00\"/>\n                        <stop offset=\"0.786458\" stop-color=\"#F0F600\"/>\n                        <stop offset=\"0.833333\" stop-color=\"#FFC300\"/>\n                        <stop offset=\"0.885417\" stop-color=\"#FF8100\"/>\n                        <stop offset=\"0.947917\" stop-color=\"#FF4F00\"/>\n                        <stop offset=\"1\" stop-color=\"#FF0000\"/>\n                    </linearGradient>\n                </defs>\n            </svg>\n        </button>\n        <button class=\"btn-icon\" v-if=\"!limited\" v-show=\"color_picker\" @click=\"color_picker = false\">\n            <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M4 0.5H40C41.933 0.5 43.5 2.067 43.5 4V40C43.5 41.933 41.933 43.5 40 43.5H4C2.067 43.5 0.5 41.933 0.5 40V4C0.5 2.067 2.067 0.5 4 0.5Z\" fill=\"white\"/>\n                <path d=\"M4 0.5H40C41.933 0.5 43.5 2.067 43.5 4V40C43.5 41.933 41.933 43.5 40 43.5H4C2.067 43.5 0.5 41.933 0.5 40V4C0.5 2.067 2.067 0.5 4 0.5Z\" stroke=\"#D0D5DD\"/>\n                <circle cx=\"10\" cy=\"10\" r=\"4\" fill=\"#C70700\"/>\n                <circle cx=\"22\" cy=\"10\" r=\"4\" fill=\"#F78E1E\"/>\n                <circle cx=\"34\" cy=\"10\" r=\"4\" fill=\"#FFDA1C\"/>\n                <circle cx=\"10\" cy=\"22\" r=\"4\" fill=\"#2CA443\"/>\n                <circle cx=\"22\" cy=\"22\" r=\"4\" fill=\"#5BDD3F\"/>\n                <circle cx=\"34\" cy=\"22\" r=\"4\" fill=\"#00ADA9\"/>\n                <circle cx=\"10\" cy=\"34\" r=\"4\" fill=\"#0071AF\"/>\n                <circle cx=\"22\" cy=\"34\" r=\"4\" fill=\"#39B7EA\"/>\n                <circle cx=\"34\" cy=\"34\" r=\"4\" fill=\"#B195C6\"/>\n            </svg>\n        </button>\n    </div>\n    \n    <div class=\"input-group\" v-show=\"product_service.designColors()\" v-if=\"!limited && color_picker\">\n        <label>Design Colors</label>\n        <div class=\"flex-left\">\n            <template v-for=\"color in product_service.designColors()\">\n                <div style=\"aspect-ratio: 1/1; width: calc((100% - 80px) / 6)\" v-if=\"colorToCode(color)\">\n                    <button class=\"xs-2 btn-base btn-color circle\" \n                        style=\"width: 100%; height: 100%\"\n                        :class=\"{active: isSelected(color)}\"\n                        :style=\"'background: ' + colorToCode(color)\"\n                        @click=\"selectColor(color)\">\n                    </button>\n                </div>\n            </template>\n        </div>\n    </div>\n    \n    <color-picker v-model:color=\"custom_color\" :change=\"on_color_change\" v-if=\"!limited && color_picker\"></color-picker>\n    \n    <template v-if=\"color_picker && (selected || custom)\">\n        <div class=\"input-group\">\n            <label>Shade</label>\n            <div class=\"flex-left\">\n                <div style=\"aspect-ratio: 1/1; width: calc((100% - 80px) / 6)\" v-for=\"color in shades()\">\n                    <button class=\"xs-2 btn-base btn-color circle\" \n                        style=\"width: 100%; height: 100%\"\n                        :class=\"{active: isSelected(color)}\"\n                        :style=\"'background: ' + colorToCode(color)\"\n                        @click=\"selectColor(color)\">\n                    </button>\n                </div>\n            </div>\n        </div>\n        <div class=\"input-group\">\n            <label>Tint</label>\n            <div class=\"flex-left\">\n                <div style=\"aspect-ratio: 1/1; width: calc((100% - 80px) / 6)\" v-for=\"color in tints()\">\n                    <button class=\"xs-2 btn-base btn-color circle\" \n                        style=\"width: 100%; height: 100%\"\n                        :class=\"{active: isSelected(color)}\"\n                        :style=\"'background: ' + colorToCode(color)\"\n                        @click=\"selectColor(color)\">\n                    </button>\n                </div>\n            </div>\n        </div>\n        <div class=\"input-group\">\n            <label>Tones</label>\n            <div class=\"flex-left\">\n                <div style=\"aspect-ratio: 1/1; width: calc((100% - 80px) / 6)\" v-for=\"color in tones()\">\n                    <button class=\"xs-2 btn-base btn-color circle\" \n                        style=\"width: 100%; height: 100%\"\n                        :class=\"{active: isSelected(color)}\"\n                        :style=\"'background: ' + colorToCode(color)\"\n                        @click=\"selectColor(color)\">\n                    </button>\n                </div>\n            </div>\n        </div>\n        \n        <div class=\"input-group\">\n            <label>Complimentary Colors</label>\n            <div class=\"flex-left\">\n                <div style=\"aspect-ratio: 1/1; width: calc((100% - 80px) / 6)\" v-for=\"color in complementaryColors()\">\n                    <button class=\"xs-2 btn-base btn-color circle\" \n                        style=\"width: 100%; height: 100%\"\n                        :class=\"{active: isSelected(color)}\"\n                        :style=\"'background: ' + colorToCode(color)\"\n                        @click=\"selectColor(color)\">\n                    </button>\n                </div>\n            </div>\n        </div>\n    </template v-if=\"color_picker && (selected || custom)\">\n    \n    <div class=\"input-group\" v-if=\"!color_picker && colors.length > 1\">\n        <label>Default Colors</label>\n        <div class=\"flex-left\">\n            <div style=\"aspect-ratio: 1/1; width: calc((100% - 80px) / 6)\" v-for=\"color in colors\">\n                <button class=\"xs-2 btn-base btn-color circle\" \n                    :class=\"{active: selected && color.id == selected.id}\" \n                    style=\"width: 100%; height: 100%\"\n                    :style=\"'background: ' + color.background\"\n                    @click=\"selectColor(color)\">\n                </button>\n            </div>\n        </div>\n    </div>\n</div>\n`;","export const html:string = `\n<div class=\"grid\">\n    <div class=\"xs-4\" v-for=\"color in colors\">\n        <button class=\"btn-material btn-clear flex-center column spacing-xs no-wrap full-width\" \n            :class=\"{active: selected && color.id == selected.id}\"   \n            @click=\"selectColor(color)\">\n            <span class=\"material-preview\" :style=\"'background: ' + color.background\" style=\"height: 60px; width: 60px\"></span>\n            {{ color.name }}\n        </button>  \n    </div>\n</div>\n`;","import IVueComponent from '../../../../../../core/adapters/IVueComponent';\nimport {html} from './ClipartColors.html';\nimport {ElementActionController} from '../ElementActionController';\nimport {data, method, prop} from '../../../../../../core/adapters/VueComponent';\nimport {ProductTypeEnum} from '../../../../models/enums';\nimport {Services} from '../../../../../../core/services/Services';\nimport {ClipartRegion} from '../../../../models/ClipartRegion';\nimport {CustomClipartRegion} from '../../../../models/CustomClipartRegion';\nimport {SelectionManager} from '../../../../services/SelectionManager';\n\n\nclass ClipartColorsController extends ElementActionController {\n\n    @data()\n    productService;\n\n    @prop()\n    updateMaterial: boolean;\n\n    @data()\n    update_product_color;\n\n    selection_manager;\n\n    constructor(component) {\n        super(component);\n        this.productService = Services.get('ProductService');\n        this.selection_manager = Services.get<SelectionManager>('SelectionManager');\n        this.update_product_color = (color) => {\n            this.productService.configured.material_color = color;\n        }\n    }\n\n    override mounted() {\n        super.mounted();\n        if (this.element.model.regions) {\n            for (const region of this.element.model.regions) {\n                region['edit_colors'] = false;\n            }\n            this.updateSelectedRegion();\n        }\n        this.selection_manager.bind('click', this.updateSelectedRegion.bind(this), this);\n    }\n\n    override unmounted() {\n        this.selection_manager.unbindWithContext('click', this);\n        super.unmounted();\n    }\n\n    updateSelectedRegion() {\n        if (!this.element.model.regions) {\n            return;\n        }\n\n        for (const region of this.element.model.regions) {\n            region['edit_colors'] = false;\n        }\n\n        if (this.selection_manager.mouse_down_point) {\n            let selected_region = this.element.getSelectedRegion(this.selection_manager.mouse_down_point);\n            if (selected_region) {\n                selected_region['edit_colors'] = true;\n            }\n        }\n    }\n\n    @method()\n    isSingleColor() {\n        return this.productService.base.type == ProductTypeEnum.CUTOUT;\n    }\n\n    @method()\n    regionStyle(region: CustomClipartRegion) {\n        if (region.color) {\n            let color = region.color ? region.color.background : 'transparent';\n            if (region.region.type == 1 && region.hasStroke) {\n                return `border: 4px solid ${color}`;\n            }\n            return `background: ${color}`;\n        }\n        if (region.color_code) {\n            return `background: ${region.color_code}`;\n        }\n        return 'background: transparent';\n    }\n\n    @method()\n    changeStrokeWidth(item: any, change: number) {\n        let new_width = item.stroke_width + change;\n        if (new_width < 0) {\n            new_width = 0;\n        }\n        if (new_width > 10) {\n            new_width = 10;\n        }\n\n       item.stroke_width = new_width;\n    }\n\n    @method()\n    toggleRegion(region) {\n        let start = region['edit_colors'];\n        if (this.element.model.regions) {\n            for (const item of this.element.model.regions) {\n                item['edit_colors'] = false;\n            }\n        }\n        region['edit_colors'] = !start;\n    }\n}\n\n\nexport default function CliaprtColors(): IVueComponent {\n    return {\n        tag: 'tool-clipart-colors',\n        template: html,\n        controller: ClipartColorsController\n    }\n}","export const html:string = `\n<div class=\"flex-left column no-wrap spacing-none full-width stretch\">\n    <div v-for=\"region in element.model.regions\">\n        <div class=\"flex-left column no-wrap spacing-none full-width stretch\">\n            <button class=\"inset-section inset-hover btn-clear flex-left-center space-between\" @click=\"toggleRegion(region)\">\n                <div class=\"flex-left no-wrap tool-color-button\">\n                    <div class=\"card flex-full-center no-shrink\" v-if=\"!isSingleColor() && !region.use_material_colors\" style=\"height: 44px; width: 44px\">\n                        <div class=\"btn-color circle\" style=\"width: 24px; height: 24px\" :style=\"regionStyle(region)\"></div>\n                    </div>\n                    <div class=\"btn-material\" v-if=\"!(!isSingleColor() && !region.use_material_colors)\">\n                        <div class=\"material-preview\" style=\"width: 44px; height: 44px\" :style=\"regionStyle(region)\"></div>\n                    </div>\n                    <div class=\"flex-left column no-wrap spacing-xs\" v-if=\"region.color || region.color_code\">\n                        <b class=\"text-sm\">{{ region.region.name }}</b>\n                        <span class=\"color-name\">{{ region.color ? region.color.name : region.color_code }}</span>\n                    </div>\n                </div>\n                <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"input-transition\" :class=\"region.edit_colors ? 'flip' : ''\">\n                    <path d=\"M6 9L12 15L18 9\" stroke=\"#B9C0D4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                </svg>\n            </button>\n            <hr class=\"padding-none\" v-show=\"!region.edit_colors\">\n            <div class=\"inset-section inset-shadow inset-dropdown\" :class=\"region.edit_colors ? 'open' : ''\">\n                <div class=\"inset-padding flex-left column stretch\">\n                    <tool-element-color v-if=\"!isSingleColor() && !region.use_material_colors\" v-model:selected=\"region.regionColor\" v-model:custom=\"region.custom_color\" :colors=\"productService.colors_available\" :limited=\"productService.base.disable_custom_colors\"></tool-element-color>\n                    <tool-element-material-color v-if=\"!isSingleColor() && region.use_material_colors\" v-model:selected=\"region.regionColor\" :colors=\"productService.colors_available_for_material\" :product-color=\"true\" :change=\"update_product_color\"></tool-element-material-color>\n                    <tool-element-color v-if=\"isSingleColor()\" v-model:selected=\"productService.configured.material_color\" :limited=\"true\" :colors=\"productService.colors_available\"></tool-element-color>\n                    \n                    <div class=\"flex-left no-wrap\" v-show=\"region.region.type == 1 && region.hasStroke\">\n                        <div class=\"input-group\">\n                            <label>Stroke Thickness</label>\n                            <fieldset class=\"input-group single-option\">\n                                <div class=\"toggle-group\">\n                                    <button @click=\"changeStrokeWidth(region, 1)\" class=\"icon-option\">\n                                        <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                            <path d=\"M9.99999 4.16663V15.8333M4.16666 9.99996H15.8333\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                        </svg>\n                                    </button>\n                                    <button @click=\"changeStrokeWidth(region, -1)\" class=\"icon-option\">\n                                        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                            <path d=\"M5 12H19\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                        </svg>\n                                    </button>\n                                </div>\n                            </fieldset>\n                        </div>\n                        <div class=\"input-group\">\n                            <label>Remove Stroke</label>\n                            <button class=\"btn-base btn-secondary-action\" @click=\"region.removeStroke()\">\n                                <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                    <path d=\"M14.1667 5.83334L5.83334 14.1667M5.83334 5.83334L14.1667 14.1667\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                </svg>\n                                Remove\n                            </button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n`;","import VueComponent, {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './CodeForm.html';\nimport {CodeType, QRCode} from '../../../models/QRCode';\nimport MessageList from '../../../../../core/utils/MessageList';\nimport {processRequestError} from '../../../../../core/utils/utils';\n\nclass QRCodeFormController extends VueComponent {\n\n    @prop()\n    code: QRCode;\n\n    @data()\n    errors: MessageList = new MessageList();\n\n    @prop()\n    callback: () => void;\n\n    @prop()\n    actionText: string;\n\n    @prop()\n    buttonType: string;\n\n    @prop()\n    disableType: boolean;\n\n    @prop()\n    disableSelection: boolean;\n\n    @prop()\n    variableData: boolean;\n\n    @data()\n    show_more: boolean;\n\n    override beforeMount() {\n        super.beforeMount();\n\n        if (this.code && !this.code.data_json) {\n            this.code.data_json = {};\n        }\n    }\n\n    @method()\n    save() {\n        this.code.errors.reset();\n        if (this.code.code_type == CodeType.BAR_CODE) {\n            if (!this.code.data_json.value) {\n                this.code.errors.add('value', 'This field is required.');\n                return\n            }\n        }\n\n        this.code.data_json = JSON.stringify(this.code.data_json);\n        this.code.save().then(() => {\n            if (this.callback) {\n                this.callback();\n            }\n        }, (error) => {\n            this.errors = processRequestError(error);\n        });\n        this.code.data_json = JSON.parse(this.code.data_json);\n    }\n}\n\nexport default function CodeForm(): IVueComponent {\n    return {\n        tag: 'code-form',\n        controller: QRCodeFormController,\n        template: html\n    }\n}","export const html:string = `\n<div class=\"flex-left column full-width\">\n    <code-form-type :code=\"code\" :disableType=\"disableType\"></code-form-type>\n    <code-form-data :errors=\"code.errors\" v-if=\"!variableData\" :code-data=\"code.data_json\" :bar-code-type=\"code.barcode_type\" :qr-code-type=\"code.qrcode_type\" :code-type=\"code.code_type\"></code-form-data>\n    <button class=\"btn-base full-width btn-primary-action\" @click=\"save()\">{{ actionText ? actionText : 'Add To Design' }}</button>\n</div>\n`;","import {CodeType, QRCodeType} from '../../../models/QRCode';\n\nexport const html:string = `\n<div class=\"input-group\" v-if=\"codeType == ${CodeType.BAR_CODE}\">\n    <label>{{ prefix }}Data</label>\n    <message-list field=\"value\" :errors=\"errors\">\n        <input type=\"text\" v-model=\"codeData.value\">\n    </message-list>\n</div>\n\n<div class=\"contents\" v-if=\"codeType == ${CodeType.QR_CODE} && qrCodeType == ${QRCodeType.WEBSITE}\">        \n    <div class=\"input-group\">\n        <label>{{ prefix }}Website URL:</label>\n        <input name=\"url\" :placeholder=\"'Example: ' + company.short_url\" v-model=\"codeData.url\">\n    </div>\n</div>\n\n<div class=\"contents\" v-if=\"codeType == ${CodeType.QR_CODE} && qrCodeType == ${QRCodeType.CONTACT}\">\n    <h4>Personal Information</h4>\n    <div class=\"input-group\">\n        <label>Name</label>\n        <input name=\"name\" v-model=\"codeData.name\">\n    </div>\n    <div class=\"input-group\">\n        <label>Email</label>\n        <input name=\"email\" v-model=\"codeData.email\">\n    </div>\n    <div class=\"input-group\">\n        <label>Address</label>\n        <input name=\"address\" v-model=\"codeData.home_address_1\">\n    </div>\n    <div class=\"grid\">\n        <div class=\"input-group xs-6\">\n            <label>State</label>\n            <input name=\"state\" v-model=\"codeData.home_state\">\n        </div>\n        <div class=\"input-group xs-6\">\n            <label>Zip</label>\n            <input name=\"zip\" v-model=\"codeData.home_zip\">\n        </div>\n    </div>\n    <div class=\"input-group\">\n        <label>Title</label>\n        <input name=\"title\" v-model=\"codeData.title\">\n    </div>\n    <div class=\"input-group\">\n        <label>Telephone</label>\n        <input name=\"phone\" v-model=\"codeData.phone_home\">\n    </div>\n    <div class=\"input-group\">\n        <label>City</label>\n        <input name=\"city\" v-model=\"codeData.home_city\">\n    </div>\n    <div class=\"input-group\">\n        <label>Country</label>\n        <input name=\"country\" v-model=\"codeData.home_country\">\n    </div>\n    <hr>\n    <button class=\"btn-link\" v-if=\"!show_more\" @click=\"show_more = true\">Add Company Information</button>\n</div>\n\n<div class=\"contents\" v-if=\"codeType == ${CodeType.QR_CODE} && qrCodeType == ${QRCodeType.CONTACT} && show_more\"> \n    <h4>Company Information</h4>\n    <div class=\"input-group\">\n        <label class=\"first-label\">Company Name</label>\n        <input name=\"company_name\" v-model=\"codeData.company\">\n    </div>\n    <div class=\"input-group\">\n        <label>Telephone</label>\n        <input name=\"phone\" v-model=\"codeData.phone_work\">\n    </div>\n    <div class=\"input-group\">\n        <label>Address</label>\n        <input name=\"address\" v-model=\"codeData.work_address_1\">\n    </div>\n    <div class=\"input-group\">\n        <label>City</label>\n        <input name=\"city\" v-model=\"codeData.work_city\">\n    </div>\n    <div class=\"grid\">\n        <div class=\"input-group xs-6\">\n            <label>State</label>\n            <input name=\"state\" v-model=\"codeData.work_state\">\n        </div>\n        <div class=\"input-group xs-6\">\n            <label>Zip</label>\n            <input name=\"zip\" v-model=\"codeData.work_zip\">\n        </div>\n    </div>\n    <div class=\"input-group\">\n        <label>Country</label>\n        <input name=\"country\" v-model=\"codeData.work_country\">\n    </div>\n</div>\n\n<div class=\"contents\" v-if=\"codeType == ${CodeType.QR_CODE} && qrCodeType == ${QRCodeType.TEXT_MESSAGE}\">\n    <div class=\"input-group\">\n        <label>Number to message</label>\n        <input name=\"country\" placeholder=\"Example: 555-555-5555\" v-model=\"codeData.sms\">\n    </div>\n    <div class=\"input-group\">\n        <label>Message</label>\n        <textarea rows=\"10\" name=\"message\" placeholder=\"Type your message here\" v-model=\"codeData.smsm\"></textarea>\n    </div>\n</div>\n\n<div class=\"contents\" v-if=\"codeType == ${CodeType.QR_CODE} && qrCodeType == ${QRCodeType.CUSTOM}\">        \n    <div class=\"input-group\">\n        <label>{{ prefix }}QR Code Data</label>\n        <textarea rows=\"4\" name=\"info\" v-model=\"codeData.custom\"></textarea>\n    </div>\n</div>\n`;","import VueComponent, {data, prop} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './CodeFormData.html';\nimport {BarCodeType, BarCodeTypeDisplayMap, CodeType, QRCodeType} from '../../../models/QRCode';\nimport Company from '../../../../../core/services/Company';\nimport {Services} from '../../../../../core/services/Services';\nimport MessageList from '../../../../../core/utils/MessageList';\n\nclass CodeFormDataController extends VueComponent {\n\n    @prop()\n    codeData: object;\n\n    @prop()\n    codeType: CodeType;\n\n    @prop()\n    qrCodeType: QRCodeType;\n\n    @prop()\n    barCodeType: BarCodeType;\n\n    @data()\n    company: Company;\n\n    @prop()\n    prefix: string;\n\n    @data()\n    show_more: boolean;\n\n    @prop()\n    errors: MessageList;\n\n    constructor(component) {\n        super(component);\n\n        this.company = Services.get<Company>('Company');\n    }\n}\n\nexport default function CodeFormData(): IVueComponent {\n    return {\n        tag: 'code-form-data',\n        controller: CodeFormDataController,\n        template: html\n    }\n}","import {CodeType, QRCodeType} from '../../../models/QRCode';\n\nexport const html:string = `\n<fieldset class=\"input-group single-option\" v-if=\"!disableType\">\n    <legend>Code Type</legend>\n    <div class=\"toggle-group toggle-sm\">\n        <label for=\"qr-code-selection\">\n            <input id=\"qr-code-selection\" :value=\"${CodeType.QR_CODE}\" name=\"code-type-selection\" type=\"radio\" v-model=\"code.code_type\" @change=\"resetData()\"/>\n            QR Code\n        </label>\n        <label for=\"bar-code-selection\">\n            <input id=\"bar-code-selection\" :value=\"${CodeType.BAR_CODE}\" name=\"code-type-selection\" type=\"radio\" v-model=\"code.code_type\" @change=\"resetData()\"/>\n            Bar Code\n        </label>\n    </div>\n</fieldset>\n\n\n<fieldset class=\"input-group single-option\" v-if=\"code.code_type == ${CodeType.QR_CODE}\">\n    <legend>QR Code Type</legend>\n    <div class=\"toggle-items flex-left no-wrap spacing-sm\">\n        <label class=\"flex-full-center column spacing-xs full-width\" for=\"qr-type-url\" v-tooltip tooltip-content=\"Go to a website\">\n            <input id=\"qr-type-url\" :value=\"${QRCodeType.WEBSITE}\" name=\"qr-code-type\" type=\"radio\" v-model=\"code.qrcode_type\" @change=\"resetData()\">\n            <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M10.25 13C10.6794 13.5742 11.2273 14.0492 11.8565 14.393C12.4857 14.7367 13.1815 14.9411 13.8966 14.9924C14.6117 15.0436 15.3295 14.9404 16.0013 14.6898C16.6731 14.4392 17.2831 14.0471 17.79 13.54L20.79 10.54C21.7007 9.59702 22.2047 8.334 22.1933 7.02302C22.1819 5.71204 21.6561 4.45797 20.729 3.53093C19.802 2.60389 18.5479 2.07805 17.237 2.06666C15.926 2.05526 14.663 2.55924 13.72 3.47003L12 5.18003M14.25 11C13.8205 10.4259 13.2726 9.95084 12.6434 9.60709C12.0142 9.26333 11.3184 9.05891 10.6033 9.00769C9.88816 8.95648 9.17037 9.05966 8.49861 9.31025C7.82685 9.56083 7.21684 9.95296 6.70996 10.46L3.70996 13.46C2.79917 14.403 2.29519 15.666 2.30659 16.977C2.31798 18.288 2.84382 19.5421 3.77086 20.4691C4.6979 21.3962 5.95197 21.922 7.26295 21.9334C8.57393 21.9448 9.83694 21.4408 10.78 20.53L12.49 18.82\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n            URL\n        </label>\n        <label class=\"flex-full-center column spacing-xs full-width\" for=\"qr-type-contact\" v-tooltip tooltip-content=\"Import a contact card\">\n            <input id=\"qr-type-contact\" :value=\"${QRCodeType.CONTACT}\" name=\"qr-code-type\" type=\"radio\" v-model=\"code.qrcode_type\" @change=\"resetData()\" :disabled=\"variableData\">\n            <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M4.75 17.5C4.95 16.9 5.65 15.8 6.25 15.6C6.55 15.6 10.95 15.6 11.25 15.6C11.85 15.8 12.55 16.9 12.75 17.5M15.35 8.9H20.35M15.35 11.9H20.35M15.35 14.9H20.35M3.35 20C2.45 20 1.75 19.3 1.75 18.4V5.6C1.75 4.7 2.45 4 3.35 \\t4H22.25C23.15 4 23.85 4.7 23.85 5.6V18.5C23.85 19.4 23.15 20.1 22.25 20.1L3.35 20ZM8.75 7C7.15 7 5.85 8.3 5.85 9.9C5.85 11.5 7.15 12.8 8.75 12.8C10.35 12.8 11.65 11.5 11.65 9.9C11.65 8.3 10.35 7 8.75 7Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n            Contact\n        </label>\n        <label class=\"flex-full-center column spacing-xs full-width\" for=\"qr-type-text-message\" v-tooltip tooltip-content=\"Send a prefilled text message to a number\">\n            <input id=\"qr-type-text-message\" :value=\"${QRCodeType.TEXT_MESSAGE}\" name=\"qr-code-type\" type=\"radio\" v-model=\"code.qrcode_type\" @change=\"resetData()\" :disabled=\"variableData\">\n            <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M7.25 8.5H12.25M7.25 12H15.25M7.25 18V20.3355C7.25 20.8684 7.25 21.1348 7.35923 21.2716C7.45422 21.3906 7.59827 21.4599 7.75054 21.4597C7.92563 21.4595 8.13367 21.2931 8.54976 20.9602L10.9352 19.0518C11.4225 18.662 11.6662 18.4671 11.9375 18.3285C12.1782 18.2055 12.4344 18.1156 12.6992 18.0613C12.9977 18 13.3097 18 13.9337 18H16.45C18.1302 18 18.9702 18 19.612 17.673C20.1765 17.3854 20.6354 16.9265 20.923 16.362C21.25 15.7202 21.25 14.8802 21.25 13.2V7.8C21.25 6.11984 21.25 5.27976 20.923 4.63803C20.6354 4.07354 20.1765 3.6146 19.612 3.32698C18.9702 3 18.1302 3 16.45 3H8.05C6.36984 3 5.52976 3 4.88803 3.32698C4.32354 3.6146 3.8646 4.07354 3.57698 4.63803C3.25 5.27976 3.25 6.11984 3.25 7.8V14C3.25 14.93 3.25 15.395 3.35222 15.7765C3.62962 16.8117 4.43827 17.6204 5.47354 17.8978C5.85504 18 6.32003 18 7.25 18Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n            Text\n        </label>\n        <label class=\"flex-full-center column spacing-xs full-width\" for=\"qr-type-custom\" v-tooltip tooltip-content=\"Use your own custom format\">\n            <input id=\"qr-type-custom\" :value=\"${QRCodeType.CUSTOM}\" name=\"qr-code-type\" type=\"radio\" v-model=\"code.qrcode_type\" @change=\"resetData()\">\n            <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M7.25 6.5H7.26M18.25 6.5H18.26M7.25 17.5H7.26M13.75 13H13.76M18.25 17.5H18.26M17.75 21H21.75V17M14.75 16.5V21M21.75 14H17.25M16.35 10H20.15C20.7101 10 20.9901 10 21.204 9.89101C21.3922 9.79513 21.5451 9.64215 21.641 9.45399C21.75 9.24008 21.75 8.96005 21.75 8.4V4.6C21.75 4.03995 21.75 3.75992 21.641 3.54601C21.5451 3.35785 21.3922 3.20487 21.204 3.10899C20.9901 3 20.7101 3 20.15 3H16.35C15.7899 3 15.5099 3 15.296 3.10899C15.1078 3.20487 14.9549 3.35785 14.859 3.54601C14.75 3.75992 14.75 4.03995 14.75 4.6V8.4C14.75 8.96005 14.75 9.24008 14.859 9.45399C14.9549 9.64215 15.1078 9.79513 15.296 9.89101C15.5099 10 15.7899 10 16.35 10ZM5.35 10H9.15C9.71005 10 9.99008 10 10.204 9.89101C10.3922 9.79513 10.5451 9.64215 10.641 9.45399C10.75 9.24008 10.75 8.96005 10.75 8.4V4.6C10.75 4.03995 10.75 3.75992 10.641 3.54601C10.5451 3.35785 10.3922 3.20487 10.204 3.10899C9.99008 3 9.71005 3 9.15 3H5.35C4.78995 3 4.50992 3 4.29601 3.10899C4.10785 3.20487 3.95487 3.35785 3.85899 3.54601C3.75 3.75992 3.75 4.03995 3.75 4.6V8.4C3.75 8.96005 3.75 9.24008 3.85899 9.45399C3.95487 9.64215 4.10785 9.79513 4.29601 9.89101C4.50992 10 4.78995 10 5.35 10ZM5.35 21H9.15C9.71005 21 9.99008 21 10.204 20.891C10.3922 20.7951 10.5451 20.6422 10.641 20.454C10.75 20.2401 10.75 19.9601 10.75 19.4V15.6C10.75 15.0399 10.75 14.7599 10.641 14.546C10.5451 14.3578 10.3922 14.2049 10.204 14.109C9.99008 14 9.71005 14 9.15 14H5.35C4.78995 14 4.50992 14 4.29601 14.109C4.10785 14.2049 3.95487 14.3578 3.85899 14.546C3.75 14.7599 3.75 15.0399 3.75 15.6V19.4C3.75 19.9601 3.75 20.2401 3.85899 20.454C3.95487 20.6422 4.10785 20.7951 4.29601 20.891C4.50992 21 4.78995 21 5.35 21Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </svg>\n            Custom\n        </label>\n    </div>\n</fieldset>\n\n<fieldset class=\"input-group single-option\" v-if=\"code.code_type == ${CodeType.BAR_CODE}\">\n    <legend>Bar Code Type</legend>\n    <div class=\"toggle-items grid spacing-sm\">\n        <label class=\"flex-full-center column spacing-xs xs-3\" :for=\"'bar-code-type-' + key\" v-for=\"(value, key) in bar_code_types\" style=\"padding: 8px 4px\">\n            <input :id=\"'bar-code-type-' + key\" :value=\"key\" name=\"bar-code-type\" type=\"radio\" v-model=\"code.barcode_type\">\n            <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M23.75 9V5.7C23.75 4.7 23.05 4 22.15 4H18.75M6.75 4H3.35C2.45 4 1.75 4.8 1.75 5.7V9M1.75 15V18.3C1.75 19.3 2.45 20 3.35 20H6.75M18.75 20H22.15C23.05 20 23.75 19.2 23.75 18.3V15M6.75 8V16M10.75 8V16M14.75 8V16M18.75 8V16\" stroke=\"#98A2B3\" stroke-width=\"1.9\" stroke-miterlimit=\"10\" stroke-linecap=\"round\"/>\n            </svg>\n            {{ value }}\n        </label>\n    </div>\n</fieldset>\n`;","import VueComponent, {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport {html} from './CodeFormType.html';\nimport {BarCodeTypeDisplayMap, QRCode, QRCodeType} from '../../../models/QRCode';\n\nclass CodeFromTypeController extends VueComponent {\n\n    @prop()\n    code: QRCode;\n\n    @prop()\n    disableType: boolean;\n\n    @prop({\n        watch: true\n    })\n    variableData: boolean;\n\n    @data()\n    bar_code_types = BarCodeTypeDisplayMap;\n\n    @method()\n    resetData() {\n        this.code.data_json = {};\n    }\n\n    constructor(component) {\n        super(component);\n\n        this.bind('change:variableData', () => {\n            if (this.variableData) {\n                if (this.code.qrcode_type == QRCodeType.TEXT_MESSAGE || this.code.qrcode_type == QRCodeType.CONTACT) {\n                    this.code.qrcode_type = QRCodeType.WEBSITE;\n                }\n            }\n        }, this);\n    }\n}\n\nexport default function CodeFormType() {\n    return {\n        tag: 'code-form-type',\n        controller: CodeFromTypeController,\n        template: html\n    }\n}","import VueComponent, {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './ToolNavigation.html';\nimport {Services} from '../../../../../core/services/Services';\nimport {SelectionManager} from '../../../services/SelectionManager';\n\nclass ToolNavigationController extends VueComponent {\n\n    @prop()\n    action: () => boolean;\n\n    @method()\n    showBack() {\n        return true;\n    }\n\n    @method()\n    back() {\n        if (this.action) {\n            if (!this.action()) {\n                Services.get<SelectionManager>('SelectionManager').deactivate();\n                Services.get<SelectionManager>('SelectionManager').trigger('selection:add');\n                this.resetScroll();\n            }\n        }\n        else {\n            Services.get<SelectionManager>('SelectionManager').deactivate();\n            Services.get<SelectionManager>('SelectionManager').trigger('selection:add');\n            this.resetScroll();\n        }\n    }\n\n    resetScroll() {\n        setTimeout(() => {\n            let toolbar = document.querySelector('.floating-tool-bar');\n            if (toolbar) {\n                toolbar.scrollTop = 0;\n            }\n        });\n    }\n}\n\nexport default function ToolNavigation(): IVueComponent {\n    return {\n        tag: 'tool-navigation',\n        template: html,\n        controller: ToolNavigationController\n    }\n}","export const html:string = `\n<button class=\"btn-icon\" v-show=\"showBack()\" @click=\"back()\" id=\"tool-back\">\n    <svg height=\"24\" fill=\"none\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15 18L9 12L15 6\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"></path></svg>\n</button>\n`;","import {ElementActionController} from '../ElementActionController';\nimport {html} from './ElementOffsetPath.html';\nimport {data, method, prop} from '../../../../../../core/adapters/VueComponent';\nimport {Color} from '../../../../models/Color';\nimport {Services} from '../../../../../../core/services/Services';\nimport PaperCanvasService from '../../../../services/PaperCanvasService';\n\nclass ElementOffsetPathController extends ElementActionController {\n\n    @data()\n    edit_color: boolean;\n\n    @prop()\n    productService;\n\n    @data()\n    on_color_change;\n\n    constructor(component) {\n        super(component);\n\n        this.on_color_change = this.onColorChange.bind(this);\n    }\n\n    @method()\n    scaleSize(amount: number) {\n        let new_amount = this.element.model.offset_width + amount;\n\n        this.element.model.offset_width = Math.max(Math.min(new_amount, 30), 7);\n    }\n\n    @method()\n    onColorChange(item) {\n        let canvas_service = Services.get<PaperCanvasService>('PaperCanvasService');\n        if (this.productService.configured.offset_path_fill_color) {\n            canvas_service.offset_path_color = `#${this.productService.configured.offset_path_fill_color.code}`;\n\n            if (this.productService.configured.offset_path_fill_color.texture) {\n                canvas_service.offset_path_texture = this.productService.configured.offset_path_fill_color.texture;\n            }\n        }\n        else if (this.productService.configured.offset_path_custom_fill_color) {\n            canvas_service.offset_path_color = this.productService.configured.offset_path_custom_fill_color;\n        }\n        else {\n            canvas_service.offset_path_color = '#ffffff';\n        }\n\n        if (item instanceof Color) {\n            this.productService.configured.offset_path_custom_fill_color = null;\n        }\n        else {\n            this.productService.configured.offset_path_fill_color = null;\n        }\n    }\n}\n\nexport default function ElementOffsetPath() {\n    return {\n        tag: 'element-offset-path',\n        template: html,\n        controller: ElementOffsetPathController\n    }\n}","export const html:string = `\n<hr v-if=\"element.can_offset_path\">\n<div class=\"flex-left column spacing-xs\" v-if=\"element.can_offset_path\">\n    <b class=\"text-strong\">Border</b>\n    <div class=\"flex-left column no-wrap spacing-md full-width\">\n        <div class=\"flex-left no-wrap full-width space-between\">\n            <div class=\"input-group fit-content\" v-if=\"!productService.base.offset_path_uses_material_color\">\n                <label>Color</label>\n                <button class=\"btn-base btn-secondary-action btn-square\" @click=\"edit_color = !edit_color\">\n                    <div class=\"color-circle circle no-shrink\" style=\"background-size: cover\" :style=\"{'background': productService.configured.offset_path_fill_color ? productService.configured.offset_path_fill_color.background : productService.configured.offset_path_custom_fill_color}\"></div>\n                </button>\n            </div>\n            <div class=\"input-group\">\n                <label>Size</label>\n                <fieldset class=\"input-group single-option\">\n                    <div class=\"toggle-group\">\n                        <button @click.prevent=\"scaleSize(-1)\" class=\"icon-option\">\n                            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                <path d=\"M5 12H19\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                            </svg>\n                        </button>\n                        <button @click.prevent=\"scaleSize(1)\" class=\"icon-option\">\n                            <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                <path d=\"M9.99999 4.16663V15.8333M4.16666 9.99996H15.8333\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                            </svg>\n                        </button>\n                    </div>\n                </fieldset>\n            </div>\n            <div class=\"input-group\">\n                <label>Show/Hide</label>\n                <fieldset class=\"input-group single-option\">\n                    <div class=\"toggle-group\">\n                        <label for=\"show-offset-path\" @click.prevent=\"element.addOffsetPath()\">\n                            <input id=\"show-offset-path\" name=\"offset-path-visibility\" type=\"radio\" :checked=\"element.model.offset_width != 0\"/>\n                            <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                <path d=\"M2.92012 12.7132C2.78394 12.4975 2.71584 12.3897 2.67772 12.2234C2.64909 12.0985 2.64909 11.9015 2.67772 11.7766C2.71584 11.6103 2.78394 11.5025 2.92012 11.2868C4.04553 9.50484 7.3954 5 12.5004 5C17.6054 5 20.9553 9.50484 22.0807 11.2868C22.2169 11.5025 22.285 11.6103 22.3231 11.7766C22.3517 11.9015 22.3517 12.0985 22.3231 12.2234C22.285 12.3897 22.2169 12.4975 22.0807 12.7132C20.9553 14.4952 17.6054 19 12.5004 19C7.3954 19 4.04553 14.4952 2.92012 12.7132Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                <path d=\"M12.5004 15C14.1573 15 15.5004 13.6569 15.5004 12C15.5004 10.3431 14.1573 9 12.5004 9C10.8435 9 9.5004 10.3431 9.5004 12C9.5004 13.6569 10.8435 15 12.5004 15Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                            </svg>\n                        </label>\n                        <label for=\"show-offset-path\" @click.prevent=\"element.removeOffsetPath()\">\n                            <input id=\"hide-offset-path\" name=\"offset-path-visibility\" type=\"radio\" :checked=\"element.model.offset_width == 0\"/>\n                            <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                <path d=\"M11.2429 5.09232C11.6494 5.03223 12.0686 5 12.5004 5C17.6054 5 20.9553 9.50484 22.0807 11.2868C22.2169 11.5025 22.285 11.6103 22.3231 11.7767C22.3518 11.9016 22.3517 12.0987 22.3231 12.2236C22.2849 12.3899 22.2164 12.4985 22.0792 12.7156C21.7793 13.1901 21.3222 13.8571 20.7165 14.5805M7.22432 6.71504C5.06225 8.1817 3.59445 10.2194 2.92111 11.2853C2.78428 11.5019 2.71587 11.6102 2.67774 11.7765C2.6491 11.9014 2.64909 12.0984 2.67771 12.2234C2.71583 12.3897 2.78393 12.4975 2.92013 12.7132C4.04554 14.4952 7.39541 19 12.5004 19C14.5588 19 16.3319 18.2676 17.7888 17.2766M3.50042 3L21.5004 21M10.3791 9.87868C9.8362 10.4216 9.50042 11.1716 9.50042 12C9.50042 13.6569 10.8436 15 12.5004 15C13.3288 15 14.0788 14.6642 14.6217 14.1213\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                            </svg>\n                        </label>\n                    </div>\n                </fieldset>\n            </div>\n        </div>\n    </div>\n</div>\n<div>\n    <div class=\"inset-section inset-shadow inset-dropdown\" :class=\"edit_color ? 'open' : ''\" v-if=\"element.can_offset_path\">\n        <div class=\"inset-padding flex-left column stretch\">\n            <tool-element-color :change=\"on_color_change\" v-model:selected=\"productService.configured.offset_path_fill_color\" v-model:custom=\"productService.configured.offset_path_custom_fill_color\" :colors=\"productService.colors_available\"></tool-element-color>\n        </div>\n    </div>\n</div>\n`;","import VueComponent, {data, method, prop} from '../../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../../core/adapters/IVueComponent';\nimport {html} from './ElementToggleBackground.html';\nimport {ElementActionController} from '../ElementActionController';\n\nclass ElementToggleBackgroundController extends ElementActionController {\n    @prop()\n    action;\n\n    @data()\n    disabled: boolean;\n\n    @method()\n    async doAction() {\n        this.disabled = true;\n        await this.action();\n        this.disabled = false;\n    }\n}\n\nexport default function ElementToggleBackground(): IVueComponent {\n    return {\n        tag: 'element-toggle-background',\n        controller: ElementToggleBackgroundController,\n        template: html\n    }\n}","export const html:string = `\n<div class=\"input-group\">\n    <label>Background</label>\n    <button @click=\"doAction()\" class=\"btn-base btn-secondary-action spacing-xs\" v-if=\"!element.model.removed_background\" :disabled=\"disabled\">\n        <svg width=\"24\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <defs>\n                <clipPath id=\"clip0_78_1815\">\n                    <rect width=\"24\" height=\"24\" fill=\"white\" transform=\"translate(0.5)\"/>\n                </clipPath>\n            </defs>\n            <g clip-path=\"url(#clip0_78_1815)\">\n                <path d=\"M6.5 2H2.5V6H6.5V2Z\" fill=\"var(--stroke-strong, #D0D5DD)\" style=\"stroke: none !important;\"/>\n                <path d=\"M14.5 2H10.5V6H14.5V2Z\" fill=\"var(--stroke-strong, #D0D5DD)\" style=\"stroke: none !important;\"/>\n                <path d=\"M22.5 2H18.5V6H22.5V2Z\" fill=\"var(--stroke-strong, #D0D5DD)\" style=\"stroke: none !important;\"/>\n                <path d=\"M10.5 10H8.5H6.5V6H8.5H10.5V10Z\" fill=\"var(--stroke-strong, #D0D5DD)\" style=\"stroke: none !important;\"/>\n                <path d=\"M18.5 6H14.5V10H18.5V6Z\" fill=\"var(--stroke-strong, #D0D5DD)\" style=\"stroke: none !important;\"/>\n                <path d=\"M6.5 10H2.5V14H6.5V10Z\" fill=\"var(--stroke-strong, #D0D5DD)\" style=\"stroke: none !important;\"/>\n                <path d=\"M14.5 10H10.5V14H14.5V10Z\" fill=\"var(--stroke-strong, #D0D5DD)\" style=\"stroke: none !important;\"/>\n                <path d=\"M22.5 14H21.77L18.5 11.24V10H22.5V14Z\" fill=\"var(--stroke-strong, #D0D5DD)\" style=\"stroke: none !important;\"/>\n                <path d=\"M6.5 18V14H10.5L6.5 18Z\" fill=\"var(--stroke-strong, #D0D5DD)\" style=\"stroke: none !important;\"/>\n                <path d=\"M2.5 22V18H6.5L2.5 22Z\" fill=\"var(--stroke-strong, #D0D5DD)\" style=\"stroke: none !important;\"/>\n                <path d=\"M2 22.0001L9.69 14.81C10.18 14.32 10.43 14.07 10.71 13.98C10.96 13.9 11.23 13.9 11.48 13.98C11.76 14.07 12.01 14.32 12.5 14.81L20.63 22.94M13.57 15.89L17.13 12.33C17.62 11.84 17.87 11.59 18.15 11.5C18.4 11.42 18.67 11.42 18.92 11.5C19.2 11.59 19.45 11.84 19.94 12.33L23.5 15.89M3.5 1H21.5C22.6046 1 23.5 1.89543 23.5 3V21C23.5 22.1046 22.6046 23 21.5 23H3.5C2.39543 23 1.5 22.1046 1.5 21V3C1.5 1.89543 2.39543 1 3.5 1Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n            </g>\n        </svg>\n        Erase Background\n    </button>\n    <button @click=\"doAction()\" class=\"btn-base btn-secondary-action spacing-xs\" v-if=\"element.model.removed_background\" :disabled=\"disabled\">\n        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <path d=\"M1.5 22.0001L9.19 14.81C9.68 14.32 9.93 14.07 10.21 13.98C10.46 13.9 10.73 13.9 10.98 13.98C11.26 14.07 11.51 14.32 12 14.81L20.13 22.94M13.07 15.89L16.63 12.33C17.12 11.84 17.37 11.59 17.65 11.5C17.9 11.42 18.17 11.42 18.42 11.5C18.7 11.59 18.95 11.84 19.44 12.33L23 15.89M3 1H21C22.1046 1 23 1.89543 23 3V21C23 22.1046 22.1046 23 21 23H3C1.89543 23 1 22.1046 1 21V3C1 1.89543 1.89543 1 3 1ZM10 7C10 8.65685 8.65685 10 7 10C5.34315 10 4 8.65685 4 7C4 5.34315 5.34315 4 7 4C8.65685 4 10 5.34315 10 7Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\"/>\n        </svg>\n        Reset Background\n    </button>\n</div>\n`;","import VueComponent, {data, prop} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './DirectUpload.html';\nimport AbstractDesignToolController from '../AbstractDesignToolController';\nimport {UserFile} from '../../../models/UserFile';\nimport {eventToFiles} from '../../../../../core/utils/utils';\n\nclass DirectUploadController extends AbstractDesignToolController {\n    /*\n        This component can't be hidden with v-if or it will not work.\n        It should hide its self when the tab is not active.\n     */\n    @data()\n    files: File[] = [];\n\n    @data()\n    upload_success;\n\n    @data()\n    upload_failure;\n\n    @data()\n    file_to_form_data;\n\n    allowed_extensions = [\n        'psd',\n        'pdf',\n        'ai',\n        'eps',\n        'tif',\n        'tiff',\n        'png',\n        'jpg',\n        'jpeg',\n        'gif',\n        'bmp',\n        'webp',\n        'heic',\n        'avif'\n    ]\n\n    constructor(component) {\n        super(component);\n\n        this.upload_success = async (response, file) => {\n            if (this.files.indexOf(file) !== -1) {\n                this.files.splice(this.files.indexOf(file), 1);\n            }\n\n            const user_file = UserFile.objects.get({\n                id: response.data.user_file\n            });\n\n            await user_file.$promise;\n\n            this.productService.createUserFileElement({\n                user_file: user_file\n            });\n        }\n        this.file_to_form_data = (file: File) => {\n            let form_data = new FormData()\n            form_data.append('file', file);\n\n            if (this.productService.configured.id) {\n                form_data.append('custom', `${this.productService.configured.id}`);\n            }\n\n            return form_data;\n        }\n\n        window.addEventListener('paste', (event) => {\n            if (event.clipboardData.files.length == 0) {\n                return;\n            }\n            event.preventDefault();\n            this.parseFiles([...event.clipboardData.files]);\n        });\n        let main_container = document.querySelector('.design-tool-canvas');\n        main_container.addEventListener('drop', (event) => {\n            event.preventDefault();\n            let files = eventToFiles(event);\n            if (files.length > 0) {\n                this.parseFiles(files);\n            }\n        });\n        main_container.addEventListener('dragover', (event) => event.preventDefault());\n    }\n\n    parseFiles(files: File[]) {\n        let change_tab = false;\n        for (const file of files) {\n            if (!file || !file.name) {\n                continue;\n            }\n            \n            let parts = file.name.split('.');\n            let extension = parts[parts.length - 1];\n            if (this.allowed_extensions.indexOf(extension) !== -1) {\n                change_tab = true;\n                this.files.push(file);\n            }\n        }\n\n        if (change_tab) {\n            this.productService.trigger('selection:direct-upload');\n        }\n    }\n}\n\nexport default function DirectUpload(): IVueComponent {\n    return {\n        tag: 'design-tool-direct-upload',\n        controller: DirectUploadController,\n        template: html\n    }\n}","export const html:string = `\n<div class=\"tool-action-header\" v-show=\"activeTab == 'direct-upload'\">\n    <tool-navigation></tool-navigation>\n    <h3 class=\"full-width align-center\">Upload</h3>\n</div>\n<div class=\"inner-drag-content\" v-show=\"activeTab == 'direct-upload'\">\n    <template v-for=\"file in files\">\n        <file-upload url=\"/custom/api/v1/upload/\" :form-data=\"file_to_form_data\" :success=\"upload_success\" :failure=\"upload_failure\" :direct-upload=\"file\"></file-upload>\n    </template>\n</div>\n`;","import VueComponent, {method} from '../../../../../core/adapters/VueComponent';\nimport {Services} from '../../../../../core/services/Services';\nimport {SelectionManager} from '../../../services/SelectionManager';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './LayerRemove.html';\n\nclass LayerRemoveComponent extends VueComponent {\n    @method()\n    promptDelete() {\n        Services.get<SelectionManager>('SelectionManager').trigger('selection:delete');\n    }\n}\n\nexport default function LayerRemove(): IVueComponent {\n    return {\n        tag: 'layer-remove',\n        controller: LayerRemoveComponent,\n        template: html\n    }\n}","export const html:string = `\n<button class=\"btn-icon\" @click=\"promptDelete()\" id=\"tool-delete\">\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M16 6V5.2C16 4.0799 16 3.51984 15.782 3.09202C15.5903 2.71569 15.2843 2.40973 14.908 2.21799C14.4802 2 13.9201 2 12.8 2H11.2C10.0799 2 9.51984 2 9.09202 2.21799C8.71569 2.40973 8.40973 2.71569 8.21799 3.09202C8 3.51984 8 4.0799 8 5.2V6M10 11.5V16.5M14 11.5V16.5M3 6H21M19 6V17.2C19 18.8802 19 19.7202 18.673 20.362C18.3854 20.9265 17.9265 21.3854 17.362 21.673C16.7202 22 15.8802 22 14.2 22H9.8C8.11984 22 7.27976 22 6.63803 21.673C6.07354 21.3854 5.6146 20.9265 5.32698 20.362C5 19.7202 5 18.8802 5 17.2V6\"\n              stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n    </svg>\n</button>\n`;","import VueComponent, {data, method, prop} from '../../../../../core/adapters/VueComponent';\nimport IVueComponent from '../../../../../core/adapters/IVueComponent';\nimport {html} from './SelectLayerBar.html';\nimport CustomEditorService from '../../../services/CustomEditorService';\nimport PaperCanvasService from '../../../services/PaperCanvasService';\nimport {Services} from '../../../../../core/services/Services';\n\nclass SelectLayerBarController extends VueComponent {\n    @prop()\n    productService: CustomEditorService;\n\n    @data()\n    sides;\n\n    @data()\n    canvas_service: PaperCanvasService;\n\n    constructor(component) {\n        super(component);\n        this.canvas_service = Services.get<PaperCanvasService>('PaperCanvasService');\n    }\n\n    override mounted() {\n        super.mounted();\n\n        this.productService.setup_complete.then(() => {\n            this.sides = Services.get<PaperCanvasService>('PaperCanvasService').sides;\n        });\n    }\n\n    @method()\n    selectSide(side) {\n        return Services.get<PaperCanvasService>('PaperCanvasService').selectSide(side.id);\n    }\n}\n\nexport default function SelectLayerBar(): IVueComponent {\n    return {\n        controller: SelectLayerBarController,\n        tag: 'select-layer-bar',\n        template: html\n    }\n}","export const html:string = `\n<div class=\"flex-left-center no-wrap stretch full-width spacing-none\" v-if=\"sides && sides.length > 1\">\n    <button class=\"btn-clear btn-side-tab full-width\" v-for=\"side in sides\" @click=\"selectSide(side)\" :class=\"{selected: canvas_service.active_side == side.id}\">\n        {{ side.name }}\n    </button>\n</div>\n`;","import {data, method, prop} from \"../../../../../core/adapters/VueComponent\";\nimport CustomEditorService from \"../../../services/CustomEditorService\";\nimport IVueComponent from \"../../../../../core/adapters/IVueComponent\";\nimport {html} from \"./AddVariableDataModal.html\";\nimport {ModalController} from \"../../../../../core/adapters/ModalComponent\";\nimport {range} from \"../../../../../core/utils/utils\";\nimport MessageList from \"../../../../../core/utils/MessageList\";\n\n\nclass AddVariableDataModalController extends ModalController {\n\n    @prop()\n    productService: CustomEditorService;\n\n    @data()\n    uploaded_csv;\n\n    @data()\n    uploaded_columns;\n\n    @data()\n    selected_upload_column: any;\n\n    @data()\n    uploaded_elements: any[];\n\n    @data()\n    use_csv_headers: boolean;\n\n    @data()\n    errors: MessageList;\n\n    constructor(component) {\n        super(component, 'add-variable-data-modal');\n    }\n\n    override onOpen() {\n        if (this.productService.add_variable_data_file) {\n            this.loadFileData();\n        }\n        else {\n            this.close();\n        }\n    }\n\n    override onClose() {\n        this.productService.add_variable_data_file = null;\n        this.productService.add_variable_data_callback = null;\n    }\n\n    loadFileData() {\n        this.selected_upload_column = null;\n\n        let csv_data = this.productService.add_variable_data_file;\n\n        // Rows and columns seem flipped, convert to standard format\n        if (csv_data.length == 1 && csv_data[0].length > 1) {\n            csv_data = csv_data[0].map(v => [v])\n        }\n\n        this.uploaded_columns = csv_data.reduce((k, v) => Math.max(k, v.length), 0);\n\n        // Normalize empty column values\n        for (const item of csv_data) {\n            while (item.length < this.uploaded_columns) {\n                item.push('');\n            }\n        }\n\n        this.uploaded_csv = csv_data;\n        this.uploaded_elements = range(0, this.uploaded_columns).map(v => null);\n\n        if (this.uploaded_columns == 1) {\n            this.selected_upload_column = 0;\n        }\n        else {\n            this.selected_upload_column = null;\n        }\n    }\n\n    @method()\n    importData() {\n        if (this.selected_upload_column == null) {\n            this.errors = new MessageList();\n            this.errors.add('column', 'You must select a column to import.');\n            return;\n        }\n\n        let parsed_data = this.uploaded_csv.map(v => v[this.selected_upload_column]);\n        if (this.use_csv_headers) {\n            parsed_data.shift()\n        }\n\n        this.productService.add_variable_data_callback(parsed_data);\n        this.close();\n    }\n}\n\nexport default function AddVariableDataModal(): IVueComponent {\n    return {\n        tag: 'add-variable-data-modal',\n        controller: AddVariableDataModalController,\n        template: html\n    }\n}","export const html:string = `\n<div class=\"modal\" id=\"add-variable-data-modal\">\n    <div class=\"modal-dialog modal-xl full-height\">\n        <div class=\"modal-content no-overflow\">\n            <div class=\"modal-header\">\n                <h4>Select Data to Import</h4>\n                <button type=\"button\" class=\"close\" @click=\"close()\" aria-label=\"Close\">\n                    &times;\n                </button>\n            </div>\n            <div class=\"modal-body full-height\" v-if=\"uploaded_csv && uploaded_csv.length > 0\" style=\"max-height: calc(100% - 134px);\">\n                <span class=\"text-xs\">{{ uploaded_csv.length - (use_csv_headers ? 1 : 0) }} Rows • {{ uploaded_columns }} Columns</span>\n                <b>Click a column to use</b>\n                <message-list :errors=\"errors\" field=\"column\"></message-list>\n                <div class=\"card no-overflow\" style=\"background: transparent\">\n                    <div class=\"table-responsive full-width full-height\" v-if=\"uploaded_csv && uploaded_columns\">\n                        <table class=\"table table-transparent-body full-width table-cells\" style=\"table-layout: fixed;\">\n                            <thead>\n                                <tr>\n                                    <th style=\"width: 80px\">Row</th>\n                                    <th v-for=\"index in $filters.range(0, uploaded_columns)\" @click=\"selected_upload_column = index\" :class=\"{'highlight': selected_upload_column == index}\">\n                                        <template v-if=\"!use_csv_headers\">\n                                            Column {{ index + 1 }}\n                                        </template>\n                                        <template v-if=\"use_csv_headers\">\n                                            {{ uploaded_csv[0][index] }}\n                                        </template>\n                                    </th>\n                                </tr>\n                            </thead>\n                            <tbody>\n                                <tr v-for=\"i in $filters.range(use_csv_headers ? 1 : 0, uploaded_csv.length)\">\n                                    <th>{{ use_csv_headers ? i : i+1 }}</th>\n                                    <td v-for=\"ei in $filters.range(0, uploaded_csv[i].length)\" @click=\"selected_upload_column = ei\" :class=\"{'highlight': selected_upload_column == ei}\">\n                                        {{ uploaded_csv[i][ei] }}\n                                    </td>\n                                </tr>\n                            </tbody>\n                        </table>\n                    </div>\n                </div>\n                <div class=\"input-group\">\n                    <label class=\"flex-left-center spacing-sm\">\n                        <input type=\"checkbox\" v-model=\"use_csv_headers\">\n                        Exclude first row (column names)\n                    </label>\n                </div>\n            </div>\n            <div class=\"modal-footer\">\n                <button @click=\"importData()\" class=\"btn-base btn-primary-action\">Add To Design</button>\n            </div>\n        </div>\n    </div>\n</div>\n`","import {SymbolType} from \"../../../models/enums\";\n\nexport const html:string = `\n<div class=\"modal\" id=\"edit-variable-data-modal\">\n    <div class=\"modal-dialog modal-xl full-height\">\n        <div class=\"modal-content no-overflow\">\n            <div class=\"modal-header\">\n                <h4>Edit Variable Data</h4>\n                <button type=\"button\" class=\"close\" @click=\"close()\" aria-label=\"Close\">\n                    &times;\n                </button>\n            </div>\n            <div class=\"modal-body full-height\" style=\"max-height: calc(100% - 134px);\">\n                <message-list :warnings=\"warnings\" field=\"empty\"></message-list>\n                <div class=\"card no-overflow\">\n                    <div class=\"table-responsive full-width\" v-if=\"elements && variable_data\" style=\"overflow: scroll; max-height: 100%;\">\n                        <table class=\"table table-cells full-width\" style=\"table-layout: fixed;\">\n                            <thead>\n                                <tr>\n                                    <th style=\"width: 100px\">Row</th>\n                                    <th v-for=\"element in elements\">\n                                        {{ element.type_name }}\n                                    </th>\n                                    <th style=\"width: 56px\"></th>\n                                </tr>\n                            </thead>\n                            <tbody>\n                                <tr v-for=\"row in $filters.range(0, loaded_quantity)\">\n                                    <th style=\"width: 100px\" :class=\"{error: delete_preview == row}\">\n                                        <button class=\"btn-link plain-link\" @click=\"productService.viewRow(row)\" :class=\"{'strong': row == productService.visible_row}\" v-tooltip :tooltip-content=\"'View Row'\">\n                                            {{ row + 1 }}\n                                        </button>\n                                    </th>\n                                    <td v-for=\"column in $filters.range(0, elements.length)\"\n                                        :contenteditable=\"elements[column].symbol == ${SymbolType.CSV_LIST}\" \n                                        :class=\"{editable: elements[column].symbol == ${SymbolType.CSV_LIST}, warning: !variable_data[column][row], empty: !variable_data[column][row], error: delete_preview == row }\"\n                                        @blur=\"variable_data[column][row] = $event?.target?.textContent; validate()\"\n                                        @keydown.enter.prevent=\"variable_data[column][row] = $event?.target?.textContent; select(column, row+1)\"\n                                        @keydown.down.prevent=\"variable_data[column][row] = $event?.target?.textContent; select(column, row+1)\"\n                                        @keydown.up.prevent=\"variable_data[column][row] = $event?.target?.textContent; select(column, row-1)\"\n                                        :id=\"'VD-' + column + '-' + row\">\n                                        {{ variable_data[column][row] }}\n                                    </td>\n                                    <td style=\"padding: 8px 16px 0 16px;\" :class=\"{error: delete_preview == row}\">\n                                        <button class=\"btn-icon\" @click=\"deleteRow(row)\" v-tooltip :tooltip-content=\"'Delete Row'\" @mouseover=\"delete_preview = row\" @mouseleave=\"delete_preview = null\">\n                                            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                                                <path d=\"M16 6V5.2C16 4.0799 16 3.51984 15.782 3.09202C15.5903 2.71569 15.2843 2.40973 14.908 2.21799C14.4802 2 13.9201 2 12.8 2H11.2C10.0799 2 9.51984 2 9.09202 2.21799C8.71569 2.40973 8.40973 2.71569 8.21799 3.09202C8 3.51984 8 4.0799 8 5.2V6M10 11.5V16.5M14 11.5V16.5M3 6H21M19 6V17.2C19 18.8802 19 19.7202 18.673 20.362C18.3854 20.9265 17.9265 21.3854 17.362 21.673C16.7202 22 15.8802 22 14.2 22H9.8C8.11984 22 7.27976 22 6.63803 21.673C6.07354 21.3854 5.6146 20.9265 5.32698 20.362C5 19.7202 5 18.8802 5 17.2V6\" stroke=\"#B9C0D4\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                            </svg>\n                                        </button>\n                                    </td>\n                                </tr>\n                            </tbody>\n                        </table>\n                    </div>\n                </div>\n                <div class=\"flex-left\">\n                    <button class=\"btn-link flex-left-center spacing-sm\" @click=\"addRow()\">\n                        <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                            <path d=\"M12 5V19M5 12H19\" stroke=\"#6941C6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                        </svg>\n                        Add Row\n                    </button>\n                </div>\n            </div>\n            <div class=\"modal-footer\">\n                <button class=\"btn-base btn-primary-action\" @click=\"save()\">Save</button>\n            </div>\n        </div>\n    </div>\n</div>\n`;","import {ModalController} from \"../../../../../core/adapters/ModalComponent\";\nimport IVueComponent from \"../../../../../core/adapters/IVueComponent\";\nimport {html} from \"./EditVariableDataModa.html\";\nimport {data, method, prop} from \"../../../../../core/adapters/VueComponent\";\nimport {VariableDataElementAbstract} from \"../../../models/abstract/VariableDataElementAbstract\";\nimport CustomEditorService from \"../../../services/CustomEditorService\";\nimport MessageList from \"../../../../../core/utils/MessageList\";\n\nclass EditVariableDataModalController extends ModalController {\n\n    @prop()\n    productService: CustomEditorService;\n\n    @data()\n    elements: VariableDataElementAbstract[];\n\n    @data()\n    elements_clone: VariableDataElementAbstract[];\n\n    @data()\n    variable_data;\n\n    @data()\n    selected_element;\n\n    @data()\n    loaded_quantity: number;\n\n    @data()\n    delete_preview;\n\n    @data()\n    warnings: MessageList;\n\n    constructor(component) {\n        super(component, 'edit-variable-data-modal');\n    }\n\n    syncData() {\n        for (var i = 0; i < this.elements.length; i++) {\n            this.elements[i].copyDataFrom(this.elements_clone[i]);\n        }\n    }\n\n    @method()\n    select(column, row) {\n        let element = this.elements_clone[column];\n        if (element.range <= row) {\n            this.addRow();\n        }\n        if (row < 0) {\n            row = 0;\n        }\n        if (column < 0) {\n            column = 0;\n        }\n        if (column > this.elements_clone.length - 1) {\n            column = this.elements_clone.length - 1;\n        }\n\n        this.$nextTick(() => {\n            this.$el.querySelector(`#VD-${column}-${row}`)?.focus();\n        });\n    }\n\n    loadData() {\n        this.variable_data = [];\n\n        this.loaded_quantity = Math.max(...this.elements_clone.map(v => v.range));\n        for (var i = 0; i < this.elements_clone.length; i++) {\n            let element = this.elements_clone[i];\n\n            // Normalize data length\n            while (element.range < this.loaded_quantity) {\n                let start = element.range;\n                element.incrementValue();\n\n                if (element.range == start) {\n                    console.warn('Unable to increment the value of a element');\n                    break;\n                }\n            }\n\n            // Create a copy so we can save or discard changes\n            this.variable_data.push(element.variableDataValues());\n        }\n    }\n\n    loadToolData() {\n        this.elements = this.productService.configured.variableDataElements();\n\n        // The design comp calls for a save action, not live editing, so we need to create a copy of the elements that we can work with\n        this.elements_clone = [];\n        for (const item of this.elements) {\n            let clone = new (item.constructor as any)();\n            clone.symbol = item.symbol;\n            clone.copyDataFrom(item);\n            this.elements_clone.push(clone);\n        }\n        this.loadData();\n    }\n\n    override onOpen() {\n        this.selected_element = null;\n        this.loadToolData();\n        this.validate();\n    }\n\n    @method()\n    save() {\n        this.syncData();\n        this.close();\n    }\n\n    @method()\n    deleteRow(row) {\n        if (window.confirm(`Delete row ${row + 1}?`)) {\n            for (const item of this.elements_clone) {\n                item.removeRow(row);\n            }\n            this.loadData();\n        }\n    }\n\n    @method()\n    addRow() {\n        // This should add a row to all variable data elements\n        // Number ranges should have the range value automatically incremented\n        for (const element of this.elements_clone) {\n            element.incrementValue();\n        }\n        this.loadData();\n    }\n\n    @method()\n    validate() {\n        this.warnings = new MessageList();\n        if (this.elements_clone.find(v => v.emptyValues() || v.range < this.loaded_quantity)) {\n            this.warnings.add('empty', 'There are empty values in the variable data.')\n        }\n    }\n}\n\nexport default function EditVariableDataModal(): IVueComponent {\n    return {\n        controller: EditVariableDataModalController,\n        tag: 'edit-variable-data-modal',\n        template: html\n    }\n}","import {data, method} from \"../../../../../core/adapters/VueComponent\";\nimport IVueComponent from \"../../../../../core/adapters/IVueComponent\";\nimport {html, ShapeType} from \"./AddUserShape.html\";\nimport AbstractDesignToolController from \"../AbstractDesignToolController\";\nimport {add, BEZIER_CIRCLE_SCALE, Point, pointDistance, scale, subtract} from \"../../../../../core/utils/VectorUtils\";\nimport {PathPoint} from \"../../../tool/UserShapeElement\";\nimport {toRadians} from \"chart.js/helpers\";\nimport {UserShapeType} from \"../../../models/UserShape\";\n\nclass AddUserShapeController extends AbstractDesignToolController {\n\n    @data()\n    path_data: string;\n\n    @data()\n    shape_type: ShapeType = ShapeType.ellipse;\n\n    @data()\n    side_count: number = 4;\n\n    @data()\n    shape_size: number = 400;\n\n    @data()\n    stroke_width: number = 12;\n\n    @data()\n    svg_path: string;\n\n    @data()\n    roundness: number = 0;\n\n    @data()\n    viewbox: string;\n\n    constructor(component) {\n        super(component);\n\n        this.buildShapePath();\n    }\n\n    @method()\n    addElement() {\n        this.buildShapePath();\n        this.productService.createUserShapeElement({\n            path: this.path_data,\n            shape_type: this.shape_type == ShapeType.ellipse ? UserShapeType.ELLIPSE : UserShapeType.POLYGON,\n            width: this.shape_size,\n            height: this.shape_size\n        });\n    }\n\n    createRegularPolygon(sides: number, radius: number, position: Point): PathPoint[] {\n        if (sides < 3) {\n            sides = 3;\n        }\n\n        radius = radius * 0.5;\n\n        const points = [];\n        let start_angle = -Math.PI / 2;\n        if (sides == 4) {\n            start_angle = toRadians(45);\n        }\n        const angle_step = (2 * Math.PI) / sides;\n\n        for (let i = 0; i < sides; i++) {\n            const angle = start_angle + i * angle_step;\n\n            points.push({\n                x: position.x + radius + (radius * Math.cos(angle)),\n                y: position.y + radius + (radius * Math.sin(angle)),\n                radius: this.roundness\n            });\n        }\n\n        return points;\n    }\n\n    createStarPolygon(points: number, size: number, position: Point): PathPoint[] {\n        if (points < 5) {\n            points = 5;\n        }\n\n        let outer_radius = size / 2;\n\n        // Inner radius formula for a symmetric regular star (classic star proportions)\n        let innerRadius = outer_radius * (Math.cos((2 * Math.PI) / points) / Math.cos(Math.PI / points));\n\n        let vertices = [];\n        let total_vertices = points * 2;\n        let angle_step = Math.PI / points;\n\n        // Start with one point facing upward\n        let start_angle = -Math.PI / 2;\n\n        for (let i = 0; i < total_vertices; i++) {\n            let radius = i % 2 === 0 ? outer_radius : innerRadius;\n            let angle = start_angle + i * angle_step;\n\n            vertices.push({\n                x: position.x + outer_radius + (radius * Math.cos(angle)),\n                y: position.y + outer_radius + (radius * Math.sin(angle)),\n                radius: i % 2 === 0 ? this.roundness : 0\n            });\n        }\n\n        return vertices;\n    }\n\n    correctMinimums() {\n        if (this.shape_type == ShapeType.polygon) {\n            this.side_count = Math.max(this.side_count, 3);\n        }\n        if (this.shape_type == ShapeType.star) {\n            this.side_count = Math.max(this.side_count, 5);\n        }\n        if (this.shape_type == ShapeType.rectangle) {\n            this.side_count = 4;\n        }\n    }\n\n    @method()\n    buildShapePath(sides?) {\n        if (sides) {\n            this.side_count = sides;\n        }\n\n        let padding = this.stroke_width * 2;\n        this.viewbox = `-${padding} -${padding} ${this.shape_size + (padding * 2)} ${this.shape_size + (padding * 2)}`;\n\n        if (this.shape_type == ShapeType.ellipse) {\n            return;\n        }\n        this.correctMinimums();\n\n        let points: PathPoint[];\n        if (this.shape_type == ShapeType.polygon || this.shape_type == ShapeType.rectangle) {\n            points = this.createRegularPolygon(this.side_count, this.shape_size, {x: 0, y: 0});\n        }\n        else if (this.shape_type == ShapeType.star) {\n            points = this.createStarPolygon(this.side_count, this.shape_size, {x: 0, y: 0});\n        }\n\n        if (!points || points.length == 0) {\n            return;\n        }\n\n        this.path_data = JSON.stringify(points);\n\n        let starting_point = null;\n\n        let path_parts = [];\n        for (var i = 0; i < points.length; i++) {\n            let current = points[i];\n            if (current.radius == 0) {\n                path_parts.push(`L ${current.x} ${current.y}`);\n                if (i == points.length - 1) {\n                    starting_point = `${current.x} ${current.y}`;\n                }\n            }\n            else {\n                // This should mirror the code in the UserShapeElement\n                let last = points[i == 0 ? points.length - 1 : i - 1];\n                let next = points[i == points.length - 1 ? 0 : i + 1];\n\n                let offset_last = pointDistance(current, last, current.radius);\n                let offset_next = pointDistance(current, next, current.radius);\n\n                let last_handle = add(current, scale(subtract(offset_last, current), BEZIER_CIRCLE_SCALE));\n                let next_handle = add(current, scale(subtract(offset_next, current), BEZIER_CIRCLE_SCALE));\n\n                path_parts.push(`L ${offset_last.x} ${offset_last.y}`);\n                path_parts.push(`C ${last_handle.x} ${last_handle.y} ${next_handle.x} ${next_handle.y} ${offset_next.x} ${offset_next.y}`);\n\n                if (i == points.length - 1) {\n                    starting_point = `${offset_next.x} ${offset_next.y}`;\n                }\n            }\n        }\n\n        this.svg_path = `M ${starting_point} ${path_parts.join(' ')} Z`;\n    }\n}\n\nexport default function AddUserShape(): IVueComponent {\n    return {\n        tag: 'design-tool-add-user-shape',\n        controller: AddUserShapeController,\n        template: html\n    }\n}","import {UserShapeType} from \"../../../models/UserShape\";\n\nexport const html:string = `\n<div class=\"tool-action-header\">\n    <tool-navigation></tool-navigation>\n    <h3 class=\"full-width align-center\">Edit Shape</h3>\n    <layer-remove></layer-remove>\n</div>\n<div class=\"inner-drag-content\">\n    <div class=\"input-group\" v-if=\"element.model.shape_type == ${UserShapeType.POLYGON}\">\n        <fieldset class=\"input-group single-option\">\n            <legend>Edit Mode</legend>\n            <div class=\"toggle-group\">\n                <label>\n                    <input name=\"move-scale\" type=\"radio\" value=\"move-scale\" v-model=\"edit_mode\" @change=\"updateSelectionType()\">\n                    Move/Scale\n                </label>\n                <label>\n                    <input name=\"edit-points\" type=\"radio\" value=\"edit-points\" v-model=\"edit_mode\" @change=\"updateSelectionType()\">\n                    Edit Points\n                </label>\n            </div>\n        </fieldset>\n    </div>\n    \n    <div class=\"inset-padding flex-left column stretch\">\n        <tool-element-color v-if=\"!isSingleColor() && !productService.base.show_material_color\" v-model:selected=\"element.model.color\" v-model:custom=\"element.model.custom_color\" :colors=\"productService.colors_available\"></tool-element-color>\n        <tool-element-material-color v-if=\"!isSingleColor() && productService.base.show_material_color\" v-model:selected=\"element.model.color\" :colors=\"productService.colors_available_for_material\" :product-color=\"true\"></tool-element-material-color>\n        <tool-element-color v-if=\"isSingleColor()\" v-model:selected=\"element.model.color\" :limited=\"true\" :colors=\"productService.colors_available\"></tool-element-color>\n    </div>\n    \n    <tool-layer-position :element=\"element\"></tool-layer-position>\n\n    <design-tool-footer-actions\n        :product-service=\"productService\"\n        :element=\"element\"\n        :active-tab=\"activeTab\">\n    </design-tool-footer-actions>\n        \n    <slot></slot>\n</div>\n`;\n","import IVueComponent from \"../../../../../core/adapters/IVueComponent\";\nimport {html} from \"./EditUserShape.html\";\nimport AbstractDesignToolController from \"../AbstractDesignToolController\";\nimport {data, method} from \"../../../../../core/adapters/VueComponent\";\nimport {Services} from \"../../../../../core/services/Services\";\nimport {SelectionStateManager} from \"../../../services/SelectionStateManager\";\n\n\nclass EditUserShapeController extends AbstractDesignToolController {\n\n    @data()\n    edit_mode: string = 'move-scale';\n\n    constructor(component) {\n        super(component);\n\n        Services.get<SelectionStateManager>('SelectionStateManager').bind('change:manager', () => {\n            this.updateCurrentManager();\n            this.$forceUpdate();\n        }, this);\n\n        this.updateCurrentManager();\n    }\n\n    updateCurrentManager() {\n        let editing_points = Services.get<SelectionStateManager>('SelectionStateManager').editingPoints();\n        this.edit_mode = editing_points ? 'edit-points' : 'move-scale';\n    }\n\n    @method()\n    updateSelectionType() {\n        let state_manager = Services.get<SelectionStateManager>('SelectionStateManager');\n        if (this.edit_mode == 'edit-points') {\n            state_manager.point_manager.activate(this.element);\n            state_manager.togglePointManager();\n        }\n        else {\n            state_manager.toggleElementManager();\n        }\n    }\n}\n\nexport default function EditUserShape(): IVueComponent {\n    return {\n        tag: 'design-tool-edit-user-shape',\n        controller: EditUserShapeController,\n        template: html\n    }\n}","import {ModalController} from \"../../../../core/adapters/ModalComponent\";\nimport IVueComponent from \"../../../../core/adapters/IVueComponent\";\nimport {html} from \"./FontModal.html\";\nimport {data, method} from \"../../../../core/adapters/VueComponent\";\nimport APIResponse from \"../../../../core/models/APIResponse\";\nimport {Font} from \"../../models/Font\";\nimport {Services} from \"../../../../core/services/Services\";\nimport {Http} from \"../../../../core/services/Http\";\nimport {FontService} from \"../../services/FontService\";\nimport {UserFont} from \"../../models/UserFont\";\nimport MobileMixin from \"../../../../core/mixins/MobileMixin\";\nimport {mobileScreenSize} from \"../../../../core/utils/utils\";\n\nclass FontModalController extends ModalController {\n    static override mixins = [MobileMixin]\n\n    @data()\n    search: string;\n\n    @data()\n    fonts: APIResponse<Font>;\n\n    @data()\n    selected_tags: string[] = [];\n\n    @data()\n    limit = 30;\n\n    @data()\n    page = 1;\n\n    @data()\n    page_change_callback;\n\n    @data()\n    filter_fallback;\n\n    @data()\n    selected_font: Font;\n\n    @data()\n    sample_text: string;\n\n    @data()\n    favorite_selection = false;\n\n    @data()\n    font_service: FontService;\n\n    @data()\n    show_filters: boolean;\n\n    @data()\n    font_classifications = ['Sans', 'Script', 'Serif', 'Slab'];\n\n    @data()\n    selected_classifications = [];\n\n    @data()\n    tag_list = [];\n\n    @data()\n    classification_items = {};\n\n    constructor(component) {\n        super(component, 'font-search-modal');\n        this.font_service = Services.get<FontService>('FontService');\n\n        if (mobileScreenSize()) {\n            this.limit = 10;\n        }\n\n        Services.get<Http>('$http').request({\n            method: 'GET',\n            url: '/custom/api/font-tags/',\n        }).then((response) => {\n            this.tag_list = [];\n            this.classification_items = {};\n            for (const item of this.font_classifications) {\n                this.classification_items[item] = [];\n            }\n\n            for (const tag of response.data) {\n                let items = tag.split('/')\n\n                let category = items[1];\n                let name = items[2];\n\n                let item = {\n                    category: category,\n                    name: name,\n                    tag: tag\n                }\n                if (this.font_classifications.indexOf(category) == -1) {\n                    this.tag_list.push(item);\n                }\n                else {\n                    this.classification_items[category].push(item);\n                }\n            }\n\n            this.tag_list = this.tag_list.sort((a, b) => a.name.localeCompare(b.name));\n        });\n\n        this.loadFonts();\n        this.page_change_callback = this.loadFonts.bind(this);\n        this.filter_fallback = this.loadFonts.bind(this);\n\n        window['ctrlf'] = this;\n    }\n\n    @method()\n    fontLicenseLink(font: Font) {\n        return 'https://fonts.google.com/specimen/' + encodeURIComponent(font.name);\n    }\n\n    @method()\n    sampleText() {\n        if (!this.sample_text) {\n            return 'The quick brown fox jumps over the lazy dog.'\n        }\n        return this.sample_text;\n    }\n\n    @method()\n    loadFonts() {\n        this.fonts = Services.get<typeof Font>('Font').objects.filter({\n            name__icontains: this.search,\n            google_font: true,\n            tags: this.selected_tags.join(','),\n            limit: this.limit,\n            offset: this.limit * (this.page - 1),\n            favorite: this.favorite_selection ? 'true' : null,\n            tag_categories: this.selected_classifications.join(','),\n            order_by: 'ordering'\n        });\n        this.fonts.$promise.then(() => {\n            for (const font of this.fonts.items) {\n                font.loadFull();\n                font.versions.sort((a, b) => a.name.localeCompare(b.name));\n            }\n        })\n    }\n\n    @method()\n    toggleTag(tag) {\n        if (this.selected_tags.indexOf(tag) === -1) {\n            this.selected_tags.push(tag);\n        }\n        else {\n            this.selected_tags.splice(this.selected_tags.indexOf(tag), 1);\n        }\n        this.page = 1;\n        this.loadFonts();\n    }\n\n    @method()\n    isTagSelected(tag) {\n        return this.selected_tags.indexOf(tag) != -1;\n    }\n\n    @method()\n    selectFont(font: Font) {\n        this.selected_font = font;\n        for (const version of font.versions) {\n            font.loadVersion(version);\n        }\n        this.resetScroll();\n    }\n\n    @method()\n    resetScroll() {\n        setTimeout(() => {\n            this.$el.scrollTo(0,0);\n        })\n    }\n\n    @method()\n    safeFontName(v) {\n        return `\"${v ? v.replace('\"', '') : 'undefined'}\"`;\n    }\n\n    @method()\n    toggleFavorite() {\n        let existing = this.font_service.user_fonts.items.find(v => v.font.id == this.selected_font.id);\n        if (existing) {\n            this.font_service.user_fonts.items.removeItemFromID(existing.id);\n            existing.delete();\n        }\n        else {\n            let font = new (Services.get<typeof UserFont>('UserFont'))();\n            font.font = this.selected_font;\n            font.save();\n\n            this.font_service.user_fonts.items.push(font);\n            this.font_service.user_fonts.items.sort((a, b) => a.font.name.localeCompare(b.font.name));\n        }\n    }\n\n    @method()\n    isFavorite(font: Font) {\n        if (!this.font_service.user_fonts) {\n            return false;\n        }\n\n        return !!this.font_service.user_fonts.items.find(v => v.font.id == font.id);\n    }\n\n    override onClose() {\n        super.onClose();\n\n        this.font_service.font_selection_callback = null;\n    }\n\n    @method()\n    useFont() {\n        if (this.font_service.font_selection_callback) {\n            this.font_service.addActiveFont(this.selected_font);\n            this.font_service.font_selection_callback(this.selected_font);\n        }\n        this.close();\n    }\n\n    @method()\n    isClassificationSelected(item) {\n        return this.selected_classifications.indexOf(item) != -1;\n    }\n\n    @method()\n    classificationName(item ) {\n        if (item == 'Sans') {\n            return 'Sans Serif'\n        }\n        if (item == 'Slab') {\n            return 'Slab Serif'\n        }\n        return item;\n    }\n\n    @method()\n    toggleClassification(item ) {\n        if (this.isClassificationSelected(item)) {\n            this.selected_classifications.splice(this.selected_classifications.indexOf(item), 1);\n        }\n        else {\n            this.selected_classifications.push(item);\n        }\n        this.page = 1;\n        this.loadFonts();\n    }\n}\n\nexport default function FontModal(): IVueComponent {\n    return {\n        controller: FontModalController,\n        template: html,\n        tag: 'font-search-modal'\n    }\n}","export const html:string = `\n<div id=\"font-search-modal\" class=\"modal\">\n    <div class=\"modal-dialog modal-xl full-height\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <button type=\"button\" class=\"close\" aria-label=\"Close\" @click=\"close()\"><span aria-hidden=\"true\">&times;</span></button>\n                <h4 class=\"modal-title\" id=\"gridSystemModalLabel\">Font Library</h4>                \n            </div>\n            <div class=\"font-container full-width\" v-if=\"!selected_font\">\n                <div class=\"font-options padded-card-md\">\n                    <div class=\"flex-left column no-wrap\">\n                        <button class=\"btn-base btn-secondary-action full-width\" v-if=\"mobile\" @click=\"show_filters = !show_filters\">{{ show_filters ? 'Hide' : 'Show' }} Advanced Filters</button>\n                        <template v-if=\"!mobile || show_filters\">\n                            <div class=\"input-group\">\n                                <span>Sample Text</span>\n                                <textarea rows=\"3\" v-model=\"sample_text\" placeholder=\"The quick brown fox jumps over the lazy dog.\"></textarea>\n                            </div>\n                            <div class=\"input-group flex-left column spacing-sm\">\n                                <span>My Fonts</span>\n                                <label class=\"flex-left-center spacing-sm\">\n                                    <input type=\"checkbox\" v-model=\"favorite_selection\" @change=\"filter_fallback\">\n                                    Favorites \n                                </label>\n                            </div>\n                            <div class=\"input-group flex-left column spacing-sm\">\n                                <span>Classification</span>\n                                <label class=\"flex-left-center no-wrap spacing-sm\" v-for=\"item of font_classifications\">\n                                    <input type=\"checkbox\" :checked=\"isClassificationSelected(item)\" @click=\"toggleClassification(item)\">{{ classificationName(item) }}\n                                </label>\n                            </div>\n                            <div class=\"input-group flex-left column spacing-sm\">\n                                <span>Tags</span>\n                                <label class=\"flex-left-center no-wrap spacing-sm\" v-for=\"item of tag_list\">\n                                    <input type=\"checkbox\" :checked=\"isTagSelected(item.tag)\" @click=\"toggleTag(item.tag)\">{{ item.name }}\n                                </label>\n                            </div>\n                        </template>\n                    </div>\n                </div>\n                <div class=\"font-list flex-left column spacing-none no-wrap stretch\">\n                    <div class=\"padded-card\">\n                        <div class=\"input-group\">\n                            <label>Search</label>\n                            <div class=\"flex-left-center no-wrap spacing-xs full-width\">\n                                <input class=\"full-width search\" type=\"text\" v-model=\"search\" @change=\"page = 1; loadFonts()\" @keydown.enter=\"page = 1; loadFonts()\">\n                                <button class=\"btn-base btn-secondary-action\" @click=\"loadFonts()\">Search</button>\n                            </div>\n                        </div>\n                    </div>\n                    \n                    <template v-for=\"(font, $index) in fonts.items\" v-if=\"fonts\">\n                        <div class=\"inset-item inset-hover padded-card flex-left column spacing-sm full-width no-wrap\" @click=\"selectFont(font)\">\n                            <div class=\"flex-left column spacing-xs\">\n                                <div class=\"flex-left-end no-wrap spacing-sm\">\n                                    <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" v-if=\"isFavorite(font)\">\n                                        <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.9932 5.13581C9.9938 2.7984 6.65975 2.16964 4.15469 4.31001C1.64964 6.45038 1.29697 10.029 3.2642 12.5604C4.89982 14.6651 9.84977 19.1041 11.4721 20.5408C11.6536 20.7016 11.7444 20.7819 11.8502 20.8135C11.9426 20.8411 12.0437 20.8411 12.1361 20.8135C12.2419 20.7819 12.3327 20.7016 12.5142 20.5408C14.1365 19.1041 19.0865 14.6651 20.7221 12.5604C22.6893 10.029 22.3797 6.42787 19.8316 4.31001C17.2835 2.19216 13.9925 2.7984 11.9932 5.13581Z\" stroke=\"var(--icon-strong, #98A2B3)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                                    </svg>\n                                    <b>{{ font.name }}</b>\n                                    <span class=\"text-xs\" style=\"text-transform: capitalize\" v-if=\"font.tags\">{{ font.versions.length + 1 }} Style{{ font.versions.length == 0 ? '' : 's' }}</span>\n                                </div>\n                            </div>\n                            <div style=\"line-height: normal; font-size: 2rem\" :style=\"'font-family: ' + font.fontFamily(true)\">{{ sampleText() }}</div>\n                        </div>\n                        <hr class=\"padding-none\" v-if=\"$index != fonts.items.length - 1\">\n                    </template>\n                    \n                    <div class=\"padded-card\" v-if=\"fonts.$resolved && fonts.totalCount == 0\">\n                        <h3>No Fonts Found</h3>\n                    </div>\n                    \n                    <div class=\"flex-full-center padded-card\" v-if=\"fonts\">\n                        <callback-paginator :total=\"fonts.totalCount\" :limit=\"limit\" v-model:page=\"page\" :callback=\"page_change_callback\"></callback-paginator>\n                    </div>\n                </div>\n            </div>\n            <div class=\"modal-body flex-left column spacing-3xl no-wrap font-detail\" v-if=\"selected_font\">\n                <div class=\"flex-left column spacing-lg no-wrap\">\n                    <div class=\"flex-left column no-wrap\">\n                        <div class=\"flex-left column spacing-xs\">\n                            <h1>{{ selected_font.name }}</h1>\n                            <div v-if=\"selected_font.designer\">Designed by {{ selected_font.designer }}</div>\n                            <div class=\"text-xs\" v-if=\"selected_font.copyright\">{{ $filters.clamp(selected_font.copyright, 150) }}</div>\n                        </div>\n                        <div class=\"flex-left column spacing-sm\">\n                            <div class=\"text-xs\" v-if=\"selected_font.license\">{{ $filters.clamp(selected_font.license, 150) }}</div>\n                            <div class=\"text-xs\" v-if=\"selected_font.google_font\">\n                                Open source free fonts powered by <a class=\"plain-link\" target=\"_blank\" href=\"https://fonts.google.com/\">Google Fonts</a> | \n                                <a class=\"plain-link\" target=\"_blank\" href=\"https://developers.google.com/fonts/faq\">FAQs</a> | \n                                <a class=\"plain-link\" target=\"_blank\" :href=\"fontLicenseLink(selected_font)\">Details</a>.\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"flex-left no-wrap\">\n                        <button class=\"btn-base btn-secondary-action\" @click=\"selected_font = null; resetScroll()\">Back</button>\n                        <button class=\"btn-base btn-secondary-action\" @click=\"toggleFavorite()\">{{ isFavorite(selected_font) ? 'Remove ' : '' }}Favorite</button>\n                        <button class=\"btn-base btn-primary-action\" @click=\"useFont()\">Select Font</button>\n                    </div>\n                </div>\n                <hr>\n                <div class=\"flex-left column\">\n                    <div class=\"input-group\">\n                        <label>Sample Text</label>\n                        <textarea rows=\"3\" v-model=\"sample_text\" placeholder=\"The quick brown fox jumps over the lazy dog.\"></textarea>\n                    </div>\n                    <div class=\"flex-left column no-wrap spacing-xs\">\n                        <b>Normal</b>\n                        <div style=\"line-height: normal; font-size: 2rem;\" :style=\"'font-family: ' + safeFontName(selected_font.fontFamily(true))\">\n                            {{ sampleText() }}\n                        </div>\n                    </div>\n                    <template v-for=\"version of selected_font.versions\">\n                        <div class=\"flex-left column no-wrap spacing-xs\">\n                            <b style=\"text-transform: capitalize\">{{ version.fullName() }} - {{ version.formattedName() }}</b>\n                            <div style=\"line-height: normal; font-size: 2rem;\" :style=\"{'font-family': safeFontName(selected_font.versionName(version))}\">\n                                {{ sampleText() }}\n                            </div>\n                        </div>\n                    </template>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n`;","import AddClipartComponent from './AddClipartComponent/AddClipartComponent';\nimport ColorPicker from './ColorPicker/ColorPicker';\nimport PaperCanvas from './PaperCanvas/PaperCanvas';\nimport SubCanvasPreview from './SubCanvasPreview/SubCanvasPreview';\nimport TemplateFinalizeOptions from './TemplateFinalizeOptions/Options';\nimport TemplateSetupOptionsShapes from './TemplateSetupOptionsShapes/TemplateSetupOptionsShapes';\nimport registerToolComponents from './DesignTool/init';\nimport VueApp from '../../../core/adapters/VueApp';\nimport FontModal from \"./FontModal/FontModal\";\n\n\n/*\n    Only components that are used on the following pages\n    - Template Setup\n    - Design Tool\n    - Finalize Page\n */\nexport default function registerComponents(vue_app: VueApp) {\n    vue_app.registerComponent(AddClipartComponent);\n    vue_app.registerComponent(ColorPicker);\n    vue_app.registerComponent(PaperCanvas);\n    vue_app.registerComponent(SubCanvasPreview);\n    vue_app.registerComponent(TemplateFinalizeOptions);\n    vue_app.registerComponent(TemplateSetupOptionsShapes);\n    vue_app.registerComponent(FontModal);\n    registerToolComponents(vue_app);\n}","import VueApp from '../../../../core/adapters/VueApp';\nimport DesignToolAddClipart from './AddClipart/AddClipart';\nimport DesignToolAddFile from './AddFile/AddFile';\nimport DesignToolAddQrCode from './AddQRCode/AddQrCode';\nimport DesignToolAddText from './AddText/AddText';\nimport DesignToolBackgroundColors from './BackgroundColors/BackgroundColors';\nimport DesignToolCrop from './Crop/Crop';\nimport DesignToolEditClipart from './EditClipart/EditClipart';\nimport DesignToolEditFile from './EditFile/EditFile';\nimport DesignToolEditQRCode from './EditQRCode/EditQRCode';\nimport DesignToolEditText from './EditText/EditText';\nimport DesignToolLayers from './Layers/Layers';\nimport DesignToolSides from './Sides/Sides';\nimport DesignToolFooterActions from './FooterActions/FooterActions';\nimport ElementAlignment from './Actions/ElementAlignment/ElementAlignment';\nimport ElementLayerPosition from './Actions/ElementLayerPosition/ElementLayerPosition';\nimport ElementTextAlignment from './Actions/ElementTextAlignment/ElementTextAlignment';\nimport ElementFit from './Actions/ElementFit/ElementFit';\nimport ElementScaleSize from './Actions/ElementScaleSize/ElementScaleSize';\nimport ElementInvert from './Actions/ElementInvert/ElementInvert';\nimport ElementMaintainProportion from './Actions/ElementMaintainProportion/ElementMaintainProportion';\nimport {ElementColor, ElementMaterialColor} from './Actions/ElementColor/ElementColor';\nimport CliaprtColors from './Actions/ClipartColors/ClipartColors';\nimport CodeForm from './CodeForm/CodeForm';\nimport CodeFormData from './CodeFormData/CodeFormData';\nimport CodeFormType from './CodeFormType/CodeFromType';\nimport ToolNavigation from './ToolNavigation/ToolNavigation';\nimport ElementOffsetPath from './Actions/ElementOffsetPath/ElementOffsetPath';\nimport ElementToggleBackground from './Actions/ElementToggleBackground/ElementToggleBackground';\nimport DirectUpload from './DirectUpload/DirectUpload';\nimport LayerRemove from './LayerRemove/LayerRemove';\nimport SelectLayerBar from './SelectLayerBar/SelectLayerBar';\nimport AddVariableDataModal from \"./AddVariableDataModal/AddVariableDataModal\";\nimport EditVariableDataModal from \"./EditVariableDataModal/EditVariableDataModal\";\nimport AddUserShape from \"./AddUserShape/AddUserShape\";\nimport EditUserShape from \"./EditUserShape/EditUserShape\";\n\n\nexport default function registerComponents(vue_app: VueApp) {\n    vue_app.registerComponent(DesignToolAddClipart);\n    vue_app.registerComponent(DesignToolAddFile);\n    vue_app.registerComponent(DesignToolAddQrCode);\n    vue_app.registerComponent(DesignToolAddText);\n    vue_app.registerComponent(DesignToolBackgroundColors);\n    vue_app.registerComponent(DesignToolCrop);\n    vue_app.registerComponent(DesignToolEditClipart);\n    vue_app.registerComponent(DesignToolEditFile);\n    vue_app.registerComponent(DesignToolEditQRCode);\n    vue_app.registerComponent(DesignToolEditText);\n    vue_app.registerComponent(DesignToolLayers);\n    vue_app.registerComponent(DesignToolSides);\n    vue_app.registerComponent(DesignToolFooterActions);\n    vue_app.registerComponent(CodeForm);\n    vue_app.registerComponent(CodeFormData);\n    vue_app.registerComponent(CodeFormType);\n    vue_app.registerComponent(ToolNavigation);\n    vue_app.registerComponent(ElementOffsetPath);\n    vue_app.registerComponent(ElementToggleBackground);\n    vue_app.registerComponent(DirectUpload);\n    vue_app.registerComponent(LayerRemove);\n\n    // Design tool sub elements\n    vue_app.registerComponent(ElementAlignment);\n    vue_app.registerComponent(ElementLayerPosition);\n    vue_app.registerComponent(ElementTextAlignment);\n    vue_app.registerComponent(ElementFit);\n    vue_app.registerComponent(ElementScaleSize);\n    vue_app.registerComponent(ElementMaintainProportion);\n    vue_app.registerComponent(ElementInvert);\n    vue_app.registerComponent(ElementColor);\n    vue_app.registerComponent(ElementMaterialColor);\n    vue_app.registerComponent(CliaprtColors);\n    vue_app.registerComponent(SelectLayerBar);\n    vue_app.registerComponent(AddVariableDataModal);\n    vue_app.registerComponent(EditVariableDataModal);\n    vue_app.registerComponent(AddUserShape);\n    vue_app.registerComponent(EditUserShape);\n}\n","import {Template} from '../models/Template';\nimport {Custom} from '../models/Custom';\nimport PricingTier from '../../../core/utils/PricingTier';\nimport {Services} from '../../../core/services/Services';\nimport {Collection} from '../../../core/models/Collection';\nimport {TemplateSize} from '../models/TemplateSize';\nimport {fitToArea, getClosestQuarter} from '../../../core/utils/utils';\nimport {CustomLamination, ProductTypeEnum, ToolTypeEnum} from '../models/enums';\nimport ConfiguredProductServiceAbstract from '../../products_shared/services/ConfiguredProductServiceAbstract';\nimport {Color} from '../models/Color';\nimport ButtonProcessingState from '../../../core/utils/ButtonProcessingState';\nimport {CustomShape} from '../models/CustomShape';\nimport {TemplateShape} from '../models/TemplateShape';\nimport {TemplateSide} from '../models/TemplateSide';\nimport {BackgroundShapeElement} from '../tool/BackgroundShapeElement';\n\nexport default class CustomService extends ConfiguredProductServiceAbstract {\n    public declare base: Template;\n    public declare configured: Custom;\n\n    public declare base_class: typeof Template;\n    public declare configured_class: typeof Custom;\n\n    public size_adjusted: boolean;\n    public text_too_small: boolean;\n    public show_sizes: boolean;\n    public remove_background: boolean; // remove background on save\n    public recommended_sizes: Collection<TemplateSize>;\n\n    configured_option_model = 'CustomOption';\n\n    constructor() {\n        super(Services.get('Template'), Services.get('Custom'), 'template');\n        this.size_adjusted = false;\n        this.show_sizes = false;\n        this.add_to_cart = false;\n        this.recommended_sizes = new Collection();\n    }\n\n    override setupExtraData(all_data) {\n        super.setupExtraData(all_data);\n    }\n\n    override get optionsUnitValue() {\n        return this.configured.calcOptionsPrice(this.price.price, this.show_retail) / this.configured.quantity;\n    }\n\n    override get show_wholesale_prices(): boolean {\n        return this.base.showWholesalePrices;\n    }\n\n    override checkMaterialColor() {\n        let color_set = this.product_color_set;\n\n        if (!this.configured.material_color && this.base.cut_out_color && color_set.getItemFromID(this.base.cut_out_color.id)) {\n            this.configured.material_color = this.base.cut_out_color;\n        }\n\n        if (!this.configured.material_color || !color_set.getItemFromID(this.configured.material_color.id)) {\n            this.configured.material_color = color_set.find(v => v.default) || color_set[0];\n        }\n    }\n\n    override get product_color_set(): Collection<Color> {\n        let color_set: Collection<Color> = this.base.show_material_color ? this.configured.material.material_colors : this.configured.material.design_colors;\n\n        if (this.configured.size && this.configured.size.disabled_colors) {\n            color_set = color_set.reduce((items, current) => {\n                if (!this.configured.size.disabled_colors.getItemFromID(current.id)) {\n                    items.push(current);\n                }\n\n                return items\n            }, new Collection<Color>());\n        }\n\n        return color_set;\n    }\n\n    override get price(): PricingTier {\n        if (this.configured.size && this.configured.size.price && this.configured.size.price.value > 0 && !this.configured.size.material_price) {\n            return new PricingTier(this.configured.quantity, this.configured.size.price.value);\n        }\n\n        if (this.price_tier)\n            return this.price_tier;\n\n        // Can't calculate the price without pricing list\n        if (!this.pricing) {\n            if (this.configured.size && this.configured.size.price && this.configured.size.price.value) {\n                return new PricingTier(this.configured.quantity, this.configured.size.price.value);\n            }\n            else {\n                return new PricingTier(0, 0);\n            }\n        }\n\n        return super.price;\n    }\n\n    override setupConfiguredFromBase(needs_additional_setup=false) {\n        super.setupConfiguredFromBase(true);\n\n        // Pick the recommended sizes to use\n        /*\n        if (this.configured.template_shape?.sizes?.length > 0) {\n            this.recommended_sizes = this.configured.template_shape.sizes;\n        }\n        */\n        if (this.base.sizes?.length > 0) {\n            this.recommended_sizes = this.base.sizes;\n        }\n        \n        let ratio = this.base.lockRatio;\n        if (ratio) {\n            this.proportions_ratio = ratio;\n        }\n\n        if (this.base.option_border && this.configured.option_border == null) {\n            if (this.base.type == ProductTypeEnum.PRINTED) {\n                this.configured.option_border = true;\n            }\n            else {\n                this.configured.option_border = false;\n            }\n        }\n        if (this.base.option_laminate && this.configured.option_laminate == null) {\n            let unset_default = this.configured.material?.default_lamination != null || this.configured.material?.default_lamination == CustomLamination.NOT_SELECTED;\n            if (!unset_default && this.configured.material.default_lamination != CustomLamination.NONE) {\n                this.configured.option_laminate = this.configured.material.default_lamination;\n            }\n            else {\n                this.configured.option_laminate = CustomLamination.GLOSS;\n            }\n        }\n\n        // Set the size to the same item in the list so equality checks will work\n        if (this.configured.size && this.recommended_sizes.getItemFromID(this.configured.size.id)) {\n            this.configured.size = this.recommended_sizes.getItemFromID(this.configured.size.id);\n        }\n\n        if (!this.configured.size && this.recommended_sizes.length > 0) {\n            this.configured.size = this.recommended_sizes.find((v) => v.width == this.configured.width && v.height == this.configured.height) || this.configured.size;\n        }\n\n        this.show_sizes = this.base.allow_custom_size || this.recommended_sizes.length > 0;\n\n        // If there is no default width/height but there are recommended sizes then set the height/width based on the default\n        if ((!this.configured.width || !this.configured.height) && this.recommended_sizes.length > 0) {\n            for (const size of this.recommended_sizes) {\n                if (size.default) {\n                    this.configured.height = size.height;\n                    this.configured.width = size.width;\n                    break\n                }\n            }\n\n            // No default set to first\n            if (!this.configured.width || !this.configured.height) {\n                this.configured.height = this.recommended_sizes[0].height;\n                this.configured.width = this.recommended_sizes[0].width;\n            }\n        }\n\n        this.setupShapes();\n\n        this.configured.bind('change:size', () => {\n            this.checkMaterialColor();\n        }, this);\n\n        if (!needs_additional_setup) {\n            this.setup_complete_deferred.resolve();\n        }\n\n        if (this.base.show_material_color) {\n            this.configured.bind('change:material_color', this.updateShapeFromMaterialColors.bind(this), this);\n        }\n    }\n\n    updateShapeFromMaterialColors() {\n        if (this.base.show_material_color) {\n            for (const shape of this.configured.custom_shapes) {\n                if (shape.background_shape_fill != this.configured.material_color) {\n                    shape.background_shape_fill = this.configured.material_color;\n                }\n            }\n        }\n    }\n\n    setupShapes() {\n        let to_remove = []\n        for (const item of this.configured.custom_shapes) {\n            if (!item.template_shape || !this.base.template_shapes.find(v => v.id == item.template_shape.id)) {\n                console.warn(`Found mismatched shape #${item.template_shape?.id}`);\n                to_remove.push(item);\n            }\n        }\n        for (const item of to_remove) {\n            this.configured.custom_shapes.splice(this.configured.custom_shapes.indexOf(item), 1);\n        }\n\n        for (const item of this.configured.custom_shapes) {\n            item.bindToConfigured(this.configured);\n        }\n\n        // Unique set of sides, vue will prevent equality working so we cant use [... new Set(data)]\n        let side_data = {};\n        for (const item of this.base.template_shapes) {\n            side_data[item.side?.id] = item.side;\n        }\n        let template_shape_sides: TemplateSide[] = Object.values(side_data);\n\n        for (const side of template_shape_sides) {\n            let existing = this.configured.custom_shapes.find(v => v.template_shape.side?.id == side?.id);\n            if (existing) {\n                continue;\n            }\n\n            let template_shape = this.templateShapesForSide(side)[0];\n            let custom_shape = this.configured.custom_shapes.find(v => v.template_shape?.id == template_shape.id);\n\n            if (!custom_shape) {\n                custom_shape = new (Services.get<typeof CustomShape>('CustomShape'))();\n                custom_shape.template_shape = template_shape;\n                custom_shape.bindToConfigured(this.configured);\n                custom_shape.loadDefaultsFromTemplate();\n                this.configured.custom_shapes.push(custom_shape);\n            }\n        }\n\n        if (this.base.show_material_color) {\n            this.updateShapeFromMaterialColors();\n        }\n    }\n\n    templateShapesForSide(side: TemplateSide) {\n        return this.base.template_shapes.filter(\n            v => v.side?.id == side?.id\n        ).sort((a, b) => {\n            if (a.default && b.default) {\n                return 0;\n            }\n            if (a.default) {\n                return -1;\n            }\n            if (b.default) {\n                return 1\n            }\n            if (a.order == b.order) {\n                return 0;\n            }\n            return a.order > b.order ? 1 : -1;\n        });\n    }\n\n    public checkSharedShapeAttributes(shape: CustomShape) {\n        if (this.configured.custom_shapes.indexOf(shape) == -1) {\n            return;\n        }\n\n        for (const item of this.configured.custom_shapes) {\n            if (item == shape) {\n                continue;\n            }\n            if (!item.template_shape.share_attributes || item.template_shape.tag != shape.template_shape.tag) {\n                continue;\n            }\n\n            for (const key of Services.get<typeof CustomShape>('CustomShape').SHARED_ATTRIBUTES) {\n                if (item[key] != shape[key]) {\n                    item[key] = shape[key];\n                }\n            }\n        }\n    }\n\n    get size_by_id(): number|null {\n        if (this.configured.size) {\n            if (this.configured.size.width == this.configured.width && this.configured.size.height == this.configured.height) {\n                return this.configured.size.id;\n            }\n        }\n\n        for (const size of this.recommended_sizes) {\n            if (size.width == this.configured.width && size.height == this.configured.height) {\n                this.configured.size = size;\n                return size.id;\n            }\n        }\n\n        return null;\n    }\n\n    set size_by_id(v: number|null) {\n        this.configured.size = this.recommended_sizes.getItemFromID(v);\n\n        if (this.configured.size) {\n            this.width = this.configured.size.width;\n            this.height = this.configured.size.height;\n        }\n    }\n\n    override get allow_custom_sizes() {\n        return this.base.allow_custom_size;\n    }\n\n    fitShape(shape: CustomShape|TemplateShape) {\n        if (!shape) {\n            return;\n        }\n\n        if (shape.fixed_size) {\n            this.configured.width = shape.fixed_width;\n            this.configured.height = shape.fixed_height;\n        }\n\n        if (shape.standardSizeRatio || shape.locked_shape_size) {\n            let width, height, size;\n            if (shape.standardSizeRatio)\n                size = fitToArea((shape.standardSizeRatio), 1, (this.width * this.height));\n\n            if (shape.locked_shape_size)\n                size = fitToArea(shape.clip_width, shape.clip_height, (this.width * this.height));\n\n            if (size.width > size.height) {\n                width = getClosestQuarter(size.width);\n                height = Number((width * (size.height / size.width)).toFixed(3));\n            } else {\n                height = getClosestQuarter(size.height);\n                width = Number((height * (size.width / size.height)).toFixed(3));\n            }\n\n            this.configured.width = width;\n            this.configured.height = height;\n            this.setLockedProportions(true);\n        }\n    }\n\n    setupShapeElement(custom_shape: CustomShape): BackgroundShapeElement {\n        // Allow this function to be called on both the CustomEditorService and CustomService\n        // Do nothing, modifies the design tool\n\n        return null\n    }\n    public checkSharedShapeSides(shape: CustomShape): void {\n        // Allow this function to be called on both the CustomEditorService and CustomService\n        // Do nothing, modifies the design tool\n    }\n\n    directToFinalize() {\n        window.location.assign(this.configured.getFinalizeURL());\n    }\n\n    useDesign(template: Template, $event?) {\n        let state = new ButtonProcessingState($event);\n        state.process();\n\n        this.configured.tool_type = ToolTypeEnum.ADVANCED;\n        this.configured.configure = true;\n\n        this.validate();\n        if (this.hasErrors) {\n            state.resolved();\n            return;\n        }\n\n        this.configured.template = new (Services.get<typeof Template>('Template'))({\n            id: template.id\n        })\n\n        state.resolved();\n        this.save($event, true);\n    }\n\n    checkOptionsSet() {\n        for (let option of this.configured.options) {\n            if (!option?.optionEligible(this.configured.width, this.configured.height)) {\n                this.configured.options.splice(this.configured.options.indexOf(option), 1)\n            }\n        }\n    }\n\n    override designHasVariableData() {\n        return this.configured.variable_data || (!this.add_to_cart && this.base.designHasVariableData());\n    }\n\n    override preValidate() {\n        super.preValidate();\n        this.checkOptionsSet();\n    }\n\n    override async preSave() {\n        await super.preSave();\n\n        if (this.remove_background) {\n            await this.removeUserFileBackground();\n        }\n\n        if (this.configured.retail_package) {\n            if (!this.configured.retail_package.package.getValidSizeFor(this.configured.width, this.configured.height)) {\n                this.configured.retail_package = null;\n            }\n        }\n    }\n\n    async removeUserFileBackground() {\n        if (!this.configured.user_file.original_background_file) {\n            this.configured.user_file = await this.configured.user_file.removeBackground().catch((error) => {\n                 this.errors.add('file', error.data['error']);\n            });\n        }\n    }\n\n    override onSaveFailure(response) {\n        super.onSaveFailure(response);\n\n        if (response && response.data && response.data.custom) {\n            this.errors.merge(response.data.custom);\n        }\n    }\n\n    get size() {\n        if (!this.configured.size) {\n            for (const size of this.recommended_sizes) {\n                if (size.width == this.configured.width && size.height == this.configured.height) {\n                    this.configured.size = size;\n                }\n            }\n        }\n        return this.configured.size;\n    }\n    set size(v) {\n        this.configured.size = v;\n    }\n\n    override nextUrl() {\n        if (this.add_to_cart) {\n            return '/cart/'\n        }\n        else {\n            return super.nextUrl();\n        }\n    }\n\n    override get colors_available_for_material() {\n        let colors = super.colors_available_for_material;\n        if (this.size && this.size.disabled_colors) {\n            colors = new Collection<Color>(...colors.filter(v => !this.size.disabled_colors.getItemFromID(v.id)));\n        }\n        return colors;\n    }\n}\n","export class PaperCanvasWorkspace {\n    camera: paper.Rectangle;\n    artboard: paper.Rectangle;\n    zoom: number = 1;\n\n    constructor(camera, artboard) {\n        this.camera = camera;\n        this.artboard = artboard;\n    }\n\n}\n","import {Services} from \"../../../core/services/Services\";\nimport {SelectionManager} from \"./SelectionManager\";\nimport {EventDispatcher} from \"../../../core/utils/EventDispatcher\";\nimport {PointSelectionManager} from \"./PointSelectionManager\";\nimport {IElement} from \"../tool/IElement\";\nimport PaperCanvasService from \"./PaperCanvasService\";\nimport {ColorSelectionManager} from \"./ColorSelectionManager\";\n\nexport enum CursorHandleState {\n    NONE,\n    HOVER,\n    ACTIVE\n}\n\nexport interface SelectionType {\n    onMouseDown(event: paper.ToolEvent): void;\n    onMouseUp(event: paper.ToolEvent): void;\n    onMouseDrag(event: paper.ToolEvent): void;\n    onMouseMove(event: paper.ToolEvent): void;\n    drawControls(): void;\n    removeControls(): void;\n    activate(element): void;\n    deactivate(): void;\n    selectedElement(): IElement;\n    removeSelection(): void;\n}\n\nexport class SelectionStateManager extends EventDispatcher implements SelectionType {\n    selection_manager: SelectionManager;\n    point_manager: PointSelectionManager;\n    color_manager: ColorSelectionManager;\n\n    active_manager: SelectionType;\n\n    constructor() {\n        super();\n        this.selection_manager = Services.get<SelectionManager>('SelectionManager');\n        this.point_manager = Services.get<PointSelectionManager>('PointSelectionManager');\n        this.color_manager = Services.get<ColorSelectionManager>('ColorSelectionManager');\n        this.active_manager = this.selection_manager;\n\n        document.addEventListener('keydown', (event) => {\n            let canvas_service = Services.get<PaperCanvasService>('PaperCanvasService');\n\n            // Don’t do anything if the paper project hasn’t been set up\n            if (!canvas_service || !canvas_service.paperScope) {\n                return;\n            }\n\n            canvas_service.paperScope.activate();\n            if (event.key === 'Escape' || event.key == 'Esc') {\n                this.removeSelection();\n                this.deactivate();\n                this.active_manager = this.selection_manager;\n            }\n\n            if (['TEXTAREA', 'INPUT'].indexOf(document.activeElement.tagName) == -1 && document.activeElement.getAttribute('contenteditable') != 'true') {\n                let element = this.selectedElement();\n                // Remove/Delete selection\n                if (element && !element.locked && (event.key == 'Delete' || event.key == 'Backspace')) {\n                    element.remove();\n                }\n                this.removeSelection();\n                this.deactivate();\n            }\n        }, false);\n    }\n\n    selectedElement() {\n        return this.active_manager.selectedElement();\n    }\n\n    onMouseDown(event: paper.ToolEvent): void {\n        this.active_manager.onMouseDown(event);\n    }\n\n    onMouseUp(event: paper.ToolEvent): void {\n        this.active_manager.onMouseUp(event);\n    }\n\n    onMouseDrag(event: paper.ToolEvent): void {\n        this.active_manager.onMouseDrag(event);\n    }\n\n    onMouseMove(event: paper.ToolEvent): void {\n        this.active_manager.onMouseMove(event);\n    }\n\n    editingPoints() {\n        return this.active_manager == this.point_manager;\n    }\n\n    scaleMoveActive() {\n        return this.active_manager == this.selection_manager;\n    }\n\n    togglePointManager() {\n        this.active_manager.deactivate();\n        this.active_manager = this.point_manager;\n        this.active_manager.drawControls();\n        this.trigger('change:manager');\n    }\n\n    toggleElementManager() {\n        this.active_manager.deactivate();\n        this.active_manager = this.selection_manager;\n        this.active_manager.drawControls();\n        this.trigger('change:manager');\n    }\n\n    toggleColorManager(color_pick: (color: string) => void, color_hover: (color: string) => void) {\n        this.active_manager.deactivate();\n        this.color_manager.color_pick = color_pick;\n        this.color_manager.color_hover = color_hover;\n        this.active_manager = this.color_manager;\n        this.active_manager.drawControls();\n        this.trigger('change:manager');\n    }\n\n    activate(element): void {\n        this.active_manager.activate(element);\n    }\n\n    deactivate(): void {\n        this.active_manager.deactivate();\n    }\n\n    drawControls(): void {\n        this.active_manager.drawControls();\n    }\n\n    removeControls(): void {\n        this.active_manager.removeControls();\n    }\n\n    removeSelection() {\n        this.active_manager.removeSelection();\n    }\n}","import {PaperCanvasWorkspace} from './PaperCanvasWorkspace';\nimport {ElementManager} from './ElementManager';\nimport {SelectionManager} from './SelectionManager';\nimport {BaseElement} from '../tool/BaseElement';\nimport {Services} from '../../../core/services/Services';\nimport {getInnerHeight, getInnerWidth, lerp} from '../../../core/utils/utils';\nimport {IDeferred, IPromise, SimplePromise} from '../../../core/utils/SimplePromise';\nimport ClipperService from './ClipperService';\nimport {disableVueForImport} from '../../../core/adapters/VueUtils';\nimport {IElement} from '../tool/IElement';\nimport {TemplateSide} from '../models/TemplateSide';\nimport * as Sentry from '@sentry/browser';\nimport {EventDispatcher} from '../../../core/utils/EventDispatcher';\nimport {SelectionStateManager} from \"./SelectionStateManager\";\n\nclass LayerGroup {\n    constructor(name, id, model) {\n        this.name = name;\n        this.id = id;\n        this.model = model;\n    }\n\n    model: TemplateSide;\n    name: string;\n    id: any;\n    rootLayer: paper.Layer;      // Root layer for all editable elements\n    clipLayer: paper.Layer;      // Layer for all clipping masks\n    immutableLayer: paper.Layer; // Layer for all items that are immutable and should not be clipped\n    projectLayer: paper.Layer;   // Layer that holds both the rootLayer and clipLayer and applies the clip mask\n    standard_bounds: paper.Rectangle; // The project layer bounds before it was changed the preview view\n    clipArea: paper.PathItem;\n    clipViewArea: paper.PathItem;\n    cutpathLayer: paper.Layer;\n    offset_changed: boolean;\n    offset_waiting: boolean;\n    merged_cutpath: paper.CompoundPath;\n}\n\nexport default class PaperCanvasService extends EventDispatcher {\n    workspace: PaperCanvasWorkspace;\n    max_canvas_width: number = 750;\n    max_canvas_height: number = 750;\n    canvas_container_padding: number;\n    clip_opacity = 0.8;\n    clip_color = '#000';\n    canvas_background_color: string;\n    canvas_color_override: string;\n    canvas: HTMLCanvasElement;\n    paperScope: paper.PaperScope;\n    frame_number: number = 0;\n    clippingDisabled: boolean;\n    debugItems: paper.Item[] = [];\n    contourPath: paper.CompoundPath;\n    tool_type;\n    loaded: boolean;\n    in_export_state: boolean;\n    in_save_state: boolean;\n    offset_path_enabled: boolean;\n    fixed_camera: boolean;\n    overlay_sides: boolean\n    autosize_artboard: boolean;\n    fixed_texture_position: boolean;\n    private controls_layer: paper.Layer;\n    _offset_path_color: string;\n    _offset_path_texture: string;\n\n    public active_side: number;\n    public layer_sides: {[key: number]: LayerGroup};\n\n    admin_options: boolean;\n\n    private canvas_container;\n\n    public paper;\n    public paper_promise;\n\n    public setup_complete: IPromise<void>;\n    private setup_deferred: IDeferred<void>;\n\n    private available_offset_rasters = [];\n\n    constructor() {\n        super();\n        this.setup_deferred = SimplePromise.defer<any>();\n        this.setup_complete = this.setup_deferred.promise;\n\n        this.active_side = 0;\n        this.layer_sides = {};\n        this.layer_sides[0] = new LayerGroup('default', 0, null);\n\n        this.admin_options = false;\n        this.clippingDisabled = false;\n        this.loaded = false;\n        this.in_export_state = false;\n        this.offset_path_enabled = true;\n        this._offset_path_color = '#ffffff';\n\n        this.paper_promise = import('paper');\n        this.paper_promise.then((v) => {\n            disableVueForImport(v);\n            this.paper = v;\n        });\n    }\n\n    // Getters prevent circular dependencies\n    get selection_manager(): SelectionStateManager {\n        return Services.get<SelectionStateManager>('SelectionStateManager');\n    }\n\n    get element_manager(): ElementManager {\n        return Services.get<ElementManager>('ElementManager');\n    }\n\n    get offset_path_color(): string {\n        return this._offset_path_color;\n    }\n    set offset_path_color(v: string) {\n        this._offset_path_color = v || '#ffffff';\n        this.trigger('change:offset_path_color');\n        this.updateMergedCutpathColor();\n    }\n\n    get offset_path_texture(): string {\n        return this._offset_path_texture;\n    }\n    set offset_path_texture(v: string) {\n        if (this._offset_path_texture == v) {\n            return;\n        }\n\n        this._offset_path_texture = v;\n        this.trigger('change:offset_path_texture');\n        this.updateOffsetTexture();\n    }\n\n    updateMergedCutpathColor() {\n        if (!this.paper) {\n            return;\n        }\n\n        let color = new this.paper.Color(this._offset_path_color);\n        for (const side of this.sides) {\n            if (side.merged_cutpath) {\n                side.merged_cutpath.fillColor = color;\n            }\n        }\n    }\n\n    updateOffsetTexture() {\n        this.available_offset_rasters.forEach(v => v.remove());\n        this.available_offset_rasters = [];\n\n        for (const side of this.sides) {\n            if (!side.cutpathLayer) {\n                continue\n            }\n            for (let item of [...side.cutpathLayer.children]) {\n                if (item instanceof this.paper.Layer) {\n                    item = item.children.find(v => v.clipMask);\n                }\n\n                this.removeOffset(item);\n                side.cutpathLayer.addChild(this.setupOffset(item));\n            }\n        }\n    }\n\n    get activeLayerSide() {\n        return this.layer_sides[this.active_side];\n    }\n\n    get rootLayer() {\n        return this.activeLayerSide.rootLayer;\n    }\n    set rootLayer(layer) {\n        this.activeLayerSide.rootLayer = layer;\n    }\n\n    get clipLayer() {\n        return this.activeLayerSide.clipLayer;\n    }\n    set clipLayer(layer) {\n        this.activeLayerSide.clipLayer = layer;\n    }\n\n    get cutpathLayer() {\n        return this.activeLayerSide.cutpathLayer;\n    }\n    set cutpathLayer(layer) {\n        this.activeLayerSide.cutpathLayer = layer;\n    }\n\n    get immutableLayer() {\n        return this.activeLayerSide.immutableLayer;\n    }\n    set immutableLayer(layer) {\n        this.activeLayerSide.immutableLayer = layer;\n    }\n\n    get projectLayer() {\n        return this.activeLayerSide.projectLayer;\n    }\n    set projectLayer(layer) {\n        this.activeLayerSide.projectLayer = layer;\n    }\n\n    get clipArea() {\n        return this.activeLayerSide.clipArea;\n    }\n    set clipArea(v: paper.PathItem) {\n        this.activeLayerSide.clipArea = v;\n    }\n\n    get clipViewArea() {\n        return this.activeLayerSide.clipViewArea\n    }\n    set clipViewArea(v: paper.PathItem) {\n        this.activeLayerSide.clipViewArea = v\n    }\n\n    // Offset paths are side dependent so make sure you only need to do operations on the current active side before using these\n    get offset_changed(): boolean {\n        return this.activeLayerSide.offset_changed;\n    }\n    set offset_changed(v: boolean) {\n        this.activeLayerSide.offset_changed = v;\n    }\n\n    get merged_cutpath() {\n        return this.activeLayerSide.merged_cutpath;\n    }\n    set merged_cutpath(v) {\n        this.activeLayerSide.merged_cutpath = v;\n    }\n\n    get offset_waiting(): boolean {\n        return this.activeLayerSide.offset_waiting;\n    }\n    set offset_waiting(v: boolean) {\n        this.activeLayerSide.offset_waiting = v;\n    }\n\n    addSide(side) {\n        if (!side) {\n            side = {id: 0, name: 'default'};\n        }\n\n        if (side.id != 0 && this.layer_sides[0]) {\n            if (this.element_manager.elementsForSide(0).length == 0) {\n                let root = this.layer_sides[0];\n\n                if (root.projectLayer) {\n                    root.projectLayer.remove();\n                }\n\n                delete this.layer_sides[0];\n\n                // For some reason delete messed up the map, so we will need to rebuild it\n                let _layer_sides = {};\n                for (const key of Object.keys(this.layer_sides)) {\n                    _layer_sides[key] = this.layer_sides[key];\n                }\n                this.layer_sides = _layer_sides;\n            }\n        }\n\n        if (!this.layer_sides[side.id]) {\n            this.layer_sides[side.id] = new LayerGroup(side.name, side.id, side);\n            this.loadSide(side.id);\n            this.selection_manager.deactivate();\n            this.setupCanvas();\n        }\n        else {\n            this.loadSide(side.id);\n            this.selection_manager.deactivate();\n        }\n\n        this.sides.sort((a, b) => a.model?.order > b.model?.order ? 1 : -1).forEach(v => {\n            v.projectLayer.sendToBack();\n        })\n    }\n\n    get sides(): LayerGroup[] {\n        return Object.keys(this.layer_sides).map(v => this.layer_sides[v]);\n    }\n\n    selectSide(key) {\n        this.selection_manager.deactivate();\n        this.selection_manager.removeSelection();\n        this.loadSide(key);\n\n        this.buildClipViewArea();\n        this.checkClippingVisibility();\n    }\n\n    setProjectBounds(x, y, width, height) {\n        this.projectLayer.fitBounds(new this.paper.Point(x, y), new this.paper.Size(width, height))\n    }\n\n    loadSide(key) {\n        this.active_side = key;\n\n        if (this.overlay_sides) {\n            for (const side of this.sides) {\n                if (side.projectLayer && !side.model?.disable_offset_path) {\n                    side.projectLayer.opacity = 0.1;\n                }\n                if (side.clipArea) {\n                    side.clipArea.clipMask = true;\n                }\n            }\n\n            if (this.projectLayer) {\n                this.projectLayer.opacity = 1;\n            }\n\n            this.checkClippingVisibility();\n        }\n        else {\n            for (const side of this.sides) {\n                if (side.projectLayer) {\n                    side.projectLayer.visible = false;\n                }\n                if (side.clipArea && !this.in_export_state) {\n                    side.clipArea.clipMask = false;\n                }\n            }\n\n            if (this.projectLayer) {\n                this.projectLayer.visible = true;\n            }\n            if (this.clipArea) {\n                this.clipArea.clipMask = true;\n            }\n\n            this.checkClippingVisibility();\n        }\n\n        this.updateCanvasBackgroundColor();\n        this.trigger('sync');\n    }\n\n    get project() {\n        return this.paperScope?.project;\n    }\n\n    get tool() {\n        return this.paperScope?.tool;\n    }\n\n    setupCanvas(): void {\n        this.paperScope.activate();\n\n        this.projectLayer = new this.paper.Layer();\n        this.projectLayer.name = 'project';\n        this.projectLayer.onFrame = this.onFrame.bind(this);\n\n        this.rootLayer = new this.paper.Layer();\n        this.rootLayer.name = 'root';\n\n        this.clipLayer = new this.paper.Layer();\n        this.clipLayer.name = 'clip';\n\n        this.immutableLayer = new this.paper.Layer();\n        this.immutableLayer.name = 'immutable';\n\n        this.cutpathLayer = new this.paper.Layer();\n        this.cutpathLayer.name = 'cutpath';\n        this.cutpathLayer.data['include-in-processed-file'] = false;\n        this.cutpathLayer.sendToBack();\n\n        this.setupLayers();\n\n        this.setCanvasSizeFromDesign();\n    }\n\n    private setupLayers() {\n        if (!this.projectLayer) {\n            return;\n        }\n\n        this.projectLayer.addChild(this.rootLayer);\n        this.projectLayer.addChild(this.immutableLayer);\n        this.projectLayer.addChild(this.cutpathLayer);\n        this.cutpathLayer.sendToBack();\n        this.rootLayer.addChild(this.clipLayer);\n\n        this.clipLayer.bringToFront();\n        this.immutableLayer.sendToBack();\n    }\n\n    public addClippingMask(paths) {\n        if (!paths || paths.length == 0) {\n            return;\n        }\n\n        if (!this.clipArea) {\n            this.clipArea = new this.paper.CompoundPath(null);\n            this.clipArea.clipMask = true;\n        }\n\n        this.clipArea.addChildren(paths);\n    }\n\n    public buildClippingMask() {\n        let _side = this.active_side;\n        for (const side of this.sides) {\n            this.loadSide(side.id);\n\n            if (this.clipArea) {\n                this.clipArea.remove();\n            }\n            if (this.clipViewArea) {\n                this.clipViewArea.remove();\n            }\n            this.clipViewArea = null;\n            this.clipArea = null;\n\n            // Clear added items to the immutable layer\n            this.immutableLayer.removeChildren();\n\n            let has_masks = false;\n            for (const background_element of this.element_manager.shapeElements) {\n                let clip = background_element.buildClippingRegion();\n\n                if (clip && clip.length > 0) {\n                    this.addClippingMask(clip);\n                    has_masks = true;\n                }\n            }\n\n            for (const clipart_element of this.element_manager.clipartElements) {\n                if (clipart_element.model.use_as_mask || clipart_element.hasCutpathRegion()) {\n                    let clip = clipart_element.buildClippingRegion();\n\n                    if (clip && clip.length > 0) {\n                        this.addClippingMask(clip);\n                        has_masks = true;\n                    }\n                }\n            }\n\n            for (const element of this.element_manager.elements) {\n                if (!element.allow_clipping_when_locked && element.isImmutable() || element.dont_clip) {\n                    this.addImmutableItem(element.layer);\n                }\n            }\n\n            if (has_masks) {\n                this.buildClipViewArea();\n                this.checkClippingVisibility();\n            }\n        }\n        this.loadSide(_side);\n    }\n\n    setOffsetPath(value: boolean) {\n        // If the option has not changed, don't try to rerender everything\n        if (value == this.offset_path_enabled) {\n            return;\n        }\n\n        this.offset_path_enabled = value;\n\n        for (const side of this.sides) {\n            if (side.merged_cutpath) {\n                this.removeOffset(side.merged_cutpath);\n                side.merged_cutpath = null;\n            }\n        }\n\n        let editing = !this.in_export_state;\n\n        if (!editing) {\n            this.resetCanvasFromExport();\n        }\n\n        if (!value) {\n            for (const element of this.element_manager.elements) {\n                element.hideOffsetPath();\n            }\n            this.flushFrameTasks();\n\n            if (!editing) {\n                this.setupCanvasForExport();\n            }\n        }\n        else {\n            let promises = [];\n            for (const element of this.element_manager.elements) {\n                promises.push(element.forceOffsetPath());\n            }\n            SimplePromise.all(promises).then(() => {\n                this.forceFlattenCutpaths().then(() => {\n                    this.flushFrameTasks();\n\n                    if (!editing) {\n                        this.setupCanvasForExport();\n                    }\n                });\n            })\n        }\n    }\n\n    private flatten_cutpath_timeout;\n    public addOffset(item, side, queue=true) {\n        // All offset paths must be removed with the removeOffset function in order to\n        // properly remove the raster and layer from the canvas\n        side = side || this.active_side;\n\n        let layer = this.setupOffset(item);\n\n        this.layer_sides[side].cutpathLayer.addChild(layer);\n        if (queue) {\n            this.queueFlattenCutpathLayer();\n        }\n    }\n\n    public removeOffset(path) {\n        if (path && path.parent && path.parent.name != 'cutpath') {\n            let layer = path.parent;\n            layer.removeChildren();\n            layer.remove();\n        }\n\n        path.remove();\n    }\n\n    private setupOffset(item) {\n        // Don't set up the clipping mask if there are no paths within the compound path group.\n        // There is some freak bug in paperjs where if the compound path is empty then it will use some fantom\n        // path based on the last path used. The image will be clipped but there is nothing clipping it in the compound path.\n        if (this.offset_path_texture && item?.children.length > 0) {\n            let layer = new this.paper.Layer();\n            this.cutpathLayer.addChild(layer);\n\n            let raster = this.createOffsetTexture();\n            layer.addChild(raster)\n\n            item.fillColor = this.offset_path_color;\n            item.clipMask = true;\n            layer.addChild(item);\n\n            return layer;\n        }\n\n        return item;\n    }\n\n    private createOffsetTexture() {\n        // Loading raster elements is expensive and the offset paths frequently change so lets use an object pool to reuse them\n        let offset_path_texture = this.available_offset_rasters.find(v => !v.parent && v.source == this.offset_path_texture);\n\n        if (!offset_path_texture) {\n            offset_path_texture = new this.paper.Raster({\n                source: this.offset_path_texture,\n                crossOrigin: 'anonymous'\n            });\n            offset_path_texture.on('load', () => {\n                offset_path_texture.bounds = this.squareCameraBounds();\n            });\n            this.available_offset_rasters.push(offset_path_texture);\n        }\n\n        return offset_path_texture;\n    }\n\n    public queueFlattenCutpathLayer() {\n        if (this.flatten_cutpath_timeout) {\n            clearTimeout(this.flatten_cutpath_timeout);\n        }\n\n        for (const side of this.sides) {\n            if (side.merged_cutpath && !this.in_export_state) {\n                this.removeOffset(side.merged_cutpath);\n            }\n        }\n\n        this.flatten_cutpath_timeout = setTimeout(() => {\n            this.flattenCutpaths();\n        }, 750)\n    }\n\n    async flattenCutpaths() {\n        if (!this.offset_path_enabled) {\n            return;\n        }\n\n        let promises = [];\n\n        // Each side can have its own cutpath layers\n        for (const side of this.sides) {\n            // Backgrounds don't have an offset path\n            if (side.model?.disable_offset_path) {\n                continue;\n            }\n\n            // If we are waiting on the current offset path task to finish\n            if (side.offset_waiting) {\n                // Flat that the item we are offsetting has changed and that the path being generated can no longer be used\n                side.offset_changed = true;\n                continue;\n            }\n\n            if (side.merged_cutpath) {\n                this.removeOffset(side.merged_cutpath);\n            }\n\n            // Signal that we are waiting for the task to finish and no future calls should be made until its done\n            side.offset_waiting = true;\n\n            let paths = [];\n            for (let child of side.cutpathLayer.children) {\n                if (!child.children) {\n                    continue;\n                }\n\n                if (child instanceof this.paper.Layer) {\n                    child = child.children.find(v => v instanceof this.paper.PathItem);\n\n                    if (!child || !child.children) {\n                        continue;\n                    }\n                }\n\n                for (const path of child.children) {\n                    paths.push(path);\n                }\n            }\n\n            promises.push(Services.get<ClipperService>('ClipperService').unite(paths).then((united_paths) => {\n                if (side.offset_changed) {\n                    // If the offset changed while we were waiting, discard results and try again\n                    side.offset_waiting = false;\n                    side.offset_changed = false;\n\n                    this.queueFlattenCutpathLayer();\n                }\n                else {\n                    this.processUnitedOffsetPath(side, united_paths);\n                    side.offset_waiting = false;\n                }\n            }));\n        }\n\n        await SimplePromise.all(promises);\n    }\n\n    async forceFlattenCutpaths() {\n        for (const side of this.sides) {\n            if (side.model?.disable_offset_path) {\n                continue;\n            }\n\n            if (side.merged_cutpath) {\n                this.removeOffset(side.merged_cutpath);\n            }\n\n            if (!side.cutpathLayer || !side.cutpathLayer.children) {\n                continue;\n            }\n\n            let paths = [];\n            for (const child of side.cutpathLayer.children) {\n                if (!child.children) {\n                    continue;\n                }\n\n                for (const path of child.children) {\n                    paths.push(path);\n                }\n            }\n\n            let united_paths = await Services.get<ClipperService>('ClipperService').unite(paths);\n            this.processUnitedOffsetPath(side, united_paths);\n        }\n    }\n\n    private processUnitedOffsetPath(side, united_paths) {\n        if (side.merged_cutpath) {\n            this.removeOffset(side.merged_cutpath);\n        }\n\n        let compound = new this.paper.CompoundPath();\n\n        for (const item of united_paths) {\n            item.remove();\n            compound.remove();\n            compound = compound.unite(item);\n        }\n\n        // Ugh...\n        if (compound instanceof this.paper.Path) {\n            compound = new this.paper.CompoundPath([compound]);\n        }\n\n        compound.fillColor = this.offset_path_color;\n        if (!this.in_export_state && this.sides.length > 1) {\n            compound.strokeColor = new this.paper.Color(0, 0, 0, .75);\n            compound.strokeCap = 'round';\n            compound.dashArray = [10, 10];\n            compound.strokeWidth = 4;\n        }\n\n        let layer = this.setupOffset(compound);\n        side.cutpathLayer.addChild(layer);\n\n        side.merged_cutpath = compound;\n        side.merged_cutpath.sendToBack();\n        \n        this.trigger('design-change');\n    }\n\n    public buildClipViewArea() {\n        if (this.clipViewArea) {\n            this.clipViewArea.remove();\n        }\n\n        if (!this.clipArea) {\n            return;\n        }\n\n        // Extend background overlay out a lot so that clipped objects cant create detached shapes when subtracting\n        const backgroundOverlay = new this.paper.Path.Rectangle(this.workspace.camera.scale(1.1));\n\n        this.clipViewArea = backgroundOverlay.subtract(this.clipArea);\n\n        this.clipViewArea.fillColor = new this.paper.Color(this.clip_color);\n        this.clipViewArea.opacity = this.clip_opacity;\n        this.clipViewArea.strokeColor = new this.paper.Color('white');\n        this.clipViewArea.blendMode = 'destination-out';\n\n        backgroundOverlay.remove();\n    }\n\n    public addItem(element: IElement) {\n        this.rootLayer.addChild(element.layer);\n    }\n\n    public addImmutableItem(item: paper.Item) {\n        if (!this.clippingDisabled && item) {\n            item.remove();\n            this.immutableLayer.addChild(item);\n        }\n    }\n\n    public checkClippingVisibility() {\n        for (const side of this.sides) {\n            if (!side.clipArea || !side.clipViewArea || side.clipArea.children.length == 0) {\n                continue;\n            }\n\n            if (!this.in_export_state && side.id == this.active_side) {\n                side.clipArea.remove();\n                side.clipLayer.addChild(this.clipViewArea);\n            }\n            else {\n                side.clipViewArea.remove();\n                side.rootLayer.addChild(side.clipArea);\n            }\n        }\n\n        this.updateCanvasBackgroundColor();\n    }\n\n    get canvasSize(): paper.Size {\n        return this.paperScope ? this.paperScope.view.viewSize : new this.paper.Size(this.maxCanvasWidth(), this.maxCanvasHeight());\n    }\n\n    get canvasWidth(): number {\n        return this.canvas_container ? getInnerWidth(this.canvas_container) - (this.canvas_container_padding * 2) : this.maxCanvasWidth();\n    }\n\n    get canvasHeight(): number {\n        return this.canvas_container ? getInnerHeight(this.canvas_container) - (this.canvas_container_padding * 2) : this.maxCanvasHeight();\n    }\n\n    setCanvasSizeFromDesign() {\n        if (!this.workspace || !this.canvas_container) {\n            return;\n        }\n\n        // If the canvas is not visible it will have a height and width of 0 which could break things if modified\n        // before its initialized\n        if (getInnerWidth(this.canvas_container) == 0 || getInnerHeight(this.canvas_container) == 0) {\n            return;\n        }\n\n        const containerWidth: number = this.canvasWidth;\n        if (isNaN(containerWidth) || containerWidth == 0) {\n            console.error('Canvas width is not correctly set.');\n            return;\n        }\n\n        if (this.autosize_artboard) {\n            this.workspace.artboard.width = this.maxCanvasWidth();\n            this.workspace.artboard.height = this.maxCanvasHeight();\n        }\n\n        this.workspace.zoom = this.calculateCameraArtboardScale() * 0.95;\n        let scaled_width = this.maxCanvasWidth() / this.workspace.zoom;\n        let scaled_height = this.maxCanvasHeight() / this.workspace.zoom;\n        this.workspace.camera.set(\n            (this.workspace.artboard.width - scaled_width) / 2,\n            (this.workspace.artboard.height - scaled_height) / 2,\n            scaled_width,\n            scaled_height\n        )\n\n        this.updateViewFromWorkspace();\n    }\n\n    calculateCameraArtboardScale() {\n        let max_height = this.maxCanvasHeight();\n        let max_width = this.maxCanvasWidth();\n        const containerWidth: number = this.canvasWidth;\n        let scale = 1;\n\n        const yRatio: number = this.workspace.artboard.size.height / this.workspace.artboard.size.width;\n\n        if (yRatio * containerWidth <= max_height) {\n            scale = containerWidth / this.workspace.artboard.width;\n        }\n        else {\n            scale = max_height / this.workspace.artboard.height;\n        }\n\n        if (this.workspace.artboard.width * scale > max_width) {\n            scale *= max_width / (this.workspace.artboard.width * scale);\n        }\n\n        // This is somehow getting set to 0 or NaN on one device. So let's add some kind of sanity check.\n        if (isNaN(scale) || scale < 0.01) {\n            console.error('Scale multiplier too small. The canvas may be incorrectly sized.')\n            scale = 1;\n        }\n\n        return scale;\n    }\n\n    updateViewFromWorkspace() {\n        if (this.in_export_state) {\n            // In the export state we need to set the canvas size to the artboard size and reset the camera to the center\n            this.paperScope.view.viewSize = this.workspace.artboard.size.clone();\n            this.paperScope.view.zoom = 1;\n            this.paperScope.view.center = this.workspace.artboard.center;\n        }\n        else {\n            // The viewSize defines the canvas width/height in pixels, not the camera size or position\n            this.paperScope.view.viewSize = new this.paper.Size(this.maxCanvasWidth(), this.maxCanvasHeight());\n\n            // Translate the camera position and zoom\n            this.paperScope.view.center = this.workspace.camera.center;\n            this.paperScope.view.zoom = this.workspace.zoom;\n        }\n        this.trigger('change:zoom');\n    }\n\n    resizeCanvas(): void {\n        if (this.fixed_camera) {\n            this.setCanvasSizeFromDesign();\n        }\n    }\n\n    get resolution(): number {\n        return this.paperScope.view.resolution;\n    }\n\n    get resolutionMod(): number {\n        return this.resolution / 72;\n    }\n\n    resetCanvasFromExport() {\n        if (!this.loaded || !this.in_export_state) {\n            return;\n        }\n\n        this.revertExportBounds();\n\n        // Force an immediate redraw of the canvas for exporting the canvas data\n        (this.paperScope.view as any).draw();\n    }\n\n    revertExportBounds() {\n        this.in_export_state = false;\n        if (this.sides.length > 0) {\n            for (let index = 0; index < this.sides.length; index += 1) {\n                let side = this.sides[index];\n\n                if (side.standard_bounds) {\n                    side.projectLayer.bounds = side.standard_bounds;\n                }\n            }\n        }\n\n        this.updateViewFromWorkspace();\n    }\n\n    setupCanvasForExport() {\n        if (!this.loaded || this.in_export_state) {\n            return;\n        }\n\n        this.in_export_state = true;\n\n        // Reset the camera so it's matched to the design and not zoomed in\n        this.setCanvasSizeFromDesign();\n        this.updateCanvasBackgroundColor();\n\n        let action;\n        if (this.overlay_sides) {\n            action = () => {\n                for (const arr_key of Object.keys(this.layer_sides)) {\n                    let group = this.layer_sides[arr_key];\n                    if (group.projectLayer && !group.model?.disable_offset_path) {\n                        group.projectLayer.opacity = 1;\n                    }\n                    if (group.merged_cutpath) {\n                        group.merged_cutpath.dashArray = null;\n                        group.merged_cutpath.strokeWidth = 0;\n                    }\n                }\n            }\n        }\n        else {\n            action = () => {\n                for (const item of this.element_manager.allElements()) {\n                    item.preSave();\n                }\n                this.buildClippingMask();\n\n                let side = this.layer_sides[this.active_side];\n                side.standard_bounds = side.projectLayer.bounds.clone();\n                side.projectLayer.fitBounds(this.workspace.artboard);\n                (this.paperScope.view as any).draw();\n            };\n        }\n\n        action();\n\n        // Force an immediate redraw of the canvas for exporting the canvas data\n        (this.paperScope.view as any).draw();\n    }\n\n    withSideActive(func: () => any, side: number) {\n        if (!this.layer_sides[side]) {\n            Sentry.captureException(new Error(`Trying to change is a invalid side ${side}`));\n            return;\n        }\n\n        let export_state = false;\n        if (this.in_export_state) {\n            export_state = true;\n            this.revertExportBounds();\n        }\n\n        let current_side = this.active_side;\n        if (this.active_side != side) {\n            this.loadSide(side);\n        }\n\n        let result = func();\n\n        if (this.active_side != current_side) {\n            this.loadSide(current_side);\n        }\n\n        if (export_state) {\n            this.setupCanvasForExport();\n        }\n\n        return result;\n    }\n\n    exportPNG($event?): string {\n        if ($event)\n            $event.preventDefault();\n\n        if (this.canvas) {\n            return this.canvas.toDataURL('image/png');\n        }\n\n        return null;\n    }\n\n    exportSVG(options?): string {\n        options = options || {};\n        options['linkImages'] = true;\n\n        let svg = '';\n        let _opacity = null;\n        if (this.clipViewArea) {\n            _opacity = this.clipViewArea.opacity;\n            this.clipViewArea.opacity = 0;\n        }\n\n        // Disabling vue from paperjs adds __v_skip onto everything. So lets clean it up in the export.\n        let svg_source = this.paperScope.project.exportSVG(options) as SVGElement;\n        svg_source.querySelectorAll('[__v_skip]').forEach(v => v.removeAttribute('__v_skip'));\n\n        // Cleanup the junk that PaperJS generates...\n        // Remove all \"hidden\" elements since our svg to png tool will still render the hidden parts\n        svg_source.querySelectorAll('[visibility=\"hidden\"]').forEach(v => v.remove());\n\n        // Remove all paths without an actual path...\n        svg_source.querySelectorAll('path:not(path[d])').forEach(v => v.remove());\n\n        // Remove all empty groups...\n        svg_source.querySelectorAll('g:not(:has(*))').forEach(v => v.remove());\n\n        svg = new XMLSerializer().serializeToString(svg_source);\n\n        if (this.clipViewArea) {\n            this.clipViewArea.opacity = _opacity;\n        }\n\n        return svg;\n    }\n\n    flushFrameTasks() {\n        for (const element of this.element_manager.getElementsByClass(BaseElement)) {\n            element.flushFrameTasks();\n        }\n    }\n\n    runTasks() {\n        for (const element of this.element_manager.getElementsByClass(BaseElement)) {\n            element.updatePaper();\n        }\n\n        for (const element of this.element_manager.getElementsByClass(BaseElement)) {\n            element.runFrameTasks();\n        }\n    }\n\n    reset() {\n        if (this.projectLayer) {\n            this.projectLayer.removeChildren();\n        }\n        if (this.rootLayer) {\n            this.rootLayer.removeChildren();\n        }\n        if (this.clipLayer) {\n            this.clipLayer.removeChildren();\n        }\n        if (this.immutableLayer) {\n            this.immutableLayer.removeChildren();\n        }\n\n        this.setupLayers();\n\n        this.max_canvas_width = 700;\n        this.max_canvas_height = 700;\n        this.element_manager.reset();\n        this.selection_manager.deactivate();\n        this.contourPath = null;\n    }\n\n    setCanvasBackgroundColorOverride(c) {\n        this.canvas_color_override = c;\n        this.updateCanvasBackgroundColor();\n    }\n\n    updateCanvasBackgroundColor() {\n        if (this.canvas_color_override) {\n            this.canvas_background_color = this.canvas_color_override;\n            return;\n        }\n\n        if (!this.clipArea || !this.clipViewArea) {\n            this.canvas_background_color = '';\n            return;\n        }\n\n        else {\n            if (!this.in_export_state) {\n                this.canvas_background_color = '#f1f1f1';\n            } else {\n                this.canvas_background_color = '#c5c5c5';\n            }\n        }\n    }\n\n    /*\n        Setup Paper From Canvas\n\n        The first step in the initialization process. It binds to the canvas and signals that things are\n        setup and ready to be used. This should be called as soon as the canvas is available.\n     */\n    async setupPaperFromCanvas(canvas) {\n        if (!this.paper) await this.paper_promise;\n\n        const paperScope = new this.paper.PaperScope();\n        paperScope.tool = new this.paper.Tool();\n        paperScope.activate();\n        paperScope.setup(canvas);\n\n        let state_manager = Services.get<SelectionStateManager>('SelectionStateManager');\n        paperScope.tool.onMouseDown = state_manager.onMouseDown.bind(state_manager);\n        paperScope.tool.onMouseDrag = state_manager.onMouseDrag.bind(state_manager);\n        paperScope.tool.onMouseUp = state_manager.onMouseUp.bind(state_manager);\n        paperScope.tool.onMouseMove = state_manager.onMouseMove.bind(state_manager);\n\n        this.canvas_container = document.getElementById('canvas-container');\n\n        // It looks like this is expensive and not likely to change so lets cache it\n        this.canvas_container_padding = parseInt(window.getComputedStyle(this.canvas_container, null).padding);\n\n        // Fixed in firefox 96, but we still need to support older browser since it causes the tool to break\n        // See https://bugzilla.mozilla.org/show_bug.cgi?id=137688\n        if (!this.canvas_container_padding) {\n            this.canvas_container_padding = parseInt(window.getComputedStyle(this.canvas_container, null).paddingTop);\n        }\n\n        if (isNaN(this.canvas_container_padding)) {\n            this.canvas_container_padding = 15;\n        }\n\n        this.paperScope = paperScope;\n        this.canvas = canvas;\n\n        this.setupZoomEvents();\n\n        this.setup_deferred.resolve();\n    }\n\n    screenSpaceToViewSpace(screen_x: number, screen_y: number) {\n        // Convert a point on the screen to the position within the viewport\n        let canvas_rect = this.canvas.getBoundingClientRect();\n\n        // Convert to percent width/height\n        let canvas_percent_x = (screen_x - canvas_rect.x) / canvas_rect.width;\n        let canvas_percent_y = (screen_y - canvas_rect.y) / canvas_rect.height\n\n        // Convert from screen space to camera view space\n        let view_x = (canvas_percent_x * this.paperScope.view.bounds.width) + this.paperScope.view.bounds.x;\n        let view_y = (canvas_percent_y * this.paperScope.view.bounds.height) + this.paperScope.view.bounds.y;\n\n        return new this.paper.Point(view_x, view_y);\n    }\n\n    setupZoomEvents() {\n        // Mouse wheel\n        this.canvas.addEventListener('wheel', (event: WheelEvent) => {\n            if (this.fixed_camera) {\n                return;\n            }\n\n            let zoom = event.deltaY < 0 ? 1.05 : 0.95;\n            let point: paper.Point = this.screenSpaceToViewSpace(event.x, event.y);\n\n            if ((zoom > 1 && this.paperScope.view.zoom < this.max_zoom) || (zoom < 1 && this.paperScope.view.zoom > this.min_zoom)) {\n                this.paperScope.view.scale(zoom, point);\n                this.clampCamera();\n            }\n        });\n\n\n        // Pinch zoom and single click / touch panning.\n        // Why can't there just be a single event for this stuff...\n        let event_cache = [];\n        let last_diff = null;\n        let last_screen_center: paper.Point = null;\n        let last_movement: paper.Point = null;\n        let pointer_up = (event: PointerEvent) => {\n            const index = event_cache.findIndex(cached => cached.pointerId === event.pointerId);\n            event_cache.splice(index, 1);\n            last_diff = null;\n            last_screen_center = null;\n            last_movement = null;\n        }\n        let pointer_down = (event: PointerEvent) => {\n            event_cache.push(event);\n        }\n        let pointer_move = (event: PointerEvent) => {\n            if (this.fixed_camera) {\n                return;\n            }\n\n            // Update the event in the cache\n            const index = event_cache.findIndex(cached => cached.pointerId === event.pointerId);\n            event_cache[index] = event;\n\n            if (event_cache.length === 2) {\n                let point0: paper.Point = new this.paper.Point(event_cache[0].clientX, event_cache[0].clientY);\n                let point1: paper.Point = new this.paper.Point(event_cache[1].clientX, event_cache[1].clientY);\n\n                let diff = point0.subtract(point1).length;\n                let screen_center = point0.add(point1).divide(2);\n\n                if (last_diff != null && diff > 0 && last_diff > 0) {\n                    let zoom = diff / last_diff;\n\n                    // Scale down by the sqrt so smaller/slower movements are scaled down less than larger ones\n                    zoom = Math.pow(zoom, 0.5);\n\n                    // Move the screen position when both fingers move\n                    if (last_screen_center) {\n                        let movement: paper.Point = screen_center.subtract(last_screen_center);\n                        movement.length /= this.paperScope.view.zoom || 1;\n\n                        if (movement.length > 0 && isFinite(movement.length)) {\n                            this.paperScope.view.translate(movement);\n                        }\n                    }\n\n                    // Scale around the center\n                    if ((zoom > 1 && this.paperScope.view.zoom < this.max_zoom) || (zoom < 1 && this.paperScope.view.zoom > this.min_zoom)) {\n                        this.paperScope.view.scale(zoom, this.screenSpaceToViewSpace(screen_center.x, screen_center.y));\n                    }\n\n                    this.clampCamera();\n                }\n\n                last_diff = diff;\n                last_screen_center = screen_center;\n            }\n            // Don't pan when there is an active selection. The selection manager will deal with moving the element.\n            else if (event_cache.length === 1 && this.selection_manager.selectedElement() == null) {\n                // We need to track change in event.clientX over time instead of using event.movementX.\n                // event.movementX is really buggy on firefox. With a local connection it always returns 0, and when it's\n                // on a server it returns a value that does not take into account dpi scaling.\n                // There have been other reports of this functionality changing in chrome in 2022 so lets just avoid it all together.\n                let point: paper.Point = new this.paper.Point(event.clientX, event.clientY);\n                if (last_movement) {\n                    let movement = point.subtract(last_movement).divide(this.paperScope.view.zoom || 1);\n\n                    // Just in case, prevents NaN propagation unnecessarily updating\n                    if (movement.length > 0 && isFinite(movement.length)) {\n                        this.paperScope.view.translate(movement);\n                        this.clampCamera();\n                    }\n                }\n                last_movement = point;\n            }\n            else {\n                last_screen_center = null;\n                last_diff = null;\n                last_movement = null;\n            }\n        }\n\n        this.canvas.addEventListener('pointerup', pointer_up);\n        this.canvas.addEventListener('pointercancel', pointer_up);\n        this.canvas.addEventListener('pointerout', pointer_up);\n        this.canvas.addEventListener('pointerleave', pointer_up);\n        this.canvas.addEventListener('pointerdown', pointer_down);\n        this.canvas.addEventListener('pointermove', pointer_move);\n    }\n\n    get max_zoom(): number {\n        return this.workspace.zoom * 10;\n    }\n\n    get min_zoom(): number {\n        return this.workspace.zoom;\n    }\n\n    clampCamera() {\n        // Clamp zoom\n        this.paperScope.view.zoom = Math.min(this.paperScope.view.zoom, this.max_zoom);\n        this.paperScope.view.zoom = Math.max(this.paperScope.view.zoom, this.min_zoom);\n\n        // Clamp the viewport positions so its always within the workspace camera bounds\n        let translate_point = new this.paper.Point(0,0);\n\n        if (this.paperScope.view.bounds.top < this.workspace.camera.top) {\n            translate_point.y += this.paperScope.view.bounds.top - this.workspace.camera.top;\n        }\n        if (this.paperScope.view.bounds.left < this.workspace.camera.left) {\n            translate_point.x += this.paperScope.view.bounds.left - this.workspace.camera.left;\n        }\n        if (this.paperScope.view.bounds.bottom > this.workspace.camera.bottom) {\n            translate_point.y += this.paperScope.view.bounds.bottom - this.workspace.camera.bottom;\n        }\n        if (this.paperScope.view.bounds.right > this.workspace.camera.right) {\n            translate_point.x += this.paperScope.view.bounds.right - this.workspace.camera.right;\n        }\n        if (translate_point.x != 0 || translate_point.y != 0) {\n            this.paperScope.view.translate(translate_point);\n        }\n\n        // Update the selection controls so they stay the same physical size despite the change in zoom\n        this.selection_manager.drawControls();\n        this.trigger('change:zoom');\n    }\n\n    maxCanvasHeight() {\n        let inner_height = getInnerHeight(this.canvas_container);\n        let inner_width = getInnerWidth(this.canvas_container);\n        if (!inner_height || !inner_width) {\n            return this.max_canvas_height;\n        }\n\n        if (!this.max_canvas_height) {\n            return inner_height - (this.canvas_container_padding * 2);\n        }\n        return Math.min(inner_height - (this.canvas_container_padding * 2), this.max_canvas_height);\n    }\n\n    maxCanvasWidth() {\n        let inner_height = getInnerHeight(this.canvas_container);\n        let inner_width = getInnerWidth(this.canvas_container);\n        if (!inner_width || !inner_height) {\n            return this.max_canvas_width;\n        }\n\n        if (!this.max_canvas_width) {\n            return inner_width - (this.canvas_container_padding * 2);\n        }\n\n        return Math.min(inner_width - (this.canvas_container_padding * 2), this.max_canvas_width);\n    }\n\n    /*\n        Setup Workspace\n\n        The second step of the initialization process. This will setup the bindings.\n        updateWorkspace must be called after this to start the resize process.\n        This should only be called once canvas is mounted in the setup process.\n     */\n    setupWorkspace() {\n        window.addEventListener('resize', () => {\n            this.setCanvasSizeFromDesign();\n            this.clampCamera();\n\n            // Update texture bounds when resizing\n            for (const texture of this.available_offset_rasters) {\n                texture.bounds = this.squareCameraBounds();\n            }\n\n            // Update the clipping\n            this.buildClipViewArea();\n        });\n    }\n\n    updateWorkspace(width: number, height: number) {\n        let size: paper.Rectangle = new this.paper.Rectangle(0, 0, width, height);\n        if (size.area == 0 || isNaN(size.area)) {\n            return;\n        }\n\n        let camera = new this.paper.Rectangle(0, 0, this.maxCanvasWidth(), this.maxCanvasHeight());\n        this.workspace = new PaperCanvasWorkspace(camera, size);\n\n        this.updateCanvasBackgroundColor();\n        this.setCanvasSizeFromDesign();\n    }\n\n    /*\n        Post Load Setup\n\n        This should be the final step of the initialization process after all of the elements have been loaded\n        for the first time. It will correct values and redraw everything.\n     */\n    postLoadSetup(): void {\n        // Make sure all of the z values are consecutive\n        this.element_manager.sort();\n        this.element_manager.fixZ();\n\n        // Everything should be loaded now, redraw everything\n        this.element_manager.redrawAll();\n\n        // Make sure the SelectionManager is setup\n        this.selection_manager.deactivate();\n        this.trigger('postLoad');\n\n        if (this.sides.length > 1) {\n            this.selectSide(this.sides[0].id);\n        }\n\n        this.loaded = true;\n    }\n\n    /*\n        This really needs to be optimized more.\n\n        The view properties should only be updated when there is a need to, not every frame.\n     */\n    private onFrame(event): void {\n        if (!this.workspace || !this.workspace.artboard)\n            return;\n\n        this.paperScope.activate();\n\n        // For some reason if you remove a onFrame event form a paperjs item it breaks all of them so we need to do this\n        // manually.\n        for (const item of this.element_manager._elements) {\n            item.onFrame(event);\n        }\n\n        if (this.fixed_camera) {\n            this.frame_number += 1;\n            // Only update size once every 10 frames. Drops idle cpu usage to 4% and created new objects on every frame\n            if (this.frame_number >= 10) {\n                this.frame_number = 0;\n                this.resizeCanvas();\n            }\n        }\n    }\n\n    clearDebugItems() {\n        if (this.debugItems) {\n            for (const item of this.debugItems) {\n                item.remove();\n            }\n        }\n        this.debugItems = [];\n    }\n\n    addDebugCircle(point, color='red', size=10) {\n        let d = new this.paper.Path.Circle(point, size/this.paperScope.view.zoom);\n        d.fillColor = color\n        this.projectLayer.addChild(d);\n        this.debugItems.push(d);\n    }\n\n    addDebugSquare(rect, color='red') {\n        let d = new this.paper.Path.Rectangle(rect);\n        d.fillColor = color;\n        d.opacity = 0.5;\n        this.projectLayer.addChild(d);\n        this.debugItems.push(d);\n    }\n\n    public squareCameraBounds() {\n        if (this.fixed_texture_position) {\n            let size = Math.max(this.workspace.artboard.width, this.workspace.artboard.height);\n            let rect =  new this.paper.Rectangle(0, 0, size, size);\n            rect.center = this.workspace.artboard.center;\n            return rect;\n        }\n        else {\n            let largest_size = Math.max(this.workspace.camera.width, this.workspace.camera.height)\n            let rect =  new this.paper.Rectangle(0, 0, this.workspace.camera.width, this.workspace.camera.height);\n            rect.center = this.workspace.camera.center;\n            return rect;\n        }\n    }\n\n    debugCamera() {\n        this.addDebugSquare(this.workspace.camera, 'red');\n        this.addDebugSquare(this.workspace.artboard, 'blue');\n    }\n\n    controlsLayer() {\n        if (this.controls_layer) {\n            return this.controls_layer;\n        }\n        this.controls_layer = new this.paper.Layer();\n        this.controls_layer.name = 'Controls';\n\n        if (this.paperScope.project.layers.indexOf(this.controls_layer) == -1) {\n            this.paperScope.project.addLayer(this.controls_layer);\n        }\n\n        this.controls_layer.bringToFront();\n\n        return this.controls_layer;\n    }\n}\n","import {EventDispatcher} from \"../../../core/utils/EventDispatcher\";\nimport {Services} from \"../../../core/services/Services\";\nimport PaperCanvasService from \"./PaperCanvasService\";\nimport {ElementManager} from \"./ElementManager\";\nimport {isDarkModeSet} from \"../../../core/utils/utils\";\nimport {CursorHandleState} from \"./SelectionStateManager\";\nimport {add, closestPointOnLine, distance, equals, Line, lineIntersection, linesOverlap, Point, pointDistance, subtract} from \"../../../core/utils/VectorUtils\";\nimport ColorService from \"./ColorService\";\n\nexport abstract class AbstractSelectionManager extends EventDispatcher {\n    canvas_service: PaperCanvasService;\n    element_manager: ElementManager;\n\n    cursor_handle: paper.Path;\n    cursor_handle_state: CursorHandleState = CursorHandleState.NONE;\n\n    placement_guides: Line[] = [];\n    active_placement_guides: Line[] = [];\n    visual_guides: paper.Path[] = [];\n    show_all_visual_guides = false;\n    snap_tolerance = 4;\n    placement_guides_disabled: boolean;\n\n    mouse_down_point: paper.Point;\n\n    debug_points: Point[] = [];\n\n    radius_snap_stroke = '#079455';\n    radius_snap_fill = '#07945580'\n    hover_fill: string = '#2e90fa26';\n    hover_stroke: string = '#1570ef';\n    active_fill: string = '#1570ef80';\n    active_stroke: string = '#1570ef';\n    placement_guide_stroke: string = '#17b26a80';\n    merge_fill: string = '#f7900980'\n    active_line_stroke: string = '';\n    warning_line_stroke: string = '';\n\n    constructor() {\n        super();\n\n        this.canvas_service = Services.get('PaperCanvasService');\n        this.element_manager = Services.get<ElementManager>('ElementManager');\n\n        let color_service = Services.get<ColorService>('ColorService');\n        color_service.color_api_import.then(() => {\n            this.hover_fill = color_service.addTransparency(color_service.colorVarToValue('--info-weak'), 0.15);\n            this.hover_stroke = color_service.colorVarToValue('--info-strong');\n\n            this.active_fill = color_service.addTransparency(color_service.colorVarToValue('--info-strong'), 0.5);\n            this.active_stroke = color_service.colorVarToValue('--info-strong');\n\n            this.radius_snap_stroke = color_service.colorVarToValue('--success-strong');\n            this.radius_snap_fill = color_service.addTransparency(color_service.colorVarToValue('--success-strong'), 0.15);\n\n            this.placement_guide_stroke = color_service.addTransparency(color_service.colorVarToValue('--success-weak'), 0.15);\n\n            this.merge_fill = color_service.addTransparency(color_service.colorVarToValue('--warning-strong'), 0.5);\n\n            this.active_line_stroke = color_service.colorVarToValue('--info-weak');\n            this.warning_line_stroke = color_service.colorVarToValue('--warning-weak');\n        });\n    }\n\n    abstract activeHandle(): paper.Path;\n    abstract cursorHandle(event: paper.ToolEvent): paper.Path;\n    abstract setupPlacementGuides(): void;\n\n    get paper() {\n        return this.canvas_service.paper;\n    }\n\n    dashWidth() {\n        return 5 / this.canvas_service.paperScope.view.zoom;\n    }\n\n    rotateLineLength() {\n        return 24 / this.canvas_service.paperScope.view.zoom;\n    }\n\n    controlSize() {\n        return 24 / this.canvas_service.paperScope.view.zoom;\n    }\n\n    borderWidth() {\n        return 0.75 / this.canvas_service.paperScope.view.zoom;\n    }\n\n    styleControl(control: paper.Path): void {\n        if (isDarkModeSet()) {\n            control.strokeColor = new this.paper.Color(1, 1, 1, 0.9);\n            control.fillColor = new this.paper.Color(0, 0, 0, 0.4);\n        }\n        else {\n            control.strokeColor = new this.paper.Color(0, 0, 0, 0.7);\n            control.fillColor = new this.paper.Color(1, 1, 1, 0.4);\n\n        }\n        control.strokeWidth = this.borderWidth();\n    }\n\n    styleControlHover(control: paper.Path) {\n        control.fillColor = new this.paper.Color(this.hover_fill);\n        control.strokeColor = new this.paper.Color(this.hover_stroke);\n    }\n\n    styleControlActive(control: paper.Path) {\n        control.fillColor = new this.paper.Color(this.active_fill);\n        control.strokeColor = new this.paper.Color(this.active_stroke);\n    }\n\n    setCursorState(handle: paper.Path, state: CursorHandleState) {\n        if (this.cursor_handle && this.cursor_handle != handle) {\n            this.styleControl(this.cursor_handle);\n        }\n\n        this.cursor_handle = handle;\n        this.cursor_handle_state = state;\n\n        if (!this.cursor_handle) {\n            this.cursor_handle_state = CursorHandleState.NONE;\n            return;\n        }\n\n        switch (this.cursor_handle_state) {\n            case CursorHandleState.NONE:\n                return this.styleControl(this.cursor_handle);\n            case CursorHandleState.HOVER:\n                return this.styleControlHover(this.cursor_handle);\n            case CursorHandleState.ACTIVE:\n                return this.styleControlActive(this.cursor_handle);\n        }\n    }\n\n    pushPlacementGuide(a: Point, b: Point): void {\n        let ap = pointDistance(a, b, 10000);\n        let bp = pointDistance(b, a, 10000);\n\n        // Only add if there is not another overlapping line\n        if (!this.placement_guides.find(v => linesOverlap(ap, bp, v[0], v[1]))) {\n            this.placement_guides.push([ap, bp]);\n        }\n    }\n\n    addLine(a: Point, b: Point, color: string) {\n        let as = new this.paper.Segment(new this.paper.Point(a));\n        let bs = new this.paper.Segment(new this.paper.Point(b));\n\n        let path = new this.paper.Path({\n            segments: [as, bs],\n            strokeColor: color,\n            strokeWidth: this.guidSize()\n        });\n\n        this.visual_guides.push(path);\n    }\n\n    guidSize() {\n        return 3 / this.canvas_service.paperScope.view.zoom;\n    }\n\n    clearVisualGuides() {\n        for (const item of this.visual_guides) {\n            item.remove();\n        }\n        this.visual_guides = [];\n    }\n\n    snapTolerance() {\n        return this.snap_tolerance / this.canvas_service.paperScope.view.zoom;\n    }\n\n    findGuideSnap(point: Point) {\n        if (this.placement_guides_disabled) {\n            return {\n                distance: Number.MAX_SAFE_INTEGER,\n                point: null,\n                intersection: null\n            }\n        }\n\n        let min_distance = Number.MAX_SAFE_INTEGER;\n        let min_point = null;\n\n        // Filter to only lines that are within range\n        let filtered_guides = this.placement_guides.filter(v => Math.abs(distance(point, closestPointOnLine(v[0], v[1], point))) < this.snapTolerance())\n\n        // First check intersections, they have priority\n        for (let i = 0; i < filtered_guides.length; i++) {\n            let a = filtered_guides[i];\n            for (let j = i + 1; j < filtered_guides.length; j++) {\n                let b = filtered_guides[j];\n                let intersection = lineIntersection(a[0], a[1], b[0], b[1]);\n                if (intersection) {\n                    let intersection_distance = distance(intersection, point);\n                    if (intersection_distance < min_distance && intersection_distance < this.snapTolerance()) {\n                        min_point = intersection;\n                        min_distance = intersection_distance;\n                    }\n                }\n            }\n        }\n\n        let intersection_found = min_point != null;\n\n        // Check lines if there are no intersections in range\n        if (!intersection_found) {\n            for (const line of filtered_guides) {\n                let lp = closestPointOnLine(line[0], line[1], point);\n                let lp_distance = distance(lp, point);\n                if (lp_distance < min_distance) {\n                    min_distance = lp_distance;\n                    min_point = lp;\n                }\n            }\n        }\n\n        return {\n            distance: min_distance,\n            point: min_point,\n            intersection: intersection_found\n        }\n    }\n\n    guideSnap(point: Point): Point {\n        let result = this.findGuideSnap(point);\n        return result.point ? result.point : point\n    }\n\n    snappedMovement(point: Point, movement: Point): Point {\n        return subtract(this.guideSnap(add(point, movement)), point);\n    }\n\n    snappedMovementSet(points: Point[], movement: Point): Point {\n        this.debug_points = []\n\n        if (!points || points.length == 0 || this.placement_guides_disabled) {\n            return movement;\n        }\n\n        let results = [];\n        for (const point of points) {\n            let result = this.findGuideSnap(add(point, movement)) as any;\n            if (result.point) {\n                result.source = point;\n                results.push(result);\n            }\n        }\n\n        if (results.length == 0) {\n            return movement;\n        }\n\n        let intersections = results.filter(v => v.intersection);\n        if (intersections.length != 0) {\n            let min = intersections.reduce((k, v) => v.distance < k.distance ? v : k, intersections[0]);\n            if (min) {\n                return subtract(min.point, min.source);\n            }\n        }\n\n        let non_intersections = results.filter(v => !v.intersection);\n        if (non_intersections.length != 0) {\n            let min = non_intersections.reduce((k, v) => v.distance < k.distance ? v : k, non_intersections[0]);\n            if (min) {\n                return subtract(min.point, min.source);\n            }\n        }\n\n        return movement\n    }\n}","import {IElement} from '../tool/IElement';\nimport {Services} from '../../../core/services/Services';\nimport {isDarkModeSet} from '../../../core/utils/utils';\nimport {CursorHandleState, SelectionStateManager, SelectionType} from \"./SelectionStateManager\";\nimport {AbstractSelectionManager} from \"./AbstractSelectionManager\";\nimport {add, clampRotation, closestPointOnLine, distance, distanceFromLineSegment, equals, normal, Point, rotatePoint} from \"../../../core/utils/VectorUtils\";\n\nexport class SelectionManager extends AbstractSelectionManager implements SelectionType {\n    selection: IElement;\n    multi_selection: IElement[];\n    multi_selection_rotation: number;\n    multi_selection_bounds: any;\n    dragging_selection: boolean;\n    dragging_rotate_control: boolean;\n    dragging_scale_control_index: number;\n    scale_controls: paper.Path[];\n    rotate_control: paper.Path;\n    controls_disabled: boolean;\n    dragging_disabled: boolean;\n    active_bounds: any;\n\n    last_clicked: Date;\n\n    controls_layer: paper.Layer;\n\n    saved_position: Point;\n    saved_snap_points: Point[];\n\n    rotation_snap_points = [0, 90, 180, 270];\n\n    constructor() {\n        super();\n        this.dragging_selection = false;\n        this.scale_controls = [];\n        this.multi_selection = [];\n        this.last_clicked = new Date();\n    }\n\n    isMultiSelected(element) {\n        return this.selection == element || (this.multi_selection && this.multi_selection.indexOf(element) != -1);\n    }\n\n    get isMultiSelection() {\n        return this.multi_selection && this.multi_selection.length > 0;\n    }\n\n    get draggingScaleControl() {\n        if (this.dragging_scale_control_index != null)\n            return this.scale_controls[this.dragging_scale_control_index];\n    }\n\n    styleControlStroke(path: paper.Path): void {\n        if (isDarkModeSet()) {\n            path.strokeColor = new this.paper.Color(255, 255, 255, 0.9);\n        }\n        else {\n            path.strokeColor = new this.paper.Color(0, 0, 0, 0.5);\n        }\n        path.strokeCap = 'round';\n        path.dashArray = [this.dashWidth(), this.dashWidth()];\n        path.strokeWidth = this.borderWidth();\n    }\n\n    selectionBounds() {\n        if (!this.selection) {\n            return null;\n        }\n\n        if (this.multi_selection.length == 0) {\n            return this.selection.elementBounds;\n        }\n        else {\n            let bounds = this.selection.bounds;\n\n            for (let item of this.multi_selection) {\n                bounds = bounds.unite(item.bounds);\n            }\n\n            return bounds;\n        }\n    }\n\n    showScaleControls() {\n        let show = this.selection.showScaleControls();\n\n        for (const item of this.multi_selection) {\n            show = show && item.showScaleControls();\n        }\n\n        return show;\n    }\n\n    showRotateControl() {\n        let show = this.selection.showRotateControl();\n\n        for (const item of this.multi_selection) {\n            show = show && item.showRotateControl();\n        }\n\n        return show;\n    }\n\n    drawControls(): void {\n        if (!this.canvas_service.project || this.controls_disabled) {\n            return;\n        }\n\n        if (!Services.get<SelectionStateManager>('SelectionStateManager').scaleMoveActive()) {\n            return;\n        }\n\n        this.canvas_service.paperScope.activate();\n        this.controls_layer = this.canvas_service.controlsLayer();\n\n        this.removeControls();\n\n        if (!this.selection || this.selection && this.selection.locked) {\n            return;\n        }\n\n        // Create bound rectangle surrounding selection\n        let bounds = this.multi_selection.length != 0 ? this.multi_selection_bounds : this.selectionBounds();\n        const bounding_rect: paper.Path.Rectangle = new this.paper.Path.Rectangle(bounds);\n\n        this.styleControlStroke(bounding_rect);\n        this.controls_layer.addChild(bounding_rect);\n\n        // Create 4 control points for scaling\n        if (bounds && this.showScaleControls()) {\n            // Why were these done in a Z instead of a circle\n            const controlPoints = [\n                bounds.topLeft.subtract(new this.paper.Point(this.controlSize(), this.controlSize())),\n                bounds.topRight.subtract(new this.paper.Point(0, this.controlSize())),\n                bounds.bottomLeft.subtract(new this.paper.Point(this.controlSize(), 0)),\n                bounds.bottomRight\n            ];\n\n            for (const p of controlPoints) {\n                const controlRect = new this.paper.Path.Rectangle(new this.paper.Rectangle(\n                    p, new this.paper.Size(this.controlSize(), this.controlSize())\n                ));\n\n                this.styleControl(controlRect);\n                this.controls_layer.addChild(controlRect);\n                this.scale_controls.push(controlRect);\n            }\n        }\n\n        // Create the line to the rotation circle\n        if (bounds && this.showRotateControl()) {\n            const linePoint = new this.paper.Point(\n                    bounds.width / 2 + bounds.x,\n                    bounds.height + bounds.y\n                ),\n                rotateLine = new this.paper.Path.Line(\n                    linePoint,\n                    linePoint.add(new this.paper.Point(0, this.rotateLineLength()))\n                );\n            this.styleControlStroke(rotateLine);\n            this.controls_layer.addChild(rotateLine);\n\n            // Add the circle control for rotation\n            this.rotate_control = new this.paper.Path.Circle(\n                linePoint.add(new this.paper.Point(0, this.rotateLineLength() + this.controlSize() / 2)),\n                this.controlSize() / 2\n            );\n            this.controls_layer.addChild(this.rotate_control);\n            this.styleControl(this.rotate_control);\n        }\n\n        if (bounds) {\n            // Match rotation of selection\n            if (this.multi_selection.length == 0) {\n                if (this.selection.rotation) {\n                    this.controls_layer.rotate(\n                        this.selection.rotation,\n                        new this.paper.Point(bounds.center)\n                    );\n                }\n            } else {\n                if (this.selection.rotation) {\n                    this.controls_layer.rotate(\n                        this.selection.rotation - this.multi_selection_rotation,\n                        new this.paper.Point(bounds.center)\n                    )\n                }\n            }\n        }\n\n        let active_handle = this.activeHandle();\n        if (active_handle) {\n            this.setCursorState(active_handle, CursorHandleState.ACTIVE);\n\n            if (this.dragging_rotate_control && this.rotation_snap_points.indexOf(this.selection.rotation) != -1) {\n                this.rotate_control.strokeColor = new this.paper.Color(this.radius_snap_stroke);\n                this.rotate_control.fillColor = new this.paper.Color(this.radius_snap_fill);\n            }\n        }\n\n        for (const p of this.debug_points) {\n            let v = new this.paper.Path.Circle(\n                new this.paper.Point(p), 10 / 2\n            );\n            v.fillColor = new this.paper.Color('purple');\n            this.controls_layer.addChild(v);\n        }\n    }\n\n    removeControls(): void {\n        this.scale_controls.length = 0;\n\n        if (this.rotate_control) {\n            this.rotate_control.remove();\n            this.rotate_control = null;\n        }\n\n        if (this.controls_layer) {\n            this.controls_layer.removeChildren();\n        }\n    }\n\n    select(selection: IElement<any>, event?): void {\n        let multiSelect: boolean = false;\n        if (event) {\n            event.preventDefault();\n            if (event.event && event.event.shiftKey || event.shiftKey)\n                multiSelect = true;\n        }\n\n        if (selection && selection.locked) {\n            this.trigger('select:background');\n            return;\n        }\n\n        let _selection = this.selection;\n\n        window['selected'] = selection;\n\n        if (!multiSelect && this.selection) {\n            this.selection.onUnselect();\n            this.selection.trigger('unselect');\n\n            for (const multi of this.multi_selection) {\n                multi.onUnselect();\n                multi.trigger('unselect');\n            }\n            this.multi_selection = [];\n        }\n\n        if (!selection) {\n            if (this.selection) {\n                this.selection.unbindWithContext('updatePaper', this);\n            }\n\n            this.selection = null;\n            this.removeControls();\n        }\n        else if (this.selection !== selection && this.multi_selection.indexOf(selection) == -1) {\n            if (!multiSelect) {\n                this.selection = selection;\n            }\n            else if (this.multi_selection.indexOf(selection) == -1) {\n                this.multi_selection.push(selection);\n                this.trigger('multi-selection');\n                this.updateMultiSelection();\n            }\n\n            selection.onSelect();\n            selection.trigger('select');\n        }\n        else if (multiSelect && this.multi_selection.indexOf(selection) != -1) {\n            this.multi_selection.splice(this.multi_selection.indexOf(selection), 1);\n            this.updateMultiSelection();\n        }\n        else if (multiSelect && this.selection === selection) {\n            this.selection = this.multi_selection.pop();\n            this.updateMultiSelection();\n        }\n        else {\n            this.selection = null;\n            this.removeControls();\n        }\n\n        this.setupPlacementGuides();\n        if (this.selection) {\n            this.drawControls();\n        }\n\n        if (this.selection != _selection) {\n            this.trigger('selection:change', this.selection);\n        }\n    }\n\n    updateMultiSelection() {\n        if (this.selection && this.selection.rotation) {\n            this.multi_selection_rotation = this.selection.rotation;\n        }\n        else {\n            this.multi_selection_rotation = 0;\n        }\n        this.multi_selection_bounds = this.selectionBounds();\n    }\n\n    selectClosest(point: paper.Point, doHitTest: boolean, event?): IElement {\n        const element = this.element_manager.getElementClosestToPoint(point);\n        if (element != null && (!doHitTest || element.hitTest(point))) {\n            this.select(element, event);\n            return element;\n        }\n        return null;\n    }\n\n    scaleControlHitTest(point: paper.Point): paper.Path {\n        for (const cp of this.scale_controls) {\n            if (cp && cp.contains(point)) {\n                return cp;\n            }\n        }\n\n        return null;\n    }\n\n    rotateControlHitTest(point: paper.Point) {\n        if (this.rotate_control?.contains(point)) {\n            return this.rotate_control;\n        }\n        return null;\n    }\n\n    multiSelectionHitTest(point) {\n        if (this.selectionBounds()) {\n            return this.selectionBounds().contains(point);\n        }\n        return false;\n    }\n\n    onMouseDown(event: paper.ToolEvent): void {\n        this.mouse_down_point = event.point;\n\n        this.dragging_selection = false;\n        this.dragging_scale_control_index = null;\n        this.dragging_rotate_control = false;\n        this.active_bounds = this.selectionBounds();\n\n        // Clicking doesn't change the activeElement, so blur() to remove\n        // focus from any elements that would prevent our delete key binding.\n        if (document.activeElement instanceof HTMLElement) {\n            document.activeElement.blur();\n        }\n\n        this.trigger('click', event);\n        let last_selection = this.selection;\n\n        // Are we clicking on a scale control?\n        const scaleControl = this.scaleControlHitTest(event.point);\n\n        if (this.selection && this.selection.showScaleControls() && scaleControl) {\n            this.dragging_scale_control_index = this.scale_controls.indexOf(scaleControl);\n        }\n        else if (this.selection && this.selection.showRotateControl() && this.rotate_control && this.rotate_control.contains(event.point)) {\n            this.dragging_rotate_control = true;\n        }\n        else if (this.selection && !this.selection.locked && (this.selection.hitTest(event.point) || this.multiSelectionHitTest(event.point))) {\n            this.selection.onMouseDown(event);\n            for (const multi of this.multi_selection)\n                multi.onMouseDown(event);\n\n            this.dragging_selection = true;\n        }\n        else {\n            // If we don't have a selection or failed a hit test on our\n            // selection, let's try to figure out what the user is clicking on.\n            if (!(event as any).event.shiftKey)\n                this.select(null, event);\n\n            let element: IElement = this.selectClosest(event.point, true, event);\n\n            // Register click regardless of the element control being enabled or disabled\n            if (element) {\n                element.trigger('click', event);\n            }\n\n            // If we selected something, allow dragging of it right away\n            if (this.selection && this.selection.movable)\n                this.dragging_selection = true;\n        }\n\n        let clicked = new Date();\n        if (clicked.getTime() - this.last_clicked.getTime() < 250) {\n            if (last_selection == this.selection && this.selection != null) {\n                this.trigger('double-click');\n            }\n        }\n\n        if (this.selection) {\n            this.saved_position = this.selection.position();\n            this.saved_snap_points = this.selection.snapPoints();\n        }\n\n        this.last_clicked = clicked;\n        this.updateCursor(event.point);\n        this.setCursorState(this.activeHandle(), CursorHandleState.ACTIVE);\n        this.drawControls();\n        this.drawVisualGuides();\n    }\n\n    onMouseDrag(event: paper.ToolEvent): void {\n        if ((this.selection && this.selection.locked) || this.dragging_disabled) {\n            return;\n        }\n\n        if (this.selection && this.dragging_selection && this.selection.movable) {\n            if (this.multi_selection.length > 0 || this.selection.transformation_elements.length > 1) {\n                this.groupTranslateElement(event);\n            }\n            else {\n                this.translateElement(event);\n            }\n        }\n        else if (this.selection && this.selection.showScaleControls() && this.dragging_scale_control_index != null) {\n            if (this.multi_selection.length > 0 || this.selection.transformation_elements.length > 1) {\n                this.groupScale(event);\n            }\n            else {\n                this.scaleElement(event);\n            }\n        }\n        else if (this.selection && this.selection.showRotateControl() && this.dragging_rotate_control) {\n            if (this.multi_selection.length > 0 || this.selection.transformation_elements.length > 1) {\n                this.groupRotate(event);\n            }\n            else {\n                this.rotateElement(event);\n            }\n        }\n\n        this.trigger('selection:mouse_drag');\n        this.setupPlacementGuides();\n        this.drawControls();\n        this.highlightGuides();\n        this.drawVisualGuides();\n    }\n\n    translateElement(event: paper.ToolEvent) {\n        let movement: Point = event.point.subtract(this.mouse_down_point);\n        movement = this.snappedMovementSet(this.saved_snap_points, movement);\n        this.selection.setPosition(new this.paper.Point(add(this.saved_position, movement)));\n    }\n\n    groupTranslateElement(event: paper.ToolEvent) {\n        // Todo: get this working with snap points\n        let movement = event.point.subtract(event.lastPoint);\n        this.selection.setPosition(movement.add(this.selection.position()));\n        for (const multi of this.multi_selection) {\n            multi.setPosition(movement.add(multi.position()));\n        }\n\n        this.updateMultiSelection();\n    }\n\n    rotateElement(event: paper.ToolEvent) {\n        if (this.selection.rotation == null) {\n            this.selection.rotation = 0;\n        }\n\n        if (!this.active_bounds) {\n            this.active_bounds = this.selectionBounds();\n        }\n\n        let mouse_angle =  Math.atan2(event.point.y - this.active_bounds.center.y, event.point.x - this.active_bounds.center.x) * 180 / Math.PI;\n        let control_angle = Math.atan2(this.rotate_control.bounds.point.y - this.active_bounds.center.y, this.rotate_control.bounds.point.x - this.active_bounds.center.x) * 180 / Math.PI;\n        let rotation = clampRotation(mouse_angle - clampRotation(control_angle - this.selection.rotation));\n\n        rotation = parseFloat(rotation.toFixed(3));\n\n        // Don't do this for multi scaling because all of them are not guaranteed to hit the condition at the same time and may bug out\n        for (const v of this.rotation_snap_points) {\n            if (Math.abs(rotation - v) < 4) {\n                rotation = v;\n            }\n        }\n\n        this.selection.rotation = rotation;\n        this.selection.onChange();\n    }\n\n    scaleElement(event: paper.ToolEvent): void {\n        this.active_bounds = this.selectionBounds();\n\n        // If our model doesn't have width or height, populate them from\n        // element.bounds\n        if (!this.selection.width) {\n            this.selection.width = this.selection.elementBounds.width;\n        }\n\n        if (!this.selection.height) {\n            this.selection.height = this.selection.elementBounds.height;\n        }\n\n        // We need to figure out where the control is in relation to the\n        // center of the element without the rotation. In order to do this, we\n        // need to get the current angle of the control point to the center\n        // and then subtract the element rotation. Once we have the un-rotated\n        // angle of the control, we can calculate a point around the element\n        // base on a circle that's radius is the distance from the control\n        // to the center of the element.\n        let elementRadians = (this.selection.rotation || 0) * Math.PI / 180,\n            rotatedControlAngle =  Math.atan2(\n                this.draggingScaleControl.position.y - this.active_bounds.center.y,\n                this.draggingScaleControl.position.x - this.active_bounds.center.x\n            ),\n            normalControlAngle = rotatedControlAngle - elementRadians,\n\n            // Find the point on a circle where the control is without rotation\n            radius = event.point.getDistance(this.active_bounds.center),\n            realControlWithoutRotationX = this.active_bounds.center.x + radius * Math.cos(normalControlAngle),\n            realControlWithoutRotationY = this.active_bounds.center.y + radius * Math.sin(normalControlAngle),\n            controlPointWithoutRotation = new this.paper.Point(realControlWithoutRotationX, realControlWithoutRotationY),\n\n            // Create a vector that points to the control from the center. This is\n            // used to modify the direction of expansion/shrinking.\n            centerToControlWithoutRotationNormal = controlPointWithoutRotation.subtract(this.active_bounds.center).normalize(),\n            // Build the vector from the normalized point above\n            centerToControlWithoutRotationVector = new this.paper.Point(\n                centerToControlWithoutRotationNormal.x == 0 ? 0 : centerToControlWithoutRotationNormal.x > 0 ? 1 : -1,\n                centerToControlWithoutRotationNormal.y == 0 ? 0 : centerToControlWithoutRotationNormal.y > 0 ? 1 : -1\n            ),\n            sizeChange = new this.paper.Point(0, 0),\n            position = new this.paper.Point(0, 0);\n\n        if (this.selection.model.maintain_proportion) {\n            let movement = rotatePoint(event.point.subtract(event.lastPoint), -normalControlAngle);\n            let lastMouseToCenterDistance = distance(rotatePoint(event.lastPoint, -normalControlAngle), rotatePoint(this.active_bounds.center, -normalControlAngle));\n            let mouseToCenterDistance = distance(rotatePoint(event.point, -normalControlAngle), rotatePoint(this.active_bounds.center, -normalControlAngle));\n            let polarity = lastMouseToCenterDistance > mouseToCenterDistance ? -1 : 1;\n            let mod = 1;\n\n            sizeChange = new this.paper.Point(\n                Math.abs(movement.x),\n                Math.abs(movement.y)\n            );\n\n            // The sizeChange length needs to be the same after this equation,\n            // stash it here so we can calculate the difference afterwards.\n            const sizeChangeLength = sizeChange.length;\n\n            // In order to maintain proportion, we need to adjust the\n            // sizeChange to match the proportions of the shape\n            if (sizeChange.x > sizeChange.y) {\n                mod = this.selection.height / this.selection.width;\n                sizeChange.y = mod * sizeChange.x;\n                //sizeChange.x = maxSizeChange;\n            } else {\n                mod = this.selection.width / this.selection.height;\n                sizeChange.x = mod * sizeChange.y;\n            }\n\n            // Calculate the difference in size change length and multiply\n            // it so that it matches the length before the proportion\n            // adjustment\n            const sizeChangeModifier: number = sizeChangeLength / sizeChange.length;\n            if (sizeChangeModifier)\n                sizeChange = sizeChange.multiply(sizeChangeModifier);\n\n            // Make sure x & y have the correct polarity(they're currently,\n            // absolute values)\n            sizeChange.x *= polarity;\n            sizeChange.y *= polarity;\n\n            position.x = sizeChange.x * .5;\n            position.y = sizeChange.y * .5;\n            position = rotatePoint(\n                position.multiply(new this.paper.Point(\n                    centerToControlWithoutRotationVector.x,\n                    centerToControlWithoutRotationVector.y\n                )),\n                elementRadians\n            );\n        } else {\n            // Negate the rotation in the size point so we can apply it\n            // to model.width & model.height\n            sizeChange = new this.paper.Point(rotatePoint(\n                event.point.subtract(event.lastPoint),\n                -elementRadians\n            ));\n\n            // Make sure we have the proper direction\n            sizeChange = sizeChange.multiply(new this.paper.Point(\n                centerToControlWithoutRotationVector.x,\n                centerToControlWithoutRotationVector.y\n            ));\n\n            // Since the position is from the center, we only need to adjust\n            // the x and/or y position by 50%\n            position = event.point.subtract(event.lastPoint).multiply(.5);\n        }\n\n        // Prevent the user from making the area less than 25 px sq, they wont be able to select it again sense there is no zoom\n        if (this.active_bounds.area < 25 && (sizeChange.x < 0 || sizeChange.y < 0)) {\n            return;\n        }\n\n        let height, width;\n        try {\n            height = this.canvas_service.workspace.artboard.height;\n        }\n        catch (e) {\n            height = 700;\n        }\n        try {\n            width = this.canvas_service.workspace.artboard.width;\n        }\n        catch (e) {\n            width = 700;\n        }\n\n        const maxSize = Math.sqrt((height * height) + (width * width));\n\n        this.selection.applyScaling(sizeChange, position, maxSize);\n        this.selection.onChange();\n    }\n\n    groupRotate(event: paper.ToolEvent) {\n        let mouseAngle =  Math.atan2(\n                event.point.y - this.multi_selection_bounds.center.y,\n                event.point.x - this.multi_selection_bounds.center.x\n            ) * 180 / Math.PI,\n            controlAngle = Math.atan2(\n                this.rotate_control.bounds.point.y - this.multi_selection_bounds.center.y,\n                this.rotate_control.bounds.point.x - this.multi_selection_bounds.center.x\n            ) * 180 / Math.PI,\n            rotation = clampRotation(mouseAngle - clampRotation(controlAngle));\n\n        rotation = parseFloat(rotation.toFixed(3));\n\n        for (const element of this.multi_selection.concat([this.selection])) {\n            element.rotate(rotation, this.multi_selection_bounds.center);\n            element.onChange();\n        }\n    }\n\n    groupScale(event: paper.ToolEvent) {\n        let movement = event.point.subtract(event.lastPoint);\n\n        let expanded_items = [];\n        for (const element of this.multi_selection.concat([this.selection])) {\n            for (const item of element.transformation_elements) {\n                expanded_items.push(item);\n            }\n        }\n        this.applyGroupScale(movement, expanded_items, this.multi_selection.concat([this.selection]));\n    }\n\n    applyGroupScale(movement, elements, base_elements) {\n        // First generate a layer with every element size/position in it. We can't use the element bounds because that\n        let bounds_set = [];\n        let layer = new this.paper.Layer();\n\n        for (const element of elements) {\n            let rt = new this.paper.Path.Rectangle(new this.paper.Rectangle(element.x, element.y, element.width, element.height));\n            rt.rotate(element.rotation);\n            bounds_set.push(rt)\n        }\n\n        layer.addChildren(bounds_set);\n\n        // See if the user is moving in the opposite direction. We will use this to change the sign of the drag vector.\n        let angle = clampRotation(Math.atan2(movement.y, movement.x) * (180 / Math.PI));\n        let sign = 1;\n        if (this.dragging_scale_control_index == 3 && (angle < 315 && angle > 135)) {\n            sign = -1;\n        }\n        if (this.dragging_scale_control_index == 0 && !(angle < 315 && angle > 135)) {\n            sign = -1\n        }\n        if (this.dragging_scale_control_index == 2 && !(angle < 225 && angle > 45)) {\n            sign = -1;\n        }\n        if (this.dragging_scale_control_index == 1 && (angle < 225 && angle > 45)) {\n            sign = -1;\n        }\n\n        // Find the corner point opposite from where we are dragging from based on the selection bounds to use for\n        // the scaling center point.\n        let scaling_point = layer.position;\n        let translate_from_size = new this.paper.Point(layer.bounds.width, layer.bounds.height).divide(2);\n        let selection_bounds = this.selectionBounds();\n        if (this.dragging_scale_control_index == 0) {\n            scaling_point = selection_bounds.bottomRight;\n        }\n        if (this.dragging_scale_control_index == 1) {\n            scaling_point = selection_bounds.bottomLeft;\n        }\n        if (this.dragging_scale_control_index == 2) {\n            scaling_point = selection_bounds.topRight;\n        }\n        if (this.dragging_scale_control_index == 3) {\n            scaling_point = selection_bounds.topLeft;\n        }\n\n        // Universal scaling\n        let height_percent = Math.abs(layer.bounds.height / layer.bounds.width);\n\n        // Dont allow it to invert\n        if (layer.bounds.width + movement.length * sign < 0 || layer.bounds.height + movement.length * height_percent * sign < 0) {\n            return\n        }\n\n        let pre_scaled_area = layer.bounds.area;\n\n        let width_change = ((movement.length * sign / 2) + layer.bounds.width) / layer.bounds.width;\n        let height_change = ((movement.length * height_percent * sign / 2) + layer.bounds.height) / layer.bounds.height;\n\n        layer.scale(width_change, height_change, scaling_point);\n\n        // Dont allow things to be too small\n        if (layer.bounds.area < 60 && layer.bounds.area < pre_scaled_area) {\n            return;\n        }\n\n        for (let i = 0; i < bounds_set.length; i++) {\n            let element = elements[i];\n            let rectangle = bounds_set[i];\n\n            rectangle.rotate(-element.rotation);\n            element.x = rectangle.bounds.x;\n            element.y = rectangle.bounds.y;\n            element.width = rectangle.bounds.width;\n            element.height = rectangle.bounds.height;\n        }\n\n        for (const element of base_elements) {\n            element.onChange();\n        }\n\n        layer.remove();\n\n        this.updateMultiSelection();\n    }\n\n    onMouseUp(event: paper.ToolEvent): void {\n        this.dragging_selection = false;\n        this.active_bounds = null;\n\n        this.updateMultiSelection();\n        this.clearVisualGuides();\n\n        if (this.selection && this.selection.locked)\n            return;\n\n        if (this.selection)\n            this.selection.onMouseUp(event);\n    }\n\n    onMouseMove(event: any): void {\n        this.trigger('selection:mouse_move', event);\n\n        this.updateCursor(event.point);\n        this.setCursorState(this.cursorHandle(event), CursorHandleState.HOVER);\n\n        if (this.selection && this.selection.locked) {\n            return;\n        }\n    }\n\n    updateCursor(point: paper.Point) {\n        if (this.controls_disabled) {\n            return;\n        }\n\n        let cursor = '';\n\n        if (this.selection) {\n            let controls = this.scaleControlHitTest(point);\n            if (controls && this.scale_controls.indexOf(controls) !== -1) {\n                if (this.scale_controls.indexOf(controls) !== -1) {\n                    let index = this.scale_controls.indexOf(controls);\n                    cursor = index == 0 || index == 3 ? 'nwse-resize'  : 'nesw-resize';\n                }\n            }\n            else if (this.rotate_control?.contains(point)) {\n                cursor = 'pointer';\n            }\n            else if (this.selection.bounds.contains(point)) {\n                cursor = 'move';\n            }\n        }\n        else {\n            if (this.element_manager.simpleHitTest(point)) {\n                cursor = 'pointer';\n            }\n        }\n\n        // Only set the style when it has changed otherwise we will incur a forced style repaint despite the value being the same\n        if (this.canvas_service.canvas.style.cursor != cursor) {\n            this.canvas_service.canvas.style.cursor = cursor;\n        }\n    }\n\n    deactivate() {\n        this.removeControls();\n    }\n\n    removeSelection() {\n        this.select(null);\n    }\n\n    activate(element) {\n        this.select(element);\n        this.drawControls();\n    }\n\n    selectedElement() {\n        return this.selection;\n    }\n\n    activeHandle(): paper.Path {\n        if (this.dragging_scale_control_index != null) {\n            return this.scale_controls[this.dragging_scale_control_index];\n        }\n        if (this.dragging_rotate_control) {\n            return this.rotate_control;\n        }\n        return null;\n    }\n\n    cursorHandle(event: paper.ToolEvent) {\n        let scale = this.scaleControlHitTest(event.point);\n        if (scale) {\n            return scale;\n        }\n\n        return this.rotateControlHitTest(event.point);\n    }\n\n    setupPlacementGuides() {\n        this.placement_guides = [];\n        this.active_placement_guides = [];\n\n        if (!this.selection || this.placement_guides_disabled) {\n            return;\n        }\n\n        // Global center\n        let center = this.canvas_service.workspace.artboard.center;\n\n        let cx = add(center, {x: 1, y: 0});\n        let cy = add(center, {x: 0, y: 1});\n\n        this.pushPlacementGuide(center, cx);\n        this.pushPlacementGuide(center, cy);\n\n        // The placement guides can get crazy when there are too many of them\n        // So lets try and throw out irrelevant results by only looking the 3 closest elements\n        let distances = [];\n        let snap_points = this.selection.snapPoints();\n        for (const element of this.element_manager.elements) {\n            if (element == this.selection) {\n                continue;\n            }\n            if (!element.hasGuides()) {\n                continue;\n            }\n\n            let min_distance = Number.MAX_VALUE;\n            let guides = element.placementGuides(false);\n            for (const snap of snap_points) {\n                for (const line of guides) {\n                    min_distance = Math.min(min_distance, distanceFromLineSegment(line[0], line[1], snap));\n                }\n            }\n\n            distances.push({\n                element: element,\n                distance: min_distance\n            })\n        }\n        let closest = distances.sort((a, b) => {\n            if (a.distance == b.distance) {\n                return 0;\n            }\n            return a.distance < b.distance ? -1 : 1\n        }).slice(0, 3).map(v => v.element);\n\n        // Shape lines\n        for (const element of closest) {\n            for (const line of element.placementGuides(false)) {\n                this.pushPlacementGuide(line[0], line[1]);\n            }\n        }\n    }\n\n    drawVisualGuides() {\n        this.clearVisualGuides();\n\n        if (!this.selection) {\n            return;\n        }\n\n        if (!this.placement_guides_disabled) {\n            // Show all - debug mode\n            if (this.show_all_visual_guides) {\n                for (const guide of this.placement_guides) {\n                    this.addLine(guide[0], guide[1], '#82ffee');\n                }\n            }\n\n            for (const guide of this.active_placement_guides) {\n                this.addLine(guide[0], guide[1], this.placement_guide_stroke);\n            }\n        }\n    }\n\n    highlightGuides(): void {\n        if (!this.selection) {\n            return;\n        }\n\n        let points = this.selection.snapPoints();\n        this.active_placement_guides = [];\n\n        for (const point of points) {\n            for (const line of this.placement_guides) {\n                if (Math.abs(distance(point, closestPointOnLine(line[0], line[1], point))) < this.snapTolerance() / 2) {\n                    this.active_placement_guides.push(line);\n                }\n            }\n        }\n    }\n}\n","import {Http} from '../../../core/services/Http';\nimport CustomEditorService from './CustomEditorService';\nimport {Services} from '../../../core/services/Services';\nimport PaperCanvasService from './PaperCanvasService';\nimport {SimplePromise} from '../../../core/utils/SimplePromise';\nimport {EventDispatcher} from '../../../core/utils/EventDispatcher';\n\nexport class AutosaveService extends EventDispatcher {\n    public last_updated: Date;\n    public save_name: string;\n    public save_failed: boolean;\n    public id: number;\n\n    private is_setup: boolean;\n    private customService: CustomEditorService;\n    private interval: number;\n    private last_data: string;\n\n    static $inject = [\n        '$http'\n    ];\n\n    protected constructor(protected $http: Http) {\n        super();\n        this.is_setup = false;\n        this.interval = 1000*60;\n\n        window['autosave'] = this;\n    }\n\n    setup(customService) {\n        if (this.is_setup) {\n            return;\n        }\n\n        this.is_setup = true;\n        this.customService = customService;\n\n        // Start the save check that runs every ~5 seconds using timeouts\n        this.autosave();\n    }\n\n    private autosave() {\n        // Don't let it try to autosave faster than the user can uplaod and the server can process the data\n        this.save().then(() => {\n            setTimeout(() => {\n                this.autosave();\n            }, this.interval)\n        })\n    }\n\n    unsavedData(): boolean {\n        return this.last_data != JSON.stringify(this.customService.configured.getPostData());\n    }\n\n    save(force?) {\n        let deferred = SimplePromise.defer();\n\n        // Make sure things are loaded first\n        if (!this.customService || !this.customService.configured) {\n            setTimeout(() => {\n                deferred.resolve(null);\n            })\n            return deferred.promise;\n        }\n\n        // Its very difficult to check equality with objects however the result from json.stringify does not change\n        // between calls unless the object has changed so we can use this as a basic is modified check.\n        let data = JSON.stringify(this.customService.configured.getPostData());\n        if (!force) {\n            if (data == this.last_data) {\n                setTimeout(() => {\n                    deferred.resolve(null);\n                })\n                return deferred.promise;\n            }\n            if (!this.last_data) {\n                this.last_data = data;\n                setTimeout(() => {\n                    deferred.resolve(null);\n                })\n                return deferred.promise;\n            }\n        }\n\n        this.last_data = data;\n\n        this.$http.request({\n            method: 'POST',\n            url: '/custom/api/autosave/',\n            data: {\n                id: this.id,\n                data: data,\n                name: this.save_name,\n                template: this.customService.base.id,\n                custom: this.customService.configured.id,\n                preview: Services.get<PaperCanvasService>('PaperCanvasService').exportPNG()\n            }\n        }).then((response) => {\n            this.last_updated = new Date(response.data.updated);\n            this.id = response.data.id;\n            this.save_failed = false;\n            this.trigger('save');\n\n            deferred.resolve(null);\n        }, (response) => {\n            this.save_failed = true;\n\n            deferred.resolve(null);\n\n            return response;\n        })\n\n        return deferred.promise;\n    }\n}","import {ElementAbstract} from '../models/abstract/ElementAbstract';\nimport {BaseElement} from './BaseElement';\nimport {Services} from '../../../core/services/Services';\nimport ClipperService from '../services/ClipperService';\nimport {IDeferred, IPromise, SimplePromise} from '../../../core/utils/SimplePromise';\nimport Color from 'colorjs.io';\nimport {yieldThread} from '../../../core/utils/utils';\nimport ColorService from '../services/ColorService';\n\n\nexport class RasterElement extends BaseElement<paper.Raster> {\n    lastRotation: number;\n    area: number;\n    url: string;\n\n    offset_points: any[];\n    source_width: number;\n    source_height: number;\n    offset_position_difference: paper.Point;\n\n    offset_target_resolution = 400;\n    offset_scale;\n    boundary_point_radius = 7;\n    offset_path_clipping;\n    polygon_sides = 14;\n    ignored_offset_alpha_filter = 5;\n    ignored_offset_colors = [];\n    ignored_offset_color_range = 5;\n    raster_loaded: IPromise<void>;\n    raster_loaded_deferred: IDeferred<void>;\n    last_sample_time_delta;\n    original_image_data;\n    image_colors;\n    image_loaded: boolean;\n    image_contains_alpha = null;\n    override disable_offset_path_in_export = true;\n\n    protected _y_scale_inverted = false;\n    protected _x_scale_inverted = false;\n\n    constructor(url: string, element?: ElementAbstract, layer?: paper.Layer) {\n        super(element, layer);\n        this.area = 0;\n        this.url = url;\n\n        this.raster_loaded_deferred = SimplePromise.defer();\n        this.raster_loaded = this.raster_loaded_deferred.promise;\n\n        this.setup(url);\n        this.bindModels();\n    }\n\n    setup(url) {\n        this._x_scale_inverted = false;\n        this._y_scale_inverted = false;\n\n        if (this.item) {\n            this.item.remove();\n        }\n\n        this.item = new this.paper.Raster({\n            source: url,\n            crossOrigin: 'anonymous',\n            position: new this.paper.Point(\n                this.x,\n                this.y\n            )\n        });\n        const raster = this.item;\n        raster.on('error', () => {\n            // A previous image can fail after its source has been replaced.\n            if (this.item === raster && !this._removed) {\n                this.remove();\n            }\n        });\n        // If values in the model are not set, fill them in based on how paperjs loaded them\n        this.item.on('load', () => {\n            this.image_loaded = true;\n            this.fillInValuesFromPaper();\n            this.raster_loaded_deferred.resolve();\n            this.findImageColors();\n        });\n        this.layer.activate();\n        this.layer.addChild(this.item);\n        this.item.on('load', this.updatePaper.bind(this));\n    }\n\n    override set x_scale_inverted(value) {\n        this.model['x_scale_inverted'] = value;\n        this.updatePaper();\n    }\n\n    override get x_scale_inverted() {\n        return this.model['x_scale_inverted']\n    }\n\n    override set y_scale_inverted(value) {\n        this.model['y_scale_inverted'] = value;\n        this.updatePaper();\n    }\n\n    override get y_scale_inverted() {\n        return this.model['y_scale_inverted']\n    }\n\n    bindModels(): void {\n        this.model.bind('change', this.updatePaper.bind(this), this);\n        this.model.bind('change:url', (url) => {\n            this.setup(url);\n        }, this);\n    }\n\n    unbindModels(): void {\n        this.model.unbindWithContext('change', this);\n    }\n\n    updatePaper(): void {\n        // This task needs to be done in a frame task so it won't execute more than once per frame which\n        // happens with drag events. Its very slow and needs to be optimized.\n        const tsk = this.updatePaperOnFrame;\n        if (!this.hasFrameTask(tsk, this)) {\n            this.addFrameTask(tsk, this);\n        }\n    }\n\n    override updatePaperOnFrame(): void {\n        // Actions like inverting applied to the image before its loaded will be ignored so we need to wait\n        if (!this.image_loaded) {\n            return;\n        }\n\n        this.layer.activate();\n        this.clearDebugItems();\n\n        /**\n         * Nothing to update if we don't have a paper.Item\n         * Changes to the model can cause this to be called before the clipart\n         * has been loaded.\n         */\n        if (!this.item)\n            return;\n\n        // Reset rotation\n        if (this.lastRotation) {\n            this.item.rotate(-this.lastRotation);\n\n            if (this.offset) {\n                this.offset.rotate(-this.lastRotation);\n                this.offset_path_clipping.rotate(-this.lastRotation);\n            }\n        }\n\n        let start_size = this.item.bounds.size;\n\n        // Scale\n        if (this.width && this.height) {\n            let scaleXMod = 1,\n                scaleYMod = 1;\n\n            if (this.x_scale_inverted != this._x_scale_inverted) {\n                this._x_scale_inverted = this.x_scale_inverted;\n                scaleXMod = -1;\n            }\n            if (this.y_scale_inverted != this._y_scale_inverted) {\n                this._y_scale_inverted = this.y_scale_inverted;\n                scaleYMod = -1;\n            }\n\n            this.item.bounds.width = this.width * scaleXMod;\n            this.item.bounds.height = this.height * scaleYMod;\n        }\n\n        // Update position\n        // Clipart origin is it's center\n        this.item.position = new this.paper.Point(\n            this.x,\n            this.y\n        );\n\n        if (this.offset) {\n            let width_change = this.item.bounds.width / start_size.width;\n            let height_change = this.item.bounds.height / start_size.height;\n\n            this.offset.scale(width_change, height_change);\n            this.offset_path_clipping.scale(width_change, height_change);\n\n            // The offset between the item position will scale based on the item's scale\n            this.offset_position_difference = this.offset_position_difference.multiply(new this.paper.Point(width_change, height_change));\n\n            this.offset.position = this.item.position.subtract(this.offset_position_difference);\n            this.offset_path_clipping.position = this.item.position.subtract(this.offset_position_difference)\n        }\n\n        // Rotate layer\n        if (this.rotation != null) {\n            this.item.rotate(this.rotation);\n            this.lastRotation = this.rotation;\n\n            if (this.offset) {\n                this.offset.rotate(this.rotation, this.item.position);\n                this.offset_path_clipping.rotate(this.rotation, this.item.position);\n            }\n        }\n\n        this.queueOffsetPath();\n\n        this.trigger('updatePaper', this);\n        this.canvasService.trigger('design-change');\n\n        if (!this.initialized_deferred.promise.isResolved()) {\n            this.initialized_deferred.resolve();\n        }\n    }\n\n    override hideOffsetPath() {\n        super.hideOffsetPath();\n\n        if (this.offset_path_clipping) {\n            this.offset_path_clipping.remove();\n            this.offset_path_clipping = null;\n        }\n    }\n\n    override get elementBounds(): paper.Rectangle {\n        if (this.width && this.height) {\n            return new this.paper.Rectangle(\n                // Center of element, not top left\n                new this.paper.Point(\n                    this.x - this.width / 2,\n                    this.y - this.height / 2\n                ),\n                new this.paper.Size(this.width, this.height)\n            );\n        } else {\n            return this.bounds;\n        }\n    }\n\n    public override cloneItem(): paper.Raster {\n        return new this.paper.Raster({\n            source: this.url,\n            crossOrigin: 'anonymous',\n            position: new this.paper.Point(\n                0,\n                0\n            )\n        });\n    }\n\n    public override preSave() {\n        if (this.item && this.item.data) {\n            this.item.data['replace-in-processed-file'] = true;\n\n            if (this.isUserFileType() && this.model['user_file'] && this.model['user_file'].id) {\n                this.item.data[`user_file_id`] = this.model['user_file'].id;\n            }\n            if (this.isMarketplaceType() && this.model['artwork'] && this.model['artwork'].id) {\n                this.item.data[`artwork_id`] = this.model['artwork'].id;\n            }\n            this.item.data['identifier'] = this.model.getOrCreateIdentifier();\n        }\n    }\n\n    public override isRasterType(): boolean {\n        return !this.model['qrcode'] && !this.model['marketplace'];\n    }\n\n    public override isQRCodeType(): boolean {\n        return !!this.model['qrcode'];\n    }\n\n    public override isMarketplaceType(): boolean {\n        return !!this.model['marketplace'];\n    }\n\n    public isUserFileType(): boolean {\n        return !!this.model['user_file'];\n    }\n\n    resizeImageData(imageData: ImageData, width: number, height: number) {\n        const resize_width = width >> 0; // Force to integer\n        const resize_height = height >> 0;\n\n        let percent_width = resize_width / imageData.width;\n        let percent_height = resize_height / imageData.height;\n\n        // Load the image data into a new canvas element so we can use the drawImage function with a scale value\n        let image_canvas = document.createElement('canvas');\n        image_canvas.width = imageData.width;\n        image_canvas.height = imageData.height;\n        image_canvas.getContext('2d').putImageData(imageData,0,0);\n\n        // Create a second canvas the scales everything down and insert the image into it\n        const canvas = document.createElement('canvas');\n        canvas.width = resize_width;\n        canvas.height = resize_height;\n        let ctx = canvas.getContext('2d');\n        ctx.scale(percent_width, percent_height); // This must be first, all sequential calls will be done at defined scale\n        ctx.drawImage(image_canvas, 0, 0);\n\n        // Grab scaled image data\n        let data = ctx.getImageData(0, 0, resize_width, resize_height);\n\n        // Clean up canvases now that we have the data\n        image_canvas.remove();\n        canvas.remove();\n\n        return data;\n    }\n\n    override async offsetPath() {\n        let start = new Date();\n\n        if (!this.offset_points || this.offset_points.length == 0) {\n            let points = this.findBoundaryPoints();\n\n            if (!points) {\n                return;\n            }\n\n            // Escape vue reactivity using freeze because we are unable to send a proxy object to a web worker\n            Object.freeze(points);\n            this.offset_points = points;\n        }\n\n        // This shouldn't happen but a rounded corner rectangle that fits the shape of the image might be a good idea\n        if (this.offset_points.length == 0) {\n            return;\n        }\n\n        if (this.rotation) {\n            this.item.rotate(-this.rotation);\n        }\n\n        let w_scale = this.item.bounds.width / this.source_width;\n        let h_scale = this.item.bounds.height / this.source_height;\n        let x_offset = this.item.bounds.x;\n        let y_offset = this.item.bounds.y;\n\n        if (this.rotation) {\n            this.item.rotate(this.rotation);\n        }\n\n        return await Services.get<ClipperService>('ClipperService').pointsToPath(this.offset_points, w_scale, h_scale, x_offset, y_offset, this.polygon_sides, this.boundary_point_radius,  Number(this.model.offset_width));\n    }\n\n    override removeOffsetPath() {\n        this.model.offset_width = 0;\n\n        if (this.offset) {\n            this.canvasService.removeOffset(this.offset);\n            this.offset = null;\n        }\n\n        if (this.offset_path_clipping) {\n            this.offset_path_clipping.remove();\n            this.offset_path_clipping = null;\n        }\n\n        this.canvasService.queueFlattenCutpathLayer();\n    }\n\n    override setupOffsetPath(compound_path) {\n        if (this.offset_path_clipping) {\n            this.offset_path_clipping.remove();\n        }\n        if (this.offset) {\n            this.canvasService.removeOffset(this.offset);\n        }\n        if (!this.item) {\n            return;\n        }\n\n        this.offset = compound_path;\n        this.offset.fillColor = new this.paper.Color(this.canvasService.offset_path_color);\n\n        // We need to know the offset compared to the x/y position so we know where to place it when updating\n        this.offset_position_difference = this.item.position.subtract(this.offset.position);\n\n        this.offset_path_clipping = this.offset.clone({deep: true});\n        this.offset_path_clipping.clipMask = true;\n\n        if (this.rotation == undefined) {\n            this.rotation = 0;\n        }\n\n        this.offset.rotate(this.rotation, this.item.position);\n        this.offset_path_clipping.rotate(this.rotation, this.item.position);\n\n        this.layer.addChild(this.offset_path_clipping);\n        this.item.bringToFront();\n    }\n\n    resetBoundaryPoints() {\n        this.offset_points = [];\n        if (this.offset) {\n            this.canvasService.removeOffset(this.offset);\n            this.offset = null;\n        }\n\n        setTimeout(() => {\n            this.queueOffsetPath();\n        });\n    }\n\n    resetImageData() {\n        if (this.original_image_data) {\n            let image_data = (this.item as any).getImageData()\n            let w = image_data.width;\n            let h = image_data.height;\n\n            let ctx = (this.item as any).getContext(true);\n            ctx.putImageData(new ImageData(this.original_image_data, w, h), 0, 0);\n        }\n    }\n\n    replaceColors() {\n        this.resetImageData();\n\n        // Save a backup so we can restore\n        if (!this.original_image_data) {\n            this.original_image_data = new Uint8ClampedArray((this.item as any).getImageData().data);\n        }\n\n        let image_data = (this.item as any).getImageData()\n        let original_data = this.original_image_data;\n        let w = image_data.width;\n        let h = image_data.height;\n\n        // Storing all variables on the stack allows for either JIT optimizations in the javascript engine or less prototype checks.\n        // Either way this small change brought down the computation time on a sample image down from 7-8 seconds to 1-2\n        const stored_ignored_offset_color_range = this.ignored_offset_color_range;\n        const stored_ignored_offset_colors = [...this.ignored_offset_colors];\n        const stored_ignored_offset_alpha_filter = this.ignored_offset_alpha_filter;\n\n        // Advanced check to see if the pixel is transparent of within a set of ignored colors\n        let valid_pixel_with_colors = (x, y): boolean => {\n            if (x < 0 || x >= w || y < 0 || y >= h) {\n                return false;\n            }\n\n            let p = (x + (y * w)) * 4;\n            let r = original_data[p];\n            let g = original_data[p + 1];\n            let b = original_data[p + 2];\n            let a = original_data[p + 3];\n\n            // Alpha out of acceptable range\n            if (a <= stored_ignored_offset_alpha_filter) {\n                return false;\n            }\n\n            // Check to see if the pixel is within the range of a ignored color\n            for (const color of stored_ignored_offset_colors) {\n                if ((r < color[0] + stored_ignored_offset_color_range && r > color[0] - stored_ignored_offset_color_range) &&\n                    (g < color[1] + stored_ignored_offset_color_range && g > color[1] - stored_ignored_offset_color_range) &&\n                    (b < color[2] + stored_ignored_offset_color_range && b > color[2] - stored_ignored_offset_color_range)) {\n\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        for (let x = 0; x < w; x++) {\n            for (let y = 0; y < h; y++) {\n                if (!valid_pixel_with_colors(x,y)) {\n                    // Set alpha to 0 (fully transparent)\n                    let p = (x + (y * w)) * 4;\n                    image_data.data[p + 3] = 0;\n                }\n            }\n        }\n\n        let ctx = (this.item as any).getContext(true);\n        ctx.putImageData(image_data, 0, 0);\n    }\n\n    pixelBounds() {\n        // Calculates the bounds based on the non transparent pixels. Used for finding the size of the graphic.\n\n        let image_data = (this.item as any).getImageData()\n\n        let w = image_data.width;\n        let h = image_data.height;\n\n        let width_min = w;\n        let width_max = 0;\n        let height_min = h;\n        let height_max = 0;\n\n        for (let x = 0; x < w; x++) {\n            for (let y = 0; y < h; y++) {\n                let p = (x + (y * w)) * 4;\n                if (image_data.data[p + 3] != 0) {\n                    if (width_min > x) {\n                        width_min = x;\n                    }\n                    if (width_max < x) {\n                        width_max = x;\n                    }\n                    if (height_min > y) {\n                        height_min = y;\n                    }\n                    if (height_max < y) {\n                        height_max = y;\n                    }\n                }\n            }\n        }\n\n        let pixel_ratio_width = this.item.bounds.width / w;\n        let pixel_ratio_height = this.item.bounds.height / h;\n        \n        let transformed_x = (width_min * pixel_ratio_width) + this.item.bounds.x;\n        let transformed_y = (height_min * pixel_ratio_height) + this.item.bounds.y;\n        let transformed_w = (width_max * pixel_ratio_width) + this.item.bounds.x;\n        let transformed_h = (height_max * pixel_ratio_height) + this.item.bounds.y;\n        \n        return new this.paper.Rectangle(transformed_x, transformed_y, transformed_w, transformed_h);\n    }\n\n    findBoundaryPoints() {\n        // Until OffscreenCanvas becomes a standard we need to do this on the main thread\n        // https://caniuse.com/offscreencanvas\n\n        let start = new Date();\n\n        // Not loaded yet\n        if (!this.item || !this.item.size || this.item.size.isZero() || this.item.size.isNaN()) {\n            return;\n        }\n\n        let offset_points = [];\n\n        let max_size = Math.max(this.item.size.width, this.item.size.height);\n        let target_scale = this.offset_target_resolution / max_size;\n\n        let image_data = this.resizeImageData(\n            (this.item as any).getImageData(),\n            this.item.size.width * target_scale,\n            this.item.size.height * target_scale\n        );\n\n        // Makes the following code less messy\n        let w = image_data.width;\n        let h = image_data.height;\n        let data = image_data.data;\n\n        let contains_alpha = () => {\n            // Scan every other pixel, this needs to be a fast check\n            for (let x = 0; x < w; x += 2) {\n                for (let y = 0; y < h; y += 2) {\n                    if (x < 0 || x >= w || y < 0 || y >= h) {\n                        continue;\n                    }\n\n                    let p = (x + (y * w)) * 4;\n                    let a = data[p + 3];\n                    if (a <= 5) {\n                        return true;\n                    }\n                }\n            }\n            return false;\n        }\n\n        this.offset_scale = Math.max(w, h) / max_size;\n\n        // Basic check that only checks if the pixel is not transparent or white\n        let full_valid_pixel_basic = (x, y): boolean => {\n            if (x < 0 || x >= w || y < 0 || y >= h) {\n                return false;\n            }\n\n            let p = (x + (y * w)) * 4;\n            let r = data[p];\n            let g = data[p + 1];\n            let b = data[p + 2];\n            let a = data[p + 3];\n\n            return a > 5 && (r < 250 || g < 250 || b < 250);\n        }\n\n        // An optimized version that only checks the alpha channel so we can accept transparent images with white elements\n        let alpha_valid_pixel_basic = (x, y): boolean => {\n            if (x < 0 || x >= w || y < 0 || y >= h) {\n                return false;\n            }\n\n            let p = (x + (y * w)) * 4;\n            let a = data[p + 3];\n\n            return a > 5;\n        }\n\n        if (this.image_contains_alpha == null) {\n            this.image_contains_alpha = contains_alpha();\n        }\n\n        let valid_pixel_basic = this.image_contains_alpha ? alpha_valid_pixel_basic : full_valid_pixel_basic;\n\n        // Storing all variables on the stack allows for either JIT optimizations in the javascript engine or less prototype checks.\n        // Either way this small change brought down the computation time on a sample image down from 7-8 seconds to 1-2\n        const stored_ignored_offset_color_range = this.ignored_offset_color_range;\n        const stored_ignored_offset_colors = [...this.ignored_offset_colors];\n        const stored_ignored_offset_alpha_filter = this.ignored_offset_alpha_filter;\n\n        // Advanced check to see if the pixel is transparent of within a set of ignored colors\n        let valid_pixel_with_colors = (x, y): boolean => {\n            if (x < 0 || x >= w || y < 0 || y >= h) {\n                return false;\n            }\n\n            let p = (x + (y * w)) * 4;\n            let r = data[p];\n            let g = data[p + 1];\n            let b = data[p + 2];\n            let a = data[p + 3];\n\n            // Alpha out of acceptable range\n            if (a <= stored_ignored_offset_alpha_filter) {\n                return false;\n            }\n\n            // Check to see if the pixel is within the range of a ignored color\n            for (const color of stored_ignored_offset_colors) {\n                if ((r < color[0] + stored_ignored_offset_color_range && r > color[0] - stored_ignored_offset_color_range) &&\n                    (g < color[1] + stored_ignored_offset_color_range && g > color[1] - stored_ignored_offset_color_range) &&\n                    (b < color[2] + stored_ignored_offset_color_range && b > color[2] - stored_ignored_offset_color_range)) {\n\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        // Select the function we want to use beforehand to reduce the number of operations needed in the loop\n        let valid_pixel_check = this.ignored_offset_colors.length > 0 ? valid_pixel_with_colors : valid_pixel_basic;\n\n        // If the pixel is a boundary point on in the image (ex: edge of the design)\n        let is_boundary = (x, y, range): boolean => {\n            if (!valid_pixel_check(x,y)) {\n                return false\n            }\n\n            for (let xi = x-range; xi < x+range; xi++) {\n                for (let yi = y-range; yi < y+range; yi++) {\n                    if (!valid_pixel_check(xi, yi)) {\n                        return true;\n                    }\n                }\n            }\n\n            return false;\n        }\n\n        let scan_boundary_range = 2;\n        this.source_width = w;\n        this.source_height = h;\n\n        for (let x = 0; x < w; x++) {\n            for (let y = 0; y < h; y++) {\n                if (is_boundary(x,y, scan_boundary_range)) {\n                    offset_points.push([x, y]);\n                }\n            }\n        }\n\n        // Start at a lower resolution and scale up if the cpu is able to keep up in a reasonable time and there\n        // are too few points, 5k seems to generate good looking paths in about 2 seconds\n        let time_delta = new Date().getTime() - start.getTime();\n        this.last_sample_time_delta = time_delta;\n        if (this.offset_target_resolution < max_size && offset_points.length < 5000 && time_delta < 100) {\n            offset_points = null;\n            data = null;\n            image_data = null;\n\n            this.offset_target_resolution *= 1.2;\n            return this.findBoundaryPoints();\n        }\n\n        return offset_points;\n    }\n\n    async findImageColors() {\n        await SimplePromise.all([this.raster_loaded, Services.get<ColorService>('ColorService').color_api_import]);\n\n        if (this.image_colors) {\n            return;\n        }\n\n        if (this.item) {\n            this.image_colors = [];\n\n            const image_data = (this.item as any).getImageData();\n            const w = image_data.width;\n            const h = image_data.height;\n            const ColorAPI: typeof Color = Services.get<ColorService>('ColorService').Color;\n\n            // Only scan 100x100 pixels instead of a native resolution for performance\n            const x_scale = Math.max(w / 100, 1);\n            const y_scale = Math.max(h / 100, 1);\n\n            const colors = [];\n\n            for (let xi = 0; xi < Math.floor(w / x_scale); xi++) {\n                for (let yi = 0; yi < Math.floor(h / y_scale); yi++) {\n                    let x = Math.floor(xi * x_scale);\n                    let y = Math.floor(yi * y_scale);\n\n                    let p = (x + (y * w)) * 4;\n\n                    let r = image_data.data[p];\n                    let g = image_data.data[p + 1];\n                    let b = image_data.data[p + 2];\n                    let a = image_data.data[p + 3];\n\n                    if (a > 100) {\n                        colors.push(new ColorAPI('srgb', [r/255, g/255, b/255]).to('oklch'))\n                    }\n                }\n            }\n\n            const bucket_colors = (colors: Color[], to_key): [Color[]] => {\n                const color_cache = {}\n                for (const color of colors) {\n                    // Split the colors up into buckets based on the hue and lightness\n                    let key = to_key(color);\n\n                    if (!color_cache[key]) {\n                        color_cache[key] = []\n                    }\n                    color_cache[key].push(color);\n                }\n\n                // Sort the keys to find the most common x buckets\n                let ordered_keys = Object.keys(color_cache).sort((a, b) => {\n                    if (color_cache[a].length > color_cache[b].length) {\n                        return -1;\n                    }\n                    if (color_cache[a].length < color_cache[b].length) {\n                        return 1;\n                    }\n                    return 0;\n                });\n\n                return ordered_keys.slice(0, 6).map(v => color_cache[v]) as [Color[]];\n            }\n\n            // First group by the primary hue (red, orange, yellow, ect) and if it's a dark or light color\n            // 15 groups of hue + 2 groups of lightness.\n            let key_by_lh= color => `${Math.floor(color.h / 360 * 15)}}}-${Math.floor(color.l * 2)}`;\n            let buckets = bucket_colors(colors, key_by_lh);\n\n            await yieldThread();\n            for (const bucket of buckets) {\n                // Skip buckets that are too small\n                let percent_of_image = bucket.length / colors.length;\n                if (percent_of_image < 0.05 && this.image_colors.length >= 3) {\n                    continue;\n                }\n\n                // Next find the most common group of colors within the bucket\n                // 90 => 6 groups of hue + 8 groups of chroma + 16 => 8 groups of lightness\n                let key_by_c = color => `${Math.floor(color.h / 360 * 90)}}-${Math.floor(color.c * 2.5 * 8)}-${Math.floor(color.l * 16)}}`;\n                let limited = bucket_colors(bucket, key_by_c)[0];\n\n                let average = [0, 0, 0];\n                for (let color of limited) {\n                    average[0] += color.l;\n                    average[1] += color.c;\n                    average[2] += color.h;\n                }\n                average[0] /= limited.length;\n                average[1] /= limited.length;\n                average[2] /= limited.length;\n\n                let color = new ColorAPI('oklch', average as any);\n\n                // If we have a color that is close to an existing one then skip it\n                if (this.image_colors.find(v => color.deltaE76(v) < 7)) {\n                    continue;\n                }\n\n                this.image_colors.push(color.to('srgb').toString({format: 'hex'}));\n            }\n        }\n    }\n\n    override designColors() {\n        return this.image_colors || [];\n    }\n}\n","import * as paper from 'paper';\nimport {BaseElement} from './BaseElement';\nimport {ClipartElement} from './ClipartElement';\nimport {CustomClipMask} from '../models/CustomClipMask';\nimport {IElement} from './IElement';\nimport {Services} from '../../../core/services/Services';\nimport ClipperService from '../services/ClipperService';\n\nexport class ClipMaskElement extends BaseElement {\n    _mask: ClipartElement;\n    _element: IElement;\n    clipViewArea: any;\n    backgroundOverlay: any;\n    _edit_state: boolean = true;\n\n    internal_model : any;\n    internal_layer: paper.Layer;\n    compound_path: any;\n\n    constructor(element: any, mask: ClipartElement, model: CustomClipMask, layer?: paper.Layer) {\n        super(element, layer);\n        this.internal_model = model;\n\n        this.element = element;\n        this.mask = mask;\n\n        this.element.model.bind('change:offset_width', () => {\n            this.model.offset_width = this.element.model.offset_width;\n            this.queueOffsetPath();\n        }, this);\n\n        this.internal_model.element = this.element.model;\n        this.internal_model.mask = this.mask.model;\n\n        this.bindModels();\n        this.updateMask();\n\n        this.element.once('updatePaper', () => {\n            if (!this._removed) {\n                this.updatePaper();\n            }\n        }, this);\n        this.mask.once('updatePaper', () => {\n            if (!this._removed) {\n                this.updatePaper();\n            }\n        }, this);\n    }\n\n    get mask() {\n        return this._mask;\n    }\n    set mask(v) {\n        this._mask = v;\n\n        if (this._mask) {\n            this.internal_model.mask = v.model;\n\n            this._mask.once('updatePaper', () => {\n                if (!this._removed) {\n                    this.updatePaper();\n                }\n            }, this);\n        }\n    }\n\n    get element() {\n        return this._element;\n    }\n    set element(v) {\n        this._element = v;\n\n        if (this._element) {\n            this.internal_model.element = this._element.model;\n        }\n    }\n\n    override setupModel(model) {\n        return;\n    }\n\n    override get model() {\n        if (this.active_item) {\n            return this.active_item.model;\n        }\n\n        // This should only happen if something is being accessed before its setup\n        if (this.element) {\n            return this.element;\n        }\n        if (this.mask) {\n            return this.mask;\n        }\n        return {};\n    }\n\n    override get elevation_layer() {\n        return this.internal_layer;\n    }\n\n    get edit_state() {\n        return this._edit_state;\n    }\n\n    set edit_state(v) {\n        this._edit_state = v;\n        this.updatePaper();\n    }\n\n    override setupPaper(layer) {\n        this.canvasService.rootLayer.activate();\n\n        this.internal_layer = layer || new this.paper.Layer();\n        this.internal_layer.name = 'ClipMaskElement';\n        this.internal_layer.activate();\n\n        this.canvasService.rootLayer.addChild(this.internal_layer);\n\n        this.bind('unselect', () => {\n            this.edit_state = false;\n        }, this);\n    }\n\n    override onFrame(event) {\n        this.element.onFrame(event);\n        this.mask.onFrame(event);\n        super.onFrame(event);\n    }\n\n    override get item() {\n        return this.active_item.item;\n    }\n    override set item(v) {\n        return;\n    }\n\n    override get layer() {\n        return this.active_item.layer;\n    }\n    override set layer(v) {\n        return;\n    }\n\n    override set x_scale_inverted(value) {\n        if (!this.edit_state) {\n            this.mask.x  -= (this.mask.x - this.element.x) * 2;\n            this.mask.x_scale_inverted = !this.mask.x_scale_inverted;\n        }\n\n        this.element.x_scale_inverted = value;\n        this.updatePaper();\n    }\n\n    override get x_scale_inverted() {\n        return this.element.x_scale_inverted;\n    }\n\n    override set y_scale_inverted(value) {\n        if (!this.edit_state) {\n            this.mask.y  -= (this.mask.y - this.element.y) * 2;\n            this.mask.y_scale_inverted = !this.mask.y_scale_inverted;\n        }\n\n        this.element.y_scale_inverted = value;\n        this.updatePaper();\n    }\n\n    override get y_scale_inverted() {\n        return this.element.y_scale_inverted;\n    }\n\n    override get z(): number {\n        if (this.element) {\n            return this.element.z;\n        }\n        return 0;\n    }\n\n    override set z(z: number) {\n        if (this.element) {\n            this.element.z = z;\n        }\n    }\n\n    bindModels(): void {\n        this.model.bind('change', this.updatePaper.bind(this), this);\n        this.element.model.bind('change', this.updateMask.bind(this), this);\n    }\n\n    unbindModels(): void {\n        this.model?.unbindWithContext('change', this);\n        this.element?.model.unbindWithContext('change', this);\n    }\n\n    updatePaper(): void {\n        // This task needs to be done in a frame task so it won't execute more than once per frame which\n        // happens with drag events. Its very slow and needs to be optimized.\n        const tsk = this.updatePaperOnFrame;\n        if (!this.hasFrameTask(tsk, this)) {\n            this.addFrameTask(tsk, this);\n        }\n    }\n\n    override updatePaperOnFrame() {\n        this.mask.updatePaperOnFrame();\n        (this.element as any).updatePaperOnFrame();\n\n        this.updateMask();\n        //this.queueOffsetPath();\n\n        this.trigger('updatePaper', this);\n        this.canvasService.trigger('design-change');\n    }\n\n    override onChange() {\n        this.updateMask();\n    }\n\n    updateMask() {\n        if (!this.mask) {\n            return;\n        }\n\n        this.internal_layer.activate();\n\n        this.mask.layer.visible = false;\n\n        if (this.backgroundOverlay) {\n            this.backgroundOverlay.remove();\n        }\n\n        if (this.compound_path) {\n            this.compound_path.remove();\n        }\n\n        this.internal_layer.addChild(this.element.layer);\n        this.internal_layer.addChild(this.mask.layer)\n\n        if (this.edit_state) {\n            const overlay_fill = new this.paper.Path.Rectangle(this.canvasService.workspace.camera.scale(1.1));\n\n            overlay_fill.fillColor = new this.paper.Color('#000');\n\n            const compound_path = new this.paper.CompoundPath(null);\n            compound_path.addChildren(this.mask.buildClippingRegion());\n\n            this.backgroundOverlay = overlay_fill.subtract(compound_path);\n\n            this.backgroundOverlay.opacity = 0.75;\n            this.backgroundOverlay.strokeColor = new this.paper.Color('black');\n            this.backgroundOverlay.blendMode = 'destination-out';\n\n            overlay_fill.remove();\n            compound_path.remove();\n\n            this.internal_layer.addChild(this.backgroundOverlay);\n            this.element.layer.sendToBack();\n        }\n        else {\n            this.compound_path = new this.paper.CompoundPath(null);\n            this.compound_path.addChildren(this.mask.buildClippingRegion());\n            this.compound_path.clipMask = true;\n\n            this.internal_layer.addChild(this.compound_path);\n        }\n\n        this.trigger('updatePaper', this);\n    }\n\n    public override preSave() {\n        // Even so this element is set to not be visible, the svg to png package on the server still renders it\n        if (this.mask) {\n            this.mask.layer.remove();\n        }\n\n        this.element.preSave();\n    }\n\n    changeClipMask(element) {\n        this.internal_layer.activate();\n\n        let _old_mask = this.mask.model;\n\n        // Remove the current mask\n        this.mask.remove();\n\n        // Setup the new mask\n        this.mask = element;\n        this.mask.disable_offset_path = true;\n        this.mask.removeOffsetPath();\n\n        this.internal_layer.addChild(this.mask.layer);\n\n        this.mask.once('updatePaper', () => {\n            this.updateMask();\n        }, this);\n\n        return _old_mask;\n    }\n\n    override clear() {\n        this.internal_layer.removeChildren();\n    }\n\n    override remove(remove_element=true) {\n        this._removed = true;\n\n        this.unbindModels();\n\n        // Clear selection while the children still exist: unselect handlers and\n        // selection-change listeners can access the active item.\n        if (this.canvasService.selection_manager.selectedElement() as any === this) {\n            this.canvasService.selection_manager.removeSelection();\n            this.canvasService.selection_manager.deactivate();\n        }\n\n        // Remove the element from the element manager\n        this.element_manager.remove(this as any);\n\n        // Tastypie won't remove the M2M relationship by removing it from the\n        // *_elements list. We can either delete it here or add a custom\n        // function to the resource that will figure out what to remove, add\n        // and/or keep.\n        if (this.model) {\n            this.model.remove();\n        }\n\n        this.mask.remove();\n        this.mask = null;\n\n        if (remove_element) {\n            this.element.remove();\n        }\n\n        let temp_element = this.element;\n        this.element = null;\n\n        if (!remove_element) {\n            this.element_manager.add(temp_element);\n            temp_element.layer.addChild(temp_element.item);\n            this.canvasService.rootLayer.addChild(temp_element.layer);\n            temp_element.updatePaper();\n        }\n\n        // Clear this layer and then remove it from the project\n        this.clear();\n        this.internal_layer.remove();\n\n        // Unbind events\n        this.unbindEvents();\n\n        this.trigger('remove');\n    }\n\n    override async offsetPath() {\n        let paths = [];\n        for (const path of this.findPaths(this.mask.item)) {\n            path.strokeJoin = 'round';\n            let items = await Services.get<ClipperService>('ClipperService').offset(path as paper.Path, Number(this.model.offset_width));\n            for (const item of items) {\n                path.remove();\n                paths.push(item);\n            }\n        }\n\n        return paths;\n    }\n\n    get active_item() {\n        return this.edit_state ? this.mask : this.element;\n    }\n\n    override get x(): number {\n        return this.active_item.x;\n    }\n\n    override set x(x: number) {\n        if (!this.edit_state) {\n            let dif = x - this.active_item.x;\n            this.mask.x += dif;\n        }\n\n        this.active_item.x = x;\n    }\n\n    override get y(): number {\n        return this.active_item.y;\n    }\n\n    override set y(y: number) {\n        if (!this.edit_state) {\n            let dif = y - this.active_item.y;\n            this.mask.y += dif;\n        }\n\n        this.active_item.y = y;\n    }\n\n    override get width(): number {\n        return this.active_item.width;\n    }\n\n    override set width(width: number) {\n        if (!this.edit_state) {\n            let dif = width / this.active_item.width;\n            this.group_scale(dif, 1);\n        }\n        else {\n            this.active_item.width = width;\n        }\n    }\n\n    override get height(): number {\n        return this.active_item.height;\n    }\n\n    override set height(height: number) {\n        if (!this.edit_state) {\n            let dif = height / this.active_item.height;\n            this.group_scale(1, dif);\n        }\n        else {\n            this.active_item.height = height;\n        }\n    }\n\n    group_scale(width_percent, height_percent) {\n        let mask_bounds = new this.paper.Rectangle(this.mask.x, this.mask.y, this.mask.width, this.mask.height);\n        let element_bounds = new this.paper.Rectangle(this.element.x, this.element.y, this.element.width, this.element.height);\n        let combined_area = mask_bounds.unite(element_bounds);\n\n        let center = combined_area.point.clone();\n        let element_point = element_bounds.point.clone();\n        let mask_point = mask_bounds.point.clone();\n\n        element_point = element_point.subtract(center);\n        mask_point = mask_point.subtract(center);\n\n        element_point = element_point.multiply(height_percent)\n        mask_point = mask_point.multiply(width_percent);\n\n        element_point = element_point.add(center);\n        mask_point = mask_point.add(center);\n\n        this.element.x = element_point.x;\n        this.element.y = element_point.y;\n        this.element.width = this.element.width * width_percent;\n        this.element.height = this.element.height * height_percent;\n\n        this.mask.x = mask_point.x;\n        this.mask.y = mask_point.y;\n        this.mask.width = this.mask.width * width_percent\n        this.mask.height = this.mask.height * height_percent;\n\n        this.updatePaper();\n    }\n\n    override rotate(deg, position) {\n        this.mask.rotate(deg, position);\n\n        if (!this.edit_state) {\n            this.element.rotate(deg, position);\n        }\n    }\n\n    override get rotation(): number {\n        return this.active_item.rotation;\n    }\n\n    override set rotation(rotation: number) {\n        this.active_item.rotation = rotation;\n    }\n\n    override get elementBounds(): paper.Rectangle {\n        return this.active_item.elementBounds;\n    }\n\n    override get bounds() {\n        return this.active_item.bounds;\n    }\n\n    public override isTextType() {\n        if (!this.edit_state) {\n            return this.element.isTextType();\n        }\n        return false;\n    }\n\n    public override isClipartType() {\n        if (!this.edit_state) {\n            return this.element.isClipartType();\n        }\n        return false;\n    }\n\n    public override isRasterType() {\n        if (!this.edit_state) {\n            return this.element.isRasterType();\n        }\n        return false;\n    }\n\n    public override isQRCodeType() {\n        if (!this.edit_state) {\n            return this.element.isQRCodeType();\n        }\n        return false\n    }\n\n    public override isShapeType() {\n        if (!this.edit_state) {\n            return this.element.isShapeType();\n        }\n        return false;\n    }\n\n    public override isMarketplaceType() {\n        if (!this.edit_state) {\n            return this.element.isMarketplaceType();\n        }\n        return false;\n    }\n\n    public override isCropType() {\n        return this.edit_state;\n    }\n\n    override get transformation_elements() {\n        if (this.edit_state) {\n            return [this.mask];\n        }\n        return [this.mask, this.element];\n    }\n\n    override get cropped() {\n        return true;\n    }\n}\n","import * as paper from 'paper';\nimport {SymbolType, TextAlignment} from '../models/enums';\nimport {BaseElement} from './BaseElement';\nimport {IText} from '../models/IText';\nimport {Font} from '../models/Font';\nimport {Services} from '../../../core/services/Services';\nimport {ElementManager} from '../services/ElementManager';\nimport {FontService} from '../services/FontService';\nimport {IDeferred, IPromise, SimplePromise} from '../../../core/utils/SimplePromise';\nimport {CustomText} from '../models/CustomText';\nimport {TemplateText} from '../models/TemplateText';\n\nexport interface ITextLineStyle {\n    fontSize: number;\n    textAlignment: TextAlignment;\n    fillColor: paper.Color;\n    strokeWidth: number;\n    strokeColor: paper.Color;\n}\n\nexport class TextLine {\n    layer: paper.Layer;\n    path_layer: paper.Layer;\n    compound: paper.PathItem;\n    glyphs: paper.CompoundPath[];\n    style: ITextLineStyle;\n    path: paper.CompoundPath;\n    text: string;\n    debugItems: paper.Item[];\n    kerning: number[];\n    overflowed_line: boolean;\n    paper;\n\n    constructor(paper, layer: paper.Layer, path_layer: paper.Layer, text: string, x: number, y: number, font, style) {\n        this.paper = paper;\n        this.layer = layer;\n        this.style = style;\n        this.text = text || ' ';\n        this.debugItems = [];\n        this.kerning = [];\n        this.path_layer = path_layer;\n        this.overflowed_line = false;\n\n        const glyphs: paper.CompoundPath[] = [];\n        const paths = font.getPaths(text, x, y, this.style.fontSize || 22);\n\n        // Loop vars for various calculations\n        let lastGlyphBounds: paper.Rectangle = new this.paper.Rectangle(\n            new this.paper.Point(0, 0),\n            new this.paper.Size(0, 0)\n        );\n        for (const p of paths) {\n            const path = new this.paper.CompoundPath(p.toPathData());\n            // Skip empty paths\n            if (path.bounds.area === 0) {\n                path.remove();\n                continue;\n            }\n\n            path.remove();\n            glyphs.push(path);\n\n            this.kerning.push(path.position.x - lastGlyphBounds.x - lastGlyphBounds.width);\n            lastGlyphBounds = path.bounds;\n        }\n        this.glyphs = glyphs;\n    }\n\n    usePath(path, offset?): void {\n        // for each glyph find center xOffset\n        let xStart: number = 0;\n        const heightOffset: number = this.bounds.height;\n\n        if (this.style.textAlignment) {\n            if (this.style.textAlignment === TextAlignment.CENTER)\n                xStart = path.length / 2 - this.bounds.width / 2;\n            else if (this.style.textAlignment === TextAlignment.RIGHT)\n                xStart = path.length - this.bounds.width;\n        }\n\n        // set point for each glyph and rotate glyph around the point\n        let lastVector: paper.Point = new this.paper.Point(0, 0);\n        let currentVector: paper.Point = new this.paper.Point(0, 0);\n        let lastPathPoint: paper.Point = new this.paper.Point(0, 0);\n\n        // Add path to layer with stroke\n        //this.debugItems.push(path);\n        //path.strokeColor = '#ff0000';\n        //path.strokeWidth = 5;\n        //this.path_layer.addChild(path);\n\n        // Calculate kerning\n        let kerningAdjustment: number = 0;\n        const pathKerning: number[] = [];\n        for (let i: number = 0; i < this.glyphs.length; i++) {\n            const centerOffset: number = xStart + this.glyphs[i].position.x - kerningAdjustment;\n            const pathPoint: paper.Point = path.getPointAt(centerOffset);\n            if (pathPoint === null) {\n                this.overflowed_line = true;\n                this.glyphs[i].remove();\n                pathKerning.push(null);\n                continue;\n            }\n\n            const tan: paper.Point = path.getTangentAt(centerOffset);\n\n            // Vector from bottom of glyph to the top of the glyph after rotation is applied\n            // Take angle of text on path - 90 degrees and convert to radians to get vector of angle\n            currentVector = new this.paper.Point(\n                Math.cos((tan.angle - 90) * Math.PI / 180),\n                Math.sin((tan.angle - 90) * Math.PI / 180)\n            );\n\n            // Create a kerning multiplier based off of the difference between the spacing\n            // between the top and bottom distance\n            // This makes kerning for text on a path look slightly better\n            if (i > 0) {\n                const boundRect: paper.Path.Rectangle = new this.paper.Path.Rectangle(\n                    new this.paper.Point(this.glyphs[i].position.x, this.glyphs[i].position.y),\n                    new this.paper.Size(this.glyphs[i].bounds.width, this.glyphs[i].bounds.height)\n                );\n\n                /*\n                const dLine = new this.paper.Path.Line(\n                    pathPoint,\n                    pathPoint.add(currentVector.multiply(boundRect.bounds.height))\n                );\n                dLine.strokeColor = '#ff0000';\n                this.debugItems.push(dLine);\n                this.layer.addChild(dLine);\n                */\n\n                const distanceBottom: number = pathPoint.getDistance(lastPathPoint);\n                const distanceTop: number = pathPoint.add(currentVector.multiply(boundRect.bounds.height)).getDistance(lastPathPoint.add(lastVector.multiply(boundRect.bounds.height)));\n                const kerningMultiplier: number = distanceBottom / distanceTop;\n                kerningAdjustment += this.kerning[i] * kerningMultiplier - this.kerning[i];\n            }\n            pathKerning.push(kerningAdjustment);\n            lastPathPoint = pathPoint;\n            lastVector = currentVector;\n        }\n\n        // Adjust the starting point so our kerning fix doesn't make our text look janky\n        // janky = more text on left or right of path\n        if (this.style.textAlignment) {\n            if (this.style.textAlignment === TextAlignment.CENTER)\n                xStart -= kerningAdjustment / 2;\n            else if (this.style.textAlignment === TextAlignment.RIGHT)\n                xStart = path.length - this.bounds.width - kerningAdjustment;\n            else\n                xStart = -kerningAdjustment;\n        }\n        xStart = xStart < 0 ? 0 : xStart;\n\n        // Place glyphs along path\n        for (let i: number = 0; i < this.glyphs.length; i++) {\n            // Remove & skip glyphs that would be off of the path\n            if (path.length < this.glyphs[i].position.x + pathKerning[i]) {\n                this.overflowed_line = true;\n                this.glyphs[i].remove();\n                this.glyphs.splice(i, this.glyphs.length - i + 1);\n                break;\n            }\n            let centerOffset: number = xStart + this.glyphs[i].position.x + pathKerning[i];\n            const yOffset: number = this.glyphs[i].position.y;\n            if (path.length < centerOffset) {\n                if (path.closed) {\n                    centerOffset = centerOffset % path.length;\n                } else {\n                    centerOffset = undefined;\n                }\n            }\n\n            if (centerOffset === undefined) {\n                this.overflowed_line = true;\n                this.glyphs[i].remove();\n                this.glyphs.splice(i, 1);\n                i--;\n            } else {\n                const pathPoint: paper.Point = path.getPointAt(centerOffset);\n                if (pathPoint === null) {\n                    // Failed to calculate point on path\n                    this.overflowed_line = true;\n                    this.glyphs[i].remove();\n                    this.glyphs.splice(i, 1);\n                    i--;\n                    continue;\n                }\n\n                /**\n                 * In order to place the glyph on the path correctly, we need\n                 * to offset the position by the height to push it above the\n                 * path rather than below. yOffset accounts for glyphs with\n                 * tails(y,g, etc.). We don't want to change the original point\n                 * because the rotation will be off.\n                 */\n                const tan: paper.Point = path.getTangentAt(centerOffset);\n\n                this.glyphs[i].position = pathPoint.add(new this.paper.Point(\n                    0,\n                    -heightOffset + yOffset\n                ));\n                this.glyphs[i].rotate(tan.angle, pathPoint);\n            }\n        }\n    }\n\n    /**\n     * Helpful to processing department, but it's a lot slower than drawGlyphs\n     */\n    drawCompoundPath() {\n        if (this.compound) {\n            this.compound.remove();\n            this.compound = null;\n        }\n\n        this.compound = new this.paper.CompoundPath(null);\n        this.compound = this.compound.uniteList(this.glyphs, {insert: false});\n\n        this.layer.addChild(this.compound);\n\n        return this.compound;\n    }\n\n    drawGlyphs() {\n        for (const glyph of this.glyphs) {\n            this.layer.addChild(glyph);\n            this.applyStyle(glyph);\n        }\n    }\n\n    setStyle(style) {\n        this.style = style;\n        if (!this.compound) {\n            for (const glyph of this.glyphs) {\n                this.applyStyle(glyph);\n            }\n        }\n        else {\n            if (this.style.fillColor) {\n                this.compound.fillColor = this.style.fillColor;\n            }\n            if (this.style.strokeWidth && this.style.strokeColor) {\n                this.compound.strokeColor = this.style.strokeColor;\n                this.compound.strokeWidth = this.style.strokeWidth;\n                this.compound.strokeCap = 'round';\n            }\n        }\n    }\n\n    applyStyle(element: paper.Item) {\n        if (this.style) {\n            if (this.style.fillColor) {\n                element.fillColor = this.style.fillColor;\n            }\n            if (this.style.strokeWidth && this.style.strokeColor) {\n                element.strokeColor = this.style.strokeColor;\n                element.strokeWidth = this.style.strokeWidth;\n                element.strokeCap = 'round';\n            }\n        }\n    }\n\n    get bounds(): paper.Rectangle {\n        if (this.compound)\n            return this.compound.bounds;\n\n        let rect = new this.paper.Rectangle(\n            new this.paper.Point(0, 0),\n            new this.paper.Size(0, 0)\n        );\n\n        for (const glyph of this.glyphs) {\n            rect = rect.unite(glyph.bounds);\n        }\n        return rect;\n    }\n\n    get glyphBounds(): paper.Rectangle {\n        if (this.compound)\n            return this.compound.bounds;\n\n        let rect: paper.Rectangle,\n            adjustment: paper.Point,\n            adjustmentWidth: number = null,\n            largestHeight: number = 0,\n            left: number = null,\n            right: number = null,\n            top: number = null,\n            bottom: number = null;\n\n        if (this.glyphs.length === 0)\n            return;\n\n        for (const glyph of this.glyphs) {\n            if (!glyph.isInserted())\n                continue;\n\n            const glyphLeft = glyph.bounds.left;\n            const glyphRight = glyph.bounds.right;\n            const glyphTop = glyph.bounds.top;\n            const glyphBottom = glyph.bounds.bottom;\n\n            // Find the closest Point to the canvas origin(most likely first\n            // character, but fonts can get weird!)\n            if (left == null || left > glyphLeft)\n                left = glyphLeft;\n\n            if (top == null || top > glyphTop)\n                top = glyphTop;\n\n            if (right == null || right < glyphRight)\n                right = glyphRight;\n\n            if (bottom == null || bottom < glyphBottom)\n                bottom = glyphBottom;\n        }\n\n        return new this.paper.Rectangle(\n            new this.paper.Point(left, top),\n            new this.paper.Size(right - left, bottom - top)\n        );\n    }\n\n    get position(): paper.Point {\n        return this.bounds.point;\n    }\n\n    translate(point: paper.Point): void {\n        if (this.compound) {\n            this.compound.translate(point);\n        } else {\n            for (const glyph of this.glyphs) {\n                glyph.translate(point);\n            }\n        }\n    }\n\n    delete(): void {\n        this.layer.remove();\n\n        if (this.compound) {\n            this.compound.remove();\n        }\n    }\n\n    clearDebugItems(): void {\n        if (!this.debugItems) {\n            return;\n        }\n\n        for (const item of this.debugItems) {\n            item?.remove();\n        }\n        this.debugItems = [];\n    }\n}\n\nexport class TextElement extends BaseElement {\n    public static readonly fontMeasurements: any[] = [];\n    lines: TextLine[];\n    path: paper.Path;\n    path_layer: paper.Layer;\n    lastCenter: paper.Point;\n    prefered_line_height: number;\n    auto_scale_value: boolean;\n    font_scale_value: boolean;\n    in_presave_state: boolean;\n\n    private text_line;\n    private isLoaded: boolean;\n    private loadedFontId: any;\n    private resolvedFont: any;\n    protected fontMeasurements;\n    protected rotationPosition: paper.Point;\n    private lastRotation;\n    private pathBoundsDifference: paper.Size;\n    private greatestWidth: number;\n\n    private set_x_scale_inverted;\n    private set_y_scale_inverted;\n\n    public scaled_x: number;\n    public scaled_y: number;\n\n    private applied_texture;\n    private applied_texture_id;\n\n    compound_path = false;\n\n    /**\n     * Save bounds prior to rotation so we can get accurate bounds to give\n     * SelectionManager.drawControls\n     */\n\n    constructor(text: IText, layer?: paper.Layer) {\n        super(text, layer);\n        this.lines = [];\n        this.fontMeasurements = [];\n        this.auto_scale = false;\n        this.font_scale = this.model.maintain_proportion;\n        this.path_layer = new this.paper.Layer();\n        this.layer.addChild(this.path_layer);\n        this.set_x_scale_inverted = false;\n        this.set_y_scale_inverted = false;\n        this.model = text as any;\n\n        this.model.bind('change:text', this.safeClear.bind(this), this);\n        this.model.bind('change:path', this.safeClear.bind(this), this);\n        this.model.bind('change:font', this.safeClear.bind(this), this);\n        this.model.bind('change:size', this.safeClear.bind(this), this);\n        this.model.bind('change:text_alignment', this.safeClear.bind(this), this);\n        this.model.bind('change:symbol', this.safeClear.bind(this), this);\n        this.model.bind('change:symbol_range_start', this.safeClear.bind(this), this);\n        this.model.bind('change:symbol_range_end', this.safeClear.bind(this), this);\n        this.model.bind('change:csv_data', this.safeClear.bind(this), this);\n        this.model.bind('change:path_scale', this.safeClear.bind(this), this);\n\n        this.model.bind('change:path', this.updateToFromPath.bind(this), this);\n        this.model.bind('change', this.updatePaper.bind(this), this);\n        this.model.bind('change:font', this.loadFont.bind(this), this);\n        this.model.bind('change:color', this.safeClear.bind(this), this);\n\n        this.loadFont();\n        this.updatePaper();\n\n        // Texture placement depends on the window size\n        window.addEventListener('resize', this.updateTextColor.bind(this));\n    }\n\n    override get model(): CustomText|TemplateText {\n        return this._model;\n    }\n    override set model(v: CustomText|TemplateText) {\n        this._model = v;\n    }\n\n    get auto_scale() {\n        return this.auto_scale_value;\n    }\n    set auto_scale(v) {\n        this.auto_scale_value = v;\n        this.clear();\n    }\n    get font_scale() {\n        return this.font_scale_value;\n    }\n    set font_scale(v) {\n        this.font_scale_value = v;\n        this.clear();\n    }\n\n    public override cloneItem(): paper.Layer {\n        if (this.lines) {\n            const layer: paper.Layer = new this.paper.Layer();\n            let valid: boolean = false;\n            for (const line of this.lines) {\n                for (const glyph of line.glyphs) {\n                    valid = true;\n                    layer.addChild(glyph.clone());\n                }\n            }\n            if (valid) {\n                layer.rotate(-this.rotation);\n\n                return layer;\n            }\n        }\n    }\n\n    loadFont() {\n        this.isLoaded = false;\n        if (!this.model.font || !this.model.font.id) {\n            this.model.once('change:font', () => {\n                this.loadFont();\n            }, this);\n            return;\n        }\n\n        Services.get<FontService>('FontService').load(this.model.font, this.model.font_version).then(\n            (res: any) => {\n                this.isLoaded = true;\n                this.loadedFontId = res.id;\n                this.resolvedFont = res;\n                this.clear();\n                this.updatePaperOnFrame();\n                this.trigger('loaded:font');\n            },\n            (errorMsg) => {\n                console.info(`Font Load Error (${this.model.font.name}):`, errorMsg);\n                return errorMsg;\n            }\n        );\n    }\n\n    // Building the text lines is very expensive so we only want to compute this once\n    buildTextLines() {\n        if (!this.resolvedFont || !this.model.text_display || this.model.text_display.trim() === '') {\n            if (this.path) {\n                this.path.remove();\n            }\n            if (this.item) {\n                this.item.remove();\n            }\n\n            return;\n        }\n\n        const font = this.resolvedFont.font;\n        const lines: string[] = this.model.text_display ? this.model.text_display.split('\\n') : [];\n        const measurements: any = TextElement.getFontMeasurements(this.paper, new this.paper.Layer(), this.path_layer, font, (this.model.font as Font).id, this.model.size);\n\n        if (measurements === null) {\n            return\n        }\n\n        let i: number = 0;\n        this.greatestWidth = 0;\n\n        this.pathBoundsDifference = null;\n\n        if (this.path) {\n            this.path.remove();\n        }\n        this.path = null;\n\n        if (this.model.path && !this.model.isVariableData()) {\n            this.path = new this.paper.Path(this.model.path.path_data);\n            this.path.data['include-in-processed-file'] = false;\n\n            if (this.model.path_scale === undefined || this.model.path_scale === null) {\n                this.model.path_scale = 1;\n            }\n            let prescale_path_bounds = this.path.bounds.clone();\n            this.path.scale(this.model.path_scale);\n\n            this.pathBoundsDifference = new this.paper.Size(prescale_path_bounds.width - this.path.bounds.width, prescale_path_bounds.height - this.path.bounds.height);\n\n            this.path_layer.addChild(this.path);\n        }\n\n        for (let line of lines) {\n            try {\n                line = line.trim();\n            } catch (e) {\n                console.error('Failed to trim, ', line, e);\n            }\n\n            let l: TextLine = null;\n\n            let buildTextLine = () => {\n                l = new TextLine(this.paper, new this.paper.Layer(), this.path_layer, line, 0, measurements.height, font, {\n                        fillColor: this.model.color_code,\n                        fontSize: this.model.size,\n                        textAlignment: this.model.text_alignment,\n                        strokeColor: this.model.definesQuantity ? null : this.model.stroke_color_code,\n                        strokeWidth: !this.model.definesQuantity && this.model.stroke_width ? this.model.stroke_width : 0\n                    }\n                );\n\n                /**\n                 * Text alignment is handled by TextLine.usePath when there is a\n                 * path. If there isn't a path, we need to keep track of the widest\n                 * line and align each line from that.\n                 */\n                if (this.path) {\n                    l.usePath(this.path);\n                }\n                else {\n                    this.greatestWidth = this.greatestWidth < l.bounds.width ? l.bounds.width : this.greatestWidth;\n                }\n            };\n\n            buildTextLine();\n\n            let iteration = 0;\n            while (l.overflowed_line && iteration < 100) {\n                this.model.size = parseInt((this.model.size * 0.95) as any);\n                l.delete();\n\n                buildTextLine();\n                iteration += 1;\n            }\n\n            this.text_line = l;\n\n            // Don't add the line if its empty instead just use offset\n            // for some reason empty lines break things in really bad and annoying random ways\n            if (l.bounds.width !== 0) {\n                this.lines.push(l);\n                l.translate(new this.paper.Point(0, i * ((measurements.height + measurements.lineSpacing) + l.position.y)));\n            }\n            i++;\n        }\n\n        // Text alignment\n        if (!this.path) {\n            for (const l of this.lines) {\n                if (this.model.text_alignment === TextAlignment.CENTER) {\n                    l.translate(new this.paper.Point((this.greatestWidth - l.bounds.width) / 2, 0));\n                } else if (this.model.text_alignment === TextAlignment.RIGHT) {\n                    l.translate(new this.paper.Point(this.greatestWidth - l.bounds.width, 0));\n                }\n            }\n        }\n\n        if (this.item) {\n            this.item.remove();\n        }\n\n        // A single compound path is needed for processing but creating this is very, very slow\n        // Instead of doing this on frame/change lets only draw the full united compound path when exporting for the save.\n        // Otherwise, just add all the glyphs to a single layer\n        if (this.compound_path || this.model.color?.texture) {\n            let compound_path = new this.paper.CompoundPath(null);\n            for (const l of this.lines) {\n                let path = l.drawCompoundPath();\n                compound_path = compound_path.unite(path, {insert: false});\n\n                l.delete();\n            }\n\n            this.item = compound_path;\n        }\n        else {\n            this.item = new this.paper.Layer();\n            for (const l of this.lines) {\n                for (const glyph of l.glyphs) {\n                    this.item.addChild(glyph);\n                }\n            }\n        }\n\n        this.layer.addChild(this.item);\n    }\n\n    // Update immediately if loaded or skip and wait for load to update paper\n    updatePaper(): void {\n        if (!this.isLoaded) {\n            return;\n        }\n\n        // Font mismatch/race condition\n        let key = Services.get<FontService>('FontService').fontKey(this.model.font, this.model.font_version);\n        if (key !== this.loadedFontId) {\n            this.loadFont();\n            return;\n        }\n\n        // This task needs to be done in a frame task so it won't execute more than once per frame which\n        // happens with drag events. Its very slow and needs to be optimized.\n        const tsk = this.updatePaperOnFrame;\n        if (!this.hasFrameTask(tsk, this)) {\n            this.addFrameTask(tsk, this);\n        }\n    }\n\n    public updateItemProperties() {\n        this.item.fillColor = this.model.color_code as any;\n        this.item.strokeColor = (this.model.definesQuantity ? null : this.model.stroke_color_code) as any;\n        this.item.strokeWidth = !this.model.definesQuantity && this.model.stroke_width ? this.model.stroke_width : 0;\n    }\n\n    public override updatePaperOnFrame(): void {\n        /**\n         * There are 2 different ways we display text:\n         *     - Normal\n         *     - Along path\n         *\n         * Both should be able to be scaled/stretched and support multiple\n         * lines.\n         */\n        if (!this.canvasService.setup_complete.isResolved()) {\n            return;\n        }\n\n        this.layer.activate();\n\n        // The presave state can mess things up so lets just clear everything out and rebuild\n        if (this.in_presave_state) {\n            this.clear();\n        }\n\n        if (this.lines.length == 0) {\n            this.buildTextLines();\n            this.trigger('on-lines-change');\n        }\n\n        if (!this.item) {\n            this.layer.removeChildren();\n\n            // We need to still trigger the update tasks so promises will correctly resolve when there is no text\n            if (!this.model.text_display) {\n                this.trigger('updatePaper', this);\n                this.canvasService.trigger('design-change');\n\n                if (!this.initialized_deferred.promise.isResolved()) {\n                    this.initialized_deferred.resolve();\n                }\n            }\n\n            // Clear out the offset path so it doesn't create a ghost element\n            this.queueOffsetPath();\n            return;\n        }\n\n        this.updateItemProperties();\n\n        // Reset rotation so we can work with it on the non-rotated plane\n        if (this.lastRotation) {\n            this.rotationPosition = new this.paper.Point(this.item.position.x, this.item.position.y);\n\n            this.item.rotate(-this.lastRotation, this.rotationPosition);\n            this.path_layer.rotate(-this.lastRotation, this.rotationPosition);\n\n            // Keep offset path rotation in sync while waiting for it to update\n            if (this.offset) {\n                this.offset.rotate(-this.lastRotation);\n            }\n        }\n\n        /**\n         * The last step is to apply scaling and move the layer into position.\n         * Positioning and scaling are based(origin) on the center of the\n         * layer, as you can see from some of the code(width & height / 2)\n         */\n        let start_size = this.item.bounds.size;\n\n        let newPosition: paper.Point = new this.paper.Point(this.x, this.y);\n        let pathPosition = new this.paper.Point(\n            this.x,\n            this.y + this.bounds.height\n        );\n\n\n        if (!this.font_scale) {\n            this.prefered_line_height = null;\n        }\n\n        if (this.font_scale && !this.auto_scale && !this.path) {\n            this.item.position = newPosition;\n\n            const height_scale = this.elementBounds.height / this.bounds.height;\n            const width_scale = this.elementBounds.width / this.bounds.width;\n\n            const scale = height_scale ;\n\n            this.scaled_x = scale;\n            this.scaled_y = scale;\n\n            const scaleXMod: number = this.x_scale_inverted != this.set_x_scale_inverted ? -1 : 1;\n            const scaleYMod: number = this.y_scale_inverted != this.set_y_scale_inverted ? -1 : 1;\n\n            this.item.scale(scale * scaleXMod, scale * scaleYMod);\n\n            this.width = Number(Number(this.item.bounds.width).toFixed(3));\n            this.height = Number(Number(this.item.bounds.height).toFixed(3));\n        }\n        else if (this.width && this.height && !this.font_scale && !this.path) {\n            const w: number = this.item.bounds.width;\n            const h: number = this.item.bounds.height;\n            const scaleXMod: number = this.x_scale_inverted != this.set_x_scale_inverted ? -1 : 1;\n            const scaleYMod: number = this.y_scale_inverted != this.set_y_scale_inverted ? -1 : 1;\n            const scaleX: number = this.width / w * scaleXMod;\n            const scaleY: number = this.height / h * scaleYMod;\n\n            this.scaled_x = scaleX;\n            this.scaled_y = scaleY;\n\n            this.item.position = newPosition;\n            this.path_layer.position = pathPosition;\n            this.item.scale(scaleX, scaleY);\n        }\n        else if (!this.path) {\n            this.item.position = newPosition;\n            this.path_layer.position = newPosition;\n\n            // Scale text size down if the text is too large to fit inside of the canvas\n            const currentWidth: number = this.bounds.width;\n            const currentHeight: number = this.bounds.height;\n            let maxWidth: number = this.canvasService.workspace.artboard.width;\n            let maxHeight: number = this.canvasService.workspace.artboard.height;\n            if (this.x > maxWidth / 2) {\n                maxWidth = (maxWidth - this.x) * 2;\n            }\n            else {\n                maxWidth = this.x * 2;\n            }\n            if (this.y > maxHeight / 2) {\n                maxHeight = (maxHeight - this.y) * 2;\n            }\n            else {\n                maxHeight = this.y * 2;\n            }\n            if ((this.auto_scale || this.font_scale) && currentWidth !== 0 && currentHeight !== 0) {\n                let scale = 1;\n                const scaleX: number = maxWidth / currentWidth;\n                const scaleY: number = maxHeight / currentHeight;\n\n                scale = scaleX > scaleY ? scaleY : scaleX;\n                if (!this.font_scale) {\n                    scale = scale > 1 ? 1 : scale;\n                    scale = scale < .1 ? .1 : scale;\n                }\n\n                this.scaled_x = scale;\n                this.scaled_y = scale;\n\n                const scaleXMod: number = this.x_scale_inverted != this.set_x_scale_inverted ? -1 : 1;\n                const scaleYMod: number = this.y_scale_inverted != this.set_y_scale_inverted ? -1 : 1;\n\n                this.item.scale(scale * scaleXMod, scale * scaleYMod);\n            }\n        }\n        else {\n            let x_position_difference = this.path_layer.position.x - this.item.position.x;\n            let y_position_difference = this.path_layer.position.y - this.item.position.y;\n\n            newPosition = new this.paper.Point(\n                this.x - x_position_difference + (this.path.bounds.width / 2) + (this.pathBoundsDifference.width / 2),\n                this.y - y_position_difference + (this.path.bounds.height / 2) + (this.pathBoundsDifference.height / 2)\n            );\n            pathPosition = new this.paper.Point(\n                this.x + (this.path.bounds.width / 2) + (this.pathBoundsDifference.width / 2),\n                this.y + (this.path.bounds.height / 2) + (this.pathBoundsDifference.height / 2)\n            );\n            this.item.position = newPosition;\n            this.path_layer.position = pathPosition;\n        }\n\n        if (this.offset) {\n            let width_change = this.item.bounds.width / start_size.width;\n            let height_change = this.item.bounds.height / start_size.height;\n\n            this.offset.scale(width_change, height_change);\n            this.offset.position = this.item.position;\n        }\n\n\n        // Rotate layer\n        this.rotationPosition = new this.paper.Point(this.item.position.x, this.item.position.y);\n        if (this.rotation != null) {\n            this.item.rotate(this.rotation, this.rotationPosition);\n            this.path_layer.rotate(this.rotation, this.rotationPosition);\n            this.lastRotation = this.rotation;\n\n            // Keep offset path rotation in sync while waiting for it to update\n            if (this.offset) {\n                this.offset.rotate(this.rotation);\n            }\n        }\n\n        this.lastCenter = this.item.bounds.center;\n\n        if (this.path) {\n            if (this.canvasService.selection_manager.selectedElement() == this) {\n                this.path.strokeColor = new this.paper.Color(0, 0, 0, .6);\n                this.path.strokeWidth = 1;\n                this.path.dashArray = [this.canvasService.selection_manager.selection_manager.dashWidth(), this.canvasService.selection_manager.selection_manager.dashWidth()];\n            }\n            else {\n                this.path.strokeWidth = 0;\n            }\n        }\n\n        this.updateTextColor();\n\n        this.set_x_scale_inverted = this.x_scale_inverted;\n        this.set_y_scale_inverted = this.y_scale_inverted;\n\n        this.queueOffsetPath();\n\n        this.trigger('updatePaper', this);\n        this.canvasService.trigger('design-change');\n\n        if (!this.initialized_deferred.promise.isResolved()) {\n            this.initialized_deferred.resolve();\n        }\n    }\n\n    updateTextColor() {\n        if (!this.item) {\n            return;\n        }\n\n        if (this.model.color && this.model.color.texture) {\n            if (this.applied_texture && this.model.color.id != this.applied_texture_id) {\n                this.applied_texture.remove();\n                this.applied_texture = null;\n                this.applied_texture_id = null;\n            }\n\n            if (!this.applied_texture) {\n                if (BaseElement.cached_textures[this.model.color.id] && BaseElement.cached_textures[this.model.color.id].loaded) {\n                    this.applied_texture = BaseElement.cached_textures[this.model.color.id].clone();\n                    this.applied_texture_id = this.model.color.id;\n                }\n                else {\n                    let _applied_texture = new this.paper.Raster({\n                        source: this.model.color.texture,\n                        crossOrigin: 'anonymous'\n                    });\n                    if (!this.model.color.process_texture) {\n                        _applied_texture.data['remove-in-processed-file'] = true;\n                    }\n                    _applied_texture.on('load', () => {\n                        _applied_texture.bounds = this.canvasService.squareCameraBounds();\n\n                        if (!BaseElement.cached_textures[this.model.color.id]) {\n                            BaseElement.cached_textures[this.model.color.id] = _applied_texture.clone();\n                            BaseElement.cached_textures[this.model.color.id].remove();\n                        }\n                    })\n\n                    this.applied_texture = _applied_texture;\n                    this.model.color.id;\n                }\n            }\n\n            this.item.clipMask = true;\n\n            this.applied_texture.bounds = this.canvasService.squareCameraBounds();\n            this.layer.addChild(this.applied_texture);\n\n            this.applied_texture.sendToBack();\n            this.applied_texture.rotation = 0;\n        }\n        else {\n            if (this.applied_texture) {\n                this.applied_texture.remove();\n                this.applied_texture = null;\n                this.applied_texture_id = null;\n            }\n\n            this.item.clipMask = false;\n        }\n    }\n\n    private updateToFromPath(event) {\n        this.model.x += 1; // Force a correct lastCenter variable. Hacky, I know.\n        this.model.x -= 1; // There's probably a more elegant way to do this, but this will work for now\n        if (event.value !== null)\n            this.model.text_alignment = TextAlignment.CENTER;\n        const lastCenter: paper.Point = this.lastCenter;\n        this.once('updatePaper', () => {\n            this.addFrameTask(this._updateToFromPath, this, [event, lastCenter]);\n        }, this);\n    }\n\n    private _updateToFromPath(event, lastCenter: paper.Point) {\n        this.model.x += lastCenter.x - this.lastCenter.x;\n        this.model.y += lastCenter.y - this.lastCenter.y;\n    }\n\n    override get bounds(): paper.Rectangle {\n        let rect: paper.Rectangle = null;\n\n        if (!this.model.text || this.model.text.trim() == '') {\n            return new this.paper.Rectangle(\n                // Center of element, not top left\n                new this.paper.Point(\n                    this.x - this.width / 2,\n                    this.y - this.height / 2\n                ),\n                new this.paper.Size(0, 0)\n            );\n        }\n\n        if (this.item) {\n            return this.item.bounds;\n        }\n\n        return this.layer.bounds;\n    }\n\n    override get elementBounds(): paper.Rectangle {\n        if (!this.model.text || this.model.text.trim() === '') {\n            return new this.paper.Rectangle(\n                // Center of element, not top left\n                new this.paper.Point(\n                    this.x - this.width / 2,\n                    this.y - this.height / 2\n                ),\n                new this.paper.Size(0, 0)\n            );\n        }\n        if (this.width && this.height && !this.path) {\n            return new this.paper.Rectangle(\n                // Center of element, not top left\n                new this.paper.Point(\n                    this.x - this.width / 2,\n                    this.y - this.height / 2\n                ),\n                new this.paper.Size(this.width, this.height)\n            );\n        } else {\n            return this.bounds;\n        }\n    }\n\n    override hoverTest(point: paper.Point): boolean {\n        const selectionThreshold = 20,\n            selectionThresholdPoint = this.bounds.point.add(\n                new this.paper.Point(-selectionThreshold, -selectionThreshold)\n            ),\n            selectionThresholdSize = new this.paper.Size(\n                this.bounds.width + selectionThreshold * 2,\n                this.bounds.height + selectionThreshold * 2\n            ),\n            selectionThresholdRect = new this.paper.Rectangle(\n                selectionThresholdPoint,\n                selectionThresholdSize\n            );\n\n        return selectionThresholdRect.contains(point);\n    }\n\n    override centerHorizontally(): void {\n        if (this.model.path) {\n            this.x += this.canvasService.workspace.artboard.width / 2 - this.bounds.center.x;\n        } else {\n            super.centerHorizontally();\n        }\n    }\n\n    override centerVertically(): void {\n        if (this.model.path) {\n            this.y += this.canvasService.workspace.artboard.height / 2 - this.bounds.center.y;\n        } else {\n            super.centerVertically();\n        }\n    }\n\n    public override applyScaling(sizeChange, position, maxSize) {\n        if (this.path) {\n            let current_area = this.bounds.area;\n            let increased_area = (this.bounds.width + sizeChange.x) * (this.bounds.height + sizeChange.y);\n            let percent_change = increased_area / current_area;\n\n            if (isNaN(percent_change) || !isFinite(percent_change)) {\n                return;\n            }\n\n            this.model.size = this.model.size * percent_change;\n        }\n        else {\n            super.applyScaling(sizeChange, position, maxSize);\n        }\n    }\n\n    override clear(): void {\n        for (const line of this.lines) {\n            line.delete();\n        }\n\n        this.set_x_scale_inverted = false;\n        this.set_y_scale_inverted = false;\n\n        if (this.applied_texture) {\n            this.applied_texture.remove();\n            this.applied_texture_id = null;\n        }\n\n        this.lines.length = 0;\n        this.item?.remove();\n        this.item = null;\n        this.lastRotation = 0;\n\n        this.in_presave_state = false;\n        this.compound_path = false;\n\n        if (this.offset) {\n            this.canvasService.removeOffset(this.offset);\n            this.offset = null;\n        }\n\n        super.clear();\n    }\n\n    override showScaleControls(): boolean {\n        return true;\n    }\n\n    override showRotateControl(): boolean {\n        return this.path == null;\n    }\n\n    public override preSave(options?) {\n        if (this.model.isVariableData() && this.item && this.layer && !this.model.live_text_disabled) {\n            this.replaceWithPointText();\n        }\n\n        // We need to rebuild lines so everything can be merged into a single compound path\n        if (this.item instanceof this.paper.Layer && !this.model.isVariableData()) {\n            let compound = new this.paper.CompoundPath(null);\n            compound = compound.uniteList(this.item.children);\n\n            this.item.remove();\n\n            this.item = compound;\n            this.layer.addChild(this.item);\n\n            // The position stays correct however the fill and color properties are lost, so we need to reset them\n            this.updateItemProperties();\n            this.updateTextColor();\n        }\n\n        if (this.path) {\n            this.path.remove();\n            this.path = null;\n        }\n\n        if (this.item && (!this.model.text_display || this.model.text_display.trim() == '')) {\n            this.item.remove();\n        }\n\n        this.in_presave_state = true;\n\n        this.lines = [];\n    }\n\n    private replaceWithPointText() {\n        this.layer.activate();\n        // This needs to be small since paperjs cannot calculate the bounds of point text correct\n        // If it's too large then the text bounds will go past the design bounds and mess up resizing\n        // But if it's too small then you get rounding errors or something...\n        let measurement_font_size = 10;\n        let opentype_text = new this.paper.CompoundPath(this.resolvedFont.font.getPath(this.model.text_display, 0, 0, measurement_font_size).toPathData());\n\n        let family = this.model.font.fontFamily(true);\n        if (this.model.font_version && this.model.font.versions.getItemFromID(this.model.font_version.id)) {\n            family = this.model.font.versionName(this.model.font_version);\n        }\n\n        // Need to escape the name so numbers won't break it\n        family = `\"${family}\"`\n\n        let point_text = new this.paper.PointText({\n            point: new this.paper.Point(0, 0),\n            content: this.model.text_display,\n            fillColor: this.model.color_code,\n            fontFamily: family,\n            fontSize: measurement_font_size\n        });\n\n        // OpenType text path bounds will be exactly to the path.\n        // PointText bounds will be based on how font normally renders in a line with padding and offsets according to font kerning.\n        // These do not match up, so we need to figure out how to translate and scale the bounds of the PointText to match the OpenType path bounds.\n        let x_offset = (point_text.bounds.x - opentype_text.bounds.x) / point_text.bounds.width;\n        let y_offset = (point_text.bounds.y - opentype_text.bounds.y) / point_text.bounds.height;\n        let width_offset = point_text.bounds.width / opentype_text.bounds.width;\n        let height_offset = point_text.bounds.height / opentype_text.bounds.height;\n\n        let new_bounds = this.item.bounds.clone();\n        new_bounds.width = new_bounds.width * width_offset;\n        new_bounds.height = new_bounds.height * height_offset;\n        new_bounds.x = new_bounds.x + (x_offset * new_bounds.width);\n        new_bounds.y = new_bounds.y + (y_offset * new_bounds.height);\n        point_text.bounds = new_bounds;\n\n        point_text.data['variable-data-text'] = true;\n        point_text.data['identifier'] = this.model.getOrCreateIdentifier();\n        point_text.name = `variable-data-text-${this.model.getOrCreateIdentifier()}`;\n\n        opentype_text.remove();\n\n        this.item.remove();\n        this.item = null;\n\n        return point_text;\n    }\n\n    public static getFontMeasurements(paper, layer, path_layer, font: any, fontId: number, size: number): any {\n        const measureText = new TextLine(paper, layer, path_layer, 'My', 0, 0, font, {\n            fontSize: size\n        });\n        measureText.drawCompoundPath();\n\n        let data = {\n            size: size,\n            height: measureText.bounds.height,\n            fontAscender: font.ascender,\n            fontDescender: Math.abs(font.descender)\n        };\n\n        data['fontHeight'] = data['fontAscender'] + data['fontDescender'];\n        data['ascenderModifier'] = data['fontAscender'] / data['fontHeight'];\n        data['lineSpacing'] = data['height'] * .2;\n\n        measureText.delete();\n\n        // Just in case\n        layer.remove();\n\n        return data;\n    }\n\n    public override isTextType(): boolean {\n        return true;\n    }\n\n    override remove() {\n        if (this.path_layer) {\n            this.path_layer.remove();\n        }\n        if (this.path) {\n            this.path.remove();\n        }\n\n        super.remove();\n    }\n\n    override designColors() {\n        let colors = super.designColors();\n\n        if (this.model.custom_color) {\n            colors.add(this.model.custom_color);\n        }\n        else if (this.model.color) {\n            colors.add(this.model.color);\n        }\n\n        if (this.model.custom_stroke_color) {\n            colors.add(this.model.custom_stroke_color);\n        }\n        else if (this.model.stroke_color) {\n            colors.add(this.model.stroke_color);\n        }\n\n        return colors;\n    }\n\n    override correctElementOffCanvasPosition(point: paper.Point): paper.Point {\n        if (!this.canvasService.workspace) {\n            return point;\n        }\n\n        if (this.model.path) {\n            // Ugh... Curved text uses the path.bounds.point as the x,y location when everything else uses\n            // the element.bounds.center as the x,y location so we need to correct for that.\n\n            // This ends up causing a bit of an issue because the bounds location may be out of sync with the model position\n            // so we get some weird bouncing when an element is slammed into the edge of the design canvas.\n\n            // We some spend some time to correct the path position, but also somehow not break all existing designs...\n            // For now this bandaid will work.\n\n            let offset = new this.canvasService.paper.Point(this.x, this.y).subtract(this.bounds.center);\n            return super.correctElementOffCanvasPosition(point.subtract(offset)).add(offset);\n        }\n        return super.correctElementOffCanvasPosition(point);\n    }\n}\n\nexport class LockedTextElement extends TextElement {\n    override get locked() {\n        return false;\n    }\n\n    override get movable(): boolean {\n        return false;\n    }\n\n    override showScaleControls(): boolean {\n        return false;\n    }\n\n    override showRotateControl(): boolean {\n        return false;\n    }\n}\n","import * as paper from 'paper';\nimport {RasterElement} from './RasterElement';\nimport {ElementAbstract} from '../models/abstract/ElementAbstract';\nimport {SymbolType} from '../models/enums';\nimport {VariableDataElementAbstract} from '../models/abstract/VariableDataElementAbstract';\n\nexport class SVGCanvasElement extends RasterElement {\n    constructor(url: string, element?: ElementAbstract, layer?: paper.Layer) {\n        super(url, element, layer);\n    }\n\n    override setup(url){\n        this.layer.activate();\n        this.layer.removeChildren();\n        this.layer.importSVG(url, {\n            onLoad: (item, content) => {\n                this.item = item;\n                this.image_loaded = true;\n                this.fillInValuesFromPaper();\n                this.updatePaper();\n            },\n            onError: (message, status) => {\n                // This is needed to make sure the error propagates correctly\n                throw message\n            }\n        });\n    }\n\n    override preSave() {\n        if (this.model instanceof VariableDataElementAbstract) {\n            if (this.model.symbol !== SymbolType.NONE && this.layer) {\n                this.item.data['include-in-processed-file'] = false;\n                let rect = new this.paper.Path.Rectangle(this.layer.bounds);\n                rect.fillColor = new this.paper.Color(50/255, 205/255, 50/255); // limegreen\n                rect.opacity = 0;\n                rect.data['variable-data-file'] = true;\n                rect.data['identifier'] = this.model.getOrCreateIdentifier();\n                rect.name = `variable-data-file-${this.model.getOrCreateIdentifier()}`\n                this.layer.addChild(rect);\n            }\n        }\n    }\n}\n","import * as paper from 'paper';\nimport {BaseElement} from './BaseElement';\nimport {ClipTypeEnum, DynamicBackgroundShape} from '../models/enums';\nimport {Color} from '../models/Color';\nimport {AdminMarketplaceArtworkRaster} from '../../../../../dashboard/ts/apps/marketplace/models/AdminMarketplaceArtworkRaster';\nimport {CustomShape} from '../models/CustomShape';\nimport {TemplateShape} from '../models/TemplateShape';\n\nexport class BackgroundShapeElement extends BaseElement {\n    border: paper.Item;\n    _rotation: number;\n    area: number;\n    clip_mask;\n    clip: boolean;\n    _z: number;\n    private _locked_: boolean;\n\n    constructor(shape?: CustomShape | TemplateShape | AdminMarketplaceArtworkRaster, locked?: boolean, layer?: paper.Layer) {\n        super(shape, layer);\n        this._z = 0;\n        this.area = 0;\n        this._locked_ = locked || false;\n    }\n\n    override bindEvents(): void {\n        super.bindEvents();\n        this.model.bind('change', this.updatePaper.bind(this), this);\n        this.model.bind('change', () => {\n            this.canvasService.trigger('design-change');\n        }, this);\n        this.canvasService.bind('contourPath:change', this.updatePaper.bind(this), this);\n    }\n\n    override unbindEvents(): void {\n        super.unbindEvents();\n        this.model.unbindWithContext('change', this);\n        this.canvasService.unbindWithContext('contourPath:change', this);\n    }\n\n    override get rotation(): number {\n        return this._rotation;\n    }\n\n    override set rotation(rotation: number) {\n        this._rotation = rotation;\n    }\n\n    updatePaper() {\n        const tsk = this.updatePaperOnFrame;\n        if (!this.hasFrameTask(tsk, this)) {\n            this.addFrameTask(tsk, this);\n        }\n    }\n\n    override updatePaperOnFrame(): void {\n        if (!this.canvasService.workspace) {\n            return;\n        }\n\n        this.layer.activate();\n\n        if (this.item) {\n            this.item.remove();\n            this.item = null;\n        }\n        if (this.border) {\n            this.border.remove();\n            this.border = null;\n        }\n\n        this.layer?.removeChildren();\n\n        // Shape's origin is it's center\n        this.layer.position = new this.paper.Point(\n            this.canvasService.workspace.artboard.width / 2,\n            this.canvasService.workspace.artboard.height / 2\n        );\n\n        // Create the shape\n        if (this.model.template_shape) {\n            switch (this.model.template_shape.clip_type) {\n                case ClipTypeEnum.ROUNDED_CORNER:\n                    this.buildRectangleShape();\n                    break;\n                case ClipTypeEnum.RECTANGLE:\n                    this.model.clip_radius = 0;\n                    this.buildRectangleShape();\n                    break;\n                case ClipTypeEnum.ELLIPSE:\n                    this.buildEllipseShape();\n                    break;\n                case ClipTypeEnum.CIRCLE:\n                    this.buildCircleShape();\n                    break;\n                case ClipTypeEnum.CONTOUR:\n                    this.canvasService.setOffsetPath(true);\n                    this.buildContourShape();\n                    break;\n                case ClipTypeEnum.CUSTOM_PATH:\n                    this.buildShapeFromCustomPath();\n                    break;\n                case ClipTypeEnum.NONE:\n                    this.clear();\n                    if (this.canvasService.offset_path_enabled && !this.offset_path_disabled) {\n                        this.canvasService.setOffsetPath(false);\n                    }\n                    break;\n            }\n        }\n        else {\n            console.warn('Incorrectly configured shape');\n        }\n\n        if (this.item) {\n            this.layer.addChild(this.item);\n        }\n\n        if (this.item) {\n            if (this.item instanceof this.paper.Shape) {\n                this.clip_mask = (this.item as paper.Shape).toPath();\n            }\n            else {\n                this.clip_mask = this.item.clone({insert: false, deep: true});\n            }\n        }\n\n        if (this.item) {\n            this.item.name = 'CutContour';\n            this.layer.addChild(this.item);\n        }\n\n        if (this.border) {\n            this.layer.addChild(this.border);\n        }\n\n        this.updateColors();\n\n        this.canvasService.buildClippingMask();\n\n        this.trigger('updatePaper', this);\n\n        if (!this.initialized_deferred.promise.isResolved()) {\n            this.initialized_deferred.resolve();\n        }\n    }\n\n    updateColors(): void {\n        if (!this.item) {\n            return;\n        }\n\n        if (this.model.background_shape_fill?.texture) {\n            let _color = this.model.background_shape_fill;\n            this.item.fillColor = new this.paper.Color(this.model.background_shape_fill_code);\n            this.item.visible = true;\n            this.item.clipMask = false;\n\n            if (!this.item.parent) {\n                return;\n            }\n\n            // If we already have a texture stored on the layer\n            if (this.item.parent['texture']) {\n                // If it doesn't match, remove it\n                if (this.item.parent['texture']['color_id'] != _color.id) {\n                    this.item.parent['texture'].remove();\n                    this.item.parent['texture'] = null;\n                }\n            }\n\n            // If the correct texture isn't set\n            if (!this.item.parent['texture']) {\n                let texture = null;\n\n                // Check the cache to see if we already have a fully loaded copy of it somewhere\n                // Loading the texture is very expensive we need to keep it in memory and reuse it\n                if (BaseElement.cached_textures[_color.id] && BaseElement.cached_textures[_color.id].loaded) {\n                    texture = BaseElement.cached_textures[_color.id].clone();\n                    texture.bounds = this.canvasService.squareCameraBounds();\n                }\n                else {\n                    // Texture is not cached or not loaded so we need to create a new raster\n                    texture = new this.paper.Raster({\n                        source: _color.texture,\n                        crossOrigin: 'anonymous'\n                    });\n                    texture.on('load', () => {\n                        texture.bounds = this.canvasService.squareCameraBounds();\n\n                        if (!BaseElement.cached_textures[_color.id]) {\n                            BaseElement.cached_textures[_color.id] = texture.clone();\n                            BaseElement.cached_textures[_color.id].remove();\n                        }\n                    });\n                }\n\n                texture['color_id'] = _color.id;\n                this.item.parent['texture'] = texture;\n            }\n\n            let texture = this.item.parent['texture'];\n            texture.rotation = 0;\n\n            texture['color_id'] = _color.id;\n\n            // Make sure it has not been removed from the parent child list\n            this.item.parent.addChild(texture)\n\n            // Place in the same location so it looks like its cutout of a single piece of vinyl\n            texture.bounds = this.canvasService.squareCameraBounds();\n\n            this.item.clipMask = true;\n            this.item.sendToBack();\n            texture.sendToBack();\n        }\n        else {\n            if (this.item.parent && this.item.parent['texture']) {\n                this.item.parent['texture'].remove();\n                this.item.parent['texture'] = null;\n            }\n\n            // Shape fill\n            if (this.item && this.model.background_shape_fill_code) {\n                this.item.fillColor = this.model.background_shape_fill_code;\n            }\n        }\n\n        // Add border stroke\n        if (this.model.background_shape_border && this.border && this.model.background_shape_border_color_code) {\n            this.border.fillColor = this.model.background_shape_border_color_code;\n        }\n\n        if (this.item && this.model.background_shape_contour_color) {\n            this.item.strokeColor = new this.paper.Color((this.model.background_shape_contour_color as Color).fillValue);\n        }\n    }\n\n    buildClippingRegion() {\n        if (this.clip_mask) {\n            if (this.clip_mask instanceof this.paper.CompoundPath) {\n                let list = [];\n                for (const item of this.clip_mask.children) {\n                    list.push(item.clone({insert: false}));\n                }\n                return list;\n            }\n            return [this.clip_mask];\n        }\n        return [];\n    }\n\n    override get elementBounds(): paper.Rectangle {\n        return new this.paper.Rectangle(this.canvasService.canvasSize);\n    }\n\n    override get locked(): boolean {\n        return this._locked_;\n    }\n\n    override get z(): number {\n        return this._z;\n    }\n\n    override set z(z: number) {\n        this._z = z;\n    }\n\n    get has_border(): boolean {\n        if (this.model.background_shape) {\n            return true;\n        }\n\n        return this.model.template_shape && this.model.template_shape.clip_type != ClipTypeEnum.CUSTOM_PATH;\n    }\n\n    override remove(): void {\n        if (this.canvasService.selection_manager.selectedElement() === this){\n            this.canvasService.selection_manager.deactivate();\n        }\n\n        // Remove the element from the element manager\n        this.element_manager.remove(this);\n\n        // Clear this layer and then remove it from the project\n        this.clear();\n        this.layer.remove();\n\n        // Unbind events\n        this.unbindEvents();\n\n        this.trigger('remove');\n    }\n\n    override clear(): void {\n        if (this.item) {\n            this.item.remove();\n        }\n\n        if (this.border) {\n            this.border.remove();\n        }\n\n        if (this.clip_mask) {\n            this.clip_mask.remove();\n        }\n\n        this.item = null;\n        this.border = null;\n        this.clip_mask = null;\n\n        this.canvasService.buildClippingMask();\n\n        super.clear();\n    }\n\n    fitInImage(artBoardWidth: number, artBoardHeight: number, productWidth: number, productHeight: number): paper.Size {\n        if (!productWidth || !productHeight) {\n            productWidth = artBoardWidth;\n            productHeight = artBoardHeight;\n        }\n        else if (productWidth < productHeight) {\n            productWidth *= artBoardHeight / productHeight;\n            productHeight = artBoardHeight;\n            if (productWidth > artBoardWidth) {\n                productHeight *= artBoardWidth / productWidth;\n                productWidth = artBoardWidth;\n            }\n        }\n        else {\n            productHeight *= artBoardWidth / productWidth;\n            productWidth = artBoardWidth;\n            if (productHeight > artBoardHeight) {\n                productWidth *= artBoardHeight / productHeight;\n                productHeight = artBoardHeight;\n            }\n        }\n\n        return new this.paper.Size(productWidth, productHeight);\n    }\n\n    get offset_path_disabled() {\n        if (!this.model.side) {\n            return false;\n        }\n\n        return this.model.side.disable_offset_path;\n    }\n\n    buildCircleShape(): void {\n        if (this.canvasService.offset_path_enabled && !this.offset_path_disabled) {\n            this.canvasService.setOffsetPath(false);\n        }\n\n        this.item = new this.paper.Shape.Circle(\n            new this.paper.Point(\n                this.canvasService.workspace.artboard.width / 2,\n                this.canvasService.workspace.artboard.height / 2\n            ),\n            Math.min(this.canvasService.workspace.artboard.width, this.canvasService.workspace.artboard.height) / 2\n        );\n\n        if (this.model.background_shape_border) {\n            // The border must be a compound path and not a stroke\n            let radius = (Math.min(this.canvasService.workspace.artboard.width, this.canvasService.workspace.artboard.height) - this.model.cleaned.background_shape_border_margin) / 2;\n            let position = new this.paper.Point(\n                this.canvasService.workspace.artboard.width / 2,\n                this.canvasService.workspace.artboard.height / 2\n            );\n            let stroke_change = this.model.cleaned.background_shape_border_size / 2;\n\n            let outer = new this.paper.Shape.Circle(position, radius + stroke_change);\n            let inner = new this.paper.Shape.Circle(position, radius - stroke_change);\n            this.border = outer.toPath().subtract(inner.toPath());\n            outer.remove();\n            inner.remove();\n        }\n    }\n\n    get fit_size(): paper.Size {\n        return this.fitInImage(this.canvasService.workspace.artboard.width, this.canvasService.workspace.artboard.height, this.model.width, this.model.height);\n    }\n\n    resetBorder(): void {\n        let size = this.fit_size;\n        let min = Math.min(size.width, size.height);\n\n        this.model.background_shape_border = true;\n        this.model.background_shape_border_size = min * 0.025;\n        this.model.background_shape_border_margin = min * 0.1;\n    }\n\n    buildRectangleShape(): void {\n        if (this.canvasService.offset_path_enabled && !this.offset_path_disabled) {\n            this.canvasService.setOffsetPath(false);\n        }\n\n        const fitSize: paper.Size = this.fit_size;\n\n        let radius = this.model.clip_radius || 0;\n        if (this.model.width > this.model.height) {\n            radius = this.canvasService.workspace.artboard.width * (radius / 100.0);\n        }\n        else {\n            radius = this.canvasService.workspace.artboard.width * (radius / 100.0);\n        }\n\n        this.item = new this.paper.Shape.Rectangle(\n            new this.paper.Rectangle(\n                new this.paper.Point(\n                    (this.canvasService.workspace.artboard.width - fitSize.width) / 2,\n                    (this.canvasService.workspace.artboard.height - fitSize.height) / 2\n                ),\n                new this.paper.Size(\n                    fitSize.width,\n                    fitSize.height\n                )\n            ),\n            radius\n        );\n\n        if (this.model.background_shape_border) {\n            // The border must be a compound path and not a stroke\n            let shape_size = Math.max(0, radius - (this.model.cleaned.background_shape_border_margin/2));\n            let position = new this.paper.Point(\n                (this.model.cleaned.background_shape_border_margin + this.canvasService.workspace.artboard.width - fitSize.width) / 2,\n                (this.model.cleaned.background_shape_border_margin + this.canvasService.workspace.artboard.height - fitSize.height) / 2\n            );\n            let stroke_change = this.model.cleaned.background_shape_border_size;\n            let size = new this.paper.Size(\n                fitSize.width - this.model.cleaned.background_shape_border_margin,\n                fitSize.height - this.model.cleaned.background_shape_border_margin\n            );\n\n            let outer = new this.paper.Shape.Rectangle(\n                new this.paper.Rectangle(\n                    position.subtract(stroke_change/2),\n                    size.add(stroke_change)\n                ),\n                Math.max(shape_size + (stroke_change/2), 0)\n            );\n            let inner = new this.paper.Shape.Rectangle(\n                new this.paper.Rectangle(\n                    position.add(stroke_change/2),\n                    size.subtract(stroke_change)\n                ),\n                Math.max(shape_size - (stroke_change/2), 0)\n            );\n\n            this.border = outer.toPath().subtract(inner.toPath());\n            outer.remove();\n            inner.remove();\n        }\n    }\n\n    buildEllipseShape(): void {\n        if (this.canvasService.offset_path_enabled && !this.offset_path_disabled) {\n            this.canvasService.setOffsetPath(false);\n        }\n\n        const fitSize: paper.Size = this.fit_size;\n\n        this.item = new this.paper.Shape.Ellipse(\n            new this.paper.Rectangle(\n                new this.paper.Point(\n                    (this.canvasService.workspace.artboard.width - fitSize.width) / 2,\n                    (this.canvasService.workspace.artboard.height - fitSize.height) / 2\n                ),\n                new this.paper.Size(\n                    fitSize.width,\n                    fitSize.height\n                )\n            )\n        );\n\n        if (this.model.background_shape_border) {\n            // The border must be a compound path and not a stroke\n            let position = new this.paper.Point(\n                (this.model.cleaned.background_shape_border_margin + this.canvasService.workspace.artboard.width - fitSize.width) / 2,\n                (this.model.cleaned.background_shape_border_margin + this.canvasService.workspace.artboard.height - fitSize.height) / 2\n            );\n            let size = new this.paper.Size(\n                fitSize.width - this.model.cleaned.background_shape_border_margin,\n                fitSize.height - this.model.cleaned.background_shape_border_margin\n            );\n            let stroke_change = this.model.cleaned.background_shape_border_size;\n\n            let outer = new this.paper.Shape.Ellipse(\n                new this.paper.Rectangle(\n                    position.subtract(stroke_change/2),\n                    size.add(stroke_change)\n                )\n            );\n            let inner = new this.paper.Shape.Ellipse(\n                new this.paper.Rectangle(\n                    position.add(stroke_change/2),\n                    size.subtract(stroke_change)\n                )\n            );\n\n            this.border = outer.toPath().subtract(inner.toPath());\n            outer.remove();\n            inner.remove();\n        }\n    }\n\n    buildContourShape(): void {\n        this.clear();\n\n        if (this.model.option_border) {\n            this.canvasService.setOffsetPath(true);\n        }\n    }\n\n    buildShapeFromCustomPath(): void {\n        if (this.canvasService.offset_path_enabled && !this.offset_path_disabled) {\n            this.canvasService.setOffsetPath(false);\n        }\n\n        if (!this.model.template_shape.clip_path || this.model.template_shape.clip_path.trim() == '') {\n            this.clear();\n            return;\n        }\n\n        let path: paper.CompoundPath = new this.paper.CompoundPath();\n        path.pathData = this.model.template_shape.clip_path;\n\n        const fitSize: paper.Size = this.fitInImage(this.canvasService.workspace.artboard.width, this.canvasService.workspace.artboard.height, this.model.width, this.model.height);\n        const position: paper.Point = new this.paper.Point(((this.canvasService.workspace.artboard.width - fitSize.width) / 2), ((this.canvasService.workspace.artboard.height - fitSize.height) / 2));\n        const bounds = new this.paper.Rectangle(position, fitSize);\n\n        path.fitBounds(bounds);\n\n        this.item = path;\n    }\n\n    override isShapeType(): boolean {\n        return true;\n    }\n\n    override designColors() {\n        let colors = super.designColors();\n\n        if (this.model.background_shape_custom_fill_color) {\n            colors.add(this.model.background_shape_custom_fill_color);\n        }\n        else if (this.model.background_shape_fill) {\n            colors.add(this.model.background_shape_fill)\n        }\n\n        if (this.model.background_shape_custom_border_color) {\n            colors.add(this.model.background_shape_custom_border_color);\n        }\n        else if (this.model.background_shape_border_color) {\n            colors.add(this.model.background_shape_border_color)\n        }\n\n        return colors;\n    }\n\n    isBorderSelected(point: paper.Point) {\n        return this.border?.contains(point);\n    }\n\n    isBackgroundSelected(point: paper.Point) {\n        return this.item?.contains(point);\n    }\n}\n","import {BaseElement} from \"./BaseElement\";\nimport {UserShape, UserShapeType} from \"../models/UserShape\";\nimport {add, BEZIER_CIRCLE_SCALE, copy, degreesToRadian, invert, Point, pointDistance, rotatePoint, rotatePointAround, scalePoint,} from \"../../../core/utils/VectorUtils\";\nimport {Services} from \"../../../core/services/Services\";\nimport {SelectionStateManager} from \"../services/SelectionStateManager\";\nimport {Field} from \"../../../core/models/fields/Field\";\n\n\nexport type PathPoint = {\n    x: number,\n    y: number,\n    radius: number,\n    segment: paper.Segment,\n    next: PathPoint,\n    last: PathPoint,\n    previous_radius: number\n}\n\n\nexport class UserShapeElement extends BaseElement {\n    points: PathPoint[];\n    scale: Point = {x: 1, y: 1};\n\n    constructor(model: UserShape, layer?: paper.Layer) {\n        super(model, layer);\n        this.setupPoints();\n        this.setupPath();\n        this.model.bind('change', this.updatePaper.bind(this), this);\n        this.model.bind('change:path', () => {\n            if (this.model.shape_type == UserShapeType.POLYGON) {\n                this.setupPoints();\n                this.setupPath();\n            }\n        }, this);\n    }\n\n    setupPoints() {\n        if (!this.model.path) {\n            return;\n        }\n\n        this.points = JSON.parse(this.model.path);\n\n        // Convert to circular linked list to make it easer to work with\n        this.points[0].last = this.points[this.points.length-1];\n        this.points[0].next = this.points[1];\n        this.points[this.points.length-1].next = this.points[0];\n        this.points[this.points.length-1].last = this.points[this.points.length-2];\n        for (let i = 1; i < this.points.length - 1; i++) {\n            this.points[i].last = this.points[i-1];\n            this.points[i].next = this.points[i+1];\n        }\n\n        this.shiftShapeToOrigin();\n    }\n\n    setupPath() {\n        if (!this.layer) {\n            this.layer = new this.paper.Layer();\n        }\n        if (!this.item) {\n            this.item = new this.paper.Path();\n        }\n\n        this.createPath();\n\n        if (this.model.shape_type == UserShapeType.POLYGON) {\n            let bounds = this.shapeBounds(false);\n            this.model.width = bounds.width;\n            this.model.height = bounds.height;\n        }\n\n        this.item.fillColor = new this.paper.Color(this.model.color_code);\n        this.layer.addChild(this.item);\n\n        this.updatePaperOnFrame();\n    }\n\n    createPath() {\n        if (this.model.shape_type == UserShapeType.POLYGON) {\n            this.item.removeSegments();\n            for (const point of this.points) {\n                this.item.addSegments(this.createSegment(point));\n            }\n        }\n        else if (this.model.shape_type == UserShapeType.ELLIPSE) {\n            this.item?.remove();\n            this.item = new this.paper.Path.Ellipse(this.modelBounds());\n            this.item.rotate(this.rotation);\n            this.layer.addChild(this.item);\n        }\n    }\n\n    updatePaper() {\n        const tsk = this.updatePaperOnFrame;\n        if (!this.hasFrameTask(tsk, this)) {\n            this.addFrameTask(tsk, this);\n        }\n    }\n\n    override updatePaperOnFrame() {\n        super.updatePaperOnFrame();\n\n        if (this.model.shape_type == UserShapeType.POLYGON) {\n            if (!Services.get<SelectionStateManager>('SelectionStateManager').editingPoints()) {\n                let shape_size = this.shapeBounds(false);\n                this.scale = {x: this.model.width / shape_size.width, y: this.model.height / shape_size.height};\n            }\n        }\n\n        this.createPath();\n        this.item.fillColor = new this.paper.Color(this.model.color_code);\n    }\n\n    override get item(): paper.Path {\n        return super.item as paper.Path;\n    }\n\n    override set item(v: paper.Path) {\n        super.item = v;\n    }\n\n    override isUserShapeType() {\n        return true;\n    }\n\n    override controlPoints(): any[] {\n        return this.points;\n    }\n\n    createSegment(path_point: PathPoint): paper.Segment[] {\n        if (!path_point.radius) {\n            return [new this.paper.Segment(new this.paper.Point(this.toGlobalSpace(path_point)))];\n        }\n        return this.createSegmentRadius(path_point);\n    }\n\n    createSegmentRadius(path_point: PathPoint): paper.Segment[] {\n        let p = this.toGlobalSpace(path_point);\n        let pn = this.toGlobalSpace(path_point.next);\n        let pl = this.toGlobalSpace(path_point.last);\n\n        let point = new this.paper.Point(p.x, p.y);\n\n        let offset_last = new this.paper.Point(pointDistance(p, pl, path_point.radius * this.scale.x));\n        let offset_next = new this.paper.Point(pointDistance(p, pn, path_point.radius * this.scale.x));\n\n        let segment_last = new this.paper.Segment(offset_last);\n        let segment_next = new this.paper.Segment(offset_next);\n\n        segment_last.handleOut = point.subtract(offset_last).multiply(BEZIER_CIRCLE_SCALE);\n        segment_next.handleIn = point.subtract(offset_next).multiply(BEZIER_CIRCLE_SCALE);\n\n        return [segment_last, segment_next];\n    }\n\n    toGlobalSpace(point: Point): Point {\n        let c = {\n            x: this.model.width / 2,\n            y: this.model.height / 2\n        }\n\n        let position = {\n            x: this.model.x,\n            y: this.model.y\n        }\n\n        // Scale to global space\n        point = scalePoint(point, this.scale);\n\n        // Move to the center so the rotation is about the center\n        point = add(point, invert(c));\n\n        // Rotate the point\n        point = rotatePoint(point, degreesToRadian(this.model.rotation));\n\n        // Move the point to the correct position\n        point = add(point, position);\n\n        return point;\n    }\n\n    toLocalSpace(point: Point): Point {\n        let c = {\n            x: this.model.width / 2,\n            y: this.model.height / 2\n        }\n\n        let position = {\n            x: this.model.x,\n            y: this.model.y\n        }\n\n        let inverted_scale = {\n            x: 1 / this.scale.x,\n            y: 1 / this.scale.y\n        }\n\n        // We need to apply the transforms done in the toGlobalSpace, but in reverse.\n        // This function is correct when P == toLocalSpace(toGlobalSpace(P))\n\n        // Move the point back to the center of rotation\n        point = add(point, invert(position));\n\n        // Rotate the point back\n        point = rotatePoint(point, degreesToRadian(-this.model.rotation));\n\n        // Move the point to the normal position\n        point = add(point, c);\n\n        // Unapply the scale\n        point = scalePoint(point, inverted_scale);\n\n        return point;\n    }\n\n    override placementGuides(): Point[][] {\n        if (this.model.shape_type == UserShapeType.ELLIPSE) {\n            return super.placementGuides();\n        }\n        return this.basePlacementGuides().map(v => [this.toGlobalSpace(v[0]), this.toGlobalSpace(v[1])]);\n    }\n\n    basePlacementGuides(): Point[][] {\n        let start = this.points[0];\n        let current = this.points[0];\n        let guides = [[copy(current.last), copy(current)]];\n        while (current.next != start) {\n            guides.push([copy(current), copy(current.next)]);\n            current = current.next;\n        }\n\n        return guides;\n    }\n\n    modelBounds() {\n        return new this.paper.Rectangle(\n            // Center of element, not top left\n            new this.paper.Point(\n                this.x - (this.width / 2),\n                this.y - (this.height / 2)\n            ),\n            new this.paper.Size(this.width, this.height)\n        );\n    }\n\n    override get elementBounds(): paper.Rectangle {\n        if (this.width && this.height) {\n            return this.modelBounds();\n        }\n        else {\n            return this.bounds;\n        }\n    }\n\n    correctBounds() {\n        if (this.model.shape_type != UserShapeType.POLYGON) {\n            return;\n        }\n\n        // We need to correct the element bounds with the new shape so that move/scale can work correctly\n\n        // First shift the shape to 0,0 since that is where the bounding box starts\n        // We also need to measure the shift in world space so we can move the position by that amount\n        let preshift_bounds = this.shapeBounds(true);\n        this.shiftShapeToOrigin();\n        let bounds = this.shapeBounds(true);\n\n        bounds.x += bounds.width / 2 + (preshift_bounds.x - bounds.x);\n        bounds.y += bounds.height / 2 + (preshift_bounds.y - bounds.y);\n\n        // Update model with new bounding box\n        this.model.width = bounds.width;\n        this.model.height = bounds.height;\n        this.model.x = bounds.x;\n        this.model.y = bounds.y;\n        this.model.getField<Field>('path').setValueWithoutTrigger(JSON.stringify(this.points.map(v => {return {x: v.x, y: v.y, radius: v.radius}})));\n    }\n\n    applyRotation() {\n        // From what I can tell it's impossible / extremely difficult to keep the rotation when going back into point edit mode.\n        // This is because the rotation is taken around the center of the bounding box, but the center point changes as the shape changes.\n        // And when we go back into scale/rotate mode, that center point will no longer align with the new bounding box.\n        // So we have to apply the rotation transformation to the local space and set the global rotation back to zero.\n        let local_center = this.toLocalSpace({\n            x: this.model.x,\n            y: this.model.y\n        });\n\n        for (const point of this.points) {\n            let rotated = rotatePointAround(point, local_center, this.model.rotation);\n            point.x = rotated.x;\n            point.y = rotated.y;\n        }\n\n        this.model.rotation = 0;\n    }\n\n    shiftShapeToOrigin() {\n        let shape_bounds = this.shapeBounds(false);\n\n        for (const point of this.points) {\n            point.x -= shape_bounds.x;\n            point.y -= shape_bounds.y\n        }\n    }\n\n    shapeBounds(transform: boolean): {x: number, y: number, width: number, height: number} {\n        if (!this.points.length) {\n            return {x: 0, y: 0, width: 0, height: 0};\n        }\n\n        let start = transform ? this.toGlobalSpace(this.points[0]) : this.points[0];\n        let min = copy(start);\n        let max = copy(start);\n\n        for (const point of this.points) {\n            let p = transform ? this.toGlobalSpace(point) : point;\n            min.x = Math.min(min.x, p.x);\n            min.y = Math.min(min.y, p.y);\n\n            max.x = Math.max(max.x, p.x);\n            max.y = Math.max(max.y, p.y);\n        }\n\n        return {\n            x: min.x,\n            y: min.y,\n            width: max.x - min.x,\n            height: max.y - min.y\n        }\n    }\n\n    toIcon() {\n        let bounds = this.elementBounds;\n        return `\n            <svg width=\"24\" height=\"24\" viewBox=\"${bounds.x} ${bounds.y} ${bounds.width} ${bounds.height}\">\n                ${new XMLSerializer().serializeToString(this.item.exportSVG() as any)}\n            </svg>\n        `;\n    }\n\n    override get model(): UserShape {\n        return this._model;\n    }\n    override set model(v: UserShape) {\n        this._model = v;\n    }\n}","import {Color} from '../models/Color';\nimport {Font} from '../models/Font';\nimport {ColorCollection} from '../collections/ColorCollection';\nimport APIResponse from '../../../core/models/APIResponse';\nimport {Services} from '../../../core/services/Services';\nimport {FontService} from '../services/FontService';\nimport {CustomText} from '../models/CustomText';\nimport {ProductTypeEnum, SymbolType} from '../models/enums';\nimport {TextElement} from '../tool/TextElement';\nimport {TemplateText} from '../models/TemplateText';\nimport {TemplateClipart} from '../models/TemplateClipart';\nimport {CustomClipart} from '../models/CustomClipart';\nimport PaperCanvasService from '../services/PaperCanvasService';\nimport {ElementManager} from '../services/ElementManager';\nimport {TextPath} from '../models/TextPath';\nimport {SelectionManager} from '../services/SelectionManager';\nimport {CustomClipartRegion} from '../models/CustomClipartRegion';\nimport {TemplateClipartRegion} from '../models/TemplateClipartRegion';\nimport {ClipartRegion} from '../models/ClipartRegion';\nimport {ClipartElement} from '../tool/ClipartElement';\nimport {CustomUserFile} from '../models/CustomUserFile';\nimport {RasterElement} from '../tool/RasterElement';\nimport {CustomQRCode} from '../models/CustomQRCode';\nimport {SVGCanvasElement} from '../tool/SVGCanvasElement';\nimport {CustomMarketplace} from '../models/CustomMarketplace';\nimport {TemplateMarketplace} from '../models/TemplateMarketplace';\nimport {IEventDispatcher} from '../../../core/utils/IEventDispatcher';\nimport {BackgroundShapeElement} from '../tool/BackgroundShapeElement';\nimport {Collection} from '../../../core/models/Collection';\nimport {CustomShape} from '../models/CustomShape';\nimport {AdminMarketplaceArtworkRaster} from '../../../../../dashboard/ts/apps/marketplace/models/AdminMarketplaceArtworkRaster';\nimport {TemplateShape} from '../models/TemplateShape';\nimport {BaseElement} from '../tool/BaseElement';\nimport {SimplePromise} from '../../../core/utils/SimplePromise';\nimport {ResourceURI} from \"../../../core/models/helpers/ResourceURI\";\nimport {UserShape, UserShapeType} from \"../models/UserShape\";\nimport {UserShapeElement} from \"../tool/UserShapeElement\";\nimport {ShapeType} from \"../components/DesignTool/AddUserShape/AddUserShape.html\";\n\nexport interface IDesignToolService extends IEventDispatcher {\n    text_paths: APIResponse<TextPath>;\n    getProductColor: () => Color;\n    element_to_replace: any;\n    product_color_set: Collection<Color>;\n    colors_available: Collection<Color>;\n    addToolPromise: (promise: SimplePromise<any>) => void;\n    visible_row: number;\n}\n\nexport default class DesignToolElementFactory {\n    /*\n        Element creation is similar between the dashboard and storefront so in order to prevent code duplication,\n        the functionality for creating elements was moved to a factory that each tool configured.\n    */\n\n    product_service: IDesignToolService;\n    element_base: 'template'|'custom';\n    font_service: FontService;\n    canvas_service: PaperCanvasService;\n    element_manager: ElementManager;\n    selection_manager: SelectionManager;\n\n    promises: SimplePromise<unknown>[] = [];\n\n    text_model: typeof TemplateText | typeof CustomText;\n    clipart_model: typeof TemplateClipart | typeof CustomClipart;\n    region_model: typeof TemplateClipartRegion | typeof CustomClipartRegion;\n    base_key: 'base'|'product';\n    configured_key: 'configured'|'product';\n    marketplace_model: typeof TemplateMarketplace | typeof CustomMarketplace;\n\n    constructor(\n        product_service: IDesignToolService,\n        base_key: 'base'|'product',\n        configured_key: 'configured'|'product',\n        element_base: 'template'|'custom'\n    ) {\n        this.product_service = product_service;\n        this.element_base = element_base;\n        this.base_key = base_key;\n        this.configured_key = configured_key;\n\n        this.font_service = Services.get<FontService>('FontService');\n        this.canvas_service = Services.get<PaperCanvasService>('PaperCanvasService');\n        this.element_manager = Services.get<ElementManager>('ElementManager');\n        this.selection_manager = Services.get<SelectionManager>('SelectionManager')\n    }\n\n    get configured() {\n        return this.product_service[this.configured_key];\n    }\n\n    get base() {\n        return this.product_service[this.base_key];\n    }\n\n    assignTextModel(text_model: typeof TemplateText | typeof CustomText) {\n        this.text_model = text_model;\n    }\n\n    assignClipartModel(clipart_model: typeof TemplateClipart | typeof CustomClipart, region_model: typeof TemplateClipartRegion | typeof CustomClipartRegion) {\n        this.clipart_model = clipart_model;\n        this.region_model = region_model;\n    }\n\n    assignMarketplaceModel(marketplace_model: typeof TemplateMarketplace | typeof CustomMarketplace) {\n        this.marketplace_model = marketplace_model;\n    }\n\n    private validateColorOrDefault(item: null|string|Color): null|Color {\n        if (!item) {\n            if (this.base.type === ProductTypeEnum.CUTOUT) {\n                return this.product_service.getProductColor();\n            }\n\n            return this.product_service.colors_available.find(v => v.default) || this.product_service.colors_available[0];\n        }\n        else if (typeof item == 'string') {\n            return this.product_service.colors_available.getItemFromURI(item) || this.product_service.colors_available.find(v => v.default) || this.product_service.colors_available[0];\n        }\n        else if (item instanceof Color || (item && item['id'])) {\n            return this.product_service.colors_available.getItemFromID(item.id) || this.product_service.colors_available.find(v => v.default) || this.product_service.colors_available[0];\n        }\n\n        return item;\n    }\n\n    private validateFontOrDefault(item: null|string|Font): null|Font {\n        if (!item) {\n            return this.font_service.default_font;\n        }\n        else if (typeof item == 'string') {\n            if (this.font_service.fonts.items.getItemFromURI(item)) {\n                return this.font_service.fonts.items.getItemFromURI(item);\n            }\n            else {\n                let uri = new ResourceURI(item);\n                if (uri.id) {\n                    let font = Services.get<typeof Font>('Font').objects.get({id: uri.id});\n                    font.$promise.then(() => {\n                        font.load();\n                    });\n                    this.font_service.addActiveFont(font);\n                    return font;\n                }\n\n                // Shouldn't happen but let's catch it anyway\n                return this.font_service.default_font;\n            }\n        }\n        else if (item instanceof Font && this.font_service.fonts.items.getItemFromID(item.id)) {\n            return this.font_service.fonts.items.getItemFromID(item.id)\n        }\n\n        if (item instanceof Font) {\n            this.font_service.addActiveFont(item);\n        }\n\n        return item;\n    }\n\n    private copyDataForReplacement(element) {\n        element.x = this.product_service.element_to_replace.model.x;\n        element.y = this.product_service.element_to_replace.model.y;\n\n        // We might want to also try to fit the element width/height within the replacement element\n\n        this.product_service.element_to_replace.remove();\n    }\n\n    createUserShapeElement(config, add_to_configured=true, add_to_canvas=true): UserShape {\n        let shape_type = config.shape_type || UserShapeType.POLYGON;\n        let data = {\n            path: config.path,\n            x: config.x != null ? config.x : this.canvas_service.workspace.artboard.width / 2,\n            y: config.y != null ? config.y : this.canvas_service.workspace.artboard.height / 2,\n            z: config.z != null ? config.z : this.element_manager.nextZ,\n            width: config.width ? config.width : config.size ? null : this.canvas_service.workspace.artboard.width * 0.5,\n            height: config.height ? config.height : config.size ? null :this.canvas_service.workspace.artboard.height / (2 * 5),\n            rotation: config.rotation || 0,\n            x_scale_inverted: config.x_scale_inverted || false,\n            y_scale_inverted: config.y_scale_inverted || false,\n            maintain_proportion: shape_type == ShapeType.polygon,\n            color: config.color ? config.color : this.validateColorOrDefault(config.color),\n            custom_color: config.custom_color,\n            shape_type: shape_type,\n        }\n        data[this.element_base] = this.configured;\n\n        let shape = new (Services.get<typeof UserShape>('UserShape'))(data);\n\n        this.addUserShapeElement(shape, add_to_configured, add_to_canvas);\n\n        return shape;\n    }\n\n    addUserShapeElement(element: UserShape, add_to_configured=true, add_to_canvas=true) {\n        let shape_element = null;\n        if (add_to_canvas) {\n            let add_element = () => {\n                shape_element = new UserShapeElement(element);\n                shape_element.bind('remove', () => {\n                    let index = this.configured.user_shapes.indexOf(element);\n                    if (index != -1) {\n                        this.configured.user_shapes.splice(index, 1);\n                    }\n                    this.element_manager.remove(shape_element);\n                    if (this.selection_manager.selection == shape_element) {\n                        this.selection_manager.selection = null;\n                    }\n                }, this);\n\n                this.element_manager.add(shape_element);\n                this.selection_manager.select(shape_element);\n            }\n            let promises = element.unresolvedPromises()\n            if (promises.length == 0) {\n                add_element();\n            }\n            else {\n                this.pushPromise(SimplePromise.all(promises).then(add_element))\n            }\n        }\n\n        if (add_to_configured) {\n            // Dont allow duplicates, if one is needed create a clone and link models\n            if (this.configured.user_shapes.indexOf(element) == -1) {\n                this.configured.user_shapes.push(element);\n            }\n        }\n\n        return shape_element;\n    }\n\n    createTextElement(config, add_to_configured=true, add_to_canvas=true): CustomText|TemplateText {\n        if (!this.text_model) {\n            throw Error('The design tool factory requires a text element type to be assigned');\n        }\n\n        // Copy and validate data\n        let data = {\n            maintain_proportion: true,\n            text: config.text ? config.text : 'Custom Text',\n            font: this.validateFontOrDefault(config.font),\n            csv_data: config.csv_data ? [...config.csv_data] : [],\n            size: config.size ? config.size : 50,\n            color: config.color ? config.color : this.validateColorOrDefault(config.color),\n            custom_color: config.custom_color,\n            text_alignment: config.text_alignment,\n            path: config.path,\n            x: config.x != null ? config.x : this.canvas_service.workspace.artboard.width / 2,\n            y: config.y != null ? config.y : this.canvas_service.workspace.artboard.height / 2,\n            z: config.z != null ? config.z : this.element_manager.nextZ,\n            rotation: config.rotation || 0,\n            width: config.width ? config.width : config.size ? null : this.canvas_service.workspace.artboard.width * 0.5,\n            height: config.height ? config.height : config.size ? null :this.canvas_service.workspace.artboard.height / (2 * 5),\n            stroke_width: config.stroke_width ? config.stroke_width : 0,\n            stroke_color: config.stroke_color,\n            custom_stroke_color: config.custom_stroke_color,\n            symbol: config.symbol || SymbolType.NONE,\n            symbol_name: config.symbol_name,\n            symbol_range_start: config.symbol_range_start ? config.symbol_range_start : null,\n            symbol_range_end: config.symbol_range_end ? config.symbol_range_end : null,\n            dont_clip: config.dont_clip || false,\n            path_scale: config.path_scale || 1,\n            side: config.side,\n            x_scale_inverted: config.x_scale_inverted || false,\n            y_scale_inverted: config.y_scale_inverted || false,\n            offset_width: config.offset_width != null ? config.offset_width : 10,\n            selectable: config.selectable == null ? true : config.selectable,\n            can_remove: config.can_remove == null ? true : config.can_remove,\n            visible_item: this.product_service.visible_row || 0\n        }\n        data[this.element_base] = this.configured;\n\n        const custom_text = new this.text_model(data);\n\n        this.addTextElement(custom_text, add_to_configured, add_to_canvas);\n\n        return custom_text;\n    }\n\n    addTextElement(element: CustomText|TemplateText, add_to_configured=true, add_to_canvas=true) {\n        if (!element.custom_color) {\n            element.color = this.validateColorOrDefault(element.color);\n        }\n        element.font = this.validateFontOrDefault(element.font);\n\n        // Make sure template specific paths are available in the text path options\n        if (add_to_configured) {\n            this.configured.text_elements.push(element);\n\n            if (element.path) {\n                this.product_service.text_paths.$promise.then(() => {\n                    this.product_service.text_paths.items.push(element.path);\n                });\n            }\n        }\n\n        let text_element = null;\n        if (add_to_canvas) {\n            let add_element = () => {\n                text_element = new TextElement(element);\n                text_element.bind('remove', () => {\n                    let index = this.configured.text_elements.indexOf(element);\n                    if (index != -1) {\n                        this.configured.text_elements.splice(index, 1);\n                    }\n                    this.element_manager.remove(text_element);\n                    if (this.selection_manager.selection == text_element) {\n                        this.selection_manager.selection = null;\n                    }\n                }, this);\n\n                this.element_manager.add(text_element);\n                this.selection_manager.select(text_element);\n            }\n            let promises = element.unresolvedPromises()\n            if (promises.length == 0) {\n                add_element();\n            }\n            else {\n                this.pushPromise(SimplePromise.all(promises).then(add_element))\n            }\n        }\n\n        if (this.base.type === ProductTypeEnum.CUTOUT) {\n            element.color = this.product_service.getProductColor();\n        }\n\n        return text_element;\n    }\n\n    pushPromise(promise) {\n        this.promises.push(promise);\n        let remove = () => {\n            if (this.promises.indexOf(promise) !== -1){\n                this.promises.splice(this.promises.indexOf(promise), 1);\n            }\n        }\n        promise.then(remove, remove);\n    }\n\n    createClipartElement(config, add_to_configured=true, add_to_canvas=true): CustomClipart | TemplateClipart {\n        if (!this.clipart_model || !this.region_model) {\n            throw Error('The design tool factory requires a clipart element type to be assigned');\n        }\n\n        if ((!config.width || !config.height) && (config.clipart.width && config.clipart.height)) {\n            const maxWidth: number = this.canvas_service.workspace.artboard.width / 1.4;\n            const maxHeight: number = this.canvas_service.workspace.artboard.height / 1.4;\n\n            if (config.height && config.width) {\n                config.width = maxWidth;\n                config.height = maxWidth / config.clipart.width * config.clipart.height;\n\n                if (config.height > maxHeight) {\n                    config.width = maxHeight;\n                    config.height = maxHeight / config.clipart.height * config.clipart.width;\n                }\n            }\n        }\n\n        if (config.height > (this.canvas_service.workspace.artboard.height)) {\n            const ratio = (this.canvas_service.workspace.artboard.height) / config.height;\n            config.height = config.height * ratio;\n            config.width = config.width * ratio;\n        }\n        if (config.width > (this.canvas_service.workspace.artboard.width)) {\n            const ratio = (this.canvas_service.workspace.artboard.width) / config.width;\n            config.width = config.width * ratio;\n            config.height = config.height * ratio;\n        }\n\n        // Copy and validate data\n        const custom_clipart = new this.clipart_model({\n            clipart: config.clipart,\n            maintain_proportion: config.maintain_proportion != null ? config.maintain_proportion : true,\n            x_scale_inverted: config.x_scale_inverted != null ? config.x_scale_inverted : false,\n            y_scale_inverted: config.y_scale_inverted != null ? config.y_scale_inverted : false,\n            template_clipart: config.template_clipart,\n            x: config.x != null ? config.x : this.canvas_service.workspace.artboard.width / 2,\n            y: config.y != null ? config.y : this.canvas_service.workspace.artboard.height / 2,\n            z: config.z != null ? config.z : this.element_manager.nextZ,\n            rotation: config.rotation || 0,\n            width: config.width,\n            height: config.height,\n            can_remove: config.can_remove,\n            dont_clip: config.dont_clip,\n            side: config.side,\n            offset_width: config.offset_width != null ? config.offset_width : 10,\n            selectable: config.selectable == null ? true : config.selectable,\n        });\n\n        // Setup CustomClipartRegions from ClipartRegions &\n        // TemplateClipartRegions\n        if (config.clipart.regions) {\n            for (const region of config.clipart.regions) {\n                let template_region: TemplateClipartRegion = null;\n\n                if (config.regions) {\n                    // Try to find the TemplateRegion for the current region\n                    for (const tRegion of config.regions) {\n                        if (typeof tRegion.region === 'string' && tRegion.region === region.resource_uri) {\n                            template_region = tRegion;\n                        }\n                        else if (tRegion.region instanceof ClipartRegion && tRegion.region.id === region.id) {\n                            template_region = tRegion;\n                        }\n\n                        if (template_region)\n                            break;\n                    }\n                }\n\n                // Create the CustomClipartRegion\n                const custom_clipart_region = new this.region_model({\n                    region: region,\n                    stroke_width: (template_region ? template_region.stroke_width : region.stroke_width) || 0,\n                    use_material_colors: template_region ? template_region.use_material_colors : false,\n                });\n\n                // If we found a template region, use it's color rather than\n                // the default region color\n                const colorUri: string = template_region ? template_region.color : region.color;\n\n                // Make sure the clipart region is in the colorsAvailable collection\n                custom_clipart_region.color = this.validateColorOrDefault(colorUri);\n\n                custom_clipart_region.custom_color = region.custom_color;\n                custom_clipart.regions.push(custom_clipart_region as any);\n            }\n        }\n\n        this.addClipartElement(custom_clipart, add_to_configured, add_to_canvas);\n\n        return custom_clipart;\n    }\n\n    addClipartElement(element: CustomClipart | TemplateClipart, add_to_configured=true, add_to_canvas=true) {\n        if (this.product_service.element_to_replace) {\n            if (this.product_service.element_to_replace.model instanceof CustomClipart) {\n                this.copyDataForReplacement(element);\n                this.product_service.element_to_replace = null;\n            }\n            else {\n                this.product_service.element_to_replace = null;\n            }\n        }\n\n        if (add_to_configured) {\n            // Dont allow duplicates, if one is needed create a clone and link models\n            if (this.configured.clipart_elements.indexOf(element) == -1) {\n                this.configured.clipart_elements.push(element);\n            }\n        }\n\n        let clipart_element = null;\n        if (add_to_canvas) {\n            let add_element = () => {\n                clipart_element = new ClipartElement(element.clipart.clipart, element);\n\n                clipart_element.bind('remove', () => {\n                    let index = this.configured.clipart_elements.indexOf(element);\n                    if (index != -1) {\n                        this.configured.clipart_elements.splice(index, 1);\n                    }\n                    this.element_manager.remove(clipart_element);\n                    if (this.selection_manager.selection == clipart_element) {\n                        this.selection_manager.selection = null;\n                    }\n                }, this);\n\n                this.element_manager.add(clipart_element);\n                this.selection_manager.select(clipart_element);\n            }\n            let promises = element.unresolvedPromises()\n            if (promises.length == 0) {\n                add_element();\n            }\n            else {\n                this.pushPromise(SimplePromise.all(promises).then(add_element));\n            }\n        }\n\n        if (this.base.type === ProductTypeEnum.CUTOUT) {\n            for (const region of element.regions) {\n                region.color = this.configured.material_color;\n            }\n        }\n\n        return clipart_element;\n    }\n\n    createUserFileElement(config, add_to_configured=true, add_to_canvas=true): CustomUserFile {\n        const CustomUserFileModel = Services.get<typeof CustomUserFile>('CustomUserFile');\n\n        // Copy and validate data\n        const custom_user_file = new CustomUserFileModel({\n            maintain_proportion: true,\n            user_file: config.user_file,\n            x: config.x != null ? config.x : this.canvas_service.workspace.artboard.width / 2,\n            y: config.y != null ? config.y : this.canvas_service.workspace.artboard.height / 2,\n            z: config.z != null ? config.z : this.element_manager.nextZ,\n            rotation: config.rotation || 0,\n            width: config.width,\n            height: config.height,\n            x_scale_inverted: config.x_scale_inverted || false,\n            y_scale_inverted: config.y_scale_inverted || false,\n            side: config.side,\n            offset_width: config.offset_width != null ? config.offset_width : 10\n        });\n\n        this.addUserFileElement(custom_user_file, add_to_configured, add_to_canvas);\n\n        return custom_user_file;\n    }\n\n    addUserFileElement(element, add_to_configured=true, add_to_canvas=true) {\n        if (this.product_service.element_to_replace) {\n            if (this.product_service.element_to_replace.model instanceof CustomUserFile) {\n                this.copyDataForReplacement(element);\n                this.product_service.element_to_replace = null;\n            }\n            else {\n                this.product_service.element_to_replace = null;\n            }\n        }\n\n        if (add_to_configured) {\n            // Dont allow duplicates, if one is needed create a clone and link models\n            if (this.configured.upload_elements.indexOf(element) == -1) {\n                this.configured.upload_elements.push(element);\n            }\n        }\n\n        let upload_element = null;\n        if (add_to_canvas) {\n            let add_element = () => {\n                upload_element = new RasterElement(element.user_file.raster, element);\n\n                upload_element.bind('remove', () => {\n                    let index = this.configured.upload_elements.indexOf(element);\n                    if (index != -1) {\n                        this.configured.upload_elements.splice(index, 1);\n                    }\n                    this.element_manager.remove(upload_element);\n                    if (this.selection_manager.selection == upload_element) {\n                        this.selection_manager.selection = null;\n                    }\n                }, this);\n\n                this.element_manager.add(upload_element);\n                this.selection_manager.select(upload_element);\n            }\n            let promises = element.unresolvedPromises()\n            if (promises.length == 0) {\n                add_element();\n            }\n            else {\n                SimplePromise.all(promises).then(add_element);\n            }\n        }\n\n        return upload_element;\n    }\n\n    createQRCodeElement(config, add_to_configured=true, add_to_canvas=true): CustomQRCode {\n        const CustomQRCodeModel = Services.get<typeof CustomQRCode>('CustomQRCode');\n\n        let variable_data = config.variable_data as any[];\n        if (variable_data) {\n            variable_data = variable_data.map(v => {return {...v}});\n        }\n        else {\n            variable_data = []\n        }\n\n        // Copy and validate data\n        const custom_qr_code = new CustomQRCodeModel({\n            maintain_proportion: true,\n            qrcode: config.qrcode,\n            x: config.x != null ? config.x : this.canvas_service.workspace.artboard.width / 2,\n            y: config.y != null ? config.y : this.canvas_service.workspace.artboard.height / 2,\n            z: config.z != null ? config.z : this.element_manager.nextZ,\n            rotation: config.rotation || 0,\n            width: config.width,\n            height: config.height,\n            dont_clip: config.dont_clip || false,\n            side: config.side,\n            offset_width: config.offset_width != null ? config.offset_width : 10,\n            symbol: config.symbol || SymbolType.NONE,\n            variable_data: variable_data,\n            visible_item: this.product_service.visible_row || 0\n        });\n\n        this.addQRCodeElement(custom_qr_code, add_to_configured, add_to_canvas);\n\n        return custom_qr_code;\n    }\n\n    addQRCodeElement(element: CustomQRCode, add_to_configured=true, add_to_canvas=true) {\n        if (add_to_configured) {\n            // Dont allow duplicates, if one is needed create a clone and link models\n            if (this.configured.qrcode_elements.indexOf(element) == -1) {\n                this.configured.qrcode_elements.push(element);\n            }\n        }\n\n        let qr_element = null;\n        if (add_to_canvas) {\n            let add_element = () => {\n                qr_element = new SVGCanvasElement( `/custom/api/v1/qr-clipart/${element.qrcode.id}.svg`, element);\n                qr_element.bind('remove', () => {\n                    let index = this.configured.qrcode_elements.indexOf(element);\n                    if (index != -1) {\n                        this.configured.qrcode_elements.splice(index, 1);\n                    }\n                    this.element_manager.remove(qr_element);\n                    if (this.selection_manager.selection == qr_element) {\n                        this.selection_manager.selection = null;\n                    }\n                }, this);\n\n                this.element_manager.add(qr_element);\n                this.selection_manager.select(qr_element);\n            }\n            let promises = element.unresolvedPromises()\n            if (promises.length == 0) {\n                add_element();\n            }\n            else {\n                this.pushPromise(SimplePromise.all(promises).then(add_element));\n            }\n        }\n        return qr_element;\n    }\n\n    createMarketplaceElement(config, add_to_configured=true, add_to_canvas=true) {\n        let data = {\n            artwork: config.artwork,\n            x: config.x != null ? config.x : this.canvas_service.workspace.artboard.width / 2,\n            y: config.y != null ? config.y : this.canvas_service.workspace.artboard.height / 2,\n            z: config.z != null ? config.z : this.element_manager.nextZ,\n            width: config.width,\n            height: config.height,\n            rotation: config.rotation,\n            maintain_proportion: config.maintain_proportion,\n            can_remove: config.can_remove,\n            dpi: config.dpi,\n            side: config.side,\n            dont_clip: config.dont_clip,\n            offset_width: config.offset_width != null ? config.offset_width : 10\n        }\n        data[this.element_base] = this.configured;\n\n        // We should copy the items similar to the other methods\n        const marketplace_element = new this.marketplace_model(data);\n\n        this.addMarketplaceElement(marketplace_element, add_to_configured, add_to_canvas);\n\n        return marketplace_element;\n    }\n\n    addMarketplaceElement(element: CustomMarketplace, add_to_configured=true, add_to_canvas=true) {\n        if (add_to_configured) {\n            // Don't allow duplicates, if one is needed, create a clone and link models\n            if (this.configured.marketplace_elements.indexOf(element) == -1) {\n                this.configured.marketplace_elements.push(element);\n            }\n        }\n\n        let marketplace_element = null;\n        if (add_to_canvas) {\n            let add_element = () => {\n                marketplace_element = new RasterElement(element.raster, element);\n                marketplace_element.bind('remove', () => {\n                    let index = this.configured.marketplace_elements.indexOf(element);\n                    if (index != -1) {\n                        this.configured.marketplace_elements.splice(index, 1);\n                    }\n                    this.element_manager.remove(marketplace_element);\n                    if (this.selection_manager.selection == marketplace_element) {\n                        this.selection_manager.selection = null;\n                    }\n                    this.product_service.trigger('license-check');\n                }, this);\n                this.element_manager.add(marketplace_element);\n                this.selection_manager.select(marketplace_element);\n            }\n            let promises = element.unresolvedPromises()\n            if (promises.length == 0) {\n                add_element();\n            }\n            else {\n                this.pushPromise(SimplePromise.all(promises).then(add_element));\n            }\n        }\n\n        this.product_service.trigger('license-check');\n\n        return marketplace_element;\n    }\n\n    setupShapeElement(shape: CustomShape | TemplateShape | AdminMarketplaceArtworkRaster): BackgroundShapeElement {\n        if (shape instanceof CustomShape) {\n            if (this.element_manager.allShapeElements.find(v => v.model.template_shape?.id == shape.template_shape.id)) {\n                return;\n            }\n        }\n\n        // Create the shape element and add it to the element manager\n        const shape_element = new BackgroundShapeElement(shape, true);\n        this.element_manager.add(shape_element);\n\n        shape_element.updatePaper();\n\n        return shape_element;\n    }\n\n    addElement(element: CustomText|CustomClipart|CustomUserFile|CustomMarketplace): BaseElement {\n        if (element instanceof CustomText || element instanceof TemplateText) {\n            return this.addTextElement(element);\n        }\n        if (element instanceof CustomClipart || element instanceof TemplateClipart) {\n            return this.addClipartElement(element);\n        }\n        if (element instanceof CustomUserFile) {\n            return this.addUserFileElement(element);\n        }\n        if (element instanceof CustomMarketplace) {\n            return this.addMarketplaceElement(element);\n        }\n    }\n}\n","import CustomService from './CustomService';\nimport {ClipartCategory} from '../models/ClipartCategory';\nimport APIResponse from '../../../core/models/APIResponse';\nimport {Services} from '../../../core/services/Services';\nimport {CodeType, QRCode} from '../models/QRCode';\nimport RouteService from '../../../core/services/RouteService';\nimport {ElementManager} from './ElementManager';\nimport PaperCanvasService from './PaperCanvasService';\nimport {SelectionManager} from './SelectionManager';\nimport {fitToArea, getClosestQuarter, wait} from '../../../core/utils/utils';\nimport {Clipart} from '../models/Clipart';\nimport {CustomText} from '../models/CustomText';\nimport {CustomClipart} from '../models/CustomClipart';\nimport {CustomUserFile} from '../models/CustomUserFile';\nimport {CustomQRCode} from '../models/CustomQRCode';\nimport {TextPath} from '../models/TextPath';\nimport {ProductTypeEnum, SymbolType, ToolTypeEnum} from '../models/enums';\nimport {CustomClipartRegion} from '../models/CustomClipartRegion';\nimport {ClipartElement} from '../tool/ClipartElement';\nimport {RasterElement} from '../tool/RasterElement';\nimport {CustomMarketplace} from '../models/CustomMarketplace';\nimport {ClipMaskElement} from '../tool/ClipMaskElement';\nimport {UserFile} from '../models/UserFile';\nimport {CustomClipMask} from '../models/CustomClipMask';\nimport {BackgroundShapeElement} from '../tool/BackgroundShapeElement';\nimport {FontService} from './FontService';\nimport {Color} from '../models/Color';\nimport {CustomOption} from '../models/CustomOption';\nimport Company from '../../../core/services/Company';\nimport {SimplePromise} from '../../../core/utils/SimplePromise';\nimport {MarketplaceArtwork} from '../../marketplace/models/MarketplaceArtwork';\nimport DesignToolElementFactory from '../helpers/DesignToolElementFactory';\nimport {CustomShape} from '../models/CustomShape';\nimport {Field} from '../../../core/models/fields/Field';\nimport {ToolStateService} from './ToolStateService';\nimport {CustomDesignContent} from '../models/CustomDesignContent';\nimport {UserShapeElement} from \"../tool/UserShapeElement\";\nimport {UserShape} from \"../models/UserShape\";\n\n/*\n    CustomEditorService\n\n    This adds on functionality onto the CustomService in order to support the design tool.\n\n    Do not use or import paper here, all of that should be in the PaperCanvasService.\n */\nexport default class CustomEditorService extends CustomService {\n    public clipart_categories: APIResponse<ClipartCategory>;\n    public clip_mask_elements: APIResponse<Clipart>;\n    public text_paths: APIResponse<TextPath>;\n    public visible_row = 0;\n\n    public text_size_too_small: boolean; // was textTooSmall\n    public element_to_replace: any;\n\n    protected element_manager: ElementManager;\n    protected canvas_service: PaperCanvasService;\n    protected selection_manager: SelectionManager;\n    protected font_service: FontService;\n    protected state_service: ToolStateService;\n    public tool_factory: DesignToolElementFactory;\n\n    // Used if a text element is too small\n    public recommended_text_width: number;\n    public recommended_text_height: number;\n\n    public fetch_masks: boolean = true;\n    public show_size_change_warning = true;\n    public allow_autosize_artboard: boolean = true;\n\n    public tool_promises = [];\n\n    public add_variable_data_file;\n    public add_variable_data_callback;\n\n    constructor() {\n        super();\n\n        this.element_manager = Services.get<ElementManager>('ElementManager');\n        this.canvas_service = Services.get<PaperCanvasService>('PaperCanvasService');\n        this.selection_manager = Services.get<SelectionManager>('SelectionManager');\n        this.font_service = Services.get<FontService>('FontService');\n        this.state_service = Services.get<ToolStateService>('ToolStateService');\n\n        this.tool_factory = new DesignToolElementFactory(this, 'base', 'configured', 'custom');\n        this.tool_factory.assignTextModel(Services.get<typeof CustomText>('CustomText'));\n        this.tool_factory.assignClipartModel(Services.get<typeof CustomClipart>('CustomClipart'), Services.get<typeof CustomClipartRegion>('CustomClipartRegion'));\n        this.tool_factory.assignMarketplaceModel(Services.get<typeof CustomMarketplace>('CustomMarketplace'));\n    }\n\n    override setupExtraData(all_data: any): void {\n        // Preload clipart categories for the add clipart search system\n        this.clipart_categories = Services.get<typeof ClipartCategory>('ClipartCategory').objects.all();\n\n        if (this.fetch_masks) {\n            this.clip_mask_elements = Services.get<typeof Clipart>('Clipart').objects.filter({category__slug:'public-clipping-masks'});\n        }\n\n        // Load fonts and then make sure all text elements are drawn\n        this.font_service = Services.get<FontService>('FontService');\n        this.font_service.fetchFonts();\n\n        // Load default text paths\n        this.text_paths = Services.get<typeof TextPath>('TextPath').objects.filter({\n            display: true\n        });\n    }\n\n    override designHasVariableData() {\n        return this.configured.variable_data;\n    }\n\n    override setupFromProduct(base, configured, depth=0): void {\n        // Recursive safety in case something keeps regenerating promises\n        if (depth > 100) {\n            console.error('Unable to resolve all promises before configuring product: max depth error');\n            this.setupConfiguredFromBase();\n            return;\n        }\n\n        this.base = base;\n        this.configured = configured;\n        let promises = [...this.base.unresolvedPromises(), ...this.configured.unresolvedPromises()]\n        if (promises.length > 0) {\n            SimplePromise.all(promises).then(() => {\n                this.setupFromProduct(base, configured, depth + 1);\n            })\n        }\n        else {\n            this.setupConfiguredFromBase();\n        }\n    }\n\n    override setupConfiguredFromBase(needs_additional_setup=false) {\n        super.setupConfiguredFromBase(true);\n\n        this.canvas_service.offset_path_enabled = this.base.offset_path;\n        this.canvas_service.overlay_sides = this.base.overlay_sides;\n        this.canvas_service.fixed_texture_position = this.base.fixed_texture_position;\n\n        this.size_adjusted = false;\n\n        this.setup_complete.then(() => {\n            const route_service = Services.get<RouteService>('RouteService');\n            if (route_service.current.params.get('qr_id')) {\n                const qrcode = route_service.current.params.get('qr_id');\n                // Once all the items have been loaded\n                this.once('templateClipartCreated', () => {\n                    const qr = QRCode.objects.get({id: qrcode});\n                    qr.$promise.then(() => {\n                        this.setupQRCodeReplacement(qr);\n                    });\n                }, this);\n            }\n\n            // Try to load color form uri\n            const loadColor: number = parseInt(route_service.current.params.get('color'));\n            if (loadColor) {\n                if (this.base.show_material_color) {\n                    this.configured.material_color = this.configured.material.material_colors.getItemFromID(loadColor);\n                }\n                else {\n                    this.configured.material_color = this.configured.material.design_colors.getItemFromID(loadColor);\n                }\n\n                this.checkMaterialColor();\n            }\n\n            const loadClipart: number = parseInt(route_service.current.params.get('load_clipart'));\n            if (loadClipart) {\n                const maxWidth = this.canvas_service.workspace.artboard.width / 1.5;\n                const maxHeight = this.canvas_service.workspace.artboard.height / 1.5;\n                const clipart: Clipart = Services.get<typeof Clipart>('Clipart').objects.get({\n                    id: loadClipart\n                });\n                clipart.$promise.then(() => {\n                    let clipartWidth: number = maxWidth;\n                    let clipartHeight: number = maxWidth / clipart.width * clipart.height;\n\n                    if (clipartHeight > maxHeight) {\n                        clipartHeight = maxHeight;\n                        clipartWidth = maxHeight / clipart.height * clipart.width;\n                    }\n\n                    this.createClipartElement({\n                        name: clipart.name,\n                        clipart: clipart,\n                        selectable: true,\n                        width: clipartWidth,\n                        height: clipartHeight,\n                        x: this.canvas_service.workspace.artboard.width / 2,\n                        y: this.canvas_service.workspace.artboard.height / 2,\n                        z: this.element_manager.nextZ,\n                        maintain_proportion: true\n                    });\n                });\n            }\n\n            const loadArtwork: number = parseInt(route_service.current.params.get('load_artwork'));\n            if (loadArtwork) {\n                const artwork: MarketplaceArtwork = Services.get<typeof MarketplaceArtwork>('MarketplaceArtwork').objects.get({\n                    id: loadArtwork\n                });\n                artwork.$promise.then(() => {\n                    this.createMarketplaceElement({\n                        name: artwork.name,\n                        artwork: artwork,\n                        selectable: true,\n                        x: this.canvas_service.workspace.artboard.width / 2,\n                        y: this.canvas_service.workspace.artboard.height / 2,\n                        z: this.element_manager.nextZ,\n                        maintain_proportion: true\n                    }, true);\n                });\n            }\n\n            const width: number = Number(route_service.current.params.get('width'));\n            if (width) {\n                this.configured.width = width;\n            }\n            const height: number = Number(route_service.current.params.get('height'));\n            if (width) {\n                this.configured.height = height;\n            }\n            const material_id: number = parseInt(route_service.current.params.get('material'));\n            if (material_id) {\n                let material = this.base.materials.getItemFromID(material_id);\n                if (material) {\n                    this.configured.material = material;\n                }\n            }\n            const color_id: number = parseInt(route_service.current.params.get('color'));\n            if (color_id && this.base.type == ProductTypeEnum.CUTOUT) {\n                let color = this.colors_available.getItemFromID(color_id);\n                if (color) {\n                    this.configured.material_color = color;\n                }\n                else {\n                    // The materials may not match up due to price table differences, but the colors should\n                    for (const material of this.base.materials) {\n                        let color = material.design_colors.getItemFromID(color_id);\n                        if (color) {\n                            this.configured.material = material;\n                            this.configured.material_color = color;\n                        }\n                    }\n                }\n            }\n\n            this.canvas_service.setCanvasSizeFromDesign();\n\n            // Bug fix for firefox. The browser does not calculate the correct size when the tool is loading\n            setTimeout(() => {\n                this.updateCanvasWorkspace()\n            });\n\n            Services.resolve('design-tool-loaded');\n        });\n\n        this.setupArtboard();\n\n        if (this.base.type == ProductTypeEnum.CUTOUT) {\n\n            // Update the colors of all elements\n            this.configured.bind('change:material_color', this.updateElementColorsFromConfigured.bind(this), this);\n\n            let color;\n            if (this.configured.material_color) {\n                color = this.configured.material_color;\n            }\n            else if (this.base.cut_out_color) {\n                color = this.base.cut_out_color\n            }\n\n            if (!color) {\n                this.checkMaterialColor();\n            }\n\n            this.configured.material_color = color;\n\n        }\n\n        this.configured.bind('change:material_color', this.updateColorSets.bind(this), this);\n        if (!this.configured.id || this.configured.configure) {\n            this.setupCustomElementsFromTemplate().then(() => {\n                this.setupToolElementsFromConfigured().then(() => {\n                    this.configured.configure = false;\n                    this.canvas_service.postLoadSetup();\n                    this.setup_complete_deferred.resolve();\n                });\n            });\n        }\n        else {\n            this.setupToolElementsFromConfigured().then(() => {\n                this.canvas_service.postLoadSetup();\n                this.setup_complete_deferred.resolve();\n            });\n        }\n\n        this.setup_complete.then(() => {\n            this.bind('license-check', this.checkLicense.bind(this), this);\n            this.element_manager.bind('elementRemoved', this.checkSides.bind(this), this);\n            this.element_manager.bind('elementAdded', this.checkSides.bind(this), this);\n        })\n\n        if (this.base.offset_path_uses_material_color) {\n            let update_path_color = () => {\n                this.configured.offset_path_fill_color = this.configured.material_color;\n                if (this.configured.offset_path_fill_color) {\n                    this.canvas_service.offset_path_color = `#${this.configured.offset_path_fill_color.code}`;\n\n                    if (this.configured.offset_path_fill_color.texture) {\n                        this.canvas_service.offset_path_texture = this.configured.offset_path_fill_color.texture;\n                    }\n                }\n            }\n\n            update_path_color()\n            this.configured.bind('change:material_color', update_path_color, this);\n        }\n\n        if (this.configured.offset_path_fill_color) {\n            this.canvas_service.offset_path_color = `#${this.configured.offset_path_fill_color.code}`;\n            if (this.configured.offset_path_fill_color.texture) {\n                this.canvas_service.offset_path_texture = this.configured.offset_path_fill_color.texture;\n            }\n        }\n\n        this.configured.bind('change:material_color', this.updateCanvasBackgroundColor.bind(this), this);\n        this.configured.bind('change:material_color', this.setupMaterialRegions.bind(this), this);\n        this.configured.bind('change:material', this.checkReverseCutOption.bind(this), this);\n        this.updateCanvasBackgroundColor();\n\n        this.bind('change:size', this.updateCanvas.bind(this), this);\n    }\n\n    addToolPromise(promise: SimplePromise<any>): void {\n        this.tool_promises.push(promise);\n\n        let done = () => {\n            if (this.tool_promises.indexOf(promise) != -1) {\n                this.tool_promises.splice(this.tool_promises.indexOf(promise), 1);\n            }\n        }\n\n        promise.then(done, done);\n    }\n\n    public override checkSharedShapeSides(shape: CustomShape) {\n        if (!shape.template_shape.share_attributes || !shape.template_shape.tag) {\n            return;\n        }\n\n        let current_side = this.canvas_service.active_side;\n\n        let matching_shapes = this.base.template_shapes.filter(\n            v => v.share_attributes && v.tag == shape.template_shape.tag\n        );\n\n        for (const template_shape of matching_shapes) {\n            let matching_side = this.configured.custom_shapes.find(v => v.template_shape.side?.id == template_shape.side?.id);\n\n            if (matching_side.template_shape.id == template_shape.id) {\n                continue;\n            }\n\n            this.configured.custom_shapes.splice(this.configured.custom_shapes.indexOf(matching_side), 1);\n            matching_side.trigger('remove');\n\n            let custom_shape = new (Services.get<typeof CustomShape>('CustomShape'))();\n            custom_shape.template_shape = template_shape;\n            custom_shape.bindToConfigured(this.configured);\n            custom_shape.loadDefaultsFromTemplate(matching_side.carryOverData());\n\n            this.configured.custom_shapes.push(custom_shape);\n            this.setupShapeElement(custom_shape);\n        }\n\n        this.canvas_service.trigger('design-change');\n        this.canvas_service.loadSide(current_side);\n    }\n\n    updateCanvasBackgroundColor() {\n        if (this.configured.material_color && this.configured.material_color.background_color) {\n            this.canvas_service.setCanvasBackgroundColorOverride(`#${this.configured.material_color.background_color}`);\n        }\n        else {\n            this.canvas_service.setCanvasBackgroundColorOverride(null);\n        }\n    }\n\n    /*\n        Setup Tool Elements From Configured\n\n        This will take all the design tool element models form the configured object add them to the design tool.\n     */\n    async setupToolElementsFromConfigured() {\n        // We must wait for paper and the canvas to finish loading first\n        await this.canvas_service.setup_complete;\n        await this.font_service.fonts.$promise;\n\n        for (const shape of this.configured.custom_shapes) {\n            this.setupShapeElement(shape);\n        }\n\n        let isMasked = (element) => {\n            for (const clip_mask of this.configured.clip_mask_elements) {\n                if (clip_mask.element.resource_uri == element.resource_uri) {\n                    return true;\n                }\n                if (clip_mask.mask.resource_uri == element.resource_uri) {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        let clipart_promises = []\n        for (const customClipart of this.configured.clipart_elements) {\n            if (isMasked(customClipart)) {\n                continue;\n            }\n\n            customClipart.clipart.$promise.then(() => {\n                this.addClipartElement(customClipart, false, true);\n            });\n            clipart_promises.push(customClipart.clipart.$promise);\n\n            // Immutable background element, if the color is changed then we need to flag for multi side design fee\n            if (!customClipart.selectable && !customClipart.can_remove) {\n                for (const region of customClipart.regions) {\n                    region.bind('change', this.checkSides.bind(this), this);\n                }\n            }\n        }\n\n        Promise.all(clipart_promises).then(() => {\n            this.trigger('templateClipartCreated');\n        })\n\n        // Text elements\n        for (const customText of this.configured.text_elements) {\n            if (isMasked(customText)) {\n                continue;\n            }\n            this.addTextElement(customText, false, true);\n        }\n        this.trigger('templateTextCreated');\n\n        // Upload elements\n        for (const customUserFile of this.configured.upload_elements) {\n            if (isMasked(customUserFile)) {\n                continue;\n            }\n            this.addUserFileElement(customUserFile, false, true);\n        }\n\n        for (const qrElement of this.configured.qrcode_elements) {\n            if (isMasked(qrElement)) {\n                continue;\n            }\n            this.addQRCodeElement(qrElement, false, true);\n        }\n\n        for (const marketplaceElement of this.configured.marketplace_elements) {\n            if (isMasked(marketplaceElement)) {\n                continue;\n            }\n            this.addMarketplaceElement(marketplaceElement, false, true);\n        }\n\n        for (const user_shape of this.configured.user_shapes) {\n            this.addUserShapeElement(user_shape, false, true);\n        }\n\n        for (const item of this.configured.clip_mask_elements) {\n            this.addClipMaskElement(item, false, true);\n        }\n\n        for (const item of this.configured.custom_shapes) {\n            this.setupShapeElement(item);\n        }\n\n        // If single color, force all new elements to use the configured color\n        this.updateElementColorsFromConfigured();\n\n        if (this.tool_factory.promises.length > 0) {\n            console.warn('The design was not fully loaded in the initial request.')\n            await SimplePromise.all(this.tool_factory.promises);\n        }\n    }\n\n    /*\n        Setup Custom Elements From Template\n\n        This will convert all the template elements (text, upload, clipart, ect) to custom elements.\n\n        This will not add them to the design tool, that should be done in setupToolElementsFromConfigured.\n     */\n    async setupCustomElementsFromTemplate() {\n        await this.canvas_service.setup_complete;\n        await this.font_service.fonts.$promise;\n\n        if (!this.configured.configure) {\n            return;\n        }\n\n        this.configured.configure = false;\n\n        if (this.base.clipart_elements) {\n            for (const templateClipart of this.base.clipart_elements) {\n                this.createClipartElement(templateClipart, true, false);\n            }\n            this.setupMaterialRegions();\n            this.trigger('templateClipartCreated');\n        }\n\n        if (this.base.text_elements) {\n            for (const t of this.base.text_elements) {\n                let element = this.createTextElement(t, true, false);\n                if (element.symbol == SymbolType.NUMBER_RANGE && element.symbol_range_end && this.configured.getField<Field>('quantity').initial_value) {\n                    let regex = /[0-9]+/g;\n                    let result = element.symbol_range_end.match(regex)\n                    if (result && result.length > 0) {\n                        // Pad the value with zeros to match the length so we get A-0001 instead of A-1\n                        let new_range_end = `${this.configured.getField<Field>('quantity').initial_value}`;\n                        if (result[0].length > new_range_end.length) {\n                            for (let i = 0; i <= result[0].length - new_range_end.length; i++) {\n                                new_range_end = '0' + new_range_end\n                            }\n                        }\n                        element.symbol_range_end = element.symbol_range_end.replace(result[0], new_range_end);\n                    }\n                }\n            }\n            this.trigger('templateTextCreated');\n        }\n\n        if (this.base.marketplace_elements) {\n            for (const templateMarketplace of this.base.marketplace_elements) {\n                this.createMarketplaceElement(templateMarketplace, true, false);\n            }\n        }\n    }\n\n    swapToTemplate(id) {\n        let template = this.base_class.objects.get({id: id});\n\n        template.$promise.then(() => {\n            this.setup_complete_deferred = SimplePromise.defer<void>();\n            this.setup_complete = this.setup_complete_deferred.promise;\n\n            template.text_elements.length = 0;\n\n            this.base = template;\n            this.configured[this.base_key] = template;\n\n            for (const element of this.element_manager.allBackgroundClipartElements) {\n                element.remove();\n            }\n\n            let text_elements = [];\n            for (const element of this.element_manager.textElements) {\n                element.softRemove();\n\n                text_elements.push(element.model);\n            }\n            let clipart_elements = [];\n            for (const element of this.element_manager.clipartElements) {\n                element.softRemove();\n\n                clipart_elements.push(element.model);\n            }\n\n            this.setup_complete.then(() => {\n                for (const element of this.element_manager.elements) {\n                    if (element.isImmutable()) {\n                        continue;\n                    }\n\n                    element.remove();\n                }\n\n                for (const element of text_elements) {\n                    this.addTextElement(element, false, true);\n                }\n                for (const element of clipart_elements) {\n                    this.addClipartElement(element, false, true);\n                }\n            });\n\n            this.setupConfiguredFromBase();\n            this.setupArtboard();\n        });\n    }\n\n    async setupArtboard() {\n        await this.canvas_service.setup_complete;\n\n        this.canvas_service.setupCanvas();\n        this.canvas_service.setupWorkspace();\n\n        this.updateCanvasWorkspace();\n    }\n\n    updateCanvasWorkspace() {\n        this.canvas_service.max_canvas_width = null;\n        this.canvas_service.max_canvas_height = null;\n\n        if (this.base.canvas_width && this.base.canvas_height) {\n            this.canvas_service.updateWorkspace(this.base.canvas_width, this.base.canvas_height);\n        }\n        else {\n            if (this.allow_autosize_artboard) {\n                this.canvas_service.autosize_artboard = true;\n            }\n            this.canvas_service.updateWorkspace(this.canvas_service.maxCanvasWidth(), this.canvas_service.maxCanvasHeight());\n        }\n    }\n\n    public setupQRCodeReplacement(qr){\n        const placeholderLabel = 'qr-placeholder';\n\n        const customQRCodeModel = Services.get<typeof CustomQRCode>('CustomQRCode');\n        const customQRCode: CustomQRCode = new customQRCodeModel({\n            qrcode: qr\n        });\n\n        let found: boolean = false;\n\n        // Find and remove the qr placeholder from the PaperService\n        this.configured.clipart_elements.some((item) => {\n           if (item.clipart.name === placeholderLabel) {\n\n               // Copy all base template data over to the custom qr code item\n               customQRCode.copy(item);\n               customQRCode.qrcode = qr;\n\n               item.remove();\n               found = true;\n\n               return true;\n           }\n\n           return false;\n        });\n\n        // Find and remove the element from the element manager\n        this.element_manager.elements.some((element) => {\n            if (element.model.label === placeholderLabel) {\n                element.remove();\n\n                return true;\n            }\n\n            return false;\n        });\n\n        customQRCode.maintain_proportion = true;\n\n        const element = this.createQRCodeElement(customQRCode, true, true);\n\n        if (!found) {\n            this.selection_manager.selection.centerHorizontally();\n            this.selection_manager.selection.centerVertically();\n        }\n\n        this.element_manager.moveElementToTop(element);\n    }\n\n    public checkReverseCutOption() {\n        if (this.base.type == ProductTypeEnum.CUTOUT) {\n            if (this.configured.option_reverse_cut) {\n                if (!this.configured.material.reversible) {\n                    this.configured.option_reverse_cut = false;\n                }\n            }\n        }\n    }\n\n    setupMaterialRegions() {\n        if (!this.configured.material_color) {\n            return\n        }\n\n        // todo add check for single color\n\n        for (const clipart of this.configured.clipart_elements) {\n            for (const region of clipart.regions) {\n                if (region.use_material_colors) {\n                    region.color = this.configured.material_color;\n                }\n            }\n        }\n    }\n\n    getProductColor(): Color {\n        return this.configured.material_color;\n    }\n\n    createTextElement(config, add_to_configured=true, add_to_canvas=true): CustomText {\n        return this.tool_factory.createTextElement(config, add_to_configured, add_to_canvas) as CustomText;\n    }\n\n    addTextElement(element: CustomText, add_to_configured=true, add_to_canvas=true) {\n        return this.tool_factory.addTextElement(element, add_to_configured, add_to_canvas);\n    }\n\n    createClipartElement(config, add_to_configured=true, add_to_canvas=true): CustomClipart {\n        return this.tool_factory.createClipartElement(config, add_to_configured, add_to_canvas) as CustomClipart;\n    }\n\n    addClipartElement(element: CustomClipart, add_to_configured=true, add_to_canvas=true) {\n        return this.tool_factory.addClipartElement(element, add_to_configured, add_to_canvas);\n    }\n\n    createUserFileElement(config, add_to_configured=true, add_to_canvas=true): CustomUserFile {\n        return this.tool_factory.createUserFileElement(config, add_to_configured, add_to_canvas);\n    }\n\n    addUserFileElement(element: CustomUserFile, add_to_configured=true, add_to_canvas=true) {\n        return this.tool_factory.addUserFileElement(element, add_to_configured, add_to_canvas);\n    }\n\n    createQRCodeElement(config, add_to_configured=true, add_to_canvas=true): CustomQRCode {\n        return this.tool_factory.createQRCodeElement(config, add_to_configured, add_to_canvas);\n    }\n\n    addQRCodeElement(element: CustomQRCode, add_to_configured=true, add_to_canvas=true) {\n        return this.tool_factory.addQRCodeElement(element, add_to_configured, add_to_canvas);\n    }\n\n    createMarketplaceElement(config, add_to_configured=true, add_to_canvas=true): CustomMarketplace {\n        return this.tool_factory.createMarketplaceElement(config, add_to_configured, add_to_canvas) as CustomMarketplace;\n    }\n\n    addMarketplaceElement(element: CustomMarketplace, add_to_configured=true, add_to_canvas=true) {\n        return this.tool_factory.addMarketplaceElement(element, add_to_configured, add_to_canvas);\n    }\n\n    createUserShapeElement(config, add_to_configured=true, add_to_canvas=true): UserShape {\n        if (!config.color && this.base.type == ProductTypeEnum.PRINTED) {\n            config.color = this.colors_available.find(v => v.name.toLowerCase() == 'white');\n        }\n\n        return this.tool_factory.createUserShapeElement(config, add_to_configured, add_to_canvas) as UserShape;\n    }\n\n    addUserShapeElement(element: UserShape, add_to_configured=true, add_to_canvas=true) {\n        return this.tool_factory.addUserShapeElement(element, add_to_configured, add_to_canvas);\n    }\n\n    async createClipMaskElement(element, clipart) {\n        let model = element.model;\n        if (element instanceof ClipMaskElement) {\n            if (element.mask.model.id == clipart.id) {\n                (element as ClipMaskElement).edit_state = true;\n                return element;\n            }\n            else {\n                let options = {\n                    'clipart': clipart,\n                    'maintain_proportion': false,\n                    'x_scale_inverted': false,\n                    'y_scale_inverted': false,\n                    'template_clipart': null,\n                    'x': element.element.x,\n                    'y': element.element.y,\n                    'z': element.element.z,\n                    'width': element.element.width,\n                    'height': element.element.height,\n                    'regions': null,\n                    'rotation': 0\n                };\n                let mask_clipart_model = this.createClipartElement(options, false, false);\n                let mask_clipart = new ClipartElement(clipart.clipart, mask_clipart_model);\n                mask_clipart.disable_offset_path = true;\n                element.mask = mask_clipart;\n                element.updatePaperOnFrame();\n                element.edit_state = true;\n                this.selection_manager.select(element);\n                return element;\n            }\n        }\n\n        await this.clip_mask_elements.$promise;\n\n        // Remove it from the design tool and custom object\n        let clone_model = this.createUserFileElement(model, false, false);\n        let clone = new RasterElement(clone_model.user_file.raster, clone_model);\n        clone.disable_offset_path = true;\n        element.remove();\n        element = clone;\n\n        // Setup clipart mask\n        let options = {\n            'clipart': clipart,\n            'maintain_proportion': false,\n            'x_scale_inverted': false,\n            'y_scale_inverted': false,\n            'template_clipart': null,\n            'x': element.x,\n            'y': element.y,\n            'z': element.z,\n            'width': element.width,\n            'height': element.height,\n            'regions': null,\n            'rotation': 0\n        };\n        let mask_clipart_model = this.createClipartElement(options, false, false);\n        let mask_clipart = new ClipartElement(mask_clipart_model.clipart.clipart, mask_clipart_model);\n        mask_clipart.disable_offset_path = true;\n        mask_clipart.removeOffsetPath();\n\n        // Setup mask model\n        let customClipMask = Services.get<typeof CustomClipMask>('CustomClipMask');\n        let mask_model = new customClipMask();\n        let mask_element = new ClipMaskElement(element, mask_clipart, mask_model);\n\n        mask_element.bind('remove', () => {\n           let index = this.configured.clip_mask_elements.indexOf(mask_model);\n\n           if (index != -1) {\n               this.configured.clip_mask_elements.splice(index, 1);\n           }\n        }, this);\n\n        this.configured.clip_mask_elements.push(mask_model)\n        this.element_manager.add(mask_element);\n        this.selection_manager.select(mask_element);\n\n        return mask_element;\n    }\n\n\n    addClipMaskElement(element: CustomClipMask, add_to_configured=true, add_to_canvas=true) {\n        const mask = new ClipartElement(element.mask.clipart.clipart, element.mask);\n        const raster = new RasterElement((element.element.user_file as UserFile).raster, element.element);\n\n        const clip_mask = new ClipMaskElement(raster, mask, element);\n        clip_mask.edit_state = false;\n\n        clip_mask.bind('remove', () => {\n            let index = this.configured.clip_mask_elements.indexOf(element);\n            if (index != -1) {\n                this.configured.clip_mask_elements.splice(index, 1);\n            }\n            this.element_manager.remove(clip_mask);\n            if (this.selection_manager.selection == clip_mask) {\n                this.selection_manager.selection = null;\n            }\n\n            index = this.configured.upload_elements.indexOf(element.element);\n            if (index != -1) {\n                this.configured.upload_elements.splice(index, 1);\n            }\n            else if (element.element.id) {\n                this.configured.upload_elements.removeItemFromID(element.element.id)\n            }\n\n            index = this.configured.upload_elements.indexOf(element.mask);\n            if (index != -1) {\n                this.configured.clipart_elements.splice(index, 1);\n            }\n            else if (element.mask.id) {\n                this.configured.clipart_elements.removeItemFromID(element.mask.id);\n            }\n\n        }, this);\n\n        this.element_manager.add(clip_mask);\n    }\n\n    override setupShapeElement(custom_shape: CustomShape): BackgroundShapeElement {\n        custom_shape.bind('change', () => {\n            this.checkSharedShapeAttributes(custom_shape);\n        }, this);\n        return this.tool_factory.setupShapeElement(custom_shape);\n    }\n\n    checkLicense() {\n        let needs_license = this.configured.marketplace_elements.length > 0;\n        let base_license_option = this.base.licensing_option;\n        let active_license_option: CustomOption = null;\n\n        // No option specified in the database, unable to calculate prices\n        if (!base_license_option) {\n            return;\n        }\n\n        for (const option of this.configured.options) {\n            if (option.option_set.id == base_license_option.id) {\n                active_license_option = option;\n            }\n        }\n\n        if (!needs_license && active_license_option) {\n            this.configured.options.splice(this.configured.options.indexOf(active_license_option), 1);\n        }\n        else if (needs_license && !active_license_option) {\n            let CustomOptionModel = Services.get<typeof CustomOption>('CustomOption');\n            active_license_option = new CustomOptionModel() as CustomOption;\n\n            active_license_option.configured = this.configured as any;\n            active_license_option.option_set = base_license_option;\n            active_license_option.option = base_license_option.getTaggedOption('royalty-fee');\n\n            this.configured.options.push(active_license_option);\n        }\n    }\n\n    needSideCost() {\n        if (this.canvas_service.sides.length <= 1) {\n            return false;\n        }\n\n        if (this.element_manager.sidesInUse > 1) {\n            return true;\n        }\n\n        if (this.base.show_material_color) {\n            return false;\n        }\n\n        // Check background clipart elements since they are not checked in the this.element_manager.sidesInUse function\n        let active_side_count = 0;\n        for (const side of this.canvas_service.sides) {\n            // Background clipart elements that are immutable\n            let clipart_elements = this.configured.clipart_elements.filter(\n                v => v.side?.id == side?.id && !v.selectable && !v.can_remove\n            )\n\n            // See if there is a custom clipart element, where there is a region color what has changed from what was set in the template clipart\n            let clipart_changed = !!clipart_elements.find(\n                clipart => clipart.regions.find(\n                    (c_region) => {\n                        let t_region = clipart.template_clipart.regions.find(v => c_region.region.id == v.region.id);\n\n                        return c_region?.color?.id != t_region?.color?.id;\n                    }\n                )\n            )\n            \n            let shapes = this.configured.custom_shapes.filter(v => v.side?.id == side?.id);\n            let shape_changed = !!shapes.find(custom_shape => custom_shape.background_shape_fill_code != custom_shape.template_shape.background_shape_fill_code);\n\n            if (clipart_changed || shape_changed || this.element_manager.sideInUse(side.id)) {\n                active_side_count += 1;\n            }\n        }\n\n        if (active_side_count >= 2) {\n            return true;\n        }\n    }\n\n    checkSides() {\n        if (!this.base) {\n            return;\n        }\n\n        let needs_side_cost = this.needSideCost();\n\n        let base_multi_side_option = this.base.multi_side_option;\n        let active_multi_side_option: CustomOption = null;\n\n        // No option specified in the database, unable to calculate prices\n        if (!base_multi_side_option) {\n            return;\n        }\n\n        for (const option of this.configured.options) {\n            if (option && option.option_set.id == base_multi_side_option.id) {\n                active_multi_side_option = option;\n            }\n        }\n\n        if (!needs_side_cost && active_multi_side_option) {\n            this.configured.options.splice(this.configured.options.indexOf(active_multi_side_option), 1);\n        }\n        else if (needs_side_cost) {\n            if (!active_multi_side_option) {\n                let CustomOptionModel = Services.get<typeof CustomOption>('CustomOption');\n                active_multi_side_option = new CustomOptionModel();\n\n                active_multi_side_option.configured = this.configured as any;\n                active_multi_side_option.option_set = base_multi_side_option;\n                active_multi_side_option.option = base_multi_side_option.getTaggedOption('multiple-side-fee');\n\n                this.configured.options.push(active_multi_side_option);\n            }\n            else {\n                active_multi_side_option.option = active_multi_side_option.option_set.options.find(v => v.hasTag('multiple-side-fee'));\n            }\n        }\n    }\n\n    // was checkTextSizes\n    validateTextSizes() {\n        if (!(this.base.type == ProductTypeEnum.CUTOUT || this.base.type == ProductTypeEnum.MULTICOLOR_CUTOUT)) {\n            return;\n        }\n\n        this.recommended_text_height = 0.25;\n        this.recommended_text_width = 0.25;\n        this.text_size_too_small = false;\n        for (const text_element of this.element_manager.textElements) {\n            let text_measurements = text_element.measurements(this.width, this.height);\n\n            if (text_measurements.height < 0.25) {\n                let scale = 0.26 / text_measurements.height;\n                if (this.height * scale > this.recommended_text_height) {\n                    this.recommended_text_height = Number((this.height * scale).toFixed(3));\n                    this.recommended_text_width = Number((this.width * scale).toFixed(3));\n                }\n\n                text_element.model.errors.add('size', 'The letter height does not meet the minimum size of .25\" (0.66cm) tall. Increase the size of this element within the design, or increase the total size of the product.');\n                this.text_size_too_small = true;\n            }\n        }\n    }\n\n    hasLowDPIFlag(): boolean {\n        return this.base.type != ProductTypeEnum.PRINTED &&\n              (this.base.option_vectorize && !this.configured.option_vectorize) &&\n              (this.configured.tool_type == ToolTypeEnum.UPLOAD) &&\n               this.uploadDPI() < 300;\n    }\n\n    uploadDPI() {\n        if (!this.configured.user_file || (this.configured.user_file as UserFile).is_vector || !(this.configured.user_file as UserFile).height || !(this.configured.user_file as UserFile).width) {\n            return Number.MAX_VALUE;\n        }\n        let fWidth, fHeight, dpi;\n\n        fWidth = (this.configured.user_file as UserFile).width;\n        fHeight = (this.configured.user_file as UserFile).height;\n\n        const wdpi = fWidth / this.width;\n        const hdpi = fHeight / this.height;\n\n        if (wdpi < hdpi) {\n            dpi = Math.ceil(wdpi);\n        }\n        else {\n            dpi = Math.ceil(hdpi);\n        }\n\n        return dpi;\n    }\n\n    validateCodeSizes() {\n        let standard_width = 1.47;\n        let standard_height = 1.00;\n\n        let f = (v) => {\n            return Number(v).toFixed(1)\n        }\n\n        for (const code_element of this.element_manager.codeElements.filter(v => v.model.qrcode.code_type == CodeType.BAR_CODE)) {\n            code_element.model.errors.remove('size');\n\n            let measurements = code_element.measurements(this.width, this.height);\n\n            if (measurements.width < standard_width * 0.8 || measurements.height < standard_height * 0.8) {\n                code_element.model.errors.add('size', `The size of this bar code may be too small. \n                The size in the design is ${f(measurements.width)}\"x${f(measurements.height)}\". \n                Standard sizes are larger than ${f(standard_width * 0.8)}\"x${f(standard_height * 0.8)}\".\n                Please verify that your barcode will work that the given size before ordering.\n                You can also increase increase the size of this element within the design, or increase the total size of the product.`);\n            }\n        }\n    }\n\n    // was showSizeWarning\n    /*\n        ValidateDesignSizeRatio\n\n        This will make sure that their design size ratio is within 2% of the ratio of the physical size they selected.\n     */\n    validateDesignSizeRatio() {\n        if (!isNaN(this.base.lockRatio) || !this.base.allow_custom_size || this.configured.custom_shapes.length != 0) {\n            return false;\n        }\n        const size = this.element_manager.getUsedSize();\n\n        const tool_ratio = Number((size.width / size.height).toFixed(3));\n        const customer_ratio = Number((this.width / this.height).toFixed(3));\n\n        // If there is a not a difference of at least 2% in the size ratio, don't show a warning\n        return Math.abs(1 - (customer_ratio / tool_ratio)) >= 0.02;\n    }\n\n    /*\n        This will update all elements to use the same color as the configured.material_color for single\n        color cutout templates\n     */\n    updateElementColorsFromConfigured() {\n        if (this.base.type === ProductTypeEnum.CUTOUT) {\n            for (const element of this.element_manager.textElements) {\n                element.model.color = this.configured.material_color;\n            }\n\n            for (const element of this.element_manager.clipartElements) {\n                for (const region of element.model.regions) {\n                    region.color = this.configured.material_color;\n                }\n            }\n\n            this.flushFrameTasks();\n        }\n    }\n\n    updateColorSets(): void {\n        const color_map = this.color_map;\n        if (color_map && this.configured.material_color) {\n            const colors = color_map.values;\n            const default_color = colors.find(v => v.default) || colors[0];\n            for (const element of this.element_manager.textElements) {\n                if (element.model.color) {\n                    element.model.color = colors.getItemFromID(element.model.color.id) || default_color;\n                }\n            }\n\n            for (const element of this.element_manager.clipartElements) {\n                for (const region of element.model.regions) {\n                    if (!region.use_material_colors && region.color) {\n                        region.color = colors.getItemFromID(region.color.id) || default_color;\n                    }\n                }\n            }\n\n            this.flushFrameTasks();\n        }\n    }\n\n    flushFrameTasks() {\n        if (this.canvas_service.in_export_state) {\n            // Updating the region colors above causes the element to reset its position back to where it should be\n            // so we need to update everything back to its true position and zoom back in\n            for (const element of this.element_manager.elements) {\n                element.updatePaper();\n                element.flushFrameTasks();\n            }\n\n            this.canvas_service.setProjectBounds(0, 0, this.canvas_service.workspace.artboard.width, this.canvas_service.workspace.artboard.height);\n        }\n    }\n\n    setProductSizeFromCanvas(): boolean {\n        if (this.base.lockRatio || !this.base.allow_custom_size || this.element_manager.elements.length < 1) {\n            this.size_adjusted = false;\n            return false;\n        }\n\n        let size = this.getProductSizeFromCanvas();\n        if (!size || isNaN(size.width) || isNaN(size.height)) {\n            this.size_adjusted = false;\n            return false;\n        }\n\n        let large_adjustment = Math.abs(this.width - size.width) > 0.1 || Math.abs(this.height - size.height) > 0.1;\n\n        this.width = size.width;\n        this.height = size.height;\n        this.setLockedProportions(true);\n\n        if (this.show_size_change_warning && this.configured.id && large_adjustment) {\n            this.size_adjusted = true;\n        }\n\n        return true;\n    }\n\n    getProductSizeFromCanvas() {\n        let size = null;\n        // If we are clipping the design then the bounds will be the clipped area\n        if (this.canvas_service.clipArea) {\n            size = this.canvas_service.clipArea.bounds.size;\n        }\n        else {\n            size = this.element_manager.getUsedSize();\n        }\n\n        if (size.area == 0) {\n            return {width: this.width, height: this.height};\n        }\n\n        const wh = fitToArea(size.width, size.height, this.width * this.height);\n        let width, height;\n\n        this.setLockedProportions(false);\n\n        if (wh.width > wh.height) {\n            width = getClosestQuarter(wh.width);\n            height = Number((width * (wh.height / wh.width)).toFixed(3));\n        } else {\n            height = getClosestQuarter(wh.height);\n            width = Number((height * (wh.width / wh.height)).toFixed(3));\n        }\n\n        return {width: width, height: height}\n    }\n\n    removeQuantityModel() {\n        this.configured.quantity_model.remove();\n        this.price_tier = null;\n        this.updatePricing();\n    }\n\n    override onSaveFailure(response) {\n        super.onSaveFailure(response);\n\n        this.canvas_service.resetCanvasFromExport();\n        this.selection_manager.drawControls();\n\n        if (this.errors.length == 0) {\n            const company: Company = Services.get<Company>('Company');\n            this.errors.add('__all__', 'An unknown error has occurred while trying to save. ' +\n            `Please try again later or contact customer support at ${company.phone} or ${company.email}.`);\n        }\n    }\n\n    override async preSave() {\n        await super.preSave();\n        this.setProductSizeFromCanvas();\n        this.configured.design_approval = null;\n        this.setupDesignSides();\n    }\n\n    setupDesignSides(no_images?) {\n        // Prevent the offset path from being cleared and generated again since its async and this cant wait\n        this.canvas_service.in_save_state = true;\n        this.canvas_service.resetCanvasFromExport();\n\n        this.configured.design_content.length = 0;\n        for (const side of this.canvas_service.sides) {\n            this.canvas_service.selectSide(side.id);\n            this.canvas_service.setupCanvasForExport();\n            this.configured.design_content.push(new (Services.get<typeof CustomDesignContent>('CustomDesignContent'))({\n                side: side.model,\n                source_file_content: this.canvas_service.exportSVG(null),\n                preview_content: no_images ? null : this.canvas_service.exportPNG()\n            }));\n            this.canvas_service.resetCanvasFromExport();\n        }\n        this.canvas_service.in_save_state = false;\n\n        this.canvas_service.resetCanvasFromExport();\n    }\n\n    override nextUrl() {\n        if (this.size_adjusted) {\n            return this.configured.getFinalizeURL() + '?size_changed=1';\n        }\n        return this.configured.getFinalizeURL();\n    }\n\n    override updateCanvas() {\n        for (const element of this.element_manager.allShapeElements) {\n            element.updatePaper();\n        }\n        this.canvas_service.flushFrameTasks();\n    }\n\n    override preValidate() {\n        super.preValidate();\n\n        // This could probably be extended to text elements too but someone may want a blank one\n        // Blank qr codes will probably break something\n        if (this.configured.qr_quantity_model) {\n            this.configured.qr_quantity_model.removeBlankRows();\n        }\n\n        if (this.configured.quantity_model) {\n            this.configured.quantity = this.configured.quantity_model.range;\n        }\n    }\n\n    designColors() {\n        let union = new Set();\n        for (const element of this.element_manager.allElements()) {\n            element.designColors().forEach(union.add, union);\n        }\n\n        if (this.canvas_service.offset_path_color) {\n            union.add(this.canvas_service.offset_path_color);\n        }\n\n        return union;\n    }\n\n    // Used with selenium for automated testing\n    public async exportDesignContentWhenLoaded() {\n        await this.setup_complete;\n        if (this.tool_promises.length > 0) {\n            await SimplePromise.all(this.tool_promises);\n        }\n\n        await wait(100);\n\n        this.setProductSizeFromCanvas();\n        this.setupDesignSides(true);\n        return {\n            sides: this.configured.design_content.map(v => v.getPostData()),\n            width: this.configured.width,\n            height: this.configured.height\n        }\n    }\n\n    public viewRow(row: number) {\n        this.visible_row = row;\n        for (const element of this.configured.variableDataElements()) {\n            element.selectVisibleItem(row);\n        }\n    }\n}\n","import {TemplateClipart} from '../models/TemplateClipart';\nimport {TextElement} from '../tool/TextElement';\nimport {ClipartElement} from '../tool/ClipartElement';\nimport {ClipMaskElement} from '../tool/ClipMaskElement';\nimport {RasterElement} from '../tool/RasterElement';\nimport {BackgroundShapeElement} from '../tool/BackgroundShapeElement';\nimport {BaseElement} from '../tool/BaseElement';\nimport {CustomClipart} from '../models/CustomClipart';\nimport {IElement} from '../tool/IElement';\nimport {Services} from '../../../core/services/Services';\nimport PaperCanvasService from './PaperCanvasService';\nimport {SVGCanvasElement} from '../tool/SVGCanvasElement';\nimport {CustomQRCode} from '../models/CustomQRCode';\nimport {EventDispatcher} from '../../../core/utils/EventDispatcher';\n\n\nexport class ElementManager extends EventDispatcher {\n    _elements: IElement[];\n\n    constructor() {\n        super();\n        this._elements = [];\n    }\n\n    get paper_service() {\n        return Services.get<PaperCanvasService>('PaperCanvasService');\n    }\n\n    get elements() {\n        return this.elementsForSide(this.paper_service.active_side);\n    }\n\n    elementsForSide(side: number) {\n        let current_element_group = [];\n        for (const element of this._elements) {\n            if (element.side == side) {\n                current_element_group.push(element)\n            }\n        }\n\n        return current_element_group;\n    }\n\n    /*\n     * When elements are moved or removed, we may need to fix the z\n     * values on our elements.\n     */\n    fixZ() {\n        for (const element of this.elements) {\n            if (element.model.forced_top_layer) {\n                element.z = 1000000;\n            }\n        }\n\n        this._elements.sort((a, b) => {\n            if (a.z < b.z)\n                return -1;\n            if (a.z > b.z)\n                return 1;\n            return 0;\n        });\n\n        let i = 0;\n        for (const element of this.elements) {\n            if (!element.model.forced_top_layer) {\n                element.z = i;\n            }\n            i++;\n        }\n    }\n\n    get nextZ() {\n        let z = -1;\n        for (const element of this.elements) {\n            if (z < element.z && !element.model.forced_top_layer)\n                z = element.z;\n        }\n        return z + 1;\n    }\n\n    /**\n     * Redraws all elements\n     */\n    redrawAll() {\n        for (const element of this.elements) {\n            element.updatePaper();\n        }\n    }\n\n    /*\n     * Sorts the element array and then arranges the paperjs layers to match\n     * the element positions in the array.\n     */\n    sort() {\n        this._elements.sort((a, b) => {\n            if (a.z < b.z)\n                return 1;\n            if (a.z > b.z)\n                return -1;\n            return 0;\n        });\n\n        for (const element of this._elements) {\n            element.elevation_layer.sendToBack();\n        }\n\n        this.topLayer();\n\n        // Move the selection manager layer to the top\n        this.paper_service.controlsLayer().bringToFront();\n    }\n\n    topLayer() {\n        for (let i = 0; i < this.elements.length; i++) {\n            if (this.elements[i].model.template_clipart) {\n                if (this.elements[i].model.forced_top_layer) {\n                    const element = this.elements[i];\n\n                    if (this.elements.indexOf(element) > 0) {\n                        this.elements.splice(this.elements.indexOf(element), 1);\n                        this.elements.push(element);\n                    }\n                    this.elements[i].z = 1000000;\n                    this.redrawAll();\n                }\n            }\n        }\n    }\n\n    add(element: IElement): void {\n        if (this._elements.indexOf(element) != -1) {\n            return;\n        }\n\n        this._elements.push(element);\n        this.sort();\n        this.trigger('elementAdded', element);\n    }\n\n    remove(element: IElement): void {\n        const index = this._elements.indexOf(element);\n        if (index == -1) {\n            return;\n        }\n\n        this._elements.splice(index, 1);\n        this.trigger('elementRemoved', element);\n    }\n\n    // Same thing as remove but doesn't trigger elementRemoved. Used for when you want to keep using the element.\n    takeOut(element: IElement): void {\n        const index = this._elements.indexOf(element);\n        if (index == -1)\n            return;\n\n        this._elements.splice(index, 1);\n    }\n\n    removeAll(): void {\n        for (const element of this._elements) {\n            this.remove(element);\n        }\n    }\n\n    /*\n     * Moves an element to the specified z location, swapping places with the\n     * current item in that location.\n     */\n    moveElement(element: IElement, moveTo: number) {\n        for (const e of this.elements) {\n            if (e.z == moveTo) {\n                e.z = element.z;\n                break;\n            }\n        }\n        element.z = moveTo;\n\n        this.sort();\n        this.trigger('elementMoved', element);\n    }\n\n    moveElementUp(element, $event?): void {\n        if ($event)\n            $event.stopPropagation();\n\n        this.moveElement(element, element.z + 1);\n        this.fixZ();\n        this.trigger('elementZUp', element);\n    }\n\n    moveElementDown(element, $event?): void {\n        if ($event)\n            $event.stopPropagation();\n\n        this.moveElement(element, element.z - 1);\n        this.fixZ();\n        this.trigger('elementZDown', element);\n    }\n\n    get max_z() {\n        let max = Number.MIN_SAFE_INTEGER;\n\n        for (const element of this.elements) {\n            if (!element.model.forced_top_layer) {\n                if (element.z > max) {\n                    max = element.z;\n                }\n            }\n        }\n\n        if (max == Number.MIN_SAFE_INTEGER) {\n            max = 0;\n        }\n\n        return max;\n    }\n\n    moveElementToTop(element): void {\n        this.moveElement(element, this.max_z + 1);\n    }\n\n    /**\n     * Returns an element closest to the point. A modifier is calculated for\n     * each element that allows us to get a modified distance based on\n     * of the element.bounds.area / canvas.bounds.area. This makes it easier\n     * to detect if the client is hovering over smaller objects even when the\n     * distance to the center of a small and large objects' centers are equal.\n     *\n     * @param point\n     * @returns {IElement}\n     */\n    getElementClosestToPoint(point: paper.Point): IElement {\n        let closestElement: IElement = null,\n            closestElementDistance: number = null,\n            canvasArea = this.paper_service.canvasWidth * this.paper_service.canvasHeight;\n\n        for (const element of this.elements) {\n            // This will cause the element to always be the closest so lets just ignore it\n            if (element.bounds.area == 0) {\n                continue;\n            }\n\n            if (element.hitTest(point)) {\n                const mod: number = element.bounds.area / canvasArea;\n                const distanceToCenter: number = element.bounds.center.getDistance(point);\n                const modifiedDistanceToPoint: number = distanceToCenter * mod;\n\n                if (closestElementDistance == null || modifiedDistanceToPoint < closestElementDistance) {\n                    closestElementDistance = modifiedDistanceToPoint;\n                    closestElement = element;\n                }\n            }\n        }\n\n        return closestElement;\n    }\n\n    /*\n     * A simple hit test that returns true if something is selectable is where the point is\n     */\n    simpleHitTest(point: paper.Point) {\n        return this.elements.find(v => v.hitTest(point));\n    }\n\n    getElementByModel(model): IElement {\n        for (const element of this.elements) {\n            if (element.model == model)\n                return element;\n        }\n    }\n\n    getElementsByClass<T extends BaseElement>(cls): T[] {\n        const elements: T[] = [];\n        for (const element of this.elements as T[]) {\n            if (element instanceof cls)\n                elements.push(element);\n        }\n        return elements;\n    }\n\n    get codeElements(): SVGCanvasElement[] {\n        return this.getElementsByClass<SVGCanvasElement>(SVGCanvasElement).filter(v => (v.model instanceof CustomQRCode));\n    }\n\n    get textElements(): TextElement[] {\n        return this.getElementsByClass<TextElement>(TextElement);\n    }\n\n    get clipartElements(): ClipartElement[] {\n        return this.getElementsByClass<ClipartElement>(ClipartElement);\n    }\n\n    get clipMaskElements(): ClipMaskElement[] {\n        return this.getElementsByClass<ClipMaskElement>(ClipMaskElement);\n    }\n\n    get rasterElements(): RasterElement[] {\n        return this.getElementsByClass<RasterElement>(RasterElement);\n    }\n\n    get shapeElements(): BackgroundShapeElement[] {\n        return this.getElementsByClass<BackgroundShapeElement>(BackgroundShapeElement);\n    }\n\n    get backgroundClipartElements(): ClipartElement[] {\n        let clipart_elements = this.clipartElements;\n        let sub_set = [];\n\n        for (const item of clipart_elements) {\n            if (item.isImmutable()) {\n                sub_set.push(item)\n            }\n        }\n\n        return sub_set;\n    }\n\n    get editableBackgroundClipartElements(): ClipartElement[] {\n        return this.backgroundClipartElements.filter(v => !v.model.use_as_mask);\n    }\n\n    get allEditableBackgroundClipartElements(): ClipartElement[] {\n        return this.allBackgroundClipartElements.filter(v => !v.model.use_as_mask);\n    }\n\n    getAllElementsByClass<T extends BaseElement>(cls): T[] {\n        const elements: T[] = [];\n        for (const element of this._elements as T[]) {\n            if (element instanceof cls)\n                elements.push(element);\n        }\n        return elements;\n    }\n\n    allElements(): IElement[] {\n        return this._elements;\n    }\n\n    get allTextElements(): TextElement[] {\n        return this.getAllElementsByClass<TextElement>(TextElement);\n    }\n\n    get allClipartElements(): ClipartElement[] {\n        return this.getAllElementsByClass<ClipartElement>(ClipartElement);\n    }\n\n    get allClipMaskElements(): ClipMaskElement[] {\n        return this.getAllElementsByClass<ClipMaskElement>(ClipMaskElement);\n    }\n\n    get allRasterElements(): RasterElement[] {\n        return this.getAllElementsByClass<RasterElement>(RasterElement);\n    }\n\n    get allShapeElements(): BackgroundShapeElement[] {\n        return this.getAllElementsByClass<BackgroundShapeElement>(BackgroundShapeElement);\n    }\n\n    get allBackgroundClipartElements(): ClipartElement[] {\n        let clipart_elements = this.allClipartElements;\n        let sub_set = [];\n\n        for (const item of clipart_elements) {\n            if (item.isImmutable()) {\n                sub_set.push(item)\n            }\n        }\n\n        return sub_set;\n    }\n\n    get sidesInUse(): number {\n        let sides = [];\n        for (const item of this._elements) {\n            if (item.isImmutable()) {\n                continue\n            }\n\n            if (sides.indexOf(item.side) == -1) {\n                sides.push(item.side);\n            }\n        }\n\n        return sides.length\n    }\n\n    sideInUse(side: number): boolean {\n        return this.elementsForSide(side).find(v => !v.isImmutable());\n    }\n\n    reset() {\n        for (const element of this.elements) {\n            const children = element.elevation_layer.removeChildren();\n            for (const idx in children) {\n                delete children[idx];\n            }\n            element.remove();\n        }\n        this._elements = [];\n    }\n\n    showElement(element): boolean {\n        if (element.model instanceof CustomClipart){\n            if (element.model.regions.length < 1 && element.locked)\n                return false;\n        }\n        if (element.model.template_clipart) {\n            return !((element.model.template_clipart as TemplateClipart).hide);\n        }\n        return true;\n    }\n\n    getUsedSize() {\n        return this.getUsedBounds().size;\n    }\n\n    getUsedBounds() {\n        if (!this.elements || this.elements.length == 0) {\n            return new this.paper_service.paper.Rectangle(0, 0, 0, 0);\n        }\n\n        let bounding_area = null;\n        for (const element of this.elements) {\n            if (isNaN(element.bounds.area) || element.bounds.area == 0) {\n                continue;\n            }\n\n            if (!bounding_area) {\n                bounding_area = element.bounds;\n            }\n\n            bounding_area = bounding_area.unite(element.bounds);\n        }\n        if (!bounding_area) {\n            return new this.paper_service.paper.Rectangle(0, 0, 0, 0);\n        }\n\n        return bounding_area;\n    }\n\n    get lowDPIElements(){\n        if (!this.rasterElements)\n            return [];\n        const lowDPI = [];\n        for (let i = 0; i < this.rasterElements.length; i++) {\n            if (this.rasterElements[i].model.dpi < 300) {\n                    lowDPI.push(this.rasterElements[i]);\n                }\n            }\n        return lowDPI;\n    }\n\n    setDPI(element){\n        const index = this.elements.indexOf(element);\n        this.elements[index].model.dpi = element.model.dpi;\n    }\n\n    get elementBounds(): paper.Rectangle {\n        let leftX: number = null;\n        let leftY: number = null;\n        let rightX: number = null;\n        let rightY: number = null;\n\n        for (const ele of this.elements) {\n            const eleBounds: paper.Rectangle = ele.bounds;\n            if (leftX == null || leftX > eleBounds.topLeft.x)\n                leftX = eleBounds.topLeft.x;\n            if (leftY == null || leftY > eleBounds.topLeft.y)\n                leftY = eleBounds.topLeft.y;\n            if (rightX == null || rightX > eleBounds.bottomRight.x)\n                rightX = eleBounds.bottomRight.x;\n            if (rightY == null || rightY > eleBounds.bottomRight.y)\n                rightY = eleBounds.bottomRight.y;\n        }\n\n        return new this.paper_service.paper.Rectangle(\n            new this.paper_service.paper.Point(leftX, leftY),\n            new this.paper_service.paper.Size(rightX - leftX, rightY - leftY)\n        );\n    }\n\n    get transformation_elements() {\n        return [this];\n    }\n\n    elementForModel(model) {\n        return this._elements.find(v => v.model == model);\n    }\n}\n","import {Font} from '../models/Font';\nimport APIResponse from '../../../core/models/APIResponse';\nimport {SimplePromise} from '../../../core/utils/SimplePromise';\nimport {Services} from '../../../core/services/Services';\nimport {User} from '../../userprofile/models/User';\nimport {UserFont} from \"../models/UserFont\";\nimport {Collection} from \"../../../core/models/Collection\";\nimport {FontVersion} from \"../models/FontVersion\";\n\nexport class FontService {\n    static $inject = [\n        'Font'\n    ];\n\n    loaded: any = {};\n    promises: any = {};\n    fonts_request: APIResponse<Font>;\n    user_fonts: APIResponse<UserFont>;\n    styleElement: Element;\n    active_fonts: Font[] = [];\n\n    opentype;\n    opentype_promise;\n\n    font_selection_callback;\n\n    constructor(\n        private FontModel: typeof Font\n    ) {\n        this.loaded = [];\n\n        let font_element = document.getElementById(\"font-data\")\n        if (font_element && font_element.textContent) {\n            let data = JSON.parse(atob(font_element.textContent.replace(/(\\r\\n\\t|\\n|\\r\\t|\\s)/gm, '')));\n            if (data) {\n                this.fonts_request = Services.get<typeof Font>('Font').objects.from(data['fonts']);\n                this.user_fonts = Services.get<typeof UserFont>('UserFont').objects.from(data['user_fonts']);\n                setTimeout(() => {\n                    for (const font of this.combined_fonts) {\n                        font.load();\n                    }\n                });\n\n                for (const item of this.fonts_request.items) {\n                    item.versions.sort((a, b) => a.name.localeCompare(b.name));\n                }\n            }\n        }\n\n        this.opentype_promise = import('opentype.js');\n        this.opentype_promise.then((v) => {\n            this.opentype = v;\n        })\n\n        if (typeof window === 'object' && window.document && !document['fonts']) {\n            document.head.appendChild(\n                this.styleElement = document.createElement('style')\n            );\n        }\n    }\n\n    get combined_fonts(): Collection<Font> {\n        let fonts_map = {};\n        let combined = [...this.active_fonts]\n        if (this.user_fonts) {\n            combined = [...this.user_fonts.items.map(v => v.font), ...combined];\n        }\n        if (this.fonts_request) {\n            combined = [...combined, ...this.fonts_request.items];\n        }\n\n        for (var font of combined) {\n            fonts_map[font.id] = font;\n        }\n\n        let fonts = [...Object.values(fonts_map)] as Font[];\n        fonts = fonts.filter(v => v?.name);\n        fonts.sort((a, b) => a.name.localeCompare(b.name))\n\n        return new Collection<Font>(...fonts);\n    }\n\n    addActiveFont(font: Font) {\n        if (!font) {\n            return;\n        }\n\n        if (!this.active_fonts.find(v => v && v.id == font.id)) {\n            this.active_fonts.push(font);\n        }\n    }\n\n    fetchFonts() {\n        if (!this.fonts_request) {\n            this.fonts_request = this.FontModel.objects.filter({featured: true});\n\n            this.fonts_request.$promise.then(() => {\n                for (const font of this.fonts_request.items) {\n                    font.load();\n                }\n            });\n        }\n        return this.fonts_request;\n    }\n\n    get fonts() {\n        if (!this.fonts_request) {\n            return this.fetchFonts();\n        }\n\n        return this.fonts_request;\n    }\n\n    get default_font() {\n        if (!this.fonts) {\n            this.fetchFonts();\n        }\n\n        if (this.fonts.items.length == 0) {\n            return null;\n        }\n\n        for (const item of this.fonts.items) {\n            if (item.default) {\n                return item;\n            }\n        }\n        return this.fonts.items[0];\n    }\n\n    loadFromID(id: number) {\n        const font: Font = this.fonts.items.getItemFromID(id);\n        return this.load(font);\n    }\n\n    loadFromURI(uri: string) {\n        const font: Font = this.fonts.items.getItemFromURI(uri);\n        return this.load(font);\n    }\n\n    fontKey(font: Font, version?: FontVersion) {\n        if (!font) {\n            return null;\n        }\n\n        if (version && !font.versions.getItemFromID(version.id)) {\n            version = null;\n        }\n\n        if (!version) {\n            return `${font.id}`;\n        }\n        return `${font.id}-${version.id}`;\n    }\n\n    async load(font: Font, version?: FontVersion) {\n        const deferred = SimplePromise.defer();\n\n        await font.loadFull();\n        if (version) {\n            // Make sure the version exists on the font\n            if (!font.versions.getItemFromID(version.id)) {\n                version = null;\n            }\n            else {\n                await font.loadVersion(version);\n            }\n        }\n\n        let key = this.fontKey(font, version);\n\n        if (this.loaded[key]) {\n            deferred.resolve({\n                font: this.loaded[key],\n                id: key\n            });\n        }\n        else {\n            if (!this.opentype) {\n                await this.opentype_promise;\n            }\n\n            if (this.promises[key]) {\n                return this.promises[key];\n            }\n\n            this.opentype.load(version ? version.file : font.font, (err, _font) => {\n                if (err) {\n                    deferred.reject('Failed to load font');\n                }\n                else {\n                    this.loaded[key] = _font;\n                    deferred.resolve({\n                        font: _font,\n                        id: key\n                    });\n                }\n            });\n\n            this.promises[key] = deferred.promise;\n        }\n\n        return deferred.promise;\n    }\n}\n","import * as paper from 'paper';\nimport {Color} from '../models/Color';\nimport {\n    ConfiguredDragDropBuyProductClipart,\n    DummyClipart,\n    DummyText\n} from '../models/ConfiguredDragDropBuyProductClipart';\nimport {Font} from '../models/Font';\nimport DragDropBuyService from '../services/DragDropBuyService';\nimport {BaseElement} from './BaseElement';\nimport {ClipartElement} from './ClipartElement';\nimport {TextElement} from './TextElement';\nimport {Services} from '../../../core/services/Services';\nimport {SimplePromise} from '../../../core/utils/SimplePromise';\n\nexport class DragDropBuyElement extends BaseElement {\n    paperService: DragDropBuyService;\n    configured: ConfiguredDragDropBuyProductClipart;\n    clipartModel: DummyClipart;\n    textModel: DummyText;\n    clipartElement: ClipartElement;\n    textElement: TextElement;\n    components_initialized: boolean = false;\n    protected _font: Font;\n\n    constructor(model: ConfiguredDragDropBuyProductClipart, layer?: paper.Layer) {\n        super(model, layer);\n\n        this.paperService = Services.get('DragDropBuyService')\n\n        const DummyClipartModel = Services.get<typeof DummyClipart>('DummyClipart');\n        this.clipartModel = new DummyClipartModel({\n            selectable: false,\n            regions: model.regions,\n            x: model.x,\n            y: model.y,\n            width: model.width,\n            height: model.height,\n            clipart: model.clipart\n        });\n\n        const DummyTextModel = Services.get<typeof DummyText>('DummyText');\n        this.textModel = new DummyTextModel({\n            selectable: false,\n            text: model.text,\n            font: this.paperService.configured.font,\n            size: 12,\n            x: model.x,\n            y: model.y\n        });\n\n        this.clipartElement = new ClipartElement(model.clipart.clipart, this.clipartModel);\n        this.textElement = new TextElement(this.textModel);\n        this.textElement.auto_scale = false;\n\n        // Hide until loaded\n        this.clipartElement.layer.visible = false;\n        this.textElement.layer.visible = false;\n\n        SimplePromise.all([this.clipartElement.initialized, this.textElement.initialized]).then(() => {\n            // Loaded, show the elements\n            this.clipartElement.layer.visible = true;\n            this.textElement.layer.visible = true;\n\n            this.components_initialized = true;\n            this.updatePaper();\n        })\n\n        this.model.bind('change', this.updatePaper.bind(this), this);\n        this.paperService.configured.bind('change:text_size', this.updatePaper.bind(this), this);\n    }\n\n    set font(font: Font) {\n        this._font = font;\n        this.textElement.model.font = font;\n    }\n\n    get font(): Font {\n        return this._font;\n    }\n\n    set color(color: Color) {\n        for (const region of this.model.regions) {\n            region.color = color;\n        }\n\n        this.textElement.model.color = color;\n    }\n\n    override get bounds(): paper.Rectangle {\n        if (!this.components_initialized) {\n            return new this.paper.Rectangle(new this.paper.Point(0, 0), new this.paper.Size(0, 0));\n        }\n\n        // If there is no text element, do not try to calculate the bounds\n        if (!this.hasTextBounds) {\n            if (this.hasClipartBounds) {\n                return this.clipartElement.bounds;\n            }\n\n            return new this.paper.Rectangle(new this.paper.Point(0, 0), new this.paper.Size(0, 0));\n        }\n\n        const textBounds = this.textElement ? this.textElement.bounds : null,\n            textWidth = textBounds ? textBounds.width : 0,\n            textHeight = textBounds ? textBounds.height : 0,\n            clipartBounds = this.clipartElement ? this.clipartElement.bounds : null,\n            clipartWidth = clipartBounds ? clipartBounds.width : 0,\n            clipartHeight = clipartBounds ? clipartBounds.height : 0,\n            width = textWidth > clipartWidth ? textWidth : clipartWidth,\n            height = textHeight + clipartHeight;\n\n        return new this.paper.Rectangle(\n            new this.paper.Point(this.model.x, this.model.y),\n            new this.paper.Size(width, height)\n        );\n    }\n\n    override onMouseDrag(event: paper.ToolEvent): void {\n        const point = event.point.subtract(event.lastPoint),\n            newPosition = this.correctElementOffCanvasPosition(new this.paper.Point(\n                this.x + point.x,\n                this.y + point.y\n            ));\n\n        this.x = newPosition.x;\n\n        this.paperService.swapZ(this);\n    }\n\n    override onMouseUp(event: paper.ToolEvent): void {\n        // Unselect this element so reposition will work\n        this.paperService.canvasService.selection_manager.deactivate();\n        this.paperService.repositionLayout();\n\n        // Reselect this element so that the editor component works\n        this.paperService.canvasService.selection_manager.deactivate();\n    }\n\n    updatePaper(): void {\n        // This task needs to be done in a frame task so it won't execute more than once per frame which\n        // happens with drag events. Its very slow and needs to be optimized.\n        const tsk = this.updatePaperOnFrame;\n        if (!this.hasFrameTask(tsk, this)) {\n            this.addFrameTask(tsk, this);\n        }\n    }\n\n    override updatePaperOnFrame() {\n        if (!this.components_initialized) {\n            this.clipartElement.updatePaper();\n            this.textElement.updatePaper();\n            return;\n        }\n\n        // Text\n        this.textModel.text = this.model.text;\n        this.textModel.size = this.paperService.textSize;\n\n        // Clipart size\n        if (this.clipartElement.model.width !== this.width)\n            this.clipartElement.model.width = this.width;\n\n        if (this.clipartElement.model.height !== this.height)\n            this.clipartElement.model.height = this.height;\n\n\n        // Clipart positioning\n        this.clipartElement.model.x = this.x + this.clipartElement.bounds.width / 2 + (this.bounds.width - this.clipartElement.bounds.width) / 2;\n        this.clipartElement.model.y = this.y + this.clipartElement.bounds.height / 2;\n\n        // Text positioning\n        if (this.textElement && this.textElement.bounds) {\n            this.textElement.model.x = this.x + this.bounds.width / 2;\n            this.textElement.model.y = this.y + this.clipartElement.bounds.height + this.textElement.bounds.height / 2 + 10;\n        }\n\n        this.trigger('updatePaper');\n    }\n\n    override onFrame(event) {\n        this.clipartElement.onFrame(event);\n        this.textElement.onFrame(event);\n        super.onFrame(event);\n    }\n\n    override showScaleControls(): boolean {\n        return false;\n    }\n\n    override showRotateControl(): boolean {\n        return false;\n    }\n\n    override get elementBounds(): paper.Rectangle {\n        if (!this.initialized) {\n            return new this.paper.Rectangle(new this.paper.Point(0, 0), new this.paper.Size(0, 0));\n        }\n\n        this.canvasService.trigger('flushFrameTasks');\n\n        let clipartBounds = this.clipartElement ? this.clipartElement.bounds : null;\n        let textBounds    = this.textElement    ? this.textElement.bounds    : null;\n\n        // If there is no text or text element, do not include it in the calculation\n        if (!this.hasTextBounds) {\n            textBounds = null;\n        }\n\n        if (clipartBounds && !textBounds) {\n            return clipartBounds;\n        }\n        else if (textBounds && !clipartBounds) {\n            return textBounds;\n        }\n        else if (textBounds && clipartBounds) {\n            return clipartBounds.unite(textBounds);\n        }\n\n        // Failsafe\n        return new this.paper.Rectangle(new this.paper.Point(0, 0), new this.paper.Size(0, 0));\n    }\n\n    get hasTextBounds(): boolean {\n        return this.textElement && this.textElement.model && this.textElement.model['text'] &&\n            this.textElement.model['text'] !== '' && this.textElement.initialized.isResolved();\n    }\n\n    get hasClipartBounds(): boolean {\n        return this.clipartElement && this.clipartElement.model && this.clipartElement.initialized.isResolved();\n    }\n\n    override remove() {\n        this.clipartElement.remove();\n        this.textElement.remove();\n        super.remove();\n    }\n}\n","import {Collection} from '../../../core/models/Collection';\nimport APIResponse from '../../../core/models/APIResponse';\nimport {ClipartElement} from '../tool/ClipartElement';\nimport {DragDropBuyElement} from '../tool/DragDropBuyElement';\nimport {LockedTextElement, TextElement} from '../tool/TextElement';\nimport {IElement as IToolElement} from '../tool/IElement';\nimport {Color} from '../models/Color';\nimport {ConfiguredDragDropBuyProduct, SizeOptions, TextLocationOptions} from '../models/ConfiguredDragDropBuyProduct';\nimport {\n    ConfiguredDragDropBuyProductClipart,\n    DummyClipart,\n    DummyText\n} from '../models/ConfiguredDragDropBuyProductClipart';\nimport {ConfiguredDragDropBuyProductClipartRegion} from '../models/ConfiguredDragDropBuyProductClipartRegion';\nimport {DDBToolType, DragDropBuyProduct, EHorizontalAlignment, EVerticalAlignment} from '../models/DragDropBuyProduct';\nimport {DragDropBuyProductClipart} from '../models/DragDropBuyProductClipart';\nimport {DragDropBuyProductSize} from '../models/DragDropBuyProductSize';\nimport {ProductTypeEnum} from '../models/enums';\nimport {Font} from '../models/Font';\nimport {IElement} from '../models/IElement';\nimport {FontService} from './FontService';\nimport PaperCanvasService from './PaperCanvasService';\nimport UserProfileService from '../../userprofile/services/UserProfileService';\nimport ConfiguredProductServiceAbstract from '../../products_shared/services/ConfiguredProductServiceAbstract';\nimport {Services} from '../../../core/services/Services';\nimport {EPromiseStates, SimplePromise} from '../../../core/utils/SimplePromise';\nimport {getInnerWidth, wait} from '../../../core/utils/utils';\nimport {SelectionManager} from './SelectionManager';\nimport {ElementManager} from \"./ElementManager\";\n\ninterface IOption {\n    id: number;\n    name: string;\n}\n\nexport default class DragDropBuyService extends ConfiguredProductServiceAbstract {\n    clipart: APIResponse<DragDropBuyProductClipart>;\n    canvasService: PaperCanvasService;\n    element_manager: ElementManager;\n    selection_manager: SelectionManager;\n    text_options: IOption[];\n    size_options: IOption[];\n    clipartMarginHorizontal: number = 20;\n    font_service: FontService;\n\n    title_text: DummyText;\n    title_text_element: TextElement;\n\n    maxClipartHeight: number = 100;\n    _tallestClipartHeight: number;\n    _tallestClipartModel: DragDropBuyProductClipart;\n\n    // Not configured to use the TemplateOptionSet\n    configured_option_model = null;\n\n    private resizeTimeout;\n    private quoted_width;\n    private quoted_height;\n\n    public declare base: DragDropBuyProduct;\n    public declare configured: ConfiguredDragDropBuyProduct;\n    public declare base_class: typeof DragDropBuyProduct;\n    public declare configured_class: typeof ConfiguredDragDropBuyProduct;\n\n    constructor() {\n        super(Services.get('DragDropBuyProduct'), Services.get('ConfiguredDragDropBuyProduct'), 'base')\n        this.font_service = Services.get<FontService>('FontService');\n        this.element_manager = Services.get<ElementManager>('ElementManager');\n        this.selection_manager = Services.get<SelectionManager>('SelectionManager');\n\n        this.selection_manager.placement_guides_disabled = true;\n\n        this.canvasService = Services.get<PaperCanvasService>('PaperCanvasService');\n        this.canvasService.clippingDisabled = true;\n        this.canvasService.fixed_camera = true;\n\n        this.ups = Services.get<UserProfileService>('UserProfileService');\n\n        this.text_options = [\n            {\n                id: TextLocationOptions.BOTTOM,\n                name: 'Bottom Text'\n            },\n            {\n                id: TextLocationOptions.TOP,\n                name: 'Top Text'\n            }\n        ];\n        this.size_options = [\n            {\n                id: SizeOptions.SMALL,\n                name: 'Small'\n            },\n            {\n                id: SizeOptions.MEDIUM,\n                name: 'Medium'\n            },\n            {\n                id: SizeOptions.LARGE,\n                name: 'Large'\n            }\n        ];\n\n        window.addEventListener('resize', this.onWindowResize.bind(this));\n    }\n\n    bindEvents() {\n        if (!this.configured) return;\n\n        this.updateText();\n\n        this.configured.bind('change:material_color', this.updateColor.bind(this), this);\n        this.configured.bind('change:size', this.updateText.bind(this), this);\n        this.configured.bind('change:font', this.updateFonts.bind(this), this);\n        this.configured.bind('change:text', this.updateText.bind(this), this);\n        this.configured.bind('change:text_location', this.updateTextLocation.bind(this), this);\n        this.configured.bind('change:text_size', this.updateText.bind(this), this);\n\n        this.element_manager.bind('elementRemoved',\n            (element) => {\n                this.element_manager.remove(element)\n                this.repositionLayout(true);\n            }, this\n        );\n    }\n\n    get areaBounds() {\n        let bounds = null;\n\n        const elements = this.element_manager.getElementsByClass<DragDropBuyElement>(DragDropBuyElement);\n\n        if (elements.length > 0) {\n            bounds = elements[0].elementBounds;\n\n            for (const el of elements) {\n                const eleBounds = el.elementBounds;\n\n                // If the element bounds are setup\n                if (eleBounds.area !== 0) {\n                    bounds = bounds.unite(eleBounds);\n                }\n            }\n        }\n\n        return bounds;\n    }\n\n    get pixelToInchRatio(): number {\n        if (!this.size) {\n            return 1;\n        }\n\n        return this.maxClipartHeight / this.size.value;\n    }\n\n    get size(): DragDropBuyProductSize {\n        return this.configured.size as DragDropBuyProductSize;\n    }\n\n    set size(size: DragDropBuyProductSize) {\n        setTimeout(() => {\n            this.configured.size = size;\n            this.updatePricing();\n            this.trigger('change:size');\n            this.updateSize();\n        }, 100)\n    }\n\n    get size_by_id() {\n        return this.configured.size?.id;\n    }\n    set size_by_id(v) {\n        this.configured.size = this.base.sizes.getItemFromID(v);\n    }\n\n    override updatePricing(keep_errors?) {\n        // Dragging an element will rapidly change the size, which requests price quotes.\n        // So let's disable price updates until they are done.\n        if (!Services.get<SelectionManager>('SelectionManager').dragging_selection) {\n            super.updatePricing(keep_errors);\n        }\n    }\n\n    updateSize() {\n        if (this.canvasService.setup_complete.state != EPromiseStates.FULFILLED) {\n            return;\n        }\n\n        const bounds = this.areaBounds;\n        const ratio = this.pixelToInchRatio;\n\n        if (!bounds) {\n            return;\n        }\n\n        if (ratio) {\n            this.configured.height = bounds.height / ratio;\n            this.configured.width = bounds.width / ratio;\n\n            if (this.width != this.quoted_width && this.height != this.quoted_height) {\n                this.quoted_width = this.width;\n                this.quoted_height = this.height;\n                this.updatePricing();\n            }\n        }\n    }\n\n    async setupArtboard() {\n        await this.canvasService.setup_complete;\n        this.canvasService.setupCanvas();\n        this.canvasService.setupWorkspace();\n        this.canvasService.updateWorkspace(this.canvasService.maxCanvasHeight(), this.canvasService.maxCanvasHeight());\n        this.canvasService.postLoadSetup()\n    }\n\n    updateColor(): void {\n        // Update single color transfer/cutout stickers elements\n        if (this.base.type === ProductTypeEnum.CUTOUT) {\n            for (const element of this.element_manager.getElementsByClass<DragDropBuyElement>(DragDropBuyElement)) {\n                element.color = this.configured.material_color as Color;\n            }\n\n            if (this.title_text) {\n                this.title_text.color = this.configured.material_color;\n            }\n        }\n    }\n\n    updateFonts() {\n        const font = this.font_service.fonts.items.getItemFromURI(this.configured.font);\n        for (const element of this.element_manager.getElementsByClass<DragDropBuyElement>(DragDropBuyElement)) {\n            element.font = font;\n        }\n\n        if (this.title_text) {\n            this.title_text.font = font;\n        }\n\n        // Text height may change so reposition layout\n        this.repositionLayout();\n    }\n\n    get bottomTextY(): number {\n        let y: number = 0;\n        for (const el of this.element_manager.getElementsByClass<DragDropBuyElement>(DragDropBuyElement)) {\n            const elY = el.model.y + el.bounds.height;\n            if (elY > y)\n                y = elY;\n        }\n        return y;\n    }\n\n    get tallestClipartHeight(): number {\n        if (!this._tallestClipartHeight) {\n            const tallest = this.tallestClipart;\n            this._tallestClipartHeight = tallest ? tallest.clipart.height : 0;\n        }\n\n        return this._tallestClipartHeight;\n    }\n\n    get tallestClipart() {\n        if (!this._tallestClipartModel) {\n            let tallest = 0;\n            for (const clipart of this.clipart.items) {\n                if (clipart.clipart.height > tallest) {\n                    tallest = clipart.clipart.height;\n                    this._tallestClipartModel = clipart;\n                }\n            }\n        }\n\n        return this._tallestClipartModel;\n    }\n\n    calculateClipartSize(width, height): number[] {\n        const mod = this.maxClipartHeight / this.tallestClipartHeight;\n        return [width * mod, height * mod];\n    }\n\n    deleteText() {\n        if (this.title_text_element) {\n            this.title_text_element.remove();\n        }\n\n        this.title_text_element = null;\n    }\n\n    updateText() {\n        if (this.configured.text_location === TextLocationOptions.NONE) {\n            if (this.base.tool_type === DDBToolType.GREEK) {\n                this.configured.text_location = TextLocationOptions.BOTTOM;\n            }\n            else {\n                this.configured.text_location = TextLocationOptions.TOP;\n            }\n        }\n\n        if (this.title_text) {\n            this.title_text.size = this.textSize * 1.75;\n            if (!this.title_text.font || !(this.title_text.font as Font).id) {\n                this.updateFonts();\n            }\n\n            this.title_text.text = this.configured.text;\n        }\n\n        // Update immediately, if the font is not loaded then reposition will be called though watch 'loaded:font'\n        this.repositionLayout();\n    }\n\n    updateTextLocation() {\n        this.updateText();\n        this.repositionLayout();\n        this.canvasService.flushFrameTasks();\n    }\n\n    override setupConfiguredFromBase(needs_additional_setup: boolean = false) {\n        super.setupConfiguredFromBase(true);\n\n        // Resize the images to match what it will look like in the tool\n        this.setClipartSelectorDimensions();\n\n        this.font_service.fonts.$promise.then(() => {\n            let default_font = this.font_service.fonts.items[0];\n            for (const item of this.font_service.fonts.items) {\n                if (item.default) {\n                    default_font = item;\n                    break;\n                }\n            }\n\n            if (this.configured.font) {\n                this.configured.font = this.font_service.fonts.items.getItemFromID(this.configured.font.id);\n            }\n            else {\n                this.configured.font = default_font;\n            }\n\n            this.updateFonts();\n        })\n\n        if (!this.size || !this.size.id) {\n            this.size = this.base.sizes[0];\n        }\n\n        this.setupArtboard();\n        this.setupElements().then(() => {\n            this.setup_complete_deferred.resolve();\n            this.bindEvents()\n        });\n    }\n\n    async setupElements() {\n        await this.canvasService.setup_complete;\n        await this.font_service.fonts.$promise;\n\n        let promises = [];\n\n        for (const clipart of [...this.configured.clipart_elements]) {\n            const size = this.calculateClipartSize(clipart.clipart.width, clipart.clipart.height);\n            clipart.width = size[0];\n            clipart.height = size[1];\n            clipart.x = 0;\n            clipart.y = 0;\n\n            let element = this.createClipartElement(clipart);\n            promises.push(element.initialized);\n        }\n\n        const DummyTextModel = Services.get<typeof DummyText>('DummyText');\n        this.title_text = new DummyTextModel({\n            selectable: false,\n            text: this.configured.text,\n            font: (this.font_service.fonts.items as Collection<Font>).getItemFromURI(this.configured.font),\n            color: this.configured.material_color,\n            size: 24,\n            x: 0,\n            y: 0,\n            z: this.element_manager.nextZ\n        });\n\n        this.title_text_element = new LockedTextElement(this.title_text);\n        this.title_text_element.auto_scale = false;\n\n        this.element_manager.add(this.title_text_element);\n        this.title_text_element.bind('click', () => {\n            this.trigger('activated:title');\n        }, this);\n\n        // Bind the text element text to the configured product text\n        this.title_text.bind('change:text', () => {\n            if (this.title_text.text !== this.configured.text) {\n                this.configured.text = this.title_text.text;\n            }\n        }, this);\n\n        if (promises.length > 0) {\n            await SimplePromise.all(promises)\n        }\n\n        this.updateFonts();\n        this.updateColor();\n    }\n\n    override setupExtraData(all_data) {\n        super.setupExtraData(all_data);\n        this.clipart = Services.get<typeof DragDropBuyProductClipart>('DragDropBuyProductClipart').objects.from(all_data.clipart);\n    }\n\n    // The width of the clipart elements with margin\n    get totalWidth(): number {\n        let totalWidth: number = this.clipartMarginHorizontal;\n\n        // Calculate total width\n        for (const el of this.element_manager.getElementsByClass<DragDropBuyElement>(DragDropBuyElement)) {\n            totalWidth += el.bounds.width + this.clipartMarginHorizontal;\n        }\n\n        return totalWidth;\n    }\n\n    // The width of the content\n    get contentWidth(): number {\n        const textElement = this.title_text_element;\n        const clipartWidth = this.totalWidth;\n        return textElement && textElement.bounds && textElement.bounds.width > clipartWidth ? textElement.bounds.width : clipartWidth;\n    }\n\n    setClipartSelectorDimensions() {\n        if (this.base.clipart_same_height) {\n            for (const clipart of this.clipart.items) {\n                clipart.selectorWidth = clipart.clipart.width * (100 / clipart.clipart.height) + 10;\n                clipart.selectorHeight = 100;\n            }\n        }\n        else {\n            const mod: number = 100 / this.tallestClipartHeight;\n            for (const clipart of this.clipart.items) {\n                clipart.selectorWidth = mod * clipart.clipart.width;\n                clipart.selectorHeight = mod * clipart.clipart.height;\n            }\n        }\n    }\n\n    repositionLayout(updateSize: boolean = true) {\n        this.canvasService.flushFrameTasks();\n\n        if (!this.canvasService.workspace || this.canvasService.setup_complete.state != EPromiseStates.FULFILLED) {\n            return;\n        }\n\n        let width: number = this.clipartMarginHorizontal;\n        const totalWidth: number = this.totalWidth;\n        const margin: number = 20;\n        let marginTop: number = margin;\n\n        // Move text to bottom or top\n        if (this.configured.text_location === TextLocationOptions.TOP && this.title_text_element && this.title_text_element.bounds && this.title_text_element.bounds.area !== 0) {\n            marginTop = this.title_text_element.bounds.height + (2 * margin);\n        }\n\n        // Find the tallest clipart added\n        let tallestUsedClipart = 0;\n        for (const el of this.element_manager.getElementsByClass<DragDropBuyElement>(DragDropBuyElement)) {\n            if (tallestUsedClipart < el.model.height) {\n                tallestUsedClipart = el.model.height;\n            }\n        }\n\n        // Place clipart horizontally\n        const elementsWidth = this.title_text_element && this.title_text_element.bounds && this.title_text_element.bounds.width > totalWidth ? this.title_text_element.bounds.width : totalWidth;\n\n        // Get the elements and order them by their x position so we can place them in order\n        let elements = this.element_manager.getElementsByClass<DragDropBuyElement>(DragDropBuyElement);\n        elements = elements.sort((a,b) => a.model.x > b.model.x ? 1 : -1);\n\n        for (const el of elements) {\n            // Place characters based on product horizontal alignment option\n            let xPos: number = 0;\n            switch (this.base.horizontal_alignment) {\n                case EHorizontalAlignment.RIGHT:\n                    break;\n                case EHorizontalAlignment.CENTER:\n                    xPos = this.canvasService.maxCanvasWidth() > elementsWidth ? (this.canvasService.maxCanvasWidth() - totalWidth) / 2 + width : (elementsWidth - totalWidth) / 2 + width;\n                    break;\n                default:\n                    xPos = width;\n                    break;\n            }\n\n            // if we're dragging an element, skip updating that element\n            if ((this.selection_manager.dragging_selection && this.selection_manager.selectedElement()) !== el && el.model.x !== xPos) {\n                el.model.x = xPos;\n            }\n\n            switch (this.base.vertical_alignment) {\n                case EVerticalAlignment.CENTER:\n                    break;\n                case EVerticalAlignment.TOP:\n                    el.model.y = marginTop\n                    break;\n                default:\n                    el.model.y = tallestUsedClipart - el.model.height + marginTop;\n                    break;\n            }\n\n            width += el.bounds.width + this.clipartMarginHorizontal;\n            el.updatePaper();\n        }\n\n        this.canvasService.flushFrameTasks();\n\n        // Resize artboard\n        let artboardWidth = 0;\n        let artboardHeight = 0;\n        switch (this.base.horizontal_alignment) {\n            case EHorizontalAlignment.LEFT:\n                artboardWidth = elementsWidth;\n                break;\n            default:\n                artboardWidth = this.canvasService.maxCanvasWidth() > elementsWidth ? this.canvasService.maxCanvasWidth() : elementsWidth;\n                break;\n        }\n        switch (this.configured.text_location) {\n            case TextLocationOptions.TOP:\n                artboardHeight = this.bottomTextY + margin;\n                if (this.title_text_element && this.title_text_element.bounds && this.title_text_element.bounds.area !== 0) {\n                    artboardHeight += this.title_text_element.bounds.height;\n\n                    // If there are no clipart, add padding\n                    if (this.element_manager.getElementsByClass<DragDropBuyElement>(DragDropBuyElement).length === 0) {\n                        artboardHeight += margin;\n                    }\n                }\n                else {\n                    artboardHeight += margin;\n                }\n                break;\n            case TextLocationOptions.BOTTOM:\n                artboardHeight = this.bottomTextY + (2 * margin);\n                if (this.title_text_element && this.title_text_element.bounds && this.title_text_element.bounds.area !== 0) {\n                    artboardHeight += this.title_text_element.bounds.height + margin;\n                }\n                break;\n            default:\n                artboardHeight = this.bottomTextY + (2 * margin);\n                break;\n        }\n\n        if (artboardWidth < 600) {\n            artboardWidth = 600;\n        }\n\n        this.canvasService.updateWorkspace(artboardWidth, artboardHeight);\n\n        // Position top/bottom text\n        if (this.title_text_element && this.title_text_element.bounds) {\n            switch (this.base.horizontal_alignment) {\n                case EHorizontalAlignment.RIGHT:\n                    this.title_text_element.model.x = elementsWidth - this.title_text_element.bounds.width;\n                    break;\n                case EHorizontalAlignment.CENTER:\n                    this.title_text_element.model.x = this.canvasService.workspace.artboard.width > elementsWidth ? (this.canvasService.workspace.artboard.width - totalWidth) / 2 + width / 2 : elementsWidth / 2;\n                    break;\n                default:\n                    this.title_text_element.model.x = 0;\n                    break;\n            }\n            switch (this.configured.text_location) {\n                case TextLocationOptions.TOP:\n                    this.title_text_element.model.y = this.title_text_element.bounds.height / 2 + margin;\n                    break;\n                case TextLocationOptions.BOTTOM:\n                    this.title_text_element.model.y = this.title_text_element.bounds.height + margin + this.bottomTextY;\n                    break;\n                default:\n                    this.title_text_element.model.y = 0;\n                    break;\n            }\n        }\n        else if (this.title_text_element && !this.title_text_element.bounds) {\n            // Make sure we place text after it's ready\n            setTimeout(this.repositionLayout.bind(this), 100);\n        }\n\n        this.selection_manager.drawControls();\n        if (updateSize)\n            this.updateSize();\n    }\n\n    /**\n     * Sets z on element based on x position. If any element's x position is\n     * less or more than element, swap z position with it.\n     * @param {IElement} element\n     */\n    swapZ(element: IToolElement) {\n        for (const el of this.element_manager.getElementsByClass<DragDropBuyElement>(DragDropBuyElement)) {\n            if (element === el)\n                continue;\n            if (element.z < el.z && element.model.x >= el.model.x) {\n                this.element_manager.moveElement(element, el.z);\n            } else if (element.z > el.z && element.model.x <= el.model.x) {\n                this.element_manager.moveElement(element, el.z);\n            }\n        }\n        this.repositionLayout();\n    }\n\n    createConfiguredClipart(options: any, addToProduct?: boolean): ConfiguredDragDropBuyProductClipart {\n        const ConfiguredDragDropBuyProductClipartModel = Services.get<typeof ConfiguredDragDropBuyProductClipart>('ConfiguredDragDropBuyProductClipart');\n        const CustomClipartRegionModel = Services.get<typeof ConfiguredDragDropBuyProductClipartRegion>('ConfiguredDragDropBuyProductClipartRegion');\n\n        const size = this.calculateClipartSize(options.clipart.width, options.clipart.height);\n        const configuredClipart = new ConfiguredDragDropBuyProductClipartModel({\n            text: options.text || options.name || '',\n            clipart: options.clipart,\n            maintain_proportion: true,\n            x_scale_inverted: false,\n            y_scale_inverted: false,\n            template_clipart: options,\n            x: options.x || 200,\n            y: options.y || 0,\n            z: options.z == null ? this.element_manager.nextZ : options.z,\n            width: size[0],\n            height: size[1],\n            font: this.configured.font,\n            selectable: true,\n            color: this.configured.material_color\n        });\n\n        // Setup CustomClipartRegions from ClipartRegions &\n        // TemplateClipartRegions\n        if (options.clipart.regions) {\n            for (const region of options.clipart.regions) {\n                // Create the CustomClipartRegion\n                const customClipartRegion = new CustomClipartRegionModel({\n                    region: region,\n                    stroke_width: region.stroke_width\n                });\n\n                // Make sure the clipart region is in the colors_available collection\n                const color = this.colors_available.getItemFromURI(region.color);\n                if (!color) {\n                    customClipartRegion.color = this.colors_available.find(v => v.default) || this.colors_available[0];\n                } else {\n                    customClipartRegion.color = color;\n                }\n                configuredClipart.regions.push(customClipartRegion);\n            }\n        }\n\n        if (addToProduct) {\n            this.configured.clipart_elements.push(configuredClipart);\n        }\n\n        return configuredClipart;\n    }\n\n    createClipartElement(configuredClipart: ConfiguredDragDropBuyProductClipart): DragDropBuyElement {\n        const element = new DragDropBuyElement(configuredClipart);\n        element.color = this.configured.material_color as Color;\n        element.font = this.configured.font as Font;\n        element.initialized.then(() => {\n            this.updateColor();\n            setTimeout(() => {\n                element.updatePaper();\n                this.canvasService.flushFrameTasks();\n                this.repositionLayout();\n            })\n        });\n\n        configuredClipart.bind('remove', () => {\n            if (this.configured.clipart_elements.indexOf(configuredClipart) != -1) {\n                this.configured.clipart_elements.splice(this.configured.clipart_elements.indexOf(configuredClipart), 1);\n            }\n            this.repositionLayout(true);\n        }, this);\n\n        this.element_manager.add(element);\n\n        configuredClipart.bind('change:text', this.repositionLayout.bind(this), this);\n        return element;\n    }\n\n    addElement(model: any) {\n        if (!model.text) {\n            model.text = model.name;\n        }\n\n        // Place element way off to the right so it will be the last one in the list\n        // It will get correctly placed with the repositionLayout call\n        model.x = 10000;\n\n        let element = null;\n        if (model instanceof ConfiguredDragDropBuyProductClipart) {\n            this.configured.clipart_elements.push(model);\n            element = this.createClipartElement(model);\n        }\n        else if (model instanceof DragDropBuyProductClipart) {\n            element = this.createClipartElement(this.createConfiguredClipart(model, true));\n        }\n\n        if (element) {\n            element.initialized.then(() => {\n                this.repositionLayout(true);\n                this.element_manager.add(element);\n                this.selection_manager.activate(element);\n                this.selection_manager.drawControls();\n                this.trigger('activated:element');\n            })\n        }\n    }\n\n    removeElement(model: ConfiguredDragDropBuyProductClipart): void {\n        const index = this.configured.clipart_elements.indexOf(model);\n        this.configured.clipart_elements.splice(index, 1);\n        this.repositionLayout();\n    }\n\n    get textSize(): number {\n        switch (this.configured.text_size) {\n            case SizeOptions.SMALL:\n                return 12;\n            case SizeOptions.MEDIUM:\n                return 18;\n            case SizeOptions.LARGE:\n                return 24;\n            default:\n                return 12;\n        }\n    }\n\n    override async preSave() {\n        await super.preSave();\n        window.scrollTo(0, 0);\n\n        this.canvasService.setupCanvasForExport();\n        this.canvasService.in_save_state = false;\n\n        this.configured.source = this.canvasService.exportSVG();\n        this.configured.canvas_preview = this.canvasService.exportPNG();\n\n        this.canvasService.in_save_state = false;\n\n        this.canvasService.resetCanvasFromExport();\n    }\n\n    override async save($event) {\n        // Generate canvas preview\n        await super.save($event)\n    }\n\n    override onSaveSuccess(response) {\n        super.onSaveSuccess(response);\n\n        this.repositionLayout()\n    }\n\n    override onSaveFailure(response) {\n        super.onSaveFailure(response);\n\n        this.saving = false;\n\n        if (response.data && response.data.errors) {\n            this.errors.merge(response.data.errors);\n        }\n        else {\n            this.errors.add('__all__', 'Unable to add the product to the cart.');\n        }\n    }\n\n    onWindowResize() {\n        if (this.resizeTimeout) {\n            clearTimeout(this.resizeTimeout);\n        }\n\n        this.resizeTimeout = setTimeout(() => {\n            this.repositionLayout();\n        }, 50);\n    }\n\n    get autoPageTransition() {\n        return false;\n    }\n}\n","import {Services} from '../../../core/services/Services';\nimport ClipperWorkerService from '../services/ClipperWorkerService';\nimport PaperCanvasService from './PaperCanvasService';\n\n// These will need to be kept in sync with 'js-angusj-clipper'\nenum PolyFillType {\n    EvenOdd = \"evenOdd\",\n    NonZero = \"nonZero\",\n    Positive = \"positive\",\n    Negative = \"negative\"\n}\nenum JoinType {\n    Square = \"square\",\n    Round = \"round\",\n    Miter = \"miter\"\n}\nenum EndType {\n    ClosedPolygon = \"closedPolygon\",\n    ClosedLine = \"closedLine\",\n    OpenButt = \"openButt\",\n    OpenSquare = \"openSquare\",\n    OpenRound = \"openRound\"\n}\nenum ClipType {\n    Intersection = \"intersection\",\n    Union = \"union\",\n    Difference = \"difference\",\n    Xor = \"xor\"\n}\n\nenum EndTypes {\n    round = EndType.OpenRound,\n    square = EndType.OpenSquare,\n    butt = EndType.OpenButt,\n    closed = EndType.ClosedPolygon\n}\n\nenum JoinTypes {\n    miter = JoinType.Miter,\n    round = JoinType.Round,\n    bevel = JoinType.Square,\n}\n\nenum FillTypes {\n    evenodd = PolyFillType.EvenOdd,\n    nonzero = PolyFillType.NonZero\n}\n\nexport default class ClipperService {\n    scale = 1000;\n\n    private pathToData(path: paper.Path, flatness: number = 0.5) {\n        const pathCopy = path.clone() as paper.Path;\n        pathCopy.remove();\n        pathCopy.flatten(flatness);\n        return pathCopy.segments.map(({point}) =>\n            ({\n                x: Math.round(point.x * this.scale),\n                y: Math.round(point.y * this.scale)\n            })\n        );\n    }\n\n    public async offset(path: paper.Path, offset: number, flatness: number = 0.5): Promise<paper.Path[]> {\n        const {closed, strokeJoin, strokeCap, miterLimit} = path;\n\n        const data = this.pathToData(path, flatness);\n\n        let offset_paths = await Services.get<ClipperWorkerService>('ClipperWorkerService').offsetToPaths(\n            {\n                delta: offset * this.scale,\n                miterLimit: miterLimit * this.scale,\n                arcTolerance: 0.25 * this.scale,\n                offsetInputs: [{\n                    joinType: JoinTypes[strokeJoin],\n                    endType: closed ? EndTypes.closed : EndTypes[strokeCap],\n                    data\n                }]\n            }\n        )\n\n        if (!offset_paths) {\n            return [];\n        }\n\n        let paper_paths = [];\n        for (const path of offset_paths) {\n            let paper_path = new (Services.get<PaperCanvasService>('PaperCanvasService')).paper.Path({\n                closed,\n                segments: path.map(point => ({x: point.x / this.scale, y: point.y / this.scale}))\n            });\n            paper_path.remove();\n            paper_paths.push(paper_path);\n        }\n\n        return paper_paths;\n    };\n\n    public async unite(paths: paper.Path[], flatness: number = 0.5): Promise<paper.Path[]> {\n        if (!paths || !paths[0]) {\n            return [];\n        }\n\n        const {closed, fillRule} = paths[0];\n\n        const data = [];\n        for (const path of paths) {\n            data.push(this.pathToData(path, flatness));\n        }\n\n        let united_paths_points = await Services.get<ClipperWorkerService>('ClipperWorkerService').clipToPaths({\n            clipType: ClipType.Union,\n            subjectFillType: FillTypes[fillRule],\n            subjectInputs: [{\n                closed,\n                data\n            }]\n        });\n\n        if (!united_paths_points) {\n            return [];\n        }\n\n        let paper_paths = [];\n        for (const path of united_paths_points) {\n            let paper_path = new (Services.get<PaperCanvasService>('PaperCanvasService')).paper.Path({\n                closed,\n                segments: path.map(point => ({x: point.x / this.scale, y: point.y / this.scale}))\n            });\n            paper_path.remove();\n            paper_paths.push(paper_path);\n        }\n\n        return paper_paths;\n    };\n\n    public async pointsToPath(points: any[], w_scale: number, h_scale: number, x_offset: number, y_offset: number, sides: number, radius: number, offset_width: number) {\n        let path_data_set = await Services.get<ClipperWorkerService>('ClipperWorkerService').pointsToPath(points, w_scale, h_scale, x_offset, y_offset, sides, radius, offset_width);\n\n        let paths = [];\n        for (const path_data of path_data_set) {\n            let path = new (Services.get<PaperCanvasService>('PaperCanvasService')).paper.Path(path_data);\n            paths.push(path);\n        }\n\n        return paths;\n    }\n}","export class LetteringValidator {\n    SINGLE_PICK_CHARS = ['a','b','d','e','g','o','p','q','A','D','O','P','Q','R','0','4','6','9', '@', '#',];\n    DOUBLE_PICK_CHARS = ['B','8','%','&'];\n    // Half of the fonts have 0 picks for $ so just exclude it\n\n\n    hasGangRuns(text: string) {\n        return this.gangRunLine(text) != null\n    }\n\n    gangRunLine(text) {\n        return  this.gangRunLineForSeparator(text, '\\n') ||\n                this.gangRunLineForSeparator(text, ' ')  ||\n                this.gangRunLineForSeparator(text, '\\t');\n    }\n\n    gangRunLineForSeparator(text, separator) {\n        let lines = this.reduceLines(text, separator);\n\n        // Dont flag for 2 items or less\n        if (lines.length <= 2) {\n            return null;\n        }\n\n        let group_size = 1;\n        // Check for multiple line/group matching, for instance \"a b a b\" matches with set size 2\n        while (group_size <= lines.length / 2) {\n            // Skip all group sizes that cannot be evenly split\n            if (lines.length % group_size != 0) {\n                group_size += 1;\n                continue;\n            }\n\n            let groups = [];\n            for (let i = 0; i < lines.length / group_size; i++) {\n                groups.push(lines.slice(i * group_size, (i + 1) * group_size))\n            }\n\n            if (this.consecutiveMatchCount(groups) == groups.length - 1) {\n                return {\n                    'text': groups[0].join(separator),\n                    'count': groups.length - 1\n                }\n            }\n\n            group_size += 1;\n        }\n\n        return null;\n    }\n\n    private consecutiveMatchCount(groups) {\n        let matches = 0;\n        for (let set = 1; set < groups.length; set += 1) {\n            for (let i = 0; i < groups[0].length; i++) {\n                if (groups[0][i] != groups[set][i]) {\n                    return matches;\n                }\n            }\n            matches += 1;\n        }\n        return matches;\n    }\n\n    private reduceLines(text, separator) {\n        let lines = text.split(separator);\n\n        let reduced_lines = [];\n        for (let i = 0; i < lines.length; i++) {\n            lines[i] = lines[i].trim();\n            if (lines[i] != '') {\n                reduced_lines.push(lines[i]);\n            }\n        }\n\n        return reduced_lines;\n    }\n\n    public countPicks(text: string) {\n        let count = 0;\n        for (const char of text) {\n            if (this.SINGLE_PICK_CHARS.indexOf(char) != -1) {\n                count += 1;\n            }\n        }\n        for (const char of text) {\n            if (this.DOUBLE_PICK_CHARS.indexOf(char) != -1) {\n                count += 2;\n            }\n        }\n        return count;\n    }\n}","import CustomEditorService from './CustomEditorService';\nimport {TemplateOptionSet} from '../models/TemplateOptionSet';\nimport MessageList from '../../../core/utils/MessageList';\nimport {ToolTypeEnum} from '../models/enums';\nimport {TextElement} from '../tool/TextElement';\nimport {LetteringValidator} from '../helpers/LetteringValidator';\nimport {SimplePromise} from \"../../../core/utils/SimplePromise\";\n\n\nexport default class LetteringToolService extends CustomEditorService {\n    font_lock: boolean = true;\n    validator: LetteringValidator;\n\n    override fetch_masks = false;\n    override show_size_change_warning = false;\n    override allow_autosize_artboard = false;\n\n    constructor() {\n        super();\n\n        this.validator = new LetteringValidator();\n        this.canvas_service.fixed_camera = true;\n        this.state_service.enabled = false;\n    }\n\n    override setupFromProduct(base, configured): void {\n        this.base = base;\n        this.configured = configured;\n        this.setupConfiguredFromBase();\n    }\n\n    override setupConfiguredFromBase(needs_additional_setup=false) {\n        super.setupConfiguredFromBase(needs_additional_setup);\n\n        if (this.configured.id) {\n            this.font_lock = false;\n        }\n\n        this.configured.tool_type = ToolTypeEnum.LETTERING\n\n        this.selection_manager.controls_disabled = true;\n        this.selection_manager.dragging_disabled = true;\n\n        this.configured.bind('change:option_reverse_cut', () => {\n            this.element_manager.textElements[0].flipX = this.configured.option_reverse_cut === true;\n        }, this);\n\n        if (this.configured.material_color) {\n            this.canvas_service.setCanvasBackgroundColorOverride(`#${this.configured.material_color.background_color}`);\n        }\n        this.configured.bind('change:material_color', () => {\n            let color = this.configured.material_color;\n            if (color && color.background_color) {\n                this.canvas_service.setCanvasBackgroundColorOverride(`#${color.background_color}`);\n            }\n        }, this);\n\n        this.setup_complete.then(() => {\n            this.updateTextElementSize();\n        });\n    }\n\n    get text_element(): TextElement {\n        if (this.element_manager.textElements.length == 0) {\n            return null;\n        }\n        return this.element_manager.textElements[0];\n    }\n\n    /*\n        Setup Tool Elements From Configured\n\n        We only want to setup text elements in the lettering tool\n     */\n    override async setupToolElementsFromConfigured() {\n        // We only want to allow text elements in the lettering tool so lets only load those\n\n        // We must wait for paper and the canvas to finish loading first\n        await this.canvas_service.setup_complete;\n        await this.font_service.fonts.$promise;\n\n        // Text elements\n        for (const customText of this.configured.text_elements) {\n            this.addTextElement(customText, false, true);\n\n            let element = this.element_manager.elementForModel(customText);\n\n            let handleUpdate = () => {\n                // This needs to happen in a timeout due to how update paper is handled\n                element.once('updatePaper', () => {\n                    this.updateTextElementSize(true);\n                }, this);\n            }\n\n            customText.bind('change:text', handleUpdate, this);\n            customText.bind('change:symbol_range_start', handleUpdate, this);\n            customText.bind('change:symbol_range_end', handleUpdate, this);\n            customText.bind('change:csv_data', handleUpdate, this);\n            customText.bind('change:symbol_name', handleUpdate, this);\n            customText.bind('change:font', handleUpdate, this);\n\n            customText.bind('change:text', () => {\n                this.hasGangRun();\n                this.setTransferPicks();\n            }, this);\n        }\n        this.trigger('templateTextCreated');\n\n        if (this.tool_factory.promises.length > 0) {\n            console.warn('The design was not fully loaded in the initial request.');\n            await SimplePromise.all(this.tool_factory.promises);\n        }\n\n        // If single color, force all new elements to use the configured color\n        this.updateElementColorsFromConfigured();\n    }\n\n    /*\n        Setup Custom Elements From Template\n\n        We only want to setup text elements in the lettering tool\n     */\n    override async setupCustomElementsFromTemplate() {\n        await this.canvas_service.setup_complete;\n        await this.font_service.fonts.$promise;\n        this.configured.configure = false;\n        for (const t of this.base.text_elements) {\n            this.createTextElement(t, true, false);\n        }\n        this.trigger('templateTextCreated');\n    }\n\n    override onHeightChange() {\n        if (this.font_lock && this.text_element) {\n            let scale = this.text_element.bounds.height / this.text_element.bounds.width;\n            this.configured.width = this.configured.height / scale;\n        }\n\n        this.updateTextElementSize(false);\n    }\n\n    override onWidthChange() {\n        if (this.font_lock && this.text_element) {\n            let scale = this.text_element.bounds.width / this.text_element.bounds.height;\n            this.configured.height = this.configured.width / scale;\n        }\n\n        this.updateTextElementSize(true);\n    }\n\n    updateTextElementSize(from_width?: boolean) {\n        if (!this.width || !this.height) {\n            return;\n        }\n\n        let element = this.text_element;\n\n        if (!element.width || !element.height) {\n            element.width = this.width;\n            element.height = this.height;\n        }\n\n        if (element) {\n            element.updatePaperOnFrame();\n\n            element.flipX = this.configured.option_reverse_cut === true;\n\n            let ratio = 0;\n            if (element.font_scale)\n                if ((!element.bounds.height || element.bounds.height == 0) || (!element.bounds.width || element.bounds.width == 0)) {\n                    ratio = element.height / element.width;\n                }\n                else {\n                    ratio = element.bounds.height / element.bounds.width;\n                }\n            else {\n                ratio = this.height / this.width;\n            }\n\n            // 0 or null for height, cant update until something valid is entered\n            if (ratio == 0 || isNaN(ratio)) {\n                return;\n            }\n\n            if (element.font_scale) {\n                if (from_width) {\n                    this.configured.height = this.configured.width * ratio;\n                }\n                else {\n                    this.configured.width = this.configured.height * (1/ratio);\n                }\n            }\n\n            let canvas_width = this.canvas_service.maxCanvasWidth();\n            let canvas_height = this.canvas_service.maxCanvasHeight();\n            let canvas_ratio = canvas_height / canvas_width;\n\n            let new_width;\n            let new_height;\n            if (canvas_ratio > ratio) {\n                new_width = canvas_width;\n                new_height = canvas_width * ratio;\n            }\n            else {\n                new_height = canvas_height;\n                new_width = canvas_height / ratio;\n            }\n\n            this.canvas_service.workspace.artboard.width = new_width;\n            this.canvas_service.workspace.artboard.height = new_height;\n\n            element.width = new_width;\n            element.height = new_height;\n            element.x = new_width / 2;\n            element.y = new_height / 2;\n            element.updatePaperOnFrame();\n            this.canvas_service.setCanvasSizeFromDesign();\n        }\n\n        // For some reason this needs to be called in a timeout or it will break the initial display even so the code\n        // above should be synchronous\n        setTimeout(() => {\n            this.errors = new MessageList();\n            if (this.configured.material && !this.configured.material.sizeIsValid(this.configured.width, this.configured.height)) {\n                this.errors.merge(this.configured.material.errors.list);\n            }\n            if (this.configured.material_color && !this.configured.material_color.sizeIsValid(this.configured.width, this.configured.height)) {\n                this.errors.merge(this.configured.material_color.errors.list);\n            }\n        });\n    }\n\n    get transfer_picks_option() {\n        for (let option of this.configured.options) {\n            for (let tag of (option.option_set as TemplateOptionSet).tags) {\n                if (tag.slug == 'pick-charge') {\n\n                    return option;\n                }\n            }\n        }\n        return null;\n    }\n\n    get pick_count() {\n        if (this.element_manager.textElements.length == 0) {\n            return;\n        }\n\n        let text_element = this.text_element;\n\n        return this.validator.countPicks(text_element.model.text);\n    }\n\n    setTransferPicks() {\n        let picks_option =  this.transfer_picks_option;\n        if (!picks_option) {\n            return;\n        }\n\n        let options = (picks_option.option_set as TemplateOptionSet).options;\n        options.sort((a,b) => {return parseInt(a.option_value) - parseInt(b.option_value)});\n\n        let picks = this.pick_count;\n        let last_valid = options[0];\n        for (let i = 0; i < options.length; i++) {\n            if (parseInt(options[i].option_value) < picks) {\n                last_valid = options[i];\n            }\n            else {\n                break;\n            }\n        }\n\n        picks_option.option = last_valid;\n    }\n\n    override validate(): boolean {\n        super.validate();\n\n        if (this.hasGangRun()) {\n            this.errors.add('gang_run', 'Looks like your design has duplicates. Please remove them and update the quantity.')\n        }\n\n        if (this.element_manager.textElements.length == 0) {\n            this.errors.add('emptyText', 'Add Text to Continue');\n        }\n\n        this.validateTextSizes();\n        this.validateCodeSizes();\n        if (this.text_size_too_small) {\n            this.errors.add('size', 'The letter height must be greater than 0.25 inches.')\n        }\n\n        if (this.hasErrors) {\n            this.trigger('sync');\n        }\n\n        return !this.hasErrors;\n    }\n\n    hasGangRun(): boolean {\n        if (this.element_manager.textElements.length == 0) {\n            return;\n        }\n\n        let text_element = this.text_element;\n        let text = text_element.model.text;\n\n        return this.validator.hasGangRuns(text);\n    }\n\n    fixGangRun() {\n        if (this.element_manager.textElements.length == 0) {\n            return;\n        }\n\n        let text_element = this.text_element;\n\n        let gang_run = this.validator.gangRunLine(text_element.model.text);\n\n        if (!gang_run) {\n            return;\n        }\n\n        // Grab the current text scaling so that we can lock the font scale proportions of the gang run to the fixed one\n        let original_scale_x = text_element.scaled_x;\n        let original_scale_y = text_element.scaled_y;\n\n        text_element.model.text = gang_run.text;\n        this.quantity = this.quantity * gang_run.count;\n\n        let new_scale_x = text_element.scaled_x;\n        let new_scale_y = text_element.scaled_y;\n\n        // This no longer seems to work\n        this.width = this.width * (original_scale_x / new_scale_x);\n        this.height = this.height * (original_scale_y / new_scale_y);\n    }\n\n    override proportionsLocked() {\n        return this.font_lock;\n    }\n\n    override toggleLockedProportions() {\n        this.font_lock = !this.font_lock;\n        if (this.element_manager.elements.length > 0) {\n            this.text_element.font_scale = this.font_lock;\n            this.text_element.updatePaper();\n        }\n        this.updateTextElementSize();\n    }\n}\n","import {EventDispatcher} from '../utils/EventDispatcher';\n\n\nexport default abstract class MultiWorkerService extends EventDispatcher {\n    active_worker = 0;\n    workers = [];\n\n    constructor(url, max_processes = 4) {\n        super();\n        let cpu_cores = window.navigator.hardwareConcurrency;\n\n        if (!cpu_cores) {\n            cpu_cores = 1;\n        }\n\n        let thread_count = Math.max(1, Math.min(max_processes, cpu_cores));\n        for (let i = 0; i < thread_count; i++) {\n            let worker = new Worker(url);\n            worker.onmessage = this.onmessage.bind(this);\n            worker.onerror = this.onerror.bind(this);\n            this.workers.push(worker);\n        }\n    }\n\n    postMessage(data) {\n        // Round robin balancing\n        let worker = this.workers[this.active_worker];\n\n        this.active_worker += 1;\n        this.active_worker = this.active_worker % this.workers.length;\n\n        worker.postMessage(data);\n    }\n\n    terminate() {\n        for (const worker of this.workers) {\n            worker.terminate();\n        }\n        this.workers = [];\n    }\n\n    abstract onmessage(event);\n    abstract onerror(event);\n}\n","import {IPromise, SimplePromise} from '../../../core/utils/SimplePromise';\nimport MultiWorkerService from '../../../core/services/MultiWorkerService';\n\nexport default class ClipperWorkerService extends MultiWorkerService {\n    private id_index = 1;\n\n    constructor() {\n        super('/static/js/worker/clipper.worker.js', 3);\n    }\n\n    onmessage(event) {\n        let action_id = event.data.action_id;\n        let result = event.data.result;\n\n        this.trigger(`resolved-${action_id}`, result);\n    }\n\n    onerror(event) {\n        console.error(event);\n    }\n\n    private sendDataToClipper(function_name, function_args) {\n        let id = this.id_index++;\n        let deferred = SimplePromise.defer();\n\n        this.once(`resolved-${id}`, (data) => {\n            deferred.resolve(data);\n        }, this);\n\n        this.postMessage({\n            action: 'clipper-lib',\n            action_id: id,\n            function_name: function_name,\n            function_args: function_args\n        });\n\n        return deferred.promise;\n    }\n\n    offsetToPaths(data): IPromise<any> {\n        return this.sendDataToClipper('offsetToPaths', [data]);\n    }\n\n    clipToPaths(data): IPromise<any> {\n        return this.sendDataToClipper('clipToPaths', [data]);\n    }\n\n    pointsToPath(points: any[], w_scale: number, h_scale: number, x_offset: number, y_offset: number, sides: number, radius: number, offset_width: number): IPromise<any> {\n        let id = this.id_index++;\n        let deferred = SimplePromise.defer();\n\n        this.once(`resolved-${id}`, (data) => {\n            deferred.resolve(data);\n        }, this);\n        \n        this.postMessage({\n            action: 'image-to-path',\n            action_id: id,\n            offset_points: points,\n            w_scale: w_scale,\n            h_scale: h_scale,\n            x_offset: x_offset,\n            y_offset: y_offset,\n            sides: sides,\n            radius: radius,\n            offset_width: offset_width\n        });\n\n        return deferred.promise;\n    }\n}","import Color from 'colorjs.io';\n\nexport default class ColorService {\n    // WARNING: Do not use 'new Color()' or it will cause webpack to fail to load pages\n    // Use 'new this.Color()' instead\n\n    color_api_import;\n    Color: typeof Color;\n    loaded: boolean;\n    constructor() {\n        this.color_api_import = import('colorjs.io');\n        this.color_api_import.then((v) => {\n            this.Color = v.default;\n            this.loaded = true;\n        })\n    }\n\n    complementary(code) {\n        if (!this.loaded) {\n            return [];\n        }\n\n        let v = this.parseColor(code);\n        if (!v) {\n            return null;\n        }\n\n        let angles = [30, -30, 120, -120, 90, -90, 180];\n\n        let colors = [];\n        for (let angle of angles) {\n            let c: Color = v.clone();\n            c.hsv.h += angle;\n            colors.push(c);\n        }\n\n        colors.push(v);\n        colors.sort((a, b) => {\n            if (a.hsv.h > b.hsv.h) {\n                return 1;\n            }\n            else if (a.hsv.h < b.hsv.h) {\n                return -1;\n            }\n            return 0;\n        });\n\n        return colors.map(v => v.toString({format: 'hex'}));\n    }\n\n    analogous(code) {\n        if (!this.loaded) {\n            return [];\n        }\n\n        let v = this.parseColor(code);\n        if (!v) {\n            return null;\n        }\n\n        let left = v.clone();\n        let right = v.clone();\n\n        left.hsv.h -= 30;\n        right.hsv.h += 30;\n        return [left, v, right].map(v => v.toString({format: 'hex'}));\n    }\n\n    monochromatic(code, count) {\n        if (!this.loaded) {\n            return [];\n        }\n\n        let v = this.parseColor(code);\n        if (!v) {\n            return null;\n        }\n\n        let start = v.clone();\n        let end = v.clone();\n\n        start.oklch.l = 0;\n        end.oklch.l = 1;\n\n        let colors = start.steps(end, {\n            outputSpace: 'srgb',\n            steps: count+2\n        });\n\n        return colors.slice(1, colors.length - 1).map(v => v.toString({format: 'hex'}));\n    }\n\n    shades(code, count) {\n        if (!this.loaded) {\n            return [];\n        }\n\n        let v = this.parseColor(code);\n        if (!v) {\n            return null;\n        }\n\n        let end = new this.Color('black');\n\n        let colors = v.steps(end, {\n            outputSpace: 'srgb',\n            steps: count+1\n        });\n\n        return colors.slice(0, colors.length - 1).map(v => v.toString({format: 'hex'}));\n    }\n\n    tints(code, count) {\n        if (!this.loaded) {\n            return [];\n        }\n\n        let v = this.parseColor(code);\n        if (!v) {\n            return null;\n        }\n\n        let end = new this.Color('white');\n\n        let colors = v.steps(end, {\n            outputSpace: 'srgb',\n            steps: count+1\n        });\n\n        return colors.slice(0, colors.length - 1).map(v => v.toString({format: 'hex'}));\n    }\n\n    tones(code, count) {\n        if (!this.loaded) {\n            return [];\n        }\n\n        let v = this.parseColor(code);\n        if (!v) {\n            return null;\n        }\n\n        let end = new this.Color('#808080');\n\n        let colors = v.steps(end, {\n            outputSpace: 'srgb',\n            steps: count+1\n        });\n\n        return colors.slice(0, colors.length - 1).map(v => v.toString({format: 'hex'}));\n    }\n\n    rgbToHex(data) {\n        if (!this.loaded) {\n            return null;\n        }\n\n        let c = new this.Color('srgb', data).toString({format: 'hex'});\n        if (c.length == 4) {\n            return `#${c[1]}${c[1]}${c[2]}${c[2]}${c[3]}${c[3]}`;\n        }\n        return c;\n    }\n\n    lerpColor(a, b, amount) {\n        return new this.Color(a).mix(b, amount).toString({format: 'hex'})\n    }\n\n    correctCode(value: string) {\n        if (!value) {\n            return value;\n        }\n        if (!(typeof value === 'string')) {\n            return value;\n        }\n    }\n\n    addTransparency(code: string, percent: number): string {\n        let v = this.parseColor(code);\n\n        if (!v) {\n            return null;\n        }\n\n        v.alpha = percent\n        return v.toString({format: 'hex'});\n    }\n\n    colorVarToValue(color_var: string): string {\n        let style = getComputedStyle(document.body);\n        return style.getPropertyValue(color_var);\n    }\n\n    parseColor(text: string) {\n        if (!text) {\n            return null;\n        }\n\n        if (!this.loaded) {\n            return null;\n        }\n\n        try {\n            return new this.Color(text);\n        }\n        catch (e) {\n            // Sometimes people put FFFFFF instead of #FFFFFF so lets try to correct it\n            if (text.length == 6 || text.length == 3) {\n                try {\n                    return new this.Color('#' + text);\n                }\n                catch (e) {\n                    return null;\n                }\n            }\n        }\n\n        return null;\n    }\n\n    colorsWithBrightness(code, count, index?) {\n        if (!this.loaded) {\n            return '';\n        }\n\n        let v = this.parseColor(code);\n\n        let amount = 360 / count;\n\n        if (index != null) {\n            v.oklch.h += amount * index;\n            return v.toString({format: 'hex'});\n        }\n\n        let colors = [];\n        for (let i = 0; i < count; i++) {\n            let c: Color = v.clone();\n            c.oklch.h += amount * i;\n            colors.push(c);\n        }\n        return colors.map(v => v.toString({format: 'hex'}));\n    }\n}","import CustomEditorService from './CustomEditorService';\nimport {Services} from '../../../core/services/Services';\nimport {Model} from '../../../core/models/Model';\nimport {toRaw} from 'vue';\nimport {SelectionManager} from './SelectionManager';\nimport {SelectionStateManager} from \"./SelectionStateManager\";\n\nclass StateChange {\n    changes: {source: Model; clone: any}[];\n\n    constructor(changes: {source: Model; clone: any}[]) {\n        this.changes = changes;\n    }\n\n    apply() {\n        // Go over each saved model and revert back any fields that have changed\n        for (const change of this.changes) {\n            for (const field of change.source.getFields()) {\n                let value = change.clone[field];\n                if (value instanceof Array) {\n                    // Undo removed items\n                    for (const item of value) {\n                        let found = change.source[field].find(v => toRaw(v) === toRaw(item));\n                        if (!found) {\n                            change.source[field].push(item);\n                            Services.get<CustomEditorService>('ProductService').tool_factory.addElement(item);\n                        }\n                    }\n\n                    // Undo added items\n                    let extra = [];\n                    for (const item of change.source[field]) {\n                        let found = value.find(v => toRaw(v) === toRaw(item));\n                        if (!found) {\n                            extra.push(item);\n                            item.remove();\n                        }\n                    }\n                    for (const item of extra) {\n                        change.source[field].splice(change.source[field].indexOf(toRaw(item)))\n                    }\n                }\n                else {\n                    // Don't just set the value to prevent unnecessary trigger calls\n                    if (toRaw(value) !== toRaw(change.source[field])) {\n                        change.source[field] = value;\n                    }\n                }\n            }\n        }\n    }\n}\n\nexport class ToolStateService {\n    back_states: StateChange[] = [];\n    forward_states: StateChange[] = []\n    current_state: StateChange;\n    clipboard_data: any;\n    clipboard_model: typeof Model;\n    enabled: boolean = true;\n\n    constructor() {\n        window.addEventListener('keydown', (event) => {\n            if (!this.enabled) {\n                return;\n            }\n\n            // Make sure they are not within a text element\n            if (document.activeElement.tagName == 'TEXTAREA' || (document.activeElement.tagName == 'INPUT' && document.activeElement.getAttribute('type') == 'text')) {\n                return;\n            }\n\n            // If a modal is open, then ignore it\n            if (document.querySelector('.modal.show')) {\n                return;\n            }\n\n            if (event.key == 'z' && event.ctrlKey && !event.shiftKey) {\n                this.undo();\n            }\n            if ((event.key == 'z' || event.key == 'Z') && event.ctrlKey && event.shiftKey) {\n                this.redo();\n            }\n            if (event.key == 'c' && event.ctrlKey) {\n                let selection = Services.get<SelectionManager>('SelectionManager').selection;\n                if (selection) {\n                    let model = selection.model;\n                    this.clipboard_data = this.copy(model);\n                    this.clipboard_model = model.constructor;\n                }\n            }\n            if (event.key == 'v' && event.ctrlKey) {\n                if (this.clipboard_model && this.clipboard_data) {\n                    let item = new this.clipboard_model(this.clipboard_data);\n                    let element = Services.get<CustomEditorService>('ProductService').tool_factory.addElement(item as any);\n                    if (element) {\n                        element.centerVertically();\n                        element.centerHorizontally();\n                    }\n                }\n            }\n        });\n        window.addEventListener('mousedown', (event) => {\n            if (!this.enabled) {\n                return;\n            }\n\n            this.pushState();\n        });\n        window.addEventListener('mouseup', (event) => {\n            if (!this.enabled) {\n                return;\n            }\n\n            setTimeout(() => {\n                this.pushState();\n            })\n        });\n    }\n\n    public hasStateChanged(changes) {\n        // Make sure the last state is not the same as the current state\n        // I wish there was some way to hash the change value but javascript cannot easily hash objects or store them as keys\n\n        // Always return true for the first one so it will be pushed\n        if (!this.current_state) {\n            return true;\n        }\n\n        if (this.current_state.changes.length != changes.length) {\n            return true;\n        }\n\n        for (const current of changes) {\n            let last = this.current_state.changes.find(v => v.source == current.source);\n            if (!last) {\n                return true;\n            }\n            for (const field of current.source.fields) {\n                if (current.clone[field] instanceof Array) {\n                    if (current.clone[field].length !== last.clone[field].length) {\n                        return true;\n                    }\n                }\n                else {\n                    if (current.clone[field] !== last.clone[field]) {\n                        return true;\n                    }\n                }\n            }\n        }\n\n\n        return false;\n    }\n\n    public pushState() {\n        if (!Services.isRegistered('ProductService')) {\n            return;\n        }\n        if (!Services.get<CustomEditorService>('ProductService').setup_complete.isResolved()) {\n            return;\n        }\n\n\n        let changes = this.buildStateChangeList();\n\n        // Make sure we are not pushing the same state to the list\n        // Otherwise the undo/redo action can have no effect when applied since it's the same state\n        if (!this.hasStateChanged(changes)) {\n            return;\n        }\n\n        // A new change has been made so all forward states are invalid\n        this.forward_states = [];\n\n        let state = new StateChange(changes);\n        if (this.current_state) {\n            this.back_states.push(this.current_state);\n        }\n        this.current_state = state;\n\n        // Only allow 100 state pushes so we don't overload the browser memory\n        if (this.back_states.length > 100) {\n            this.back_states.shift();\n        }\n    }\n\n    private buildStateChangeList() {\n        // We need to capture a snapshot of the state of the design tool\n        // To make this easier we will create a flat list of the item and its cloned data to restore\n\n        let configured = Services.get<CustomEditorService>('ProductService').configured;\n        let changes = [];\n\n        // Recursive walking of the model tree\n        let walk = (model: Model) => {\n            if (model === null || model === undefined || !(model instanceof Model) || !model.fields) {\n                return;\n            }\n\n            // Force all data to raw so equality checks will not fail due to vue's reactivity proxy system\n            model = toRaw(model);\n\n            // Guard against recursive infinite loops. Induces a performance penalty but prevents crashing.\n            if (changes.find(v => v.source == model)) {\n                return;\n            }\n\n            let data = {\n                source: model,\n                clone: {}\n            }\n            for (const field of model.fields) {\n                // Again force to raw for equality checks. Vue can be a pain sometimes...\n                let value = toRaw(model.getField(field).cleaned);\n\n                // Other models will be added to the list to change\n                if (value instanceof Model) {\n                    // Skip readonly fields since the data cannot/should not be modified\n                    if (!model.getField(field).read_only) {\n                        walk(value);\n                    }\n                }\n                else if (value instanceof Array) {\n                    // Clone array so it can't be modified\n                    value = [...value];\n                    for (const item of value) {\n                        if (!model.getField(field).read_only) {\n                            walk(item);\n                        }\n                    }\n                }\n\n                data.clone[field] = value;\n            }\n\n            changes.push(data);\n        };\n\n        walk(configured);\n\n        return changes;\n    }\n\n    public copy(model: Model) {\n        model = toRaw(model);\n        let data = {}\n        for (const field of model.fields) {\n            let value = toRaw(model.getField(field).cleaned);\n\n            // Other models will be copied if it is not readonly\n            if (value instanceof Model) {\n                if (!model.getField(field).read_only) {\n                    this.copy(value);\n                }\n            }\n            else if (value instanceof Array) {\n                // Clone array so it can't be modified and copy if its not read only\n                if (!model.getField(field).read_only) {\n                    value = value.map(v => this.copy(v));\n                }\n                else {\n                    value = [...value];\n                }\n            }\n\n            data[field] = value;\n        }\n\n        data['id'] = null;\n        data['resource_uri'] = null;\n        return data;\n    }\n\n    public undo() {\n        if (this.current_state) {\n            this.forward_states.push(this.current_state);\n        }\n        this.current_state = this.back_states.pop();\n        this.current_state?.apply();\n        Services.get<SelectionStateManager>('SelectionStateManager').drawControls();\n    }\n\n    public redo() {\n        if (this.current_state) {\n            this.back_states.push(this.current_state);\n        }\n\n        this.current_state = this.forward_states.pop();\n        this.current_state?.apply();\n        Services.get<SelectionStateManager>('SelectionStateManager').drawControls();\n    }\n}","import {CursorHandleState, SelectionStateManager, SelectionType} from \"./SelectionStateManager\";\nimport {Services} from \"../../../core/services/Services\";\nimport {\n    distance,\n    midpoint,\n    pointDistance,\n    normalizedMidpoint,\n    signedDistance,\n    signedPerpendicularDistance,\n    angleBisectorVector,\n    orientedNormal,\n    lineIntersection,\n    signedOrientedDistance,\n    add,\n    scale,\n    Point,\n    subtract,\n    normal,\n    equals,\n    closestPointOnLine,\n    copy, signedAngleBetweenLines, radianToDegrees\n} from \"../../../core/utils/VectorUtils\";\nimport {PathPoint, UserShapeElement} from \"../tool/UserShapeElement\";\nimport {AbstractSelectionManager} from \"./AbstractSelectionManager\";\nimport {toRaw} from \"vue\";\n\nexport class PointSelectionManager extends AbstractSelectionManager implements SelectionType {\n    selection: UserShapeElement;\n    controls_layer: paper.Layer;\n    point_translate_handles: paper.Path[] = [];\n    line_translate_handles: paper.Path[] = [];\n    line_scale_handles: paper.Path[] = [];\n    radius_handles: paper.Path[] = [];\n    selected_point_translate_index = -1;\n    selected_radius_index = -1;\n    selected_line_translate_index = -1;\n    selected_line_scale_index = -1;\n    selected_item_translate = false;\n    radius_too_large = false;\n    connected_radius: PathPoint;\n    overlapping_tolerance = 2;\n    overlapping_points = [];\n    radius_snap: number;\n\n    saved_points: {pl: Point, p: Point, pn: Point, pnn: Point} = null;\n\n    constructor() {\n        super();\n        window['psm'] = this;\n    }\n\n    onMouseDown(event: paper.ToolEvent): void {\n        if (!this.selection) {\n            return;\n        }\n\n        // Only allow one selection at a time\n        let activated = false;\n\n        // Only allow left click to control the selection\n        if (event['event'] && event['event'].type == 'mousedown') {\n            if (event['event'].buttons != 1) {\n                return;\n            }\n        }\n\n        this.mouse_down_point = event.point;\n\n        this.selected_point_translate_index = activated ? -1 : this.pointTranslateControlHitTest(event.point);\n        activated = activated || this.selected_point_translate_index != -1;\n\n        this.selected_radius_index = activated ? -1 : this.radiusControlHitTest(event.point);\n        activated = activated || this.selected_radius_index != -1;\n\n        this.selected_line_translate_index = activated ? -1 : this.lineTranslateControlHitTest(event.point);\n        activated = activated || this.selected_line_translate_index != -1;\n\n        this.selected_line_scale_index = activated ? -1 : this.lineScaleControlHitTest(event.point);\n        activated = activated || this.selected_line_scale_index != -1;\n\n        // Save the points so the modifications are made from the source points.\n        // This prevents compounding rounding errors and undefined solutions.\n        // For example if point and point.next are moved to the same spot, like with the intersection limit,\n        // then the line between the two, and the angle, are undefined and result in a loss of information.\n        // In addition, as the points near the intersection the rounding/precision errors increase.\n        // These actions need to be non-descructive.\n        const point = this.activePoint();\n        if (point) {\n            this.saved_points = {\n                pl: copy(point.last),\n                p: copy(point),\n                pn: copy(point.next),\n                pnn: copy(point.next.next)\n            }\n        }\n\n        if (!activated && this.selection.item.hitTest(event.point)) {\n            this.selected_item_translate = true;\n        }\n\n        // Clicked on nothing, reset states, remove control points, and go back to the element manager\n        if (!this.activeHandle() && !this.selected_item_translate) {\n            Services.get<SelectionStateManager>('SelectionStateManager').toggleElementManager();\n            return;\n        }\n\n        // Save the last radius so it can be used for non-destructive modifications\n        for (const item of this.control_points) {\n            item.previous_radius = item.radius;\n        }\n\n        if (this.selected_point_translate_index != -1 || this.selected_radius_index != -1) {\n            for (const item of this.control_points) {\n                item.previous_radius = item.radius;\n            }\n        }\n\n        this.setupPlacementGuides();\n        this.drawVisualGuides();\n        this.setCursorState(this.activeHandle(), CursorHandleState.ACTIVE);\n        this.updateCursor(event);\n    }\n\n    drawVisualGuides() {\n        this.clearVisualGuides();\n\n        let point = this.activePoint();\n        if (!point) {\n            return;\n        }\n\n        // == Direct action visual guides ==\n        // Style the curve or line being modified in blue\n        if (this.selected_line_translate_index != -1 || this.selected_line_scale_index != -1) {\n            this.addLineVisual(point, this.active_line_stroke);\n        }\n        if (this.selected_radius_index != -1) {\n            if (point.radius != 0) {\n                this.addLineRadiusVisual(point, this.radius_too_large ? this.warning_line_stroke : this.active_line_stroke);\n            }\n        }\n\n        //  == Related action visuals ==\n        // Style the related curves or lines being affected in green\n        if (this.connected_radius) {\n            this.addLineRadiusVisual(this.connected_radius, this.warning_line_stroke);\n        }\n        if (point.next.radius != point.next.previous_radius) {\n            this.addLineRadiusVisual(point.next, this.warning_line_stroke);\n        }\n        if (point.last.radius != point.last.previous_radius) {\n            this.addLineRadiusVisual(point.last, this.warning_line_stroke);\n        }\n        if (this.selected_line_translate_index != -1) {\n            if (point.next.next.radius != point.next.next.previous_radius) {\n                this.addLineRadiusVisual(point.next.next, this.warning_line_stroke);\n            }\n        }\n        if (this.selected_line_scale_index != -1) {\n            this.addLineVisual(point.last, this.active_line_stroke);\n            this.addLineVisual(point.next, this.active_line_stroke);\n        }\n\n        for (const item of this.overlapping_points) {\n            this.addCircleVisual(item, this.merge_fill);\n        }\n\n        if (this.selected_radius_index === -1) {\n            // Show all - debug mode\n            if (this.show_all_visual_guides) {\n                for (const guide of this.placement_guides) {\n                    this.addLine(this.selection.toGlobalSpace(guide[0]), this.selection.toGlobalSpace(guide[1]), '#82ffee');\n                }\n            }\n\n            for (const guide of this.active_placement_guides) {\n                this.addLine(this.selection.toGlobalSpace(guide[0]), this.selection.toGlobalSpace(guide[1]), this.placement_guide_stroke);\n            }\n        }\n    }\n\n    lineHitTest(event: paper.ToolEvent) {\n        // Returns the line between the point and its next point\n        let min_distance = Number.MAX_SAFE_INTEGER;\n        let min_point = null;\n        for (const point of this.control_points) {\n            let a = this.selection.toGlobalSpace(point);\n            let b = this.selection.toGlobalSpace(point.next);\n\n            let ap = pointDistance(a, b, point.radius);\n            let bp = pointDistance(b, a, point.next.radius);\n\n            let distance = Math.abs(signedDistance(ap, bp, event.point));\n            if (distance < this.guidSize() * 2 && distance < min_distance) {\n                min_distance = distance;\n                min_point = point;\n            }\n        }\n        return min_point;\n    }\n\n    addLineRadiusVisual(point: PathPoint, color: string) {\n        let path = new this.paper.Path({\n            segments: this.selection.createSegmentRadius(point),\n            strokeColor: color,\n            strokeWidth: this.guidSize()\n        });\n        this.visual_guides.push(path);\n        this.controls_layer.addChild(path);\n    }\n\n    addLineVisual(point: PathPoint, color: string) {\n        let a = this.selection.toGlobalSpace(point);\n        let b = this.selection.toGlobalSpace(point.next);\n\n        let ap = pointDistance(a, b, point.radius);\n        let bp = pointDistance(b, a, point.next.radius);\n\n        let as = new this.paper.Segment(new this.paper.Point(ap));\n        let bs = new this.paper.Segment(new this.paper.Point(bp));\n\n        let path = new this.paper.Path({\n            segments: [as, bs],\n            strokeColor: color,\n            strokeWidth: this.guidSize()\n        });\n\n        this.visual_guides.push(path);\n    }\n\n    addCircleVisual(point: PathPoint, color: string) {\n        let p = this.selection.toGlobalSpace(point);\n        const circle = new this.paper.Path.Circle(\n            new this.paper.Point(p), this.controlSize()\n        );\n        circle.fillColor = new this.paper.Color(color);\n        this.visual_guides.push(circle);\n    }\n\n    onMouseDrag(event: paper.ToolEvent): void {\n        if (!this.selection || !this.mouse_down_point) {\n            return;\n        }\n\n        let local_point = this.selection.toLocalSpace(event.point);\n        let local_down_point = this.selection.toLocalSpace(this.mouse_down_point);\n\n        const movement = subtract(local_point, local_down_point)\n        this.overlapping_points = [];\n\n        if (this.selected_item_translate) {\n            let local_movement = event.point.subtract(event.lastPoint);\n            this.selection.model.x += local_movement.x;\n            this.selection.model.y += local_movement.y;\n            this.drawControls();\n            return;\n        }\n\n        const point = this.activePoint();\n        if (!point) {\n            return;\n        }\n\n        if (this.selected_point_translate_index != -1) {\n            let snapped_movement = this.snappedMovement(this.saved_points.p, movement);\n            this.translatePoint(point, snapped_movement);\n        }\n        if (this.selected_radius_index != -1) {\n            this.scaleRadius(point, event);\n        }\n        if (this.selected_line_translate_index != -1) {\n            let snapped_movement = this.pairSnappedMovement(this.saved_points.p, this.saved_points.pn, movement);\n            this.translatePointPair(point, snapped_movement);\n        }\n        if (this.selected_line_scale_index != -1) {\n            this.scaleLine(point, movement);\n        }\n\n        this.selection.updatePaper();\n        this.drawControls();\n        this.highlightGuides();\n    }\n\n    radiusSnap(point: PathPoint, radius: number) {\n        let closest_difference = Number.MAX_SAFE_INTEGER;\n        let closest_amount = 0;\n        for (const p of this.control_points) {\n            if (point == p) {\n                continue;\n            }\n\n            let difference = Math.abs(radius - p.radius);\n            if (difference < closest_difference) {\n                closest_difference = difference;\n                closest_amount = p.radius;\n            }\n        }\n\n        if (closest_difference < this.snapTolerance() * 2) {\n            this.radius_snap = closest_amount;\n            return closest_amount;\n        }\n        else {\n            this.radius_snap = Number.MAX_SAFE_INTEGER;\n            return radius;\n        }\n    }\n\n    scaleRadius(point: PathPoint, event: paper.ToolEvent) {\n        let p = this.saved_points.p;\n        let pn = this.saved_points.pn;\n        let pl = this.saved_points.pl;\n\n        // Need to use the signed oriented distance to the midpoint to prevent two solutions\n        let mp = normalizedMidpoint(pn, pl, p, distance(p, this.selection.toLocalSpace(event.point)));\n        let new_radius = Math.max(signedOrientedDistance(p, mp, this.selection.toLocalSpace(event.point)), 0);\n        new_radius = this.radiusSnap(point, new_radius);\n\n        let max_left = distance(p, pl) - point.last.radius;\n        let max_right = distance(p, pn) - point.next.radius\n        let max = Math.min(max_left, max_right);\n\n        if (max <= new_radius) {\n            if (max_left < max_right) {\n                this.connected_radius = point.last;\n                this.radius_too_large = true;\n                point.radius = max_left;\n            }\n            else {\n                this.connected_radius = point.next;\n                this.radius_too_large = true;\n                point.radius = max_right;\n            }\n        }\n        else {\n            this.radius_too_large = false;\n            this.connected_radius = null;\n            point.radius = Math.max(new_radius, 0);\n        }\n    }\n\n    pairSnappedMovement(a: Point, b: Point, movement: Point) {\n        let snap = this.snappedMovement(a, movement);\n        if (!equals(snap, movement)) {\n            return snap;\n        }\n        return this.snappedMovement(b, movement);\n    }\n\n    translatePoint(point: PathPoint, movement: Point) {\n        let p = this.saved_points.p;\n        let pn = this.saved_points.pn;\n        let pl = this.saved_points.pl;\n        let m = add(p, movement);\n\n        let next_distance = distance(m, pn);\n        let last_distance = distance(m, pl);\n\n        // Prevent going past the connected point\n        point.radius = Math.min(Math.min(next_distance, last_distance), point.previous_radius);\n\n        let next_distance_space = next_distance - point.next.radius - point.radius;\n        let last_distance_space = last_distance - point.last.radius - point.radius;\n        let min_distance = Math.min(next_distance_space, last_distance_space);\n\n        // No overlapping radius\n        point.x = m.x;\n        point.y = m.y;\n\n        if (min_distance < 0) {\n            let next_overlap = next_distance_space < 0 ? Math.abs(next_distance_space) : 0;\n            let last_overlap = last_distance_space < 0 ? Math.abs(last_distance_space) : 0;\n\n            if (point.next.radius > 0 && next_overlap > 0) {\n                point.next.radius -= next_overlap;\n            }\n            if (point.last.radius > 0 && last_overlap > 0) {\n                point.last.radius -= last_overlap;\n            }\n\n            point.radius = Math.max(point.radius, 0);\n            point.next.radius = Math.max(point.next.radius, 0);\n            point.last.radius = Math.max(point.last.radius, 0);\n        }\n\n        if (next_distance_space > 0) {\n            point.next.radius = Math.min(point.next.radius + next_distance_space, point.next.previous_radius)\n        }\n        if (last_distance_space > 0) {\n            point.last.radius = Math.min(point.last.radius + last_distance_space, point.last.previous_radius)\n        }\n\n        this.checkOverlapping(point);\n    }\n\n    checkPairConstraint(point: PathPoint, connected: PathPoint, p: Point, pc: Point, movement: Point) {\n        let m = add(p, movement);\n\n        let connected_distance = distance(m, pc);\n\n        point.radius = Math.min(distance(m, pc), point.previous_radius);\n\n        let min_distance = connected_distance - connected.radius - point.radius;\n\n        // No overlapping radius\n        point.x = m.x;\n        point.y = m.y;\n\n        if (min_distance < 0) {\n            let last_overlap = min_distance < 0 ? Math.abs(min_distance) : 0;\n\n            if (connected.radius > 0 && last_overlap > 0) {\n                connected.radius -= last_overlap;\n            }\n\n            point.radius = Math.max(point.radius, 0);\n            connected.radius = Math.max(connected.radius, 0);\n        }\n\n        if (min_distance > 0) {\n            connected.radius = Math.min(connected.radius + min_distance, connected.previous_radius)\n        }\n    }\n\n    translatePointPair(point: PathPoint, movement: Point) {\n        let pl = this.saved_points.pl;\n        let p = this.saved_points.p;\n        let pn = this.saved_points.pn;\n        let pnn = this.saved_points.pnn;\n\n        this.checkPairConstraint(point, point.last, p, pl, movement);\n        this.checkPairConstraint(point.next, point.next.next, pn, pnn, movement);\n\n        this.checkOverlapping(point);\n        this.checkOverlapping(point.next);\n    }\n\n    scaleLine(point: PathPoint, movement: Point) {\n        // Scale adjacent lines by moving the selected line. Push/pull line.\n\n        // This one took me a lot longer to figure out than I would like to admit. There are a lot of other solutions\n        // where some value will go to infinity, or is not numerically stable and has precision issues\n\n        // The best solution I could find was to advance the line (point, point.next) by the using the normal\n        // oriented to the direction of the pointer. Then you can calculate the intersection of this advanced line\n        // and the lines (point.last, point) and (point.next, point.next.next).\n\n        // Left is defined as line (point.last, point)\n        // Right is defined as line (point.next.next, point.next)\n\n        if (!this.saved_points) {\n            // These should have been saved on mouse down, something went wrong here\n            return;\n        }\n\n        // Use stored values from mouse down to preventing compounding rounding issues and information loss from undefined solutions\n        // Ex: p and np are equal due to the lines intersecting, the p-np line and angle is undefined\n        let p = this.saved_points.p;\n        let pn = this.saved_points.pn;\n        let pnn = this.saved_points.pnn;\n        let pl = this.saved_points.pl;\n\n        // Need to offset the mouse to the location to the line, so we can determine the direction and mount of movement from the line\n        let mp = midpoint(p, pn);\n        let mouse_current = add(mp, movement);\n\n        // Movement along the perpendicular axis only\n        let perpendicular_movement = Math.abs(signedPerpendicularDistance(p, pn, mouse_current));\n\n        // Get the normal of the point - point.next line so we can use it for the direction of the offset\n        let normal = orientedNormal(p, pn, mouse_current);\n\n        // Create the moved line by using the scaled normal vector and the movement scale\n        let ns = scale(normal, perpendicular_movement);\n        let m1 = add(p, ns);\n        let m2 = add(pn, ns);\n\n        // Find the intersections between the advanced line, and the adjacent lines (left/right)\n        let left_intersection = lineIntersection(pl, p, m1, m2);\n        let right_intersection = lineIntersection(pnn, pn, m1, m2);\n\n        // Parallel lines without an intersection, or point and point.next are equal (the line between the two point is undefined).\n        // I don't think a solution exists in this case?\n        if (!left_intersection || !right_intersection) {\n            return;\n        }\n\n        // Check for snap points based on the new position. The line guide snap will return a point on the correct line.\n        let left_snap = this.lineGuideSnap(left_intersection, pl);\n        let right_snap = this.lineGuideSnap(right_intersection, pnn);\n        if (left_snap || right_snap) {\n            if (left_snap && right_snap) {\n                if (distance(left_snap, left_intersection) < distance(right_snap, right_intersection)) {\n                    perpendicular_movement = signedPerpendicularDistance(p, pn, left_snap)\n                }\n                else {\n                    perpendicular_movement = signedPerpendicularDistance(p, pn, right_snap)\n                }\n            }\n            else if (left_snap) {\n                perpendicular_movement = signedPerpendicularDistance(p, pn, left_snap)\n            }\n            else if (right_snap) {\n                perpendicular_movement = signedPerpendicularDistance(p, pn, right_snap)\n            }\n\n            // Recalculate the movement amounts based on the distance\n            ns = scale(normal, Math.abs(perpendicular_movement));\n            m1 = add(p, ns);\n            m2 = add(pn, ns);\n\n            // Find the intersections between the advanced line, and the adjacent lines (left/right)\n            let new_left_intersection = lineIntersection(pl, p, m1, m2);\n            let new_right_intersection = lineIntersection(pnn, pn, m1, m2);\n\n            if (new_left_intersection && new_right_intersection) {\n                left_intersection = new_left_intersection;\n                right_intersection = new_right_intersection;\n            }\n        }\n\n        // See if we are moving towards the minimum or maximum value for bounds checking\n        // Parallel lines do not have an intersection, so we only need to check the minimum.\n        let intersection = lineIntersection(pl, p, pn, pnn);\n        let moving_to_intersection = false;\n        if (intersection) {\n            moving_to_intersection = signedOrientedDistance(p, pl, left_intersection) < 0;\n        }\n\n        // Bounds check - we only need to check the side that we are moving towards\n        // MIN BOUNDS\n        if (!moving_to_intersection) {\n            let new_left_distance = -signedPerpendicularDistance(pl, pnn, left_intersection);\n            let left_radius_space = point.last.radius + point.radius;\n            let left_distance_remaining = new_left_distance - left_radius_space;\n\n            let new_right_distance = signedPerpendicularDistance(pnn, pl, right_intersection);\n            let right_radius_space = point.next.radius + point.next.next.radius\n            let right_distance_remaining = new_right_distance - right_radius_space;\n\n            // Went below the min adjacent line value, need to recalculate the exact minimum distance so it stops on that point\n            if (left_distance_remaining < 0 || right_distance_remaining < 0) {\n                // Find the side with the most overlap / least distance remaining\n                if (left_distance_remaining < right_distance_remaining) {\n                    // Calculate the minimum intersection point\n                    left_intersection = pointDistance(pl, p, left_radius_space);\n                    // Find the perpendicular distance so we know how much to advance the line by\n                    let min_distance = Math.abs(signedPerpendicularDistance(p, pn, left_intersection));\n                    if (min_distance == 0) {\n                        return;\n                    }\n\n                    // Calculate the opposite intersection point based on the advanced line\n                    ns = scale(normal, min_distance);\n                    right_intersection = lineIntersection(pnn, pn, add(p, ns), add(pn, ns));\n                } else {\n                    // Calculate the minimum intersection point\n                    right_intersection = pointDistance(pnn, pn, right_radius_space);\n\n                    // Find the perpendicular distance so we know how much to advance the line by\n                    let min_distance = Math.abs(signedPerpendicularDistance(p, pn, right_intersection));\n                    if (min_distance == 0) {\n                        return;\n                    }\n\n                    // Calculate the opposite intersection point based on the advanced line\n                    ns = scale(normal, min_distance);\n                    left_intersection = lineIntersection(pl, p, add(p, ns), add(pn, ns));\n                }\n            }\n        }\n        // MAX BOUNDS\n        else if (intersection) {\n            if (intersection && moving_to_intersection) {\n                let max_line_distance = point.radius + point.next.radius;\n                let max_left = null;\n                let max_right = null;\n\n                if (max_line_distance == 0) {\n                    // The max bounds is defined by the intersection since the radius is zero for both points\n                    max_left = intersection;\n                    max_right = intersection;\n                }\n                else {\n                    // The max bounds is defined by when the distance is less than or equal to the combined radius of point-point.next\n                    let line_distance = distance(p, pn);\n\n                    // To find the max offset the advanced the line we can use the properties of similar triangles (different size, but same angles).\n                    // The ratio of the length between point-point.next and the minimum distance (the length we want this line to be, the combined radius)\n                    // tells us the amount we need to scale the distance between the intersection and midpoint.\n                    let triangle_scale = max_line_distance / line_distance;\n                    let intersection_distance = distance(intersection, midpoint(p, pn));\n\n                    // Now we know how much to move the line by and can calculate the intersections\n                    let move_distance = intersection_distance - (intersection_distance * triangle_scale);\n                    ns = scale(normal, move_distance);\n                    m1 = add(p, ns);\n                    m2 = add(pn, ns);\n\n                    max_left = lineIntersection(pl, p, m1, m2);\n                    max_right = lineIntersection(pnn, pn, m1, m2);\n                }\n\n                // If the point has gone too far\n                if (max_left && max_right && signedOrientedDistance(max_left, pl, left_intersection) < 0) {\n                    left_intersection = max_left;\n                    right_intersection = max_right;\n                }\n            }\n        }\n\n        point.x = left_intersection.x;\n        point.y = left_intersection.y;\n\n        point.next.x = right_intersection.x;\n        point.next.y = right_intersection.y;\n\n        if (this.isOverlapping(point, point.next)) {\n            this.overlapping_points.push(point);\n        }\n        else {\n            this.checkOverlapping(point);\n            this.checkOverlapping(point.next);\n        }\n    }\n\n    checkOverlapping(point) {\n        if (this.findOverlapping(point)) {\n            this.overlapping_points.push(point);\n        }\n    }\n\n    findOverlapping(point ) {\n        for (const other of this.control_points) {\n            if (this.isOverlapping(point, other)) {\n                return other;\n            }\n        }\n    }\n\n    isOverlapping(a: PathPoint, b: PathPoint) {\n        // Exact same point, or the point is not directly connected\n        if (a == b) {\n            return false;\n        }\n        if (!(a.next == b || b.next == a || a.last == b || b.last == a)) {\n            return false;\n        }\n        return distance(a, b) < this.overlapping_tolerance;\n    }\n\n    onMouseMove(event: paper.ToolEvent): void {\n        this.clearVisualGuides();\n        this.updateCursor(event);\n\n        if (!this.selection) {\n            return;\n        }\n\n        this.setCursorState(this.cursorHandle(event), CursorHandleState.HOVER);\n    }\n\n    override cursorHandle(event: paper.ToolEvent): paper.Path {\n        let translate_index = this.pointTranslateControlHitTest(event.point);\n        if (translate_index != -1) {\n            return this.point_translate_handles[translate_index];\n        }\n\n        let radius_index = this.radiusControlHitTest(event.point);\n        if (radius_index != -1) {\n            return this.radius_handles[radius_index];\n        }\n\n        let line_translate_index = this.lineTranslateControlHitTest(event.point);\n        if (line_translate_index != -1) {\n            return this.line_translate_handles[line_translate_index];\n        }\n\n        let line_scale_index = this.lineScaleControlHitTest(event.point);\n        if (line_scale_index != -1) {\n            return this.line_scale_handles[line_scale_index];\n        }\n\n        return null;\n    }\n\n    override activeHandle(): paper.Path {\n        if (this.selected_radius_index != -1) {\n            return this.radius_handles[this.selected_radius_index]\n        }\n        if (this.selected_point_translate_index != -1) {\n            return this.point_translate_handles[this.selected_point_translate_index];\n        }\n        if (this.selected_line_translate_index != -1) {\n            return this.line_translate_handles[this.selected_line_translate_index];\n        }\n        if (this.selected_line_scale_index != -1) {\n            return this.line_scale_handles[this.selected_line_scale_index];\n        }\n        return null;\n    }\n\n    activePoint(): PathPoint {\n        if (this.selected_radius_index != -1) {\n            return this.control_points[this.selected_radius_index]\n        }\n        if (this.selected_point_translate_index != -1) {\n            return this.control_points[this.selected_point_translate_index];\n        }\n        if (this.selected_line_translate_index != -1) {\n            return this.control_points[this.selected_line_translate_index];\n        }\n        if (this.selected_line_scale_index != -1) {\n            return this.control_points[this.selected_line_scale_index];\n        }\n        return null;\n    }\n\n    pointsInAction(): PathPoint[] {\n        if (this.selected_radius_index != -1) {\n            return [this.control_points[this.selected_radius_index]]\n        }\n        if (this.selected_point_translate_index != -1) {\n            return [this.control_points[this.selected_point_translate_index]];\n        }\n        if (this.selected_line_translate_index != -1) {\n            return [this.control_points[this.selected_line_translate_index], this.control_points[this.selected_line_translate_index].next];\n        }\n        if (this.selected_line_scale_index != -1) {\n            return [this.control_points[this.selected_line_scale_index], this.control_points[this.selected_line_scale_index].next];\n        }\n        return [];\n    }\n\n    onMouseUp(event: paper.ToolEvent): void {\n        // Reset active state\n        this.setCursorState(null, CursorHandleState.NONE);\n        this.selected_point_translate_index = -1;\n        this.selected_radius_index = -1;\n        this.selected_line_scale_index = -1;\n        this.selected_line_translate_index = -1;\n        this.radius_too_large = false;\n        this.connected_radius = null;\n        this.selected_item_translate = false;\n        this.saved_points = null;\n        this.active_placement_guides = [];\n        this.radius_snap = Number.MAX_SAFE_INTEGER;\n\n        this.clearVisualGuides();\n        this.updateCursor(event);\n\n        if (!this.selection) {\n            return;\n        }\n\n        for (const item of this.control_points) {\n            item.previous_radius = item.radius;\n        }\n        this.removeOverlappingPoints();\n        this.selection.correctBounds();\n    }\n\n    removeOverlappingPoints() {\n        for (const item of this.overlapping_points) {\n            let other = this.findOverlapping(item);\n            if (other) {\n                if (item.last == other) {\n                    item.last = item.last.last;\n                    item.last.next = item;\n                    this.control_points.splice(this.control_points.indexOf(other), 1);\n                }\n                else if (item.next == other) {\n                    item.next = item.next.next;\n                    item.next.last = item;\n                    this.control_points.splice(this.control_points.indexOf(other), 1);\n                }\n            }\n        }\n        this.overlapping_points = [];\n        this.drawControls();\n    }\n\n    pointTranslateControlHitTest(point: paper.Point) {\n        for (let i = 0; i < this.point_translate_handles.length; i++) {\n            let control_point = this.point_translate_handles[i];\n            if (control_point && control_point.contains(point)) {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n    lineTranslateControlHitTest(point: paper.Point) {\n        for (let i = 0; i < this.line_translate_handles.length; i++) {\n            let control_point = this.line_translate_handles[i];\n            if (control_point && control_point.contains(point)) {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n    lineScaleControlHitTest(point: paper.Point) {\n        for (let i = 0; i < this.line_scale_handles.length; i++) {\n            let control_point = this.line_scale_handles[i];\n            if (control_point) {\n                let d = distance(control_point.bounds.center, point);\n                if (d < this.controlSize() * 1.25) {\n                    return i;\n                }\n            }\n        }\n        return -1;\n    }\n\n    radiusControlHitTest(point: paper.Point) {\n        for (let i = 0; i < this.radius_handles.length; i++) {\n            let control_point = this.radius_handles[i];\n            if (control_point && control_point.contains(point)) {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n    drawControls() {\n        if (!Services.get<SelectionStateManager>('SelectionStateManager').editingPoints()) {\n            return;\n        }\n\n        this.canvas_service.paperScope.activate();\n        this.controls_layer = this.canvas_service.controlsLayer();\n\n        this.removeControls();\n\n        if (!this.selection) {\n            return;\n        }\n\n        let control_size = this.controlSize();\n        for (const point of this.control_points) {\n            let p = this.selection.toGlobalSpace(point);\n            let pn = this.selection.toGlobalSpace(point.next);\n            let pnn = this.selection.toGlobalSpace(point.next.next);\n            let pl = this.selection.toGlobalSpace(point.last);\n\n            // Corner Points\n            const point_translate_control = new this.paper.Path.Rectangle(new this.paper.Rectangle(\n                new this.paper.Point(p.x - (control_size/2), p.y - (control_size/2)), new this.paper.Size(control_size, control_size)\n            ));\n            this.styleControl(point_translate_control);\n            this.point_translate_handles.push(point_translate_control);\n            this.controls_layer.addChild(point_translate_control);\n\n            // Corner Radius\n            let normalized_sides_middle = normalizedMidpoint(pn, pl, p, Math.max(point.radius, control_size * 2));\n            const radius_control = new this.paper.Path.Circle(\n                new this.paper.Point(normalized_sides_middle.x, normalized_sides_middle.y), control_size / 2\n            );\n            this.styleControl(radius_control);\n            this.radius_handles.push(radius_control);\n            this.controls_layer.addChild(radius_control);\n\n            if (point.radius == this.radius_snap) {\n                radius_control.strokeColor = this.radius_snap_stroke;\n                radius_control.fillColor = this.radius_snap_fill;\n            }\n\n            // Line Translate Points\n            let next_middle = midpoint(p, pn);\n            const line_translate_control = new this.paper.Path('M7,41.5c-3.58,0-6.5-2.92-6.5-6.5V7C.5,3.42,3.42.5,7,.5s6.5,2.92,6.5,6.5v28c0,3.58-2.92,6.5-6.5,6.5Z');\n            let translate_ratio = line_translate_control.bounds.width / line_translate_control.bounds.height;\n            line_translate_control.bounds.width = control_size * translate_ratio * 2;\n            line_translate_control.bounds.height = control_size * 2;\n            line_translate_control.bounds.center.x = next_middle.x;\n            line_translate_control.bounds.center.y = next_middle.y;\n            let p_pn_dif = subtract(p, pn);\n            line_translate_control.rotate(-radianToDegrees(Math.atan2(p_pn_dif.x, p_pn_dif.y)));\n            this.styleControl(line_translate_control);\n            this.line_translate_handles.push(line_translate_control);\n            this.controls_layer.addChild(line_translate_control);\n\n            // Line Scale Points\n            let scale_angle = angleBisectorVector(pl, p, pnn, pn, control_size * 1.5);\n            let line_scale_direction = add(scale_angle, next_middle);\n            const line_scale_control = new this.paper.Path('M12.59,13.99L1,25.58V2.42l11.58,11.57Z');\n            let scale_ratio = line_scale_control.bounds.width / line_scale_control.bounds.height;\n            line_scale_control.bounds.width = control_size * scale_ratio * 1.25;\n            line_scale_control.bounds.height = control_size * 1.25;\n            line_scale_control.bounds.center.x = line_scale_direction.x;\n            line_scale_control.bounds.center.y = line_scale_direction.y;\n            let angle = radianToDegrees(Math.atan2(-scale_angle.x, scale_angle.y));\n            line_scale_control.rotate(angle + 90);\n            this.styleControl(line_scale_control);\n            this.line_scale_handles.push(line_scale_control);\n            this.controls_layer.addChild(line_scale_control);\n\n            // Hide the line scale control if the angle between the lines is less than 20 deg\n            // The operation doesn't make sense when the lines point to each other and often breaks things\n            let angle_last = radianToDegrees(signedAngleBetweenLines(point.last, point, point, point.next));\n            let angle_next = radianToDegrees(signedAngleBetweenLines(point, point.next, point.next, point.next.next));\n            let min_angle = Math.min(angle_last, angle_next);\n            if (min_angle < 20) {\n                line_scale_control.visible = false;\n            }\n        }\n\n        this.drawVisualGuides();\n\n        let active_handle = this.activeHandle();\n        if (active_handle) {\n            this.setCursorState(active_handle, CursorHandleState.ACTIVE);\n        }\n\n        for (const p of this.debug_points) {\n            let v = new this.paper.Path.Circle(\n                new this.paper.Point(p), 10 / 2\n            );\n            v.fillColor = new this.paper.Color('purple');\n            this.controls_layer.addChild(v);\n        }\n    }\n\n    removeControls() {\n        for (const item of this.point_translate_handles) {\n            item.remove();\n        }\n        for (const item of this.line_translate_handles) {\n            item.remove();\n        }\n        for (const item of this.radius_handles) {\n            item.remove();\n        }\n        for (const item of this.visual_guides) {\n            item.remove();\n        }\n        for (const item of this.line_scale_handles) {\n            item.remove();\n        }\n        this.line_scale_handles = [];\n        this.point_translate_handles = [];\n        this.radius_handles = [];\n        this.line_translate_handles = [];\n        this.visual_guides = [];\n        this.controls_layer.removeChildren();\n    }\n\n    override controlSize() {\n        return 18 / this.canvas_service.paperScope.view.zoom;\n    }\n\n    updateCursor(event: paper.ToolEvent) {\n        if (!this.selection || !event) {\n            this.canvas_service.canvas.style.cursor = '';\n            return;\n        }\n\n        let cursor = ''\n        if (this.selected_point_translate_index != -1) {\n            cursor = 'move';\n        }\n        else if (this.cursorHandle(event)) {\n            cursor = 'move';\n        }\n        if (!cursor) {\n            if (this.selected_item_translate) {\n                cursor = 'grabbing';\n            }\n            else if (this.selection.item.hitTest(event.point)) {\n                cursor = 'grab';\n            }\n        }\n\n        if (this.canvas_service.canvas.style.cursor != cursor) {\n            this.canvas_service.canvas.style.cursor = cursor;\n        }\n    }\n\n    activate(element) {\n        this.selection = element;\n        this.selection.applyRotation();\n    }\n\n    get control_points() {\n        return this.selection.controlPoints();\n    }\n\n    deactivate() {\n        if (this.selection) {\n            this.selection.correctBounds();\n        }\n        this.selection = null;\n        this.clearVisualGuides();\n        this.removeControls();\n        this.updateCursor(null);\n    }\n\n    selectedElement() {\n        return this.selection;\n    }\n\n    setupPlacementGuides() {\n        if (!this.selection) {\n            return;\n        }\n\n        if (!this.activePoint()) {\n            return;\n        }\n\n        this.placement_guides = [];\n\n        let points = this.pointsInAction();\n\n        // Global center\n        let center = this.selection.toLocalSpace(this.canvas_service.workspace.artboard.center);\n\n        let cx = add(center, {x: 1, y: 0});\n        let cy = add(center, {x: 0, y: 1});\n\n        this.pushPlacementGuide(center, cx);\n        this.pushPlacementGuide(center, cy);\n\n        // Shape lines\n        for (const line of this.selection.basePlacementGuides()) {\n            let a = line[0];\n            let b = line[1];\n\n            let a_match = points.find(v => equals(v, a));\n            let b_match = points.find(v => equals(v, b));\n\n            // If one of the two guide points is part of the lines being edited, then don't use guides that use a and b\n            if (!a_match && !b_match) {\n                // Line A-B\n                this.pushPlacementGuide(a, b);\n\n                // perpendicular at A for A-B\n                let an = add(a, normal(a, b));\n                this.pushPlacementGuide(a, an);\n\n                // perpendicular at B for A-B\n                let bn = add(b, normal(a, b));\n                this.pushPlacementGuide(b, bn);\n            }\n\n            // Vertical/aorizontal alignment on the guide that is not selected\n            if (a_match && !b_match) {\n                // Horizontal axis at point b\n                let bx = add(b, {x: 1, y: 0});\n                this.pushPlacementGuide(b, bx);\n\n                // Vertical axis at point b\n                let by = add(b, {x: 0, y: 1});\n                this.pushPlacementGuide(b, by);\n            }\n            if (b_match && !a_match) {\n                // Horizontal axis at point a\n                let ax = add(a, {x: 1, y: 0});\n                this.pushPlacementGuide(a, ax);\n\n                // Vertical axis at point a\n                let ay = add(a, {x: 0, y: 1});\n                this.pushPlacementGuide(a, ay);\n            }\n        }\n\n        for (const element of this.element_manager.elements) {\n            if (toRaw(element) == toRaw(this.selection)) {\n                continue;\n            }\n\n            for (const line of element.placementGuides()) {\n                this.pushPlacementGuide(this.selection.toLocalSpace(line[0]), this.selection.toLocalSpace(line[1]));\n            }\n        }\n    }\n\n    highlightGuides(): void {\n        let points = this.pointsInAction();\n        this.active_placement_guides = [];\n\n        for (const point of points) {\n            for (const line of this.placement_guides) {\n                if (Math.abs(distance(point, closestPointOnLine(line[0], line[1], point))) < this.snapTolerance()) {\n                    this.active_placement_guides.push(line);\n                }\n            }\n        }\n    }\n\n    lineGuideSnap(point: Point, other: Point) {\n        let min_distance = Number.MAX_SAFE_INTEGER;\n        let min_point = null;\n\n        for (const line of this.placement_guides) {\n            let intersection = lineIntersection(point, other, line[0], line[1]);\n            if (intersection) {\n                let intersection_distance = distance(intersection, point);\n                if (intersection_distance < min_distance) {\n                    min_point = intersection;\n                    min_distance = intersection_distance;\n                }\n            }\n        }\n\n        return min_distance < this.snapTolerance() ? min_point : null;\n    }\n\n    removeSelection() {\n        this.selection = null;\n    }\n}","import {AbstractSelectionManager} from \"./AbstractSelectionManager\";\nimport {SelectionStateManager, SelectionType} from \"./SelectionStateManager\";\nimport {IElement} from \"../tool/IElement\";\nimport {Services} from \"../../../core/services/Services\";\nimport ColorService from \"./ColorService\";\n\nexport class ColorSelectionManager extends AbstractSelectionManager implements SelectionType {\n    color_pick: (color: string) => void;\n    color_hover: (color: string) => void;\n\n    activate(element): void {\n        this.updateCursor(null);\n    }\n\n    deactivate(): void {\n        this.color_pick = null;\n        this.color_hover = null;\n        this.updateCursor(null);\n    }\n\n    drawControls(): void {\n        this.updateCursor(null);\n    }\n\n    onMouseDown(event: paper.ToolEvent): void {\n        if (this.color_pick) {\n            this.color_pick(this.cursorColor(event));\n        }\n        Services.get<SelectionStateManager>('SelectionStateManager').toggleElementManager();\n    }\n\n    onMouseDrag(event: paper.ToolEvent): void {\n    }\n\n    onMouseMove(event: paper.ToolEvent): void {\n        if (this.color_hover) {\n            this.color_hover(this.cursorColor(event));\n        }\n    }\n\n    onMouseUp(event: paper.ToolEvent): void {\n    }\n\n    removeControls(): void {\n    }\n\n    selectedElement(): IElement {\n        return undefined;\n    }\n\n    cursorColor(event) {\n        const ctx = this.canvas_service.paperScope.view.element.getContext('2d');\n\n        let x;\n        let y;\n        if (event.event instanceof MouseEvent) {\n            x = event.event.offsetX;\n            y = event.event.offsetY;\n        }\n        else if (window['TouchEvent'] && event.event instanceof TouchEvent && event.event.touches.length > 0) {\n            x = event.event.touches[0].clientX;\n            y = event.event.touches[0].clientY;\n        }\n\n        if (x && y) {\n            const base_data = ctx.getImageData(x * event.tool.view.pixelRatio, y * event.tool.view.pixelRatio, 1, 1).data;\n            if (base_data[3] > 0) {\n                const data = [base_data[0]/255, base_data[1]/255, base_data[2]/255];\n                return Services.get<ColorService>('ColorService').rgbToHex(data);\n            }\n        }\n\n        return null;\n    }\n\n    updateCursor(point: paper.Point) {\n        let cursor = this.color_pick ? 'crosshair' : '';\n\n        // Only set the style when it has changed otherwise we will incur a forced style repaint despite the value being the same\n        if (this.canvas_service.canvas.style.cursor != cursor) {\n            this.canvas_service.canvas.style.cursor = cursor;\n        }\n    }\n\n    override activeHandle(): paper.Path {\n        return null;\n    }\n    override cursorHandle(event: paper.ToolEvent): paper.Path {\n        return null;\n    }\n    override setupPlacementGuides(): void {}\n\n    removeSelection() {};\n}","import {IServices, Services} from '../../../core/services/Services';\nimport PaperCanvasService from './PaperCanvasService';\nimport {SelectionManager} from './SelectionManager';\nimport {PaperCanvasWorkspace} from './PaperCanvasWorkspace';\nimport {AutosaveService} from './AutosaveService';\nimport CustomEditorService from './CustomEditorService';\nimport {ElementManager} from './ElementManager';\nimport {FontService} from './FontService';\nimport DragDropBuyService from './DragDropBuyService';\nimport LetteringToolService from './LetteringToolService';\nimport ClipperWorkerService from './ClipperWorkerService';\nimport ClipperService from './ClipperService';\nimport ColorService from './ColorService';\nimport {ToolStateService} from './ToolStateService';\nimport {SelectionStateManager} from \"./SelectionStateManager\";\nimport {PointSelectionManager} from \"./PointSelectionManager\";\nimport {ColorSelectionManager} from \"./ColorSelectionManager\";\n\n\nexport default function registerServices(services: IServices) {\n    services.singleton('CustomEditorService', CustomEditorService);\n    services.singleton('PaperCanvasService', PaperCanvasService);\n    services.singleton('SelectionStateManager', SelectionStateManager);\n    services.singleton('SelectionManager', SelectionManager);\n    services.singleton('PointSelectionManager', PointSelectionManager);\n    services.singleton('PaperCanvasWorkspace', PaperCanvasWorkspace);\n    services.singleton('AutosaveService', AutosaveService);\n    services.singleton('ElementManager', ElementManager);\n    services.singleton('FontService', FontService);\n    services.singleton('DragDropBuyService', DragDropBuyService);\n    services.singleton('LetteringToolService', LetteringToolService);\n    services.singleton('ClipperService', ClipperService);\n    services.singleton('ClipperWorkerService', ClipperWorkerService);\n    Services.singleton('ColorService', ColorService);\n    Services.singleton('ToolStateService', ToolStateService);\n    Services.singleton('ColorSelectionManager', ColorSelectionManager);\n}","import * as paper from 'paper';\nimport PaperCanvasService from '../services/PaperCanvasService';\nimport {ElementTypeEnum, IElement} from './IElement';\nimport {Services} from '../../../core/services/Services';\nimport {ElementManager} from '../services/ElementManager';\nimport {SelectionManager} from '../services/SelectionManager';\nimport {IDeferred, IPromise, SimplePromise} from '../../../core/utils/SimplePromise';\nimport ClipperService from '../services/ClipperService';\nimport {Color} from '../models/Color';\nimport {EventDispatcher} from '../../../core/utils/EventDispatcher';\nimport {copy, Point} from \"../../../core/utils/VectorUtils\";\n\nexport class ElementFrameTask {\n    constructor(\n        public readonly fnc: any,\n        public readonly context: any,\n        public readonly args?: any[]\n    ) {}\n\n    public call(): void {\n        this.fnc.apply(this.context, this.args);\n    }\n}\n\nexport abstract class BaseElement<T extends paper.Item = paper.Item> extends EventDispatcher implements IElement<T> {\n    initialized: IPromise<any>;\n    initialized_deferred: IDeferred<any>;\n    _layer: paper.Layer;\n    _item: T;\n    _model: any;\n    type: ElementTypeEnum;\n    debugItems: paper.Item[];\n    handleClear: boolean;\n    frameTasks: ElementFrameTask[];\n    protected _removed: boolean = false;\n    protected _locked: boolean;\n    private current_frame_task;\n    protected _isSelected: boolean;\n    protected _isDragging: boolean;\n    public disable_selection: boolean;\n    public canvasService: PaperCanvasService;\n    private canvasPositionCheckCallback\n    block_frame_tasks: boolean;\n    offset: paper.CompoundPath;\n    offset_waiting: boolean;\n    offset_changed: boolean;\n    disable_offset_path: boolean;\n\n    // Idk why the offset path breaks so badly in the export state\n    // It doesn't need to be updated so lets just prevent it from updating\n    disable_offset_path_in_export: boolean = false;\n\n    element_manager: ElementManager;\n    static cached_textures = {};\n\n    constructor(model: any, layer?: paper.Layer) {\n        super();\n\n        this.element_manager = Services.get<ElementManager>('ElementManager');\n        this.canvasService = Services.get<PaperCanvasService>('PaperCanvasService');\n        this.setupModel(model);\n\n        this.frameTasks = [];\n        this.canvasService.paperScope.activate();\n        this.initialized_deferred = SimplePromise.defer<any>();\n        this.initialized = this.initialized_deferred.promise;\n        this._locked = false;\n\n        this.offset_waiting = false;\n        this.offset_changed = false;\n\n        this.canvasPositionCheckCallback = this.checkCanvasPosition.bind(this);\n\n        // On the first successful update, fire off the initialized event.\n        this.once('updatePaper', this.initialize.bind(this), this);\n        this.canvasService.bind('flushFrameTasks', this.flushFrameTasks.bind(this), this);\n        this.debugItems = [];\n\n        if (model.z == null) {\n            this.z = this.element_manager.nextZ;\n        }\n\n        // Paperjs setup\n        this.setupPaper(layer);\n\n        // Bind events\n        this.bindEvents();\n    }\n\n    get offset_path_enabled() {\n        return !this.disable_offset_path && this.canvasService.offset_path_enabled && !!this.model.offset_width && (!this.model.side || !this.model.side.disable_offset_path);\n    }\n\n    get can_offset_path() {\n        return !this.disable_offset_path && this.canvasService.offset_path_enabled && (!this.model.side || !this.model.side.disable_offset_path);\n    }\n\n    removeOffsetPath() {\n        this.model.offset_width = 0;\n        this.hideOffsetPath();\n        this.canvasService.queueFlattenCutpathLayer();\n    }\n\n    hideOffsetPath() {\n        if (this.offset) {\n            this.canvasService.removeOffset(this.offset);\n            this.offset = null;\n        }\n    }\n\n    addOffsetPath() {\n        this.model.offset_width = 12;\n        this.offsetPath();\n    }\n\n    async offsetPath() {\n        let paths = [];\n        for (const path of this.findPaths(this.item)) {\n            path.strokeJoin = 'round';\n            let items = await Services.get<ClipperService>('ClipperService').offset(path as paper.Path, Number(this.model.offset_width));\n            for (const item of items) {\n                path.remove();\n                paths.push(item);\n            }\n        }\n\n        return paths;\n    }\n\n    async queueOffsetPath() {\n        if (!this.model.offset_width) {\n            if (this.offset) {\n                this.removeOffsetPath();\n            }\n            return;\n        }\n\n        if ((this.canvasService.in_export_state && this.disable_offset_path_in_export) || this.canvasService.in_save_state) {\n            return;\n        }\n\n        if (this.model.offset_width < 7) {\n            this.model.offset_width = 7;\n        }\n        if (this.model.offset_width > 50) {\n            this.model.offset_width = 50;\n        }\n\n        if (!this.offset_path_enabled) {\n            return;\n        }\n\n        this.canvasService.queueFlattenCutpathLayer();\n\n        // If we are waiting on the current offset path task to finish\n        if (this.offset_waiting) {\n            // Flat that the item we are offsetting has changed and that the path being generated can no longer be used\n            this.offset_changed = true;\n            return;\n        }\n\n        // Signal that we are waiting for the task to finish and no future calls should be made until its done\n        this.offset_waiting = true;\n\n        let paths = await this.offsetPath();\n\n        if (!paths || paths.length == 0) {\n            this.offset_waiting = false;\n            this.offset_changed = false;\n            return;\n        }\n\n        // If the element was removed while waiting for the path update, dont all the cut path\n        if (this._removed) {\n            this.offset_waiting = false;\n            this.offset_changed = false;\n            return;\n        }\n\n        if (this.offset_changed) {\n            // If the offset changed while we were waiting, discard results and try again\n            this.offset_waiting = false;\n            this.offset_changed = false;\n\n            return this.queueOffsetPath();\n        }\n        else {\n            if ((this.canvasService.in_export_state && this.disable_offset_path_in_export) || this.canvasService.in_save_state) {\n                return;\n            }\n            this.canvasService.withSideActive(() => {\n                this.layer.activate();\n                let new_path = new this.paper.CompoundPath(paths);\n\n                // If the paths are the same or close enough then don't update further\n                if (this.offset) {\n                    let width_difference = Math.abs(this.offset.bounds.width - new_path.bounds.width);\n                    let height_difference = Math.abs(this.offset.bounds.height - new_path.bounds.height);\n                    let x_difference = Math.abs(this.offset.position.x - new_path.position.x);\n                    let y_difference = Math.abs(this.offset.position.y - new_path.position.y);\n\n                    if (this.offset.compare(new_path) || (width_difference < 0.0001 && height_difference < 0.0001 && x_difference < 0.0001 && y_difference < 0.0001)) {\n                        new_path.remove();\n                        this.offset_waiting = false;\n                        return;\n                    }\n                }\n\n                // Offset task finished and the element has not been modified so we can use it\n                this.setupOffsetPath(new_path);\n\n                this.canvasService.addOffset(this.offset, this.model.side?.id);\n                this.offset_waiting = false;\n            }, this.side)\n        }\n    }\n\n    forceOffsetPath() {\n        let deferred = SimplePromise.defer();\n\n        if (!this.model.offset_width) {\n            deferred.resolve(null);\n            return deferred.promise;\n        }\n\n        this.offsetPath().then((paths) => {\n            let new_path = new this.paper.CompoundPath(paths);\n            this.setupOffsetPath(new_path);\n            this.canvasService.addOffset(this.offset, this.model.side?.id,false);\n            deferred.resolve(null);\n        });\n\n        return deferred.promise;\n    }\n\n    setupOffsetPath(compound_path) {\n        // Discard the old path\n        if (this.offset) {\n            this.canvasService.removeOffset(this.offset);\n        }\n\n        // Setup and add the new one\n        this.offset = compound_path;\n        this.offset.fillColor = new this.paper.Color(this.canvasService.offset_path_color);\n    }\n\n    findPaths(item, paths=[], copy=true) {\n        if (!item) {\n            return paths;\n        }\n\n        if (['Group', 'Layer', 'CompoundPath'].indexOf(item.className) > -1) {\n            for (const child of item.children) {\n                this.findPaths(child, paths);\n            }\n        }\n        else if (item instanceof this.paper.Path) {\n            if (copy) {\n                const clone = item.clone({deep: true});\n                clone.fillColor = null;\n                clone.strokeColor = null;\n                clone.remove();\n                paths.push(clone);\n            }\n            else {\n                paths.push(item);\n            }\n        }\n        return paths;\n    }\n\n    get paper() {\n        return this.canvasService.paper;\n    }\n\n    get elevation_layer() {\n        return this.layer;\n    }\n\n    get layer(): paper.Layer {\n        return this._layer;\n    }\n    set layer(v: paper.Layer) {\n        this._layer = v;\n    }\n\n    get item(): T {\n        return this._item;\n    }\n    set item(v: T){\n        this._item = v;\n    }\n\n    get model() {\n        return this._model;\n    }\n    set model(v) {\n        this._model = v;\n    }\n\n    protected addDebugCircle(point, color, width=10) {\n        const debugCircle = new this.paper.Path.Circle(\n            point,\n            width\n        );\n        debugCircle.strokeWidth = 2;\n        debugCircle.strokeColor = color;\n        debugCircle.fillColor = color;\n\n        this.debugItems.push(debugCircle);\n    }\n\n    protected setupModel(model) {\n        this.model = model;\n        if (this.model.x_scale_inverted === undefined) {\n            this.model.x_scale_inverted = false;\n        }\n        if (this.model.y_scale_inverted === undefined) {\n            this.model.y_scale_inverted = false;\n        }\n\n        if (!this.model.side) {\n            this.model.side = this.canvasService.activeLayerSide.model;\n        }\n        this.canvasService.addSide(this.model.side);\n\n        this._removed = false;\n        this.model.bind('remove', () => {\n            if (!this._removed) {\n                this.remove();\n            }\n        }, this);\n\n        // Tell the element manager to update the controls when the model changes\n        let element_manager = Services.get<SelectionManager>('SelectionManager');\n        const onModelChange = () => {\n            if (element_manager.selection == this) {\n                element_manager.drawControls();\n            }\n        }\n        this.model.bind('change', () => {\n            if (!this.hasFrameTask(onModelChange, this)) {\n                this.addFrameTask(onModelChange, this)\n            }\n        }, this);\n        this.model.bind('change:side', () => {\n            this.canvasService.selectSide(this.side);\n            this.canvasService.rootLayer.addChild(this.layer);\n        }, this);\n        this.canvasService.bind('change:offset_path_color', () => {\n            if (this.offset) {\n                this.offset.fillColor = new this.paper.Color(this.canvasService.offset_path_color);\n            }\n        }, this);\n    }\n\n    setupPaper(layer) {\n        // If a layer is being passed to this element, the object that created\n        // the layer must clear it\n        this.handleClear = !layer;\n        this.layer = layer || new this.paper.Layer();\n\n        this.layer.activate();\n\n        this.canvasService.addItem(this);\n    }\n\n    protected bindEvents(): void {}\n    protected unbindEvents(): void {}\n\n    // The item needs to be loaded into paper first\n    fillInValuesFromPaper() {\n        if (this.item && this.item.bounds) {\n            let updated_size = this.model.width == null || this.model.height == null;\n\n            this.model.width = this.model.width || this.item.bounds.width;\n            this.model.height = this.model.height || this.item.bounds.height;\n            this.model.x = this.model.x || this.item.bounds.x;\n            this.model.y = this.model.y || this.item.bounds.y;\n            this.model.z = this.model.z || 0;\n\n            if (updated_size && this.model.width && this.model.height) {\n                let width_scale = this.model.width / this.canvasService.workspace.artboard.width;\n                let height_scale = this.model.height / this.canvasService.workspace.artboard.height;\n\n                if (width_scale > 1 || height_scale > 1) {\n                    let scale = width_scale > height_scale ? width_scale : height_scale;\n                    this.model.width *= (1 / scale) * 0.75;\n                    this.model.height *= (1 / scale) * 0.75;\n                }\n            }\n        }\n    }\n\n    get side() {\n        return this.model.side ? this.model.side.id : 0;\n    }\n\n    set side(v) {\n        if (typeof v == 'number') {\n            v = this.canvasService.sides.find(i => i.model.id == v);\n        }\n\n        this.model.side = v;\n    }\n\n    protected initialize(): void {\n        // So we have a bit of an annoying race case here that I'll try to explain.\n        // This function is called the first time updatePaper is triggered, and this happens within a frame task.\n        // Resolving the promise immediately triggers other functions that can modify the element.\n        // Modifying the element will try to add a new frame task so it can reflect the modified state in the canvas.\n        // But since we are still within the same initial frame task, the frame task request is thrown way to prevent infinite loops.\n        // So we will need to yield the execution to allow for the current frame task to finish and allow new updates to be reflected.\n        setTimeout(() => {\n            this.initialized_deferred.resolve(null);\n            this.trigger('initialized');\n        })\n    }\n\n    get isSelected(): boolean {\n        return this._isSelected;\n    }\n\n    get isDragging(): boolean {\n        return this._isDragging;\n    }\n\n    get x(): number {\n        return this.model.cleaned.x;\n    }\n\n    set x(x: number) {\n        this.model.x = x;\n        this.queuePositionCheck();\n    }\n\n    get y(): number {\n        return this.model.cleaned.y;\n    }\n\n    set y(y: number) {\n        this.model.y = y;\n        this.queuePositionCheck();\n    }\n\n    get z(): number {\n        return this.model.cleaned.z;\n    }\n\n    set z(z: number) {\n        this.model.z = z;\n    }\n\n    get width(): number {\n        return this.model.cleaned.width;\n    }\n\n    set width(width: number) {\n        this.model.width = width;\n        this.queuePositionCheck();\n    }\n\n    get height(): number {\n        return this.model.cleaned.height;\n    }\n\n    set height(height: number) {\n        this.model.height = height;\n        this.queuePositionCheck();\n    }\n\n    get rotation(): number {\n        return this.model.cleaned.rotation;\n    }\n\n    set rotation(rotation: number) {\n        this.model.rotation = rotation;\n    }\n\n    get maintain_proportion() {\n        return this.model.maintain_proportion;\n    }\n\n    set maintain_proportion(v) {\n        this.model.maintain_proportion = v;\n    }\n\n    get bounds(): paper.Rectangle {\n        if (this.isImmutable() && this.item) {\n            return this.item.bounds;\n        }\n\n        return this.layer.bounds;\n    }\n\n    get x_scale_inverted() {\n        return !!this.model.x_scale_inverted;\n    }\n\n    set x_scale_inverted(value) {\n        this.model.x_scale_inverted = !!value;\n    }\n\n    get y_scale_inverted() {\n        return !!this.model.y_scale_inverted;\n    }\n\n    set y_scale_inverted(value) {\n        this.model.y_scale_inverted = !!value;\n    }\n\n    get invert(): boolean {\n        return this.x_scale_inverted && this.y_scale_inverted;\n    }\n\n    set invert(value) {\n        this.x_scale_inverted = value;\n        this.y_scale_inverted = value;\n        this.updatePaper();\n    }\n\n    get flipX(){\n        return this.x_scale_inverted;\n    }\n\n    set flipX(value: boolean){\n        this.x_scale_inverted = value;\n        this.updatePaper();\n    }\n\n    get flipY(){\n        return this.y_scale_inverted;\n    }\n\n    set flipY(value: boolean){\n        this.y_scale_inverted = value;\n        this.updatePaper();\n    }\n\n    get dont_clip() {\n        return this.model.dont_clip;\n    }\n\n    set dont_clip(value: boolean) {\n        this.model.dont_clip = value;\n    }\n\n    /**\n     * If element bounds are different than bounds, return them with this\n     * method. This can be useful when an element is rotated and the bounds\n     * are increased/decreased.\n     */\n    get elementBounds(): paper.Rectangle {\n        return this.bounds;\n    }\n\n    queuePositionCheck() {\n        if (!this.hasFrameTask(this.canvasPositionCheckCallback, this)) {\n            this.addFrameTask(this.canvasPositionCheckCallback, this);\n        }\n    }\n\n    sign(x: number): number {\n        return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 1 : NaN : NaN;\n    }\n\n    onMouseDown(event: paper.ToolEvent): void {\n\n    }\n\n    onMouseDrag(event: paper.ToolEvent): void {\n        this._isDragging = true;\n        const point = event.point.subtract(event.lastPoint);\n        const corrected = this.correctElementOffCanvasPosition(new this.paper.Point(\n            this.x + point.x,\n            this.y + point.y\n        ));\n\n        this.x = corrected.x;\n        this.y = corrected.y;\n\n        this.onChange();\n    }\n\n    position(): Point {\n        return {x: this.x, y: this.y};\n    }\n\n    setPosition(point: paper.Point) {\n        point = this.correctElementOffCanvasPosition(point);\n        this.x = point.x;\n        this.y = point.y;\n        this.onChange();\n    }\n\n    onMouseUp(event: paper.ToolEvent): void {\n        this._isDragging = false;\n        this.updatePaper();\n    }\n\n    onMouseMove(event: paper.ToolEvent): void {\n\n    }\n\n    public applyScaling(sizeChange, position, maxSize) {\n        if (this.model.maintain_proportion) {\n            if (this.height + sizeChange.y > 1 && this.width + sizeChange.x > 1) {\n                if ((this.width + sizeChange.x < maxSize && this.height + sizeChange.y < maxSize) || (sizeChange.x < 0 || sizeChange.y < 0)) {\n                    this.width += sizeChange.x;\n                    this.x += position.x;\n                    this.height += sizeChange.y;\n                    this.y += position.y;\n                }\n            }\n        } else {\n            if (this.width + sizeChange.x > 1) {\n                if (this.width + sizeChange.x < maxSize || sizeChange.x < 0) {\n                    this.width += sizeChange.x;\n                    this.x += position.x;\n                }\n            }\n            if (this.height + sizeChange.y > 1) {\n                if (this.height + sizeChange.y < maxSize || sizeChange.y < 0) {\n                    this.height += sizeChange.y;\n                    this.y += position.y;\n                }\n            }\n        }\n    }\n\n    public onChange() {}\n\n    protected clampRotation(angle) {\n        if (angle < 0) {\n            return angle % 360 + 360;\n        }\n        else {\n            return angle % 360\n        }\n    }\n\n    rotate(deg, position) {\n        this.rotation = this.clampRotation(this.rotation + deg);\n\n        let pos = new this.paper.Point(this.x, this.y).rotate(deg, position);\n        this.x = pos.x;\n        this.y = pos.y;\n    }\n\n    /**\n     * Called by SelectionManager when this element is unselected.\n     */\n    onUnselect(): void {\n        this._isDragging = false;\n        this._isSelected = false;\n        this.updatePaper();\n    }\n\n    /**\n     * Called by SelectionManager when this element is selected.\n     */\n    onSelect(): void {\n        this._isSelected = true;\n    }\n\n    hoverTest(point: paper.Point): boolean {\n        return this.hitTest(point);\n    }\n\n    hitTest(point: paper.Point): boolean {\n        if (!this.elementBounds || this.elementBounds.area == 0) {\n            return false\n        }\n\n        const boundingRect: paper.Path.Rectangle = new this.paper.Path.Rectangle(this.elementBounds);\n        if (this.rotation)\n            boundingRect.rotate(this.rotation);\n\n        const result = boundingRect.contains(point);\n\n        boundingRect.remove();\n\n        return result;\n    }\n\n    correctElementOffCanvasPosition(point: paper.Point): paper.Point {\n        if (!this.canvasService.workspace) {\n            return point;\n        }\n\n        point.x = Math.max(point.x, this.canvasService.workspace.camera.left);\n        point.x = Math.min(point.x, this.canvasService.workspace.camera.right);\n        point.y = Math.max(point.y, this.canvasService.workspace.camera.top);\n        point.y = Math.min(point.y, this.canvasService.workspace.camera.bottom);\n\n        return point;\n    }\n\n    /**\n     * This method needs to be implemented on classes that extend BaseElement\n     */\n    abstract updatePaper();\n\n    updatePaperOnFrame(){}\n\n    centerHorizontally(): void {\n        this.x = this.canvasService.workspace.artboard.width / 2;\n    }\n\n    centerVertically(): void {\n        this.y = this.canvasService.workspace.artboard.height / 2;\n    }\n\n    /*\n     * Removes and deletes all children on this element's layer. Also resets\n     * the layer to the 1:1 scale and 0,0 position\n     */\n    clear() {\n        if (!this.handleClear)\n            return;\n\n        this.layer.scale(1, 1);\n        this.layer.position = new this.paper.Point(0, 0);\n        this.layer.removeChildren();\n    }\n\n    safeClear() {\n        // Makes sure that the canvas service is not in the export state before trying to modify it\n        this.canvasService.withSideActive(() => {\n            this.clear();\n        }, this.side);\n    }\n\n    remove() {\n        this._removed = true;\n        \n        if (this.canvasService.selection_manager.selectedElement() as any === this) {\n            this.canvasService.selection_manager.deactivate();\n        }\n\n        // Remove the element from the element manager\n        this.element_manager.remove(this);\n\n        // Tastypie won't remove the M2M relationship by removing it from the\n        // *_elements list. We can either delete it here or add a custom\n        // function to the resource that will figure out what to remove, add\n        // and/or keep.\n        if (this.model) {\n            this.model.remove();\n        }\n\n        if (this.offset) {\n            this.canvasService.removeOffset(this.offset);\n            this.canvasService.flattenCutpaths();\n        }\n\n        // Clear this layer and then remove it from the project\n        this.clear();\n        this.layer.remove();\n\n        // Unbind events\n        this.unbindEvents();\n\n        // Trigger design change to update the canvas preview for multi sided products\n        Services.get<PaperCanvasService>('PaperCanvasService').trigger('design-change');\n\n        this.trigger('remove');\n    }\n\n    softRemove() {\n        this.element_manager.remove(this);\n\n        this._removed = true;\n\n        this.clear();\n        this.layer?.remove();\n        this.item?.remove();\n        this.unbindEvents();\n    }\n\n    clearDebugItems(): void {\n        if (!this.debugItems) {\n            return\n        }\n\n        for (const item of this.debugItems) {\n            item?.remove();\n        }\n        this.debugItems = [];\n    }\n\n    get locked(): boolean {\n        return this._locked;\n    }\n\n    get lockedInPlace(): boolean {\n        return this._locked;\n    }\n\n    set lockedInPlace(lockedInPlace: boolean){\n        this._locked = lockedInPlace;\n    }\n\n    showScaleControls(): boolean {\n        return true;\n    }\n\n    showRotateControl(): boolean {\n        return true;\n    }\n\n    get movable(): boolean {\n        return true;\n    }\n\n    isImmutable() {\n        return !this.model.selectable && !this.model.can_remove;\n    }\n\n    get allow_clipping_when_locked(): boolean {\n        return this.model.allow_clipping_when_locked;\n    }\n\n    protected addFrameTask(fnc: any, context: any, args?: any[]): void {\n        // Don't allow adding the exact same frame task to prevent infinitely processing the same task\n        if (this.current_frame_task) {\n            if (this.current_frame_task.fnc === fnc && this.current_frame_task.context === context && this.current_frame_task.args === args) {\n                return;\n            }\n        }\n        this.frameTasks.push(new ElementFrameTask(fnc, context, args));\n    }\n\n    protected hasFrameTask(fnc: any, context: any): boolean {\n        for (const t of this.frameTasks) {\n            if (t.fnc === fnc && t.context === context)\n                return true;\n        }\n\n        return false;\n    }\n\n    cloneItem(): paper.Item {\n        return this.item.clone();\n    }\n\n    checkCanvasPosition() {\n        const newPoint: paper.Point = this.correctElementOffCanvasPosition(new this.paper.Point(\n            this.x,\n            this.y\n        ));\n\n        if (this.x !== newPoint.x)\n            this.x = newPoint.x;\n\n        if (this.y !== newPoint.y)\n            this.y = newPoint.y;\n    }\n\n    onFrame(event) {\n        this.flushFrameTasks();\n    }\n\n    public flushFrameTasks() {\n        if (this.frameTasks.length == 0) {\n            return;\n        }\n\n        this.canvasService.withSideActive(() => {\n            while ((this.current_frame_task = this.frameTasks.pop()) != null) {\n                if (this.current_frame_task) {\n                    this.current_frame_task.call();\n                    delete this.current_frame_task;\n                }\n            }\n            this.current_frame_task = null;\n        }, this.side)\n    }\n\n    public runFrameTasks() {\n        if (this.frameTasks.length == 0) {\n            return;\n        }\n\n        this.canvasService.withSideActive(() => {\n            for (const task of this.frameTasks) {\n                if (task) {\n                    task.call();\n                }\n            }\n        }, this.side)\n    }\n\n    public hide(): void {\n        this.item.visible = false;\n    }\n\n    public show(): void {\n        this.item.visible = true;\n    }\n\n    public preSave(): void {\n        return null;\n    }\n\n    public isTextType() {\n        return false;\n    }\n\n    public isClipartType() {\n        return false;\n    }\n\n    public isRasterType() {\n        return false;\n    }\n\n    public isQRCodeType() {\n        return false\n    }\n\n    public isShapeType() {\n        return false;\n    }\n\n    public isMarketplaceType() {\n        return false;\n    }\n\n    public isCropType() {\n        return false;\n    }\n\n    public isUserShapeType() {\n        return false;\n    }\n\n    public measurements(width, height) {\n        let element_bounds = this.bounds;\n        let used_size = this.element_manager.getUsedSize();\n\n        let item_width = (element_bounds.width / used_size.width) * width;\n        let item_height = (element_bounds.height / used_size.height) * height;\n\n        return {'width': item_width, 'height': item_height};\n    }\n\n    get transformation_elements(): IElement[] {\n        return [this];\n    }\n\n    get cropped() {\n        return false;\n    }\n\n    designColors(): Set<Color|string> {\n        return new Set();\n    }\n\n    controlPoints(): any[] {\n        return []\n    }\n\n    placementGuides(): Point[][] {\n        if (!this.hasGuides()) {\n            return [];\n        }\n\n        let bounds = this.elementBounds;\n        return [\n            [bounds.bottomLeft, bounds.topLeft],\n            [bounds.topLeft, bounds.topRight],\n            [bounds.topRight, bounds.bottomRight],\n            [bounds.bottomRight, bounds.bottomLeft],\n            [bounds.leftCenter, bounds.rightCenter],\n            [bounds.topCenter, bounds.bottomCenter]\n        ];\n    }\n\n    snapPoints(): Point[] {\n        let bounds = this.elementBounds;\n        return [bounds.center, bounds.topLeft, bounds.topRight, bounds.bottomRight, bounds.bottomLeft].map(v => copy(v));\n    }\n\n    hasGuides() {\n        return this.model.selectable && this.model.can_remove && !this.isImmutable();\n    }\n}\n","import {BaseElement} from './BaseElement';\nimport {IClipart} from '../models/IClipart';\nimport {Color} from '../models/Color';\nimport {RegionType} from '../models/enums';\nimport {CustomClipart} from '../models/CustomClipart';\nimport {EClipartColorChoiceEnum} from '../models/Clipart';\n\nexport class ClipartElement extends BaseElement {\n    lastRotation: number;\n    area: number;\n    xScaleInvertedLast: boolean;\n    yScaleInvertedLast: boolean;\n    showOptions: boolean;\n    url: string;\n    loadedClipart: boolean;\n    preventUpdate: boolean;\n    is_masked: boolean;\n    private readonly resizeCallback = this.updateColors.bind(this);\n\n    constructor(url: string, clipart: IClipart, layer?: paper.Layer) {\n        super(clipart, layer);\n\n        this.area = 0;\n        this.xScaleInvertedLast = false;\n        this.yScaleInvertedLast = false;\n        this.preventUpdate = false;\n\n        this.model.bind('change:x_scale_inverted', () => {\n            if (this.x_scale_inverted !== this.model.x_scale_inverted) {\n                this.x_scale_inverted = this.model.x_scale_inverted;\n                this.updatePaper();\n            }\n        }, this);\n        this.model.bind('change:y_scale_inverted', () => {\n            if (this.y_scale_inverted !== this.model.y_scale_inverted) {\n                this.y_scale_inverted = this.model.y_scale_inverted;\n                this.updatePaper();\n            }\n        }, this);\n        this.bind('change:x_scale_inverted', () => {\n            if (this.x_scale_inverted !== this.model.x_scale_inverted) {\n                this.model.x_scale_inverted = this.x_scale_inverted;\n                this.updatePaper();\n            }\n        }, this);\n        this.bind('change:y_scale_inverted', () => {\n            if (this.y_scale_inverted !== this.model.y_scale_inverted) {\n                this.model.y_scale_inverted = this.y_scale_inverted;\n                this.updatePaper();\n            }\n        }, this);\n\n        this.url = url;\n        this.loadedClipart = false;\n        this.setupClipart();\n\n        this.bindModels();\n        window.addEventListener('resize', this.resizeCallback);\n    }\n\n    protected setupClipart() {\n        this.layer.activate();\n        this.layer.importSVG(this.url, {\n            onLoad: (item, content) => {\n                // The SVG request can finish after the element has been deleted or replaced.\n                if (this._removed) {\n                    item.remove();\n                    return;\n                }\n\n                /*\n                    Paper js converts the viewBox into a rectangle in order to maintain the same look functionality\n                    however this breaks things when using clipping masks so we will just remove it for ones that\n                    support masks\n                 */\n                if (this.single_color && item.children.length > 1) {\n                    if (item.children[0].type == 'rectangle') {\n                        item.children[0].remove();\n                    }\n                }\n\n                this.item = item;\n\n                /*\n                    SVG Clipping masks have issues with groups and can fail to render the element or the mask. So if we want to use\n                    the material color feature reliably then we need to flatten all elements into a single compound path within a layer.\n\n                    This won't work for multi-color clipart so limit the functionality to ones flagged as single color\n                 */\n                if (this.single_color) {\n                    this.unite();\n                    this.preventUpdate = false;\n                }\n\n                this.loadedClipart = true;\n                this.fillInValuesFromPaper();\n                this.updatePaper();\n            },\n            onError: (message, status) => {\n                // This is needed to make sure the error propagates correctly\n                throw message\n            }\n        });\n    }\n\n    get single_color() {\n        return this.model.clipart && this.model.clipart.colors == EClipartColorChoiceEnum.SINGLE_COLOR;\n    }\n\n    public hasCutpathRegion() {\n        return !!this.cutpathRegion;\n    }\n\n    get cutpathRegion() {\n        for (const region of this.model.regions) {\n            if ((region as any).region.cutpath) {\n                return region;\n            }\n        }\n\n        return null;\n    }\n\n    public buildClippingRegion() {\n        if (!this.loadedClipart) {\n            return [];\n        }\n\n        let paths = [];\n        if (this.hasCutpathRegion()) {\n            let region = this.cutpathRegion;\n\n            let items: paper.Item[] = [];\n            if (this.item) {\n                items = this.single_color ? [this.item] : this.item.getItems({\n                    match: (i) => {\n                        return region.selectorId.indexOf(i.name) > -1 || region.selectorId.indexOf(i.className.toLowerCase()) > -1;\n                    }\n                });\n            }\n\n            for (const item of items) {\n                this.findPaths(item, paths);\n            }\n        }\n        else {\n            this.findPaths(this.item, paths)\n        }\n\n        return paths;\n    }\n\n    getSelectedRegion(point: paper.Point) {\n        if (!this.item) {\n            return [];\n        }\n\n        let top = null;\n        let top_region = null;\n        for (const region of this.model.regions) {\n            if (!region || !region.selectorId) {\n                continue;\n            }\n\n            // Search for the item with the region ID\n            const items: paper.Item[] = this.item.getItems({\n                match: (i) => {\n                    return region.selectorId.indexOf(i.name) > -1 || region.selectorId.indexOf(i.className.toLowerCase()) > -1;\n                }\n            });\n\n            for (const item of items) {\n                if (!item.contains(point)) {\n                    continue;\n                }\n                if (!top || item.isAbove(top)) {\n                    top = item;\n                    top_region = region;\n                }\n            }\n        }\n        return top_region;\n    }\n\n    override remove() {\n        super.remove();\n        this.canvasService.buildClippingMask();\n    }\n\n    bindModels(): void {\n        this.model.bind('change', this.updatePaper.bind(this), this);\n        for (const region of this.model.regions) {\n            region.bind('change', this.updatePaper.bind(this), this);\n        }\n    }\n\n    unbindModels(): void {\n        this.model.unbindWithContext('change', this);\n        for (const region of this.model.regions) {\n            region.unbindWithContext('change', this);\n        }\n    }\n\n    protected override unbindEvents(): void {\n        super.unbindEvents();\n        window.removeEventListener('resize', this.resizeCallback);\n        this.unbindModels();\n    }\n\n    updatePaper(): void {\n        if (this._removed) {\n            return;\n        }\n\n        // This task needs to be done in a frame task so it won't execute more than once per frame which\n        // happens with drag events. Its very slow and needs to be optimized.\n        const tsk = this.updatePaperOnFrame;\n        if (!this.hasFrameTask(tsk, this)) {\n            this.addFrameTask(tsk, this);\n        }\n    }\n\n\n    override updatePaperOnFrame(): void {\n        if (this._removed || this.preventUpdate) {\n            return;\n        }\n\n        this.layer.activate();\n        this.clearDebugItems();\n\n        /**\n         * Nothing to update if we don't have a paper.Item\n         * Changes to the model can cause this to be called before the clipart\n         * has been loaded.\n         */\n        if (!this.item) {\n            return;\n        }\n\n        // Idk what is causing this to happen but lets enforce it\n        if (this.layer.children.length == 0) {\n            this.layer.addChild(this.item);\n        }\n\n        // Reset rotation\n        if (this.lastRotation) {\n            this.item.rotate(-this.lastRotation);\n\n            // Keep offset path rotation in sync while waiting for it to update\n            if (this.offset) {\n                this.offset.rotate(-this.lastRotation);\n            }\n        }\n\n        let start_size = this.item.bounds.size;\n\n        // Scale\n        if (this.width && this.height) {\n            let scaleXMod = this.x_scale_inverted === this.xScaleInvertedLast ? 1 : -1;\n            let scaleYMod = this.y_scale_inverted === this.yScaleInvertedLast ? 1 : -1;\n\n            this.xScaleInvertedLast = this.x_scale_inverted;\n            this.yScaleInvertedLast = this.y_scale_inverted;\n\n            this.item.bounds.width = this.width * scaleXMod;\n            this.item.bounds.height = this.height * scaleYMod;\n\n            if (this.offset) {\n                this.offset.bounds.width *= scaleXMod;\n                this.offset.bounds.height *= scaleYMod;\n            }\n        }\n\n        // Update position\n        // Clipart origin is it's center\n        this.item.position = new this.paper.Point(\n            this.x,\n            this.y\n        );\n\n        // Generating a offset path takes too long for a frame task so we will have to manually apply\n        // scaling and transformations so its hard to tell there was a change when the old offset path is swapped\n        // for a updated one\n        if (this.offset) {\n            let width_change = this.item.bounds.width / start_size.width;\n            let height_change = this.item.bounds.height / start_size.height;\n\n            this.offset.scale(width_change, height_change);\n            this.offset.position = this.item.position;\n        }\n\n        // Rotate layer --- Transforms are unsafe below this point (or just a pain) ---\n        if (this.rotation != null) {\n            this.item.rotate(this.rotation);\n\n            // Keep offset path rotation in sync while waiting for it to update\n            if (this.offset) {\n                this.offset.rotate(this.rotation);\n            }\n\n            this.lastRotation = this.rotation;\n        }\n\n        this.updateColors();\n\n        if (!this.canvasService.clippingDisabled) {\n            this.canvasService.buildClippingMask();\n\n            // setting item to not visible will cause the bounds to go to nan and break things\n            this.item.opacity = this.model.use_as_mask ? 0 : 1;\n        }\n\n        this.queueOffsetPath();\n\n        this.trigger('updatePaper', this);\n        this.canvasService.trigger('design-change');\n\n        if (!this.initialized_deferred.promise.isResolved()) {\n            this.initialized_deferred.resolve();\n        }\n    }\n\n    override get bounds(): paper.Rectangle {\n        if (this.item) {\n            return this.item.bounds;\n        }\n\n        return this.layer.bounds;\n    }\n\n    updateColors() {\n        if (this._removed || !this.item || !this.item.parent) {\n            return;\n        }\n\n        // Find cut contour\n        this.item.getItems({\n            match: (i) => {\n                if (i.name === 'cut-contour') {\n                    i.fillColor = null;\n                    if (this.model.show_cut_contour) {\n                        i.strokeColor = new this.paper.Color(0.5, 0.5, 0.5, 0.75);\n                        i.strokeWidth = 1.5;\n                    } else {\n                        i.strokeColor = null;\n                    }\n                }\n            }\n        });\n\n        this.is_masked = false;\n\n        // Update regions\n        for (const region of this.model.regions) {\n            // Edge case if the regions have not loaded yet\n            if (!region || !region.selectorId) {\n                continue;\n            }\n\n            // Search for the item with the region ID\n            const items: paper.Item[] = this.single_color ? [this.item] : this.item.getItems({\n                match: (i) => {\n                    return region.selectorId.indexOf(i.name) > -1 || region.selectorId.indexOf(i.className.toLowerCase()) > -1;\n                }\n            });\n\n            // There could be multiple items, so let's update them all\n            for (let item of items) {\n                // A detached region has nowhere to attach a material texture.\n                if (!item.parent) {\n                    continue;\n                }\n\n                let _color = (region.color as Color);\n                let color_code = region.color_code;\n                let blend_mode = _color ? _color.blend_mode : 'normal';\n                let _region = (region as any);\n                let update_region = () => {\n                    item.fillColor = new this.paper.Color(color_code);\n                    item.visible = true;\n                    item.clipMask = false;\n\n                    if (_color && _color.texture) {\n                        this.is_masked = true;\n\n                        // If we already have a texture stored on the layer\n                        if (item.parent['texture']) {\n                            // If it doesn't match, remove it\n                            if (item.parent['texture']['color_id'] != _color.id) {\n                                item.parent['texture'].remove();\n                                item.parent['texture'] = null;\n                            }\n                        }\n\n                        // If the correct texture isn't set\n                        if (!item.parent['texture']) {\n                            let texture = null;\n\n                            // Check the cache to see if we already have a fully loaded copy of it somewhere\n                            // Loading the texture is very expensive we need to keep it in memory and reuse it\n                            if (BaseElement.cached_textures[_color.id] && BaseElement.cached_textures[_color.id].loaded) {\n                                texture = BaseElement.cached_textures[_color.id].clone();\n                                texture.bounds = this.canvasService.squareCameraBounds();\n                            }\n                            else {\n                                // Texture is not cached or not loaded so we need to create a new raster\n                                texture = new this.paper.Raster({\n                                    source: _color.texture,\n                                    crossOrigin: 'anonymous'\n                                });\n                                if (!_color.process_texture) {\n                                    texture.data['remove-in-processed-file'] = true;\n                                }\n                                texture.on('load', () => {\n                                    texture.bounds = this.canvasService.squareCameraBounds();\n\n                                    if (!BaseElement.cached_textures[_color.id]) {\n                                        BaseElement.cached_textures[_color.id] = texture.clone();\n                                        BaseElement.cached_textures[_color.id].remove();\n                                    }\n                                });\n                            }\n\n                            texture['color_id'] = _color.id;\n                            item.parent.addChild(texture);\n                            item.parent['texture'] = texture;\n                        }\n\n                        let texture = item.parent['texture'];\n                        texture.rotation = 0;\n                        texture['color_id'] = _color.id;\n\n                        // Place in the same location so it looks like its cutout of a single piece of vinyl\n                        texture.bounds = this.canvasService.squareCameraBounds();\n\n                        item.clipMask = true;\n                        item.sendToBack();\n                        texture.bringToFront();\n                    }\n                    else if (item.parent && item.parent['texture']) {\n                        item.parent['texture'].remove();\n                        item.parent['texture'] = null;\n                    }\n\n                    return item;\n                }\n\n                if (region.type === RegionType.FILL) {\n                    if (!color_code) {\n                        item.fillColor = null;\n                        item.visible = false;\n                    }\n                    else {\n                        item = update_region();\n\n                        if (_region.region && _region.region.blend_mode_selector && blend_mode) {\n                            const blend_items: paper.Item[] = this.single_color ? [this.item] : this.item.getItems({\n                                match: (i) => {\n                                    return _region.region.blendSelectorId.indexOf(i.name) > -1 || _region.region.blendSelectorId.indexOf(i.className.toLowerCase()) > -1;\n                                }\n                            });\n                            for (const blend_item of blend_items) {\n                                blend_item.blendMode = blend_mode;\n                            }\n                        }\n                        else {\n                            item.blendMode = 'normal'\n                        }\n                    }\n                }\n                else {\n                    if (color_code) {\n                        item.strokeColor = new this.paper.Color(color_code);\n                        item.strokeWidth = region.stroke_width;\n                        item.visible = true;\n                    }\n                    else {\n                        item.visible = false;\n                    }\n                }\n            }\n        }\n    }\n\n    override isImmutable(): boolean {\n        return super.isImmutable() && !this.model.forced_top_layer;\n    }\n\n    override get offset_path_enabled() {\n        return super.offset_path_enabled && !this.isImmutable()\n    }\n\n    override get elementBounds(): paper.Rectangle {\n        if (this.width && this.height) {\n            return new this.paper.Rectangle(\n                // Center of element, not top left\n                new this.paper.Point(\n                    this.x - this.width / 2,\n                    this.y - this.height / 2\n                ),\n                new this.paper.Size(this.width, this.height)\n            );\n        } else {\n            return this.bounds;\n        }\n    }\n\n    override get locked() {\n        if (!this.model.selectable) {\n            this.showOptions = false;\n\n            return !this.model.selectable;\n        }\n        this.showOptions = true;\n\n        return this.lockedInPlace;\n    }\n\n    override get lockedInPlace() {\n        return this._locked || (!this.canvasService.admin_options && this.model.use_as_mask);\n    }\n\n    public unite() {\n        if (this.is_masked) {\n            return;\n        }\n\n        const elementNames: string[] = ['Shape', 'Path', 'CompoundPath'];\n        const hasClipMask = (obj: any): boolean => {\n            if (elementNames.indexOf(obj.className) > -1 && obj.clipMask === true) {\n                return true;\n            } else if (obj.hasChildren && obj.hasChildren()) {\n                for (const child of obj.children) {\n                    if (hasClipMask(child))\n                        return true;\n                }\n            }\n\n            return false;\n        };\n\n        const getChildren = (obj: any, arr?: any[]) => {\n            arr = arr || [];\n            if (elementNames.indexOf(obj.className) > -1 && obj.visible && obj.area !== undefined && obj.clipMask === false) {\n                arr.push(obj);\n            }\n            else if (obj.hasChildren && obj.hasChildren()) {\n                for (const child of obj.children) {\n                    getChildren(child, arr);\n                }\n            }\n\n            return arr;\n        };\n\n        /*\n        // Don't try to unify clipart with clip masks\n        if (hasClipMask(this.item)) {\n            return;\n        } */\n\n        this.item.remove();\n\n        const items: any[] = getChildren(this.item);\n\n        let i: any = null;\n        for (const item of items) {\n            if (!i) {\n                i = item;\n            } else {\n                i = i.unite(item);\n            }\n        }\n\n        this.item = i;\n        this.layer.addChild(i);\n        this.preventUpdate = true;\n    }\n\n    public override preSave() {\n        if (!this.item) return null;\n\n        if (!this.model.show_cut_contour) {\n            // Remove cut paths\n            const toRemove: paper.Item[] = [];\n            this.item.getItems({\n                match: (i: paper.Item): void => {\n                    if (i.name === 'cut-contour') {\n                        toRemove.push(i);\n                    }\n                }\n            });\n            for (const item of toRemove)\n                item.remove();\n        }\n\n        if (this.model instanceof CustomClipart && this.model.clipart.colors === EClipartColorChoiceEnum.SINGLE_COLOR) {\n            this.unite();\n        }\n\n        if (this.model.clipart.replaced_in_processed) {\n            if (this.model.clipart && this.model.clipart.id) {\n                this.item.data['remove-in-processed-file'] = true;\n\n                let rect = new this.paper.Shape.Rectangle(\n                    this.item.bounds\n                );\n                this.layer.addChild(rect);\n\n                rect.data['replace-in-processed-file'] = true;\n                rect.data['clipart_id'] = this.model.clipart.id;\n                rect.data['identifier'] = this.model.getOrCreateIdentifier();\n            }\n        }\n\n        if (this.model.clipart.remove_in_processed) {\n            this.item.data['remove-in-processed-file'] = true;\n        }\n\n        // Rename all cut path ids to something else if it's not immutable or a background element\n        if (!this.isImmutable()) {\n            let cutpath_ids = [\n                'CutContour',\n                'cut-contour',\n                'contour-cut',\n                'CutPath',\n                'cutpath',\n                'cut-path',\n                'oval-background',\n                'template-background',\n                'permit_outline',\n                'permit-background',\n                'outline',\n                'rectangle-cut-path',\n                'cut-contour_1_',\n                'background'\n            ];\n\n            const items: paper.Item[] = [];\n            this.item.getItems({\n                match: (i: paper.Item): void => {\n                    if (cutpath_ids.indexOf(i.name) != -1) {\n                        items.push(i);\n                    }\n                }\n            });\n\n            for (const item of items) {\n                item.data['ignore-id'] = true\n            }\n        }\n    }\n\n    public override isClipartType(): boolean {\n        return true;\n    }\n\n    override designColors() {\n        let colors = super.designColors();\n\n        for (const region of this.model.regions) {\n            if (region.custom_color) {\n                colors.add(region.custom_color);\n            }\n            else if (region.color) {\n                colors.add(region.color);\n            }\n        }\n\n        return colors;\n    }\n}\n","/*\n    Vue's reactivity system can slow things down a lot so these function will optionally disable the system.\n */\nimport {ReactiveFlags} from '@vue/reactivity';\n\nexport function nonreactiveClass<T extends {new (...args: any[]): {}}>(constructor: T) {\n    constructor.prototype[ReactiveFlags.SKIP] = true;\n}\n\nexport function nonreactiveProperty() {\n    return function(target: any, key: string) {\n        Object.defineProperty(target, key, {\n            get: () => {\n                return target[`___${key}`];\n            },\n            set: (v) => {\n                if (v) {\n                    v[ReactiveFlags.SKIP] = true;\n                }\n\n                target[`___${key}`] = v;\n            },\n            enumerable: false,\n            configurable: false\n        });\n    };\n}\n\nexport function disableVueForImport(v: any) {\n    for (const key of Object.keys(v)) {\n        let item = v[key];\n\n        if (!item || !(item instanceof Object) || !item.prototype) {\n            continue\n        }\n\n        item.prototype[ReactiveFlags.SKIP] = true;\n    }\n}\n","// Static vector utility functions\n// These should work with paper.js points, but do not return paper.js points\n\nexport type Point = {\n    x: number,\n    y: number\n}\n\nexport type Line = [Point, Point];\n\n// 4/3 tan(pi/8) = closest handle approximation of bezier circle.\nexport const BEZIER_CIRCLE_SCALE = 0.552284749831;\n\n// Close enough to zero to be considered zero due to floating point errors and limited precision\nexport const EPSILON = 1e-12;\n\n// Given two points a and b, return the point that is a defined distance away from a towards b\n// This is the same as setting a vector defined by a and b to a length defined by the amount, at the origin of a\nexport function pointDistance(a: Point, b: Point, amount: number): Point {\n    let dx = b.x - a.x;\n    let dy = b.y - a.y;\n    let length = Math.hypot(dx, dy);\n\n    if (length < EPSILON) {\n        return {x: a.x, y: a.y};\n    }\n\n    let t = amount / length;\n    return {x: a.x + dx * t, y: a.y + dy * t};\n}\n\nexport function midpoint(a: Point, b: Point): Point {\n    return {x: (a.x + b.x) / 2, y: (a.y + b.y) / 2}\n}\n\n// The midpoint between two points a and b using the normalized vector from point p. The result is scaled to the defined length.\nexport function normalizedMidpoint(a: Point, b: Point, p: Point, length: number = 1): Point {\n    let p1 = normalizeVector(p, a);\n    let p2 = normalizeVector(p, b);\n    let mp = midpoint(add(p1, p), add(p2, p));\n    return pointDistance(p, mp, length);\n}\n\n// The distance between point a and point b\nexport function distance(a: Point, b: Point): number {\n    return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\n// Find the distance from the line created from a and b for a given point p.\n// The normal of a and b determines the sign.\n// Ex: a:[0,0] b:[100,0] p:[0,10] => 0\n//     a:[0,0] b:[100,0] p:[10,0] => 10\n//     a:[0,0] b:[100,0] p:[-10,0] => -10\nexport function signedOrientedDistance(a: Point, b: Point, p: Point): number {\n    const dx = b.x - a.x;\n    const dy = b.y - a.y;\n    const length = Math.hypot(dx, dy);\n\n    if (length < EPSILON) {\n        return 0;\n    }\n\n    return ((p.x - a.x) * dx + (p.y - a.y) * dy) / length;\n}\n\n// Find the distance from the perpendicular/normal line created from a and b, at the origin a, for a given point p.\n// The line a and b determines the sign.\n// Ex: a:[0,0] b:[100,0] p:[10,0] => 0\n//     a:[0,0] b:[100,0] p:[0,10] => 10\n//     a:[0,0] b:[100,0] p:[0,-10] => -10\nexport function signedPerpendicularDistance(a: Point, b: Point, p: Point): number {\n    const dx = b.x - a.x;\n    const dy = b.y - a.y;\n    const length = Math.hypot(dx, dy);\n\n    if (length < EPSILON) {\n        return 0;\n    }\n\n    return ((p.y - a.y) * dx - (p.x - a.x) * dy) / length;\n}\n\n// Find the distance from a line defined from points a and b for a given test point p.\nexport function signedDistance(a: Point, b: Point, p: Point): number {\n    const dx = b.x - a.x;\n    const dy = b.y - a.y;\n    const length = Math.hypot(dx, dy);\n\n    if (length < EPSILON) {\n        return 0;\n    }\n\n    return ((p.x - a.x) * dy - (p.y - a.y) * dx) / length;\n}\n\n// Normalize the vector from a to b to a unit length of 1.\nexport function normalizeVector(a: Point, b: Point): Point {\n    const dx = b.x - a.x;\n    const dy = b.y - a.y;\n\n    const length = Math.hypot(dx, dy);\n    if (length < EPSILON) {\n        return {x: 0, y: 0};\n    }\n\n    return {\n        x: dx / length,\n        y: dy / length\n    }\n}\n\n\n// Calculate the angle bisector vector using two lines a - b and c - d with a length defined by the amount.\nexport function angleBisectorVector(a: Point, b: Point, c: Point, d: Point, amount: number = 1): Point {\n    let a_normal = normalizeVector(a, b);\n    let b_normal = normalizeVector(c, d);\n\n    if (!a_normal || !b_normal) {\n        return null;\n    }\n\n    // angle bisector\n    let bx = (b.x - a.x) + (d.x - c.x);\n    let by = (b.y - a.y) + (d.y - c.y);\n\n    let length = Math.hypot(bx, by);\n    if (length < EPSILON) {\n        return {x: 0, y: 0};\n    }\n\n    return {x: amount * bx / length, y: amount * by / length};\n}\n\n// Give a line defined by point a and b, return a normal vector of unit length 1 pointing to the line\nexport function orientedNormal(a: Point, b: Point, p: Point): Point {\n    const dx = b.x - a.x;\n    const dy = b.y - a.y;\n\n    let nx = -dy;\n    let ny = dx;\n\n    const tx = p.x - a.x;\n    const ty = p.y - a.y;\n\n    if (nx * tx + ny * ty < 0) {\n        nx = -nx;\n        ny = -ny;\n    }\n\n    const length = Math.hypot(nx, ny);\n    if (length < EPSILON) {\n        return {x: 0, y: 0};\n    }\n\n    return {x: nx / length, y: ny / length};\n}\n\nexport function normal(a: Point, b: Point): Point {\n    const dx = b.x - a.x;\n    const dy = b.y - a.y;\n\n    let nx = -dy;\n    let ny = dx;\n\n    const length = Math.hypot(nx, ny);\n    if (length < EPSILON) {\n        return {x: 0, y: 0};\n    }\n\n    return {x: nx / length, y: ny / length};\n}\n\nexport function lineIntersection(a: Point, b: Point, c: Point, d: Point) {\n    const rdx = b.x - a.x;\n    const rdy = b.y - a.y;\n    const sdx = d.x - c.x;\n    const sdy = d.y - c.y;\n\n    const denominator = rdx * sdy - rdy * sdx;\n\n    // Parallel (or coincident) lines\n    if (Math.abs(denominator) < EPSILON) {\n        return null;\n    }\n\n    const t = ((c.x - a.x) * sdy - (c.y - a.y) * sdx) / denominator;\n\n    return {x: a.x + t * rdx, y: a.y + t * rdy};\n}\n\n// Cross product\nexport function cross(a: Point, b: Point): number {\n    return a.x * b.y - a.y * b.x;\n}\n\n// Dot product\nexport function dot(a: Point, b: Point): number {\n    return a.x * b.x + a.y * b.y;\n}\n\n// Projection\nexport function project(a: Point, b: Point): {x: number, y: number} {\n    let d = dot(b, b);\n    let s = d == 0 ? 0 : dot(a, b) / d;\n    return {x: b.x * s, y: b.y * s};\n}\n\n// Add two vector\nexport function add(a: Point, b: Point): Point {\n    return {\n        x: a.x + b.x,\n        y: a.y + b.y\n    }\n}\n\n// Subtract two vectors\nexport function subtract(a: Point, b: Point): Point {\n    return {\n        x: a.x - b.x,\n        y: a.y - b.y\n    }\n}\n\n// Add two vectors\nexport function scale(a: Point, value: number): Point {\n    return {\n        x: a.x * value,\n        y: a.y * value\n    }\n}\n\nexport function scalePoint(a: Point, value: Point): Point {\n    return {\n        x: a.x * value.x,\n        y: a.y * value.y\n    }\n}\n\n// Tests if line a, b and c, d are intersecting\nexport function intersecting(a: Point, b: Point, c: Point, d: Point): boolean {\n    const rx = b.x - a.x;\n    const ry = b.y - a.y;\n    const sx = d.x - c.x;\n    const sy = d.y - c.y;\n\n    const denominator = rx * sy - ry * sx;\n\n    // Parallel or collinear\n    if (Math.abs(denominator) < EPSILON) {\n        return false;\n    }\n\n    const t = ((c.x - a.x) * sy - (c.y - a.y) * sx) / denominator;\n    const u = ((c.x - a.x) * ry - (c.y - a.y) * rx) / denominator;\n\n    // Check if intersection occurs within both segments\n    return t >= 0 && t <= 1 && u >= 0 && u <= 1;\n}\n\n// Flips the orientation of the vector\nexport function invert(a: Point): Point {\n    return {\n        x: -a.x,\n        y: -a.y\n    }\n}\n\nexport function equals(a: Point, b: Point): boolean {\n    return Math.abs(a.x - b.x) < EPSILON && Math.abs(a.y - b.y) < EPSILON;\n}\n\n\n// Find the closest point on the line from a to b, for a given point p\nexport function closestPointOnLine(a: Point, b: Point, p: Point) {\n    const ab = subtract(b, a);\n    const ap = subtract(p, a);\n\n    const projection = project(ap, ab);\n\n    return add(a, projection);\n}\n\n// Find if two lines a, b and c, d are overlapping assuming infinite length\nexport function linesOverlap(a: Point, b: Point, c: Point, d: Point) {\n    const ab = subtract(b, a);\n    const cd = subtract(d, c);\n\n    // Parallel lines\n    if (Math.abs(cross(ab, cd)) > EPSILON) {\n        return false;\n    }\n\n    // Collinear/overlapping lines\n    const ac = subtract(c, a);\n    return Math.abs(cross(ab, ac)) <= EPSILON;\n}\n\nexport function length(a: Point) {\n    return Math.sqrt(dot(a, a));\n}\n\nexport function clampRotation(angle) {\n    return angle < 0 ? angle % 360 + 360 : angle % 360\n}\n\nexport function rotatePoint(point: Point, radians: number): Point {\n    const sin = Math.sin(radians);\n    const cos = Math.cos(radians);\n    const x = (cos * point.x) - (sin * point.y);\n    const y = (sin * point.x) + (cos * point.y);\n    return {x: x, y: y};\n}\n\nexport function degreesToRadian(deg): number {\n    return deg * (Math.PI / 180)\n}\n\nexport function radianToDegrees(rad): number {\n    return rad * (180 / Math.PI);\n}\n\nexport function rotatePointAround(a: Point, b: Point, deg: number) {\n    const rad = deg * (Math.PI / 180);\n\n    const cos = Math.cos(rad);\n    const sin = Math.sin(rad);\n\n    // translate A relative to B\n    const x = a.x - b.x;\n    const y = a.y - b.y;\n\n    // rotate\n    const rx = x * cos - y * sin;\n    const ry = x * sin + y * cos;\n\n    // translate back\n    return {\n        x: rx + b.x,\n        y: ry + b.y\n    };\n}\n\nexport function copy(point: Point) {\n    return {x: point.x, y: point.y};\n}\n\nexport function distanceFromLineSegment(a: Point, b: Point, c: Point) {\n    const ab = subtract(b, a);\n    const ac = subtract(c, a);\n\n    const ab_dot = dot(ab, ab);\n    if (ab_dot === 0) {\n        return length(ac);\n    }\n\n    // Projection factor\n    let t = dot(ac, ab) / ab_dot;\n\n    // Clamp to segment\n    t = Math.max(0, Math.min(1, t));\n\n    // Closest point on segment\n    const closest = add(a, scale(ab, t));\n\n    // Distance from C to closest point\n    return length(subtract(c, closest));\n}\n\n// Returns a vector of unit length one from 0,0\nexport function normalize(v: Point) {\n    const len = length(v);\n    if (len === 0) {\n        return {x: 0, y: 0}\n    }\n    return {x: v.x / len, y: v.y / len};\n}\n\n// Find the signed angle in radians between lines a,b and c,d\nexport function signedAngleBetweenLines(a: Point, b: Point, c: Point, d: Point): number {\n  const u = subtract(b, a);\n  const v = subtract(d, c);\n\n  const u_norm = normalize(u);\n  const v_norm = normalize(v);\n\n  return Math.atan2(cross(u_norm, v_norm), dot(u_norm, v_norm));\n}","import {SizeOptions, TextLocationOptions} from '../models/ConfiguredDragDropBuyProduct';\nimport DragDropBuyService from '../services/DragDropBuyService';\nimport ProductPageLoaderAbstract from './ProductPageLoaderAbstract';\nimport {Services} from '../../../core/services/Services';\nimport {ElementManager} from '../services/ElementManager';\nimport PaperCanvasService from '../services/PaperCanvasService';\nimport {SelectionManager} from '../services/SelectionManager';\nimport {computed, data, method, prop} from '../../../core/adapters/VueComponent';\nimport {DragDropBuyElement} from '../tool/DragDropBuyElement';\nimport {yieldThread} from '../../../core/utils/utils';\n\n\nexport default class DDBToolPageController extends ProductPageLoaderAbstract {\n    public static readonly $inject: string[] = [\n        'DragDropBuyService'\n    ];\n\n    declare product_service: DragDropBuyService;\n\n    @data()\n    element_manager: ElementManager;\n\n    @data()\n    canvas_service: PaperCanvasService;\n\n    @data()\n    selection_manager: SelectionManager;\n\n    @data()\n    selection: DragDropBuyElement;\n\n    constructor() {\n        super();\n\n        this.element_manager = Services.get<ElementManager>('ElementManager');\n        this.canvas_service = Services.get<PaperCanvasService>('PaperCanvasService');\n        this.selection_manager = Services.get<SelectionManager>('SelectionManager');\n\n        this.selection_manager.bind('selection:change', () => {\n           this.selection = this.selection_manager.selection as DragDropBuyElement;\n        }, this);\n\n        window['ddb'] = this;\n    }\n\n    static override init() {\n        super.init(Services.get<DragDropBuyService>('DragDropBuyService'), 'product', 'configured_product');\n    }\n\n    override mounted() {\n        super.mounted();\n\n        let canvas = this.$el.querySelector('#vector-canvas');\n        yieldThread().then(() => {\n            this.canvas_service.setupPaperFromCanvas(canvas);\n        })\n    }\n\n    @method()\n    addClipart(id) {\n        this.product_service.addElement(this.product_service.clipart.items.getItemFromID(id));\n    }\n\n    @computed()\n    get text_size(): SizeOptions {\n        if (this.product_service.configured) {\n            return this.product_service.configured.text_size;\n        }\n        return SizeOptions.MEDIUM;\n    }\n    set text_size(v) {\n        if (this.product_service.configured) {\n            this.product_service.configured.text_size = v;\n        }\n    }\n\n    @computed()\n    get text_location(): TextLocationOptions {\n        if (this.product_service.configured) {\n            return this.product_service.configured.text_location;\n        }\n        return null;\n    }\n    set text_location(v: TextLocationOptions) {\n        if (this.product_service.configured) {\n            this.product_service.configured.text_location = v;\n        }\n    }\n\n    @computed()\n    set selected_name(v) {\n        if (this.selection) {\n            this.selection.model.text = v;\n        }\n    }\n    get selected_name() {\n        if (this.selection) {\n            return this.selection.model.text;\n        }\n        return null\n    }\n\n    @computed()\n    get group_name() {\n        if (this.product_service.configured) {\n            return this.product_service.configured.text;\n        }\n    }\n    set group_name(v) {\n        if (this.product_service.configured) {\n            this.product_service.configured.text = v;\n        }\n    }\n\n    @method()\n    deleteSelection() {\n        if (this.selection) {\n            this.selection.remove();\n        }\n    }\n\n    @computed()\n    get font() {\n        if (this.product_service.configured) {\n            return this.product_service.configured.font;\n        }\n        return null;\n    }\n\n    set font(v) {\n        if (this.product_service.configured) {\n            this.product_service.configured.font = v;\n        }\n    }\n}\n","import ProductPageLoaderAbstract from './ProductPageLoaderAbstract';\nimport {computed, data} from '../../../core/adapters/VueComponent';\nimport {Services} from '../../../core/services/Services';\nimport DragDropBuyService from '../services/DragDropBuyService';\n\n\nexport default class DDBOptionsApp extends ProductPageLoaderAbstract {\n    declare product_service: DragDropBuyService;\n\n    @data()\n    step: number = 0;\n\n    @data()\n    action: string;\n\n    @data()\n    size_value;\n\n    static override init() {\n        super.init(Services.get<DragDropBuyService>('DragDropBuyService'), 'product', 'configured_product');\n    }\n\n    constructor() {\n        super();\n        // Need to move the changing size value into the data so vue can track it with computed\n        this.product_service.setup_complete.then(() => {\n            this.product_service.configured.bind('change:size', () => {\n                this.size_value = this.product_service.configured.size;\n            }, this);\n            this.size_value = this.product_service.configured.size;\n        })\n    }\n\n    @computed()\n    get size() {\n        if (this.size_value) {\n            return this.size_value.id;\n        }\n    }\n    set size(v) {\n        if (this.product_service.base.sizes) {\n            this.product_service.configured.size = this.product_service.base.sizes.getItemFromID(v);\n        }\n    }\n}","import {Services} from '../../ts/core/services/Services';\n\nimport DDBToolPageApp from '../../ts/apps/svgcustom/apps/DDBToolPageApp';\nimport registerCoreComponents from '../../ts/core/components/init';\nimport registerCustomComponents from '../../ts/apps/svgcustom/components/custom.init';\nimport registerCustomServices from '../../ts/apps/svgcustom/services/custom.init';\nimport registerProductAddonServices from '../../ts/apps/products_shared/services/init';\nimport {IntegrationExtra} from '../../ts/core/utils/IntegrationExtra';\nimport registerDeliveryComponents from '../../ts/apps/delivery/components/init';\nimport registerSetupComponents from '../../ts/apps/svgcustom/components/SetupPage/init';\nimport DDBOptionsApp from '../../ts/apps/svgcustom/apps/DDBOptionsApp';\n\nexport default class DDBIntegration extends IntegrationExtra {\n\n    override configureServices(): void {\n        Services.resolve('loaded-page-app');\n    }\n\n    setupApps(): void {\n        DDBToolPageApp.mount('#ddb-tool-app', (app) => {\n            registerCoreComponents(app);\n            registerCustomComponents(app);\n            registerDeliveryComponents(app);\n        });\n\n        DDBOptionsApp.mount('#ddb-options-app', (app) => {\n            registerCoreComponents(app);\n            registerSetupComponents(app);\n        });\n    }\n\n    setupModels(): void {\n        // Done in custom common\n    }\n\n    setupServices(): void {\n        registerCustomServices(Services);\n        registerProductAddonServices(Services);\n    }\n}","import DDBIntegration from '../../../common/integrations/ts/DragDropBuy';\n\nconst ddb_integration = new DDBIntegration();"],"names":["ProductProductionTimeController","VueComponent","Ay","_classSuper","constructor","componet","super","this","standard","__runInitializers","_instanceExtraInitializers","_standard_initializers","rush","_standard_extraInitializers","_rush_initializers","message","_rush_extraInitializers","_message_initializers","loaded","_message_extraInitializers","_loaded_initializers","backordered","_loaded_extraInitializers","_backordered_initializers","Services","x","waitOn","then","product_service","get","configured","bind","updateTimes","material","quantity","size","width","height","request","method","url","params","id","response","data","$forceUpdate","hidden","isRegistered","p","EJ","__esDecorate","_a","_updateTimes_decorators","kind","name","static","private","access","has","obj","metadata","_metadata","_hidden_decorators","_standard_decorators","set","value","_rush_decorators","_message_decorators","_loaded_decorators","_backordered_decorators","_backordered_extraInitializers","ProductProductionTime","tag","controller","template","registerComponents","vue_app","registerComponent","_ProductProductionTime_ProductProductionTime__WEBPACK_IMPORTED_MODULE_0__","A","PriceController","component","productService","_productService_initializers","unit","_productService_extraInitializers","_unit_initializers","total","_unit_extraInitializers","_total_initializers","_w","_productService_decorators","_unit_decorators","_total_decorators","_total_extraInitializers","Price","QuantityOptionsController","quantity_options","_quantity_options_initializers","show_more","_quantity_options_extraInitializers","_show_more_initializers","show_all","_show_more_extraInitializers","_show_all_initializers","calcQuantityOptions","setup_complete","console","error","updateQuantityOptions","checkView","$el","parentElement","scrollIntoView","pricing","to_pop","i","length","current","next","base","minimum_quantity","push","item","splice","indexOf","index","default_quantity","slice","_updateQuantityOptions_decorators","_checkView_decorators","_quantity_options_decorators","_show_more_decorators","_show_all_decorators","_show_all_extraInitializers","QuantityBreaks","ConfiguredProductServiceAbstract","_ProductServiceAbstract__WEBPACK_IMPORTED_MODULE_5__","base_class","configured_class","base_key","available_packages","optionsPrice","calcOptionsPrice","price","show_retail","setupFromData","base_data","configured_data","all_data","configure","currency","setupExtraData","setupFromProduct","setupConfiguredFromBase","nextUrl","getNextURL","show_wholesale_prices","color_map","material_color","color_maps","find","v","key","product_color_set","values","design_colors","colors_available","colors_available_for_material","material_colors","createNewFromBase","needs_additional_setup","materials","getItemFromID","errors","add","default_material","getItemFromURI","type","default_width","default_height","query_quantity","Number","_core_services_Services__WEBPACK_IMPORTED_MODULE_0__","setupProductOptions","updatePricing","checkMaterialColor","checkBackorderedMaterial","validateMaxSize","checkWarnings","setTimeout","limited_quantity","setup_complete_deferred","resolve","warnings","_core_utils_MessageList__WEBPACK_IMPORTED_MODULE_1__","remove","default","setupRetailPackaging","packages","$promise","resetPackages","updatePackages","objects","filter","trigger","hasPackageOptions","items","old_packages","getValidSizeFor","retail_package","package","old_package","_packaging_models_ConfiguredRetailPackage__WEBPACK_IMPORTED_MODULE_6__","fetchQuote","sizeIsRestricted","sizeIsValid","merge","list","forceUpdatePricing","price_quote_key","keep_errors","reset","quantityIsValid","quoted_material","quoted_width","cleaned","quoted_height","PriceQuoteService","price_tier","price_quote_uuid","uuid","getPriceQuote","prices","quantities","unshift","shift","sqInches","_core_utils_PricingTier__WEBPACK_IMPORTED_MODULE_2__","_core_utils_utils__WEBPACK_IMPORTED_MODULE_4__","bS","designHasVariableData","variable_data_charge","variable_data","tier","next_tier","t","parseInt","percent","UD","Cc","unitPrice","preSave","save","remaining_stock","allow_backorders","outOfStock","disabled","isResolved","$event","skip_validation","state","_core_utils_ButtonProcessingState__WEBPACK_IMPORTED_MODULE_3__","process","window","onbeforeunload","validate","hasErrors","saving","onSaveSuccess","add_to_cart","addToCart","pageTransition","resolved","error_message","onSaveFailure","allow_custom_sizes","show_custom_sizes","onHeightChange","onWidthChange","proportions_ratio","hasLockRatio","lockRatio","unit_width","jw","qE","ups","convertSizeFromInches","convertSizeToInches","unit_height","toggleLockedProportions","setLockedProportions","updateCanvas","isPromotionalTextDisabled","disable_promotional_text","adjustSizeToPackage","available_sizes","max_product_width","adjustedPackageSize","toFixed","materialSelectionMap","map","adhesive","material_name","materialTypes","Object","keys","sort","adhesiveTypes","a","b","order","adhesive_type","configured_option_model","ConfiguredOptionModel","option_set","options","found","custom_option","equals","default_option","display_type","_svgcustom_models_enums__WEBPACK_IMPORTED_MODULE_7__","uM","CHECKBOX","option","validateDisplayType","proportionsLocked","ProductServiceAbstract","_core_utils_EventDispatcher__WEBPACK_IMPORTED_MODULE_3__","Q","show_retail_value","_core_utils_SimplePromise__WEBPACK_IMPORTED_MODULE_2__","yY","defer","promise","_core_utils_MessageList__WEBPACK_IMPORTED_MODULE_0__","_core_services_Services__WEBPACK_IMPORTED_MODULE_1__","auto_page_transition","once","trackProductPage","sku","addEventListener","event","persisted","revalidateOnError","page_change_params","next_url","URL","location","origin","current_url","href","searchParams","append","trackAddedProductToCart","assign","preValidate","optionsUnitValue","PriceQuote","$http","e","material_id","quoteRetailPackage","package_id","size_id","deferred","SimplePromise","reject","PricingTier","$inject","registerServices","services","singleton","services_PriceQuote","__WEBPACK_DEFAULT_EXPORT__","_core_adapters_VueApp__WEBPACK_IMPORTED_MODULE_0__","base_data_key","defaultPrice","_defaultPrice_initializers","_defaultPrice_extraInitializers","_product_service_initializers","image_display","_product_service_extraInitializers","_image_display_initializers","_image_display_extraInitializers","_ups_initializers","_core_services_Services__WEBPACK_IMPORTED_MODULE_2__","init","configured_data_key","product_data","product_data_element","document","getElementById","textContent","JSON","parse","atob","replace","registerObject","scrollToTestimonials","behavior","block","withinViewport","el","querySelector","getBoundingClientRect","y","checkScrollPosition","register","_core_utils_Modal__WEBPACK_IMPORTED_MODULE_3__","yl","_core_adapters_VueComponent__WEBPACK_IMPORTED_MODULE_1__","_scrollToTestimonials_decorators","_checkScrollPosition_decorators","_register_decorators","_defaultPrice_decorators","_product_service_decorators","_image_display_decorators","_ups_decorators","_ups_extraInitializers","ShapeType","html","ellipse","polygon","rectangle","star","SelectDesignController","mounted","selected_action","disable_upload","design_only","back","step","nextStep","action","_step_initializers","_step_extraInitializers","_action_initializers","files","_action_extraInitializers","_files_initializers","reorders","_files_extraInitializers","_reorders_initializers","autosaves","_reorders_extraInitializers","_autosaves_initializers","_autosaves_extraInitializers","_selected_action_initializers","emit","_back_decorators","_nextStep_decorators","_step_decorators","_action_decorators","_files_decorators","_reorders_decorators","_autosaves_decorators","_selected_action_decorators","_selected_action_extraInitializers","SelectDesign","UploadFileController","UploadFile_runInitializers","upload_success_callback","_upload_success_callback_initializers","upload_failure_callback","_upload_success_callback_extraInitializers","_upload_failure_callback_initializers","uploadSuccess","uploadFailure","user_file","UserFile","s","tool_type","enums","yF","UPLOAD","auto_background_removal","remove_background","utils","De","UploadFile_esDecorate","_upload_success_callback_decorators","_upload_failure_callback_decorators","_upload_failure_callback_extraInitializers","UploadFile","SelectFileController","SelectFile_runInitializers","user_files","_user_files_initializers","limit","_user_files_extraInitializers","_limit_initializers","page","_limit_extraInitializers","_page_initializers","search","_page_extraInitializers","_search_initializers","selectUserFile","goToFinalize","offset","name__icontains","removeUserFile","file","removeItemFromID","SelectFile_esDecorate","_selectUserFile_decorators","_goToFinalize_decorators","_filter_decorators","_removeUserFile_decorators","_user_files_decorators","_limit_decorators","_page_decorators","_search_decorators","_search_extraInitializers","SelectFile","SelectTemplateController","selectTemplate","useDesign","SelectTemplate_runInitializers","SelectTemplate_esDecorate","_selectTemplate_decorators","SelectTemplate","SelectAutosaveController","SelectAutosave_runInitializers","no_data","selectAutosave","autosave","load_save","tool_url","toString","removeAutosave","delete","SelectAutosave_esDecorate","_selectAutosave_decorators","_removeAutosave_decorators","SelectAutosave","TemplateSetupOptionsShapes","FIXED_VALUE","TemplateOption","X","CHARGE_PERCENTAGE","CHARGE_TOTAL","CHARGE_UNIT","TOGGLE_BUTTON","RADIO","DROPDOWN","INCREMENTAL_OPTION","TemplateFinalizeOptionsController","beforeMount","lamination_options","laminationOptions","option_laminate","Ez","NONE","label","getOptionName","templateOptionSet","customService","custom","undefined","getOptionItemNameCallback","getOptionItemName","charge_option","amount","formatted","VueApp","GLOBAL_FILTERS","display_value","quantityBreakIndex","hasOptions","laminate","can_laminate","border","idForOptionSet","toLowerCase","split","join","toggleOption","filteredOptions","isDisabled","optionEligible","filteredOptionItems","optionChecked","option_value","toggleSingleOption","hidePrice","togglePriceOption","lastOption","firstOptionSelected","nextOption","lastOptionSelected","infoTitle","_infoTitle_initializers","showInfoBool","_infoTitle_extraInitializers","_showInfoBool_initializers","optionItemNameCallback","_showInfoBool_extraInitializers","_optionItemNameCallback_initializers","show_border_description","_optionItemNameCallback_extraInitializers","_show_border_description_initializers","show_lamination_description","_show_border_description_extraInitializers","_show_lamination_description_initializers","_show_lamination_description_extraInitializers","priceQuote","_priceQuote_initializers","readOnly","_priceQuote_extraInitializers","_readOnly_initializers","hideRetailPackaging","_readOnly_extraInitializers","_hideRetailPackaging_initializers","reverseCut","_hideRetailPackaging_extraInitializers","_reverseCut_initializers","_reverseCut_extraInitializers","_lamination_options_initializers","EW","_getOptionName_decorators","_getOptionItemNameCallback_decorators","_getOptionItemName_decorators","_hasOptions_decorators","_idForOptionSet_decorators","_toggleOption_decorators","_filteredOptions_decorators","_filteredOptionItems_decorators","_optionChecked_decorators","_toggleSingleOption_decorators","_hidePrice_decorators","_togglePriceOption_decorators","_lastOption_decorators","_nextOption_decorators","_firstOptionSelected_decorators","_lastOptionSelected_decorators","_infoTitle_decorators","_showInfoBool_decorators","_optionItemNameCallback_decorators","_show_border_description_decorators","_show_lamination_description_decorators","_priceQuote_decorators","_readOnly_decorators","_hideRetailPackaging_decorators","_reverseCut_decorators","_lamination_options_decorators","_lamination_options_extraInitializers","TemplateFinalizeOptions","AM","ROUNDED_CORNER","ShapesController","side","_side_initializers","_side_extraInitializers","showSize","_showSize_initializers","setNewShape","shape","custom_shapes","template_shape","to_remove","custom_shape","bindToConfigured","loadDefaultsFromTemplate","carryOverData","setupShapeElement","fitShape","checkSharedShapeSides","checkSharedShapeAttributes","clip_type","clip_radius","defaultSideId","lowest","template_shapes","templateShapes","selected_side","customShapes","isShapeSelected","scaleRoundness","Math","max","min","_setNewShape_decorators","_templateShapes_decorators","_customShapes_decorators","_isShapeSelected_decorators","_scaleRoundness_decorators","_side_decorators","_showSize_decorators","_showSize_extraInitializers","AddClipartComponentController","activeTab","_activeTab_initializers","company","_activeTab_extraInitializers","_company_initializers","search_query","_company_extraInitializers","_search_query_initializers","searched_query","_search_query_extraInitializers","_searched_query_initializers","shape_categories","_searched_query_extraInitializers","_shape_categories_initializers","clipart","_shape_categories_extraInitializers","_clipart_initializers","_clipart_extraInitializers","category","_category_initializers","category_breadcrumbs","_category_extraInitializers","_category_breadcrumbs_initializers","page_change_callback","_category_breadcrumbs_extraInitializers","_page_change_callback_initializers","searching","_page_change_callback_extraInitializers","_searching_initializers","filtered_categories","_searching_extraInitializers","_filtered_categories_initializers","back_action","_filtered_categories_extraInitializers","_back_action_initializers","paginationFunction","clipart_categories","filterSubCategories","shapes","pop","selectCategory","q","query","po","CUTOUT","Clipart","SINGLE_COLOR","marketplace_elements","from","err","addClipart","graphic","resource_uri","createMarketplaceElement","artwork","selectable","maintain_proportion","createClipartElement","updateCategoryBreadcrumbs","onCategoryChange","removeCategory","current_category","parent","reverse","uri_check","buildResourceURI","image","_addClipart_decorators","_reset_decorators","_onCategoryChange_decorators","_selectCategory_decorators","_removeCategory_decorators","_filterSubCategories_decorators","_activeTab_decorators","_company_decorators","_search_query_decorators","_searched_query_decorators","_shape_categories_decorators","_clipart_decorators","_category_decorators","_category_breadcrumbs_decorators","_page_change_callback_decorators","_searching_decorators","_filtered_categories_decorators","_back_action_decorators","_back_action_extraInitializers","AddClipartComponent","ColorPickerComponent","color","ColorPicker_runInitializers","_color_initializers","change","_color_extraInitializers","_change_initializers","_change_extraInitializers","hue","_hue_initializers","saturation","_hue_extraInitializers","_saturation_initializers","_saturation_extraInitializers","_value_initializers","hue_element","_value_extraInitializers","hue_mouse_move","selectHue","sv_mouse_move","selectSV","test_canvas","createElement","sv_element","mouse_up","endAllSelection","parseInput","beforeUnmount","hex","charAt","colorNameToHex","hsv","rgb2hsv","updateColor","hsv2rgb","floor","ctx","getContext","fillStyle","unmounted","removeEventListener","backgroundGradient","rgb2css","preventDefault","TouchEvent","touches","bounds","clamp","pageX","hueButtonStyling","svButtonStyling","onHueSelection","endHueSelection","pageY","onSVSelection","endSVSelection","f","h","n","k","r","g","c","watch","ColorPicker_esDecorate","_endAllSelection_decorators","_backgroundGradient_decorators","_selectHue_decorators","_hueButtonStyling_decorators","_svButtonStyling_decorators","_onHueSelection_decorators","_endHueSelection_decorators","_selectSV_decorators","_onSVSelection_decorators","_endSVSelection_decorators","_color_decorators","_change_decorators","_hue_decorators","_saturation_decorators","_value_decorators","ColorPicker","PaperCanvasController","canvas_service","PaperCanvas_runInitializers","_canvas_service_initializers","blank","_canvas_service_extraInitializers","_blank_initializers","setupPaperFromCanvas","PaperCanvas_esDecorate","_canvas_service_decorators","_blank_decorators","_blank_extraInitializers","PaperCanvas","SubCanvasPreviewController","SubCanvasPreview_runInitializers","setup_deferred","paper_import","__webpack_require__","async","delay","clearTimeout","reloadLayer","canvas","style","paper","VueUtils","Df","setupCanvas","hh","yV","paperScope","PaperScope","activate","setup","view","element","imageSmoothingQuality","imageSmoothingEnabled","layer","Layer","initilized","clone","layer_sides","active_side","projectLayer","removeChildren","clipViewArea","_opacity","opacity","insert","visible","addChild","fitBounds","Rectangle","SubCanvasPreview_esDecorate","SubCanvasPreview","DesignTool_AbstractDesignToolController","AbstractDesignToolController_runInitializers","_element_initializers","_element_extraInitializers","element_manager","_element_manager_initializers","_element_manager_extraInitializers","selection_manager","_selection_manager_initializers","text_types","_selection_manager_extraInitializers","_text_types_initializers","VariableDataElementAbstract","NORMAL_TEXT","NUMBER_RANGE","CSV_TEXT","limited_text_types","_text_types_extraInitializers","_limited_text_types_initializers","_limited_text_types_extraInitializers","_errors_initializers","MessageList","resetScrollPosition","toolbar","scrollTop","isSingleColor","changeStrokeWidth","new_width","stroke_width","elementHasAdvancedOptions","model","can_remove","isImmutable","isSelectionUserShape","isMultiSelection","selection","isUserShapeType","isSelectionText","isTextType","isSelectionRaster","isRasterType","isSelectionQRCode","isQRCodeType","isSelectionClipart","isClipartType","isSelectionMarketplace","isMarketplaceType","isSelectionShape","isShapeType","isSelectionCrop","isCropType","isSelectionNone","moveElementDown","selected_element","moveElementUp","sides","AbstractDesignToolController_esDecorate","_isSingleColor_decorators","_changeStrokeWidth_decorators","_elementHasAdvancedOptions_decorators","_isSelectionUserShape_decorators","_isSelectionText_decorators","_isSelectionRaster_decorators","_isSelectionQRCode_decorators","_isSelectionClipart_decorators","_isSelectionMarketplace_decorators","_isSelectionShape_decorators","_isSelectionCrop_decorators","_isSelectionNone_decorators","_moveElementDown_decorators","_moveElementUp_decorators","_sides_decorators","_element_decorators","_element_manager_decorators","_selection_manager_decorators","_text_types_decorators","_limited_text_types_decorators","_errors_decorators","_errors_extraInitializers","emits_list","DesignToolAddClipartController","AddClipart_runInitializers","AddClipart_esDecorate","DesignToolAddClipart","AddFileComponentController","userFileModel","AddFile_runInitializers","percent_loaded","_percent_loaded_initializers","_percent_loaded_extraInitializers","_method_initializers","_method_extraInitializers","paginator_callback","_paginator_callback_initializers","file_to_form_data","_paginator_callback_extraInitializers","_file_to_form_data_initializers","upload_success","_file_to_form_data_extraInitializers","_upload_success_initializers","upload_failure","_upload_success_extraInitializers","_upload_failure_initializers","_upload_failure_extraInitializers","changeMethod","form_data","FormData","raster","createUserFileElement","alert","addFile","getFiles","customer","user_id","failed_to_raster","unable_to_raster","removeFile","AddFile_esDecorate","_addFile_decorators","_changeMethod_decorators","_getFiles_decorators","_removeFile_decorators","_percent_loaded_decorators","_method_decorators","_paginator_callback_decorators","_file_to_form_data_decorators","_upload_success_decorators","_upload_failure_decorators","DesignToolAddFile","AddQrCode_html_html","r3","CSV_LIST","AddQrCodeComponentController","code","AddQrCode_runInitializers","_code_initializers","on_save","_code_extraInitializers","_on_save_initializers","symbol","_on_save_extraInitializers","_symbol_initializers","_symbol_extraInitializers","variable_data_start","_variable_data_start_initializers","variable_data_end","_variable_data_start_extraInitializers","_variable_data_end_initializers","range","_variable_data_end_extraInitializers","_range_initializers","code_type","QRCode","ag","QR_CODE","qrcode_type","ny","WEBSITE","data_json","variableDataMessage","defined_quantity","fromRequest","add_variable_data_file","add_variable_data_callback","Modal","open","cleanData","stringify","fields","codeFields","custom_qr_code","createQRCodeElement","qrcode","setCSVData","AddQrCode_esDecorate","_variableDataMessage_decorators","_save_decorators","_code_decorators","_on_save_decorators","_symbol_decorators","_variable_data_start_decorators","_variable_data_end_decorators","_range_decorators","_range_extraInitializers","DesignToolAddQrCode","AddText_html_html","DesignToolAddTextController","new_text_type","AddText_runInitializers","_new_text_type_initializers","new_text","_new_text_type_extraInitializers","_new_text_initializers","new_text_end","_new_text_extraInitializers","_new_text_end_initializers","custom_text","_new_text_end_extraInitializers","isSingleTextInput","resetErrors","trim","addText","csv_data","text","symbol_range_start","symbol_range_end","createTextElement","font_scale","auto_scale","textRows","rangeQuantity","blankVariableData","AddText_esDecorate","_isSingleTextInput_decorators","_resetErrors_decorators","_addText_decorators","_textRows_decorators","_rangeQuantity_decorators","_blankVariableData_decorators","_new_text_type_decorators","_new_text_decorators","_new_text_end_decorators","DesignToolAddText","BackgroundColors_html_html","CONTOUR","DesignToolBackgroundColorsController","props","update_product_color","BackgroundColors_runInitializers","_update_product_color_initializers","updateSelected","unbindWithContext","mouse_down_point","shapeElements","isBorderSelected","isBackgroundSelected","onBorderChange","background_shape_border","resetBorder","removeBackgroundBorder","updatePaper","scaleBorder","percentage","new_value","ceil","background_shape_border_size","background_shape_border_margin","scaleBorderMargin","regionStyle","region","background","BackgroundColors_esDecorate","_onBorderChange_decorators","_removeBackgroundBorder_decorators","_scaleBorder_decorators","_scaleBorderMargin_decorators","_regionStyle_decorators","_update_product_color_decorators","_update_product_color_extraInitializers","DesignToolBackgroundColors","DesignToolCropController","changeClipMask","_element","current_mask","mask","x_scale_inverted","y_scale_inverted","template_clipart","z","regions","rotation","clipart_elements","mask_clipart_model","mask_clipart","ClipartElement","_old_mask","select","edit_state","$emit","drawControls","Crop_runInitializers","Crop_esDecorate","_changeClipMask_decorators","DesignToolCrop","DesignToolEditClipartController","toggle_background_callback","EditClipart_runInitializers","_toggle_background_callback_initializers","toggleBackground","switchClipart","element_to_replace","selected","removed_background","public_raster_remove_bg","removeBackground","addMarketplaceElement","EditClipart_esDecorate","_switchClipart_decorators","_toggleBackground_decorators","_toggle_background_callback_decorators","_toggle_background_callback_extraInitializers","DesignToolEditClipart","DesignToolEditFileController","low_dpi","EditFile_runInitializers","_low_dpi_initializers","_low_dpi_extraInitializers","dpi_check","isElementLowQuality","original_background_file","is_vector","product_size","getProductSizeFromCanvas","used_canvas_size","getUsedSize","width_percent","height_percent","element_width","width_dpi","isNaN","raster_loaded","bound_element","unbind","switchCustomFile","toggleRemoveBackground","new_file","toClipMask","createClipMaskElement","removeClipping","doneEditingClipping","deactivate","editingClipping","EditFile_esDecorate","_switchCustomFile_decorators","_toClipMask_decorators","_removeClipping_decorators","_doneEditingClipping_decorators","_editingClipping_decorators","_low_dpi_decorators","DesignToolEditFile","EditQRCode_html_html","BAR_CODE","DesignToolEditQRCodeController","show_type_option","EditQRCode_runInitializers","_show_type_option_initializers","paste_data","_show_type_option_extraInitializers","_paste_data_initializers","_paste_data_extraInitializers","_edit_state_initializers","timeout_id","_edit_state_extraInitializers","variable_data_csv","_variable_data_csv_initializers","display_fields","_variable_data_csv_extraInitializers","_display_fields_initializers","field","_display_fields_extraInitializers","saveCode","svg","TEXT_MESSAGE","CONTACT","onVariableDataChange","create","onSizeChange","validateCodeSizes","dataKeys","addRow","row","toReadableName","measurements","variableDataEnabled","editVariableData","EditQRCode_esDecorate","_saveCode_decorators","_onVariableDataChange_decorators","_dataKeys_decorators","_addRow_decorators","_toReadableName_decorators","_size_decorators","_variableDataEnabled_decorators","_editVariableData_decorators","_show_type_option_decorators","_paste_data_decorators","_edit_state_decorators","_variable_data_csv_decorators","_display_fields_decorators","DesignToolEditQRCode","EditText_html_html","DesignToolEditTextController","show_stroke","EditText_runInitializers","_show_stroke_initializers","in_advanced","_show_stroke_extraInitializers","_in_advanced_initializers","show_text_type_option","_in_advanced_extraInitializers","_show_text_type_option_initializers","_show_text_type_option_extraInitializers","_warnings_initializers","edit_text_color","_warnings_extraInitializers","_edit_text_color_initializers","proportions_callback","_edit_text_color_extraInitializers","_proportions_callback_initializers","edit_stroke","_proportions_callback_extraInitializers","_edit_stroke_initializers","font_version_name","_edit_stroke_extraInitializers","_font_version_name_initializers","csv_upload_state","_font_version_name_extraInitializers","_csv_upload_state_initializers","formattedName","checkRange","textTypeDisplay","elementIsRange","elementIsCSV","multipleRangeSegments","rangeStartInvalid","rangeEndInvalid","setupRange","getField","initial_value","start","usePathIcons","text_paths","icon","openFontModal","font_selection_callback","font","load","font_version","csvErrors","emptyValues","__all__","fillInDataDefaults","variableDataModal","EditText_esDecorate","_textTypeDisplay_decorators","_elementIsRange_decorators","_elementIsCSV_decorators","_checkRange_decorators","_usePathIcons_decorators","_openFontModal_decorators","_csvErrors_decorators","_fillInDataDefaults_decorators","_variableDataModal_decorators","_show_stroke_decorators","_in_advanced_decorators","_show_text_type_option_decorators","_warnings_decorators","_edit_text_color_decorators","_proportions_callback_decorators","_edit_stroke_decorators","_font_version_name_decorators","_csv_upload_state_decorators","_csv_upload_state_extraInitializers","DesignToolEditText","DesignToolLayersController","hasSides","hasBackgroundColors","E","immutableLayer","background_image","svg_source","exportSVG","embedImages","tagName","setAttribute","querySelectorAll","forEach","removeAttribute","encodeURIComponent","XMLSerializer","serializeToString","selectLayer","has_shape_elements","has_custom_sahpes","has_background_clipart","backgroundClipartElements","viewSides","removeSelection","viewBackground","all","Layers_runInitializers","_all_initializers","_all_extraInitializers","_background_image_initializers","Layers_esDecorate","_selectLayer_decorators","_hasSides_decorators","_hasBackgroundColors_decorators","_viewSides_decorators","_viewBackground_decorators","_all_decorators","_background_image_decorators","_background_image_extraInitializers","DesignToolLayers","DesignToolSidesController","updateBackgroundColorCallback","Sides_runInitializers","_updateBackgroundColorCallback_initializers","updateBackgroundColor","clipart_region","allBackgroundClipartElements","template_region","selector","Sides_esDecorate","_updateBackgroundColor_decorators","_updateBackgroundColorCallback_decorators","_updateBackgroundColorCallback_extraInitializers","DesignToolSides","FooterActionsController","duplicateItem","getData","createUserShapeElement","fixZ","FooterActions_runInitializers","FooterActions_esDecorate","_duplicateItem_decorators","DesignToolFooterActions","ElementActionController","ElementActionController_runInitializers","ElementActionController_esDecorate","ElementAlignment","ElementLayerPositionController","vue_esm_bundler","ux","ElementLayerPosition_runInitializers","ElementLayerPosition_esDecorate","ElementLayerPosition","ElementTextAlignment","ElementFitWidthController","fitWidth","centerVertically","centerHorizontally","workspace","artboard","fitHeight","ElementFit_runInitializers","ElementFit_esDecorate","_fitWidth_decorators","_fitHeight_decorators","ElementFit","ElementScaleSizeController","scaleSize","path","scale","rootLayer","ElementScaleSize_runInitializers","ElementScaleSize_esDecorate","_scaleSize_decorators","ElementScaleSize","ElementInvert","ElementMaintainProportionController","onUpdate","onChange","ElementMaintainProportion_runInitializers","_onChange_initializers","ElementMaintainProportion_esDecorate","_onUpdate_decorators","_onChange_decorators","_onChange_extraInitializers","ElementMaintainProportion","ElementColorController","colors","ElementColor_runInitializers","_colors_initializers","_colors_extraInitializers","_selected_initializers","_selected_extraInitializers","_custom_initializers","limited","_custom_extraInitializers","_limited_initializers","_limited_extraInitializers","custom_color","_custom_color_initializers","color_picker","_custom_color_extraInitializers","_color_picker_initializers","on_color_change","_color_picker_extraInitializers","_on_color_change_initializers","productColor","_on_color_change_extraInitializers","_productColor_initializers","picker_uuid","_productColor_extraInitializers","_picker_uuid_initializers","_picker_uuid_extraInitializers","color_cache","_color_cache_initializers","hover_color","_color_cache_extraInitializers","_hover_color_initializers","eye_dropper","_hover_color_extraInitializers","_eye_dropper_initializers","escape_binding","_eye_dropper_extraInitializers","updateColorsCache","toggleElementManager","useEyeDropper","toggleColorManager","selectColor","Color","customColor","colorName","usePicker","colorToCode","isSelected","monochromatic","shades","tints","tones","complementary","monochromaticColors","complementaryColors","ElementColor_esDecorate","_useEyeDropper_decorators","_updateColor_decorators","_selectColor_decorators","_customColor_decorators","_colorName_decorators","_usePicker_decorators","_colorToCode_decorators","_isSelected_decorators","_updateColorsCache_decorators","_monochromaticColors_decorators","_shades_decorators","_tints_decorators","_tones_decorators","_complementaryColors_decorators","_colors_decorators","_selected_decorators","_custom_decorators","_limited_decorators","_custom_color_decorators","_color_picker_decorators","_on_color_change_decorators","_productColor_decorators","_picker_uuid_decorators","_color_cache_decorators","_hover_color_decorators","_eye_dropper_decorators","ElementColor","ElementMaterialColor","ClipartColorsController","ClipartColors_runInitializers","updateMaterial","_updateMaterial_initializers","_updateMaterial_extraInitializers","updateSelectedRegion","selected_region","getSelectedRegion","hasStroke","color_code","toggleRegion","ClipartColors_esDecorate","_toggleRegion_decorators","_updateMaterial_decorators","CliaprtColors","QRCodeFormController","callback","CodeForm_runInitializers","_callback_initializers","actionText","_callback_extraInitializers","_actionText_initializers","buttonType","_actionText_extraInitializers","_buttonType_initializers","disableType","_buttonType_extraInitializers","_disableType_initializers","disableSelection","_disableType_extraInitializers","_disableSelection_initializers","variableData","_disableSelection_extraInitializers","_variableData_initializers","_variableData_extraInitializers","CodeForm_esDecorate","_callback_decorators","_actionText_decorators","_buttonType_decorators","_disableType_decorators","_disableSelection_decorators","_variableData_decorators","CodeForm","CodeFormData_html_html","CUSTOM","CodeFormDataController","codeData","CodeFormData_runInitializers","_codeData_initializers","codeType","_codeData_extraInitializers","_codeType_initializers","qrCodeType","_codeType_extraInitializers","_qrCodeType_initializers","barCodeType","_qrCodeType_extraInitializers","_barCodeType_initializers","_barCodeType_extraInitializers","prefix","_prefix_initializers","_prefix_extraInitializers","CodeFormData_esDecorate","_codeData_decorators","_codeType_decorators","_qrCodeType_decorators","_barCodeType_decorators","_prefix_decorators","CodeFormData","CodeFormType_html_html","CodeFromTypeController","resetData","CodeFromType_runInitializers","bar_code_types","_bar_code_types_initializers","r_","CodeFromType_esDecorate","_resetData_decorators","_bar_code_types_decorators","_bar_code_types_extraInitializers","CodeFormType","ToolNavigationController","showBack","resetScroll","ToolNavigation_runInitializers","ToolNavigation_esDecorate","_showBack_decorators","ToolNavigation","ElementOffsetPathController","edit_color","ElementOffsetPath_runInitializers","_edit_color_initializers","_edit_color_extraInitializers","onColorChange","new_amount","offset_width","offset_path_fill_color","offset_path_color","texture","offset_path_texture","offset_path_custom_fill_color","ElementOffsetPath_esDecorate","_onColorChange_decorators","_edit_color_decorators","ElementOffsetPath","ElementToggleBackgroundController","doAction","ElementToggleBackground_runInitializers","_disabled_initializers","ElementToggleBackground_esDecorate","_doAction_decorators","_disabled_decorators","_disabled_extraInitializers","ElementToggleBackground","DirectUploadController","DirectUpload_runInitializers","allowed_extensions","clipboardData","parseFiles","main_container","L7","change_tab","parts","extension","DirectUpload_esDecorate","DirectUpload","LayerRemoveComponent","promptDelete","LayerRemove_runInitializers","LayerRemove_esDecorate","_promptDelete_decorators","LayerRemove","SelectLayerBarController","SelectLayerBar_runInitializers","_sides_initializers","_sides_extraInitializers","selectSide","SelectLayerBar_esDecorate","_selectSide_decorators","SelectLayerBar","AddVariableDataModalController","ModalComponent","W","AddVariableDataModal_runInitializers","uploaded_csv","_uploaded_csv_initializers","uploaded_columns","_uploaded_csv_extraInitializers","_uploaded_columns_initializers","selected_upload_column","_uploaded_columns_extraInitializers","_selected_upload_column_initializers","uploaded_elements","_selected_upload_column_extraInitializers","_uploaded_elements_initializers","use_csv_headers","_uploaded_elements_extraInitializers","_use_csv_headers_initializers","_use_csv_headers_extraInitializers","onOpen","loadFileData","close","onClose","reduce","y1","importData","parsed_data","AddVariableDataModal_esDecorate","_importData_decorators","_uploaded_csv_decorators","_uploaded_columns_decorators","_selected_upload_column_decorators","_uploaded_elements_decorators","_use_csv_headers_decorators","AddVariableDataModal","EditVariableDataModa_html_html","EditVariableDataModalController","EditVariableDataModal_runInitializers","elements","_elements_initializers","elements_clone","_elements_extraInitializers","_elements_clone_initializers","_elements_clone_extraInitializers","_variable_data_initializers","_variable_data_extraInitializers","_selected_element_initializers","loaded_quantity","_selected_element_extraInitializers","_loaded_quantity_initializers","delete_preview","_loaded_quantity_extraInitializers","_delete_preview_initializers","_delete_preview_extraInitializers","syncData","copyDataFrom","column","$nextTick","focus","loadData","incrementValue","warn","variableDataValues","loadToolData","variableDataElements","deleteRow","confirm","removeRow","EditVariableDataModal_esDecorate","_select_decorators","_deleteRow_decorators","_validate_decorators","_elements_decorators","_elements_clone_decorators","_variable_data_decorators","_selected_element_decorators","_loaded_quantity_decorators","_delete_preview_decorators","EditVariableDataModal","AddUserShapeController","path_data","AddUserShape_runInitializers","_path_data_initializers","shape_type","_path_data_extraInitializers","_shape_type_initializers","AddUserShape_html","I","side_count","_shape_type_extraInitializers","_side_count_initializers","shape_size","_side_count_extraInitializers","_shape_size_initializers","_shape_size_extraInitializers","_stroke_width_initializers","svg_path","_stroke_width_extraInitializers","_svg_path_initializers","roundness","_svg_path_extraInitializers","_roundness_initializers","viewbox","_roundness_extraInitializers","_viewbox_initializers","buildShapePath","addElement","UserShape","ELLIPSE","POLYGON","createRegularPolygon","radius","position","points","start_angle","PI","helpers_dataset","angle_step","angle","cos","sin","createStarPolygon","outer_radius","innerRadius","vertices","total_vertices","correctMinimums","padding","starting_point","path_parts","last","offset_last","VectorUtils","cK","offset_next","last_handle","WQ","hs","Re","c8","next_handle","AddUserShape_esDecorate","_addElement_decorators","_buildShapePath_decorators","_path_data_decorators","_shape_type_decorators","_side_count_decorators","_shape_size_decorators","_stroke_width_decorators","_svg_path_decorators","_roundness_decorators","_viewbox_decorators","_viewbox_extraInitializers","AddUserShape","EditUserShape_html_html","EditUserShapeController","edit_mode","EditUserShape_runInitializers","_edit_mode_initializers","updateCurrentManager","editing_points","editingPoints","updateSelectionType","state_manager","point_manager","togglePointManager","EditUserShape_esDecorate","_updateSelectionType_decorators","_edit_mode_decorators","_edit_mode_extraInitializers","EditUserShape","FontModalController","FontModal_runInitializers","fonts","_fonts_initializers","selected_tags","_fonts_extraInitializers","_selected_tags_initializers","_selected_tags_extraInitializers","filter_fallback","_filter_fallback_initializers","selected_font","_filter_fallback_extraInitializers","_selected_font_initializers","sample_text","_selected_font_extraInitializers","_sample_text_initializers","favorite_selection","_sample_text_extraInitializers","_favorite_selection_initializers","font_service","_favorite_selection_extraInitializers","_font_service_initializers","show_filters","_font_service_extraInitializers","_show_filters_initializers","font_classifications","_show_filters_extraInitializers","_font_classifications_initializers","selected_classifications","_font_classifications_extraInitializers","_selected_classifications_initializers","tag_list","_selected_classifications_extraInitializers","_tag_list_initializers","classification_items","_tag_list_extraInitializers","_classification_items_initializers","GD","localeCompare","loadFonts","fontLicenseLink","sampleText","google_font","tags","favorite","tag_categories","order_by","loadFull","versions","toggleTag","isTagSelected","selectFont","version","loadVersion","scrollTo","safeFontName","toggleFavorite","existing","user_fonts","isFavorite","useFont","addActiveFont","isClassificationSelected","classificationName","toggleClassification","FontModal_esDecorate","_fontLicenseLink_decorators","_sampleText_decorators","_loadFonts_decorators","_toggleTag_decorators","_isTagSelected_decorators","_selectFont_decorators","_resetScroll_decorators","_safeFontName_decorators","_toggleFavorite_decorators","_isFavorite_decorators","_useFont_decorators","_isClassificationSelected_decorators","_classificationName_decorators","_toggleClassification_decorators","_fonts_decorators","_selected_tags_decorators","_filter_fallback_decorators","_selected_font_decorators","_sample_text_decorators","_favorite_selection_decorators","_font_service_decorators","_show_filters_decorators","_font_classifications_decorators","_selected_classifications_decorators","_tag_list_decorators","_classification_items_decorators","_classification_items_extraInitializers","mixins","MobileMixin","FontModal","custom_init_registerComponents","Options","CustomService","_products_shared_services_ConfiguredProductServiceAbstract__WEBPACK_IMPORTED_MODULE_5__","size_adjusted","show_sizes","recommended_sizes","_core_models_Collection__WEBPACK_IMPORTED_MODULE_2__","showWholesalePrices","color_set","cut_out_color","show_material_color","disabled_colors","material_price","_core_utils_PricingTier__WEBPACK_IMPORTED_MODULE_0__","sizes","ratio","option_border","_models_enums__WEBPACK_IMPORTED_MODULE_4__","PRINTED","default_lamination","NOT_SELECTED","GLOSS","allow_custom_size","setupShapes","updateShapeFromMaterialColors","background_shape_fill","side_data","template_shape_sides","templateShapesForSide","share_attributes","SHARED_ATTRIBUTES","size_by_id","fixed_size","fixed_width","fixed_height","standardSizeRatio","locked_shape_size","_core_utils_utils__WEBPACK_IMPORTED_MODULE_3__","wj","clip_width","clip_height","Eq","directToFinalize","getFinalizeURL","_core_utils_ButtonProcessingState__WEBPACK_IMPORTED_MODULE_6__","ADVANCED","checkOptionsSet","removeUserFileBackground","catch","PaperCanvasWorkspace","camera","zoom","CursorHandleState","LayerGroup","PaperCanvasService","EventDispatcher","max_canvas_width","max_canvas_height","clip_opacity","clip_color","frame_number","debugItems","available_offset_rasters","admin_options","clippingDisabled","in_export_state","offset_path_enabled","_offset_path_color","paper_promise","updateMergedCutpathColor","_offset_path_texture","updateOffsetTexture","merged_cutpath","fillColor","cutpathLayer","children","clipMask","removeOffset","setupOffset","activeLayerSide","clipLayer","clipArea","offset_changed","offset_waiting","addSide","elementsForSide","root","_layer_sides","loadSide","sendToBack","buildClipViewArea","checkClippingVisibility","setProjectBounds","Point","Size","overlay_sides","disable_offset_path","updateCanvasBackgroundColor","project","tool","onFrame","setupLayers","setCanvasSizeFromDesign","bringToFront","addClippingMask","paths","CompoundPath","addChildren","buildClippingMask","_side","has_masks","background_element","clip","buildClippingRegion","clipart_element","clipartElements","use_as_mask","hasCutpathRegion","allow_clipping_when_locked","dont_clip","addImmutableItem","setOffsetPath","editing","resetCanvasFromExport","promises","forceOffsetPath","forceFlattenCutpaths","flushFrameTasks","setupCanvasForExport","hideOffsetPath","addOffset","queue","queueFlattenCutpathLayer","createOffsetTexture","source","Raster","crossOrigin","on","squareCameraBounds","flatten_cutpath_timeout","flattenCutpaths","child","PathItem","unite","united_paths","processUnitedOffsetPath","compound","Path","strokeColor","strokeCap","dashArray","strokeWidth","backgroundOverlay","subtract","blendMode","addItem","canvasSize","viewSize","maxCanvasWidth","maxCanvasHeight","canvasWidth","canvas_container","canvas_container_padding","canvasHeight","containerWidth","autosize_artboard","calculateCameraArtboardScale","scaled_width","scaled_height","updateViewFromWorkspace","max_height","max_width","center","resizeCanvas","fixed_camera","resolution","resolutionMod","revertExportBounds","draw","standard_bounds","arr_key","group","allElements","withSideActive","func","esm_exports","Cp","Error","export_state","current_side","result","exportPNG","toDataURL","getElementsByClass","BaseElement","O","runTasks","runFrameTasks","contourPath","setCanvasBackgroundColorOverride","canvas_color_override","canvas_background_color","Tool","onMouseDown","onMouseDrag","onMouseUp","onMouseMove","getComputedStyle","paddingTop","setupZoomEvents","screenSpaceToViewSpace","screen_x","screen_y","canvas_rect","canvas_percent_x","canvas_percent_y","view_x","view_y","deltaY","point","max_zoom","min_zoom","clampCamera","event_cache","last_diff","last_screen_center","last_movement","pointer_up","findIndex","cached","pointerId","point0","clientX","clientY","point1","diff","screen_center","divide","pow","movement","isFinite","translate","selectedElement","translate_point","top","left","bottom","right","inner_height","inner_width","setupWorkspace","updateWorkspace","area","postLoadSetup","redrawAll","_elements","clearDebugItems","addDebugCircle","d","Circle","addDebugSquare","rect","fixed_texture_position","debugCamera","controlsLayer","controls_layer","layers","addLayer","SelectionStateManager","color_manager","active_manager","activeElement","getAttribute","locked","scaleMoveActive","color_pick","color_hover","removeControls","AbstractSelectionManager","cursor_handle_state","placement_guides","active_placement_guides","visual_guides","show_all_visual_guides","snap_tolerance","debug_points","radius_snap_stroke","radius_snap_fill","hover_fill","hover_stroke","active_fill","active_stroke","placement_guide_stroke","merge_fill","active_line_stroke","warning_line_stroke","color_service","color_api_import","addTransparency","colorVarToValue","dashWidth","rotateLineLength","controlSize","borderWidth","styleControl","control","wO","styleControlHover","styleControlActive","setCursorState","handle","cursor_handle","HOVER","ACTIVE","pushPlacementGuide","ap","bp","RR","addLine","as","Segment","bs","segments","guidSize","clearVisualGuides","snapTolerance","findGuideSnap","placement_guides_disabled","distance","MAX_SAFE_INTEGER","intersection","min_distance","min_point","filtered_guides","abs","Io","Tj","j","_$","intersection_distance","intersection_found","line","lp","lp_distance","guideSnap","snappedMovement","snappedMovementSet","results","intersections","non_intersections","SelectionManager","rotation_snap_points","dragging_selection","scale_controls","multi_selection","last_clicked","Date","isMultiSelected","draggingScaleControl","dragging_scale_control_index","styleControlStroke","selectionBounds","elementBounds","showScaleControls","show","showRotateControl","controls_disabled","multi_selection_bounds","bounding_rect","controlPoints","topLeft","topRight","bottomLeft","bottomRight","controlRect","linePoint","rotateLine","Line","rotate_control","rotate","multi_selection_rotation","active_handle","activeHandle","dragging_rotate_control","multiSelect","shiftKey","_selection","onUnselect","multi","updateMultiSelection","onSelect","setupPlacementGuides","selectClosest","doHitTest","getElementClosestToPoint","hitTest","scaleControlHitTest","cp","contains","rotateControlHitTest","multiSelectionHitTest","active_bounds","HTMLElement","blur","last_selection","scaleControl","movable","clicked","getTime","saved_position","saved_snap_points","snapPoints","updateCursor","drawVisualGuides","dragging_disabled","transformation_elements","groupTranslateElement","translateElement","groupScale","scaleElement","groupRotate","rotateElement","highlightGuides","setPosition","lastPoint","mouse_angle","atan2","control_angle","yj","parseFloat","elementRadians","normalControlAngle","getDistance","realControlWithoutRotationX","realControlWithoutRotationY","centerToControlWithoutRotationNormal","normalize","centerToControlWithoutRotationVector","sizeChange","sR","polarity","mod","sizeChangeLength","sizeChangeModifier","multiply","maxSize","sqrt","applyScaling","mouseAngle","controlAngle","concat","expanded_items","applyGroupScale","base_elements","bounds_set","rt","sign","scaling_point","selection_bounds","pre_scaled_area","width_change","height_change","cursorHandle","cursor","controls","simpleHitTest","cx","cy","distances","snap_points","hasGuides","MAX_VALUE","guides","placementGuides","snap","H9","closest","guide","AutosaveService","is_setup","interval","unsavedData","last_data","getPostData","force","save_name","preview","last_updated","updated","save_failed","RasterElement","offset_target_resolution","boundary_point_radius","polygon_sides","ignored_offset_alpha_filter","ignored_offset_colors","ignored_offset_color_range","image_contains_alpha","disable_offset_path_in_export","_y_scale_inverted","_x_scale_inverted","raster_loaded_deferred","bindModels","_removed","image_loaded","fillInValuesFromPaper","findImageColors","unbindModels","tsk","updatePaperOnFrame","hasFrameTask","addFrameTask","lastRotation","offset_path_clipping","start_size","scaleXMod","scaleYMod","offset_position_difference","queueOffsetPath","canvasService","initialized_deferred","cloneItem","isUserFileType","getOrCreateIdentifier","resizeImageData","imageData","resize_width","resize_height","percent_width","percent_height","image_canvas","putImageData","drawImage","getImageData","offsetPath","offset_points","findBoundaryPoints","freeze","w_scale","source_width","h_scale","source_height","x_offset","y_offset","pointsToPath","removeOffsetPath","setupOffsetPath","compound_path","deep","resetBoundaryPoints","resetImageData","original_image_data","image_data","w","ImageData","replaceColors","Uint8ClampedArray","original_data","stored_ignored_offset_color_range","stored_ignored_offset_colors","stored_ignored_offset_alpha_filter","valid_pixel_with_colors","pixelBounds","width_min","width_max","height_min","height_max","pixel_ratio_width","pixel_ratio_height","transformed_x","transformed_y","transformed_w","transformed_h","isZero","max_size","target_scale","offset_scale","contains_alpha","valid_pixel_basic","valid_pixel_check","is_boundary","xi","yi","time_delta","last_sample_time_delta","image_colors","ColorAPI","x_scale","y_scale","to","bucket_colors","to_key","buckets","l","bucket","key_by_c","average","deltaE76","format","designColors","ClipMaskElement","_edit_state","internal_model","updateMask","_mask","setupModel","active_item","elevation_layer","internal_layer","setupPaper","overlay_fill","clear","remove_element","temp_element","unbindEvents","findPaths","strokeJoin","dif","group_scale","mask_bounds","element_bounds","element_point","mask_point","deg","cropped","TextLine","path_layer","kerning","overflowed_line","glyphs","getPaths","fontSize","lastGlyphBounds","toPathData","usePath","xStart","heightOffset","textAlignment","DY","CENTER","RIGHT","lastVector","currentVector","lastPathPoint","kerningAdjustment","pathKerning","centerOffset","pathPoint","getPointAt","tan","getTangentAt","boundRect","kerningMultiplier","yOffset","closed","drawCompoundPath","uniteList","drawGlyphs","glyph","applyStyle","setStyle","glyphBounds","isInserted","glyphLeft","glyphRight","glyphTop","glyphBottom","TextElement","lines","fontMeasurements","set_x_scale_inverted","set_y_scale_inverted","safeClear","updateToFromPath","loadFont","updateTextColor","_model","auto_scale_value","font_scale_value","valid","isLoaded","res","loadedFontId","resolvedFont","errorMsg","info","buildTextLines","text_display","getFontMeasurements","greatestWidth","pathBoundsDifference","isVariableData","path_scale","prescale_path_bounds","buildTextLine","text_alignment","definesQuantity","stroke_color_code","iteration","text_line","lineSpacing","fontKey","updateItemProperties","in_presave_state","rotationPosition","newPosition","pathPosition","prefered_line_height","scaleX","scaleY","scaled_x","scaled_y","x_position_difference","y_position_difference","currentWidth","currentHeight","maxWidth","maxHeight","height_scale","lastCenter","applied_texture","applied_texture_id","cached_textures","_applied_texture","process_texture","_updateToFromPath","hoverTest","selectionThresholdPoint","selectionThresholdSize","selectionThreshold","current_area","percent_change","live_text_disabled","replaceWithPointText","opentype_text","getPath","family","fontFamily","versionName","point_text","PointText","content","width_offset","height_offset","new_bounds","fontId","measureText","fontAscender","ascender","fontDescender","descender","custom_stroke_color","stroke_color","correctElementOffCanvasPosition","LockedTextElement","SVGCanvasElement","importSVG","onLoad","onError","status","BackgroundShapeElement","_z","_locked_","bindEvents","_rotation","buildRectangleShape","RECTANGLE","buildEllipseShape","CIRCLE","buildCircleShape","buildContourShape","CUSTOM_PATH","buildShapeFromCustomPath","offset_path_disabled","Shape","clip_mask","toPath","updateColors","_color","background_shape_fill_code","background_shape_border_color_code","background_shape_contour_color","fillValue","has_border","background_shape","fitInImage","artBoardWidth","artBoardHeight","productWidth","productHeight","stroke_change","outer","inner","fit_size","fitSize","Ellipse","clip_path","pathData","background_shape_custom_fill_color","background_shape_custom_border_color","background_shape_border_color","UserShapeElement","setupPoints","setupPath","shiftShapeToOrigin","createPath","shapeBounds","removeSegments","addSegments","createSegment","modelBounds","path_point","createSegmentRadius","toGlobalSpace","pn","pl","segment_last","segment_next","handleOut","handleIn","hq","B8","Im","toLocalSpace","inverted_scale","basePlacementGuides","C","correctBounds","preshift_bounds","setValueWithoutTrigger","applyRotation","local_center","rotated","DJ","shape_bounds","transform","toIcon","DesignToolElementFactory","configured_key","element_base","assignTextModel","text_model","assignClipartModel","clipart_model","region_model","assignMarketplaceModel","marketplace_model","validateColorOrDefault","getProductColor","validateFontOrDefault","default_font","uri","ResourceURI","F","Font","K","copyDataForReplacement","config","add_to_configured","add_to_canvas","nextZ","addUserShapeElement","shape_element","add_element","user_shapes","unresolvedPromises","pushPromise","symbol_name","visible_item","visible_row","addTextElement","text_elements","text_element","custom_clipart","tRegion","ClipartRegion","custom_clipart_region","use_material_colors","colorUri","addClipartElement","CustomClipart","N","custom_user_file","addUserFileElement","CustomUserFile","upload_elements","upload_element","CustomQRCodeModel","addQRCodeElement","qrcode_elements","qr_element","dpi","marketplace_element","CustomShape","allShapeElements","CustomText","$","TemplateText","TemplateClipart","CustomMarketplace","R","CustomEditorService","fetch_masks","show_size_change_warning","allow_autosize_artboard","tool_promises","state_service","tool_factory","clip_mask_elements","category__slug","fetchFonts","display","depth","offset_path","route_service","qr","rg","setupQRCodeReplacement","loadColor","loadClipart","clipartWidth","clipartHeight","loadArtwork","color_id","updateCanvasWorkspace","setupArtboard","updateElementColorsFromConfigured","updateColorSets","setupCustomElementsFromTemplate","setupToolElementsFromConfigured","checkLicense","checkSides","offset_path_uses_material_color","update_path_color","setupMaterialRegions","checkReverseCutOption","addToolPromise","done","matching_shapes","matching_side","background_color","isMasked","clipart_promises","customClipart","Promise","customText","customUserFile","qrElement","marketplaceElement","user_shape","addClipMaskElement","templateClipart","regex","match","new_range_end","templateMarketplace","swapToTemplate","textElements","softRemove","canvas_width","canvas_height","placeholderLabel","customQRCode","some","copy","moveElementToTop","option_reverse_cut","reversible","clone_model","mask_model","mask_element","needs_license","base_license_option","licensing_option","active_license_option","getTaggedOption","needSideCost","sidesInUse","active_side_count","clipart_changed","c_region","t_region","shape_changed","sideInUse","needs_side_cost","base_multi_side_option","multi_side_option","active_multi_side_option","hasTag","validateTextSizes","MULTICOLOR_CUTOUT","recommended_text_height","recommended_text_width","text_size_too_small","text_measurements","hasLowDPIFlag","option_vectorize","uploadDPI","fWidth","fHeight","wdpi","hdpi","code_element","codeElements","standard_width","standard_height","validateDesignSizeRatio","tool_ratio","customer_ratio","default_color","setProductSizeFromCanvas","large_adjustment","wh","removeQuantityModel","quantity_model","phone","email","design_approval","setupDesignSides","no_images","in_save_state","design_content","source_file_content","preview_content","qr_quantity_model","removeBlankRows","union","Set","exportDesignContentWhenLoaded","uk","viewRow","selectVisibleItem","ElementManager","paper_service","current_element_group","forced_top_layer","topLayer","takeOut","removeAll","moveElement","moveTo","stopPropagation","max_z","MIN_SAFE_INTEGER","closestElement","closestElementDistance","canvasArea","modifiedDistanceToPoint","getElementByModel","cls","CustomQRCode","clipMaskElements","rasterElements","sub_set","editableBackgroundClipartElements","allEditableBackgroundClipartElements","getAllElementsByClass","allTextElements","allClipartElements","allClipMaskElements","allRasterElements","idx","showElement","getUsedBounds","bounding_area","lowDPIElements","lowDPI","setDPI","leftX","leftY","rightX","rightY","ele","eleBounds","elementForModel","FontService","FontModel","active_fonts","font_element","fonts_request","combined_fonts","opentype_promise","opentype","head","appendChild","styleElement","fonts_map","combined","Collection","featured","loadFromID","loadFromURI","_font","DragDropBuyElement","components_initialized","paperService","DummyClipartModel","clipartModel","DummyTextModel","textModel","clipartElement","textElement","initialized","hasTextBounds","hasClipartBounds","textBounds","textWidth","textHeight","clipartBounds","swapZ","repositionLayout","textSize","DragDropBuyService","clipartMarginHorizontal","maxClipartHeight","text_options","ConfiguredDragDropBuyProduct","$$","BOTTOM","TOP","size_options","U8","SMALL","MEDIUM","LARGE","onWindowResize","updateText","updateFonts","updateTextLocation","areaBounds","pixelToInchRatio","updateSize","fs","FULFILLED","title_text","bottomTextY","elY","tallestClipartHeight","_tallestClipartHeight","tallest","tallestClipart","_tallestClipartModel","calculateClipartSize","deleteText","title_text_element","text_location","DragDropBuyProduct","zo","GREEK","setClipartSelectorDimensions","setupElements","totalWidth","contentWidth","clipart_same_height","selectorWidth","selectorHeight","margin","marginTop","tallestUsedClipart","elementsWidth","xPos","horizontal_alignment","b9","vertical_alignment","x5","artboardWidth","artboardHeight","LEFT","createConfiguredClipart","addToProduct","ConfiguredDragDropBuyProductClipartModel","CustomClipartRegionModel","configuredClipart","customClipartRegion","ConfiguredDragDropBuyProductClipart","K0","DragDropBuyProductClipart","removeElement","text_size","canvas_preview","resizeTimeout","autoPageTransition","PolyFillType","JoinType","EndType","ClipType","EndTypes","JoinTypes","FillTypes","LetteringValidator","SINGLE_PICK_CHARS","DOUBLE_PICK_CHARS","hasGangRuns","gangRunLine","gangRunLineForSeparator","separator","reduceLines","group_size","groups","consecutiveMatchCount","count","matches","reduced_lines","countPicks","char","LetteringToolService","font_lock","validator","enabled","LETTERING","flipX","updateTextElementSize","handleUpdate","hasGangRun","setTransferPicks","from_width","new_height","transfer_picks_option","slug","pick_count","picks_option","picks","last_valid","fixGangRun","gang_run","original_scale_x","original_scale_y","new_scale_x","new_scale_y","MultiWorkerService","max_processes","active_worker","workers","cpu_cores","navigator","hardwareConcurrency","thread_count","worker","Worker","onmessage","onerror","postMessage","terminate","ClipperWorkerService","id_index","action_id","sendDataToClipper","function_name","function_args","offsetToPaths","clipToPaths","ClipperService","pathToData","flatness","pathCopy","flatten","round","miterLimit","offset_paths","delta","arcTolerance","offsetInputs","joinType","endType","paper_paths","paper_path","fillRule","united_paths_points","clipType","Union","subjectFillType","subjectInputs","path_data_set","ColorService","parseColor","angles","analogous","end","oklch","steps","outputSpace","rgbToHex","lerpColor","mix","correctCode","alpha","color_var","body","getPropertyValue","colorsWithBrightness","StateChange","changes","apply","getFields","Array","extra","ToolStateService","back_states","forward_states","ctrlKey","undo","redo","clipboard_data","clipboard_model","pushState","hasStateChanged","current_state","buildStateChangeList","walk","Model","Kx","read_only","PointSelectionManager","point_translate_handles","line_translate_handles","line_scale_handles","radius_handles","selected_point_translate_index","selected_radius_index","selected_line_translate_index","selected_line_scale_index","selected_item_translate","radius_too_large","overlapping_tolerance","overlapping_points","saved_points","activated","buttons","pointTranslateControlHitTest","radiusControlHitTest","lineTranslateControlHitTest","lineScaleControlHitTest","activePoint","pnn","control_points","previous_radius","addLineVisual","addLineRadiusVisual","connected_radius","addCircleVisual","lineHitTest","mN","circle","local_point","local_down_point","local_movement","snapped_movement","translatePoint","scaleRadius","pairSnappedMovement","translatePointPair","scaleLine","radiusSnap","closest_difference","closest_amount","difference","radius_snap","mp","ig","new_radius","Mq","max_left","max_right","aI","m","next_distance","last_distance","next_distance_space","last_distance_space","next_overlap","last_overlap","checkOverlapping","checkPairConstraint","connected","pc","connected_distance","PV","mouse_current","perpendicular_movement","Ej","normal","az","ns","m1","m2","left_intersection","right_intersection","left_snap","lineGuideSnap","right_snap","new_left_intersection","new_right_intersection","moving_to_intersection","max_line_distance","triangle_scale","move_distance","new_left_distance","left_radius_space","left_distance_remaining","new_right_distance","right_radius_space","right_distance_remaining","isOverlapping","findOverlapping","other","translate_index","radius_index","line_translate_index","line_scale_index","pointsInAction","removeOverlappingPoints","control_point","control_size","point_translate_control","normalized_sides_middle","radius_control","next_middle","line_translate_control","translate_ratio","p_pn_dif","scale_angle","oj","line_scale_direction","line_scale_control","scale_ratio","angle_last","JH","angle_next","a_match","b_match","an","qb","bn","bx","by","ax","ay","ColorSelectionManager","cursorColor","MouseEvent","offsetX","offsetY","pixelRatio","ElementFrameTask","fnc","context","args","call","_core_utils_EventDispatcher__WEBPACK_IMPORTED_MODULE_2__","frameTasks","_core_utils_SimplePromise__WEBPACK_IMPORTED_MODULE_1__","_locked","canvasPositionCheckCallback","checkCanvasPosition","initialize","can_offset_path","addOffsetPath","new_path","width_difference","height_difference","x_difference","y_difference","compare","className","_layer","_item","debugCircle","onModelChange","handleClear","updated_size","width_scale","_isSelected","isDragging","_isDragging","queuePositionCheck","invert","flipY","NaN","corrected","clampRotation","pos","boundingRect","lockedInPlace","current_frame_task","newPoint","task","hide","used_size","leftCenter","rightCenter","topCenter","bottomCenter","_core_utils_VectorUtils__WEBPACK_IMPORTED_MODULE_3__","_BaseElement__WEBPACK_IMPORTED_MODULE_0__","resizeCallback","xScaleInvertedLast","yScaleInvertedLast","preventUpdate","loadedClipart","setupClipart","single_color","_models_Clipart__WEBPACK_IMPORTED_MODULE_3__","cutpathRegion","cutpath","getItems","selectorId","top_region","isAbove","show_cut_contour","is_masked","blend_mode","_region","update_region","_models_enums__WEBPACK_IMPORTED_MODULE_1__","TR","FILL","blend_mode_selector","blend_items","blendSelectorId","blend_item","showOptions","elementNames","getChildren","arr","hasChildren","toRemove","_models_CustomClipart__WEBPACK_IMPORTED_MODULE_2__","replaced_in_processed","remove_in_processed","cutpath_ids","disableVueForImport","prototype","_vue_reactivity__WEBPACK_IMPORTED_MODULE_0__","$F","SKIP","EPSILON","pointDistance","dx","dy","hypot","midpoint","normalizedMidpoint","p1","normalizeVector","p2","signedOrientedDistance","signedPerpendicularDistance","signedDistance","angleBisectorVector","a_normal","b_normal","orientedNormal","nx","lineIntersection","rdx","rdy","sdx","sdy","denominator","cross","dot","scalePoint","closestPointOnLine","ab","projection","linesOverlap","cd","ac","rotatePoint","radians","degreesToRadian","radianToDegrees","rad","rotatePointAround","ry","distanceFromLineSegment","ab_dot","len","signedAngleBetweenLines","u","u_norm","v_norm","DDBToolPageApp","ProductPageLoaderAbstract","_selection_initializers","selected_name","group_name","deleteSelection","_get_text_size_decorators","_get_text_location_decorators","_set_selected_name_decorators","_get_group_name_decorators","_deleteSelection_decorators","_get_font_decorators","_selection_decorators","_selection_extraInitializers","apps_DDBOptionsApp","DDBOptionsApp_runInitializers","size_value","_size_value_initializers","DDBOptionsApp_esDecorate","_get_size_decorators","_size_value_decorators","_size_value_extraInitializers","DDBIntegration","IntegrationExtra","T","configureServices","setupApps","mount","app","custom_init","components_init","SetupPage_init","setupModels","setupServices","services_custom_init","services_init"],"sourceRoot":""}