polotno 0.36.2 → 0.36.6
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.
- package/canvas/image-element.js +1 -1
- package/canvas/page.js +1 -1
- package/canvas/text-element.js +1 -1
- package/canvas/use-transformer-snap.js +1 -1
- package/canvas/workspace.js +1 -1
- package/model/store.d.ts +12 -6
- package/model/store.js +1 -1
- package/package.json +1 -1
- package/polotno.bundle.js +3 -3
- package/utils/loader.d.ts +1 -1
- package/utils/loader.js +1 -1
package/canvas/image-element.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[a]}})}: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")),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein");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},useFlip=(e,t,a)=>react_1.default.useMemo((()=>{var r,o;const{flipX:i,flipY:n}=e,h="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0;if(!i&&!n&&!h)return t;if(!t||!t.width||!t.height)return null;const c=document.createElement("canvas");let d=1;"svg"===e.type&&(d=Math.max(e.width/t.width*a,e.height/t.height*a)),c.width=Math.max(t.width*d,1),c.height=Math.max(t.height*d,1);let l=i?-c.width:0,s=n?-c.height:0;return null===(r=c.getContext("2d"))||void 0===r||r.scale(i?-1:1,n?-1:1),null===(o=c.getContext("2d"))||void 0===o||o.drawImage(t,l,s,c.width,c.height),c}),[e.flipX,e.flipY,t,e.width,e.height,a]);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 downScaleCanvas(e,t){var a;const r=document.createElement("canvas");if(r.width=e.width,r.height=e.height,null===(a=r.getContext("2d"))||void 0===a||a.drawImage(e,0,0,r.width,r.height),!(t<1&&t>0))throw"scale must be a positive number <1 ";var o=t*t,i=r.width,n=r.height,h=Math.floor(i*t),c=Math.floor(n*t),d=0,l=0,s=0,u=0,g=0,f=0,m=0,_=0,p=0,w=0,x=0,v=0,y=0,M=0,E=0,b=!1,k=!1,I=r.getContext("2d").getImageData(0,0,i,n).data,S=new Float32Array(3*h*c),C=0,L=0,P=0;for(l=0;l<n;l++)for(f=3*(p=0|(g=l*t))*h,(k=p!=(0|g+t))&&(M=p+1-g,E=g+t-p-1),d=0;d<i;d++,s+=4)m=f+3*(_=0|(u=d*t)),(b=_!=(0|u+t))&&(v=_+1-u,y=u+t-_-1),C=I[s],L=I[s+1],P=I[s+2],b||k?b&&!k?(w=v*t,S[m]+=C*w,S[m+1]+=L*w,S[m+2]+=P*w,x=y*t,S[m+3]+=C*x,S[m+4]+=L*x,S[m+5]+=P*x):k&&!b?(w=M*t,S[m]+=C*w,S[m+1]+=L*w,S[m+2]+=P*w,x=E*t,S[m+3*h]+=C*x,S[m+3*h+1]+=L*x,S[m+3*h+2]+=P*x):(w=v*M,S[m]+=C*w,S[m+1]+=L*w,S[m+2]+=P*w,x=y*M,S[m+3]+=C*x,S[m+4]+=L*x,S[m+5]+=P*x,x=v*E,S[m+3*h]+=C*x,S[m+3*h+1]+=L*x,S[m+3*h+2]+=P*x,x=y*E,S[m+3*h+3]+=C*x,S[m+3*h+4]+=L*x,S[m+3*h+5]+=P*x):(S[m]+=C*o,S[m+1]+=L*o,S[m+2]+=P*o);var R=document.createElement("canvas");R.width=h,R.height=c;var H=R.getContext("2d"),T=H.getImageData(0,0,h,c),X=T.data,Y=0;for(s=0,m=0;Y<h*c;s+=3,m+=4,Y++)X[m]=Math.ceil(S[s]),X[m+1]=Math.ceil(S[s+1]),X[m+2]=Math.ceil(S[s+2]),X[m+3]=Math.ceil(S[s+3]);return H.putImageData(T,0,0),R}const useMask=(e,t)=>{const[a,r]=useImageHook(e.maskSrc,"anonymous"),o=e.maskSrc?r:"loaded";return(0,exports.useImageLoader)(o),react_1.default.useMemo((()=>{if(!a)return t;if(!t||!t.width||!t.height)return t;const r=document.createElement("canvas");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.width,e.height])},useCornerRadius=(e,t,a,r,o=0,i=!1)=>{const n=react_1.default.useMemo((()=>{if(t&&t.width&&t.height)return document.createElement("canvas")}),[t]);return react_1.default.useLayoutEffect((()=>{if(!n||!t)return;const i=Math.max(e.width*r,1),h=Math.max(e.height*r,1);n.width=i,n.height=h;const c=n.getContext("2d");if(!c)return;const d=Math.min(o*r,i/2,h/2);d&&(c.beginPath(),c.moveTo(d,0),c.lineTo(i-d,0),c.arc(i-d,d,d,3*Math.PI/2,0,!1),c.lineTo(i,h-d),c.arc(i-d,h-d,d,0,Math.PI/2,!1),c.lineTo(d,h),c.arc(d,h-d,d,Math.PI/2,Math.PI,!1),c.lineTo(0,d),c.arc(d,d,d,Math.PI,3*Math.PI/2,!1),c.clip());Math.max(e.width/a.width,e.height/a.height);const l=t,s=a;c.drawImage(l,s.x,s.y,s.width,s.height,0,0,n.width,n.height)}),[n,e.width,e.height,a.x,a.y,a.width,a.height,o,r,i]),n},useClip=(e,t,a,r)=>{const o=useSizeFixer(e.clipSrc||""),[i]=useImageHook(o,"anonymous"),n=react_1.default.useMemo((()=>{if(t&&i)return document.createElement("canvas")}),[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(!n)return;const o=document.createElement("canvas"),h=Math.max(e.width/i.width*a,e.height/i.height*a);o.width=i.width*h,o.height=i.height*h,null===(r=o.getContext("2d"))||void 0===r||r.drawImage(i,0,0,o.width,o.height),n.width=Math.max(t.width,1),n.height=Math.max(t.height,1);const c=n.getContext("2d");c&&(c.save(),c.drawImage(o,0,0,t.width,t.height),c.globalCompositeOperation="source-in",c.drawImage(t,0,0,n.width,n.height),c.restore())}),[n,t,i,e.width,e.height,a,...r]);return e.clipSrc&&i?n:t},PLACEHOLDER_CANVAS=document.createElement("canvas"),LoadingPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t=Math.min(30,e.width/4,e.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.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:a,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 image...",a=Math.max(10,Math.min(30,e.width/t.length));return react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,listening:!1,opacity:e.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:a,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 usePreviousValue=e=>{const t=react_1.default.useRef(e);return react_1.default.useEffect((()=>{t.current=e}),[e]),t.current},useImageLoader=e=>{const t=usePreviousValue(e);react_1.default.useLayoutEffect((()=>{"loading"===e&&(0,loader_1.incrementLoader)(),"loading"!==t||"loaded"!==e&&"failed"!==e||(0,loader_1.decrementLoader)()}),[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};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),[h,c]=react_1.default.useState(!1),d=t.selectedElements.indexOf(e)>=0,[l,s]=useImageHook(e.__finalSrc||e.src,"anonymous");(0,exports.useImageLoader)(s);const u="svg"!==e.type||e.__isLoaded?s:"loading";(0,exports.useImageLoader)(u);const g=usePreviousImage({image:l,status:s,type:e.type}),f=useMask(e,useFlip(e,l||g,t._elementsPixelRatio))||PLACEHOLDER_CANVAS;let{cropX:m,cropY:_,cropWidth:p,cropHeight:w}=e;"loaded"!==s&&(m=_=0,p=w=1);const x=f.width*p,v=f.height*w,y=e.width/e.height;let M,E;const b=x/v,k="svg"===e.type;k?(M=x,E=v):y>=b?(M=x,E=x/y):(M=v*y,E=v);const I={x:f.width*m,y:f.height*_,width:M,height:E},S=null!==(a=e.cornerRadius)&&void 0!==a?a:0;let C=useClip(e,useCornerRadius(e,f,I,t._elementsPixelRatio,S,r||e._cropModeEnabled),t._elementsPixelRatio,[I,S,t._elementsPixelRatio]);const L=Math.max(e.width/M,e.height/E);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&&"CANVAS"!==t.target.nodeName&&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})}),[f,r,p,w,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.width,e.height,e._cropModeEnabled]),react_1.default.useEffect((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),[e.shadowEnabled,e.shadowBlur]);const P=react_1.default.useRef(null),R=react_1.default.useRef(null),H=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(R.current.nodes([P.current]),H.current.nodes([n.current]))}),[e._cropModeEnabled]);const T=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 a=t.target.width()*t.target.scaleX(),r=t.target.height()*t.target.scaleY(),o=Math.min(1,M/a),i=Math.min(1,E/r),n=1-o,h=Math.min(n,Math.max(0,Math.round(-t.target.x())/a)),c=1-i,d=Math.min(c,Math.max(0,Math.round(-t.target.y())/r));t.target.setAttrs({x:-h*f.width,y:-d*f.height,scaleX:1,scaleY:1}),e.set({cropX:h,cropY:d,cropWidth:o,cropHeight:i})},X=()=>{"svg"!==e.type&&(e.locked||setTimeout((()=>{e.toggleCropMode(!0)})))},Y="svg"===e.type&&g,D="loading"===s&&!Y,O="failed"===s,A=!D&&!O,W=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),F=A?e.opacity:0;(0,use_fadein_1.useFadeIn)(i,F);const q=e.selectable||"admin"===t.role;return react_1.default.createElement(react_1.default.Fragment,null,D&&react_1.default.createElement(LoadingPlaceholder,{element:e}),O&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:i,name:"element",id:e.id,image:C,x:e.x,y:e.y,width:e.width||1,height:e.height||1,rotation:e.rotation,opacity:F,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,customCrop:I,listening:q,draggable:!e.locked,hideInExport:!e.showInExport,onMouseEnter:()=>{c(!0)},onMouseLeave:()=>{c(!1)},onDragStart:()=>{t.history.startTransaction()},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:a=>{e.set({x:a.target.x(),y:a.target.y()}),t.history.endTransaction()},onDblClick:X,onDblTap:X,onTransformStart:()=>{o(!0),t.history.startTransaction(),W.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"),h=1-M/f.width,c=Math.min(h,Math.max(0,e.cropX)),d=1-E/f.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&&W.current.cropHeight>E/f.height;let m=u?e.cropWidth:e.cropWidth*o;g&&(m=e.cropWidth);const _=!u&&i<1&&W.current.cropWidth>M/f.width;let p=u?e.cropHeight:e.cropHeight*i;_&&(p=e.cropHeight),k&&(m=e.cropWidth,p=e.cropHeight),e.set({cropX:c,cropY:l,x:r.x(),y:r.y(),width:r.width()*o,height:r.height()*i,rotation:t.target.rotation(),cropWidth:Math.min(m,1-c),cropHeight:Math.min(p,1-l)})},onTransformEnd:a=>{const r=a.currentTarget;e.set({width:r.width(),height:r.height(),x:r.x(),y:r.y(),rotation:a.target.rotation(),cropWidth:M/f.width,cropHeight:E/f.height}),o(!1),t.history.endTransaction()}}),react_1.default.createElement(react_konva_1.Rect,{x:e.x,y:e.y,width:e.width-e.borderSize,height:e.height-e.borderSize,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,S-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:-1500,y:-1500,width:4500,height:4500,fill:"rgba(0,0,0,0.3)"}),react_1.default.createElement(react_konva_1.Image,{listening:!1,image:C,x:e.x,y:e.y,width:e.width,height:e.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:L,scaleY:L},react_1.default.createElement(react_konva_1.Image,{image:f,ref:n,opacity:.4,draggable:!0,x:-e.cropX*f.width,y:-e.cropY*f.height,onDragMove:T,onTransform:T}),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:M,height:E,ref:P,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*f.width-1e-9&&(t.target.x(-e.cropX*f.width),t.target.scaleX(1)),t.target.y()<-e.cropY*f.height-1e-9&&(t.target.y(-e.cropY*f.height),t.target.scaleY(1));const a=Math.min(1,Math.max(0,e.cropX+t.target.x()/f.width)),r=Math.min(1,Math.max(0,t.target.y()/f.height+e.cropY)),o=t.target.width()*t.target.scaleX(),i=t.target.height()*t.target.scaleY(),n=Math.min(1-a,o/f.width),h=Math.min(1-r,i/f.height),c=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:c.x,y:c.y,cropX:a,cropY:r,cropWidth:n,cropHeight:h,width:Math.min(o*L,f.width*(1-a)*L),height:Math.min(i*L,f.height*(1-r)*L)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:R,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}))),(h||d)&&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),Object.defineProperty(e,a,{enumerable:!0,get:function(){return t[r]}})}: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.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")),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein");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},useFlip=(e,t,r)=>react_1.default.useMemo((()=>{var a,o;const{flipX:i,flipY:n}=e,h="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0;if(!i&&!n&&!h)return t;if(!t||!t.width||!t.height)return null;const c=document.createElement("canvas");let d=1;"svg"===e.type&&(d=Math.max(e.width/t.width*r,e.height/t.height*r)),c.width=Math.max(t.width*d,1),c.height=Math.max(t.height*d,1);let l=i?-c.width:0,u=n?-c.height:0;return null===(a=c.getContext("2d"))||void 0===a||a.scale(i?-1:1,n?-1:1),null===(o=c.getContext("2d"))||void 0===o||o.drawImage(t,l,u,c.width,c.height),c}),[e.flipX,e.flipY,t,e.width,e.height,r]);function getCrop(e,t){const r=t.width/t.height;let a,o;r>=e.width/e.height?(a=e.width,o=e.width/r):(a=e.height*r,o=e.height);return{x:(e.width-a)/2,y:(e.height-o)/2,width:a,height:o}}function downsample(e,t,r,a,o,i,n){for(var h=new ImageData(t,r),c=new Int32Array(e.data.buffer),d=e.width,l=new Int32Array(h.data.buffer),u=h.width,s=t/i,g=r/n,f=Math.round(1/s),m=Math.round(1/g),_=f*m,p=0;p<h.height;p++)for(var w=0;w<u;w++){for(var x=a+Math.round(w/s)+(o+Math.round(p/g))*d,v=0,M=0,y=0,E=0,b=0;b<m;b++)for(var k=0;k<f;k++){var I=c[x+k+b*d];v+=I<<24>>>24,M+=I<<16>>>24,y+=I<<8>>>24,E+=I>>>24}v=Math.round(v/_),M=Math.round(M/_),y=Math.round(y/_),E=Math.round(E/_),l[w+p*u]=E<<24|y<<16|M<<8|v}return h}function downScaleCanvas(e,t){var r,a;const o=document.createElement("canvas");o.width=e.width,o.height=e.height,null===(r=o.getContext("2d"))||void 0===r||r.drawImage(e,0,0,o.width,o.height);const i=downsample(o.getContext("2d").getImageData(0,0,o.width,o.height),Math.floor(o.width*t),Math.floor(o.height*t),0,0,o.width,o.height);return o.width=Math.floor(o.width*t),o.height=Math.floor(o.height*t),null===(a=o.getContext("2d"))||void 0===a||a.putImageData(i,0,0),o}const useMask=(e,t)=>{const[r,a]=useImageHook(e.maskSrc,"anonymous"),o=e.maskSrc?a:"loaded";return(0,exports.useImageLoader)(o),react_1.default.useMemo((()=>{if(!r)return t;if(!t||!t.width||!t.height)return t;const a=document.createElement("canvas");a.width=Math.max(t.width,1),a.height=Math.max(t.height,1);const o=a.getContext("2d");if(!o)return t;o.drawImage(t,0,0),o.globalCompositeOperation="source-in";const i=getCrop(r,e);return o.drawImage(r,i.x,i.y,i.width,i.height,0,0,t.width,t.height),a}),[t,r,e.width,e.height])},useCornerRadius=(e,t,r,a,o=0,i=!1)=>{const n=react_1.default.useMemo((()=>{if(t&&t.width&&t.height)return document.createElement("canvas")}),[t]);return react_1.default.useLayoutEffect((()=>{if(!n||!t)return;const h=Math.floor(Math.max(e.width*a,1)),c=Math.floor(Math.max(e.height*a,1));n.width=h,n.height=c;const d=n.getContext("2d");if(!d)return;const l=Math.min(o*a,h/2,c/2);l&&(d.beginPath(),d.moveTo(l,0),d.lineTo(h-l,0),d.arc(h-l,l,l,3*Math.PI/2,0,!1),d.lineTo(h,c-l),d.arc(h-l,c-l,l,0,Math.PI/2,!1),d.lineTo(l,c),d.arc(l,c-l,l,Math.PI/2,Math.PI,!1),d.lineTo(0,l),d.arc(l,l,l,Math.PI,3*Math.PI/2,!1),d.clip());const u=Math.max(e.width/r.width,e.height/r.height)*a,s=u<1&&!i,g=s?downScaleCanvas(t,u):t,f=s?{x:r.x*u,y:r.y*u,width:r.width*u,height:r.height*u}:r;d.drawImage(g,f.x,f.y,f.width,f.height,0,0,n.width,n.height)}),[n,e.width,e.height,r.x,r.y,r.width,r.height,o,a,i]),n},useClip=(e,t,r,a)=>{const o=useSizeFixer(e.clipSrc||""),[i]=useImageHook(o,"anonymous"),n=react_1.default.useMemo((()=>{if(t&&i)return document.createElement("canvas")}),[t,i]);react_1.default.useLayoutEffect((()=>{var a;if(!i)return;if(!t||!t.width||!t.height)return;if(!i||!i.width||!i.height)return;if(!n)return;const o=document.createElement("canvas"),h=Math.max(e.width/i.width*r,e.height/i.height*r);o.width=i.width*h,o.height=i.height*h,null===(a=o.getContext("2d"))||void 0===a||a.drawImage(i,0,0,o.width,o.height),n.width=Math.max(t.width,1),n.height=Math.max(t.height,1);const c=n.getContext("2d");c&&(c.save(),c.drawImage(o,0,0,t.width,t.height),c.globalCompositeOperation="source-in",c.drawImage(t,0,0,n.width,n.height),c.restore())}),[n,t,i,e.width,e.height,r,...a]);return e.clipSrc&&i?n:t},PLACEHOLDER_CANVAS=document.createElement("canvas"),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.x,y:e.y,rotation:e.rotation,listening:!1,opacity:e.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 image...",r=Math.max(10,Math.min(30,e.width/t.length));return react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,listening:!1,opacity:e.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 usePreviousValue=e=>{const t=react_1.default.useRef(e);return react_1.default.useEffect((()=>{t.current=e}),[e]),t.current},useImageLoader=e=>{const t=usePreviousValue(e),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&&setTimeout((()=>{throw console.log(t,e),new Error("Unexpected loader detected.")})),r.current=(0,loader_1.incrementLoader)()),"loading"!==t||"loaded"!==e&&"failed"!==e||a()}),[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};exports.ImageElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{var r;const[a,o]=react_1.default.useState(!1),i=react_1.default.useRef(null),n=react_1.default.useRef(null),[h,c]=react_1.default.useState(!1),d=t.selectedElements.indexOf(e)>=0,[l,u]=useImageHook(e.__finalSrc||e.src,"anonymous");(0,exports.useImageLoader)(u);const s="svg"!==e.type||e.__isLoaded?u:"loading";(0,exports.useImageLoader)(s);const g=usePreviousImage({image:l,status:u,type:e.type}),f=useMask(e,useFlip(e,l||g,t._elementsPixelRatio))||PLACEHOLDER_CANVAS;let{cropX:m,cropY:_,cropWidth:p,cropHeight:w}=e;"loaded"!==u&&(m=_=0,p=w=1);const x=f.width*p,v=f.height*w,M=e.width/e.height;let y,E;const b=x/v,k="svg"===e.type;k?(y=x,E=v):M>=b?(y=x,E=x/M):(y=v*M,E=v);const I={x:f.width*m,y:f.height*_,width:y,height:E},S=null!==(r=e.cornerRadius)&&void 0!==r?r:0;let C=useClip(e,useCornerRadius(e,f,I,t._elementsPixelRatio,S,a||e._cropModeEnabled||"svg"===e.type),t._elementsPixelRatio,[I,S,t._elementsPixelRatio]);const L=Math.max(e.width/y,e.height/E);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!==n.current&&e.toggleCropMode(!1)}function o(t){e._cropModeEnabled&&"CANVAS"!==t.target.nodeName&&e.toggleCropMode(!1)}return document.body.addEventListener("click",o),null==r||r.on("click",a),null==r||r.on("tap",a),()=>{document.body.removeEventListener("click",o),document.body.removeEventListener("touchstart",o),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})}),[f,a,p,w,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]);const R=react_1.default.useRef(null),P=react_1.default.useRef(null),H=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(P.current.nodes([R.current]),H.current.nodes([n.current]))}),[e._cropModeEnabled]);const T=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(),o=Math.min(1,y/r),i=Math.min(1,E/a),n=1-o,h=Math.min(n,Math.max(0,Math.round(-t.target.x())/r)),c=1-i,d=Math.min(c,Math.max(0,Math.round(-t.target.y())/a));t.target.setAttrs({x:-h*f.width,y:-d*f.height,scaleX:1,scaleY:1}),e.set({cropX:h,cropY:d,cropWidth:o,cropHeight:i})},X=()=>{"svg"!==e.type&&(e.locked||setTimeout((()=>{e.toggleCropMode(!0)})))},Y="svg"===e.type&&g,D="loading"===u&&!Y,A="failed"===u,O=!D&&!A,W=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),F=O?e.opacity:0;(0,use_fadein_1.useFadeIn)(i,F);const q=e.selectable||"admin"===t.role;return react_1.default.createElement(react_1.default.Fragment,null,D&&react_1.default.createElement(LoadingPlaceholder,{element:e}),A&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:i,name:"element",id:e.id,image:C,x:e.x,y:e.y,width:e.width||1,height:e.height||1,rotation:e.rotation,opacity:F,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,customCrop:I,listening:q,draggable:!e.locked,hideInExport:!e.showInExport,onMouseEnter:()=>{c(!0)},onMouseLeave:()=>{c(!1)},onDragStart:()=>{t.history.startTransaction()},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:r=>{e.set({x:r.target.x(),y:r.target.y()}),t.history.endTransaction()},onDblClick:X,onDblTap:X,onTransformStart:()=>{o(!0),t.history.startTransaction(),W.current={cropX:e.cropX,cropY:e.cropY,cropWidth:e.cropWidth,cropHeight:e.cropHeight}},onTransform:t=>{var r;const a=t.currentTarget,o=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 n=null===(r=t.target.getStage())||void 0===r?void 0:r.findOne("Transformer"),h=1-y/f.width,c=Math.min(h,Math.max(0,e.cropX)),d=1-E/f.height,l=Math.min(d,Math.max(0,e.cropY)),u=n.getActiveAnchor(),s=!(u.indexOf("middle")>=0||u.indexOf("center")>=0),g=!s&&o<1&&W.current.cropHeight>E/f.height;let m=s?e.cropWidth:e.cropWidth*o;g&&(m=e.cropWidth);const _=!s&&i<1&&W.current.cropWidth>y/f.width;let p=s?e.cropHeight:e.cropHeight*i;_&&(p=e.cropHeight),k&&(m=e.cropWidth,p=e.cropHeight),e.set({cropX:c,cropY:l,x:a.x(),y:a.y(),width:a.width()*o,height:a.height()*i,rotation:t.target.rotation(),cropWidth:Math.min(m,1-c),cropHeight:Math.min(p,1-l)})},onTransformEnd:r=>{const a=r.currentTarget;e.set({width:a.width(),height:a.height(),x:a.x(),y:a.y(),rotation:r.target.rotation(),cropWidth:y/f.width,cropHeight:E/f.height}),o(!1),t.history.endTransaction()}}),react_1.default.createElement(react_konva_1.Rect,{x:e.x,y:e.y,width:e.width-e.borderSize,height:e.height-e.borderSize,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,S-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:-1500,y:-1500,width:4500,height:4500,fill:"rgba(0,0,0,0.3)"}),react_1.default.createElement(react_konva_1.Image,{listening:!1,image:C,x:e.x,y:e.y,width:e.width,height:e.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:L,scaleY:L},react_1.default.createElement(react_konva_1.Image,{image:f,ref:n,opacity:.4,draggable:!0,x:-e.cropX*f.width,y:-e.cropY*f.height,onDragMove:T,onTransform:T}),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:y,height:E,ref:R,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*f.width-1e-9&&(t.target.x(-e.cropX*f.width),t.target.scaleX(1)),t.target.y()<-e.cropY*f.height-1e-9&&(t.target.y(-e.cropY*f.height),t.target.scaleY(1));const r=Math.min(1,Math.max(0,e.cropX+t.target.x()/f.width)),a=Math.min(1,Math.max(0,t.target.y()/f.height+e.cropY)),o=t.target.width()*t.target.scaleX(),i=t.target.height()*t.target.scaleY(),n=Math.min(1-r,o/f.width),h=Math.min(1-a,i/f.height),c=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:c.x,y:c.y,cropX:r,cropY:a,cropWidth:n,cropHeight:h,width:Math.min(o*L,f.width*(1-r)*L),height:Math.min(i*L,f.height*(1-a)*L)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:P,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}))),(h||d)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
|
package/canvas/page.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __rest=this&&this.__rest||function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.registerNextDomDrop=exports.registerTransformerAttrs=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"),core_1=require("@blueprintjs/core"),popover2_1=require("@blueprintjs/popover2"),use_image_1=__importDefault(require("use-image")),konva_1=__importDefault(require("konva")),element_1=__importDefault(require("./element")),use_transformer_snap_1=require("./use-transformer-snap"),image_element_1=require("./image-element"),crop_1=require("../utils/crop"),l10n_1=require("../utils/l10n"),DEFAULT_TRANSFORMER_ATTRIBUTES={enabledAnchors:["top-left","top-center","top-right","middle-left","bottom-left","bottom-right","bottom-center","middle-right"],rotateEnabled:!0,rotationSnaps:[0,45,90,135,180,225,270,315],ignoreStroke:!0,anchorStrokeWidth:2,borderStrokeWidth:2},transformerAttributes={text:{enabledAnchors:["top-left","top-right","middle-left","bottom-left","bottom-right","middle-right"]},svg:{enabledAnchors:["top-left","top-right","bottom-left","bottom-right"]},many:{enabledAnchors:["top-left","top-right","bottom-left","bottom-right"]}};function registerTransformerAttrs(e,t){transformerAttributes[e]=transformerAttributes[e]||t,Object.assign(transformerAttributes[e],t)}exports.registerTransformerAttrs=registerTransformerAttrs;const Background=e=>react_1.default.createElement(react_konva_1.Rect,Object.assign({},e,{preventDefault:!1})),ImageBackground=e=>{var{url:t}=e,r=__rest(e,["url"]);const[n,o]=(0,use_image_1.default)(t,"anonymous"),a=n?(0,crop_1.getCrop)(n,{width:r.width,height:r.height},"center-middle"):{};return(0,image_element_1.useImageLoader)(o),react_1.default.createElement(react_konva_1.Image,Object.assign({image:n},r,a))},ColorBackground=e=>react_1.default.createElement(react_konva_1.Rect,Object.assign({},e)),PageBackground=e=>{const{background:t,scale:r,borderColor:n}=e,o=__rest(e,["background","scale","borderColor"]),a=t.indexOf("http")>=0||t.indexOf(".png")>=0||t.indexOf(".jpg")>=0,l=1/r;return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,{name:"page-highlight",x:-1.5*l,y:-1.5*l,width:e.width+3*l,height:e.height+3*l,stroke:n,strokeWidth:3,listening:!1,strokeScaleEnabled:!1}),a?react_1.default.createElement(ImageBackground,Object.assign({url:t},o)):react_1.default.createElement(ColorBackground,Object.assign({fill:t},o)))},Selection=(0,mobx_react_lite_1.observer)((({selection:e})=>e.visible?react_1.default.createElement(react_konva_1.Rect,{name:"selection",x:Math.min(e.x1,e.x2),y:Math.min(e.y1,e.y2),width:Math.abs(e.x1-e.x2),height:Math.abs(e.y1-e.y2),fill:"rgba(0, 161, 255, 0.3)"}):null)),Elements=(0,mobx_react_lite_1.observer)((({elements:e,store:t})=>{const r=e.filter((e=>e.alwaysOnTop)),n=e.filter((e=>!e.alwaysOnTop)).concat(r);return react_1.default.createElement(react_1.default.Fragment,null,n.map((e=>react_1.default.createElement(element_1.default,{key:e.id,store:t,element:e,onClick:()=>{console.warn("Polotno warning: onClick callback is deprecated. Just stop using it. Polotno will do selection automatically.")}}))))}));let onDomDrop=null;const registerNextDomDrop=e=>{onDomDrop=e};exports.registerNextDomDrop=registerNextDomDrop,exports.default=(0,mobx_react_lite_1.observer)((({store:e,page:t,xPadding:r,yPadding:n,width:o,height:a,pageControlsEnabled:l,backColor:i,pageBorderColor:c,activePageBorderColor:s})=>{const d=react_1.default.useRef(null),u=react_1.default.useRef(null),m=react_1.default.useRef(null),g=null==l||l,_=e.pages.length>1,f=e.pages.indexOf(t),p=e.selectedElements.find((e=>e._cropModeEnabled)),h=e.selectedElements.filter((e=>e.locked)).length>0,v=e.selectedElements.filter((e=>!e.visible)).length>0;react_1.default.useEffect((()=>{var t,r;if(!d.current)return;const n=d.current.getStage(),o=e.selectedElements.map((e=>e._cropModeEnabled?null:n.findOne("#"+e.id))).filter((e=>e)),a=1===e.selectedElements.length&&(null===(t=e.selectedElements[0])||void 0===t?void 0:t.type)||"many";h?(d.current.enabledAnchors([]),d.current.rotateEnabled(!1)):transformerAttributes[a]?(d.current.setAttrs(Object.assign(Object.assign({},DEFAULT_TRANSFORMER_ATTRIBUTES),transformerAttributes[a])),"svg"!==a||e.selectedElements[0].keepRatio||d.current.setAttrs({enabledAnchors:DEFAULT_TRANSFORMER_ATTRIBUTES.enabledAnchors})):d.current.setAttrs(DEFAULT_TRANSFORMER_ATTRIBUTES),d.current.nodes(o),null===(r=d.current.getLayer())||void 0===r||r.batchDraw()}),[e.selectedElements,p,h,v]);const b=(0,mobx_react_lite_1.useLocalObservable)((()=>({visible:!1,x1:0,y1:0,x2:0,y2:0}))),E=react_1.default.useRef(!1),x=(0,mobx_1.action)((r=>{var n,o;E.current=!1,e.activePage!==t&&t.select();const a=r.target.findAncestor(".elements-container"),l=r.target.findAncestor("Transformer"),i=r.target.findAncestor(".page-abs-container");if(a||l||i)return;const c=null===(n=r.target.getStage())||void 0===n?void 0:n.getPointerPosition();c&&(b.visible=!0,b.x1=c.x,b.y1=c.y,b.x2=c.x,b.y2=c.y,(null===(o=r.target.getStage())||void 0===o?void 0:o.getPointersPositions().length)>=2&&(b.visible=!1))}));react_1.default.useEffect((()=>{const t=(0,mobx_1.action)((e=>{var t,r;if(!b.visible)return;null===(t=u.current)||void 0===t||t.setPointersPositions(e);let n=(null===(r=u.current)||void 0===r?void 0:r.getPointerPosition())||{x:b.x2,y:b.y2};b.x2=n.x,b.y2=n.y})),r=(0,mobx_1.action)((()=>{if(!b.visible)return;if(!u.current)return;const t=u.current.findOne(".selection"),r=t?t.getClientRect():{width:0,height:0,x:0,y:0};if(r.width&&r.height){const t=[];u.current.find(".element").forEach((n=>{const o=n.getClientRect(),a=e.getElementById(n.id()),l=null==a?void 0:a.locked,i=null==a?void 0:a.selectable;konva_1.default.Util.haveIntersection(r,o)&&!l&&i&&t.push(n.id())})),e.selectElements(t)}b.visible=!1,E.current=!0}));return window.addEventListener("mousemove",t),window.addEventListener("touchmove",t),window.addEventListener("mouseup",r),window.addEventListener("touchend",r),()=>{window.removeEventListener("mousemove",t),window.removeEventListener("touchmove",t),window.removeEventListener("mouseup",r),window.removeEventListener("touchend",r)}}),[]);const w=t=>{if(E.current)return;const r=t.evt.ctrlKey||t.evt.metaKey||t.evt.shiftKey,n=t.target.findAncestor(".elements-container"),o=t.target.findAncestor(".page-abs-container"),a=t.target.findAncestor("Transformer");if(!(r||n||a||o))return void e.selectElements([]);const l=t.target.findAncestor(".element",!0),i=e.selectedElementsIds.indexOf(null==l?void 0:l.id())>=0;l&&r&&!i&&e.selectElements(e.selectedElementsIds.concat([l.id()])),l&&r&&i&&e.selectElements(e.selectedElementsIds.filter((e=>e!==l.id()))),!l||r||i||e.selectElements([l.id()])};(0,use_transformer_snap_1.useSnap)(d);const k=e.activePage===t;return react_1.default.createElement("div",{ref:m,onDragOver:e=>e.preventDefault(),onDrop:t=>{if(t.preventDefault(),!u.current)return;u.current.setPointersPositions(t);const r=u.current.findOne(".elements-container").getRelativePointerPosition(),n=u.current.getPointerPosition(),o=u.current.getIntersection(n),a=o&&o.findAncestor(".element",!0),l=a?e.getElementById(a.id()):void 0;onDomDrop&&(onDomDrop(r,l),onDomDrop=null)},style:{position:"relative",width:o+"px"},className:"polotno-page-container"+(k?" active-page":"")},react_1.default.createElement(react_konva_1.Stage,{ref:u,width:o,height:a,onClick:w,onTap:w,onMouseDown:x,onDragStart:t=>{var r;if(t.target.hasName("element")){const n=t.target.id();!(e.selectedElementsIds.indexOf(n)>=0)&&n&&(e.selectElements([n]),null===(r=d.current)||void 0===r||r.startDrag(t))}},pageId:t.id,style:{position:"relative"}},react_1.default.createElement(react_konva_1.Layer,null,react_1.default.createElement(Background,{width:o,height:a,fill:i}),react_1.default.createElement(react_konva_1.Group,{x:r,y:n,scaleX:e.scale,scaleY:e.scale,name:"page-container"},react_1.default.createElement(PageBackground,{width:e.width,height:e.height,background:t.background,shadowBlur:10,shadowColor:"lightgrey",name:"page-background",preventDefault:!1,scale:e.scale,active:k&&e.pages.length>1,borderColor:k&&e.pages.length>1?s:c}),react_1.default.createElement(react_konva_1.Group,{clipX:0,clipY:0,clipWidth:e.width,clipHeight:e.height,name:"elements-container"},react_1.default.createElement(Elements,{elements:t.children,store:e}))),react_1.default.createElement(react_konva_1.Group,{x:r,y:n,scaleX:e.scale,scaleY:e.scale,name:"page-abs-container"},react_1.default.createElement(react_konva_1.Transformer,{ref:d,boundBoxFunc:(e,t)=>{const r=t.width<1||t.height<1,n=e.width<1||e.height<1;return r&&!n?e:t}})),react_1.default.createElement(Selection,{selection:b}),e._showCredit&&react_1.default.createElement(react_konva_1.Text,{text:"Powered by polotno.dev",fontSize:14,fill:"rgba(0,0,0,0.6)",x:o-170,y:a-18,onMouseEnter:e=>{e.target.getStage().container().style.cursor="pointer"},onMouseLeave:e=>{e.target.getStage().container().style.cursor=""},onTouchStart:e=>{e.cancelBubble=!0},onMouseDown:e=>{e.cancelBubble=!0},onClick:()=>{window.open("https://polotno.dev")},onTap:()=>{window.open("https://polotno.dev")}}),react_1.default.createElement(react_konva_1.Group,{name:"line-guides"}))),g&&k&&react_1.default.createElement("div",{style:{position:"absolute",top:n-40+"px",right:r+"px"}},_&&react_1.default.createElement(popover2_1.Tooltip2,{content:(0,l10n_1.t)("workspace.moveUp"),disabled:0===f},react_1.default.createElement(core_1.Button,{icon:"chevron-up",minimal:!0,disabled:0===f,onClick:()=>{t.setZIndex(f-1)}})),_&&react_1.default.createElement(popover2_1.Tooltip2,{content:(0,l10n_1.t)("workspace.moveDown"),disabled:f===e.pages.length-1},react_1.default.createElement(core_1.Button,{icon:"chevron-down",minimal:!0,disabled:f===e.pages.length-1,onClick:()=>{const r=e.pages.indexOf(t);t.setZIndex(r+1)}})),react_1.default.createElement(popover2_1.Tooltip2,{content:(0,l10n_1.t)("workspace.duplicatePage")},react_1.default.createElement(core_1.Button,{icon:"duplicate",minimal:!0,onClick:()=>{t.clone()}})),_&&react_1.default.createElement(popover2_1.Tooltip2,{content:(0,l10n_1.t)("workspace.removePage")},react_1.default.createElement(core_1.Button,{icon:"trash",minimal:!0,onClick:()=>{e.deletePages([t.id])}})),react_1.default.createElement(popover2_1.Tooltip2,{content:(0,l10n_1.t)("workspace.addPage")},react_1.default.createElement(core_1.Button,{icon:"insert",minimal:!0,onClick:()=>{const r=e.addPage(),n=e.pages.indexOf(t);r.setZIndex(n+1)}}))))}));
|
|
1
|
+
"use strict";var __rest=this&&this.__rest||function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.registerNextDomDrop=exports.registerTransformerAttrs=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"),core_1=require("@blueprintjs/core"),popover2_1=require("@blueprintjs/popover2"),use_image_1=__importDefault(require("use-image")),konva_1=__importDefault(require("konva")),element_1=__importDefault(require("./element")),use_transformer_snap_1=require("./use-transformer-snap"),image_element_1=require("./image-element"),crop_1=require("../utils/crop"),l10n_1=require("../utils/l10n"),DEFAULT_TRANSFORMER_ATTRIBUTES={enabledAnchors:["top-left","top-center","top-right","middle-left","bottom-left","bottom-right","bottom-center","middle-right"],rotateEnabled:!0,rotationSnaps:[0,45,90,135,180,225,270,315],ignoreStroke:!0,anchorStrokeWidth:2,borderStrokeWidth:2},transformerAttributes={text:{enabledAnchors:["top-left","top-right","middle-left","bottom-left","bottom-right","middle-right"]},svg:{enabledAnchors:["top-left","top-right","bottom-left","bottom-right"]},many:{enabledAnchors:["top-left","top-right","bottom-left","bottom-right"]}};function registerTransformerAttrs(e,t){transformerAttributes[e]=transformerAttributes[e]||t,Object.assign(transformerAttributes[e],t)}exports.registerTransformerAttrs=registerTransformerAttrs;const Background=e=>react_1.default.createElement(react_konva_1.Rect,Object.assign({},e,{preventDefault:!1})),ImageBackground=e=>{var{url:t}=e,r=__rest(e,["url"]);const[n,o]=(0,use_image_1.default)(t,"anonymous"),a=n?(0,crop_1.getCrop)(n,{width:r.width,height:r.height},"center-middle"):{};return(0,image_element_1.useImageLoader)(o),react_1.default.createElement(react_konva_1.Image,Object.assign({image:n},r,a))},ColorBackground=e=>react_1.default.createElement(react_konva_1.Rect,Object.assign({},e)),PageBackground=e=>{const{background:t,scale:r,borderColor:n}=e,o=__rest(e,["background","scale","borderColor"]),a=t.indexOf("http")>=0||t.indexOf(".png")>=0||t.indexOf(".jpg")>=0,l=1/r;return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,{name:"page-highlight",x:-1.5*l+e.x,y:-1.5*l+e.y,width:e.width+3*l,height:e.height+3*l,stroke:n,strokeWidth:3,listening:!1,strokeScaleEnabled:!1}),a?react_1.default.createElement(ImageBackground,Object.assign({url:t},o)):react_1.default.createElement(ColorBackground,Object.assign({fill:t},o)))},Selection=(0,mobx_react_lite_1.observer)((({selection:e})=>e.visible?react_1.default.createElement(react_konva_1.Rect,{name:"selection",x:Math.min(e.x1,e.x2),y:Math.min(e.y1,e.y2),width:Math.abs(e.x1-e.x2),height:Math.abs(e.y1-e.y2),fill:"rgba(0, 161, 255, 0.3)"}):null)),Elements=(0,mobx_react_lite_1.observer)((({elements:e,store:t})=>{const r=e.filter((e=>e.alwaysOnTop)),n=e.filter((e=>!e.alwaysOnTop)).concat(r);return react_1.default.createElement(react_1.default.Fragment,null,n.map((e=>react_1.default.createElement(element_1.default,{key:e.id,store:t,element:e,onClick:()=>{console.warn("Polotno warning: onClick callback is deprecated. Just stop using it. Polotno will do selection automatically.")}}))))}));let onDomDrop=null;const registerNextDomDrop=e=>{onDomDrop=e};exports.registerNextDomDrop=registerNextDomDrop,exports.default=(0,mobx_react_lite_1.observer)((({store:e,page:t,xPadding:r,yPadding:n,width:o,height:a,pageControlsEnabled:l,backColor:i,pageBorderColor:c,activePageBorderColor:s})=>{const d=react_1.default.useRef(null),u=react_1.default.useRef(null),m=react_1.default.useRef(null),g=null==l||l,_=e.pages.length>1,f=e.pages.indexOf(t),p=e.selectedElements.find((e=>e._cropModeEnabled)),h=e.selectedElements.filter((e=>e.locked)).length>0,b=e.selectedElements.filter((e=>!e.visible)).length>0;react_1.default.useEffect((()=>{var t,r;if(!d.current)return;const n=d.current.getStage(),o=e.selectedElements.map((e=>e._cropModeEnabled?null:n.findOne("#"+e.id))).filter((e=>e)),a=1===e.selectedElements.length&&(null===(t=e.selectedElements[0])||void 0===t?void 0:t.type)||"many";h?(d.current.enabledAnchors([]),d.current.rotateEnabled(!1)):transformerAttributes[a]?(d.current.setAttrs(Object.assign(Object.assign({},DEFAULT_TRANSFORMER_ATTRIBUTES),transformerAttributes[a])),"svg"!==a||e.selectedElements[0].keepRatio||d.current.setAttrs({enabledAnchors:DEFAULT_TRANSFORMER_ATTRIBUTES.enabledAnchors})):d.current.setAttrs(DEFAULT_TRANSFORMER_ATTRIBUTES),d.current.nodes(o),null===(r=d.current.getLayer())||void 0===r||r.batchDraw()}),[e.selectedElements,p,h,b]);const v=(0,mobx_react_lite_1.useLocalObservable)((()=>({visible:!1,x1:0,y1:0,x2:0,y2:0}))),E=react_1.default.useRef(!1),x=(0,mobx_1.action)((r=>{var n,o;E.current=!1,e.activePage!==t&&t.select();const a=r.target.findAncestor(".elements-container"),l=r.target.findAncestor("Transformer"),i=r.target.findAncestor(".page-abs-container");if(a||l||i)return;const c=null===(n=r.target.getStage())||void 0===n?void 0:n.getPointerPosition();c&&(v.visible=!0,v.x1=c.x,v.y1=c.y,v.x2=c.x,v.y2=c.y,(null===(o=r.target.getStage())||void 0===o?void 0:o.getPointersPositions().length)>=2&&(v.visible=!1))}));react_1.default.useEffect((()=>{const t=(0,mobx_1.action)((e=>{var t,r;if(!v.visible)return;null===(t=u.current)||void 0===t||t.setPointersPositions(e);let n=(null===(r=u.current)||void 0===r?void 0:r.getPointerPosition())||{x:v.x2,y:v.y2};v.x2=n.x,v.y2=n.y})),r=(0,mobx_1.action)((()=>{if(!v.visible)return;if(!u.current)return;const t=u.current.findOne(".selection"),r=t?t.getClientRect():{width:0,height:0,x:0,y:0};if(r.width&&r.height){const t=[];u.current.find(".element").forEach((n=>{const o=n.getClientRect(),a=e.getElementById(n.id()),l=null==a?void 0:a.locked,i=null==a?void 0:a.selectable;konva_1.default.Util.haveIntersection(r,o)&&!l&&i&&t.push(n.id())})),e.selectElements(t)}v.visible=!1,E.current=!0}));return window.addEventListener("mousemove",t),window.addEventListener("touchmove",t),window.addEventListener("mouseup",r),window.addEventListener("touchend",r),()=>{window.removeEventListener("mousemove",t),window.removeEventListener("touchmove",t),window.removeEventListener("mouseup",r),window.removeEventListener("touchend",r)}}),[]);const w=t=>{if(E.current)return;const r=t.evt.ctrlKey||t.evt.metaKey||t.evt.shiftKey,n=t.target.findAncestor(".elements-container"),o=t.target.findAncestor(".page-abs-container"),a=t.target.findAncestor("Transformer");if(!(r||n||a||o))return void e.selectElements([]);const l=t.target.findAncestor(".element",!0),i=e.selectedElementsIds.indexOf(null==l?void 0:l.id())>=0;l&&r&&!i&&e.selectElements(e.selectedElementsIds.concat([l.id()])),l&&r&&i&&e.selectElements(e.selectedElementsIds.filter((e=>e!==l.id()))),!l||r||i||e.selectElements([l.id()])};(0,use_transformer_snap_1.useSnap)(d);const k=e.activePage===t;return react_1.default.createElement("div",{ref:m,onDragOver:e=>e.preventDefault(),onDrop:t=>{if(t.preventDefault(),!u.current)return;u.current.setPointersPositions(t);const r=u.current.findOne(".elements-container").getRelativePointerPosition(),n=u.current.getPointerPosition(),o=u.current.getIntersection(n),a=o&&o.findAncestor(".element",!0),l=a?e.getElementById(a.id()):void 0;onDomDrop&&(onDomDrop(r,l),onDomDrop=null)},style:{position:"relative",width:o+"px"},className:"polotno-page-container"+(k?" active-page":"")},react_1.default.createElement(react_konva_1.Stage,{ref:u,width:o,height:a,onClick:w,onTap:w,onMouseDown:x,onDragStart:t=>{var r;if(t.target.hasName("element")){const n=t.target.id();!(e.selectedElementsIds.indexOf(n)>=0)&&n&&(e.selectElements([n]),null===(r=d.current)||void 0===r||r.startDrag(t))}},pageId:t.id,style:{position:"relative"}},react_1.default.createElement(react_konva_1.Layer,null,react_1.default.createElement(Background,{width:o,height:a,fill:i}),react_1.default.createElement(react_konva_1.Group,{x:r,y:n,scaleX:e.scale,scaleY:e.scale,name:"page-container"},react_1.default.createElement(PageBackground,{x:0,y:0,width:e.width+2*t.bleed,height:e.height+2*t.bleed,background:t.background,shadowBlur:10,shadowColor:"lightgrey",name:"page-background",preventDefault:!1,scale:e.scale,active:k&&e.pages.length>1,borderColor:k&&e.pages.length>1?s:c}),react_1.default.createElement(react_konva_1.Group,{x:t.bleed,y:t.bleed,clipX:-t.bleed,clipY:-t.bleed,clipWidth:e.width+2*t.bleed,clipHeight:e.height+2*t.bleed,name:"elements-container"},react_1.default.createElement(react_konva_1.Rect,{name:"elements-area",width:e.width,height:e.height}),react_1.default.createElement(Elements,{elements:t.children,store:e})),react_1.default.createElement(react_konva_1.Rect,{stroke:"red",name:"bleed",strokeWidth:t.bleed,x:t.bleed/2,y:t.bleed/2,width:e.width+t.bleed,height:e.height+t.bleed,opacity:.1,listening:!1,visible:t.bleed>0})),react_1.default.createElement(react_konva_1.Group,{x:r,y:n,scaleX:e.scale,scaleY:e.scale,name:"page-abs-container"},react_1.default.createElement(react_konva_1.Transformer,{ref:d,boundBoxFunc:(e,t)=>{const r=t.width<1||t.height<1,n=e.width<1||e.height<1;return r&&!n?e:t}})),react_1.default.createElement(Selection,{selection:v}),e._showCredit&&react_1.default.createElement(react_konva_1.Text,{text:"Powered by polotno.dev",fontSize:14,fill:"rgba(0,0,0,0.6)",x:o-170,y:a-18,onMouseEnter:e=>{e.target.getStage().container().style.cursor="pointer"},onMouseLeave:e=>{e.target.getStage().container().style.cursor=""},onTouchStart:e=>{e.cancelBubble=!0},onMouseDown:e=>{e.cancelBubble=!0},onClick:()=>{window.open("https://polotno.dev")},onTap:()=>{window.open("https://polotno.dev")}}),react_1.default.createElement(react_konva_1.Group,{name:"line-guides"}))),g&&k&&react_1.default.createElement("div",{style:{position:"absolute",top:n-40+"px",right:r+"px"}},_&&react_1.default.createElement(popover2_1.Tooltip2,{content:(0,l10n_1.t)("workspace.moveUp"),disabled:0===f},react_1.default.createElement(core_1.Button,{icon:"chevron-up",minimal:!0,disabled:0===f,onClick:()=>{t.setZIndex(f-1)}})),_&&react_1.default.createElement(popover2_1.Tooltip2,{content:(0,l10n_1.t)("workspace.moveDown"),disabled:f===e.pages.length-1},react_1.default.createElement(core_1.Button,{icon:"chevron-down",minimal:!0,disabled:f===e.pages.length-1,onClick:()=>{const r=e.pages.indexOf(t);t.setZIndex(r+1)}})),react_1.default.createElement(popover2_1.Tooltip2,{content:(0,l10n_1.t)("workspace.duplicatePage")},react_1.default.createElement(core_1.Button,{icon:"duplicate",minimal:!0,onClick:()=>{t.clone()}})),_&&react_1.default.createElement(popover2_1.Tooltip2,{content:(0,l10n_1.t)("workspace.removePage")},react_1.default.createElement(core_1.Button,{icon:"trash",minimal:!0,onClick:()=>{e.deletePages([t.id])}})),react_1.default.createElement(popover2_1.Tooltip2,{content:(0,l10n_1.t)("workspace.addPage")},react_1.default.createElement(core_1.Button,{icon:"insert",minimal:!0,onClick:()=>{const r=e.addPage(),n=e.pages.indexOf(t);r.setZIndex(n+1)}}))))}));
|
package/canvas/text-element.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TextElement=exports.useFontLoader=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),react_konva_utils_1=require("react-konva-utils"),mobx_1=require("mobx"),konva_1=__importDefault(require("konva")),loader_1=require("../utils/loader"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),highlighter_1=require("./highlighter"),styleNode=document.createElement("style");styleNode.type="text/css",document.head.appendChild(styleNode);const initialStyles={border:"none",padding:"0px",overflow:"hidden",background:"none",outline:"none",resize:"none",overflowWrap:"break-word",whiteSpace:"normal",userSelect:"text",wordBreak:"normal"},TextInput=(0,mobx_react_lite_1.observer)((({textNodeRef:e,element:t,onBlur:r,selectAll:n,cursorPosition:o})=>{const[a,i]=react_1.default.useState(initialStyles),l=e.current;react_1.default.useLayoutEffect((()=>{const e={};e.width=l.width()-2*l.padding()+"px",e.height=l.height()-2*l.padding()+10+"px",e.fontSize=l.fontSize()+"px",e.lineHeight=l.lineHeight()+.01,e.fontFamily='"'+l.fontFamily()+'"',e.textAlign=l.align(),e.color=l.fill(),e.fontWeight=t.fontWeight,e.fontStyle=t.fontStyle;const r=`\n .polotno-input::placeholder {\n color: ${a.color};\n opacity: 0.6;\n }\n `;styleNode.innerHTML="",styleNode.appendChild(document.createTextNode(r)),JSON.stringify(e)!==JSON.stringify(a)&&i(e)}));const s=react_1.default.useRef(null);return react_1.default.useEffect((()=>{var e;const t=s.current;if(!t)return;null===(e=s.current)||void 0===e||e.focus();const r=o||t.value.length;t.selectionStart=t.selectionEnd=r,n&&(null==t||t.select(),document.execCommand("selectAll",!1,null))}),[]),react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement("textarea",{className:"polotno-input",ref:s,style:Object.assign(Object.assign({},initialStyles),a),value:t.text,onChange:e=>{t.set({text:e.target.value})},placeholder:t.placeholder,onBlur:r}))})),useEditor=e=>{const[t,r]=react_1.default.useState(!1),n=react_1.default.useRef(!1);return react_1.default.useEffect((()=>{var t=!0;return setTimeout((()=>{t&&(e._editModeEnabled&&(n.current=!0),r(!0),setTimeout((()=>{n.current=!1}),50))}),50),()=>{t=!1}}),[]),{editorEnabled:t&&e._editModeEnabled,selectAll:n.current}},useFontLoader=(e,t)=>{const[r,n]=react_1.default.useState(!1);return react_1.default.useLayoutEffect((()=>{let o=!0;return(async()=>{r&&n(!1)
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TextElement=exports.useFontLoader=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),react_konva_utils_1=require("react-konva-utils"),mobx_1=require("mobx"),konva_1=__importDefault(require("konva")),loader_1=require("../utils/loader"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),highlighter_1=require("./highlighter"),styleNode=document.createElement("style");styleNode.type="text/css",document.head.appendChild(styleNode);const initialStyles={border:"none",padding:"0px",overflow:"hidden",background:"none",outline:"none",resize:"none",overflowWrap:"break-word",whiteSpace:"normal",userSelect:"text",wordBreak:"normal"},TextInput=(0,mobx_react_lite_1.observer)((({textNodeRef:e,element:t,onBlur:r,selectAll:n,cursorPosition:o})=>{const[a,i]=react_1.default.useState(initialStyles),l=e.current;react_1.default.useLayoutEffect((()=>{const e={};e.width=l.width()-2*l.padding()+"px",e.height=l.height()-2*l.padding()+10+"px",e.fontSize=l.fontSize()+"px",e.lineHeight=l.lineHeight()+.01,e.fontFamily='"'+l.fontFamily()+'"',e.textAlign=l.align(),e.color=l.fill(),e.fontWeight=t.fontWeight,e.fontStyle=t.fontStyle;const r=`\n .polotno-input::placeholder {\n color: ${a.color};\n opacity: 0.6;\n }\n `;styleNode.innerHTML="",styleNode.appendChild(document.createTextNode(r)),JSON.stringify(e)!==JSON.stringify(a)&&i(e)}));const s=react_1.default.useRef(null);return react_1.default.useEffect((()=>{var e;const t=s.current;if(!t)return;null===(e=s.current)||void 0===e||e.focus();const r=o||t.value.length;t.selectionStart=t.selectionEnd=r,n&&(null==t||t.select(),document.execCommand("selectAll",!1,null))}),[]),react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement("textarea",{className:"polotno-input",ref:s,style:Object.assign(Object.assign({},initialStyles),a),value:t.text,onChange:e=>{t.set({text:e.target.value})},placeholder:t.placeholder,onBlur:r}))})),useEditor=e=>{const[t,r]=react_1.default.useState(!1),n=react_1.default.useRef(!1);return react_1.default.useEffect((()=>{var t=!0;return setTimeout((()=>{t&&(e._editModeEnabled&&(n.current=!0),r(!0),setTimeout((()=>{n.current=!1}),50))}),50),()=>{t=!1}}),[]),{editorEnabled:t&&e._editModeEnabled,selectAll:n.current}},useFontLoader=(e,t)=>{const[r,n]=react_1.default.useState(!1);return react_1.default.useLayoutEffect((()=>{let o=!0;return(async()=>{r&&n(!1);const a=(0,loader_1.incrementLoader)();await e.loadFont(t),konva_1.default.Util.requestAnimFrame(a),o&&n(!0)})(),()=>{o=!1}}),[t]),[r]};exports.useFontLoader=useFontLoader;const getLineHeight=({fontLoaded:e,fontFamily:t,fontSize:r,lineHeight:n})=>react_1.default.useMemo((()=>{if("number"==typeof n)return n;const e=document.createElement("div");e.style.fontFamily=t,e.style.fontSize=r+"px",e.style.lineHeight=n,e.innerText="Test text",document.body.appendChild(e);const o=e.offsetHeight;return document.body.removeChild(e),o/r}),[e,t,r,n]);function getRelativePointerPosition(e){var t=e.getAbsoluteTransform().copy();t.invert();var r=e.getStage().getPointerPosition();return t.point(r)}function getCursorPosition(e){var t;const r=e.target,n=getRelativePointerPosition(r),o=r.textArr,a=Math.floor(n.y/(r.fontSize()*r.lineHeight())),i=o.slice(0,a).reduce(((e,t)=>e+t.text.length),a),l=null!==(t=o[a])&&void 0!==t?t:o[0];let s=0;"right"===r.align()?s=r.width()-l.width:"center"===r.align()&&(s=r.width()/2-l.width/2);return i+Math.round((n.x-s)/l.width*l.text.length)}exports.TextElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),{editorEnabled:n,selectAll:o}=useEditor(e),[a,i]=react_1.default.useState(!1),l=t.selectedElements.indexOf(e)>=0;react_1.default.useEffect((()=>{if(e.width)return;const t=r.current;t.width(600),e.set({width:1.4*t.getTextWidth()})}),[]),react_1.default.useEffect((()=>{const t=r.current;e.height!==t.height()&&e.set({height:t.height()})})),react_1.default.useLayoutEffect((()=>(0,mobx_1.autorun)((()=>{const t=r.current;(0,apply_filters_1.applyFilter)(t,e)}))));const[s]=(0,exports.useFontLoader)(t,e.fontFamily);react_1.default.useLayoutEffect((()=>{const t=r.current;t&&(t.width(t.width()+1e-8),t._setTextData(),(0,apply_filters_1.applyFilter)(t,e))}),[s]);const d=react_1.default.useRef(null),c=react_1.default.useRef(0),u=r=>{t.selectedElements.find((t=>t===e))&&!e.locked&&(c.current=getCursorPosition(r),e.toggleEditMode())},f=!e.text&&e.placeholder,g=e._editModeEnabled?0:f?.6:e.opacity;(0,use_fadein_1.useFadeIn)(r,g);const h=getLineHeight({fontLoaded:s,fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:e.lineHeight}),_=e.selectable||"admin"===t.role;return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Text,{ref:r,id:e.id,name:"element",hideOnExport:!e.showInExport,x:e.x,y:e.y,rotation:e.rotation,width:e.width,text:e.text||e.placeholder,fill:e.fill,stroke:e.stroke,strokeWidth:e.strokeWidth,fillAfterStrokeEnabled:!0,fontSize:e.fontSize,fontFamily:e.fontFamily,fontStyle:e.fontStyle+" "+e.fontWeight,textDecoration:e.textDecoration,align:e.align,draggable:!e.locked,opacity:g,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,lineHeight:h,letterSpacing:e.letterSpacing*e.fontSize,listening:_,onDragStart:()=>{t.history.startTransaction()},onDragMove:t=>{setTimeout((()=>{e.set({x:t.target.x(),y:t.target.y()})}))},onDragEnd:r=>{e.set({x:r.target.x(),y:r.target.y()}),t.history.endTransaction()},onMouseEnter:()=>{i(!0)},onMouseLeave:()=>{i(!1)},onClick:u,onTap:u,onTransformStart:()=>{t.history.startTransaction()},onTransform:t=>{var r;const n=(null===(r=t.target.getStage())||void 0===r?void 0:r.findOne("Transformer")).getActiveAnchor();if("middle-left"===n||"middle-right"===n){const r=t.target.scaleX(),n=t.target.width()*r,o=e.fontSize;let a=n;n<o&&(a=o,d.current&&t.target.position(d.current)),t.target.width(a),t.target.scaleX(1),e.set({x:t.target.x(),y:t.target.y(),width:t.target.width(),rotation:t.target.rotation()}),(0,apply_filters_1.applyFilter)(t.target,e)}t.target.strokeWidth(e.strokeWidth/t.target.scaleX()),d.current=t.target.position()},onTransformEnd:r=>{const n=r.target.scaleX();r.target.scaleX(1),r.target.scaleY(1),r.target.strokeWidth(e.strokeWidth),e.set({fontSize:Math.round(e.fontSize*n),width:Math.ceil(r.target.width()*n),x:r.target.x(),y:r.target.y(),rotation:r.target.rotation()}),t.history.endTransaction()}}),n&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(TextInput,{textNodeRef:r,element:e,selectAll:o,cursorPosition:c.current,onBlur:()=>{e.toggleEditMode(!1)}})),(a||l)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.useSnap=void 0;const react_1=__importDefault(require("react")),konva_1=__importDefault(require("konva")),math_1=require("../utils/math");var GUIDELINE_OFFSET=5;function getObjectSnappingEdges(e){const t=e.__getNodeRect(),n=(0,math_1.getClientRect)(Object.assign(Object.assign({},t),{rotation:konva_1.default.Util.radToDeg(t.rotation)})),
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.useSnap=void 0;const react_1=__importDefault(require("react")),konva_1=__importDefault(require("konva")),math_1=require("../utils/math");var GUIDELINE_OFFSET=5;function getObjectSnappingEdges(e){const t=e.__getNodeRect(),n=(0,math_1.getClientRect)(Object.assign(Object.assign({},t),{rotation:konva_1.default.Util.radToDeg(t.rotation)})),a=e.getAbsolutePosition();return{vertical:[{guide:n.x,offset:a.x-n.x,snap:"start"},{guide:n.x+n.width/2,offset:a.x-n.x-n.width/2,snap:"center"},{guide:n.x+n.width,offset:a.x-n.x-n.width,snap:"end"}],horizontal:[{guide:n.y,offset:a.y-n.y,snap:"start"},{guide:n.y+n.height/2,offset:a.y-n.y-n.height/2,snap:"center"},{guide:n.y+n.height,offset:a.y-n.y-n.height,snap:"end"}]}}function getGuides(e,t){var n=[],a=[];e.vertical.forEach((e=>{t.vertical.forEach((t=>{var a=Math.abs(e-t.guide);a<GUIDELINE_OFFSET&&n.push({lineGuide:e,diff:a,snap:t.snap,offset:t.offset})}))})),e.horizontal.forEach((e=>{t.horizontal.forEach((t=>{var n=Math.abs(e-t.guide);n<GUIDELINE_OFFSET&&a.push({lineGuide:e,diff:n,snap:t.snap,offset:t.offset})}))}));var i=[],r=n.sort(((e,t)=>e.diff-t.diff))[0],s=a.sort(((e,t)=>e.diff-t.diff))[0];return r&&i.push(Object.assign({orientation:"V"},r)),s&&i.push(Object.assign(Object.assign({},s),{orientation:"H"})),i}function useSnap(e){const t=e=>e.hasName("element")||e.hasName("page-background")||e.hasName("elements-area");function n(n){var a;const i=null===(a=e.current)||void 0===a?void 0:a.getStage();var r=[],s=[];return i.find(t).forEach((e=>{if(!(n.indexOf(e)>=0)){var t=e.getClientRect({skipShadow:!0,skipStroke:!0});r.push(t.x,t.x+t.width,t.x+t.width/2),s.push(t.y,t.y+t.height,t.y+t.height/2)}})),{vertical:r,horizontal:s}}function a(t){var n;const a=null===(n=e.current)||void 0===n?void 0:n.getLayer(),i=null==a?void 0:a.children.find((e=>"line-guides"===e.name()));t.forEach((e=>{if("H"===e.orientation){var t=new konva_1.default.Line({points:[-6e3,e.lineGuide,6e3,e.lineGuide],stroke:"rgb(0, 161, 255)",strokeWidth:1,name:"guid-line",dash:[4,6]});null==i||i.add(t),a.batchDraw()}else if("V"===e.orientation){t=new konva_1.default.Line({points:[e.lineGuide,-6e3,e.lineGuide,6e3],stroke:"rgb(0, 161, 255)",strokeWidth:1,name:"guid-line",dash:[4,6]});null==i||i.add(t)}}))}const i=e=>{e.target.getLayer().children.find((e=>"line-guides"===e.name())).destroyChildren();var t=getGuides(n(e.target.nodes()),getObjectSnappingEdges(e.target));if(!t.length)return;a(t);const i=e.target.getAbsolutePosition(),r=Object.assign({},i);t.forEach((e=>{switch(e.snap){case"start":case"center":case"end":switch(e.orientation){case"V":r.x=e.lineGuide+e.offset;break;case"H":r.y=e.lineGuide+e.offset}}}));const s=r.x-i.x,o=r.y-i.y;e.evt.ctrlKey||e.evt.metaKey||e.target.nodes().forEach((e=>{const t=e.getAbsolutePosition();e.setAbsolutePosition({x:t.x+s,y:t.y+o})}))},r=(t,i,r)=>{const s=e.current,o=s.getLayer();if(o.children.find((e=>"line-guides"===e.name())).destroyChildren(),"rotater"===s.getActiveAnchor())return i;if(Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2))>50)return i;if(!o)return i;var d=getGuides(n(s.nodes()),{vertical:[{guide:i.x,offset:0,snap:"start"}],horizontal:[{guide:i.y,offset:0,snap:"start"}]});if(!d.length)return i;a(d);if(r.ctrlKey||r.metaKey)return i;let u=i.x,c=i.x;d.forEach((e=>{switch(e.orientation){case"V":u=e.lineGuide;break;case"H":c=e.lineGuide}}));const f=Math.abs(i.x-u)<10,l=Math.abs(i.y-c)<10;return f&&!l?{x:u,y:t.y}:l&&!f?{x:t.x,y:c}:f&&l?{x:u,y:c}:i},s=e=>{const t=e.target.getLayer();t.children.find((e=>"line-guides"===e.name())).destroyChildren(),t.batchDraw()};react_1.default.useEffect((()=>{e.current&&(e.current.anchorDragBoundFunc(r),e.current.on("dragstart",(()=>{setTimeout((()=>{const e=[...konva_1.default.DD._dragElements.entries()];e.reverse(),konva_1.default.DD._dragElements.clear(),e.forEach((([e,t])=>{konva_1.default.DD._dragElements.set(e,t)}))}))})),e.current.on("dragmove",i),e.current.on("dragend",s),e.current.on("transformend",s))}),[])}exports.useSnap=useSnap;
|
package/canvas/workspace.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Workspace=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),page_1=__importDefault(require("./page")),hotkeys_1=require("./hotkeys"),l10n_1=require("../utils/l10n"),ZERO_SIZE_WARNING="Polotno warning: <Workspace /> component can not automatically detect its size.\nWidth or height of parent elements is equal 0.\nPlease make sure it has non-zero size. You may need to adjust it with your styles. <Workspace /> will automatically fit into parent container.\nFor simpler debugging here is the log of the parent element:",useSaveScrollOnScaleChange=(e,t,r,a,o)=>{const n=react_1.default.useRef({width:t,height:r}),l=react_1.default.useRef({top:0,left:0});react_1.default.useEffect((()=>{const t=e.current,r=()=>{l.current={top:t.scrollTop,left:t.scrollLeft}};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]),react_1.default.useLayoutEffect((()=>{if(!e.current)return;const a=e.current,o=(l.current.left+a.offsetWidth/2)/n.current.width,c=(l.current.top+a.offsetHeight/2)/n.current.height;a.scrollLeft=o*t-a.offsetWidth/2,a.scrollTop=c*r-a.offsetHeight/2,n.current={width:t,height:r}}),[a,t,r])},useScrollOnActiveChange=(e,t,r)=>{const a=react_1.default.useRef(!1),o=react_1.default.useRef(0);react_1.default.useEffect((()=>{const t=e.current,r=()=>{a.current=!0,clearTimeout(o.current),o.current=setTimeout((()=>{a.current=!1}),300)};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]);const n=r.pages.indexOf(r.activePage);react_1.default.useLayoutEffect((()=>{if(!r.activePage)return;if(!e.current)return;if(a.current)return;const o=e.current,n=r.pages.indexOf(r.activePage)*t;Math.abs(n-o.scrollTop)>.9*t&&(o.scrollTop=n)}),[r.activePage,n])};exports.Workspace=(0,mobx_react_lite_1.observer)((({store:e,pageControlsEnabled:t,backgroundColor:r,pageBorderColor:a,activePageBorderColor:o})=>{const[n,l]=react_1.default.useState({width:100,height:100}),c=react_1.default.useRef(n),s=react_1.default.useRef(null),i=react_1.default.useRef(null),u=()=>{if(null===s.current)return;const t=s.current.getBoundingClientRect();0!==t.width&&0!==t.height||(console.warn(ZERO_SIZE_WARNING),console.log(s.current));const r=i.current.clientWidth||t.width,a={width:r,height:t.height};(c.current.width!==a.width||c.current.height!==a.height)&&(l(a),c.current=a);const o=(r-16)/
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Workspace=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),page_1=__importDefault(require("./page")),hotkeys_1=require("./hotkeys"),l10n_1=require("../utils/l10n"),ZERO_SIZE_WARNING="Polotno warning: <Workspace /> component can not automatically detect its size.\nWidth or height of parent elements is equal 0.\nPlease make sure it has non-zero size. You may need to adjust it with your styles. <Workspace /> will automatically fit into parent container.\nFor simpler debugging here is the log of the parent element:",useSaveScrollOnScaleChange=(e,t,r,a,o)=>{const n=react_1.default.useRef({width:t,height:r}),l=react_1.default.useRef({top:0,left:0});react_1.default.useEffect((()=>{const t=e.current,r=()=>{l.current={top:t.scrollTop,left:t.scrollLeft}};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]),react_1.default.useLayoutEffect((()=>{if(!e.current)return;const a=e.current,o=(l.current.left+a.offsetWidth/2)/n.current.width,c=(l.current.top+a.offsetHeight/2)/n.current.height;a.scrollLeft=o*t-a.offsetWidth/2,a.scrollTop=c*r-a.offsetHeight/2,n.current={width:t,height:r}}),[a,t,r])},useScrollOnActiveChange=(e,t,r)=>{const a=react_1.default.useRef(!1),o=react_1.default.useRef(0);react_1.default.useEffect((()=>{const t=e.current,r=()=>{a.current=!0,clearTimeout(o.current),o.current=setTimeout((()=>{a.current=!1}),300)};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]);const n=r.pages.indexOf(r.activePage);react_1.default.useLayoutEffect((()=>{if(!r.activePage)return;if(!e.current)return;if(a.current)return;const o=e.current,n=r.pages.indexOf(r.activePage)*t;Math.abs(n-o.scrollTop)>.9*t&&(o.scrollTop=n)}),[r.activePage,n])};exports.Workspace=(0,mobx_react_lite_1.observer)((({store:e,pageControlsEnabled:t,backgroundColor:r,pageBorderColor:a,activePageBorderColor:o})=>{const[n,l]=react_1.default.useState({width:100,height:100}),c=react_1.default.useRef(n),s=react_1.default.useRef(null),i=react_1.default.useRef(null),u=Math.max(0,...e.pages.map((e=>e.bleed))),d=e.width+2*u,f=e.height+2*u,h=()=>{if(null===s.current)return;const t=s.current.getBoundingClientRect();0!==t.width&&0!==t.height||(console.warn(ZERO_SIZE_WARNING),console.log(s.current));const r=i.current.clientWidth||t.width,a={width:r,height:t.height};(c.current.width!==a.width||c.current.height!==a.height)&&(l(a),c.current=a);const o=(r-16)/d,n=(t.height-90)/f,u=Math.max(Math.min(o,n),.01);e.scaleToFit!==u&&(e.setScale(u),e._setScaleToFit(u))};react_1.default.useEffect(h,[d,f]),react_1.default.useEffect((()=>{const e=s.current;if(window.ResizeObserver){const t=new ResizeObserver(h);return t.observe(e),()=>t.unobserve(e)}{const e=setInterval(h,100);return()=>clearInterval(e)}}),[]);const g=Math.max(8,(n.width-d*e.scale)/2),p=f*e.scale*e.pages.length,_=Math.max(45,(n.height-p)/e.pages.length/2);react_1.default.useEffect((()=>{const t=t=>{(0,hotkeys_1.handleHotkey)(t,e)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)}),[]);useSaveScrollOnScaleChange(i,d*e.scale+2*g,f*e.scale+2*_,e.scale),useScrollOnActiveChange(i,f*e.scale+2*_,e);const m=n.width>=d*e.scale+2*g,v=r||"#e8e8e8",w=e.pages.indexOf(e.activePage);return react_1.default.createElement("div",{ref:s,style:{width:"100%",height:"100%",position:"relative",outline:"none",flex:1,backgroundColor:v},tabIndex:0,className:"polotno-workspace-container"},react_1.default.createElement("div",{ref:i,onScroll:t=>{const r=t.currentTarget.childNodes[0].offsetHeight,a=t.currentTarget.scrollTop,o=Math.floor((a+n.height/2)/r),l=e.pages[o];l&&l.select()},style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",overflow:"auto",overflowX:m?"hidden":"auto"},className:"polotno-workspace-inner"},e.pages.map(((r,n)=>Math.abs(n-w)<=1||r._exporting?react_1.default.createElement(page_1.default,{key:r.id,page:r,xPadding:g,yPadding:_,width:d*e.scale+2*g,height:f*e.scale+2*_,store:e,pageControlsEnabled:t,backColor:v,pageBorderColor:a||"lightgrey",activePageBorderColor:o||"rgb(0, 161, 255)"}):react_1.default.createElement("div",{key:r.id,style:{width:d*e.scale+2*g+"px",height:f*e.scale+2*_+"px"}}))),0===e.pages.length&&react_1.default.createElement("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center"}},react_1.default.createElement("p",null,(0,l10n_1.t)("workspace.noPages")),react_1.default.createElement("button",{onClick:()=>{e.addPage()}},(0,l10n_1.t)("workspace.addPage")))))})),exports.default=exports.Workspace;
|
package/model/store.d.ts
CHANGED
|
@@ -648,8 +648,9 @@ export declare const Page: import("mobx-state-tree").IModelType<{
|
|
|
648
648
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
649
649
|
children: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyType>;
|
|
650
650
|
background: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
651
|
-
|
|
651
|
+
bleed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
652
652
|
custom: import("mobx-state-tree").IType<any, any, any>;
|
|
653
|
+
_exporting: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
653
654
|
}, {
|
|
654
655
|
readonly store: any;
|
|
655
656
|
} & {
|
|
@@ -686,8 +687,9 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
686
687
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
687
688
|
children: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyType>;
|
|
688
689
|
background: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
689
|
-
|
|
690
|
+
bleed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
690
691
|
custom: import("mobx-state-tree").IType<any, any, any>;
|
|
692
|
+
_exporting: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
691
693
|
}, {
|
|
692
694
|
readonly store: any;
|
|
693
695
|
} & {
|
|
@@ -1009,8 +1011,9 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
1009
1011
|
id: string;
|
|
1010
1012
|
children: import("mobx-state-tree").IMSTArray<import("mobx-state-tree").IAnyType> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyType>>;
|
|
1011
1013
|
background: string;
|
|
1012
|
-
|
|
1014
|
+
bleed: number;
|
|
1013
1015
|
custom: any;
|
|
1016
|
+
_exporting: boolean;
|
|
1014
1017
|
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
1015
1018
|
readonly store: any;
|
|
1016
1019
|
} & {
|
|
@@ -1028,8 +1031,9 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
1028
1031
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
1029
1032
|
children: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyType>;
|
|
1030
1033
|
background: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
1031
|
-
|
|
1034
|
+
bleed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
1032
1035
|
custom: import("mobx-state-tree").IType<any, any, any>;
|
|
1036
|
+
_exporting: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
1033
1037
|
}, {
|
|
1034
1038
|
readonly store: any;
|
|
1035
1039
|
} & {
|
|
@@ -1053,8 +1057,9 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
1053
1057
|
id: string;
|
|
1054
1058
|
children: import("mobx-state-tree").IMSTArray<import("mobx-state-tree").IAnyType> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyType>>;
|
|
1055
1059
|
background: string;
|
|
1056
|
-
|
|
1060
|
+
bleed: number;
|
|
1057
1061
|
custom: any;
|
|
1062
|
+
_exporting: boolean;
|
|
1058
1063
|
} & import("mobx-state-tree/dist/internal").NonEmptyObject & {
|
|
1059
1064
|
readonly store: any;
|
|
1060
1065
|
} & {
|
|
@@ -1072,8 +1077,9 @@ export declare const Store: import("mobx-state-tree").IModelType<{
|
|
|
1072
1077
|
id: import("mobx-state-tree").ISimpleType<string>;
|
|
1073
1078
|
children: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyType>;
|
|
1074
1079
|
background: import("mobx-state-tree").IType<string | undefined, string, string>;
|
|
1075
|
-
|
|
1080
|
+
bleed: import("mobx-state-tree").IType<number | undefined, number, number>;
|
|
1076
1081
|
custom: import("mobx-state-tree").IType<any, any, any>;
|
|
1082
|
+
_exporting: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
|
|
1077
1083
|
}, {
|
|
1078
1084
|
readonly store: any;
|
|
1079
1085
|
} & {
|
package/model/store.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,o,s){void 0===s&&(s=o),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,s){void 0===s&&(s=o),e[s]=t[o]}),__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 o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&__createBinding(t,e,o);return __setModuleDefault(t,e),t},__rest=this&&this.__rest||function(e,t){var o={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(o[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(s=Object.getOwnPropertySymbols(e);n<s.length;n++)t.indexOf(s[n])<0&&Object.prototype.propertyIsEnumerable.call(e,s[n])&&(o[s[n]]=e[s[n]])}return o},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.createStore=exports.Store=exports.Font=exports.Page=exports.registerShapeModel=exports.SVGElement=exports.ImageElement=exports.TextElement=exports.Element=void 0;const mobx_state_tree_1=require("mobx-state-tree"),undo_manager_1=require("./undo-manager"),nanoid_1=require("nanoid"),konva_1=__importDefault(require("konva")),download_1=require("../utils/download"),pdf_1=require("../utils/pdf"),validate_key_1=require("../utils/validate-key"),fonts=__importStar(require("../utils/fonts")),svg_1=require("../utils/svg"),loader_1=require("../utils/loader");(0,mobx_state_tree_1.setLivelinessChecking)("ignore"),exports.Element=mobx_state_tree_1.types.model("Element",{id:mobx_state_tree_1.types.identifier,type:"none",x:0,y:0,rotation:0,opacity:1,visible:!0,locked:!1,blurEnabled:!1,blurRadius:10,brightnessEnabled:!1,brightness:0,sepiaEnabled:!1,grayscaleEnabled:!1,shadowEnabled:!1,shadowBlur:5,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"black",custom:mobx_state_tree_1.types.frozen(),selectable:!0,alwaysOnTop:!1,showInExport:!0}).preProcessSnapshot((e=>{const t=Object.assign(Object.assign({},e),{x:e.x||0,y:e.y||0});return"width"in e&&(t.width=t.width||1),"height"in e&&(t.height=t.height||1),t})).postProcessSnapshot((e=>{const t=Object.assign({},e),o={};for(var s in t)"_"!==s[0]&&(o[s]=e[s]);return o})).views((e=>({get page(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Page)},get store(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Store)}}))).actions((e=>({toJSON:()=>Object.assign({},(0,mobx_state_tree_1.getSnapshot)(e))}))).actions((e=>({clone(t){const o=e.toJSON();return t.id=t.id||(0,nanoid_1.nanoid)(10),Object.assign(o,t),e.page.addElement(o)},set(t){Object.assign(e,t)},moveUp(){e.page.moveElementUp(e.id)},moveTop(){e.page.moveElementTop(e.id)},moveDown(){e.page.moveElementDown(e.id)},moveBottom(){e.page.moveElementBottom(e.id)},beforeDestroy(){e.store.history.endTransaction()}}))),exports.TextElement=exports.Element.named("Text").props({type:"text",text:"",placeholder:"",fontSize:14,fontFamily:"Roboto",fontStyle:"normal",fontWeight:"normal",textDecoration:"",fill:"black",align:"center",width:100,height:14,strokeWidth:0,stroke:"black",lineHeight:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.union(mobx_state_tree_1.types.number,mobx_state_tree_1.types.string),1.2),letterSpacing:0,_editModeEnabled:!1}).preProcessSnapshot((e=>Object.assign(Object.assign({},e),{fontSize:e.fontSize||0}))).actions((e=>({toggleEditMode(t){e._editModeEnabled=null!=t?t:!e._editModeEnabled,e._editModeEnabled?e.store.history.startTransaction():e.store.history.endTransaction()}}))),exports.ImageElement=exports.Element.named("Image").props({type:"image",width:100,height:100,src:"",cropX:0,cropY:0,cropWidth:1,cropHeight:1,cornerRadius:0,flipX:!1,flipY:!1,clipSrc:"",borderColor:"black",borderSize:0,_cropModeEnabled:!1}).actions((e=>({toggleCropMode(t){e._cropModeEnabled=null!=t?t:!e._cropModeEnabled,e._cropModeEnabled?e.store.history.startTransaction():e.store.history.endTransaction()}}))),exports.SVGElement=exports.Element.named("SVG").props({type:"svg",src:"",maskSrc:"",__svgString:"",cropX:0,cropY:0,cropWidth:1,cropHeight:1,keepRatio:!0,flipX:!1,flipY:!1,width:100,height:100,borderColor:"black",borderSize:0,colorsReplace:mobx_state_tree_1.types.map(mobx_state_tree_1.types.string)}).preProcessSnapshot((e=>Object.assign(Object.assign({},e),{src:e.src||e.svgSource}))).views((e=>({get colors(){return e.__svgString?(0,svg_1.getColors)(e.__svgString):[]},get __finalSrc(){return e.__svgString?(0,svg_1.replaceColors)(e.__svgString,e.colorsReplace):this.src},get __isLoaded(){if(!e.__svgString)return!1;return!(Array.from(e.colorsReplace.keys()).length>0)||e.__finalSrc!==e.src}}))).actions((e=>{let t=()=>{};return{async _loadSVG(){if(!e.src)return;const t=await(0,svg_1.urlToString)(e.src);(0,mobx_state_tree_1.isAlive)(e)&&(0,mobx_state_tree_1.hasParent)(e)&&e.store.history.ignore((()=>{e.set({__svgString:(0,svg_1.fixSize)(t)})}))},async afterCreate(){e._loadSVG();let o=e.src;t=(0,mobx_state_tree_1.onSnapshot)(e,(t=>{t.src===o&&e.__svgString||(e._loadSVG(),o=e.src)}))},beforeDestroy(){t()},replaceColor(t,o){e.colorsReplace.set(t,o)}}}));const TYPES_MAP={svg:exports.SVGElement,text:exports.TextElement,image:exports.ImageElement},ADDITIONAL_TYPES=[];function registerShapeModel(e){const t=e.type;if(!t)throw new Error('You must pass "type" attribute to custom model.');const o=exports.Element.named(t).props(e);TYPES_MAP[t]=o,ADDITIONAL_TYPES.push(o)}exports.registerShapeModel=registerShapeModel;const additionalTypesUnion=[...new Array(20)].map(((e,t)=>mobx_state_tree_1.types.late((()=>ADDITIONAL_TYPES[t])))),ElementTypes=mobx_state_tree_1.types.union({dispatcher:e=>{const t=TYPES_MAP[e.type];if(!t)throw new Error(`Unknown element type: "${e.type}"`);return t}},exports.SVGElement,exports.TextElement,exports.ImageElement,...additionalTypesUnion),ChildrenType=mobx_state_tree_1.types.array(ElementTypes);function createStore({key:e,showCredit:t}={key:"",showCredit:!1}){const o=exports.Store.create();return o.__checkKey(e,t),o}exports.Page=mobx_state_tree_1.types.model("Page",{id:mobx_state_tree_1.types.identifier,children:ChildrenType,background:"white",_exporting:!1,custom:mobx_state_tree_1.types.frozen()}).postProcessSnapshot((e=>{const t=Object.assign({},e),o={};for(var s in t)"_"!==s[0]&&(o[s]=e[s]);return o})).views((e=>({get store(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Store)}}))).actions((e=>({toJSON:()=>Object.assign({},(0,mobx_state_tree_1.getSnapshot)(e)),clone(t){const o=e.children.map((e=>{const t=e.toJSON();return t.id=(0,nanoid_1.nanoid)(10),t})),s=Object.assign({id:(0,nanoid_1.nanoid)(10),children:o,background:e.background},t),n=e.store.addPage(s),r=e.store.pages.indexOf(e);n.setZIndex(r+1),n.select()},setZIndex(t){e.store.setPageZIndex(e.id,t)},set(t){Object.assign(e,t)},select(){e.store.selectPage(e.id)},addElement(t){const o=TYPES_MAP[t.type];if(!o)return void console.error("Can not find model with type "+t.type);const s=o.create(Object.assign({id:(0,nanoid_1.nanoid)(10)},t));return e.children.push(s),s.selectable&&e.store.selectElements([s.id]),s},moveElementUp(t){const o=e.children.findIndex((e=>e.id===t)),s=e.children[o];(0,mobx_state_tree_1.detach)(s),e.children.remove(s),e.children.splice(o+1,0,s)},moveElementDown(t){const o=e.children.findIndex((e=>e.id===t)),s=e.children[o];(0,mobx_state_tree_1.detach)(s),e.children.remove(s),e.children.splice(o-1,0,s)},moveElementTop(t){const o=e.children.findIndex((e=>e.id===t)),s=e.children[o];(0,mobx_state_tree_1.detach)(s),e.children.remove(s),e.children.push(s)},moveElementBottom(t){const o=e.children.findIndex((e=>e.id===t)),s=e.children[o];(0,mobx_state_tree_1.detach)(s),e.children.remove(s),e.children.splice(0,0,s)}}))),exports.Font=mobx_state_tree_1.types.model("Font",{fontFamily:mobx_state_tree_1.types.string,url:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.string,""),styles:mobx_state_tree_1.types.frozen()}).preProcessSnapshot((e=>Object.assign(Object.assign({},e),{fontFamily:e.fontFamily||e.name}))),exports.Store=mobx_state_tree_1.types.model("Store",{role:"",pages:mobx_state_tree_1.types.array(exports.Page),fonts:mobx_state_tree_1.types.array(exports.Font),width:1080,height:1080,scale:1,scaleToFit:1,openedSidePanel:"",selectedElementsIds:mobx_state_tree_1.types.array(mobx_state_tree_1.types.string),history:mobx_state_tree_1.types.optional(undo_manager_1.UndoManager,{targetPath:"../pages"}),_elementsPixelRatio:2,_showCredit:!1,_activePageId:""}).views((e=>({get selectedElements(){return e.selectedElementsIds.map((t=>{for(const o of e.pages)for(const e of o.children)if(e.id===t)return e})).filter((e=>!!e))},get activePage(){return e.pages.slice().find((t=>t.id===e._activePageId))||(e.pages.length?e.pages[0]:null)}}))).actions((e=>({async __checkKey(t,o){const s=await(0,validate_key_1.validateKey)(t);e.__(s,o)},__(t,o){e._showCredit=!t||o},setRole(t){e.role=t},getElementById(t){for(const o of e.pages)for(const e of o.children)if(e.id===t)return e},addPage(t){const o=exports.Page.create(Object.assign({id:(0,nanoid_1.nanoid)(10)},t));return e.pages.push(o),e._activePageId=o.id,o},selectPage(t){e._activePageId=t},selectElements(t){e.selectedElementsIds=(0,mobx_state_tree_1.cast)(t)},openSidePanel(t){e.openedSidePanel=t},setScale(t){e.scale=t},_setScaleToFit(t){e.scaleToFit=t},setElementsPixelRatio(t){e._elementsPixelRatio=t},setSize(t,o,s){if(s){const s=t/e.width,n=o/e.height;for(const t of e.pages)for(const e of t.children)e.set({x:e.x*s,y:e.y*n}),"text"===e.type?e.set({fontSize:e.fontSize*s,width:Math.max(e.width*s,2)}):"image"===e.type?e.set({width:e.width*s,height:e.height*n}):"svg"===e.type&&e.set({width:Math.max(e.width*s,2),height:Math.max(e.height*s,2)})}e.width=t,e.height=o},setPageZIndex(t,o){const s=e.pages.find((e=>e.id===t));s&&((0,mobx_state_tree_1.detach)(s),e.pages.remove(s),e.pages.splice(o,0,s))},deletePages(t){const o=e.pages.indexOf(e.activePage);t.forEach((t=>{const o=e.pages.find((e=>e.id===t));(0,mobx_state_tree_1.destroy)(o)}));const s=Math.min(e.pages.length-1,o),n=e.pages[s];n&&(e._activePageId=n.id),e.selectedElementsIds=(0,mobx_state_tree_1.cast)(e.selectedElementsIds.filter((t=>e.getElementById(t))))},deleteElements(t){t.forEach((t=>{e.pages.forEach((e=>{const o=e.children.find((e=>e.id===t));o&&(0,mobx_state_tree_1.destroy)(o)}))})),e.selectedElementsIds=(0,mobx_state_tree_1.cast)([])},on(t,o){if("change"===t){let t=e.toJSON();return(0,mobx_state_tree_1.onSnapshot)(e,(s=>{const n=e.toJSON();JSON.stringify(n)!==JSON.stringify(t)&&(t=n,o(n))}))}},async toDataURL({pixelRatio:t,ignoreBackground:o,pageId:s,mimeType:n}={}){const r=t||1;s=s||e.pages[0].id;const a=e.pages.find((e=>e.id===s));null==a||a.set({_exporting:!0}),await new Promise((e=>{setTimeout(e,0)})),await e.waitLoading();const i=konva_1.default.stages.find((e=>e.getAttr("pageId")===s));if(!i)throw new Error(`Export is failed. Can not find stage for page ${s}. Looks like <Workspace /> component is not mounted, but it is required in order to process the export.`);const d=i.findOne(".page-container");i.find("Transformer").forEach((e=>e.visible(!1))),d.findOne(".page-background").shadowEnabled(!1),d.findOne(".page-background").strokeEnabled(!1),d.find(".highlighter").forEach((e=>e.visible(!1)));const l=d.find((e=>e.getAttr("hideInExport")));l.forEach((e=>{e.setAttr("oldVisible",e.visible()),e.hide()})),o&&d.findOne(".page-background").hide();const c=d.toDataURL({x:d.x(),y:d.y(),width:e.width*d.scaleX(),height:e.height*d.scaleY(),pixelRatio:1/d.scaleX()*r,mimeType:n});return o&&d.findOne(".page-background").show(),l.forEach((e=>{e.visible(e.getAttr("oldVisible"))})),d.findOne(".page-background").shadowEnabled(!0),d.findOne(".page-background").strokeEnabled(!0),i.find("Transformer").forEach((e=>e.visible(!0))),d.find(".highlighter").forEach((e=>e.visible(!0))),null==a||a.set({_exporting:!1}),c},async saveAsImage(t={}){var{fileName:o}=t,s=__rest(t,["fileName"]);const n=s.mimeType||"image/png",r=n.split("/")[1];(0,download_1.downloadFile)(await e.toDataURL(s),o||"polotno."+r,n)},async _toPDF(t){const o=t.dpi||300,s=e=>.75*e;var n=new(await(0,pdf_1.getJsPDF)())({unit:"pt",orientation:e.width>e.height?"landscape":"portrait",format:[s(e.width),s(e.height)]}),r=n.internal.pageSize.getWidth(),a=n.internal.pageSize.getHeight();const i=e._elementsPixelRatio,d=o/72;e.setElementsPixelRatio(d),await new Promise((e=>setTimeout(e)));for(const o of e.pages){0!==e.pages.indexOf(o)&&n.addPage(),n.addImage(await e.toDataURL(Object.assign(Object.assign({},t),{pageId:o.id,pixelRatio:d})),0,0,r,a,void 0,"MEDIUM")}return e.setElementsPixelRatio(i),n},toPDFDataURL:async t=>(await e._toPDF(Object.assign({mimeType:"image/jpg"},t))).output("datauristring"),async saveAsPDF(t={}){var{fileName:o,dpi:s}=t,n=__rest(t,["fileName","dpi"]);(await e._toPDF(Object.assign({mimeType:"image/jpg"},n))).save(o||"polotno.pdf")},async waitLoading(){await(0,loader_1.whenLoaded)()},toJSON:()=>({width:e.width,height:e.height,fonts:(0,mobx_state_tree_1.getSnapshot)(e.fonts),pages:(0,mobx_state_tree_1.getSnapshot)(e.pages)}),loadJSON(t,o=!1){var s;e.pages.forEach((e=>e.children.forEach((e=>(0,mobx_state_tree_1.detach)(e))))),e.pages=(0,mobx_state_tree_1.cast)([]),t._activePageId=null===(s=t.pages[0])||void 0===s?void 0:s.id,t.scale=e.scale,t._isKeyValid=e._isKeyValid,t.openedSidePanel=e.openedSidePanel,o&&(t.history=e.history.toJSON()),(0,mobx_state_tree_1.applySnapshot)(e,t)},addFont(t){e.removeFont(t.fontFamily),e.fonts.push(t),e.loadFont(t.fontFamily)},removeFont(t){e.fonts.filter((e=>e.fontFamily===t)).forEach((e=>(0,mobx_state_tree_1.destroy)(e)))},async loadFont(t){const o=e.fonts.find((e=>e.fontFamily===t))||fonts.globalFonts.find((e=>e.fontFamily===t));o?fonts.injectCustomFont(o):fonts.injectGoogleFont(t),await fonts.loadFont(t)}}))),exports.createStore=createStore,exports.default=createStore;
|
|
1
|
+
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,o,s){void 0===s&&(s=o),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,s){void 0===s&&(s=o),e[s]=t[o]}),__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 o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&__createBinding(t,e,o);return __setModuleDefault(t,e),t},__rest=this&&this.__rest||function(e,t){var o={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(o[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(o[s[r]]=e[s[r]])}return o},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.createStore=exports.Store=exports.Font=exports.Page=exports.registerShapeModel=exports.SVGElement=exports.ImageElement=exports.TextElement=exports.Element=void 0;const mobx_state_tree_1=require("mobx-state-tree"),undo_manager_1=require("./undo-manager"),nanoid_1=require("nanoid"),konva_1=__importDefault(require("konva")),download_1=require("../utils/download"),pdf_1=require("../utils/pdf"),validate_key_1=require("../utils/validate-key"),fonts=__importStar(require("../utils/fonts")),svg_1=require("../utils/svg"),loader_1=require("../utils/loader");(0,mobx_state_tree_1.setLivelinessChecking)("ignore"),exports.Element=mobx_state_tree_1.types.model("Element",{id:mobx_state_tree_1.types.identifier,type:"none",x:0,y:0,rotation:0,opacity:1,visible:!0,locked:!1,blurEnabled:!1,blurRadius:10,brightnessEnabled:!1,brightness:0,sepiaEnabled:!1,grayscaleEnabled:!1,shadowEnabled:!1,shadowBlur:5,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"black",custom:mobx_state_tree_1.types.frozen(),selectable:!0,alwaysOnTop:!1,showInExport:!0}).preProcessSnapshot((e=>{const t=Object.assign(Object.assign({},e),{x:e.x||0,y:e.y||0});return"width"in e&&(t.width=t.width||1),"height"in e&&(t.height=t.height||1),t})).postProcessSnapshot((e=>{const t=Object.assign({},e),o={};for(var s in t)"_"!==s[0]&&(o[s]=e[s]);return o})).views((e=>({get page(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Page)},get store(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Store)}}))).actions((e=>({toJSON:()=>Object.assign({},(0,mobx_state_tree_1.getSnapshot)(e))}))).actions((e=>({clone(t){const o=e.toJSON();return t.id=t.id||(0,nanoid_1.nanoid)(10),Object.assign(o,t),e.page.addElement(o)},set(t){Object.assign(e,t)},moveUp(){e.page.moveElementUp(e.id)},moveTop(){e.page.moveElementTop(e.id)},moveDown(){e.page.moveElementDown(e.id)},moveBottom(){e.page.moveElementBottom(e.id)},beforeDestroy(){e.store.history.endTransaction()}}))),exports.TextElement=exports.Element.named("Text").props({type:"text",text:"",placeholder:"",fontSize:14,fontFamily:"Roboto",fontStyle:"normal",fontWeight:"normal",textDecoration:"",fill:"black",align:"center",width:100,height:14,strokeWidth:0,stroke:"black",lineHeight:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.union(mobx_state_tree_1.types.number,mobx_state_tree_1.types.string),1.2),letterSpacing:0,_editModeEnabled:!1}).preProcessSnapshot((e=>Object.assign({},e))).actions((e=>({toggleEditMode(t){e._editModeEnabled=null!=t?t:!e._editModeEnabled,e._editModeEnabled?e.store.history.startTransaction():e.store.history.endTransaction()}}))),exports.ImageElement=exports.Element.named("Image").props({type:"image",width:100,height:100,src:"",cropX:0,cropY:0,cropWidth:1,cropHeight:1,cornerRadius:0,flipX:!1,flipY:!1,clipSrc:"",borderColor:"black",borderSize:0,_cropModeEnabled:!1}).actions((e=>({toggleCropMode(t){e._cropModeEnabled=null!=t?t:!e._cropModeEnabled,e._cropModeEnabled?e.store.history.startTransaction():e.store.history.endTransaction()}}))),exports.SVGElement=exports.Element.named("SVG").props({type:"svg",src:"",maskSrc:"",__svgString:"",cropX:0,cropY:0,cropWidth:1,cropHeight:1,keepRatio:!0,flipX:!1,flipY:!1,width:100,height:100,borderColor:"black",borderSize:0,colorsReplace:mobx_state_tree_1.types.map(mobx_state_tree_1.types.string)}).preProcessSnapshot((e=>Object.assign(Object.assign({},e),{src:e.src||e.svgSource}))).views((e=>({get colors(){return e.__svgString?(0,svg_1.getColors)(e.__svgString):[]},get __finalSrc(){return e.__svgString?(0,svg_1.replaceColors)(e.__svgString,e.colorsReplace):this.src},get __isLoaded(){if(!e.__svgString)return!1;return!(Array.from(e.colorsReplace.keys()).length>0)||e.__finalSrc!==e.src}}))).actions((e=>{let t=()=>{};return{async _loadSVG(){if(!e.src)return;const t=await(0,svg_1.urlToString)(e.src);(0,mobx_state_tree_1.isAlive)(e)&&(0,mobx_state_tree_1.hasParent)(e)&&e.store.history.ignore((()=>{e.set({__svgString:(0,svg_1.fixSize)(t)})}))},async afterCreate(){e._loadSVG();let o=e.src;t=(0,mobx_state_tree_1.onSnapshot)(e,(t=>{t.src===o&&e.__svgString||(e._loadSVG(),o=e.src)}))},beforeDestroy(){t()},replaceColor(t,o){e.colorsReplace.set(t,o)}}}));const TYPES_MAP={svg:exports.SVGElement,text:exports.TextElement,image:exports.ImageElement},ADDITIONAL_TYPES=[];function registerShapeModel(e){const t=e.type;if(!t)throw new Error('You must pass "type" attribute to custom model.');const o=exports.Element.named(t).props(e);TYPES_MAP[t]=o,ADDITIONAL_TYPES.push(o)}exports.registerShapeModel=registerShapeModel;const additionalTypesUnion=[...new Array(20)].map(((e,t)=>mobx_state_tree_1.types.late((()=>ADDITIONAL_TYPES[t])))),ElementTypes=mobx_state_tree_1.types.union({dispatcher:e=>{const t=TYPES_MAP[e.type];if(!t)throw new Error(`Unknown element type: "${e.type}"`);return t}},exports.SVGElement,exports.TextElement,exports.ImageElement,...additionalTypesUnion),ChildrenType=mobx_state_tree_1.types.array(ElementTypes);function createStore({key:e,showCredit:t}={key:"",showCredit:!1}){const o=exports.Store.create();return o.__checkKey(e,t),o}exports.Page=mobx_state_tree_1.types.model("Page",{id:mobx_state_tree_1.types.identifier,children:ChildrenType,background:"white",bleed:0,custom:mobx_state_tree_1.types.frozen(),_exporting:!1}).postProcessSnapshot((e=>{const t=Object.assign({},e),o={};for(var s in t)"_"!==s[0]&&(o[s]=e[s]);return o})).views((e=>({get store(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Store)}}))).actions((e=>({toJSON:()=>Object.assign({},(0,mobx_state_tree_1.getSnapshot)(e)),clone(t){const o=e.children.map((e=>{const t=e.toJSON();return t.id=(0,nanoid_1.nanoid)(10),t})),s=Object.assign({id:(0,nanoid_1.nanoid)(10),children:o,background:e.background},t),r=e.store.addPage(s),n=e.store.pages.indexOf(e);r.setZIndex(n+1),r.select()},setZIndex(t){e.store.setPageZIndex(e.id,t)},set(t){Object.assign(e,t)},select(){e.store.selectPage(e.id)},addElement(t){const o=TYPES_MAP[t.type];if(!o)return void console.error("Can not find model with type "+t.type);const s=o.create(Object.assign({id:(0,nanoid_1.nanoid)(10)},t));return e.children.push(s),s.selectable&&e.store.selectElements([s.id]),s},moveElementUp(t){const o=e.children.findIndex((e=>e.id===t)),s=e.children[o];(0,mobx_state_tree_1.detach)(s),e.children.remove(s),e.children.splice(o+1,0,s)},moveElementDown(t){const o=e.children.findIndex((e=>e.id===t)),s=e.children[o];(0,mobx_state_tree_1.detach)(s),e.children.remove(s),e.children.splice(o-1,0,s)},moveElementTop(t){const o=e.children.findIndex((e=>e.id===t)),s=e.children[o];(0,mobx_state_tree_1.detach)(s),e.children.remove(s),e.children.push(s)},moveElementBottom(t){const o=e.children.findIndex((e=>e.id===t)),s=e.children[o];(0,mobx_state_tree_1.detach)(s),e.children.remove(s),e.children.splice(0,0,s)}}))),exports.Font=mobx_state_tree_1.types.model("Font",{fontFamily:mobx_state_tree_1.types.string,url:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.string,""),styles:mobx_state_tree_1.types.frozen()}).preProcessSnapshot((e=>Object.assign(Object.assign({},e),{fontFamily:e.fontFamily||e.name}))),exports.Store=mobx_state_tree_1.types.model("Store",{role:"",pages:mobx_state_tree_1.types.array(exports.Page),fonts:mobx_state_tree_1.types.array(exports.Font),width:1080,height:1080,scale:1,scaleToFit:1,openedSidePanel:"",selectedElementsIds:mobx_state_tree_1.types.array(mobx_state_tree_1.types.string),history:mobx_state_tree_1.types.optional(undo_manager_1.UndoManager,{targetPath:"../pages"}),_elementsPixelRatio:2,_showCredit:!1,_activePageId:""}).views((e=>({get selectedElements(){return e.selectedElementsIds.map((t=>{for(const o of e.pages)for(const e of o.children)if(e.id===t)return e})).filter((e=>!!e))},get activePage(){return e.pages.slice().find((t=>t.id===e._activePageId))||(e.pages.length?e.pages[0]:null)}}))).actions((e=>({async __checkKey(t,o){const s=await(0,validate_key_1.validateKey)(t);e.__(s,o)},__(t,o){e._showCredit=!t||o},setRole(t){e.role=t},getElementById(t){for(const o of e.pages)for(const e of o.children)if(e.id===t)return e},addPage(t){const o=exports.Page.create(Object.assign({id:(0,nanoid_1.nanoid)(10)},t));return e.pages.push(o),e._activePageId=o.id,o},selectPage(t){e._activePageId=t},selectElements(t){e.selectedElementsIds=(0,mobx_state_tree_1.cast)(t)},openSidePanel(t){e.openedSidePanel=t},setScale(t){e.scale=t},_setScaleToFit(t){e.scaleToFit=t},setElementsPixelRatio(t){e._elementsPixelRatio=t},setSize(t,o,s){if(s){const s=t/e.width,r=o/e.height;for(const t of e.pages)for(const e of t.children)e.set({x:e.x*s,y:e.y*r}),"text"===e.type?e.set({fontSize:e.fontSize*s,width:Math.max(e.width*s,2)}):"image"===e.type?e.set({width:e.width*s,height:e.height*r}):"svg"===e.type&&e.set({width:Math.max(e.width*s,2),height:Math.max(e.height*s,2)})}e.width=t,e.height=o},setPageZIndex(t,o){const s=e.pages.find((e=>e.id===t));s&&((0,mobx_state_tree_1.detach)(s),e.pages.remove(s),e.pages.splice(o,0,s))},deletePages(t){const o=e.pages.indexOf(e.activePage);t.forEach((t=>{const o=e.pages.find((e=>e.id===t));(0,mobx_state_tree_1.destroy)(o)}));const s=Math.min(e.pages.length-1,o),r=e.pages[s];r&&(e._activePageId=r.id),e.selectedElementsIds=(0,mobx_state_tree_1.cast)(e.selectedElementsIds.filter((t=>e.getElementById(t))))},deleteElements(t){t.forEach((t=>{e.pages.forEach((e=>{const o=e.children.find((e=>e.id===t));o&&(0,mobx_state_tree_1.destroy)(o)}))})),e.selectedElementsIds=(0,mobx_state_tree_1.cast)([])},on(t,o){if("change"===t){let t=e.toJSON();return(0,mobx_state_tree_1.onSnapshot)(e,(s=>{const r=e.toJSON();JSON.stringify(r)!==JSON.stringify(t)&&(t=r,o(r))}))}},async toDataURL({pixelRatio:t,ignoreBackground:o,pageId:s,mimeType:r}={}){var n;const a=t||1;s=s||(null===(n=e.pages[0])||void 0===n?void 0:n.id);const i=e.pages.find((e=>e.id===s));if(!i)throw new Error(`No page for export with id ${s}`);null==i||i.set({_exporting:!0}),await new Promise((e=>{setTimeout(e,0)})),await e.waitLoading();const d=konva_1.default.stages.find((e=>e.getAttr("pageId")===s));if(!d)throw new Error(`Export is failed. Can not find stage for page ${s}. Looks like <Workspace /> component is not mounted, but it is required in order to process the export.`);const l=d.findOne(".page-container");d.find("Transformer").forEach((e=>e.visible(!1))),l.findOne(".page-background").shadowEnabled(!1),l.findOne(".page-background").strokeEnabled(!1),l.find(".highlighter").forEach((e=>e.visible(!1))),l.findOne(".bleed").hide();const c=l.find((e=>e.getAttr("hideInExport")));c.forEach((e=>{e.setAttr("oldVisible",e.visible()),e.hide()})),o&&l.findOne(".page-background").hide();const _=l.toDataURL({x:l.x(),y:l.y(),width:(e.width+2*i.bleed)*l.scaleX(),height:(e.height+2*i.bleed)*l.scaleY(),pixelRatio:1/l.scaleX()*a,mimeType:r});return o&&l.findOne(".page-background").show(),c.forEach((e=>{e.visible(e.getAttr("oldVisible"))})),l.findOne(".page-background").shadowEnabled(!0),l.findOne(".page-background").strokeEnabled(!0),d.find("Transformer").forEach((e=>e.visible(!0))),l.find(".highlighter").forEach((e=>e.visible(!0))),l.findOne(".bleed").show(),null==i||i.set({_exporting:!1}),_},async saveAsImage(t={}){var{fileName:o}=t,s=__rest(t,["fileName"]);const r=s.mimeType||"image/png",n=r.split("/")[1];(0,download_1.downloadFile)(await e.toDataURL(s),o||"polotno."+n,r)},async _toPDF(t){const o=t.dpi||300,s=e=>.75*e;var r=new(await(0,pdf_1.getJsPDF)())({unit:"pt",orientation:e.width>e.height?"landscape":"portrait",format:[s(e.width),s(e.height)]}),n=r.internal.pageSize.getWidth(),a=r.internal.pageSize.getHeight();const i=e._elementsPixelRatio,d=o/72;e.setElementsPixelRatio(d),await new Promise((e=>setTimeout(e)));for(const o of e.pages){0!==e.pages.indexOf(o)&&r.addPage(),r.addImage(await e.toDataURL(Object.assign(Object.assign({},t),{pageId:o.id,pixelRatio:d})),0,0,n,a,void 0,"MEDIUM")}return e.setElementsPixelRatio(i),r},toPDFDataURL:async t=>(await e._toPDF(Object.assign({mimeType:"image/jpg"},t))).output("datauristring"),async saveAsPDF(t={}){var{fileName:o,dpi:s}=t,r=__rest(t,["fileName","dpi"]);(await e._toPDF(Object.assign({mimeType:"image/jpg"},r))).save(o||"polotno.pdf")},async waitLoading(){await(0,loader_1.whenLoaded)()},toJSON:()=>({width:e.width,height:e.height,fonts:(0,mobx_state_tree_1.getSnapshot)(e.fonts),pages:(0,mobx_state_tree_1.getSnapshot)(e.pages)}),loadJSON(t,o=!1){var s;e.pages.forEach((e=>e.children.forEach((e=>(0,mobx_state_tree_1.detach)(e))))),e.pages=(0,mobx_state_tree_1.cast)([]),t._activePageId=null===(s=t.pages[0])||void 0===s?void 0:s.id,t.scale=e.scale,t._isKeyValid=e._isKeyValid,t.openedSidePanel=e.openedSidePanel,o&&(t.history=e.history.toJSON()),(0,mobx_state_tree_1.applySnapshot)(e,t)},addFont(t){e.removeFont(t.fontFamily),e.fonts.push(t),e.loadFont(t.fontFamily)},removeFont(t){e.fonts.filter((e=>e.fontFamily===t)).forEach((e=>(0,mobx_state_tree_1.destroy)(e)))},async loadFont(t){const o=e.fonts.find((e=>e.fontFamily===t))||fonts.globalFonts.find((e=>e.fontFamily===t));o?fonts.injectCustomFont(o):fonts.injectGoogleFont(t),await fonts.loadFont(t)}}))),exports.createStore=createStore,exports.default=createStore;
|