polotno 2.13.7 → 2.13.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,7 @@ type ImageProps = {
6
6
  element: ImageElementType;
7
7
  };
8
8
  export declare const setImageLoaderHook: (customImageLoaderHook: any) => void;
9
- export declare const useImageLoader: (status: string, id: string) => void;
9
+ export declare const useImageLoader: (status: string, src?: string, id?: string) => void;
10
10
  export declare const ImageElement: (({ element, store }: ImageProps) => React.JSX.Element) & {
11
11
  displayName: string;
12
12
  };
@@ -1 +1 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a);var o=Object.getOwnPropertyDescriptor(t,a);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,r,o)}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&__createBinding(t,e,a);return __setModuleDefault(t,e),t},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ImageElement=exports.useImageLoader=exports.setImageLoaderHook=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),mobx_1=require("mobx"),react_konva_1=require("react-konva"),use_image_1=__importDefault(require("use-image")),konva_1=__importDefault(require("konva")),react_konva_utils_1=require("react-konva-utils"),highlighter_1=require("./highlighter"),loader_1=require("../utils/loader"),svg=__importStar(require("../utils/svg")),flags_1=require("../utils/flags"),canvas_1=require("../utils/canvas"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),screen_1=require("../utils/screen");function createCanvas(){return document.createElement("canvas")}async function getFixedUrl(e){if(!(e.indexOf("data:image/svg+xml")>=0||e.indexOf(".svg")>=0))return e;const t=await svg.urlToString(e),a=svg.fixSize(t);return svg.svgToURL(a)}const useSizeFixer=e=>{const[t,a]=react_1.default.useState(e);return react_1.default.useEffect((()=>{(async()=>{const r=await getFixedUrl(e);r!==t&&a(r)})()}),[e]),t};function getDistance(e,t){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}function getCenter(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}const useFlip=(e,t,a)=>{const r=react_1.default.useMemo((()=>{var r,o;const{flipX:i,flipY:n}=e,c="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0,h=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,d=(/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||h)&&c||e.maskSrc;if(!i&&!n&&!d)return t;if(!t||!t.width||!t.height)return null;const l=createCanvas();let s=1;"svg"===e.type&&(s=Math.max(e.a.width/t.width*a,e.a.height/t.height*a)),(0,canvas_1.trySetCanvasSize)(l,Math.max(t.width*s,1),Math.max(t.height*s,1));let u=i?-l.width:0,g=n?-l.height:0;return null===(r=l.getContext("2d"))||void 0===r||r.scale(i?-1:1,n?-1:1),null===(o=l.getContext("2d"))||void 0===o||o.drawImage(t,u,g,l.width,l.height),l}),[e.maskSrc,e.flipX,e.flipY,t,e.a.width,e.a.height,a]);return react_1.default.useEffect((()=>()=>{r&&"CANVAS"===r.nodeName&&konva_1.default.Util.releaseCanvas(r)}),[r]),r};function getCrop(e,t){const a=t.width/t.height;let r,o;a>=e.width/e.height?(r=e.width,o=e.width/a):(r=e.height*a,o=e.height);return{x:(e.width-r)/2,y:(e.height-o)/2,width:r,height:o}}function downsample(e,t,a,r,o,i,n){for(var c=new ImageData(t,a),h=new Int32Array(e.data.buffer),d=e.width,l=new Int32Array(c.data.buffer),s=c.width,u=t/i,g=a/n,f=Math.round(1/u),p=Math.round(1/g),_=f*p,m=0;m<c.height;m++)for(var w=0;w<s;w++){for(var v=r+Math.round(w/u)+(o+Math.round(m/g))*d,x=0,y=0,M=0,b=0,E=0;E<p;E++)for(var k=0;k<f;k++){var C=h[v+k+E*d];x+=C<<24>>>24,y+=C<<16>>>24,M+=C<<8>>>24,b+=C>>>24}x=Math.round(x/_),y=Math.round(y/_),M=Math.round(M/_),b=Math.round(b/_),l[w+m*s]=b<<24|M<<16|y<<8|x}return c}function downScaleCanvas(e,t){var a,r;const o=createCanvas();o.width=e.width,o.height=e.height;const i=Math.max(1,Math.floor(o.width*t)),n=Math.max(1,Math.floor(o.height*t));null===(a=o.getContext("2d"))||void 0===a||a.drawImage(e,0,0,o.width,o.height);const c=downsample(o.getContext("2d").getImageData(0,0,o.width,o.height),i,n,0,0,o.width,o.height);return o.width=i,o.height=n,null===(r=o.getContext("2d"))||void 0===r||r.putImageData(c,0,0),o}const useMask=(e,t)=>{const[a,r]=useImageHook(e.maskSrc,"anonymous"),o=e.maskSrc?r:"loaded";return(0,exports.useImageLoader)(o,e.id+"-mask"),react_1.default.useMemo((()=>{if(!a)return t;if(!t||!t.width||!t.height)return t;const r=createCanvas();r.width=Math.max(t.width,1),r.height=Math.max(t.height,1);const o=r.getContext("2d");if(!o)return t;o.drawImage(t,0,0),o.globalCompositeOperation="source-in";const i=getCrop(a,e);return o.drawImage(a,i.x,i.y,i.width,i.height,0,0,t.width,t.height),r}),[t,a,e.a.width,e.a.height])},limit=(e,t,a)=>Math.max(t,Math.min(a,e)),useCornerRadiusAndCrop=(e,t,a,r,o=0,i=!1,n=!0)=>{const c=Math.floor(limit(e.a.width*r,1,1e4)),h=Math.floor(limit(e.a.height*r,1,1e4)),d=Math.min(o*r,c/2,h/2),l=Math.max(e.a.width/a.width,e.a.height/a.height)*r,s=e.page._exportingOrRendering&&flags_1.flags.imageDownScalingEnabled&&l<1&&!i,u=0===a.x&&0===a.y&&a.width===(null==t?void 0:t.width)&&a.height===(null==t?void 0:t.height),g=react_1.default.useMemo((()=>{if(!t||!t.width||!t.height)return;return u&&0===d&&!s?void 0:createCanvas()}),[t,d,s,u]);return react_1.default.useLayoutEffect((()=>{if(!g||!t)return;(0,canvas_1.trySetCanvasSize)(g,c,h);const e=g.getContext("2d");if(!e)return;d&&(e.beginPath(),e.moveTo(d,0),e.lineTo(c-d,0),e.arc(c-d,d,d,3*Math.PI/2,0,!1),e.lineTo(c,h-d),e.arc(c-d,h-d,d,0,Math.PI/2,!1),e.lineTo(d,h),e.arc(d,h-d,d,Math.PI/2,Math.PI,!1),e.lineTo(0,d),e.arc(d,d,d,Math.PI,3*Math.PI/2,!1),e.clip());const r=s?downScaleCanvas(t,l):t,o=s?{x:Math.floor(a.x*l),y:Math.floor(a.y*l),width:Math.floor(a.width*l),height:Math.floor(a.height*l)}:a;e.drawImage(r,o.x,o.y,o.width,o.height,0,0,g.width,g.height)}),[g,e.a.width,e.a.height,a.x,a.y,a.width,a.height,o,r,i,e.page._exportingOrRendering,s]),react_1.default.useEffect((()=>()=>{g&&"CANVAS"===g.nodeName&&konva_1.default.Util.releaseCanvas(g)}),[g]),g||t},useClip=(e,t,a,r)=>{const o=useSizeFixer(e.clipSrc||""),[i,n]=useImageHook(o,"anonymous"),c=e.clipSrc?n:"loaded";(0,exports.useImageLoader)(c,e.id+"-clip");const h=react_1.default.useMemo((()=>{if(t&&i)return createCanvas()}),[t,i]);react_1.default.useLayoutEffect((()=>{var r;if(!i)return;if(!t||!t.width||!t.height)return;if(!i||!i.width||!i.height)return;if(!h)return;const o=createCanvas(),n=Math.max(e.a.width/i.width*a,e.a.height/i.height*a);o.width=i.width*n,o.height=i.height*n,null===(r=o.getContext("2d"))||void 0===r||r.drawImage(i,0,0,o.width,o.height),h.width=Math.max(t.width,1),h.height=Math.max(t.height,1);const c=h.getContext("2d");c&&(c.save(),c.drawImage(o,0,0,t.width,t.height),konva_1.default.Util.releaseCanvas(o),c.globalCompositeOperation="source-in",c.drawImage(t,0,0,h.width,h.height),c.restore())}),[h,t,i,e.a.width,e.a.height,a,...r]);return e.clipSrc&&i?h:t},PLACEHOLDER_CANVAS=createCanvas(),LoadingPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t=Math.min(30,e.a.width/4,e.a.height/4),a=react_1.default.useRef(null);return react_1.default.useEffect((()=>{const e=a.current;if(!e)return;const t=new konva_1.default.Animation((t=>{e.rotate(((null==t?void 0:t.timeDiff)||0)/2)}),e.getLayer());return t.start(),()=>{t.stop()}})),react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.a.width,height:e.a.height,fill:"rgba(124, 173, 212, 0.8)"}),react_1.default.createElement(react_konva_1.Arc,{ref:a,x:e.a.width/2,y:e.a.height/2,fill:"white",outerRadius:Math.abs(t),innerRadius:Math.max(1,t-5),angle:270}))})),ErrorPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t="Can not load the image...",a=Math.max(10,Math.min(30,e.a.width/25));return react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.a.width,height:e.a.height,fill:"rgba(223, 102, 102, 0.8)"}),react_1.default.createElement(react_konva_1.Text,{text:t,fontSize:a,width:e.a.width,height:e.a.height,align:"center",fill:"white",verticalAlign:"middle",padding:5}))}));let useImageHook=use_image_1.default;const setImageLoaderHook=e=>{useImageHook=e};exports.setImageLoaderHook=setImageLoaderHook;const useImageWithVectorDetection=(e,t)=>{const[a,r]=useImageHook(e,t),[o,i]=react_1.default.useState(null);react_1.default.useEffect((()=>{if(!e)return void i(null);let a=!0;return(async()=>{try{const r=(await fetch(e,{method:"HEAD",credentials:"anonymous"===t?"omit":"include"})).headers.get("content-type");a&&i(null==r?void 0:r.includes("svg"))}catch(e){console.error("Error detecting image type:",e),a&&i(!1)}})(),()=>{a=!1}}),[e]);const n=null!==o;return[n?a:void 0,r,n?o:void 0]},useImageLoader=(e,t)=>{const a=react_1.default.useRef(),r=()=>{var e;null===(e=a.current)||void 0===e||e.call(a),a.current=void 0};react_1.default.useEffect((()=>r),[]),react_1.default.useLayoutEffect((()=>{"loading"!==e||a.current||(a.current=(0,loader_1.incrementLoader)(`image ${t}`)),"loading"!==e&&r(),"failed"===e&&(0,loader_1.triggerLoadError)(`image ${t}`)}),[e])};exports.useImageLoader=useImageLoader;const usePreviousImage=({image:e,status:t,type:a})=>{const r=react_1.default.useRef();react_1.default.useEffect((()=>{r.current=e||r.current}),[e]);return"failed"!==t||"failed"!==t&&"svg"===a?r.current:void 0},useImageSource=e=>{const[t,a]=react_1.default.useReducer((e=>e+1),0),r=react_1.default.useRef("loading"),o=react_1.default.useRef(e.src),i=react_1.default.useRef(e.src);return i.current!==e.src&&(i.current=e.src,r.current="loading"),react_1.default.useEffect((()=>{if("svg"!==e.type)return;if(!e.src)return;let t=!1;return(async()=>{r.current="loading",a();const i=await svg.urlToString(e.src),n=svg.fixSize(i),c=svg.replaceColors(n,e.colorsReplace);t||(o.current=c,r.current="loaded",a())})(),()=>{t=!0}}),[e.src,JSON.stringify(e.colorsReplace)]),"svg"!==e.type?[e.src,"loaded"]:[o.current,r.current]};exports.ImageElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{var a;const[r,o]=react_1.default.useState(!1),i=react_1.default.useRef(null),n=react_1.default.useRef(null),[c,h]=react_1.default.useState(!1),d=t.selectedShapes.indexOf(e)>=0,[l,s]=useImageSource(e),[u,g]=useImageHook(l,"anonymous"),f="svg"!==e.type||"loaded"===s?g:"loading";(0,exports.useImageLoader)(f,e.id);const p=e.page._exportingOrRendering?1:Math.max(1,t.scale),_=t._elementsPixelRatio*p,m=usePreviousImage({image:u,status:g,type:e.type}),w=useFlip(e,u||m,_),v=useMask(e,w)||PLACEHOLDER_CANVAS;let{cropX:x,cropY:y,cropWidth:M,cropHeight:b}=e;"loaded"!==g&&(x=y=0,M=b=1);const E=v.width*M,k=v.height*b,C=e.a.width/e.a.height;let I,S;const R=E/k,O="svg"===e.type;O?(I=E,S=k):C>=R?(I=E,S=E/C):(I=k*C,S=k);const D={x:v.width*x,y:v.height*y,width:I,height:S},L=null!==(a=e.cornerRadius)&&void 0!==a?a:0,P=e.page._exportingOrRendering?1:Math.min(2,t.scale),X=t._elementsPixelRatio*P;let Y=useClip(e,useCornerRadiusAndCrop(e,v,D,X,L,r||e._cropModeEnabled||"svg"===e.type,!0),X,[D,L,X]);const A=Math.max(e.a.width/I,e.a.height/S);react_1.default.useEffect((()=>{var t;if(!e._cropModeEnabled)return;const a=null===(t=i.current)||void 0===t?void 0:t.getStage();function r(t){e._cropModeEnabled&&t.target!==n.current&&e.toggleCropMode(!1)}function o(t){e._cropModeEnabled&&t.target.parentNode!==a.content&&e.toggleCropMode(!1)}return document.body.addEventListener("click",o),null==a||a.on("click",r),null==a||a.on("tap",r),()=>{document.body.removeEventListener("click",o),document.body.removeEventListener("touchstart",o),null==a||a.off("click",r),null==a||a.off("click",r)}}),[e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{if(r||e._cropModeEnabled)return;(0,apply_filters_1.applyFilter)(i.current,e);return(0,mobx_1.autorun)((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),{delay:100})}),[Y,e.page._exportingOrRendering,r,M,b,e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{var t;r||e._cropModeEnabled?null===(t=i.current)||void 0===t||t.clearCache():(0,apply_filters_1.applyFilter)(i.current,e)}),[r,e.a.width,e.a.height,e._cropModeEnabled]),react_1.default.useEffect((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),[e.shadowEnabled,e.shadowBlur,e.cornerRadius,e.shadowColor,e.shadowOffsetX,e.shadowOffsetY,e.shadowOpacity]);const H=react_1.default.useRef(null),T=react_1.default.useRef(null),W=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(T.current.nodes([H.current]),W.current.nodes([n.current]))}),[e._cropModeEnabled]);var q=react_1.default.useRef(null),z=react_1.default.useRef(0),F=react_1.default.useRef(!1);const B=t=>{var a;(null===(a=t.evt.touches)||void 0===a?void 0:a.length)>2&&t.target.stopDrag(),Math.round(t.target.x())>0&&(t.target.x(0),t.target.scaleX(1)),Math.round(t.target.y())>0&&(t.target.y(0),t.target.scaleY(1));const r=t.target.width()*t.target.scaleX(),o=t.target.height()*t.target.scaleY(),i=Math.min(1,I/r),n=Math.min(1,S/o),c=1-i,h=Math.min(c,Math.max(0,Math.round(-t.target.x())/r)),d=1-n,l=Math.min(d,Math.max(0,Math.round(-t.target.y())/o));t.target.setAttrs({x:-h*v.width,y:-l*v.height,scaleX:1,scaleY:1}),e.set({cropX:h,cropY:l,cropWidth:i,cropHeight:n})},N=()=>{"svg"!==e.type&&e.contentEditable&&setTimeout((()=>{e.toggleCropMode(!0)}))},j="svg"===e.type&&m,U="loading"===g&&!j,V="failed"===g,G=!U&&!V,$=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),J=G?e.a.opacity:0;(0,use_fadein_1.useFadeIn)(i,J);const K=e.selectable||"admin"===t.role,Q=(0,screen_1.isTouchDevice)();return react_1.default.createElement(react_1.default.Fragment,null,U&&react_1.default.createElement(LoadingPlaceholder,{element:e}),V&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:i,name:"element",id:e.id,image:Y,x:e.a.x,y:e.a.y,width:e.a.width||1,height:e.a.height||1,rotation:e.a.rotation,opacity:J,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,customCrop:D,listening:K,draggable:Q?e.draggable&&d:e.draggable,preventDefault:!Q||d,hideInExport:!e.showInExport,onMouseEnter:()=>{h(!0)},onMouseLeave:()=>{h(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDblClick:N,onDblTap:N,onTransformStart:()=>{o(!0),$.current={cropX:e.cropX,cropY:e.cropY,cropWidth:e.cropWidth,cropHeight:e.cropHeight}},onTransform:t=>{var a;const r=t.currentTarget,o=Math.abs(r.scaleX()-1)<1e-7?1:r.scaleX(),i=Math.abs(r.scaleY()-1)<1e-7?1:r.scaleY();r.scaleX(1),r.scaleY(1);const n=null===(a=t.target.getStage())||void 0===a?void 0:a.findOne("Transformer"),c=1-I/v.width,h=Math.min(c,Math.max(0,e.cropX)),d=1-S/v.height,l=Math.min(d,Math.max(0,e.cropY)),s=n.getActiveAnchor(),u=!(s.indexOf("middle")>=0||s.indexOf("center")>=0),g=!u&&o<1&&$.current.cropHeight>S/v.height;let f=u?e.cropWidth:e.cropWidth*o;g&&(f=e.cropWidth);const p=!u&&i<1&&$.current.cropWidth>I/v.width;let _=u?e.cropHeight:e.cropHeight*i;p&&(_=e.cropHeight),O&&(f=e.cropWidth,_=e.cropHeight),e.set({cropX:h,cropY:l,x:r.x(),y:r.y(),width:r.width()*o,height:r.height()*i,rotation:t.target.rotation(),cropWidth:Math.min(f,1-h),cropHeight:Math.min(_,1-l)})},onTransformEnd:t=>{const a=t.currentTarget;e.set({width:a.width(),height:a.height(),x:a.x(),y:a.y(),rotation:t.target.rotation(),cropWidth:I/v.width,cropHeight:S/v.height}),o(!1)}}),react_1.default.createElement(react_konva_1.Rect,{x:e.x,y:e.y,width:Math.max(e.a.width-e.borderSize,0),height:Math.max(e.a.height-e.borderSize,0),opacity:J,offsetX:-e.borderSize/2,offsetY:-e.borderSize/2,stroke:e.borderColor,strokeWidth:e.borderSize,listening:!1,visible:!!e.borderSize,rotation:e.rotation,cornerRadius:Math.max(0,L-e.borderSize),hideInExport:!e.showInExport}),e._cropModeEnabled&&react_1.default.createElement(react_konva_utils_1.Portal,{selector:".page-abs-container",enabled:!0},react_1.default.createElement(react_konva_1.Rect,{x:-window.innerWidth/t.scale,y:-window.innerWidth/t.scale,width:window.innerWidth/t.scale*3,height:window.innerWidth/t.scale*3,fill:"rgba(0,0,0,0.3)"}),react_1.default.createElement(react_konva_1.Image,{listening:!1,image:Y,x:e.x,y:e.y,width:e.a.width,height:e.a.height,rotation:e.rotation,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur}),react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,scaleX:A,scaleY:A},react_1.default.createElement(react_konva_1.Image,{image:v,ref:n,opacity:.4,draggable:!0,x:-e.cropX*v.width,y:-e.cropY*v.height,onDragMove:B,onTransform:B,onTouchMove:e=>{e.evt.preventDefault();const t=e.target.getStage().getPointersPositions();var a=t[0],r=t[1];const o=e.target;if(a&&!r&&!o.isDragging()&&F.current&&(o.startDrag(),F.current=!1),a&&r){konva_1.default.hitOnDragEnabled=!0,o.isDragging()&&(F.current=!0,o.stopDrag());const t=e.target.getAbsoluteTransform().copy();t.invert();var i={x:a.x,y:a.y},n={x:r.x,y:r.y};if(!q.current)return void(q.current=getCenter(i,n));var c=getCenter(i,n),h=getDistance(i,n);z.current||(z.current=h);const f=o.position();var d={x:c.x-f.x,y:c.y-f.y},l=h/z.current;o.scaleX(l),o.scaleY(l);const p=t.point(c),_=t.point(q.current);var s=p.x-_.x,u=p.y-_.y,g={x:Math.min(0,c.x-d.x*l+s),y:Math.min(0,c.y-d.y*l+u)};o.position(g),z.current=h,q.current=c,B(e)}},onTouchEnd:e=>{z.current=0,q.current=null,konva_1.default.hitOnDragEnabled=!1}}),react_1.default.createElement(react_konva_1.Transformer,{ref:W,anchorSize:20,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,rotateEnabled:!1,borderEnabled:!1,anchorCornerRadius:10,anchorStrokeWidth:2,borderStrokeWidth:2}),react_1.default.createElement(react_konva_1.Rect,{width:I,height:S,ref:H,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*v.width-1e-9&&(t.target.x(-e.cropX*v.width),t.target.scaleX(1)),t.target.y()<-e.cropY*v.height-1e-9&&(t.target.y(-e.cropY*v.height),t.target.scaleY(1));const a=Math.min(1,Math.max(0,e.cropX+t.target.x()/v.width)),r=Math.min(1,Math.max(0,t.target.y()/v.height+e.cropY)),o=t.target.width()*t.target.scaleX(),i=t.target.height()*t.target.scaleY(),n=Math.min(1-a,o/v.width),c=Math.min(1-r,i/v.height),h=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:h.x,y:h.y,cropX:a,cropY:r,cropWidth:n,cropHeight:c,width:Math.min(o*A,v.width*(1-a)*A),height:Math.min(i*A,v.height*(1-r)*A)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:T,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,visible:e.resizable,keepRatio:!1,rotateEnabled:!1,anchorFill:"rgb(240, 240, 240)",anchorStrokeWidth:2,borderStrokeWidth:2}))),(c||d)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a);var o=Object.getOwnPropertyDescriptor(t,a);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,r,o)}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&__createBinding(t,e,a);return __setModuleDefault(t,e),t},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ImageElement=exports.useImageLoader=exports.setImageLoaderHook=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),mobx_1=require("mobx"),react_konva_1=require("react-konva"),use_image_1=__importDefault(require("use-image")),konva_1=__importDefault(require("konva")),react_konva_utils_1=require("react-konva-utils"),highlighter_1=require("./highlighter"),loader_1=require("../utils/loader"),svg=__importStar(require("../utils/svg")),flags_1=require("../utils/flags"),canvas_1=require("../utils/canvas"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),screen_1=require("../utils/screen");function createCanvas(){return document.createElement("canvas")}async function getFixedUrl(e){if(!(e.indexOf("data:image/svg+xml")>=0||e.indexOf(".svg")>=0))return e;const t=await svg.urlToString(e),a=svg.fixSize(t);return svg.svgToURL(a)}const useSizeFixer=e=>{const[t,a]=react_1.default.useState(e);return react_1.default.useEffect((()=>{(async()=>{const r=await getFixedUrl(e);r!==t&&a(r)})()}),[e]),t};function getDistance(e,t){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}function getCenter(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}const useFlip=(e,t,a)=>{const r=react_1.default.useMemo((()=>{var r,o;const{flipX:i,flipY:n}=e,c="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0,h=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,d=(/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||h)&&c||e.maskSrc;if(!i&&!n&&!d)return t;if(!t||!t.width||!t.height)return null;const l=createCanvas();let s=1;"svg"===e.type&&(s=Math.max(e.a.width/t.width*a,e.a.height/t.height*a)),(0,canvas_1.trySetCanvasSize)(l,Math.max(t.width*s,1),Math.max(t.height*s,1));let u=i?-l.width:0,g=n?-l.height:0;return null===(r=l.getContext("2d"))||void 0===r||r.scale(i?-1:1,n?-1:1),null===(o=l.getContext("2d"))||void 0===o||o.drawImage(t,u,g,l.width,l.height),l}),[e.maskSrc,e.flipX,e.flipY,t,e.a.width,e.a.height,a]);return react_1.default.useEffect((()=>()=>{r&&"CANVAS"===r.nodeName&&konva_1.default.Util.releaseCanvas(r)}),[r]),r};function getCrop(e,t){const a=t.width/t.height;let r,o;a>=e.width/e.height?(r=e.width,o=e.width/a):(r=e.height*a,o=e.height);return{x:(e.width-r)/2,y:(e.height-o)/2,width:r,height:o}}function downsample(e,t,a,r,o,i,n){for(var c=new ImageData(t,a),h=new Int32Array(e.data.buffer),d=e.width,l=new Int32Array(c.data.buffer),s=c.width,u=t/i,g=a/n,f=Math.round(1/u),p=Math.round(1/g),_=f*p,m=0;m<c.height;m++)for(var w=0;w<s;w++){for(var v=r+Math.round(w/u)+(o+Math.round(m/g))*d,x=0,y=0,M=0,b=0,E=0;E<p;E++)for(var k=0;k<f;k++){var C=h[v+k+E*d];x+=C<<24>>>24,y+=C<<16>>>24,M+=C<<8>>>24,b+=C>>>24}x=Math.round(x/_),y=Math.round(y/_),M=Math.round(M/_),b=Math.round(b/_),l[w+m*s]=b<<24|M<<16|y<<8|x}return c}function downScaleCanvas(e,t){var a,r;const o=createCanvas();o.width=e.width,o.height=e.height;const i=Math.max(1,Math.floor(o.width*t)),n=Math.max(1,Math.floor(o.height*t));null===(a=o.getContext("2d"))||void 0===a||a.drawImage(e,0,0,o.width,o.height);const c=downsample(o.getContext("2d").getImageData(0,0,o.width,o.height),i,n,0,0,o.width,o.height);return o.width=i,o.height=n,null===(r=o.getContext("2d"))||void 0===r||r.putImageData(c,0,0),o}const useMask=(e,t)=>{const[a,r]=useImageHook(e.maskSrc,"anonymous"),o=e.maskSrc?r:"loaded";return(0,exports.useImageLoader)(o,e.maskSrc||"",e.id),react_1.default.useMemo((()=>{if(!a)return t;if(!t||!t.width||!t.height)return t;const r=createCanvas();r.width=Math.max(t.width,1),r.height=Math.max(t.height,1);const o=r.getContext("2d");if(!o)return t;o.drawImage(t,0,0),o.globalCompositeOperation="source-in";const i=getCrop(a,e);return o.drawImage(a,i.x,i.y,i.width,i.height,0,0,t.width,t.height),r}),[t,a,e.a.width,e.a.height])},limit=(e,t,a)=>Math.max(t,Math.min(a,e)),useCornerRadiusAndCrop=(e,t,a,r,o=0,i=!1,n=!0)=>{const c=Math.floor(limit(e.a.width*r,1,1e4)),h=Math.floor(limit(e.a.height*r,1,1e4)),d=Math.min(o*r,c/2,h/2),l=Math.max(e.a.width/a.width,e.a.height/a.height)*r,s=e.page._exportingOrRendering&&flags_1.flags.imageDownScalingEnabled&&l<1&&!i,u=0===a.x&&0===a.y&&a.width===(null==t?void 0:t.width)&&a.height===(null==t?void 0:t.height),g=react_1.default.useMemo((()=>{if(!t||!t.width||!t.height)return;return u&&0===d&&!s?void 0:createCanvas()}),[t,d,s,u]);return react_1.default.useLayoutEffect((()=>{if(!g||!t)return;(0,canvas_1.trySetCanvasSize)(g,c,h);const e=g.getContext("2d");if(!e)return;d&&(e.beginPath(),e.moveTo(d,0),e.lineTo(c-d,0),e.arc(c-d,d,d,3*Math.PI/2,0,!1),e.lineTo(c,h-d),e.arc(c-d,h-d,d,0,Math.PI/2,!1),e.lineTo(d,h),e.arc(d,h-d,d,Math.PI/2,Math.PI,!1),e.lineTo(0,d),e.arc(d,d,d,Math.PI,3*Math.PI/2,!1),e.clip());const r=s?downScaleCanvas(t,l):t,o=s?{x:Math.floor(a.x*l),y:Math.floor(a.y*l),width:Math.floor(a.width*l),height:Math.floor(a.height*l)}:a;e.drawImage(r,o.x,o.y,o.width,o.height,0,0,g.width,g.height)}),[g,e.a.width,e.a.height,a.x,a.y,a.width,a.height,o,r,i,e.page._exportingOrRendering,s]),react_1.default.useEffect((()=>()=>{g&&"CANVAS"===g.nodeName&&konva_1.default.Util.releaseCanvas(g)}),[g]),g||t},useClip=(e,t,a,r)=>{const o=useSizeFixer(e.clipSrc||""),[i,n]=useImageHook(o,"anonymous"),c=e.clipSrc?n:"loaded";(0,exports.useImageLoader)(c,e.clipSrc,e.id);const h=react_1.default.useMemo((()=>{if(t&&i)return createCanvas()}),[t,i]);react_1.default.useLayoutEffect((()=>{var r;if(!i)return;if(!t||!t.width||!t.height)return;if(!i||!i.width||!i.height)return;if(!h)return;const o=createCanvas(),n=Math.max(e.a.width/i.width*a,e.a.height/i.height*a);o.width=i.width*n,o.height=i.height*n,null===(r=o.getContext("2d"))||void 0===r||r.drawImage(i,0,0,o.width,o.height),h.width=Math.max(t.width,1),h.height=Math.max(t.height,1);const c=h.getContext("2d");c&&(c.save(),c.drawImage(o,0,0,t.width,t.height),konva_1.default.Util.releaseCanvas(o),c.globalCompositeOperation="source-in",c.drawImage(t,0,0,h.width,h.height),c.restore())}),[h,t,i,e.a.width,e.a.height,a,...r]);return e.clipSrc&&i?h:t},PLACEHOLDER_CANVAS=createCanvas(),LoadingPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t=Math.min(30,e.a.width/4,e.a.height/4),a=react_1.default.useRef(null);return react_1.default.useEffect((()=>{const e=a.current;if(!e)return;const t=new konva_1.default.Animation((t=>{e.rotate(((null==t?void 0:t.timeDiff)||0)/2)}),e.getLayer());return t.start(),()=>{t.stop()}})),react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.a.width,height:e.a.height,fill:"rgba(124, 173, 212, 0.8)"}),react_1.default.createElement(react_konva_1.Arc,{ref:a,x:e.a.width/2,y:e.a.height/2,fill:"white",outerRadius:Math.abs(t),innerRadius:Math.max(1,t-5),angle:270}))})),ErrorPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t="Can not load the image...",a=Math.max(10,Math.min(30,e.a.width/25));return react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.a.width,height:e.a.height,fill:"rgba(223, 102, 102, 0.8)"}),react_1.default.createElement(react_konva_1.Text,{text:t,fontSize:a,width:e.a.width,height:e.a.height,align:"center",fill:"white",verticalAlign:"middle",padding:5}))}));let useImageHook=use_image_1.default;const setImageLoaderHook=e=>{useImageHook=e};exports.setImageLoaderHook=setImageLoaderHook;const useImageWithVectorDetection=(e,t)=>{const[a,r]=useImageHook(e,t),[o,i]=react_1.default.useState(null);react_1.default.useEffect((()=>{if(!e)return void i(null);let a=!0;return(async()=>{try{const r=(await fetch(e,{method:"HEAD",credentials:"anonymous"===t?"omit":"include"})).headers.get("content-type");a&&i(null==r?void 0:r.includes("svg"))}catch(e){console.error("Error detecting image type:",e),a&&i(!1)}})(),()=>{a=!1}}),[e]);const n=null!==o;return[n?a:void 0,r,n?o:void 0]},useImageLoader=(e,t="",a="")=>{const r=react_1.default.useRef(),o=()=>{var e;null===(e=r.current)||void 0===e||e.call(r),r.current=void 0};react_1.default.useEffect((()=>o),[]),react_1.default.useLayoutEffect((()=>{const i=t.slice(0,100),n=`image with id ${a} url: ${i}`;"loading"!==e||r.current||(r.current=(0,loader_1.incrementLoader)(n)),"loading"!==e&&o(),"failed"===e&&(0,loader_1.triggerLoadError)(n)}),[e])};exports.useImageLoader=useImageLoader;const usePreviousImage=({image:e,status:t,type:a})=>{const r=react_1.default.useRef();react_1.default.useEffect((()=>{r.current=e||r.current}),[e]);return"failed"!==t||"failed"!==t&&"svg"===a?r.current:void 0},useImageSource=e=>{const[t,a]=react_1.default.useReducer((e=>e+1),0),r=react_1.default.useRef("loading"),o=react_1.default.useRef(e.src),i=react_1.default.useRef(e.src);return i.current!==e.src&&(i.current=e.src,r.current="loading"),react_1.default.useEffect((()=>{if("svg"!==e.type)return;if(!e.src)return;let t=!1;return(async()=>{r.current="loading",a();const i=await svg.urlToString(e.src),n=svg.fixSize(i),c=svg.replaceColors(n,e.colorsReplace);t||(o.current=c,r.current="loaded",a())})(),()=>{t=!0}}),[e.src,JSON.stringify(e.colorsReplace)]),"svg"!==e.type?[e.src,"loaded"]:[o.current,r.current]};exports.ImageElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{var a;const[r,o]=react_1.default.useState(!1),i=react_1.default.useRef(null),n=react_1.default.useRef(null),[c,h]=react_1.default.useState(!1),d=t.selectedShapes.indexOf(e)>=0,[l,s]=useImageSource(e),[u,g]=useImageHook(l,"anonymous"),f="svg"!==e.type||"loaded"===s?g:"loading";(0,exports.useImageLoader)(f,e.src,e.id);const p=e.page._exportingOrRendering?1:Math.max(1,t.scale),_=t._elementsPixelRatio*p,m=usePreviousImage({image:u,status:g,type:e.type}),w=useFlip(e,u||m,_),v=useMask(e,w)||PLACEHOLDER_CANVAS;let{cropX:x,cropY:y,cropWidth:M,cropHeight:b}=e;"loaded"!==g&&(x=y=0,M=b=1);const E=v.width*M,k=v.height*b,C=e.a.width/e.a.height;let I,S;const R=E/k,O="svg"===e.type;O?(I=E,S=k):C>=R?(I=E,S=E/C):(I=k*C,S=k);const D={x:v.width*x,y:v.height*y,width:I,height:S},L=null!==(a=e.cornerRadius)&&void 0!==a?a:0,P=e.page._exportingOrRendering?1:Math.min(2,t.scale),X=t._elementsPixelRatio*P;let Y=useClip(e,useCornerRadiusAndCrop(e,v,D,X,L,r||e._cropModeEnabled||"svg"===e.type,!0),X,[D,L,X]);const A=Math.max(e.a.width/I,e.a.height/S);react_1.default.useEffect((()=>{var t;if(!e._cropModeEnabled)return;const a=null===(t=i.current)||void 0===t?void 0:t.getStage();function r(t){e._cropModeEnabled&&t.target!==n.current&&e.toggleCropMode(!1)}function o(t){e._cropModeEnabled&&t.target.parentNode!==a.content&&e.toggleCropMode(!1)}return document.body.addEventListener("click",o),null==a||a.on("click",r),null==a||a.on("tap",r),()=>{document.body.removeEventListener("click",o),document.body.removeEventListener("touchstart",o),null==a||a.off("click",r),null==a||a.off("click",r)}}),[e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{if(r||e._cropModeEnabled)return;(0,apply_filters_1.applyFilter)(i.current,e);return(0,mobx_1.autorun)((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),{delay:100})}),[Y,e.page._exportingOrRendering,r,M,b,e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{var t;r||e._cropModeEnabled?null===(t=i.current)||void 0===t||t.clearCache():(0,apply_filters_1.applyFilter)(i.current,e)}),[r,e.a.width,e.a.height,e._cropModeEnabled]),react_1.default.useEffect((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),[e.shadowEnabled,e.shadowBlur,e.cornerRadius,e.shadowColor,e.shadowOffsetX,e.shadowOffsetY,e.shadowOpacity]);const H=react_1.default.useRef(null),T=react_1.default.useRef(null),W=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(T.current.nodes([H.current]),W.current.nodes([n.current]))}),[e._cropModeEnabled]);var q=react_1.default.useRef(null),z=react_1.default.useRef(0),F=react_1.default.useRef(!1);const B=t=>{var a;(null===(a=t.evt.touches)||void 0===a?void 0:a.length)>2&&t.target.stopDrag(),Math.round(t.target.x())>0&&(t.target.x(0),t.target.scaleX(1)),Math.round(t.target.y())>0&&(t.target.y(0),t.target.scaleY(1));const r=t.target.width()*t.target.scaleX(),o=t.target.height()*t.target.scaleY(),i=Math.min(1,I/r),n=Math.min(1,S/o),c=1-i,h=Math.min(c,Math.max(0,Math.round(-t.target.x())/r)),d=1-n,l=Math.min(d,Math.max(0,Math.round(-t.target.y())/o));t.target.setAttrs({x:-h*v.width,y:-l*v.height,scaleX:1,scaleY:1}),e.set({cropX:h,cropY:l,cropWidth:i,cropHeight:n})},N=()=>{"svg"!==e.type&&e.contentEditable&&setTimeout((()=>{e.toggleCropMode(!0)}))},j="svg"===e.type&&m,U="loading"===g&&!j,V="failed"===g,G=!U&&!V,$=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),J=G?e.a.opacity:0;(0,use_fadein_1.useFadeIn)(i,J);const K=e.selectable||"admin"===t.role,Q=(0,screen_1.isTouchDevice)();return react_1.default.createElement(react_1.default.Fragment,null,U&&react_1.default.createElement(LoadingPlaceholder,{element:e}),V&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:i,name:"element",id:e.id,image:Y,x:e.a.x,y:e.a.y,width:e.a.width||1,height:e.a.height||1,rotation:e.a.rotation,opacity:J,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,customCrop:D,listening:K,draggable:Q?e.draggable&&d:e.draggable,preventDefault:!Q||d,hideInExport:!e.showInExport,onMouseEnter:()=>{h(!0)},onMouseLeave:()=>{h(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDblClick:N,onDblTap:N,onTransformStart:()=>{o(!0),$.current={cropX:e.cropX,cropY:e.cropY,cropWidth:e.cropWidth,cropHeight:e.cropHeight}},onTransform:t=>{var a;const r=t.currentTarget,o=Math.abs(r.scaleX()-1)<1e-7?1:r.scaleX(),i=Math.abs(r.scaleY()-1)<1e-7?1:r.scaleY();r.scaleX(1),r.scaleY(1);const n=null===(a=t.target.getStage())||void 0===a?void 0:a.findOne("Transformer"),c=1-I/v.width,h=Math.min(c,Math.max(0,e.cropX)),d=1-S/v.height,l=Math.min(d,Math.max(0,e.cropY)),s=n.getActiveAnchor(),u=!(s.indexOf("middle")>=0||s.indexOf("center")>=0),g=!u&&o<1&&$.current.cropHeight>S/v.height;let f=u?e.cropWidth:e.cropWidth*o;g&&(f=e.cropWidth);const p=!u&&i<1&&$.current.cropWidth>I/v.width;let _=u?e.cropHeight:e.cropHeight*i;p&&(_=e.cropHeight),O&&(f=e.cropWidth,_=e.cropHeight),e.set({cropX:h,cropY:l,x:r.x(),y:r.y(),width:r.width()*o,height:r.height()*i,rotation:t.target.rotation(),cropWidth:Math.min(f,1-h),cropHeight:Math.min(_,1-l)})},onTransformEnd:t=>{const a=t.currentTarget;e.set({width:a.width(),height:a.height(),x:a.x(),y:a.y(),rotation:t.target.rotation(),cropWidth:I/v.width,cropHeight:S/v.height}),o(!1)}}),react_1.default.createElement(react_konva_1.Rect,{x:e.x,y:e.y,width:Math.max(e.a.width-e.borderSize,0),height:Math.max(e.a.height-e.borderSize,0),opacity:J,offsetX:-e.borderSize/2,offsetY:-e.borderSize/2,stroke:e.borderColor,strokeWidth:e.borderSize,listening:!1,visible:!!e.borderSize,rotation:e.rotation,cornerRadius:Math.max(0,L-e.borderSize),hideInExport:!e.showInExport}),e._cropModeEnabled&&react_1.default.createElement(react_konva_utils_1.Portal,{selector:".page-abs-container",enabled:!0},react_1.default.createElement(react_konva_1.Rect,{x:-window.innerWidth/t.scale,y:-window.innerWidth/t.scale,width:window.innerWidth/t.scale*3,height:window.innerWidth/t.scale*3,fill:"rgba(0,0,0,0.3)"}),react_1.default.createElement(react_konva_1.Image,{listening:!1,image:Y,x:e.x,y:e.y,width:e.a.width,height:e.a.height,rotation:e.rotation,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur}),react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,scaleX:A,scaleY:A},react_1.default.createElement(react_konva_1.Image,{image:v,ref:n,opacity:.4,draggable:!0,x:-e.cropX*v.width,y:-e.cropY*v.height,onDragMove:B,onTransform:B,onTouchMove:e=>{e.evt.preventDefault();const t=e.target.getStage().getPointersPositions();var a=t[0],r=t[1];const o=e.target;if(a&&!r&&!o.isDragging()&&F.current&&(o.startDrag(),F.current=!1),a&&r){konva_1.default.hitOnDragEnabled=!0,o.isDragging()&&(F.current=!0,o.stopDrag());const t=e.target.getAbsoluteTransform().copy();t.invert();var i={x:a.x,y:a.y},n={x:r.x,y:r.y};if(!q.current)return void(q.current=getCenter(i,n));var c=getCenter(i,n),h=getDistance(i,n);z.current||(z.current=h);const f=o.position();var d={x:c.x-f.x,y:c.y-f.y},l=h/z.current;o.scaleX(l),o.scaleY(l);const p=t.point(c),_=t.point(q.current);var s=p.x-_.x,u=p.y-_.y,g={x:Math.min(0,c.x-d.x*l+s),y:Math.min(0,c.y-d.y*l+u)};o.position(g),z.current=h,q.current=c,B(e)}},onTouchEnd:e=>{z.current=0,q.current=null,konva_1.default.hitOnDragEnabled=!1}}),react_1.default.createElement(react_konva_1.Transformer,{ref:W,anchorSize:20,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,rotateEnabled:!1,borderEnabled:!1,anchorCornerRadius:10,anchorStrokeWidth:2,borderStrokeWidth:2}),react_1.default.createElement(react_konva_1.Rect,{width:I,height:S,ref:H,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*v.width-1e-9&&(t.target.x(-e.cropX*v.width),t.target.scaleX(1)),t.target.y()<-e.cropY*v.height-1e-9&&(t.target.y(-e.cropY*v.height),t.target.scaleY(1));const a=Math.min(1,Math.max(0,e.cropX+t.target.x()/v.width)),r=Math.min(1,Math.max(0,t.target.y()/v.height+e.cropY)),o=t.target.width()*t.target.scaleX(),i=t.target.height()*t.target.scaleY(),n=Math.min(1-a,o/v.width),c=Math.min(1-r,i/v.height),h=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:h.x,y:h.y,cropX:a,cropY:r,cropWidth:n,cropHeight:c,width:Math.min(o*A,v.width*(1-a)*A),height:Math.min(i*A,v.height*(1-r)*A)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:T,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,visible:e.resizable,keepRatio:!1,rotateEnabled:!1,anchorFill:"rgb(240, 240, 240)",anchorStrokeWidth:2,borderStrokeWidth:2}))),(c||d)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
@@ -6,7 +6,7 @@ type Props = {
6
6
  element: VideoElementType;
7
7
  };
8
8
  export declare const setImageLoaderHook: (customImageLoaderHook: any) => void;
9
- export declare const useImageLoader: (status: string, id: string) => void;
9
+ export declare const useImageLoader: (status: string, src: string, id: string) => void;
10
10
  export declare const VideoElement: (({ element, store }: Props) => React.JSX.Element) & {
11
11
  displayName: string;
12
12
  };
@@ -1 +1 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,n)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(t,e,r);return __setModuleDefault(t,e),t},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.VideoElement=exports.useImageLoader=exports.setImageLoaderHook=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),mobx_1=require("mobx"),react_konva_1=require("react-konva"),use_image_1=__importDefault(require("use-image")),konva_1=__importDefault(require("konva")),react_konva_utils_1=require("react-konva-utils"),highlighter_1=require("./highlighter"),loader_1=require("../utils/loader"),svg=__importStar(require("../utils/svg")),flags_1=require("../utils/flags"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),screen_1=require("../utils/screen");function createCanvas(){return document.createElement("canvas")}async function getFixedUrl(e){if(!(e.indexOf("data:image/svg+xml")>=0||e.indexOf(".svg")>=0))return e;const t=await svg.urlToString(e),r=svg.fixSize(t);return svg.svgToURL(r)}const useSizeFixer=e=>{const[t,r]=react_1.default.useState(e);return react_1.default.useEffect((()=>{(async()=>{const a=await getFixedUrl(e);a!==t&&r(a)})()}),[e]),t},playIcon=new window.Image;playIcon.src=svg.svgToURL('\n <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path opacity="0.6" d="M4 5.49683V18.5032C4 20.05 5.68077 21.0113 7.01404 20.227L18.0694 13.7239C19.384 12.9506 19.384 11.0494 18.0694 10.2761L7.01404 3.77296C5.68077 2.98869 4 3.95 4 5.49683Z" fill="white"/>\n <path d="M4 5.49683V18.5032C4 20.05 5.68077 21.0113 7.01404 20.227L18.0694 13.7239C19.384 12.9506 19.384 11.0494 18.0694 10.2761L7.01404 3.77296C5.68077 2.98869 4 3.95 4 5.49683Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n');const pauseIcon=new window.Image;pauseIcon.src=svg.svgToURL('\n <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path opacity="0.6" d="M14 19L14 5C14 3.89543 14.8954 3 16 3L17 3C18.1046 3 19 3.89543 19 5L19 19C19 20.1046 18.1046 21 17 21L16 21C14.8954 21 14 20.1046 14 19Z" fill="white"/>\n <path opacity="0.6" d="M10 19L10 5C10 3.89543 9.10457 3 8 3L7 3C5.89543 3 5 3.89543 5 5L5 19C5 20.1046 5.89543 21 7 21L8 21C9.10457 21 10 20.1046 10 19Z" fill="white"/>\n <path d="M14 19L14 5C14 3.89543 14.8954 3 16 3L17 3C18.1046 3 19 3.89543 19 5L19 19C19 20.1046 18.1046 21 17 21L16 21C14.8954 21 14 20.1046 14 19Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n <path d="M10 19L10 5C10 3.89543 9.10457 3 8 3L7 3C5.89543 3 5 3.89543 5 5L5 19C5 20.1046 5.89543 21 7 21L8 21C9.10457 21 10 20.1046 10 19Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n');const useFlip=(e,t,r)=>{const a=react_1.default.useMemo((()=>{var a,n;const{flipX:i,flipY:o}=e,c="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0,d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1&&c||e.maskSrc;if(!i&&!o&&!d)return t;if(!t||!t.width||!t.height)return null;const l=createCanvas();let h=1;"svg"===e.type&&(h=Math.max(e.width/t.width*r,e.height/t.height*r)),l.width=Math.max(t.width*h,1),l.height=Math.max(t.height*h,1);let u=i?-l.width:0,s=o?-l.height:0;return null===(a=l.getContext("2d"))||void 0===a||a.scale(i?-1:1,o?-1:1),null===(n=l.getContext("2d"))||void 0===n||n.drawImage(t,u,s,l.width,l.height),l}),[e.maskSrc,e.flipX,e.flipY,t,e.width,e.height,r]);return react_1.default.useEffect((()=>()=>{a&&"CANVAS"===a.nodeName&&konva_1.default.Util.releaseCanvas(a)}),[a]),a};function getCrop(e,t){const r=t.width/t.height;let a,n;r>=e.width/e.height?(a=e.width,n=e.width/r):(a=e.height*r,n=e.height);return{x:(e.width-a)/2,y:(e.height-n)/2,width:a,height:n}}function downsample(e,t,r,a,n,i,o){for(var c=new ImageData(t,r),d=new Int32Array(e.data.buffer),l=e.width,h=new Int32Array(c.data.buffer),u=c.width,s=t/i,g=r/o,f=Math.round(1/s),p=Math.round(1/g),_=f*p,m=0;m<c.height;m++)for(var v=0;v<u;v++){for(var w=a+Math.round(v/s)+(n+Math.round(m/g))*l,x=0,y=0,M=0,E=0,b=0;b<p;b++)for(var C=0;C<f;C++){var L=d[w+C+b*l];x+=L<<24>>>24,y+=L<<16>>>24,M+=L<<8>>>24,E+=L>>>24}x=Math.round(x/_),y=Math.round(y/_),M=Math.round(M/_),E=Math.round(E/_),h[v+m*u]=E<<24|M<<16|y<<8|x}return c}function downScaleCanvas(e,t){var r,a;const n=createCanvas();n.width=e.width,n.height=e.height,null===(r=n.getContext("2d"))||void 0===r||r.drawImage(e,0,0,n.width,n.height);const i=downsample(n.getContext("2d").getImageData(0,0,n.width,n.height),Math.floor(n.width*t),Math.floor(n.height*t),0,0,n.width,n.height);return n.width=Math.floor(n.width*t),n.height=Math.floor(n.height*t),null===(a=n.getContext("2d"))||void 0===a||a.putImageData(i,0,0),n}const useCornerRadiusAndCrop=(e,t,r,a,n=0,i=!1)=>{const o=Math.floor(Math.max(e.width*a,1)),c=Math.floor(Math.max(e.height*a,1)),d=Math.min(n*a,o/2,c/2),l=Math.max(e.width/r.width,e.height/r.height)*a,h=e.page._exportingOrRendering&&flags_1.flags.imageDownScalingEnabled&&l<1&&!i,u=0===r.x&&0===r.y&&r.width===(null==t?void 0:t.width)&&r.height===(null==t?void 0:t.height),s=react_1.default.useMemo((()=>{if(!t||!t.width||!t.height)return;return u&&0===d&&!h?void 0:createCanvas()}),[t,d,h,u]),g=()=>{if(!s||!t)return;s.width=o,s.height=c;const e=s.getContext("2d");if(!e)return;d&&(e.beginPath(),e.moveTo(d,0),e.lineTo(o-d,0),e.arc(o-d,d,d,3*Math.PI/2,0,!1),e.lineTo(o,c-d),e.arc(o-d,c-d,d,0,Math.PI/2,!1),e.lineTo(d,c),e.arc(d,c-d,d,Math.PI/2,Math.PI,!1),e.lineTo(0,d),e.arc(d,d,d,Math.PI,3*Math.PI/2,!1),e.clip());const a=h?downScaleCanvas(t,l):t,n=h?{x:Math.floor(r.x*l),y:Math.floor(r.y*l),width:Math.floor(r.width*l),height:Math.floor(r.height*l)}:r;e.drawImage(a,n.x,n.y,n.width,n.height,0,0,s.width,s.height)};return react_1.default.useLayoutEffect((()=>{g()}),[s,e.width,e.height,r.x,r.y,r.width,r.height,n,a,i,e.page._exportingOrRendering,h]),react_1.default.useEffect((()=>()=>{s&&"CANVAS"===s.nodeName&&konva_1.default.Util.releaseCanvas(s)}),[s]),[s||t,g]},useClip=(e,t,r,a)=>{const n=useSizeFixer(e.clipSrc||""),[i,o]=useImageHook(n,"anonymous"),c=e.clipSrc?o:"loaded";(0,exports.useImageLoader)(c,e.id+"-clip");const d=react_1.default.useMemo((()=>{if(t&&i)return createCanvas()}),[t,i]);function l(){var a;if(!i)return;if(!t||!t.width||!t.height)return;if(!i||!i.width||!i.height)return;if(!d)return;const n=createCanvas(),o=Math.max(e.width/i.width*r,e.height/i.height*r);n.width=i.width*o,n.height=i.height*o,null===(a=n.getContext("2d"))||void 0===a||a.drawImage(i,0,0,n.width,n.height),d.width=Math.max(t.width,1),d.height=Math.max(t.height,1);const c=d.getContext("2d");c&&(c.save(),c.drawImage(n,0,0,t.width,t.height),konva_1.default.Util.releaseCanvas(n),c.globalCompositeOperation="source-in",c.drawImage(t,0,0,d.width,d.height),c.restore())}react_1.default.useLayoutEffect((()=>{l()}),[d,t,i,e.width,e.height,r,...a]);return[e.clipSrc&&i?d:t,l]},PLACEHOLDER_CANVAS=createCanvas(),LoadingPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t=Math.min(30,e.width/4,e.height/4),r=react_1.default.useRef(null);return react_1.default.useEffect((()=>{const e=r.current;if(!e)return;const t=new konva_1.default.Animation((t=>{e.rotate(((null==t?void 0:t.timeDiff)||0)/2)}),e.getLayer());return t.start(),()=>{t.stop()}})),react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.a.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.width,height:e.height,fill:"rgba(124, 173, 212, 0.8)"}),react_1.default.createElement(react_konva_1.Arc,{ref:r,x:e.width/2,y:e.height/2,fill:"white",outerRadius:Math.abs(t),innerRadius:Math.max(1,t-5),angle:270}))})),ErrorPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t="Can not load the video...",r=Math.max(10,Math.min(30,e.width/25));return react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.a.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.width,height:e.height,fill:"rgba(223, 102, 102, 0.8)"}),react_1.default.createElement(react_konva_1.Text,{text:t,fontSize:r,width:e.width,height:e.height,align:"center",fill:"white",verticalAlign:"middle",padding:5}))}));let useImageHook=use_image_1.default;const setImageLoaderHook=e=>{useImageHook=e};exports.setImageLoaderHook=setImageLoaderHook;const useImageLoader=(e,t)=>{const r=react_1.default.useRef(),a=()=>{var e;null===(e=r.current)||void 0===e||e.call(r),r.current=void 0};react_1.default.useEffect((()=>a),[]),react_1.default.useLayoutEffect((()=>{"loading"!==e||r.current||(r.current=(0,loader_1.incrementLoader)(`video ${t}`)),"loading"!==e&&a(),"failed"===e&&(0,loader_1.triggerLoadError)(`video ${t}`)}),[e])};exports.useImageLoader=useImageLoader;const usePreviousImage=({image:e,status:t,type:r})=>{const a=react_1.default.useRef();react_1.default.useEffect((()=>{a.current=e||a.current}),[e]);return"failed"!==t||"failed"!==t&&"svg"===r?a.current:void 0};function isBuffered(e,t){for(var r=e.buffered,a=0;a<r.length;a++)if(t>=r.start(a)&&t<=r.end(a))return!0;return!1}const useImageSource=e=>{const[t,r]=react_1.default.useReducer((e=>e+1),0),a=react_1.default.useRef("loading"),n=react_1.default.useRef(e.src),i=react_1.default.useRef(e.src);return i.current!==e.src&&(i.current=e.src,a.current="loading"),react_1.default.useEffect((()=>{if("image"===e.type)return;if(!e.src)return;let t=!1;return(async()=>{a.current="loading",r();const i=await svg.urlToString(e.src),o=svg.fixSize(i),c=svg.replaceColors(o,e.colorsReplace);t||(n.current=c,a.current="loaded",r())})(),()=>{t=!0}}),[e.src,JSON.stringify(e.colorsReplace)]),"image"===e.type?[e.src,"loaded"]:[n.current,a.current]};function useVideo(e,t,r){const a=react_1.default.useRef("loading"),n=react_1.default.useRef(null),[i,o]=react_1.default.useState(0),c=react_1.default.useRef(),d=react_1.default.useRef(),l=react_1.default.useRef();return c.current===e&&d.current===t&&l.current===r||(a.current="loading",n.current=void 0,c.current=e,d.current=t,l.current=r),react_1.default.useLayoutEffect((function(){if(e){var i=document.createElement("video");return i.addEventListener("canplay",c),i.addEventListener("error",d),t&&(i.crossOrigin=t),r&&(i.referrerpolicy=r),i.src=e,function(){i.removeEventListener("canplay",c),i.removeEventListener("error",d)}}function c(){a.current="loaded",n.current=i,n.current.currentTime=0,o(Math.random()),n.current.removeEventListener("canplay",c)}function d(e){a.current="failed",n.current=void 0,o(Math.random())}}),[e,t,r]),[n.current,a.current]}exports.VideoElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{var r;const[a,n]=react_1.default.useState(!1),i=react_1.default.useRef(null),o=react_1.default.useRef(null),[c,d]=react_1.default.useState(!1),l=t.selectedShapes.indexOf(e)>=0,[h,u]=react_1.default.useState(!1),[s,g]=useVideo(e.src,"anonymous"),f=t.activePage===e.page;(0,exports.useImageLoader)(g,e.id+"-video"),s&&(s.width=s.videoWidth,s.height=s.videoHeight);const p=s||PLACEHOLDER_CANVAS;react_1.default.useEffect((()=>{s&&t.history.ignore((()=>{e.set({duration:1e3*s.duration})}))}),[s]),react_1.default.useEffect((()=>{var r;if(!s)return;const a=f&&(t.isPlaying||h);if(!a)return void s.pause();a&&(s.currentTime=e.startTime*s.duration,s.play());const n=new konva_1.default.Animation((()=>{X()}),null===(r=i.current)||void 0===r?void 0:r.getLayer());n.start();const o=()=>{u(!1),s.currentTime=e.startTime*s.duration},c=()=>{s.currentTime>=e.endTime*s.duration&&(s.pause(),s.currentTime=e.startTime*s.duration,u(!1))};return s.addEventListener("ended",o),s.addEventListener("timeupdate",c),()=>{n.stop(),s.removeEventListener("ended",o),s.removeEventListener("timeupdate",c)}}),[s,h,t.isPlaying,f]),react_1.default.useEffect((()=>{s&&(s.volume=e.volume)}),[s,e.volume]);const _=react_1.default.useRef();react_1.default.useEffect((()=>{const r=(0,mobx_1.autorun)((()=>{var r,a;if(s){const n=(t.currentTime-e.page.startTime)%e.duration;if(Math.abs(1e3*s.currentTime-n)>500||!t.isPlaying){const r=n/1e3;r!==s.currentTime&&(s.currentTime=r);4!==s.readyState&&!t.isPlaying&&!_.current&&(_.current=(0,loader_1.incrementLoader)(`video ${e.id}`))}X(),null===(a=null===(r=i.current)||void 0===r?void 0:r.getLayer())||void 0===a||a.batchDraw()}}));return()=>{r(),_.current&&(_.current(),_.current=null)}}),[t,s]),react_1.default.useEffect((()=>{if(!s)return;const t=()=>{var t,r;4!==s.readyState&&e.page._exportingOrRendering||_.current&&(X(),null===(r=null===(t=i.current)||void 0===t?void 0:t.getLayer())||void 0===r||r.batchDraw(),_.current(),_.current=null)};let r;return e.page._exportingOrRendering&&(r=setInterval(t,50)),s.addEventListener("timeupdate",t),s.addEventListener("canplay",t),()=>{clearInterval(r),s.removeEventListener("timeupdate",t),s.removeEventListener("canplay",t)}}),[e.page._exportingOrRendering,s,e.id,loader_1.incrementLoader]);let{cropX:m,cropY:v,cropWidth:w,cropHeight:x}=e;"loaded"!==g&&(m=v=0,w=x=1);const y=p.width*w,M=p.height*x,E=e.width/e.height;let b,C;const L=y/M,k="svg"===e.type;k?(b=y,C=M):E>=L?(b=y,C=y/E):(b=M*E,C=M);const I={x:p.width*m,y:p.height*v,width:b,height:C},R=null!==(r=e.cornerRadius)&&void 0!==r?r:0,[S,T]=useCornerRadiusAndCrop(e,p,I,t._elementsPixelRatio,R,a||e._cropModeEnabled||"svg"===e.type);let[O,P]=useClip(e,S,t._elementsPixelRatio,[I,R,t._elementsPixelRatio]);function X(){T(),P()}const Y=Math.max(e.width/b,e.height/C);react_1.default.useEffect((()=>{var t;if(!e._cropModeEnabled)return;const r=null===(t=i.current)||void 0===t?void 0:t.getStage();function a(t){e._cropModeEnabled&&t.target!==o.current&&e.toggleCropMode(!1)}function n(t){e._cropModeEnabled&&t.target.parentNode!==r.content&&e.toggleCropMode(!1)}return document.body.addEventListener("click",n),null==r||r.on("click",a),null==r||r.on("tap",a),()=>{document.body.removeEventListener("click",n),document.body.removeEventListener("touchstart",n),null==r||r.off("click",a),null==r||r.off("click",a)}}),[e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{if(a||e._cropModeEnabled)return;(0,apply_filters_1.applyFilter)(i.current,e);return(0,mobx_1.autorun)((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),{delay:100})}),[p,a,w,x,e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{var t;a||e._cropModeEnabled?null===(t=i.current)||void 0===t||t.clearCache():(0,apply_filters_1.applyFilter)(i.current,e)}),[a,e.width,e.height,e._cropModeEnabled]),react_1.default.useEffect((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),[e.shadowEnabled,e.shadowBlur,e.cornerRadius,e.shadowColor,e.shadowOffsetX,e.shadowOffsetY,e.shadowOpacity]);const A=react_1.default.useRef(null),D=react_1.default.useRef(null),H=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(D.current.nodes([A.current]),H.current.nodes([o.current]))}),[e._cropModeEnabled]);const W=t=>{Math.round(t.target.x())>0&&(t.target.x(0),t.target.scaleX(1)),Math.round(t.target.y())>0&&(t.target.y(0),t.target.scaleY(1));const r=t.target.width()*t.target.scaleX(),a=t.target.height()*t.target.scaleY(),n=Math.min(1,b/r),i=Math.min(1,C/a),o=1-n,c=Math.min(o,Math.max(0,Math.round(-t.target.x())/r)),d=1-i,l=Math.min(d,Math.max(0,Math.round(-t.target.y())/a));t.target.setAttrs({x:-c*p.width,y:-l*p.height,scaleX:1,scaleY:1}),e.set({cropX:c,cropY:l,cropWidth:n,cropHeight:i})},q=()=>{"svg"!==e.type&&e.contentEditable&&setTimeout((()=>{e.toggleCropMode(!0)}))},F="loading"===g,z="failed"===g,B=!F&&!z,j=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),V=B?e.a.opacity:0;(0,use_fadein_1.useFadeIn)(i,V);const N=e.selectable||"admin"===t.role,U=(0,screen_1.isTouchDevice)();return react_1.default.createElement(react_1.default.Fragment,null,F&&react_1.default.createElement(LoadingPlaceholder,{element:e}),z&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:i,name:"element",id:e.id,image:O,x:e.a.x,y:e.a.y,width:e.a.width||1,height:e.a.height||1,rotation:e.a.rotation,opacity:V,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,customCrop:I,listening:N,draggable:U?e.draggable&&l:e.draggable,preventDefault:!U||l,hideInExport:!e.showInExport,onMouseEnter:()=>{d(!0)},onMouseLeave:()=>{d(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDblClick:q,onDblTap:q,onTransformStart:()=>{n(!0),j.current={cropX:e.cropX,cropY:e.cropY,cropWidth:e.cropWidth,cropHeight:e.cropHeight}},onTransform:t=>{var r;const a=t.currentTarget,n=Math.abs(a.scaleX()-1)<1e-7?1:a.scaleX(),i=Math.abs(a.scaleY()-1)<1e-7?1:a.scaleY();a.scaleX(1),a.scaleY(1);const o=null===(r=t.target.getStage())||void 0===r?void 0:r.findOne("Transformer"),c=1-b/p.width,d=Math.min(c,Math.max(0,e.cropX)),l=1-C/p.height,h=Math.min(l,Math.max(0,e.cropY)),u=o.getActiveAnchor(),s=!(u.indexOf("middle")>=0||u.indexOf("center")>=0),g=!s&&n<1&&j.current.cropHeight>C/p.height;let f=s?e.cropWidth:e.cropWidth*n;g&&(f=e.cropWidth);const _=!s&&i<1&&j.current.cropWidth>b/p.width;let m=s?e.cropHeight:e.cropHeight*i;_&&(m=e.cropHeight),k&&(f=e.cropWidth,m=e.cropHeight),e.set({cropX:d,cropY:h,x:a.x(),y:a.y(),width:a.width()*n,height:a.height()*i,rotation:t.target.rotation(),cropWidth:Math.min(f,1-d),cropHeight:Math.min(m,1-h)})},onTransformEnd:t=>{const r=t.currentTarget;e.set({width:r.width(),height:r.height(),x:r.x(),y:r.y(),rotation:t.target.rotation(),cropWidth:b/p.width,cropHeight:C/p.height}),n(!1)}}),react_1.default.createElement(react_konva_1.Rect,{x:e.a.x,y:e.a.y,width:Math.max(e.a.width-e.borderSize,0),height:Math.max(e.a.height-e.borderSize,0),opacity:V,offsetX:-e.borderSize/2,offsetY:-e.borderSize/2,stroke:e.borderColor,strokeWidth:e.borderSize,listening:!1,visible:!!e.borderSize,rotation:e.rotation,cornerRadius:Math.max(0,R-e.borderSize),hideInExport:!e.showInExport}),!h&&!t.isPlaying&&react_1.default.createElement(react_konva_1.Image,{image:playIcon,x:e.a.x+e.a.width/2-15/t.scale,y:e.a.y+e.a.height/2-15/t.scale,width:30/t.scale,height:30/t.scale,hideInExport:!0,onClick:()=>{u(!0)}}),h&&!t.isPlaying&&react_1.default.createElement(react_konva_1.Image,{image:pauseIcon,x:e.a.x+e.a.width/2-15/t.scale,y:e.a.y+e.a.height/2-15/t.scale,width:30/t.scale,height:30/t.scale,hideInExport:!0,onClick:()=>{u(!1)}}),e._cropModeEnabled&&react_1.default.createElement(react_konva_utils_1.Portal,{selector:".page-abs-container",enabled:!0},react_1.default.createElement(react_konva_1.Rect,{x:-window.innerWidth/t.scale,y:-window.innerWidth/t.scale,width:window.innerWidth/t.scale*3,height:window.innerWidth/t.scale*3,fill:"rgba(0,0,0,0.3)"}),react_1.default.createElement(react_konva_1.Image,{listening:!1,image:O,x:e.a.x,y:e.a.y,width:e.a.width,height:e.a.height,rotation:e.a.rotation,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur}),react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.a.rotation,scaleX:Y,scaleY:Y},react_1.default.createElement(react_konva_1.Image,{image:p,ref:o,opacity:.4,draggable:!0,x:-e.cropX*p.width,y:-e.cropY*p.height,onDragMove:W,onTransform:W}),react_1.default.createElement(react_konva_1.Transformer,{ref:H,anchorSize:20,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,rotateEnabled:!1,borderEnabled:!1,anchorCornerRadius:10,anchorStrokeWidth:2,borderStrokeWidth:2}),react_1.default.createElement(react_konva_1.Rect,{width:b,height:C,ref:A,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*p.width-1e-9&&(t.target.x(-e.cropX*p.width),t.target.scaleX(1)),t.target.y()<-e.cropY*p.height-1e-9&&(t.target.y(-e.cropY*p.height),t.target.scaleY(1));const r=Math.min(1,Math.max(0,e.cropX+t.target.x()/p.width)),a=Math.min(1,Math.max(0,t.target.y()/p.height+e.cropY)),n=t.target.width()*t.target.scaleX(),i=t.target.height()*t.target.scaleY(),o=Math.min(1-r,n/p.width),c=Math.min(1-a,i/p.height),d=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:d.x,y:d.y,cropX:r,cropY:a,cropWidth:o,cropHeight:c,width:Math.min(n*Y,p.width*(1-r)*Y),height:Math.min(i*Y,p.height*(1-a)*Y)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:D,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,keepRatio:!1,rotateEnabled:!1,anchorFill:"rgb(240, 240, 240)",anchorStrokeWidth:2,borderStrokeWidth:2}))),(c||l)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,n)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(t,e,r);return __setModuleDefault(t,e),t},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.VideoElement=exports.useImageLoader=exports.setImageLoaderHook=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),mobx_1=require("mobx"),react_konva_1=require("react-konva"),use_image_1=__importDefault(require("use-image")),konva_1=__importDefault(require("konva")),react_konva_utils_1=require("react-konva-utils"),highlighter_1=require("./highlighter"),loader_1=require("../utils/loader"),svg=__importStar(require("../utils/svg")),flags_1=require("../utils/flags"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),screen_1=require("../utils/screen");function createCanvas(){return document.createElement("canvas")}async function getFixedUrl(e){if(!(e.indexOf("data:image/svg+xml")>=0||e.indexOf(".svg")>=0))return e;const t=await svg.urlToString(e),r=svg.fixSize(t);return svg.svgToURL(r)}const useSizeFixer=e=>{const[t,r]=react_1.default.useState(e);return react_1.default.useEffect((()=>{(async()=>{const a=await getFixedUrl(e);a!==t&&r(a)})()}),[e]),t},playIcon=new window.Image;playIcon.src=svg.svgToURL('\n <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path opacity="0.6" d="M4 5.49683V18.5032C4 20.05 5.68077 21.0113 7.01404 20.227L18.0694 13.7239C19.384 12.9506 19.384 11.0494 18.0694 10.2761L7.01404 3.77296C5.68077 2.98869 4 3.95 4 5.49683Z" fill="white"/>\n <path d="M4 5.49683V18.5032C4 20.05 5.68077 21.0113 7.01404 20.227L18.0694 13.7239C19.384 12.9506 19.384 11.0494 18.0694 10.2761L7.01404 3.77296C5.68077 2.98869 4 3.95 4 5.49683Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n');const pauseIcon=new window.Image;pauseIcon.src=svg.svgToURL('\n <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path opacity="0.6" d="M14 19L14 5C14 3.89543 14.8954 3 16 3L17 3C18.1046 3 19 3.89543 19 5L19 19C19 20.1046 18.1046 21 17 21L16 21C14.8954 21 14 20.1046 14 19Z" fill="white"/>\n <path opacity="0.6" d="M10 19L10 5C10 3.89543 9.10457 3 8 3L7 3C5.89543 3 5 3.89543 5 5L5 19C5 20.1046 5.89543 21 7 21L8 21C9.10457 21 10 20.1046 10 19Z" fill="white"/>\n <path d="M14 19L14 5C14 3.89543 14.8954 3 16 3L17 3C18.1046 3 19 3.89543 19 5L19 19C19 20.1046 18.1046 21 17 21L16 21C14.8954 21 14 20.1046 14 19Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n <path d="M10 19L10 5C10 3.89543 9.10457 3 8 3L7 3C5.89543 3 5 3.89543 5 5L5 19C5 20.1046 5.89543 21 7 21L8 21C9.10457 21 10 20.1046 10 19Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n');const useFlip=(e,t,r)=>{const a=react_1.default.useMemo((()=>{var a,n;const{flipX:i,flipY:o}=e,c="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0,d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1&&c||e.maskSrc;if(!i&&!o&&!d)return t;if(!t||!t.width||!t.height)return null;const l=createCanvas();let h=1;"svg"===e.type&&(h=Math.max(e.width/t.width*r,e.height/t.height*r)),l.width=Math.max(t.width*h,1),l.height=Math.max(t.height*h,1);let u=i?-l.width:0,s=o?-l.height:0;return null===(a=l.getContext("2d"))||void 0===a||a.scale(i?-1:1,o?-1:1),null===(n=l.getContext("2d"))||void 0===n||n.drawImage(t,u,s,l.width,l.height),l}),[e.maskSrc,e.flipX,e.flipY,t,e.width,e.height,r]);return react_1.default.useEffect((()=>()=>{a&&"CANVAS"===a.nodeName&&konva_1.default.Util.releaseCanvas(a)}),[a]),a};function getCrop(e,t){const r=t.width/t.height;let a,n;r>=e.width/e.height?(a=e.width,n=e.width/r):(a=e.height*r,n=e.height);return{x:(e.width-a)/2,y:(e.height-n)/2,width:a,height:n}}function downsample(e,t,r,a,n,i,o){for(var c=new ImageData(t,r),d=new Int32Array(e.data.buffer),l=e.width,h=new Int32Array(c.data.buffer),u=c.width,s=t/i,g=r/o,f=Math.round(1/s),p=Math.round(1/g),_=f*p,m=0;m<c.height;m++)for(var w=0;w<u;w++){for(var v=a+Math.round(w/s)+(n+Math.round(m/g))*l,x=0,y=0,M=0,E=0,b=0;b<p;b++)for(var C=0;C<f;C++){var L=d[v+C+b*l];x+=L<<24>>>24,y+=L<<16>>>24,M+=L<<8>>>24,E+=L>>>24}x=Math.round(x/_),y=Math.round(y/_),M=Math.round(M/_),E=Math.round(E/_),h[w+m*u]=E<<24|M<<16|y<<8|x}return c}function downScaleCanvas(e,t){var r,a;const n=createCanvas();n.width=e.width,n.height=e.height,null===(r=n.getContext("2d"))||void 0===r||r.drawImage(e,0,0,n.width,n.height);const i=downsample(n.getContext("2d").getImageData(0,0,n.width,n.height),Math.floor(n.width*t),Math.floor(n.height*t),0,0,n.width,n.height);return n.width=Math.floor(n.width*t),n.height=Math.floor(n.height*t),null===(a=n.getContext("2d"))||void 0===a||a.putImageData(i,0,0),n}const useCornerRadiusAndCrop=(e,t,r,a,n=0,i=!1)=>{const o=Math.floor(Math.max(e.width*a,1)),c=Math.floor(Math.max(e.height*a,1)),d=Math.min(n*a,o/2,c/2),l=Math.max(e.width/r.width,e.height/r.height)*a,h=e.page._exportingOrRendering&&flags_1.flags.imageDownScalingEnabled&&l<1&&!i,u=0===r.x&&0===r.y&&r.width===(null==t?void 0:t.width)&&r.height===(null==t?void 0:t.height),s=react_1.default.useMemo((()=>{if(!t||!t.width||!t.height)return;return u&&0===d&&!h?void 0:createCanvas()}),[t,d,h,u]),g=()=>{if(!s||!t)return;s.width=o,s.height=c;const e=s.getContext("2d");if(!e)return;d&&(e.beginPath(),e.moveTo(d,0),e.lineTo(o-d,0),e.arc(o-d,d,d,3*Math.PI/2,0,!1),e.lineTo(o,c-d),e.arc(o-d,c-d,d,0,Math.PI/2,!1),e.lineTo(d,c),e.arc(d,c-d,d,Math.PI/2,Math.PI,!1),e.lineTo(0,d),e.arc(d,d,d,Math.PI,3*Math.PI/2,!1),e.clip());const a=h?downScaleCanvas(t,l):t,n=h?{x:Math.floor(r.x*l),y:Math.floor(r.y*l),width:Math.floor(r.width*l),height:Math.floor(r.height*l)}:r;e.drawImage(a,n.x,n.y,n.width,n.height,0,0,s.width,s.height)};return react_1.default.useLayoutEffect((()=>{g()}),[s,e.width,e.height,r.x,r.y,r.width,r.height,n,a,i,e.page._exportingOrRendering,h]),react_1.default.useEffect((()=>()=>{s&&"CANVAS"===s.nodeName&&konva_1.default.Util.releaseCanvas(s)}),[s]),[s||t,g]},useClip=(e,t,r,a)=>{const n=useSizeFixer(e.clipSrc||""),[i,o]=useImageHook(n,"anonymous"),c=e.clipSrc?o:"loaded";(0,exports.useImageLoader)(c,e.clipSrc,e.id);const d=react_1.default.useMemo((()=>{if(t&&i)return createCanvas()}),[t,i]);function l(){var a;if(!i)return;if(!t||!t.width||!t.height)return;if(!i||!i.width||!i.height)return;if(!d)return;const n=createCanvas(),o=Math.max(e.width/i.width*r,e.height/i.height*r);n.width=i.width*o,n.height=i.height*o,null===(a=n.getContext("2d"))||void 0===a||a.drawImage(i,0,0,n.width,n.height),d.width=Math.max(t.width,1),d.height=Math.max(t.height,1);const c=d.getContext("2d");c&&(c.save(),c.drawImage(n,0,0,t.width,t.height),konva_1.default.Util.releaseCanvas(n),c.globalCompositeOperation="source-in",c.drawImage(t,0,0,d.width,d.height),c.restore())}react_1.default.useLayoutEffect((()=>{l()}),[d,t,i,e.width,e.height,r,...a]);return[e.clipSrc&&i?d:t,l]},PLACEHOLDER_CANVAS=createCanvas(),LoadingPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t=Math.min(30,e.width/4,e.height/4),r=react_1.default.useRef(null);return react_1.default.useEffect((()=>{const e=r.current;if(!e)return;const t=new konva_1.default.Animation((t=>{e.rotate(((null==t?void 0:t.timeDiff)||0)/2)}),e.getLayer());return t.start(),()=>{t.stop()}})),react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.a.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.width,height:e.height,fill:"rgba(124, 173, 212, 0.8)"}),react_1.default.createElement(react_konva_1.Arc,{ref:r,x:e.width/2,y:e.height/2,fill:"white",outerRadius:Math.abs(t),innerRadius:Math.max(1,t-5),angle:270}))})),ErrorPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t="Can not load the video...",r=Math.max(10,Math.min(30,e.width/25));return react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.a.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.width,height:e.height,fill:"rgba(223, 102, 102, 0.8)"}),react_1.default.createElement(react_konva_1.Text,{text:t,fontSize:r,width:e.width,height:e.height,align:"center",fill:"white",verticalAlign:"middle",padding:5}))}));let useImageHook=use_image_1.default;const setImageLoaderHook=e=>{useImageHook=e};exports.setImageLoaderHook=setImageLoaderHook;const useImageLoader=(e,t,r)=>{const a=react_1.default.useRef(),n=()=>{var e;null===(e=a.current)||void 0===e||e.call(a),a.current=void 0};react_1.default.useEffect((()=>n),[]),react_1.default.useLayoutEffect((()=>{const i=t.slice(0,100),o=`video with id ${r} url: ${i}`;"loading"!==e||a.current||(a.current=(0,loader_1.incrementLoader)(o)),"loading"!==e&&n(),"failed"===e&&(0,loader_1.triggerLoadError)(o)}),[e])};exports.useImageLoader=useImageLoader;const usePreviousImage=({image:e,status:t,type:r})=>{const a=react_1.default.useRef();react_1.default.useEffect((()=>{a.current=e||a.current}),[e]);return"failed"!==t||"failed"!==t&&"svg"===r?a.current:void 0};function isBuffered(e,t){for(var r=e.buffered,a=0;a<r.length;a++)if(t>=r.start(a)&&t<=r.end(a))return!0;return!1}const useImageSource=e=>{const[t,r]=react_1.default.useReducer((e=>e+1),0),a=react_1.default.useRef("loading"),n=react_1.default.useRef(e.src),i=react_1.default.useRef(e.src);return i.current!==e.src&&(i.current=e.src,a.current="loading"),react_1.default.useEffect((()=>{if("image"===e.type)return;if(!e.src)return;let t=!1;return(async()=>{a.current="loading",r();const i=await svg.urlToString(e.src),o=svg.fixSize(i),c=svg.replaceColors(o,e.colorsReplace);t||(n.current=c,a.current="loaded",r())})(),()=>{t=!0}}),[e.src,JSON.stringify(e.colorsReplace)]),"image"===e.type?[e.src,"loaded"]:[n.current,a.current]};function useVideo(e,t,r){const a=react_1.default.useRef("loading"),n=react_1.default.useRef(null),[i,o]=react_1.default.useState(0),c=react_1.default.useRef(),d=react_1.default.useRef(),l=react_1.default.useRef();return c.current===e&&d.current===t&&l.current===r||(a.current="loading",n.current=void 0,c.current=e,d.current=t,l.current=r),react_1.default.useLayoutEffect((function(){if(e){var i=document.createElement("video");return i.addEventListener("canplay",c),i.addEventListener("error",d),t&&(i.crossOrigin=t),r&&(i.referrerpolicy=r),i.src=e,function(){i.removeEventListener("canplay",c),i.removeEventListener("error",d)}}function c(){a.current="loaded",n.current=i,n.current.currentTime=0,o(Math.random()),n.current.removeEventListener("canplay",c)}function d(e){a.current="failed",n.current=void 0,o(Math.random())}}),[e,t,r]),[n.current,a.current]}exports.VideoElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{var r;const[a,n]=react_1.default.useState(!1),i=react_1.default.useRef(null),o=react_1.default.useRef(null),[c,d]=react_1.default.useState(!1),l=t.selectedShapes.indexOf(e)>=0,[h,u]=react_1.default.useState(!1),[s,g]=useVideo(e.src,"anonymous"),f=t.activePage===e.page;(0,exports.useImageLoader)(g,e.src,e.id),s&&(s.width=s.videoWidth,s.height=s.videoHeight);const p=s||PLACEHOLDER_CANVAS;react_1.default.useEffect((()=>{s&&t.history.ignore((()=>{e.set({duration:1e3*s.duration})}))}),[s]),react_1.default.useEffect((()=>{var r;if(!s)return;const a=f&&(t.isPlaying||h);if(!a)return void s.pause();a&&(s.currentTime=e.startTime*s.duration,s.play());const n=new konva_1.default.Animation((()=>{X()}),null===(r=i.current)||void 0===r?void 0:r.getLayer());n.start();const o=()=>{u(!1),s.currentTime=e.startTime*s.duration},c=()=>{s.currentTime>=e.endTime*s.duration&&(s.pause(),s.currentTime=e.startTime*s.duration,u(!1))};return s.addEventListener("ended",o),s.addEventListener("timeupdate",c),()=>{n.stop(),s.removeEventListener("ended",o),s.removeEventListener("timeupdate",c)}}),[s,h,t.isPlaying,f]),react_1.default.useEffect((()=>{s&&(s.volume=e.volume)}),[s,e.volume]);const _=react_1.default.useRef();react_1.default.useEffect((()=>{const r=(0,mobx_1.autorun)((()=>{var r,a;if(s){const n=(t.currentTime-e.page.startTime)%e.duration;if(Math.abs(1e3*s.currentTime-n)>500||!t.isPlaying){const r=n/1e3;r!==s.currentTime&&(s.currentTime=r);4!==s.readyState&&!t.isPlaying&&!_.current&&(_.current=(0,loader_1.incrementLoader)(`video ${e.id}`))}X(),null===(a=null===(r=i.current)||void 0===r?void 0:r.getLayer())||void 0===a||a.batchDraw()}}));return()=>{r(),_.current&&(_.current(),_.current=null)}}),[t,s]),react_1.default.useEffect((()=>{if(!s)return;const t=()=>{var t,r;4!==s.readyState&&e.page._exportingOrRendering||_.current&&(X(),null===(r=null===(t=i.current)||void 0===t?void 0:t.getLayer())||void 0===r||r.batchDraw(),_.current(),_.current=null)};let r;return e.page._exportingOrRendering&&(r=setInterval(t,50)),s.addEventListener("timeupdate",t),s.addEventListener("canplay",t),()=>{clearInterval(r),s.removeEventListener("timeupdate",t),s.removeEventListener("canplay",t)}}),[e.page._exportingOrRendering,s,e.id,loader_1.incrementLoader]);let{cropX:m,cropY:w,cropWidth:v,cropHeight:x}=e;"loaded"!==g&&(m=w=0,v=x=1);const y=p.width*v,M=p.height*x,E=e.width/e.height;let b,C;const L=y/M,k="svg"===e.type;k?(b=y,C=M):E>=L?(b=y,C=y/E):(b=M*E,C=M);const I={x:p.width*m,y:p.height*w,width:b,height:C},R=null!==(r=e.cornerRadius)&&void 0!==r?r:0,[S,T]=useCornerRadiusAndCrop(e,p,I,t._elementsPixelRatio,R,a||e._cropModeEnabled||"svg"===e.type);let[O,P]=useClip(e,S,t._elementsPixelRatio,[I,R,t._elementsPixelRatio]);function X(){T(),P()}const Y=Math.max(e.width/b,e.height/C);react_1.default.useEffect((()=>{var t;if(!e._cropModeEnabled)return;const r=null===(t=i.current)||void 0===t?void 0:t.getStage();function a(t){e._cropModeEnabled&&t.target!==o.current&&e.toggleCropMode(!1)}function n(t){e._cropModeEnabled&&t.target.parentNode!==r.content&&e.toggleCropMode(!1)}return document.body.addEventListener("click",n),null==r||r.on("click",a),null==r||r.on("tap",a),()=>{document.body.removeEventListener("click",n),document.body.removeEventListener("touchstart",n),null==r||r.off("click",a),null==r||r.off("click",a)}}),[e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{if(a||e._cropModeEnabled)return;(0,apply_filters_1.applyFilter)(i.current,e);return(0,mobx_1.autorun)((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),{delay:100})}),[p,a,v,x,e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{var t;a||e._cropModeEnabled?null===(t=i.current)||void 0===t||t.clearCache():(0,apply_filters_1.applyFilter)(i.current,e)}),[a,e.width,e.height,e._cropModeEnabled]),react_1.default.useEffect((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),[e.shadowEnabled,e.shadowBlur,e.cornerRadius,e.shadowColor,e.shadowOffsetX,e.shadowOffsetY,e.shadowOpacity]);const A=react_1.default.useRef(null),D=react_1.default.useRef(null),H=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(D.current.nodes([A.current]),H.current.nodes([o.current]))}),[e._cropModeEnabled]);const W=t=>{Math.round(t.target.x())>0&&(t.target.x(0),t.target.scaleX(1)),Math.round(t.target.y())>0&&(t.target.y(0),t.target.scaleY(1));const r=t.target.width()*t.target.scaleX(),a=t.target.height()*t.target.scaleY(),n=Math.min(1,b/r),i=Math.min(1,C/a),o=1-n,c=Math.min(o,Math.max(0,Math.round(-t.target.x())/r)),d=1-i,l=Math.min(d,Math.max(0,Math.round(-t.target.y())/a));t.target.setAttrs({x:-c*p.width,y:-l*p.height,scaleX:1,scaleY:1}),e.set({cropX:c,cropY:l,cropWidth:n,cropHeight:i})},q=()=>{"svg"!==e.type&&e.contentEditable&&setTimeout((()=>{e.toggleCropMode(!0)}))},F="loading"===g,z="failed"===g,B=!F&&!z,j=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),V=B?e.a.opacity:0;(0,use_fadein_1.useFadeIn)(i,V);const N=e.selectable||"admin"===t.role,U=(0,screen_1.isTouchDevice)();return react_1.default.createElement(react_1.default.Fragment,null,F&&react_1.default.createElement(LoadingPlaceholder,{element:e}),z&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:i,name:"element",id:e.id,image:O,x:e.a.x,y:e.a.y,width:e.a.width||1,height:e.a.height||1,rotation:e.a.rotation,opacity:V,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,customCrop:I,listening:N,draggable:U?e.draggable&&l:e.draggable,preventDefault:!U||l,hideInExport:!e.showInExport,onMouseEnter:()=>{d(!0)},onMouseLeave:()=>{d(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDblClick:q,onDblTap:q,onTransformStart:()=>{n(!0),j.current={cropX:e.cropX,cropY:e.cropY,cropWidth:e.cropWidth,cropHeight:e.cropHeight}},onTransform:t=>{var r;const a=t.currentTarget,n=Math.abs(a.scaleX()-1)<1e-7?1:a.scaleX(),i=Math.abs(a.scaleY()-1)<1e-7?1:a.scaleY();a.scaleX(1),a.scaleY(1);const o=null===(r=t.target.getStage())||void 0===r?void 0:r.findOne("Transformer"),c=1-b/p.width,d=Math.min(c,Math.max(0,e.cropX)),l=1-C/p.height,h=Math.min(l,Math.max(0,e.cropY)),u=o.getActiveAnchor(),s=!(u.indexOf("middle")>=0||u.indexOf("center")>=0),g=!s&&n<1&&j.current.cropHeight>C/p.height;let f=s?e.cropWidth:e.cropWidth*n;g&&(f=e.cropWidth);const _=!s&&i<1&&j.current.cropWidth>b/p.width;let m=s?e.cropHeight:e.cropHeight*i;_&&(m=e.cropHeight),k&&(f=e.cropWidth,m=e.cropHeight),e.set({cropX:d,cropY:h,x:a.x(),y:a.y(),width:a.width()*n,height:a.height()*i,rotation:t.target.rotation(),cropWidth:Math.min(f,1-d),cropHeight:Math.min(m,1-h)})},onTransformEnd:t=>{const r=t.currentTarget;e.set({width:r.width(),height:r.height(),x:r.x(),y:r.y(),rotation:t.target.rotation(),cropWidth:b/p.width,cropHeight:C/p.height}),n(!1)}}),react_1.default.createElement(react_konva_1.Rect,{x:e.a.x,y:e.a.y,width:Math.max(e.a.width-e.borderSize,0),height:Math.max(e.a.height-e.borderSize,0),opacity:V,offsetX:-e.borderSize/2,offsetY:-e.borderSize/2,stroke:e.borderColor,strokeWidth:e.borderSize,listening:!1,visible:!!e.borderSize,rotation:e.rotation,cornerRadius:Math.max(0,R-e.borderSize),hideInExport:!e.showInExport}),!h&&!t.isPlaying&&react_1.default.createElement(react_konva_1.Image,{image:playIcon,x:e.a.x+e.a.width/2-15/t.scale,y:e.a.y+e.a.height/2-15/t.scale,width:30/t.scale,height:30/t.scale,hideInExport:!0,onClick:()=>{u(!0)}}),h&&!t.isPlaying&&react_1.default.createElement(react_konva_1.Image,{image:pauseIcon,x:e.a.x+e.a.width/2-15/t.scale,y:e.a.y+e.a.height/2-15/t.scale,width:30/t.scale,height:30/t.scale,hideInExport:!0,onClick:()=>{u(!1)}}),e._cropModeEnabled&&react_1.default.createElement(react_konva_utils_1.Portal,{selector:".page-abs-container",enabled:!0},react_1.default.createElement(react_konva_1.Rect,{x:-window.innerWidth/t.scale,y:-window.innerWidth/t.scale,width:window.innerWidth/t.scale*3,height:window.innerWidth/t.scale*3,fill:"rgba(0,0,0,0.3)"}),react_1.default.createElement(react_konva_1.Image,{listening:!1,image:O,x:e.a.x,y:e.a.y,width:e.a.width,height:e.a.height,rotation:e.a.rotation,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur}),react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.a.rotation,scaleX:Y,scaleY:Y},react_1.default.createElement(react_konva_1.Image,{image:p,ref:o,opacity:.4,draggable:!0,x:-e.cropX*p.width,y:-e.cropY*p.height,onDragMove:W,onTransform:W}),react_1.default.createElement(react_konva_1.Transformer,{ref:H,anchorSize:20,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,rotateEnabled:!1,borderEnabled:!1,anchorCornerRadius:10,anchorStrokeWidth:2,borderStrokeWidth:2}),react_1.default.createElement(react_konva_1.Rect,{width:b,height:C,ref:A,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*p.width-1e-9&&(t.target.x(-e.cropX*p.width),t.target.scaleX(1)),t.target.y()<-e.cropY*p.height-1e-9&&(t.target.y(-e.cropY*p.height),t.target.scaleY(1));const r=Math.min(1,Math.max(0,e.cropX+t.target.x()/p.width)),a=Math.min(1,Math.max(0,t.target.y()/p.height+e.cropY)),n=t.target.width()*t.target.scaleX(),i=t.target.height()*t.target.scaleY(),o=Math.min(1-r,n/p.width),c=Math.min(1-a,i/p.height),d=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:d.x,y:d.y,cropX:r,cropY:a,cropWidth:o,cropHeight:c,width:Math.min(n*Y,p.width*(1-r)*Y),height:Math.min(i*Y,p.height*(1-a)*Y)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:D,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,keepRatio:!1,rotateEnabled:!1,anchorFill:"rgb(240, 240, 240)",anchorStrokeWidth:2,borderStrokeWidth:2}))),(c||l)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
@@ -25,7 +25,7 @@ type UnknownElementType = {
25
25
  type: string;
26
26
  [key: string]: any;
27
27
  };
28
- type ElementType = ElementUnion | UnknownElementType;
28
+ export type ElementType = ElementUnion | UnknownElementType;
29
29
  export type ElementsArray = ElementType[];
30
30
  export declare const GroupElement: import("mobx-state-tree").IModelType<{
31
31
  id: import("mobx-state-tree").ISimpleType<string>;
@@ -1,5 +1,5 @@
1
1
  import { Instance } from 'mobx-state-tree';
2
- import { NodeType } from './node-model';
2
+ import { ElementType } from './group-model';
3
3
  export declare const Page: import("mobx-state-tree").IModelType<{
4
4
  id: import("mobx-state-tree").ISimpleType<string>;
5
5
  children: import("mobx-state-tree").IArrayType<any>;
@@ -30,7 +30,7 @@ export declare const Page: import("mobx-state-tree").IModelType<{
30
30
  select(): void;
31
31
  addElement(attrs: any, { skipSelect }?: {
32
32
  skipSelect?: boolean;
33
- }): NodeType | undefined;
33
+ }): ElementType;
34
34
  canMoveElementsUp(ids: Array<string>): false;
35
35
  moveElementsUp(ids: Array<string>): void;
36
36
  canMoveElementsTop(ids: Array<string>): any;