UNPKG

@friend_nicen/diyjs

Version:

DIY.JS 是一款基于Canvas原生接口开发的业务级图形库,专注于为商品定制提供强大的图形交互功能,帮助开发者轻松实现商品的个性化设计,适用于 T 恤、手机壳、抱枕等多种商品的定制场景。

1 lines 92 kB
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).diy={})}(this,(function(t){"use strict";function e(t){return Math.sqrt(t.x*t.x+t.y*t.y)}function i(t,i){let s=function(t,i){let s=e(t)*e(i);if(0===s)return 0;let h=function(t,e){return t.x*e.x+t.y*e.y}(t,i)/s;return h>1&&(h=1),Math.acos(h)}(t,i);return function(t,e){return t.x*e.y-e.x*t.y}(t,i)>0&&(s*=-1),180*s/Math.PI}class s{constructor(t){this._Observer={},this.el=t}register(t,e){"function"==typeof e&&(void 0===this._Observer[t]?this._Observer[t]=[e]:this._Observer[t].push(e))}dispatch(t,e){if(this._Observer[t]){let i=this;e.gesture={event:Object.keys(this._Observer),on:function(t,e){i.register(t,e)},off:function(t){i.remove(t)},destroy:function(){i._Observer={}}};for(let i=0,s=this._Observer[t].length;i<s;i++){let s=this._Observer[t][i];"function"==typeof s&&s.call(this.el,e)}}}remove(t){if(this._Observer[t]instanceof Array)for(let e=this._Observer[t].length-1;e>=0;e--)this._Observer[t].splice(e,1)}}class h{constructor(t,e={}){this.element="string"==typeof t?document.querySelector(t):t,this.userAgent="undefined"==typeof global||"undefined"!=typeof window?/Android|webOS|iPhone|iPod|iPad|BlackBerry/i.test(navigator.userAgent)||navigator.maxTouchPoints&&navigator.maxTouchPoints>2?"Mobile":"PC":global.__wcc_version__||0===Object.keys(global).length?"Mini":void 0,this.Observer=new s(this.element),"Mini"===this.userAgent?(this.element.start=this.start.bind(this),this.element.move=this.move.bind(this),this.element.end=this.end.bind(this),this.element.cancel=this.cancel.bind(this)):(this.start=this.start.bind(this),this.move=this.move.bind(this),this.end=this.end.bind(this),this.cancel=this.cancel.bind(this),this.mouseOver=this.mouseOver.bind(this),this.mouseOut=this.mouseOut.bind(this)),"Mobile"===this.userAgent&&(this.element.addEventListener("touchstart",this.start,!1),this.element.addEventListener("touchmove",this.move,!1),this.element.addEventListener("touchend",this.end,!1),this.element.addEventListener("touchcancel",this.cancel,!1)),"PC"===this.userAgent&&(this.mouseLeave=this.mouseLeave.bind(this),this.element.addEventListener("mousedown",this.start,!1),this.element.addEventListener("mousemove",this.move,!1),this.element.addEventListener("mouseup",this.end,!1),this.element.addEventListener("mouseover",this.mouseOver,!1),this.element.addEventListener("mouseout",this.mouseOut,!1),this.element.addEventListener("mouseleave",this.mouseLeave,!1)),this.Observer.register("start",e.start),this.Observer.register("end",e.end),this.Observer.register("pressMove",e.pressMove),this.Observer.register("swipe",e.swipe),this.Observer.register("tap",e.tap),this.Observer.register("doubleTap",e.doubleTap),this.Observer.register("longTap",e.longTap),this.Observer.register("singleTap",e.singleTap),"Mobile"===this.userAgent||"Mini"===this.userAgent?(this.Observer.register("touchStart",e.touchStart),this.Observer.register("touchMove",e.touchMove),this.Observer.register("touchEnd",e.touchEnd),this.Observer.register("touchCancel",e.touchCancel),this.Observer.register("moreFingerStart",e.moreFingerStart),this.Observer.register("multipointEnd",e.multipointEnd),this.Observer.register("pinch",e.pinch),this.Observer.register("twoFingerPressMove",e.twoFingerPressMove),this.Observer.register("rotate",e.rotate)):(this.Observer.register("mouseDown",e.mouseDown),this.Observer.register("mouseMove",e.mouseMove),this.Observer.register("mouseUp",e.mouseUp),this.Observer.register("mouseOver",e.mouseOver),this.Observer.register("mouseOut",e.mouseOut)),this._cancelAllHandler=this.cancelAll.bind(this),"undefined"!=typeof window&&window.addEventListener("scroll",this._cancelAllHandler),this.preV={x:null,y:null},this.pinchStartLen=null,this.zoom=1,this.isDoubleTap=!1,this.delta=null,this.last=null,this.now=null,this.tapTimeout=null,this.singleTapTimeout=null,this.longTapTimeout=null,this.swipeTimeout=null,this.lastTime=null,this.x1=this.x2=this.y1=this.y2=null,this.preTapPosition={x:null,y:null},this.isPress=!1}start(t){this.now=Date.now(),this.isPress=!0,"Mobile"===this.userAgent||"Mini"===this.userAgent?(this.x1=t.touches[0].pageX,this.y1=t.touches[0].pageY):(this.x1=t.pageX,this.y1=t.pageY),this.delta=this.now-(this.last||this.now),this.Observer.dispatch("start",t),this.Observer.dispatch("Mobile"===this.userAgent||"Mini"===this.userAgent?"touchStart":"mouseDown",t),null!==this.preTapPosition.x&&(this.isDoubleTap=this.delta>0&&this.delta<=250&&Math.abs(this.preTapPosition.x-this.x1)<30&&Math.abs(this.preTapPosition.y-this.y1)<30,this.isDoubleTap&&clearTimeout(this.singleTapTimeout)),this.preTapPosition.x=this.x1,this.preTapPosition.y=this.y1,this.last=this.now;let i=this.preV;if(t.touches&&t.touches.length>1){this._cancelLongTap(),this._cancelSingleTap();let s={x:t.touches[1].pageX-this.x1,y:t.touches[1].pageY-this.y1};i.x=s.x,i.y=s.y,this.pinchStartLen=e(i),this.Observer.dispatch("moreFingerStart",t)}this._preventTap=!1,this.longTapTimeout=setTimeout(function(){this.Observer.dispatch("longTap",t),this._preventTap=!0}.bind(this),750)}move(t){let s=this.preV,h=0,o=0;if("Mobile"===this.userAgent||"Mini"===this.userAgent?(h=t.touches[0].pageX,o=t.touches[0].pageY):(h=t.pageX,o=t.pageY),this.isDoubleTap=!1,t.touches&&t.touches.length>1){let n=t.touches[1].pageX,r=t.touches[1].pageY,a={x:t.touches[1].pageX-h,y:t.touches[1].pageY-o};null!==s.x&&(this.pinchStartLen>0&&(t.zoom=e(a)/this.pinchStartLen,this.Observer.dispatch("pinch",t)),t.angle=i(a,s),this.Observer.dispatch("rotate",t)),s.x=a.x,s.y=a.y,null!==this.x2&&null!==this.sx2?(t.deltaX=(h-this.x2+n-this.sx2)/2,t.deltaY=(o-this.y2+r-this.sy2)/2):(t.deltaX=0,t.deltaY=0),this.Observer.dispatch("twoFingerPressMove",t),this.sx2=n,this.sy2=r}else{if(null!==this.x2){t.deltaX=h-this.x2,t.deltaY=o-this.y2;let e=Math.abs(this.x1-this.x2),i=Math.abs(this.y1-this.y2);(e>10||i>10)&&(this._preventTap=!0)}else t.deltaX=0,t.deltaY=0;null!==this.lastTime?t.deltaTime=Date.now()-this.lastTime:t.deltaTime=0,this.isPress&&this.Observer.dispatch("pressMove",t)}this.Observer.dispatch("Mobile"===this.userAgent||"Mini"===this.userAgent?"touchMove":"mouseMove",t),this._cancelLongTap(),this.x2=h,this.y2=o,this.lastTime=Date.now(),t.preventDefault&&t.touches&&t.touches.length>1&&t.preventDefault()}end(t){this._cancelLongTap(),this.isPress=!1;let e=this;t.touches&&t.touches.length<2&&(this.Observer.dispatch("multipointEnd",t),this.sx2=this.sy2=null),this.x2&&Math.abs(this.x1-this.x2)>30||this.y2&&Math.abs(this.y1-this.y2)>30?(t.direction=this._swipeDirection(this.x1,this.x2,this.y1,this.y2),this.swipeTimeout=setTimeout((function(){e.Observer.dispatch("swipe",t)}),0)):(this.tapTimeout=setTimeout((function(){e._preventTap||e.Observer.dispatch("tap",t),e.isDoubleTap&&(e.Observer.dispatch("doubleTap",t),e.isDoubleTap=!1)}),0),e.isDoubleTap||(e.singleTapTimeout=setTimeout((function(){e.Observer.dispatch("singleTap",t)}),250))),this.Observer.dispatch("end",t),this.Observer.dispatch("Mobile"===this.userAgent||"Mini"===this.userAgent?"touchEnd":"mouseUp",t),this.preV.x=0,this.preV.y=0,this.zoom=1,this.pinchStartLen=null,this.x1=this.x2=this.y1=this.y2=this.lastTime=null}mouseLeave(t){this.isPress=!1,this.Observer.dispatch("mouseLeave",t)}mouseOver(t){this.Observer.dispatch("mouseOver",t)}mouseOut(t){this.Observer.dispatch("mouseOut",t)}cancel(t){this.cancelAll(),this.Observer.dispatch("touchCancel",t)}cancelAll(){this._preventTap=!0,clearTimeout(this.singleTapTimeout),clearTimeout(this.tapTimeout),clearTimeout(this.longTapTimeout),clearTimeout(this.swipeTimeout)}_cancelLongTap(){clearTimeout(this.longTapTimeout)}_cancelSingleTap(){clearTimeout(this.singleTapTimeout)}_swipeDirection(t,e,i,s){return Math.abs(t-e)>=Math.abs(i-s)?t-e>0?"Left":"Right":i-s>0?"Up":"Down"}on(t,e){this.Observer.register(t,e)}off(t,e){this.Observer.remove(t,e)}destroy(){return this.singleTapTimeout&&clearTimeout(this.singleTapTimeout),this.tapTimeout&&clearTimeout(this.tapTimeout),this.longTapTimeout&&clearTimeout(this.longTapTimeout),this.swipeTimeout&&clearTimeout(this.swipeTimeout),this.element.removeEventListener("touchstart",this.start),this.element.removeEventListener("touchmove",this.move),this.element.removeEventListener("touchend",this.end),this.element.removeEventListener("touchcancel",this.cancel),this.element.removeEventListener("mousedown",this.start),this.element.removeEventListener("mousemove",this.move),this.element.removeEventListener("mouseup",this.end),this.element.removeEventListener("mouseup",this.end),this.element.removeEventListener("mouseover",this.mouseOver),this.element.removeEventListener("mouseLeave",this.mouseLeave),this.Observer._Observer={},this.preV=this.pinchStartLen=this.zoom=this.isDoubleTap=this.delta=this.last=this.now=this.tapTimeout=this.lastTime=this.singleTapTimeout=this.longTapTimeout=this.swipeTimeout=this.x1=this.x2=this.y1=this.y2=this.preTapPosition=null,"undefined"!=typeof window&&window.removeEventListener("scroll",this._cancelAllHandler),null}}function o(t){if("touches"in t&&t.touches){const e=[];let i=null;for(let s=0,h=t.touches.length;s<h;s++)i=t.touches[s],e.push({x:i.pageX,y:i.pageY});return e}return[{x:t.x,y:t.y}]}function n(t){if("changedTouches"in t&&t.changedTouches){const e=[];let i=null;for(let s=0,h=t.changedTouches.length;s<h;s++)i=t.changedTouches[s],e.push({x:i.pageX,y:i.pageY});return e}return[{x:t.x,y:t.y}]}function r(t,e,i=null,s=!0){if(window.hasImage||(window.hasImage=Object.create(null)),s&&Object.keys(window.hasImage).indexOf(t)>-1)return void e(window.hasImage[t]);const h=new window.Image;h.crossOrigin="anonymous",h.src=t,h.style.display="none",h.onload=()=>{s&&(window.hasImage[t]=h),e&&e(h)},h.onerror=()=>{i&&i()}}function a(t,e,i){let s;return()=>{const h=this,o=arguments,n=function(){s=null,i||t.apply(h,o)},r=i&&!s;clearTimeout(s),r?t.apply(h,o):s=setTimeout(n,e)}}function l(t,e={}){if(null===t||"object"!==typeof t)return t;const i=Array.isArray(t)?[]:{};for(const s in t)"function"!=typeof t[s]&&(t[s]&&t[s].props?i[s]=t[s].props(e):i[s]=l(t[s]));return i}function c(t,e){let i=Math.pow(10,e);return Math.floor(t*i)/i}function u(t,e){if("string"==typeof t&&t.endsWith("%")){return parseFloat(t)/100*e}return t}function d(t,e){return parseFloat(t.toFixed(e))}function p(t,e){return{x:c(t.x-e.x,5),y:c(t.y-e.y,5)}}function g(t,e){return{x:(t.x+e.x)/2,y:(t.y+e.y)/2}}function f(t){return Math.sqrt(t.x*t.x+t.y*t.y)}function y(t,e){let i,s,h=t.x*e.y-e.x*t.y>0?1:-1,o=f(t)*f(e);return 0===o?0:(i=t.x*e.x+t.y*e.y,s=i/o,s>1&&(s=1),s<-1&&(s=-1),Math.acos(s)*h)}function x(t){return 180*t/Math.PI}function m(t,e,i){const s=t.x-i.x,h=t.y-i.y,o=e*Math.PI/180,n=s*Math.cos(o)-h*Math.sin(o),r=s*Math.sin(o)+h*Math.cos(o);return{x:c(n+i.x,3),y:c(r+i.y,3)}}function w(t,e,i){const s=t.x-i.x,h=t.y-i.y,o=-e*Math.PI/180,n=s*Math.cos(o)-h*Math.sin(o),r=s*Math.sin(o)+h*Math.cos(o);return{x:c(n+i.x,3),y:c(r+i.y,3)}}function v(t){let e=Number.MAX_VALUE,i=Number.MAX_VALUE,s=Number.MIN_VALUE,h=Number.MIN_VALUE;return t.forEach((function(t){e=Math.min(e,t.x),i=Math.min(i,t.y),s=Math.max(s,t.x+t.w),h=Math.max(h,t.y+t.h)})),{x:e,y:i,w:s-e,h:h-i}}function A(t,e){return{x:t.x*e,y:t.y*e}}function b(t,e){const i=Object.assign({text:"",x:0,y:0,fontSize:16,fontFamily:"Arial",bold:!1,italic:!1,textDecoration:!1,cornerRadius:5,textColor:"#ffffff",textBaseline:"middle",textAlign:"center",background:!0,backgroundColor:"#ffffff",bound:null,border:1,borderColor:"#000000",direction:"horizontal",spacingLeft:1,spacingTop:1,padding:{top:6,bottom:6,left:6,right:6}},e),s=i.fontFamily?i.fontFamily:"Arial";let h=`${i.fontSize}px ${s}`;i.bold&&(h="bold "+h),i.italic&&(h="italic "+h),t.save(!1),t.font=h,t.textAlign=i.textAlign,t.textBaseline=i.textBaseline,t.fillStyle=i.textColor;const o=i.text.split("\n"),n={x:null,y:null,w:null,h:null};let r=0,a=0;if("vertical"===i.direction)for(let e=0;e<o.length;e++){let s=o[e].split(""),h=0,n=0;for(let e=0;e<s.length;e++){let o=t.measureText(s[e]);o.width>h&&(h=o.width),n+=i.fontSize,e>0&&(n+=i.spacingTop)}r+=h,e>0&&(r+=i.spacingLeft),n>a&&(a=n)}else for(let e=0;e<o.length;e++){let s=o[e].split(""),h=0;for(let e=0;e<s.length;e++){h+=t.measureText(s[e]).width,e>0&&(h+=i.spacingLeft)}a+=i.fontSize,e>0&&(a+=i.spacingTop),h>r&&(r=h)}return n.y=i.y-a/2-i.padding.top,n.h=a+i.padding.top+i.padding.bottom,n.x=i.x-r/2-i.padding.left,n.w=r+i.padding.left+i.padding.right,t.restore(),n}var C={_init(){this._initBound(),this._initStyle(),this._initCanvas(),this._initModel(),this._initGesTure(),this._initEvent(),this.emit("init",{type:"init"}),"auto"===this._mode&&this._global.requestAnimationFrame((()=>this._render(!0)))},_initStyle(){const t=this.bound(),e=document.createElement("style"),i=`.diyjs {position: relative;} .diyjs canvas {position: absolute;transform: translateZ(0);width:${t._w}px;height: ${t._h}px;left: 0;top: 0; }`;e.appendChild(document.createTextNode(i)),document.head.appendChild(e)},_initBound(){this._elem.classList.add("diyjs");const t=this._elem.getBoundingClientRect();this._offset={x:t.x,y:t.y},this.$offset={x:t.x,y:t.y},this._bound={x:0,y:0,w:Math.round(t.width*this._dpr),h:Math.round(t.height*this._dpr),_x:0,_y:0,_w:t.width,_h:t.height}},_initCanvas(){const t=this.bound(),e=this.createCanvas(t.w,t.h,!0,{zIndex:20});if(Object.assign(this._custom,{elem:e.elem,context:e.context}),this._useBuffer){const e=this.createCanvas(t.w,t.h);Object.assign(this._custom,{bufferElem:e.elem,bufferContext:e.context})}},_initModel(){const t=this.bound();this._model=this.createCanvas(t.w,t.h,!0,{zIndex:10,backgroundColor:"#f6f6f6"}),this._model.shapes=[]},_iniCanvasProxy(t,e=null,i=null){const s=this.bound();t.reset=()=>{t.width=e||s.w,t.height=i||s.h},t.size=(e,i)=>{t.width=e,t.height=i},t.reset()},_iniContextProxy(t){const e=this;t._dpr=e._dpr;const i=t.save;t.enableImageSmoothingEnabled=function(){t.imageSmoothingEnabled=!0,t.mozImageSmoothingEnabled=!0,t.webkitImageSmoothingEnabled=!0,t.msImageSmoothingEnabled=!0},t.disableImageSmoothingEnabled=function(){t.imageSmoothingEnabled=!1,t.mozImageSmoothingEnabled=!1,t.webkitImageSmoothingEnabled=!1,t.msImageSmoothingEnabled=!1},t.save=function(t=!0){i.apply(this),t&&this.scale(this._dpr,this._dpr)},t.copy=function(t){this.drawImage(t,0,0)},t.clear=function(){this.beginPath(),this.clearRect(0,0,this.canvas.width,this.canvas.height),this.closePath()},t.dpr=function(t){this._dpr=t},t.resetDpr=function(){this._dpr=e._dpr},t.roundCornerRect=function(t,e,i,s,h=5){return function(t,e,i,s,h,o){t.moveTo(e+o,i),t.lineTo(e+s-o,i),t.arcTo(e+s,i,e+s,i+o,o),t.lineTo(e+s,i+h-o),t.arcTo(e+s,i+h,e+s-o,i+h,o),t.lineTo(e+o,i+h),t.arcTo(e,i+h,e,i+h-o,o),t.lineTo(e,i+o),t.arcTo(e,i,e+o,i,o)}(this,t,e,i,s,h)},t.drawText=function(t){return function(t,e){const i=Object.assign({text:"",x:0,y:0,fontSize:16,fontFamily:"Arial",callback:!0,bold:!1,italic:!1,textDecoration:!1,cornerRadius:5,textColor:"#ffffff",textBaseline:"middle",textAlign:"center",background:!0,backgroundColor:"#ffffff",_bound:null,border:1,borderColor:"#000000",direction:"horizontal",spacingLeft:1,spacingTop:1,padding:{top:6,bottom:6,left:6,right:6}},e),s=i._bound?i._bound:b(t,e);if(i.background){let{x:e,y:h,w:o,h:n}=s;t.save(!1),t.fillStyle=i.backgroundColor,t.beginPath(),0!==i.cornerRadius?(t.moveTo(e+i.cornerRadius,h),t.lineTo(e+o-i.cornerRadius,h),t.arcTo(e+o,h,e+o,h+i.cornerRadius,i.cornerRadius),t.lineTo(e+o,h+n-i.cornerRadius),t.arcTo(e+o,h+n,e+o-i.cornerRadius,h+n,i.cornerRadius),t.lineTo(e+i.cornerRadius,h+n),t.arcTo(e,h+n,e,h+n-i.cornerRadius,i.cornerRadius),t.lineTo(e,h+i.cornerRadius),t.arcTo(e,h,e+i.cornerRadius,h,i.cornerRadius),t.closePath()):t.rect(e,h,o,n),t.fill(),i.border>0&&(t.enableImageSmoothingEnabled(),t.strokeStyle=i.borderColor,t.lineWidth=i.border,t.stroke()),t.restore()}const h=i.fontFamily?i.fontFamily:"Arial";let o=`${i.fontSize}px ${h}`;i.bold&&(o="bold "+o),i.italic&&(o="italic "+o),t.save(!1),t.font=o,t.textAlign=i.textAlign,t.textBaseline=i.textBaseline,t.fillStyle=i.textColor;const n=i.text?i.text.split("\n"):[];if("horizontal"===i.direction){i.y=i.y-(s.h-i.padding.top-i.padding.bottom)/2+i.fontSize/2;for(let e of n){let h,o=0,n=e.split("");for(let e=0;e<n.length;e++)o+=t.measureText(n[e]).width,e>0&&(o+=i.spacingLeft);if(t.textAlign="left","center"===i.textAlign)h=i.x-o/2;else if("left"===i.textAlign)h=i.x-(s.w-i.padding.left-i.padding.right)/2;else if("right"===i.textAlign){const t=s.w-i.padding.left-i.padding.right;h=i.x-t/2+(t-o)}for(let e=0;e<n.length;e++)e>0&&(h+=i.spacingLeft),t.fillText(n[e],h,i.y),h+=t.measureText(n[e]).width;i.y=i.y+i.fontSize+i.spacingTop}}else{i.x=i.x-(s.w-i.padding.left-i.padding.right)/2;for(let e of n){let h,o=0,n=e.split("");for(let t=0;t<n.length;t++)o+=i.fontSize,t>0&&(o+=i.spacingTop);if(t.textAlign="left",t.textBaseline="top","center"===i.textAlign)h=i.y-o/2;else if("left"===i.textAlign)h=i.y-(s.h-i.padding.top-i.padding.bottom)/2;else if("right"===i.textAlign){const t=s.h-i.padding.top-i.padding.bottom;h=i.y-t/2+(t-o)}let r=0;for(let e=0;e<n.length;e++){e>0&&(h+=i.spacingTop),t.fillText(n[e],i.x,h);let s=t.measureText(n[e]);s.width>r&&(r=s.width),h+=i.fontSize}i.x+=r+i.spacingLeft}}return t.restore(),s}(this,t)},t.textBound=function(t){return b(this,t)}},_initGesTure(){const t=this;this._gesture=new h(this._custom.elem,{start(e){t.emit("start",{type:"start",coords:e});const i=t.filterCoords(o(e));t._startPoint=i[0],t._eventTouch(i)},end(e){const i=t.filterCoords(n(e));t._startPoint&&1===i.length&&Math.abs(i[0].x-t._startPoint.x)<5&&Math.abs(i[0].y-t._startPoint.y)<5&&t._eventTouch(i,!0),t._eventUp(i)},pressMove(e){t._eventMove(t.filterCoords(o(e)))},rotate(e){t._eventRotate(e.angle,t.filterCoords(o(e)))},pinch(e){t._eventPinch(e.zoom,t.filterCoords(o(e)))},doubleTap(e){t.emit("doubleTap",{type:"doubleTap",coords:t.filterCoords(o(e))})}})},_initEvent(){const t=this;this._custom.elem.addEventListener("mouseleave",(e=>{const i=t.filterCoords(n(e));t._eventUp(i)})),this._global.addEventListener("resize",a((()=>{t._initBound(),this._gesture.destroy(),t._initGesTure()}),200))},_eventTouch(t,e=!1){let i=0;this._clicked=null;const s=this.shapes();for(const h of t){let{x:o,y:n}=A(h,this._dpr);for(let h=s.length-1;h>=0;h--){let r=s[h],a=r.clicked;this._clicked?(r.click(o,n,!1),e&&!this._multiActive&&r.deactivate(!1)):r.click(o,n,!1,t)?(i++,this._clicked=r,e&&(r.tap({x:o,y:n})?this._actived!==r&&(this._actived=r):this._actived=null)):e&&!this._multiActive&&(this._actived=null,r.deactivate(!1)),r.clicked!==a&&i++}if(this._clicked)break}this._clicked||this._actived||this._multiActive||(this.emit("click-blank",{type:"click-blank"}),this.emit("deactivate",{type:"deactivate",shape:this.shapes()})),"event"===this._mode&&i>0&&(this._loop=!0,this._render())},_eventMove(t){if(t.length>2)return;const e=this.getHandler();if(e){if(!e.canMove)return;let{x:i,y:s}=t[0];this._isMoving||(this._startOffset={x:i-e.x,y:s-e.y},this._isMoving=!0),e.move([{x:i,y:s}],this._startOffset)}},_eventPinch(t,e){if(e.length>2)return;const i=this.getHandler();if(i){if(!i.canScale)return;i.scale(t,e)}},_eventRotate(t,e){if(e.length>2)return;const i=this.getHandler();if(i){if(!i.canRotate)return;i.rotate(t,e)}},_eventUp(t){this._isMoving=!1,this.emit("end",{coords:t});const e=this.getHandler();if(e){if(!e.canUp)return;e.up(t)}"event"===this._mode&&(this._loop=!1)},_render(t=!0){if(!this._stop){if(this._new||!t){if(this._new=!1,this.getContext().clear(),this.getContext().closePath(),this._view.shape&&this._view.shape.clip){this._view.shape.stokeOutline();for(const t of this.shapes())t.draw()}else for(const t of this.shapes().concat(this._view.shape?[this._view.shape]:[]))t.draw();if(this.getQueue().length>0){for(const t of this.getQueue())t();this.clearQueue()}this._useBuffer&&(this._custom.context.clear(),this._custom.context.copy(this._custom.bufferElem))}this._loop&&t&&this._global.requestAnimationFrame((()=>this._render(t)))}},getHandler(){return this._limit?this._clicked:this._actived},getLimit(){return this._limit}},_={render(){this._new=!0},bound(){return this._bound},dpr(){return this._dpr},shapes(t=!1,e=-1){if(-1===e)return t?this._shapes.map((t=>t)):this._shapes;if("number"==typeof e)return this._shapes[e]?this._shapes[e]:null;if("string"==typeof e)for(let t of this._shapes)if(t.name===e)return t},getActive(){return this._actived},getViewBound(){return this._view.bound},getView(){return this._view.shape},getIndex(t){return this._shapes.indexOf(t)},canMultiActive(){return this._multiActive},getColorBound(t,e=!1){const i=t.context._dpr,s=Math.round(t.elem.width/i),h=Math.round(t.elem.height/i),o=this.createCanvas(s,h).context;o.enableImageSmoothingEnabled(),o.clearRect(0,0,s,h),o.drawImage(t.elem,0,0,s,h);const n=o.getImageData(0,0,s,h);let r=s,a=h,l=0,c=0;for(let t=0;t<h;t++)for(let e=0;e<s;e++){const i=4*(t*s+e);n.data[i+3]>0&&(r=Math.min(r,e),l=Math.max(l,e),a=Math.min(a,t),c=Math.max(c,t))}return e?{x:r,y:a,w:l-r,h:c-a,_x:Math.floor(r*i),_y:Math.floor(a*i),_w:Math.round((l-r)*i),_h:Math.round((c-a)*i)}:{_x:r,_y:a,_w:l-r,_h:c-a,x:Math.floor(r*i),y:Math.floor(a*i),w:Math.round((l-r)*i),h:Math.round((c-a)*i)}},createCanvas(t,e,i=!1,s={}){const h={};h.elem=document.createElement("canvas");for(let t in s)h.elem.style[t]=s[t];return h.context=h.elem.getContext("2d",{willReadFrequently:!0}),this._iniCanvasProxy(h.elem,t,e),this._iniContextProxy(h.context),i&&this._elem.appendChild(h.elem),h},async export(t={},e=null){const i=Object.assign({elem:["model","custom","view"],view:!0,clip:!0,type:"base64",filter:!1,ratio:3.5,size:null,frame:null},t);e=e||{model:this._model.shapes,custom:this.shapes(),view:this._view.shape};const s=this.bound(),h={_x:0,_y:0,_w:Math.round(s._w*i.ratio),_h:Math.round(s._h*i.ratio)},o=this.createCanvas(h._w,h._h),n=o.context;n.enableImageSmoothingEnabled(),n.dpr(i.ratio);const r=this.createCanvas(h._w,h._h);r.context.enableImageSmoothingEnabled(),r.context.dpr(i.ratio);let a=null;if(i.view){const t=e.view.getColorBound();t&&(a={_x:t._x*i.ratio,_y:t._y*i.ratio,_w:t._w*i.ratio,_h:t._h*i.ratio})}if(n.beginPath(),n.clearRect(0,0,h._w,h._h),i.elem.indexOf("custom")>-1)for(const t of e.custom.concat(e.view&&i.elem.indexOf("view")>-1?[e.view]:[]))!t.canExport&&i.filter||(t.bindContext(n),t.draw(!1),t.bindContext(this.getContext()));if(i.elem.indexOf("model")>-1&&e.model.length>0){const t=r.context,i=e.model;t.beginPath(),t.clearRect(0,0,h._w,h._h);for(const e of i)e.bindContext(t),e.draw(!1),e.bindContext(this._model.context);n.save(!1),n.globalCompositeOperation="destination-over",n.drawImage(r.elem,0,0,h._w,h._h),n.restore()}const{_x:l,_y:c,_w:u,_h:d}=a||(i.clip?this.getColorBound(o,!0):h);if(r.elem.size(u,d),r.context.beginPath(),r.context.clearRect(0,0,u,d),r.context.save(!1),r.context.putImageData(n.getImageData(Math.floor(l),Math.floor(c),Math.round(u),Math.round(d)),0,0),r.context.restore(),i.size&&Array.isArray(i.size)){1===i.size.length&&(i.size[1]=i.size[0]/(u/d));const t=new Image(i.size[0],i.size[1]);t.src=await new Promise((t=>{r.elem.toBlob((function(e){t(URL.createObjectURL(e))}))})),await new Promise((e=>{t.onload=()=>{e()}}));let e=i.size[0],s=i.size[1];r.elem.size(e,s),r.context.beginPath(),r.context.clearRect(0,0,e,s),r.context.save(!1),r.context.drawImage(t,0,0,e,s),r.context.restore()}else if(i.frame){const t=Object.assign({height:750,width:750,fillColor:"#ffffff"},i.frame);let e=u,s=d;const h=new Image(e,s);h.src=await new Promise((t=>{r.elem.toBlob((function(e){t(URL.createObjectURL(e))}))})),await new Promise((t=>{h.onload=()=>{t()}}));const o=e/s;t.width<e&&(e=t.width-60,s=e/o),t.height<s&&(s=t.height-60,e=s*o),r.elem.size(t.width,t.height),r.context.beginPath(),r.context.clearRect(0,0,t.width,t.height),r.context.save(!1),r.context.fillStyle=t.fillColor,r.context.fillRect(0,0,t.width,t.height),r.context.drawImage(h,(t.width-e)/2,(t.height-s)/2,e,s),r.context.restore()}return new Promise((t=>{"blob"===i.type?r.elem.toBlob((function(e){t(e)}),"image/png"):t(r.elem.toDataURL("image/png"))}))}},E={_listener:new Map,_pauseEvent:[],pauseEvent(t){-1===this._pauseEvent.indexOf(t)&&this._pauseEvent.push(t)},withEventPause(t,e){this.pauseEvent(t),e(),this.resumeEvent(t)},resumeEvent(t){const e=this._pauseEvent.indexOf(t);e>-1&&this._pauseEvent.splice(e,1)},on(t,e,i=!1){if("function"!=typeof e)throw new TypeError("listener must be a function");const s=Array.isArray(t)?t:[t];for(let t of s)this._listener.has(t)||this._listener.set(t,[]),0!==this._listener.get(t).length&&i||this._listener.get(t).push(e)},async emit(t,...e){if(!(this._pauseEvent.indexOf(t)>-1)&&this._listener.has(t)){const i=this._listener.get(t);for(const t of i)try{await t.apply(null,e)}catch(t){}}},off(t,e){const i=Array.isArray(t)?t:[t];for(let t of i)if(this._listener.has(t)){const i=this._listener.get(t),s=i.indexOf(e);-1!==s&&i.splice(s,1)}},removeAlllistener(t){this._listener.delete(t)}},I={move(t,e){if(t.length>1)return!1;const{x:i,y:s}=t[0];return(i!==this._previous.x||s!==this._previous.y)&&(this._previous.x=i,this._previous.y=s,this.actived&&this._action&&this._acting?(this._action.move(t,e),this.render(),!0):(this.emit("move",{type:"move",coords:t,offset:e,shape:this}),this.stage().emit("move",{type:"move",coords:t,offset:e,shape:this}),this.x=i-e.x,this.y=s-e.y,this.render(),!0))},scale(t,e){if(!this._startBound){const t=this.stage().getLimit()&&e.length>1?g(e[0],e[1]):this._group?this._group.getCenterPoint():{x:this.x+this.w/2,y:this.y+this.h/2};this._startBound={w:this.w,h:this.h,x:this.x,y:this.y,centerX:t.x,centerY:t.y}}t=c(t,2);const{x:i,y:s,w:h,h:o,centerX:n,centerY:r}=this._startBound;return this.x=n-(n-i)*t,this.y=r-(r-s)*t,this.w=h*t,this.h=o*t,this.emit("scale",{type:"scale",coords:e,zoom:t,shape:this}),this.stage().emit("scale",{type:"scale",coords:e,zoom:t,shape:this}),this.render(),!0},rotate(t,e){if(1===e.length)this._startAgree||(this._startAgree=this.rotateRadius),this.rotateRadius=this._startAgree+t;else{const e=this.stage().getConfig();Math.abs(t-this.rotateRadius)>e.minRotatable&&(this.rotateRadius+=t/(100-e.sensitivity))}return this.emit("rotate",{type:"rotate",coords:e,rad:t,shape:this}),this.stage().emit("rotate",{type:"rotate",coords:e,rad:t,shape:this}),this.render(),!0},tap(t){return this.emit("tap",{type:"tap",coords:t,shape:this}),this.stage().emit("tap",{type:"tap",coords:t,shape:this}),this.actived&&this._action&&this._acting?(this._action.tap(t),this.render(),this.actived):(this.toggle(),this.render(),this.actived)},up(t){this._startAgree=null,this._startBound=null,this.actived&&this._action&&this._acting&&(this._action.up(t),this.render()),this._group||(this.emit("up",{type:"up",coords:t,shape:this}),this.stage().emit("up",{type:"up",coords:t,shape:this}))},export(t={}){return this.stage().export(Object.assign({elem:["custom"],view:!1},t),{custom:[this]})}},S={_listener:null,on(t,e){if("function"!=typeof e)throw new TypeError("listener must be a function");const i=Array.isArray(t)?t:[t];for(let t of i)this._listener.has(t)||this._listener.set(t,[]),this._listener.get(t).push(e)},async emit(t,...e){if(this._listener.has(t)){const i=this._listener.get(t);for(const t of i)try{await t.apply(null,e)}catch(t){}}},off(t,e){const i=Array.isArray(t)?t:[t];for(let t of i)if(this._listener.has(t)){const i=this._listener.get(t),s=i.indexOf(e);-1!==s&&i.splice(s,1)}},removeAlllistener(t){this._listener.delete(t)}};let R=class{constructor(t){Object.assign(this,{image:null,corner:null,blendMode:"source-over",gap:3,w:24,h:24,shape:null,strokeStyle:"#e3e3e3",canActive:!1,canRemove:!1,canRotate:!1,canScale:!1,canExport:!1,canMove:!1},t)}_coords(t){return 0===this.corner?{x:t.x-this.gap,y:t.y-this.gap}:1===this.corner?{x:t.x+this.gap,y:t.y-this.gap}:2===this.corner?{x:t.x-this.gap,y:t.y+this.gap}:3===this.corner?{x:t.x+this.gap,y:t.y+this.gap}:4===this.corner?{x:t.x,y:t.y-this.h-this.gap}:5===this.corner?{x:t.x+this.gap+this.w,y:t.y}:6===this.corner?{x:t.x-this.w-this.gap,y:t.y}:7===this.corner?{x:t.x+this.gap,y:t.y+this.gap+this.h}:void 0}_draw(){if(!this.image)return;const t=this.shape.getContext();let e=this.shape.coords(this.corner),{x:i,y:s}=this._coords(e);t.beginPath(),this.shape._rotate(),t.rect(i-(this.w+10)/2,s-(this.h+10)/2,this.w+10,this.h+10),t.closePath()}draw(){const t=this.shape.getContext();let e=this.shape.coords(this.corner),{x:i,y:s}=this._coords(e);t.beginPath(),t.save(!0),this.shape._rotate(),t.globalCompositeOperation=this.blendMode;const h=this.w/2;t.drawImage(this.image,i-h,s-h,this.w,this.h),t.arc(i,s,h-1,0,2*Math.PI),t.strokeStyle=this.strokeStyle,t.lineWidth=1,t.stroke(),t.closePath(),t.restore()}click(t,e){const i=this.shape.getContext();return i.save(),i.setViewClip&&i.setViewClip(),this._draw(),this.clicked=i.isPointInPath(t,e),i.restore(),this.clicked}move(t,e){}tap(t){}up(t){}};class O extends R{tap(){this.shape.destroy(!0)}}class B extends R{constructor(t){super(Object.assign(t,{startPoint:null}))}move(t){this.startPoint||(this.startPoint=t[0]);let{x:e,y:i,w:s,h:h}=this.shape.bound();const o={x:e+s/2,y:i+h/2};let n=y(p(o,this.startPoint),p(o,t[0]));this.shape.rotate(n,t)}up(){this.startPoint=null}}class T extends R{constructor(t){super(Object.assign(t,{startScale:null,rectCenterPoint:null}))}move(t){if(!this.startScale){let{x:e,y:i,w:s,h:h}=this.shape.bound();this.rectCenterPoint={x:e+s/2,y:i+h/2},this.startScale=f(p(this.rectCenterPoint,t[0]))}let e=f(p(this.rectCenterPoint,t[0]));this.shape.scale(e/this.startScale,t)}up(){this.startScale=null,this.rectCenterPoint=null}}let M=class extends R{_draw(){const t=this.shape.getContext();t.beginPath(),this.shape._rotate(),t.rect(this.x,this.y,this.w,this.h),t.closePath()}draw(){const t=this.shape.getContext();let e=this.shape.coords(this.corner),{x:i,y:s}=this._coords(e);t.save(!0),t.beginPath(),this.shape._rotate(),t.globalCompositeOperation=this.blendMode,Object.assign(this,t.drawText({x:i,y:s,border:1,borderColor:"#e3e3e3",textColor:"#000000",fontSize:10,cornerRadius:8,padding:{top:5,bottom:5,left:8,right:8},callback:!1,text:this.shape.button_2_Text})),t.closePath(),t.restore()}tap(){this.shape.stage().emit("to-do",{type:"to-do",shape:this.shape})}};class k{constructor(t={}){Object.assign(this,{active:null,shape:null,action:[],gap:3},t),this.shape.canRemove&&r("data:image/png;base64,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",(t=>{this.action.push(new O({image:t,corner:0,shape:this.shape})),this.shape.render()})),this.shape.canRotate&&r("data:image/png;base64,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",(t=>{this.action.push(new B({image:t,corner:5,text:"替换",shape:this.shape})),this.shape.render()})),this.shape.canScale&&r("data:image/png;base64,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