polotno 2.11.6 → 2.12.0

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.
@@ -0,0 +1,9 @@
1
+ import { StoreType } from '../model/store';
2
+ type Props = {
3
+ store: StoreType;
4
+ audio: any;
5
+ };
6
+ export declare const AudioElement: (({ audio, store }: Props) => any) & {
7
+ displayName: string;
8
+ };
9
+ export {};
@@ -0,0 +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.AudioElement=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite");function useAudio(e){const[t,r]=react_1.default.useState(null),[n,i]=react_1.default.useState("loading");return react_1.default.useEffect((()=>{const t=new Audio(e),n=()=>{i("loaded"),r(t)},u=()=>{i("failed"),r(null)};return t.addEventListener("canplay",n),t.addEventListener("error",u),()=>{t.removeEventListener("canplay",n),t.removeEventListener("error",u)}}),[e]),[t,n]}exports.AudioElement=(0,mobx_react_lite_1.observer)((({audio:e,store:t})=>{const[r,n]=useAudio(e.src);return react_1.default.useEffect((()=>{r&&t.history.ignore((()=>{e.set({duration:1e3*r.duration})}))}),[r,e,t.history]),react_1.default.useEffect((()=>{if(!r)return;t.isPlaying?(r.currentTime=e.startTime*e.duration,r.volume=e.volume,r.play()):r.pause();const n=()=>{r.currentTime=e.startTime*e.duration},i=()=>{r.currentTime>=e.endTime*e.duration&&(r.pause(),r.currentTime=e.startTime*e.duration)};return r.addEventListener("ended",n),r.addEventListener("timeupdate",i),()=>{r.removeEventListener("ended",n),r.removeEventListener("timeupdate",i)}}),[t.isPlaying,e.startTime,e.endTime,e.volume,r]),null}));
@@ -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.FigureElement=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),figure_to_svg_1=require("../utils/figure-to-svg"),highlighter_1=require("./highlighter"),screen_1=require("../utils/screen"),use_color_1=require("./use-color"),createComponent=e=>(0,mobx_react_lite_1.observer)((({element:t,fillProps:a,strokeProps:r})=>{let s=e({width:t.a.width,height:t.a.height,cornerRadius:t.cornerRadius}),c=1,o=1;"string"!=typeof s&&(c=s.scaleX,o=s.scaleY,s=s.path);const l=react_1.default.useRef(null);return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,{width:t.width,height:t.height,fill:"transparent"}),react_1.default.createElement(react_konva_1.Path,Object.assign({},a,{ref:l,data:s,scaleX:c,scaleY:o})),react_1.default.createElement(react_konva_1.Group,{clipFunc:e=>{const t=l.current;if(t){var a=t.dataArray;e.beginPath();for(var r=0;r<a.length;r++){var s=a[r].command,c=a[r].points;switch(s){case"L":e.lineTo(c[0],c[1]);break;case"M":e.moveTo(c[0],c[1]);break;case"C":e.bezierCurveTo(c[0],c[1],c[2],c[3],c[4],c[5]);break;case"Q":e.quadraticCurveTo(c[0],c[1],c[2],c[3]);break;case"A":var o=c[0],i=c[1],n=c[2],h=c[3],d=c[4],u=c[5],_=c[6],g=c[7],f=n>h?n:h,m=n>h?1:n/h,p=n>h?h/n:1;e.translate(o,i),e.rotate(_),e.scale(m,p),e.arc(0,0,f,d,d+u,1-g),e.scale(1/m,1/p),e.rotate(-_),e.translate(-o,-i);break;case"z":!0,e.closePath()}}}},scaleX:c,scaleY:o},react_1.default.createElement(react_konva_1.Path,Object.assign({},r,{x:0,y:0,data:s,strokeWidth:2*r.strokeWidth,dash:r.dash.map((e=>e))}))))})),COMPONENTS_CACHE={},getComponent=e=>{var f;return COMPONENTS_CACHE[e]||(COMPONENTS_CACHE[e]=(t=(0,figure_to_svg_1.subTypeToPathDataFunc)(e),(0,mobx_react_lite_1.observer)((({element:e,fillProps:a,strokeProps:r})=>{let s=t({width:e.a.width,height:e.a.height,cornerRadius:e.cornerRadius}),c=1,o=1;"string"!=typeof s&&(c=s.scaleX,o=s.scaleY,s=s.path);const l=react_1.default.useRef(null);return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,{width:e.width,height:e.height,fill:"transparent"}),react_1.default.createElement(react_konva_1.Path,Object.assign({},a,{ref:l,data:s,scaleX:c,scaleY:o})),react_1.default.createElement(react_konva_1.Group,{clipFunc:e=>{const t=l.current;if(t){var a=t.dataArray;e.beginPath();for(var r=0;r<a.length;r++){var s=a[r].command,c=a[r].points;switch(s){case"L":e.lineTo(c[0],c[1]);break;case"M":e.moveTo(c[0],c[1]);break;case"C":e.bezierCurveTo(c[0],c[1],c[2],c[3],c[4],c[5]);break;case"Q":e.quadraticCurveTo(c[0],c[1],c[2],c[3]);break;case"A":var o=c[0],i=c[1],n=c[2],h=c[3],d=c[4],u=c[5],_=c[6],g=c[7],f=n>h?n:h,m=n>h?1:n/h,p=n>h?h/n:1;e.translate(o,i),e.rotate(_),e.scale(m,p),e.arc(0,0,f,d,d+u,1-g),e.scale(1/m,1/p),e.rotate(-_),e.translate(-o,-i);break;case"z":e.closePath()}}}},scaleX:c,scaleY:o},react_1.default.createElement(react_konva_1.Path,Object.assign({},r,{x:0,y:0,data:s,strokeWidth:2*r.strokeWidth,dash:r.dash.map((e=>e))}))))})))),COMPONENTS_CACHE[e]};exports.FigureElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const a=e.selectable||"admin"===t.role,r=(0,screen_1.isTouchDevice)(),[s,c]=react_1.default.useState(!1),o=t.selectedShapes.indexOf(e)>=0,l=Math.min(e.strokeWidth,e.width/2,e.height/2),i=Math.max(0,Math.min(e.width/2,e.height/2,e.cornerRadius)),n=(0,use_color_1.useColor)(e,e.a.fill,"fill"),h=Object.assign(Object.assign({width:e.a.width,height:e.a.height},n),{cornerRadius:i,opacity:e.animated("opacity"),shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,preventDefault:!r||o,hideInExport:!e.showInExport}),d=(0,use_color_1.useColor)(e,e.stroke,"stroke"),u=Object.assign(Object.assign({visible:l>0,x:l/2,y:l/2,width:e.a.width-l,height:e.a.height-l},d),{strokeWidth:l,cornerRadius:Math.max(0,i-l),dash:e.dash.map((e=>e*l)),opacity:e.animated("opacity"),hideInExport:!e.showInExport,listening:!1}),_=(g=e.subType,COMPONENTS_CACHE[g]||(COMPONENTS_CACHE[g]=(f=(0,figure_to_svg_1.subTypeToPathDataFunc)(g),(0,mobx_react_lite_1.observer)((({element:e,fillProps:t,strokeProps:a})=>{let r=f({width:e.a.width,height:e.a.height,cornerRadius:e.cornerRadius}),s=1,c=1;"string"!=typeof r&&(s=r.scaleX,c=r.scaleY,r=r.path);const o=react_1.default.useRef(null);return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,{width:e.width,height:e.height,fill:"transparent"}),react_1.default.createElement(react_konva_1.Path,Object.assign({},t,{ref:o,data:r,scaleX:s,scaleY:c})),react_1.default.createElement(react_konva_1.Group,{clipFunc:e=>{const t=o.current;if(t){var a=t.dataArray;e.beginPath();for(var r=0;r<a.length;r++){var s=a[r].command,c=a[r].points;switch(s){case"L":e.lineTo(c[0],c[1]);break;case"M":e.moveTo(c[0],c[1]);break;case"C":e.bezierCurveTo(c[0],c[1],c[2],c[3],c[4],c[5]);break;case"Q":e.quadraticCurveTo(c[0],c[1],c[2],c[3]);break;case"A":var l=c[0],i=c[1],n=c[2],h=c[3],d=c[4],u=c[5],_=c[6],g=c[7],f=n>h?n:h,m=n>h?1:n/h,p=n>h?h/n:1;e.translate(l,i),e.rotate(_),e.scale(m,p),e.arc(0,0,f,d,d+u,1-g),e.scale(1/m,1/p),e.rotate(-_),e.translate(-l,-i);break;case"z":e.closePath()}}}},scaleX:s,scaleY:c},react_1.default.createElement(react_konva_1.Path,Object.assign({},a,{x:0,y:0,data:r,strokeWidth:2*a.strokeWidth,dash:a.dash.map((e=>e))}))))})))),COMPONENTS_CACHE[g]||react_konva_1.Group);var g,f;return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Group,{id:e.id,x:e.a.x,y:e.a.y,rotation:e.a.rotation,opacity:e.a.opacity,listening:a,draggable:r?e.draggable&&o:e.draggable,name:"element",onMouseEnter:()=>{c(!0)},onMouseLeave:()=>{c(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onTransform:t=>{const a=t.target.scale();t.target.scaleX(1),t.target.scaleY(1),e.set({width:e.width*a.x,height:e.height*a.y,x:t.target.x(),y:t.target.y(),rotation:t.target.rotation()})}},react_1.default.createElement(_,{element:e,fillProps:h,strokeProps:u})),s&&!o&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FigureElement=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),figure_to_svg_1=require("../utils/figure-to-svg"),highlighter_1=require("./highlighter"),screen_1=require("../utils/screen"),use_color_1=require("./use-color"),createComponent=e=>(0,mobx_react_lite_1.observer)((({element:t,fillProps:a,strokeProps:r})=>{let s=e({width:t.a.width,height:t.a.height,cornerRadius:t.cornerRadius}),c=1,o=1;"string"!=typeof s&&(c=s.scaleX,o=s.scaleY,s=s.path);const l=react_1.default.useRef(null);return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,{width:t.width,height:t.height,fill:"transparent"}),react_1.default.createElement(react_konva_1.Path,Object.assign({},a,{ref:l,data:s,scaleX:c,scaleY:o})),react_1.default.createElement(react_konva_1.Group,{clipFunc:e=>{const t=l.current;if(t){var a=t.dataArray;e.beginPath();for(var r=0;r<a.length;r++){var s=a[r].command,c=a[r].points;switch(s){case"L":e.lineTo(c[0],c[1]);break;case"M":e.moveTo(c[0],c[1]);break;case"C":e.bezierCurveTo(c[0],c[1],c[2],c[3],c[4],c[5]);break;case"Q":e.quadraticCurveTo(c[0],c[1],c[2],c[3]);break;case"A":var o=c[0],i=c[1],n=c[2],h=c[3],d=c[4],u=c[5],_=c[6],g=c[7],f=n>h?n:h,m=n>h?1:n/h,p=n>h?h/n:1;e.translate(o,i),e.rotate(_),e.scale(m,p),e.arc(0,0,f,d,d+u,1-g),e.scale(1/m,1/p),e.rotate(-_),e.translate(-o,-i);break;case"z":!0,e.closePath()}}}},scaleX:c,scaleY:o},react_1.default.createElement(react_konva_1.Path,Object.assign({},r,{x:0,y:0,data:s,strokeWidth:2*r.strokeWidth,dash:r.dash.map((e=>e))}))))})),COMPONENTS_CACHE={},getComponent=e=>{var f;return COMPONENTS_CACHE[e]||(COMPONENTS_CACHE[e]=(t=(0,figure_to_svg_1.subTypeToPathDataFunc)(e),(0,mobx_react_lite_1.observer)((({element:e,fillProps:a,strokeProps:r})=>{let s=t({width:e.a.width,height:e.a.height,cornerRadius:e.cornerRadius}),c=1,o=1;"string"!=typeof s&&(c=s.scaleX,o=s.scaleY,s=s.path);const l=react_1.default.useRef(null);return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,{width:e.width,height:e.height,fill:"transparent"}),react_1.default.createElement(react_konva_1.Path,Object.assign({},a,{ref:l,data:s,scaleX:c,scaleY:o})),react_1.default.createElement(react_konva_1.Group,{clipFunc:e=>{const t=l.current;if(t){var a=t.dataArray;e.beginPath();for(var r=0;r<a.length;r++){var s=a[r].command,c=a[r].points;switch(s){case"L":e.lineTo(c[0],c[1]);break;case"M":e.moveTo(c[0],c[1]);break;case"C":e.bezierCurveTo(c[0],c[1],c[2],c[3],c[4],c[5]);break;case"Q":e.quadraticCurveTo(c[0],c[1],c[2],c[3]);break;case"A":var o=c[0],i=c[1],n=c[2],h=c[3],d=c[4],u=c[5],_=c[6],g=c[7],f=n>h?n:h,m=n>h?1:n/h,p=n>h?h/n:1;e.translate(o,i),e.rotate(_),e.scale(m,p),e.arc(0,0,f,d,d+u,1-g),e.scale(1/m,1/p),e.rotate(-_),e.translate(-o,-i);break;case"z":e.closePath()}}}},scaleX:c,scaleY:o},react_1.default.createElement(react_konva_1.Path,Object.assign({},r,{x:0,y:0,data:s,strokeWidth:2*r.strokeWidth,dash:r.dash.map((e=>e))}))))})))),COMPONENTS_CACHE[e]};exports.FigureElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const a=e.selectable||"admin"===t.role,r=(0,screen_1.isTouchDevice)(),[s,c]=react_1.default.useState(!1),o=t.selectedShapes.indexOf(e)>=0,l=Math.min(e.strokeWidth,e.width/2,e.height/2),i=Math.max(0,Math.min(e.width/2,e.height/2,e.cornerRadius)),n=(0,use_color_1.useColor)(e,e.a.fill,"fill"),h=Object.assign(Object.assign({width:e.a.width,height:e.a.height},n),{cornerRadius:i,opacity:e.animated("opacity"),shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,preventDefault:!r||o,hideInExport:!e.showInExport}),d=(0,use_color_1.useColor)(e,e.stroke,"stroke"),u=Object.assign(Object.assign({visible:l>0,x:l/2,y:l/2,width:e.a.width-l,height:e.a.height-l},d),{strokeWidth:l,cornerRadius:Math.max(0,i-l),dash:e.dash.map((e=>e*l)),opacity:e.animated("opacity"),hideInExport:!e.showInExport,listening:!1}),_=(g=e.subType,COMPONENTS_CACHE[g]||(COMPONENTS_CACHE[g]=(f=(0,figure_to_svg_1.subTypeToPathDataFunc)(g),(0,mobx_react_lite_1.observer)((({element:e,fillProps:t,strokeProps:a})=>{let r=f({width:e.a.width,height:e.a.height,cornerRadius:e.cornerRadius}),s=1,c=1;"string"!=typeof r&&(s=r.scaleX,c=r.scaleY,r=r.path);const o=react_1.default.useRef(null);return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,{width:e.width,height:e.height,fill:"transparent"}),react_1.default.createElement(react_konva_1.Path,Object.assign({},t,{ref:o,data:r,scaleX:s,scaleY:c})),react_1.default.createElement(react_konva_1.Group,{clipFunc:e=>{const t=o.current;if(t){var a=t.dataArray;e.beginPath();for(var r=0;r<a.length;r++){var s=a[r].command,c=a[r].points;switch(s){case"L":e.lineTo(c[0],c[1]);break;case"M":e.moveTo(c[0],c[1]);break;case"C":e.bezierCurveTo(c[0],c[1],c[2],c[3],c[4],c[5]);break;case"Q":e.quadraticCurveTo(c[0],c[1],c[2],c[3]);break;case"A":var l=c[0],i=c[1],n=c[2],h=c[3],d=c[4],u=c[5],_=c[6],g=c[7],f=n>h?n:h,m=n>h?1:n/h,p=n>h?h/n:1;e.translate(l,i),e.rotate(_),e.scale(m,p),e.arc(0,0,f,d,d+u,1-g),e.scale(1/m,1/p),e.rotate(-_),e.translate(-l,-i);break;case"z":e.closePath()}}}},scaleX:s,scaleY:c},react_1.default.createElement(react_konva_1.Path,Object.assign({},a,{x:0,y:0,data:r,strokeWidth:2*a.strokeWidth,dash:a.dash.map((e=>e))}))))})))),COMPONENTS_CACHE[g]||react_konva_1.Group);var g,f;return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Group,{id:e.id,x:e.a.x,y:e.a.y,rotation:e.a.rotation,opacity:e.a.opacity,listening:a,draggable:r?e.draggable&&o:e.draggable,name:"element",onMouseEnter:()=>{c(!0)},onMouseLeave:()=>{c(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onTransform:t=>{const a=t.target.scale();t.target.scaleX(1),t.target.scaleY(1),e.set({width:e.width*a.x,height:e.height*a.y,x:t.target.x(),y:t.target.y(),rotation:t.target.rotation()})}},react_1.default.createElement(_,{element:e,fillProps:h,strokeProps:u})),(s||o)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
@@ -1 +1 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a);var o=Object.getOwnPropertyDescriptor(t,a);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,r,o)}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&__createBinding(t,e,a);return __setModuleDefault(t,e),t},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ImageElement=exports.useImageLoader=exports.setImageLoaderHook=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),mobx_1=require("mobx"),react_konva_1=require("react-konva"),use_image_1=__importDefault(require("use-image")),konva_1=__importDefault(require("konva")),react_konva_utils_1=require("react-konva-utils"),highlighter_1=require("./highlighter"),loader_1=require("../utils/loader"),svg=__importStar(require("../utils/svg")),flags_1=require("../utils/flags"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),screen_1=require("../utils/screen");function createCanvas(){return document.createElement("canvas")}async function getFixedUrl(e){if(!(e.indexOf("data:image/svg+xml")>=0||e.indexOf(".svg")>=0))return e;const t=await svg.urlToString(e),a=svg.fixSize(t);return svg.svgToURL(a)}const useSizeFixer=e=>{const[t,a]=react_1.default.useState(e);return react_1.default.useEffect((()=>{(async()=>{const r=await getFixedUrl(e);r!==t&&a(r)})()}),[e]),t};function getDistance(e,t){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}function getCenter(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}const trySetCanvasSize=(e,t,a)=>{let r=t,o=a,i=1;for(;r>0&&o>0;){e.width=r,e.height=o;const n=e.getContext("2d");if(!n)return;n.fillStyle="rgba(0,0,0,0.1)",n.fillRect(0,0,1,1);if(0!==n.getImageData(0,0,1,1).data[3])return void n.clearRect(0,0,e.width,e.height);if(i*=.9,r=Math.floor(t*i),o=Math.floor(a*i),r=Math.max(r,1),o=Math.max(o,1),r<=1&&o<=1)return e.width=1,void(e.height=1)}},useFlip=(e,t,a)=>{const r=react_1.default.useMemo((()=>{var r,o;const{flipX:i,flipY:n}=e,c="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0,h=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,d=(/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||h)&&c||e.maskSrc;if(!i&&!n&&!d)return t;if(!t||!t.width||!t.height)return null;const l=createCanvas();let s=1;"svg"===e.type&&(s=Math.max(e.a.width/t.width*a,e.a.height/t.height*a)),trySetCanvasSize(l,Math.max(t.width*s,1),Math.max(t.height*s,1));let u=i?-l.width:0,g=n?-l.height:0;return null===(r=l.getContext("2d"))||void 0===r||r.scale(i?-1:1,n?-1:1),null===(o=l.getContext("2d"))||void 0===o||o.drawImage(t,u,g,l.width,l.height),l}),[e.maskSrc,e.flipX,e.flipY,t,e.a.width,e.a.height,a]);return react_1.default.useEffect((()=>()=>{r&&"CANVAS"===r.nodeName&&konva_1.default.Util.releaseCanvas(r)}),[r]),r};function getCrop(e,t){const a=t.width/t.height;let r,o;a>=e.width/e.height?(r=e.width,o=e.width/a):(r=e.height*a,o=e.height);return{x:(e.width-r)/2,y:(e.height-o)/2,width:r,height:o}}function downsample(e,t,a,r,o,i,n){for(var c=new ImageData(t,a),h=new Int32Array(e.data.buffer),d=e.width,l=new Int32Array(c.data.buffer),s=c.width,u=t/i,g=a/n,f=Math.round(1/u),m=Math.round(1/g),p=f*m,_=0;_<c.height;_++)for(var w=0;w<s;w++){for(var v=r+Math.round(w/u)+(o+Math.round(_/g))*d,x=0,y=0,M=0,b=0,E=0;E<m;E++)for(var k=0;k<f;k++){var C=h[v+k+E*d];x+=C<<24>>>24,y+=C<<16>>>24,M+=C<<8>>>24,b+=C>>>24}x=Math.round(x/p),y=Math.round(y/p),M=Math.round(M/p),b=Math.round(b/p),l[w+_*s]=b<<24|M<<16|y<<8|x}return c}function downScaleCanvas(e,t){var a,r;const o=createCanvas();o.width=e.width,o.height=e.height;const i=Math.max(1,Math.floor(o.width*t)),n=Math.max(1,Math.floor(o.height*t));null===(a=o.getContext("2d"))||void 0===a||a.drawImage(e,0,0,o.width,o.height);const c=downsample(o.getContext("2d").getImageData(0,0,o.width,o.height),i,n,0,0,o.width,o.height);return o.width=i,o.height=n,null===(r=o.getContext("2d"))||void 0===r||r.putImageData(c,0,0),o}const useMask=(e,t)=>{const[a,r]=useImageHook(e.maskSrc,"anonymous"),o=e.maskSrc?r:"loaded";return(0,exports.useImageLoader)(o,e.id+"-mask"),react_1.default.useMemo((()=>{if(!a)return t;if(!t||!t.width||!t.height)return t;const r=createCanvas();r.width=Math.max(t.width,1),r.height=Math.max(t.height,1);const o=r.getContext("2d");if(!o)return t;o.drawImage(t,0,0),o.globalCompositeOperation="source-in";const i=getCrop(a,e);return o.drawImage(a,i.x,i.y,i.width,i.height,0,0,t.width,t.height),r}),[t,a,e.a.width,e.a.height])},limit=(e,t,a)=>Math.max(t,Math.min(a,e)),useCornerRadiusAndCrop=(e,t,a,r,o=0,i=!1,n=!0)=>{const c=n?1e5:t.width,h=n?1e5:t.height,d=Math.floor(limit(e.a.width*r,1,c)),l=Math.floor(limit(e.a.height*r,1,h)),s=Math.min(o*r,d/2,l/2),u=Math.max(e.a.width/a.width,e.a.height/a.height)*r,g=e.page._exportingOrRendering&&flags_1.flags.imageDownScalingEnabled&&u<1&&!i,f=0===a.x&&0===a.y&&a.width===(null==t?void 0:t.width)&&a.height===(null==t?void 0:t.height),m=react_1.default.useMemo((()=>{if(!t||!t.width||!t.height)return;return f&&0===s&&!g?void 0:createCanvas()}),[t,s,g,f]);return react_1.default.useLayoutEffect((()=>{if(!m||!t)return;m.width=d,m.height=l;const e=m.getContext("2d");if(!e)return;s&&(e.beginPath(),e.moveTo(s,0),e.lineTo(d-s,0),e.arc(d-s,s,s,3*Math.PI/2,0,!1),e.lineTo(d,l-s),e.arc(d-s,l-s,s,0,Math.PI/2,!1),e.lineTo(s,l),e.arc(s,l-s,s,Math.PI/2,Math.PI,!1),e.lineTo(0,s),e.arc(s,s,s,Math.PI,3*Math.PI/2,!1),e.clip());const r=g?downScaleCanvas(t,u):t,o=g?{x:Math.floor(a.x*u),y:Math.floor(a.y*u),width:Math.floor(a.width*u),height:Math.floor(a.height*u)}:a;e.drawImage(r,o.x,o.y,o.width,o.height,0,0,m.width,m.height)}),[m,e.a.width,e.a.height,a.x,a.y,a.width,a.height,o,r,i,e.page._exportingOrRendering,g]),react_1.default.useEffect((()=>()=>{m&&"CANVAS"===m.nodeName&&konva_1.default.Util.releaseCanvas(m)}),[m]),m||t},useClip=(e,t,a,r)=>{const o=useSizeFixer(e.clipSrc||""),[i,n]=useImageHook(o,"anonymous"),c=e.clipSrc?n:"loaded";(0,exports.useImageLoader)(c,e.id+"-clip");const h=react_1.default.useMemo((()=>{if(t&&i)return createCanvas()}),[t,i]);react_1.default.useLayoutEffect((()=>{var r;if(!i)return;if(!t||!t.width||!t.height)return;if(!i||!i.width||!i.height)return;if(!h)return;const o=createCanvas(),n=Math.max(e.a.width/i.width*a,e.a.height/i.height*a);o.width=i.width*n,o.height=i.height*n,null===(r=o.getContext("2d"))||void 0===r||r.drawImage(i,0,0,o.width,o.height),h.width=Math.max(t.width,1),h.height=Math.max(t.height,1);const c=h.getContext("2d");c&&(c.save(),c.drawImage(o,0,0,t.width,t.height),konva_1.default.Util.releaseCanvas(o),c.globalCompositeOperation="source-in",c.drawImage(t,0,0,h.width,h.height),c.restore())}),[h,t,i,e.a.width,e.a.height,a,...r]);return e.clipSrc&&i?h:t},PLACEHOLDER_CANVAS=createCanvas(),LoadingPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t=Math.min(30,e.a.width/4,e.a.height/4),a=react_1.default.useRef(null);return react_1.default.useEffect((()=>{const e=a.current;if(!e)return;const t=new konva_1.default.Animation((t=>{e.rotate(((null==t?void 0:t.timeDiff)||0)/2)}),e.getLayer());return t.start(),()=>{t.stop()}})),react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.a.width,height:e.a.height,fill:"rgba(124, 173, 212, 0.8)"}),react_1.default.createElement(react_konva_1.Arc,{ref:a,x:e.a.width/2,y:e.a.height/2,fill:"white",outerRadius:Math.abs(t),innerRadius:Math.max(1,t-5),angle:270}))})),ErrorPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t="Can not load the image...",a=Math.max(10,Math.min(30,e.a.width/25));return react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.a.width,height:e.a.height,fill:"rgba(223, 102, 102, 0.8)"}),react_1.default.createElement(react_konva_1.Text,{text:t,fontSize:a,width:e.a.width,height:e.a.height,align:"center",fill:"white",verticalAlign:"middle",padding:5}))}));let useImageHook=use_image_1.default;const setImageLoaderHook=e=>{useImageHook=e};exports.setImageLoaderHook=setImageLoaderHook;const useImageWithVectorDetection=(e,t)=>{const[a,r]=useImageHook(e,t),[o,i]=react_1.default.useState(null);react_1.default.useEffect((()=>{if(!e)return void i(null);let a=!0;return(async()=>{try{const r=(await fetch(e,{method:"HEAD",credentials:"anonymous"===t?"omit":"include"})).headers.get("content-type");a&&i(null==r?void 0:r.includes("svg"))}catch(e){console.error("Error detecting image type:",e),a&&i(!1)}})(),()=>{a=!1}}),[e]);const n=null!==o;return[n?a:void 0,r,n?o:void 0]},useImageLoader=(e,t)=>{const a=react_1.default.useRef(),r=()=>{var e;null===(e=a.current)||void 0===e||e.call(a),a.current=void 0};react_1.default.useEffect((()=>r),[]),react_1.default.useLayoutEffect((()=>{"loading"!==e||a.current||(a.current=(0,loader_1.incrementLoader)(`image ${t}`)),"loading"!==e&&r(),"failed"===e&&(0,loader_1.triggerLoadError)(`image ${t}`)}),[e])};exports.useImageLoader=useImageLoader;const usePreviousImage=({image:e,status:t,type:a})=>{const r=react_1.default.useRef();react_1.default.useEffect((()=>{r.current=e||r.current}),[e]);return"failed"!==t||"failed"!==t&&"svg"===a?r.current:void 0},useImageSource=e=>{const[t,a]=react_1.default.useReducer((e=>e+1),0),r=react_1.default.useRef("loading"),o=react_1.default.useRef(e.src),i=react_1.default.useRef(e.src);return i.current!==e.src&&(i.current=e.src,r.current="loading"),react_1.default.useEffect((()=>{if("svg"!==e.type)return;if(!e.src)return;let t=!1;return(async()=>{r.current="loading",a();const i=await svg.urlToString(e.src),n=svg.fixSize(i),c=svg.replaceColors(n,e.colorsReplace);t||(o.current=c,r.current="loaded",a())})(),()=>{t=!0}}),[e.src,JSON.stringify(e.colorsReplace)]),"svg"!==e.type?[e.src,"loaded"]:[o.current,r.current]};exports.ImageElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{var a;const[r,o]=react_1.default.useState(!1),i=react_1.default.useRef(null),n=react_1.default.useRef(null),[c,h]=react_1.default.useState(!1),d=t.selectedShapes.indexOf(e)>=0,[l,s]=useImageSource(e),[u,g]=useImageHook(l,"anonymous"),f="svg"!==e.type||"loaded"===s?g:"loading";(0,exports.useImageLoader)(f,e.id);const m=e.page._exportingOrRendering?1:Math.max(1,t.scale),p=t._elementsPixelRatio*m,_=usePreviousImage({image:u,status:g,type:e.type}),w=useMask(e,useFlip(e,u||_,p))||PLACEHOLDER_CANVAS;let{cropX:v,cropY:x,cropWidth:y,cropHeight:M}=e;"loaded"!==g&&(v=x=0,y=M=1);const b=w.width*y,E=w.height*M,k=e.a.width/e.a.height;let C,I;const S=b/E,R="svg"===e.type;R?(C=b,I=E):k>=S?(C=b,I=b/k):(C=E*k,I=E);const O={x:w.width*v,y:w.height*x,width:C,height:I},D=null!==(a=e.cornerRadius)&&void 0!==a?a:0,L=e.page._exportingOrRendering?1:Math.min(2,t.scale),P=t._elementsPixelRatio*L;let X=useClip(e,useCornerRadiusAndCrop(e,w,O,P,D,r||e._cropModeEnabled||"svg"===e.type,!0),P,[O,D,P]);const Y=Math.max(e.a.width/C,e.a.height/I);react_1.default.useEffect((()=>{var t;if(!e._cropModeEnabled)return;const a=null===(t=i.current)||void 0===t?void 0:t.getStage();function r(t){e._cropModeEnabled&&t.target!==n.current&&e.toggleCropMode(!1)}function o(t){e._cropModeEnabled&&t.target.parentNode!==a.content&&e.toggleCropMode(!1)}return document.body.addEventListener("click",o),null==a||a.on("click",r),null==a||a.on("tap",r),()=>{document.body.removeEventListener("click",o),document.body.removeEventListener("touchstart",o),null==a||a.off("click",r),null==a||a.off("click",r)}}),[e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{if(r||e._cropModeEnabled)return;(0,apply_filters_1.applyFilter)(i.current,e);return(0,mobx_1.autorun)((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),{delay:100})}),[X,e.page._exportingOrRendering,r,y,M,e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{var t;r||e._cropModeEnabled?null===(t=i.current)||void 0===t||t.clearCache():(0,apply_filters_1.applyFilter)(i.current,e)}),[r,e.a.width,e.a.height,e._cropModeEnabled]),react_1.default.useEffect((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),[e.shadowEnabled,e.shadowBlur,e.cornerRadius,e.shadowColor,e.shadowOffsetX,e.shadowOffsetY,e.shadowOpacity]);const A=react_1.default.useRef(null),H=react_1.default.useRef(null),T=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(H.current.nodes([A.current]),T.current.nodes([n.current]))}),[e._cropModeEnabled]);var W=react_1.default.useRef(null),z=react_1.default.useRef(0),q=react_1.default.useRef(!1);const F=t=>{var a;(null===(a=t.evt.touches)||void 0===a?void 0:a.length)>2&&t.target.stopDrag(),Math.round(t.target.x())>0&&(t.target.x(0),t.target.scaleX(1)),Math.round(t.target.y())>0&&(t.target.y(0),t.target.scaleY(1));const r=t.target.width()*t.target.scaleX(),o=t.target.height()*t.target.scaleY(),i=Math.min(1,C/r),n=Math.min(1,I/o),c=1-i,h=Math.min(c,Math.max(0,Math.round(-t.target.x())/r)),d=1-n,l=Math.min(d,Math.max(0,Math.round(-t.target.y())/o));t.target.setAttrs({x:-h*w.width,y:-l*w.height,scaleX:1,scaleY:1}),e.set({cropX:h,cropY:l,cropWidth:i,cropHeight:n})},B=()=>{"svg"!==e.type&&e.contentEditable&&setTimeout((()=>{e.toggleCropMode(!0)}))},N="svg"===e.type&&_,j="loading"===g&&!N,U="failed"===g,V=!j&&!U,G=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),$=V?e.a.opacity:0;(0,use_fadein_1.useFadeIn)(i,$);const J=e.selectable||"admin"===t.role,K=(0,screen_1.isTouchDevice)();return react_1.default.createElement(react_1.default.Fragment,null,j&&react_1.default.createElement(LoadingPlaceholder,{element:e}),U&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:i,name:"element",id:e.id,image:X,x:e.a.x,y:e.a.y,width:e.a.width||1,height:e.a.height||1,rotation:e.a.rotation,opacity:$,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,customCrop:O,listening:J,draggable:K?e.draggable&&d:e.draggable,preventDefault:!K||d,hideInExport:!e.showInExport,onMouseEnter:()=>{h(!0)},onMouseLeave:()=>{h(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDblClick:B,onDblTap:B,onTransformStart:()=>{o(!0),G.current={cropX:e.cropX,cropY:e.cropY,cropWidth:e.cropWidth,cropHeight:e.cropHeight}},onTransform:t=>{var a;const r=t.currentTarget,o=Math.abs(r.scaleX()-1)<1e-7?1:r.scaleX(),i=Math.abs(r.scaleY()-1)<1e-7?1:r.scaleY();r.scaleX(1),r.scaleY(1);const n=null===(a=t.target.getStage())||void 0===a?void 0:a.findOne("Transformer"),c=1-C/w.width,h=Math.min(c,Math.max(0,e.cropX)),d=1-I/w.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&&G.current.cropHeight>I/w.height;let f=u?e.cropWidth:e.cropWidth*o;g&&(f=e.cropWidth);const m=!u&&i<1&&G.current.cropWidth>C/w.width;let p=u?e.cropHeight:e.cropHeight*i;m&&(p=e.cropHeight),R&&(f=e.cropWidth,p=e.cropHeight),e.set({cropX:h,cropY:l,x:r.x(),y:r.y(),width:r.width()*o,height:r.height()*i,rotation:t.target.rotation(),cropWidth:Math.min(f,1-h),cropHeight:Math.min(p,1-l)})},onTransformEnd:t=>{const a=t.currentTarget;e.set({width:a.width(),height:a.height(),x:a.x(),y:a.y(),rotation:t.target.rotation(),cropWidth:C/w.width,cropHeight:I/w.height}),o(!1)}}),react_1.default.createElement(react_konva_1.Rect,{x:e.x,y:e.y,width:Math.max(e.a.width-e.borderSize,0),height:Math.max(e.a.height-e.borderSize,0),opacity:$,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,D-e.borderSize),hideInExport:!e.showInExport}),e._cropModeEnabled&&react_1.default.createElement(react_konva_utils_1.Portal,{selector:".page-abs-container",enabled:!0},react_1.default.createElement(react_konva_1.Rect,{x:-window.innerWidth/t.scale,y:-window.innerWidth/t.scale,width:window.innerWidth/t.scale*3,height:window.innerWidth/t.scale*3,fill:"rgba(0,0,0,0.3)"}),react_1.default.createElement(react_konva_1.Image,{listening:!1,image:X,x:e.x,y:e.y,width:e.a.width,height:e.a.height,rotation:e.rotation,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur}),react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,scaleX:Y,scaleY:Y},react_1.default.createElement(react_konva_1.Image,{image:w,ref:n,opacity:.4,draggable:!0,x:-e.cropX*w.width,y:-e.cropY*w.height,onDragMove:F,onTransform:F,onTouchMove:e=>{e.evt.preventDefault();const t=e.target.getStage().getPointersPositions();var a=t[0],r=t[1];const o=e.target;if(a&&!r&&!o.isDragging()&&q.current&&(o.startDrag(),q.current=!1),a&&r){konva_1.default.hitOnDragEnabled=!0,o.isDragging()&&(q.current=!0,o.stopDrag());const t=e.target.getAbsoluteTransform().copy();t.invert();var i={x:a.x,y:a.y},n={x:r.x,y:r.y};if(!W.current)return void(W.current=getCenter(i,n));var c=getCenter(i,n),h=getDistance(i,n);z.current||(z.current=h);const f=o.position();var d={x:c.x-f.x,y:c.y-f.y},l=h/z.current;o.scaleX(l),o.scaleY(l);const m=t.point(c),p=t.point(W.current);var s=m.x-p.x,u=m.y-p.y,g={x:Math.min(0,c.x-d.x*l+s),y:Math.min(0,c.y-d.y*l+u)};o.position(g),z.current=h,W.current=c,F(e)}},onTouchEnd:e=>{z.current=0,W.current=null,konva_1.default.hitOnDragEnabled=!1}}),react_1.default.createElement(react_konva_1.Transformer,{ref:T,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:C,height:I,ref:A,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*w.width-1e-9&&(t.target.x(-e.cropX*w.width),t.target.scaleX(1)),t.target.y()<-e.cropY*w.height-1e-9&&(t.target.y(-e.cropY*w.height),t.target.scaleY(1));const a=Math.min(1,Math.max(0,e.cropX+t.target.x()/w.width)),r=Math.min(1,Math.max(0,t.target.y()/w.height+e.cropY)),o=t.target.width()*t.target.scaleX(),i=t.target.height()*t.target.scaleY(),n=Math.min(1-a,o/w.width),c=Math.min(1-r,i/w.height),h=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:h.x,y:h.y,cropX:a,cropY:r,cropWidth:n,cropHeight:c,width:Math.min(o*Y,w.width*(1-a)*Y),height:Math.min(i*Y,w.height*(1-r)*Y)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:H,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,visible:e.resizable,keepRatio:!1,rotateEnabled:!1,anchorFill:"rgb(240, 240, 240)",anchorStrokeWidth:2,borderStrokeWidth:2}))),(c||d)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a);var o=Object.getOwnPropertyDescriptor(t,a);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,r,o)}:function(e,t,a,r){void 0===r&&(r=a),e[r]=t[a]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&__createBinding(t,e,a);return __setModuleDefault(t,e),t},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ImageElement=exports.useImageLoader=exports.setImageLoaderHook=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),mobx_1=require("mobx"),react_konva_1=require("react-konva"),use_image_1=__importDefault(require("use-image")),konva_1=__importDefault(require("konva")),react_konva_utils_1=require("react-konva-utils"),highlighter_1=require("./highlighter"),loader_1=require("../utils/loader"),svg=__importStar(require("../utils/svg")),flags_1=require("../utils/flags"),canvas_1=require("../utils/canvas"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),screen_1=require("../utils/screen");function createCanvas(){return document.createElement("canvas")}async function getFixedUrl(e){if(!(e.indexOf("data:image/svg+xml")>=0||e.indexOf(".svg")>=0))return e;const t=await svg.urlToString(e),a=svg.fixSize(t);return svg.svgToURL(a)}const useSizeFixer=e=>{const[t,a]=react_1.default.useState(e);return react_1.default.useEffect((()=>{(async()=>{const r=await getFixedUrl(e);r!==t&&a(r)})()}),[e]),t};function getDistance(e,t){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}function getCenter(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}const useFlip=(e,t,a)=>{const r=react_1.default.useMemo((()=>{var r,o;const{flipX:i,flipY:n}=e,c="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0,h=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,d=(/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||h)&&c||e.maskSrc;if(!i&&!n&&!d)return t;if(!t||!t.width||!t.height)return null;const l=createCanvas();let s=1;"svg"===e.type&&(s=Math.max(e.a.width/t.width*a,e.a.height/t.height*a)),(0,canvas_1.trySetCanvasSize)(l,Math.max(t.width*s,1),Math.max(t.height*s,1));let u=i?-l.width:0,g=n?-l.height:0;return null===(r=l.getContext("2d"))||void 0===r||r.scale(i?-1:1,n?-1:1),null===(o=l.getContext("2d"))||void 0===o||o.drawImage(t,u,g,l.width,l.height),l}),[e.maskSrc,e.flipX,e.flipY,t,e.a.width,e.a.height,a]);return react_1.default.useEffect((()=>()=>{r&&"CANVAS"===r.nodeName&&konva_1.default.Util.releaseCanvas(r)}),[r]),r};function getCrop(e,t){const a=t.width/t.height;let r,o;a>=e.width/e.height?(r=e.width,o=e.width/a):(r=e.height*a,o=e.height);return{x:(e.width-r)/2,y:(e.height-o)/2,width:r,height:o}}function downsample(e,t,a,r,o,i,n){for(var c=new ImageData(t,a),h=new Int32Array(e.data.buffer),d=e.width,l=new Int32Array(c.data.buffer),s=c.width,u=t/i,g=a/n,f=Math.round(1/u),p=Math.round(1/g),_=f*p,m=0;m<c.height;m++)for(var w=0;w<s;w++){for(var v=r+Math.round(w/u)+(o+Math.round(m/g))*d,x=0,y=0,M=0,b=0,E=0;E<p;E++)for(var k=0;k<f;k++){var C=h[v+k+E*d];x+=C<<24>>>24,y+=C<<16>>>24,M+=C<<8>>>24,b+=C>>>24}x=Math.round(x/_),y=Math.round(y/_),M=Math.round(M/_),b=Math.round(b/_),l[w+m*s]=b<<24|M<<16|y<<8|x}return c}function downScaleCanvas(e,t){var a,r;const o=createCanvas();o.width=e.width,o.height=e.height;const i=Math.max(1,Math.floor(o.width*t)),n=Math.max(1,Math.floor(o.height*t));null===(a=o.getContext("2d"))||void 0===a||a.drawImage(e,0,0,o.width,o.height);const c=downsample(o.getContext("2d").getImageData(0,0,o.width,o.height),i,n,0,0,o.width,o.height);return o.width=i,o.height=n,null===(r=o.getContext("2d"))||void 0===r||r.putImageData(c,0,0),o}const useMask=(e,t)=>{const[a,r]=useImageHook(e.maskSrc,"anonymous"),o=e.maskSrc?r:"loaded";return(0,exports.useImageLoader)(o,e.id+"-mask"),react_1.default.useMemo((()=>{if(!a)return t;if(!t||!t.width||!t.height)return t;const r=createCanvas();r.width=Math.max(t.width,1),r.height=Math.max(t.height,1);const o=r.getContext("2d");if(!o)return t;o.drawImage(t,0,0),o.globalCompositeOperation="source-in";const i=getCrop(a,e);return o.drawImage(a,i.x,i.y,i.width,i.height,0,0,t.width,t.height),r}),[t,a,e.a.width,e.a.height])},limit=(e,t,a)=>Math.max(t,Math.min(a,e)),useCornerRadiusAndCrop=(e,t,a,r,o=0,i=!1,n=!0)=>{const c=Math.floor(limit(e.a.width*r,1,1e4)),h=Math.floor(limit(e.a.height*r,1,1e4)),d=Math.min(o*r,c/2,h/2),l=Math.max(e.a.width/a.width,e.a.height/a.height)*r,s=e.page._exportingOrRendering&&flags_1.flags.imageDownScalingEnabled&&l<1&&!i,u=0===a.x&&0===a.y&&a.width===(null==t?void 0:t.width)&&a.height===(null==t?void 0:t.height),g=react_1.default.useMemo((()=>{if(!t||!t.width||!t.height)return;return u&&0===d&&!s?void 0:createCanvas()}),[t,d,s,u]);return react_1.default.useLayoutEffect((()=>{if(!g||!t)return;(0,canvas_1.trySetCanvasSize)(g,c,h);const e=g.getContext("2d");if(!e)return;d&&(e.beginPath(),e.moveTo(d,0),e.lineTo(c-d,0),e.arc(c-d,d,d,3*Math.PI/2,0,!1),e.lineTo(c,h-d),e.arc(c-d,h-d,d,0,Math.PI/2,!1),e.lineTo(d,h),e.arc(d,h-d,d,Math.PI/2,Math.PI,!1),e.lineTo(0,d),e.arc(d,d,d,Math.PI,3*Math.PI/2,!1),e.clip());const r=s?downScaleCanvas(t,l):t,o=s?{x:Math.floor(a.x*l),y:Math.floor(a.y*l),width:Math.floor(a.width*l),height:Math.floor(a.height*l)}:a;e.drawImage(r,o.x,o.y,o.width,o.height,0,0,g.width,g.height)}),[g,e.a.width,e.a.height,a.x,a.y,a.width,a.height,o,r,i,e.page._exportingOrRendering,s]),react_1.default.useEffect((()=>()=>{g&&"CANVAS"===g.nodeName&&konva_1.default.Util.releaseCanvas(g)}),[g]),g||t},useClip=(e,t,a,r)=>{const o=useSizeFixer(e.clipSrc||""),[i,n]=useImageHook(o,"anonymous"),c=e.clipSrc?n:"loaded";(0,exports.useImageLoader)(c,e.id+"-clip");const h=react_1.default.useMemo((()=>{if(t&&i)return createCanvas()}),[t,i]);react_1.default.useLayoutEffect((()=>{var r;if(!i)return;if(!t||!t.width||!t.height)return;if(!i||!i.width||!i.height)return;if(!h)return;const o=createCanvas(),n=Math.max(e.a.width/i.width*a,e.a.height/i.height*a);o.width=i.width*n,o.height=i.height*n,null===(r=o.getContext("2d"))||void 0===r||r.drawImage(i,0,0,o.width,o.height),h.width=Math.max(t.width,1),h.height=Math.max(t.height,1);const c=h.getContext("2d");c&&(c.save(),c.drawImage(o,0,0,t.width,t.height),konva_1.default.Util.releaseCanvas(o),c.globalCompositeOperation="source-in",c.drawImage(t,0,0,h.width,h.height),c.restore())}),[h,t,i,e.a.width,e.a.height,a,...r]);return e.clipSrc&&i?h:t},PLACEHOLDER_CANVAS=createCanvas(),LoadingPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t=Math.min(30,e.a.width/4,e.a.height/4),a=react_1.default.useRef(null);return react_1.default.useEffect((()=>{const e=a.current;if(!e)return;const t=new konva_1.default.Animation((t=>{e.rotate(((null==t?void 0:t.timeDiff)||0)/2)}),e.getLayer());return t.start(),()=>{t.stop()}})),react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.a.width,height:e.a.height,fill:"rgba(124, 173, 212, 0.8)"}),react_1.default.createElement(react_konva_1.Arc,{ref:a,x:e.a.width/2,y:e.a.height/2,fill:"white",outerRadius:Math.abs(t),innerRadius:Math.max(1,t-5),angle:270}))})),ErrorPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t="Can not load the image...",a=Math.max(10,Math.min(30,e.a.width/25));return react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,listening:!1,opacity:e.a.opacity,hideInExport:!e.showInExport},react_1.default.createElement(react_konva_1.Rect,{width:e.a.width,height:e.a.height,fill:"rgba(223, 102, 102, 0.8)"}),react_1.default.createElement(react_konva_1.Text,{text:t,fontSize:a,width:e.a.width,height:e.a.height,align:"center",fill:"white",verticalAlign:"middle",padding:5}))}));let useImageHook=use_image_1.default;const setImageLoaderHook=e=>{useImageHook=e};exports.setImageLoaderHook=setImageLoaderHook;const useImageWithVectorDetection=(e,t)=>{const[a,r]=useImageHook(e,t),[o,i]=react_1.default.useState(null);react_1.default.useEffect((()=>{if(!e)return void i(null);let a=!0;return(async()=>{try{const r=(await fetch(e,{method:"HEAD",credentials:"anonymous"===t?"omit":"include"})).headers.get("content-type");a&&i(null==r?void 0:r.includes("svg"))}catch(e){console.error("Error detecting image type:",e),a&&i(!1)}})(),()=>{a=!1}}),[e]);const n=null!==o;return[n?a:void 0,r,n?o:void 0]},useImageLoader=(e,t)=>{const a=react_1.default.useRef(),r=()=>{var e;null===(e=a.current)||void 0===e||e.call(a),a.current=void 0};react_1.default.useEffect((()=>r),[]),react_1.default.useLayoutEffect((()=>{"loading"!==e||a.current||(a.current=(0,loader_1.incrementLoader)(`image ${t}`)),"loading"!==e&&r(),"failed"===e&&(0,loader_1.triggerLoadError)(`image ${t}`)}),[e])};exports.useImageLoader=useImageLoader;const usePreviousImage=({image:e,status:t,type:a})=>{const r=react_1.default.useRef();react_1.default.useEffect((()=>{r.current=e||r.current}),[e]);return"failed"!==t||"failed"!==t&&"svg"===a?r.current:void 0},useImageSource=e=>{const[t,a]=react_1.default.useReducer((e=>e+1),0),r=react_1.default.useRef("loading"),o=react_1.default.useRef(e.src),i=react_1.default.useRef(e.src);return i.current!==e.src&&(i.current=e.src,r.current="loading"),react_1.default.useEffect((()=>{if("svg"!==e.type)return;if(!e.src)return;let t=!1;return(async()=>{r.current="loading",a();const i=await svg.urlToString(e.src),n=svg.fixSize(i),c=svg.replaceColors(n,e.colorsReplace);t||(o.current=c,r.current="loaded",a())})(),()=>{t=!0}}),[e.src,JSON.stringify(e.colorsReplace)]),"svg"!==e.type?[e.src,"loaded"]:[o.current,r.current]};exports.ImageElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{var a;const[r,o]=react_1.default.useState(!1),i=react_1.default.useRef(null),n=react_1.default.useRef(null),[c,h]=react_1.default.useState(!1),d=t.selectedShapes.indexOf(e)>=0,[l,s]=useImageSource(e),[u,g]=useImageHook(l,"anonymous"),f="svg"!==e.type||"loaded"===s?g:"loading";(0,exports.useImageLoader)(f,e.id);const p=e.page._exportingOrRendering?1:Math.max(1,t.scale),_=t._elementsPixelRatio*p,m=usePreviousImage({image:u,status:g,type:e.type}),w=useMask(e,useFlip(e,u||m,_))||PLACEHOLDER_CANVAS;let{cropX:v,cropY:x,cropWidth:y,cropHeight:M}=e;"loaded"!==g&&(v=x=0,y=M=1);const b=w.width*y,E=w.height*M,k=e.a.width/e.a.height;let C,I;const S=b/E,R="svg"===e.type;R?(C=b,I=E):k>=S?(C=b,I=b/k):(C=E*k,I=E);const O={x:w.width*v,y:w.height*x,width:C,height:I},D=null!==(a=e.cornerRadius)&&void 0!==a?a:0,L=e.page._exportingOrRendering?1:Math.min(2,t.scale),P=t._elementsPixelRatio*L;let X=useClip(e,useCornerRadiusAndCrop(e,w,O,P,D,r||e._cropModeEnabled||"svg"===e.type,!0),P,[O,D,P]);const Y=Math.max(e.a.width/C,e.a.height/I);react_1.default.useEffect((()=>{var t;if(!e._cropModeEnabled)return;const a=null===(t=i.current)||void 0===t?void 0:t.getStage();function r(t){e._cropModeEnabled&&t.target!==n.current&&e.toggleCropMode(!1)}function o(t){e._cropModeEnabled&&t.target.parentNode!==a.content&&e.toggleCropMode(!1)}return document.body.addEventListener("click",o),null==a||a.on("click",r),null==a||a.on("tap",r),()=>{document.body.removeEventListener("click",o),document.body.removeEventListener("touchstart",o),null==a||a.off("click",r),null==a||a.off("click",r)}}),[e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{if(r||e._cropModeEnabled)return;(0,apply_filters_1.applyFilter)(i.current,e);return(0,mobx_1.autorun)((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),{delay:100})}),[X,e.page._exportingOrRendering,r,y,M,e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{var t;r||e._cropModeEnabled?null===(t=i.current)||void 0===t||t.clearCache():(0,apply_filters_1.applyFilter)(i.current,e)}),[r,e.a.width,e.a.height,e._cropModeEnabled]),react_1.default.useEffect((()=>{(0,apply_filters_1.applyFilter)(i.current,e)}),[e.shadowEnabled,e.shadowBlur,e.cornerRadius,e.shadowColor,e.shadowOffsetX,e.shadowOffsetY,e.shadowOpacity]);const A=react_1.default.useRef(null),H=react_1.default.useRef(null),T=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(H.current.nodes([A.current]),T.current.nodes([n.current]))}),[e._cropModeEnabled]);var W=react_1.default.useRef(null),q=react_1.default.useRef(0),z=react_1.default.useRef(!1);const F=t=>{var a;(null===(a=t.evt.touches)||void 0===a?void 0:a.length)>2&&t.target.stopDrag(),Math.round(t.target.x())>0&&(t.target.x(0),t.target.scaleX(1)),Math.round(t.target.y())>0&&(t.target.y(0),t.target.scaleY(1));const r=t.target.width()*t.target.scaleX(),o=t.target.height()*t.target.scaleY(),i=Math.min(1,C/r),n=Math.min(1,I/o),c=1-i,h=Math.min(c,Math.max(0,Math.round(-t.target.x())/r)),d=1-n,l=Math.min(d,Math.max(0,Math.round(-t.target.y())/o));t.target.setAttrs({x:-h*w.width,y:-l*w.height,scaleX:1,scaleY:1}),e.set({cropX:h,cropY:l,cropWidth:i,cropHeight:n})},B=()=>{"svg"!==e.type&&e.contentEditable&&setTimeout((()=>{e.toggleCropMode(!0)}))},N="svg"===e.type&&m,j="loading"===g&&!N,U="failed"===g,V=!j&&!U,G=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),$=V?e.a.opacity:0;(0,use_fadein_1.useFadeIn)(i,$);const J=e.selectable||"admin"===t.role,K=(0,screen_1.isTouchDevice)();return react_1.default.createElement(react_1.default.Fragment,null,j&&react_1.default.createElement(LoadingPlaceholder,{element:e}),U&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:i,name:"element",id:e.id,image:X,x:e.a.x,y:e.a.y,width:e.a.width||1,height:e.a.height||1,rotation:e.a.rotation,opacity:$,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,customCrop:O,listening:J,draggable:K?e.draggable&&d:e.draggable,preventDefault:!K||d,hideInExport:!e.showInExport,onMouseEnter:()=>{h(!0)},onMouseLeave:()=>{h(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDblClick:B,onDblTap:B,onTransformStart:()=>{o(!0),G.current={cropX:e.cropX,cropY:e.cropY,cropWidth:e.cropWidth,cropHeight:e.cropHeight}},onTransform:t=>{var a;const r=t.currentTarget,o=Math.abs(r.scaleX()-1)<1e-7?1:r.scaleX(),i=Math.abs(r.scaleY()-1)<1e-7?1:r.scaleY();r.scaleX(1),r.scaleY(1);const n=null===(a=t.target.getStage())||void 0===a?void 0:a.findOne("Transformer"),c=1-C/w.width,h=Math.min(c,Math.max(0,e.cropX)),d=1-I/w.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&&G.current.cropHeight>I/w.height;let f=u?e.cropWidth:e.cropWidth*o;g&&(f=e.cropWidth);const p=!u&&i<1&&G.current.cropWidth>C/w.width;let _=u?e.cropHeight:e.cropHeight*i;p&&(_=e.cropHeight),R&&(f=e.cropWidth,_=e.cropHeight),e.set({cropX:h,cropY:l,x:r.x(),y:r.y(),width:r.width()*o,height:r.height()*i,rotation:t.target.rotation(),cropWidth:Math.min(f,1-h),cropHeight:Math.min(_,1-l)})},onTransformEnd:t=>{const a=t.currentTarget;e.set({width:a.width(),height:a.height(),x:a.x(),y:a.y(),rotation:t.target.rotation(),cropWidth:C/w.width,cropHeight:I/w.height}),o(!1)}}),react_1.default.createElement(react_konva_1.Rect,{x:e.x,y:e.y,width:Math.max(e.a.width-e.borderSize,0),height:Math.max(e.a.height-e.borderSize,0),opacity:$,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,D-e.borderSize),hideInExport:!e.showInExport}),e._cropModeEnabled&&react_1.default.createElement(react_konva_utils_1.Portal,{selector:".page-abs-container",enabled:!0},react_1.default.createElement(react_konva_1.Rect,{x:-window.innerWidth/t.scale,y:-window.innerWidth/t.scale,width:window.innerWidth/t.scale*3,height:window.innerWidth/t.scale*3,fill:"rgba(0,0,0,0.3)"}),react_1.default.createElement(react_konva_1.Image,{listening:!1,image:X,x:e.x,y:e.y,width:e.a.width,height:e.a.height,rotation:e.rotation,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur}),react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,scaleX:Y,scaleY:Y},react_1.default.createElement(react_konva_1.Image,{image:w,ref:n,opacity:.4,draggable:!0,x:-e.cropX*w.width,y:-e.cropY*w.height,onDragMove:F,onTransform:F,onTouchMove:e=>{e.evt.preventDefault();const t=e.target.getStage().getPointersPositions();var a=t[0],r=t[1];const o=e.target;if(a&&!r&&!o.isDragging()&&z.current&&(o.startDrag(),z.current=!1),a&&r){konva_1.default.hitOnDragEnabled=!0,o.isDragging()&&(z.current=!0,o.stopDrag());const t=e.target.getAbsoluteTransform().copy();t.invert();var i={x:a.x,y:a.y},n={x:r.x,y:r.y};if(!W.current)return void(W.current=getCenter(i,n));var c=getCenter(i,n),h=getDistance(i,n);q.current||(q.current=h);const f=o.position();var d={x:c.x-f.x,y:c.y-f.y},l=h/q.current;o.scaleX(l),o.scaleY(l);const p=t.point(c),_=t.point(W.current);var s=p.x-_.x,u=p.y-_.y,g={x:Math.min(0,c.x-d.x*l+s),y:Math.min(0,c.y-d.y*l+u)};o.position(g),q.current=h,W.current=c,F(e)}},onTouchEnd:e=>{q.current=0,W.current=null,konva_1.default.hitOnDragEnabled=!1}}),react_1.default.createElement(react_konva_1.Transformer,{ref:T,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:C,height:I,ref:A,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*w.width-1e-9&&(t.target.x(-e.cropX*w.width),t.target.scaleX(1)),t.target.y()<-e.cropY*w.height-1e-9&&(t.target.y(-e.cropY*w.height),t.target.scaleY(1));const a=Math.min(1,Math.max(0,e.cropX+t.target.x()/w.width)),r=Math.min(1,Math.max(0,t.target.y()/w.height+e.cropY)),o=t.target.width()*t.target.scaleX(),i=t.target.height()*t.target.scaleY(),n=Math.min(1-a,o/w.width),c=Math.min(1-r,i/w.height),h=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:h.x,y:h.y,cropX:a,cropY:r,cropWidth:n,cropHeight:c,width:Math.min(o*Y,w.width*(1-a)*Y),height:Math.min(i*Y,w.height*(1-r)*Y)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:H,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,visible:e.resizable,keepRatio:!1,rotateEnabled:!1,anchorFill:"rgb(240, 240, 240)",anchorStrokeWidth:2,borderStrokeWidth:2}))),(c||d)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
@@ -1 +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.LineElement=exports.getLinePositionFromMiddlePoints=exports.getMiddlePoints=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),use_color_1=require("./use-color"),react_konva_utils_1=require("react-konva-utils"),highlighter_1=require("./highlighter"),use_transformer_snap_1=require("./use-transformer-snap"),screen_1=require("../utils/screen");function getMiddlePoints(e){const{x:t,y:a,width:r,height:o,rotation:n}=e.a,i=n*Math.PI/180,s={x:t+o/2*Math.cos(i+Math.PI/2),y:a+o/2*Math.sin(i+Math.PI/2)};return{middleLeft:s,middleRight:{x:s.x+r*Math.cos(i),y:s.y+r*Math.sin(i)}}}function getLinePositionFromMiddlePoints(e,t,a){const r=Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)),o=Math.atan2(t.y-e.y,t.x-e.x),n=180*o/Math.PI;return{x:e.x+Math.cos(o-Math.PI/2)*a/2,y:e.y+Math.sin(o-Math.PI/2)*a/2,width:r,height:a,rotation:n}}exports.getMiddlePoints=getMiddlePoints,exports.getLinePositionFromMiddlePoints=getLinePositionFromMiddlePoints;const getAnchorAttrs=(e,t)=>({offsetX:5/e,offsetY:5/e,width:10/e,height:10/e,fill:"white",stroke:"rgb(0, 161, 255)",strokeWidth:2,strokeScaleEnabled:!1,draggable:!0,dragDistance:0,onMouseEnter:e=>{e.target.getStage().container().style.cursor="crosshair"},onMouseLeave:e=>{e.target.getStage().container().style.cursor=""},onDragStart:e=>{t.history.startTransaction()},onDragEnd:e=>{t.history.endTransaction()}}),Head=(0,mobx_react_lite_1.observer)((({element:e,type:t})=>{const a=(0,use_color_1.useColor)(e,e.a.color,"fill"),r=(0,use_color_1.useColor)(e,e.a.color,"stroke"),o=Object.assign(Object.assign(Object.assign({strokeWidth:e.height,lineCap:"round",lineJoin:"round"},r),a),{opacity:e.a.opacity,hideInExport:!e.showInExport});return react_1.default.createElement(react_1.default.Fragment,null,"arrow"===t&&react_1.default.createElement(react_konva_1.Line,Object.assign({points:[3*e.height,2*-e.height,0,0,3*e.height,2*e.height]},o)),"triangle"===t&&react_1.default.createElement(react_konva_1.Line,Object.assign({points:[3*e.height,2*-e.height,0,0,3*e.height,2*e.height],closed:!0},o)),"bar"===t&&react_1.default.createElement(react_konva_1.Line,Object.assign({points:[0,2*-e.height,0,2*e.height],closed:!0},o)),"square"===t&&react_1.default.createElement(react_konva_1.Line,Object.assign({points:[0,2*-e.height,4*e.height,2*-e.height,4*e.height,2*e.height,0,2*e.height],closed:!0},o)),"circle"===t&&react_1.default.createElement(react_konva_1.Circle,Object.assign({x:2*e.height,y:0,radius:2*e.height},o)))}));exports.LineElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const a=react_1.default.useRef(null),r=react_1.default.useRef(null),o=react_1.default.useRef(null),n=e.selectable||"admin"===t.role,i=(0,screen_1.isTouchDevice)(),[s,l]=react_1.default.useState(!1),c=t.selectedElements.indexOf(e)>=0&&1===t.selectedElements.length,h=t.selectedShapes.indexOf(e)>=0,{middleLeft:d,middleRight:g}=getMiddlePoints(e);(0,use_transformer_snap_1.useAnchorSnap)(r,[a],[c]),(0,use_transformer_snap_1.useAnchorSnap)(o,[a],[c]);const _=(0,use_color_1.useColor)(e,e.a.color,"stroke");return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Line,Object.assign({ref:a,name:"element",id:e.id,x:e.a.x,y:e.a.y,points:[0,0,e.a.width,0],offsetY:-e.a.height/2,strokeWidth:e.a.height,hitStrokeWidth:Math.max(e.a.height,20),dash:e.dash.map((t=>t*e.a.height))},_,{rotation:e.a.rotation,opacity:e.animated("opacity"),shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,listening:n,draggable:i?e.draggable&&h:e.draggable,preventDefault:!i||h,hideInExport:!e.showInExport,onMouseEnter:()=>{l(!0)},onMouseLeave:()=>{l(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onTransform:t=>{const a=t.target.scaleX();t.target.scaleX(1),t.target.scaleY(1),e.set({height:e.height*a,width:e.width*a,x:t.target.x(),y:t.target.y(),rotation:t.target.rotation()})}})),react_1.default.createElement(react_konva_1.Group,{x:d.x,y:d.y,rotation:e.rotation,hideInExport:!e.showInExport},react_1.default.createElement(Head,{element:e,type:e.startHead})),react_1.default.createElement(react_konva_1.Group,{x:g.x,y:g.y,rotation:e.rotation+180},react_1.default.createElement(Head,{element:e,type:e.endHead})),s&&!h&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}),c&&e.resizable&&react_1.default.createElement(react_konva_utils_1.Portal,{selector:".page-abs-container",enabled:!0},react_1.default.createElement(react_konva_1.Group,{visible:c},react_1.default.createElement(react_konva_1.Rect,Object.assign({x:d.x,y:d.y,ref:r,name:"line-anchor"},getAnchorAttrs(t.scale,t),{onDragMove:t=>{const a=getLinePositionFromMiddlePoints(t.target.position(),g,e.height);e.set({x:a.x,y:a.y,width:a.width,rotation:a.rotation})}})),react_1.default.createElement(react_konva_1.Rect,Object.assign({x:g.x,y:g.y,ref:o,name:"line-anchor"},getAnchorAttrs(t.scale,t),{onDragMove:t=>{const a=getLinePositionFromMiddlePoints(d,t.target.position(),e.height);e.set({x:a.x,y:a.y,width:a.width,rotation:a.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.LineElement=exports.getLinePositionFromMiddlePoints=exports.getMiddlePoints=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),use_color_1=require("./use-color"),react_konva_utils_1=require("react-konva-utils"),highlighter_1=require("./highlighter"),use_transformer_snap_1=require("./use-transformer-snap"),screen_1=require("../utils/screen");function getMiddlePoints(e){const{x:t,y:a,width:r,height:o,rotation:n}=e.a,i=n*Math.PI/180,s={x:t+o/2*Math.cos(i+Math.PI/2),y:a+o/2*Math.sin(i+Math.PI/2)};return{middleLeft:s,middleRight:{x:s.x+r*Math.cos(i),y:s.y+r*Math.sin(i)}}}function getLinePositionFromMiddlePoints(e,t,a){const r=Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)),o=Math.atan2(t.y-e.y,t.x-e.x),n=180*o/Math.PI;return{x:e.x+Math.cos(o-Math.PI/2)*a/2,y:e.y+Math.sin(o-Math.PI/2)*a/2,width:r,height:a,rotation:n}}exports.getMiddlePoints=getMiddlePoints,exports.getLinePositionFromMiddlePoints=getLinePositionFromMiddlePoints;const getAnchorAttrs=(e,t)=>({offsetX:5/e,offsetY:5/e,width:10/e,height:10/e,fill:"white",stroke:"rgb(0, 161, 255)",strokeWidth:2,strokeScaleEnabled:!1,draggable:!0,dragDistance:0,onMouseEnter:e=>{e.target.getStage().container().style.cursor="crosshair"},onMouseLeave:e=>{e.target.getStage().container().style.cursor=""},onDragStart:e=>{t.history.startTransaction()},onDragEnd:e=>{t.history.endTransaction()}}),Head=(0,mobx_react_lite_1.observer)((({element:e,type:t})=>{const a=(0,use_color_1.useColor)(e,e.a.color,"fill"),r=(0,use_color_1.useColor)(e,e.a.color,"stroke"),o=Object.assign(Object.assign(Object.assign({strokeWidth:e.height,lineCap:"round",lineJoin:"round"},r),a),{opacity:e.a.opacity,hideInExport:!e.showInExport});return react_1.default.createElement(react_1.default.Fragment,null,"arrow"===t&&react_1.default.createElement(react_konva_1.Line,Object.assign({points:[3*e.height,2*-e.height,0,0,3*e.height,2*e.height]},o)),"triangle"===t&&react_1.default.createElement(react_konva_1.Line,Object.assign({points:[3*e.height,2*-e.height,0,0,3*e.height,2*e.height],closed:!0},o)),"bar"===t&&react_1.default.createElement(react_konva_1.Line,Object.assign({points:[0,2*-e.height,0,2*e.height],closed:!0},o)),"square"===t&&react_1.default.createElement(react_konva_1.Line,Object.assign({points:[0,2*-e.height,4*e.height,2*-e.height,4*e.height,2*e.height,0,2*e.height],closed:!0},o)),"circle"===t&&react_1.default.createElement(react_konva_1.Circle,Object.assign({x:2*e.height,y:0,radius:2*e.height},o)))}));exports.LineElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const a=react_1.default.useRef(null),r=react_1.default.useRef(null),o=react_1.default.useRef(null),n=e.selectable||"admin"===t.role,i=(0,screen_1.isTouchDevice)(),[s,l]=react_1.default.useState(!1),c=t.selectedElements.indexOf(e)>=0&&1===t.selectedElements.length,h=t.selectedShapes.indexOf(e)>=0,{middleLeft:d,middleRight:g}=getMiddlePoints(e);(0,use_transformer_snap_1.useAnchorSnap)(r,[a],[c]),(0,use_transformer_snap_1.useAnchorSnap)(o,[a],[c]);const _=(0,use_color_1.useColor)(e,e.a.color,"stroke");return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Line,Object.assign({ref:a,name:"element",id:e.id,x:e.a.x,y:e.a.y,points:[0,0,e.a.width,0],offsetY:-e.a.height/2,strokeWidth:e.a.height,hitStrokeWidth:Math.max(e.a.height,20),dash:e.dash.map((t=>t*e.a.height))},_,{rotation:e.a.rotation,opacity:e.animated("opacity"),shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,listening:n,draggable:i?e.draggable&&h:e.draggable,preventDefault:!i||h,hideInExport:!e.showInExport,onMouseEnter:()=>{l(!0)},onMouseLeave:()=>{l(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onTransform:t=>{const a=t.target.scaleX();t.target.scaleX(1),t.target.scaleY(1),e.set({height:e.height*a,width:e.width*a,x:t.target.x(),y:t.target.y(),rotation:t.target.rotation()})}})),react_1.default.createElement(react_konva_1.Group,{x:d.x,y:d.y,rotation:e.rotation,hideInExport:!e.showInExport},react_1.default.createElement(Head,{element:e,type:e.startHead})),react_1.default.createElement(react_konva_1.Group,{x:g.x,y:g.y,rotation:e.rotation+180},react_1.default.createElement(Head,{element:e,type:e.endHead})),(s||h&&!c)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}),c&&e.resizable&&react_1.default.createElement(react_konva_utils_1.Portal,{selector:".page-abs-container",enabled:!0},react_1.default.createElement(react_konva_1.Group,{visible:c},react_1.default.createElement(react_konva_1.Rect,Object.assign({x:d.x,y:d.y,ref:r,name:"line-anchor"},getAnchorAttrs(t.scale,t),{onDragMove:t=>{const a=getLinePositionFromMiddlePoints(t.target.position(),g,e.height);e.set({x:a.x,y:a.y,width:a.width,rotation:a.rotation})}})),react_1.default.createElement(react_konva_1.Rect,Object.assign({x:g.x,y:g.y,ref:o,name:"line-anchor"},getAnchorAttrs(t.scale,t),{onDragMove:t=>{const a=getLinePositionFromMiddlePoints(d,t.target.position(),e.height);e.set({x:a.x,y:a.y,width:a.width,rotation:a.rotation})}})))))}));
@@ -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.WorkspaceCanvas=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),page_1=__importDefault(require("./page")),rules_1=require("./rules"),hotkeys_1=require("./hotkeys"),l10n_1=require("../utils/l10n"),limit=(e,t,r)=>Math.max(t,Math.min(r,e)),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,n,l)=>{const o=react_1.default.useRef({width:t,height:r}),c=react_1.default.useRef({top:0,left:0}),s=react_1.default.useRef(!1),i=react_1.default.useRef(n.pages.length);s.current=i.current!==n.pages.length,i.current=n.pages.length,react_1.default.useEffect((()=>{const t=e.current,r=e=>{c.current={top:t.scrollTop,left:t.scrollLeft}};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]),react_1.default.useLayoutEffect((()=>{if(!e.current)return;if(s.current)return;const a=e.current,n=(c.current.left+a.offsetWidth/2)/o.current.width,i=(c.current.top+a.offsetHeight/2)/o.current.height;l.current=!0,a.scrollLeft=n*t-a.offsetWidth/2,a.scrollTop=i*r-a.offsetHeight/2,o.current={width:t,height:r}}),[a,t,r])},useScrollOnActiveChange=(e,t,r,a,n)=>{const l=react_1.default.useRef(!1),o=react_1.default.useRef(null);react_1.default.useEffect((()=>{const t=e.current,r=()=>{n.current};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]);const c=r.pages.indexOf(r.activePage);react_1.default.useLayoutEffect((()=>{if(!r.activePage)return;if(!e.current)return;if(l.current)return;const a=e.current,o=r.pages.indexOf(r.activePage)*t;Math.abs(o-a.scrollTop)>.5*t&&(n.current=!0,a.scrollTop=o)}),[r.activePage,c]);return{handleScroll:e=>{if(n.current)return void(n.current=!1);l.current=!0,clearTimeout(o.current),o.current=setTimeout((()=>{l.current=!1}),300);const t=e.currentTarget.childNodes[0].offsetHeight,c=e.currentTarget.scrollTop,s=Math.floor((c+a.height/3)/t),i=r.pages[s];i&&i.select()}}},NoPages=({store:e})=>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"))),PagePlaceholder=({width:e,height:t,xPadding:r,yPadding:a,backgroundColor:n})=>react_1.default.createElement("div",{style:{width:e+"px",height:t+"px",backgroundColor:n,paddingLeft:r+"px",paddingRight:r+"px",paddingTop:a+"px",paddingBottom:a+"px"}},react_1.default.createElement("div",{style:{width:" 100%",height:"100%",backgroundColor:"white"}}));exports.WorkspaceCanvas=(0,mobx_react_lite_1.observer)((({store:e,pageControlsEnabled:t,backgroundColor:r,pageBorderColor:a,activePageBorderColor:n,bleedColor:l,components:o,onKeyDown:c,paddingX:s,paddingY:i,altCloneEnabled:u=!0,visiblePagesOffset:d})=>{const h=null!=s?s:20,g=null!=i?i:55,[f,p]=react_1.default.useState({width:100,height:100}),m=react_1.default.useRef(f),_=react_1.default.useRef(null),v=react_1.default.useRef(null),w=e.bleedVisible?Math.max(0,...e.pages.map((e=>e.bleed))):0,b=Math.max(...e.pages.map((e=>e.computedWidth))),E=Math.max(...e.pages.map((e=>e.computedHeight))),x=b+2*w,k=E+2*w,y=async({skipTimeout:t}={skipTimeout:!1})=>{if(t||await new Promise((e=>setTimeout(e,50))),null===_.current)return;const r=_.current.getBoundingClientRect();0!==r.width&&0!==r.height||(console.warn(ZERO_SIZE_WARNING),console.log(_.current));const a=v.current.clientWidth||r.width,n={width:a,height:r.height};(m.current.width!==n.width||m.current.height!==n.height)&&(p(n),m.current=n);const l=(a-2*h)/x,o=(r.height-2*g)/k,c=Math.max(Math.min(l,o),.01);e.scaleToFit!==c&&(e.setScale(c),e._setScaleToFit(c))};react_1.default.useLayoutEffect((()=>{y({skipTimeout:!0})}),[]),react_1.default.useEffect((()=>{y()}),[x,k]),react_1.default.useEffect((()=>{const e=_.current;if(window.ResizeObserver){const t=new ResizeObserver((()=>{y({skipTimeout:!0})}));return t.observe(e),()=>t.unobserve(e)}{const e=setInterval((()=>{y({skipTimeout:!0})}),100);return()=>clearInterval(e)}}),[x,k]);const P=Math.max(h,(f.width-x*e.scale)/2),C=k*e.scale*e.pages.length,M=Math.max(g,(f.height-C)/e.pages.length/2);react_1.default.useEffect((()=>{const t=t=>{(c||hotkeys_1.handleHotkey)(t,e)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)}),[]),react_1.default.useEffect((()=>{var t;const r=t=>{if(t.ctrlKey||t.metaKey){t.preventDefault();const l=Math.max(3,e.scaleToFit),o=Math.min(.1,e.scaleToFit),c=(r=t.deltaY<0?1.05*e.scale:e.scale/1.05,a=o,n=l,Math.max(a,Math.min(n,r)));e.setScale(c)}else var r,a,n};return null===(t=v.current)||void 0===t||t.addEventListener("wheel",r),()=>{var e;return null===(e=v.current)||void 0===e?void 0:e.removeEventListener("wheel",r)}}),[]);const T=react_1.default.useRef(!1);useSaveScrollOnScaleChange(v,x*e.scale+2*P,k*e.scale+2*M,e.scale,e,T);const{handleScroll:R}=useScrollOnActiveChange(v,k*e.scale+2*M,e,f,T),S=f.width>=x*e.scale+2*P,L=r||"rgba(232, 232, 232, 0.9)",O=e.pages.indexOf(e.activePage),W=(null==o?void 0:o.NoPages)||NoPages,N=null!=d?d:Math.min(3,Math.max(1,Math.ceil(f.height/2/(k*e.scale))));return react_1.default.createElement("div",{ref:_,style:{width:"100%",height:"100%",position:"relative",outline:"none",flex:1,backgroundColor:L},tabIndex:0,className:"polotno-workspace-container"},react_1.default.createElement("div",{ref:v,onScroll:R,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",overflow:"auto",overflowX:S?"hidden":"auto"},className:"polotno-workspace-inner"},e.pages.map(((r,c)=>Math.abs(c-O)<=N||r._exportingOrRendering?react_1.default.createElement(page_1.default,{key:r.id,page:r,xPadding:P,yPadding:M,width:x*e.scale+2*P,height:k*e.scale+2*M,store:e,pageControlsEnabled:t,backColor:L,pageBorderColor:a||"lightgrey",activePageBorderColor:n||"rgb(0, 161, 255)",altCloneEnabled:u,bleedColor:l||"rgba(255, 0, 0, 0.1)",components:o}):react_1.default.createElement(PagePlaceholder,{key:r.id,width:x*e.scale+2*P,height:k*e.scale+2*M,backgroundColor:L,xPadding:P,yPadding:M}))),e.rulesVisible&&react_1.default.createElement(rules_1.TopRules,{store:e,xPadding:P,yPadding:M,width:x*e.scale+2*P,height:k*e.scale+2*M}),0===e.pages.length&&react_1.default.createElement(W,{store:e})))})),exports.default=exports.WorkspaceCanvas;
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.WorkspaceCanvas=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),page_1=__importDefault(require("./page")),rules_1=require("./rules"),audio_1=require("./audio"),hotkeys_1=require("./hotkeys"),l10n_1=require("../utils/l10n"),limit=(e,t,r)=>Math.max(t,Math.min(r,e)),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,l,n)=>{const o=react_1.default.useRef({width:t,height:r}),c=react_1.default.useRef({top:0,left:0}),s=react_1.default.useRef(!1),i=react_1.default.useRef(l.pages.length);s.current=i.current!==l.pages.length,i.current=l.pages.length,react_1.default.useEffect((()=>{const t=e.current,r=e=>{c.current={top:t.scrollTop,left:t.scrollLeft}};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]),react_1.default.useLayoutEffect((()=>{if(!e.current)return;if(s.current)return;const a=e.current,l=(c.current.left+a.offsetWidth/2)/o.current.width,i=(c.current.top+a.offsetHeight/2)/o.current.height;n.current=!0,a.scrollLeft=l*t-a.offsetWidth/2,a.scrollTop=i*r-a.offsetHeight/2,o.current={width:t,height:r}}),[a,t,r])},useScrollOnActiveChange=(e,t,r,a,l)=>{const n=react_1.default.useRef(!1),o=react_1.default.useRef(null);react_1.default.useEffect((()=>{const t=e.current,r=()=>{l.current};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]);const c=r.pages.indexOf(r.activePage);react_1.default.useLayoutEffect((()=>{if(!r.activePage)return;if(!e.current)return;if(n.current)return;const a=e.current,o=r.pages.indexOf(r.activePage)*t;Math.abs(o-a.scrollTop)>.5*t&&(l.current=!0,a.scrollTop=o)}),[r.activePage,c]);return{handleScroll:e=>{if(l.current)return void(l.current=!1);n.current=!0,clearTimeout(o.current),o.current=setTimeout((()=>{n.current=!1}),300);const t=e.currentTarget.childNodes[0].offsetHeight,c=e.currentTarget.scrollTop,s=Math.floor((c+a.height/3)/t),i=r.pages[s];i&&i.select()}}},NoPages=({store:e})=>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"))),PagePlaceholder=({width:e,height:t,xPadding:r,yPadding:a,backgroundColor:l})=>react_1.default.createElement("div",{style:{width:e+"px",height:t+"px",backgroundColor:l,paddingLeft:r+"px",paddingRight:r+"px",paddingTop:a+"px",paddingBottom:a+"px"}},react_1.default.createElement("div",{style:{width:" 100%",height:"100%",backgroundColor:"white"}}));exports.WorkspaceCanvas=(0,mobx_react_lite_1.observer)((({store:e,pageControlsEnabled:t,backgroundColor:r,pageBorderColor:a,activePageBorderColor:l,bleedColor:n,components:o,onKeyDown:c,paddingX:s,paddingY:i,altCloneEnabled:u=!0,visiblePagesOffset:d})=>{const h=null!=s?s:20,g=null!=i?i:55,[f,p]=react_1.default.useState({width:100,height:100}),m=react_1.default.useRef(f),_=react_1.default.useRef(null),v=react_1.default.useRef(null),w=e.bleedVisible?Math.max(0,...e.pages.map((e=>e.bleed))):0,E=Math.max(...e.pages.map((e=>e.computedWidth))),b=Math.max(...e.pages.map((e=>e.computedHeight))),x=E+2*w,k=b+2*w,y=async({skipTimeout:t}={skipTimeout:!1})=>{if(t||await new Promise((e=>setTimeout(e,50))),null===_.current)return;const r=_.current.getBoundingClientRect();0!==r.width&&0!==r.height||(console.warn(ZERO_SIZE_WARNING),console.log(_.current));const a=v.current.clientWidth||r.width,l={width:a,height:r.height};(m.current.width!==l.width||m.current.height!==l.height)&&(p(l),m.current=l);const n=(a-2*h)/x,o=(r.height-2*g)/k,c=Math.max(Math.min(n,o),.01);e.scaleToFit!==c&&(e.setScale(c),e._setScaleToFit(c))};react_1.default.useLayoutEffect((()=>{y({skipTimeout:!0})}),[]),react_1.default.useEffect((()=>{y()}),[x,k]),react_1.default.useEffect((()=>{const e=_.current;if(window.ResizeObserver){const t=new ResizeObserver((()=>{y({skipTimeout:!0})}));return t.observe(e),()=>t.unobserve(e)}{const e=setInterval((()=>{y({skipTimeout:!0})}),100);return()=>clearInterval(e)}}),[x,k]);const P=Math.max(h,(f.width-x*e.scale)/2),C=k*e.scale*e.pages.length,M=Math.max(g,(f.height-C)/e.pages.length/2);react_1.default.useEffect((()=>{const t=t=>{(c||hotkeys_1.handleHotkey)(t,e)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)}),[]),react_1.default.useEffect((()=>{var t;const r=t=>{if(t.ctrlKey||t.metaKey){t.preventDefault();const n=Math.max(3,e.scaleToFit),o=Math.min(.1,e.scaleToFit),c=(r=t.deltaY<0?1.05*e.scale:e.scale/1.05,a=o,l=n,Math.max(a,Math.min(l,r)));e.setScale(c)}else var r,a,l};return null===(t=v.current)||void 0===t||t.addEventListener("wheel",r),()=>{var e;return null===(e=v.current)||void 0===e?void 0:e.removeEventListener("wheel",r)}}),[]);const T=react_1.default.useRef(!1);useSaveScrollOnScaleChange(v,x*e.scale+2*P,k*e.scale+2*M,e.scale,e,T);const{handleScroll:R}=useScrollOnActiveChange(v,k*e.scale+2*M,e,f,T),S=f.width>=x*e.scale+2*P,L=r||"rgba(232, 232, 232, 0.9)",O=e.pages.indexOf(e.activePage),W=(null==o?void 0:o.NoPages)||NoPages,N=null!=d?d:Math.min(3,Math.max(1,Math.ceil(f.height/2/(k*e.scale))));return react_1.default.createElement("div",{ref:_,style:{width:"100%",height:"100%",position:"relative",outline:"none",flex:1,backgroundColor:L},tabIndex:0,className:"polotno-workspace-container"},react_1.default.createElement("div",{ref:v,onScroll:R,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",overflow:"auto",overflowX:S?"hidden":"auto"},className:"polotno-workspace-inner"},e.pages.map(((r,c)=>Math.abs(c-O)<=N||r._exportingOrRendering?react_1.default.createElement(page_1.default,{key:r.id,page:r,xPadding:P,yPadding:M,width:x*e.scale+2*P,height:k*e.scale+2*M,store:e,pageControlsEnabled:t,backColor:L,pageBorderColor:a||"lightgrey",activePageBorderColor:l||"rgb(0, 161, 255)",altCloneEnabled:u,bleedColor:n||"rgba(255, 0, 0, 0.1)",components:o}):react_1.default.createElement(PagePlaceholder,{key:r.id,width:x*e.scale+2*P,height:k*e.scale+2*M,backgroundColor:L,xPadding:P,yPadding:M}))),e.rulesVisible&&react_1.default.createElement(rules_1.TopRules,{store:e,xPadding:P,yPadding:M,width:x*e.scale+2*P,height:k*e.scale+2*M}),0===e.pages.length&&react_1.default.createElement(W,{store:e}),e.audios.map((t=>react_1.default.createElement(audio_1.AudioElement,{key:t.id,audio:t,store:e})))))})),exports.default=exports.WorkspaceCanvas;
@@ -0,0 +1,23 @@
1
+ import { Instance } from 'mobx-state-tree';
2
+ export declare const Audio: import("mobx-state-tree").IModelType<{
3
+ id: import("mobx-state-tree").ISimpleType<string>;
4
+ src: import("mobx-state-tree").IType<string, string, string>;
5
+ duration: import("mobx-state-tree").IType<number, number, number>;
6
+ startTime: import("mobx-state-tree").IType<number, number, number>;
7
+ endTime: import("mobx-state-tree").IType<number, number, number>;
8
+ volume: import("mobx-state-tree").IType<number, number, number>;
9
+ delay: import("mobx-state-tree").IType<number, number, number>;
10
+ }, {
11
+ toJSON(): {
12
+ id: string;
13
+ src: string;
14
+ duration: number;
15
+ startTime: number;
16
+ endTime: number;
17
+ volume: number;
18
+ delay: number;
19
+ };
20
+ } & {
21
+ set(attrs: any): void;
22
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
23
+ export type AudioType = Instance<typeof Audio>;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Audio=void 0;const mobx_state_tree_1=require("mobx-state-tree");exports.Audio=mobx_state_tree_1.types.model("Audio",{id:mobx_state_tree_1.types.identifier,src:"",duration:0,startTime:0,endTime:1,volume:1,delay:0}).actions((e=>({toJSON:()=>Object.assign({},(0,mobx_state_tree_1.getSnapshot)(e))}))).actions((e=>({set(t){Object.assign(e,t)}})));
package/model/store.d.ts CHANGED
@@ -89,6 +89,27 @@ export declare const Store: import("mobx-state-tree").IModelType<{
89
89
  url: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
90
90
  styles: import("mobx-state-tree").IType<any, any, any>;
91
91
  }, {}, any, import("mobx-state-tree")._NotCustomized>>;
92
+ audios: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
93
+ id: import("mobx-state-tree").ISimpleType<string>;
94
+ src: import("mobx-state-tree").IType<string, string, string>;
95
+ duration: import("mobx-state-tree").IType<number, number, number>;
96
+ startTime: import("mobx-state-tree").IType<number, number, number>;
97
+ endTime: import("mobx-state-tree").IType<number, number, number>;
98
+ volume: import("mobx-state-tree").IType<number, number, number>;
99
+ delay: import("mobx-state-tree").IType<number, number, number>;
100
+ }, {
101
+ toJSON(): {
102
+ id: string;
103
+ src: string;
104
+ duration: number;
105
+ startTime: number;
106
+ endTime: number;
107
+ volume: number;
108
+ delay: number;
109
+ };
110
+ } & {
111
+ set(attrs: any): void;
112
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
92
113
  width: import("mobx-state-tree").IType<number, number, number>;
93
114
  height: import("mobx-state-tree").IType<number, number, number>;
94
115
  currentTime: import("mobx-state-tree").IType<number, number, number>;
@@ -542,6 +563,15 @@ export declare const Store: import("mobx-state-tree").IModelType<{
542
563
  styles: import("mobx-state-tree").IType<any, any, any>;
543
564
  }>[];
544
565
  pages: {}[];
566
+ audios: import("mobx-state-tree").ModelSnapshotType<{
567
+ id: import("mobx-state-tree").ISimpleType<string>;
568
+ src: import("mobx-state-tree").IType<string, string, string>;
569
+ duration: import("mobx-state-tree").IType<number, number, number>;
570
+ startTime: import("mobx-state-tree").IType<number, number, number>;
571
+ endTime: import("mobx-state-tree").IType<number, number, number>;
572
+ volume: import("mobx-state-tree").IType<number, number, number>;
573
+ delay: import("mobx-state-tree").IType<number, number, number>;
574
+ }>[];
545
575
  unit: string;
546
576
  dpi: number;
547
577
  custom: any;
@@ -552,6 +582,8 @@ export declare const Store: import("mobx-state-tree").IModelType<{
552
582
  }): void;
553
583
  addFont(font: fonts.FONT): void;
554
584
  removeFont(fontFamily: string): void;
585
+ addAudio(data: any): void;
586
+ removeAudio(audioId: string): void;
555
587
  loadFont(fontFamily: any): Promise<void[]>;
556
588
  validate(json: any): {
557
589
  path: string;
package/model/store.js CHANGED
@@ -1 +1 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var o=Object.getOwnPropertyDescriptor(t,i);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,o)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),__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 i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&__createBinding(t,e,i);return __setModuleDefault(t,e),t},__rest=this&&this.__rest||function(e,t){var i={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(i[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(a=Object.getOwnPropertySymbols(e);o<a.length;o++)t.indexOf(a[o])<0&&Object.prototype.propertyIsEnumerable.call(e,a[o])&&(i[a[o]]=e[a[o]])}return i},__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=void 0;const mobx_state_tree_1=require("mobx-state-tree"),history_1=require("./history"),nanoid_1=require("nanoid"),konva_1=__importDefault(require("konva")),download_1=require("../utils/download"),pdf_1=require("../utils/pdf"),gif_lib_1=require("../utils/gif-lib"),validate_key_1=require("../utils/validate-key"),fonts=__importStar(require("../utils/fonts")),loader_1=require("../utils/loader"),unit_1=require("../utils/unit"),deep_equal_1=require("../utils/deep-equal"),wait_1=require("../utils/wait"),html_1=require("../utils/html"),to_svg_1=require("../utils/to-svg"),page_model_1=require("./page-model"),group_model_1=require("./group-model");function createStore({key:e,showCredit:t}={key:"",showCredit:!1}){const i=exports.Store.create();return(0,validate_key_1.validateKey)(e,t),i}(0,mobx_state_tree_1.setLivelinessChecking)("ignore"),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(page_model_1.Page),fonts:mobx_state_tree_1.types.array(exports.Font),width:1080,height:1080,currentTime:0,isPlaying:!1,scale:1,scaleToFit:1,unit:"px",dpi:72,bleedVisible:!1,rulesVisible:!1,openedSidePanel:"",previousOpenedSidePanel:"",custom:mobx_state_tree_1.types.frozen(),selectedElementsIds:mobx_state_tree_1.types.array(mobx_state_tree_1.types.string),animatedElementsIds:mobx_state_tree_1.types.array(mobx_state_tree_1.types.string),history:mobx_state_tree_1.types.optional(history_1.UndoManager,{targetPath:"../pages"}),_elementsPixelRatio:Math.min(2,window.devicePixelRatio||1),_activePageId:""}).views((e=>({get _bleedVisible(){return console.warn("store._bleedVisible is deprecated. Please use store.bleedVisible instead."),e.bleedVisible},get selectedElements(){return e.selectedElementsIds.map((t=>{for(const i of e.pages)for(const e of i.children)if(e.id===t)return e})).filter((e=>!!e))},get children(){return e.pages},get selectedShapes(){const t=[];return(0,group_model_1.forEveryChild)({children:e.selectedElements},(e=>{"group"!==e.type&&t.push(e)})),t},get activePage(){return e.pages.slice().find((t=>t.id===e._activePageId))||(e.pages.length?e.pages[0]:null)},get duration(){let t=0;return e.pages.forEach((e=>{t+=e.duration})),t},get _hasCroppedImages(){return e.find((e=>"image"===e.type&&e._cropModeEnabled))},find(t){let i;return(0,group_model_1.forEveryChild)({children:e.pages},(e=>{if(!i&&t(e))return i=e,!0})),i},getElementById:t=>e.find((e=>e.id===t))}))).actions((e=>{let t=0,i=null,a=!1;return{afterCreate(){e.history.canUndo},setCurrentTime(t){e.currentTime=t},play({animatedElementsIds:o=[],startTime:n=0,currentTime:s=0,endTime:r=e.duration,repeat:l=!1}={}){s&&(console.warn("currentTime property of store.play() is deprecated. Please use startTime instead."),n=s),e.animatedElementsIds=(0,mobx_state_tree_1.cast)(o),e.currentTime=n,e.isPlaying=!0,t=Date.now(),i=r,a=l,requestAnimationFrame(e.seek)},checkActivePage(){let t=0;for(const i of e.pages){if(e.currentTime>=i.startTime&&e.currentTime<i.startTime+i.duration){e.selectPage(i.id);break}t+=i.duration}},seek(){if(!e.isPlaying)return;const o=Date.now(),n=o-t;t=o,e.currentTime+=n,e.checkActivePage();const s=i||e.duration;e.isPlaying&&e.currentTime<s?requestAnimationFrame(e.seek):e.isPlaying&&a?(e.currentTime=0,requestAnimationFrame(e.seek)):e.stop()},stop(){e.isPlaying=!1,e.currentTime=0,e.animatedElementsIds=(0,mobx_state_tree_1.cast)([]),e.checkActivePage()}}})).actions((e=>({set(t){Object.assign(e,t)},setUnit({unit:t,dpi:i}){e.unit=t||e.unit,e.dpi=i||e.dpi},setRole(t){e.role=t},addPage(t){const i=page_model_1.Page.create(Object.assign({id:(0,nanoid_1.nanoid)(10)},t));return e.pages.push(i),e._activePageId=i.id,i},selectPage(t){e._activePageId=t},selectElements(t){const i=t.map((t=>e.getElementById(t))).sort(((e,t)=>e.page.children.indexOf(e)-e.page.children.indexOf(t))).filter((e=>!!e)).map((e=>e.id));e.selectedElementsIds=(0,mobx_state_tree_1.cast)(i)},toggleBleed(t){e.bleedVisible=null!=t?t:!e.bleedVisible},toggleRulers(t){e.rulesVisible=null!=t?t:!e.rulesVisible},openSidePanel(t){e.openedSidePanel!==t&&(e.previousOpenedSidePanel=e.openedSidePanel,e.openedSidePanel=t)},setScale(t){e.scale=t},_setScaleToFit(t){e.scaleToFit=t},setElementsPixelRatio(t){e._elementsPixelRatio=t},setSize(t,i,a){e.pages.forEach((e=>{e.setSize({width:t,height:i,useMagic:a,softChange:!0})})),e.width=t,e.height=i},setPageZIndex(t,i){const a=e.pages.find((e=>e.id===t));a&&((0,mobx_state_tree_1.detach)(a),e.pages.remove(a),e.pages.splice(i,0,a))},deletePages(t){const i=e.pages.indexOf(e.activePage);t.forEach((t=>{const i=e.pages.find((e=>e.id===t));(0,mobx_state_tree_1.destroy)(i)}));const a=Math.min(e.pages.length-1,i),o=e.pages[a];o&&(e._activePageId=o.id),e.selectedElementsIds=(0,mobx_state_tree_1.cast)(e.selectedElementsIds.filter((t=>e.getElementById(t))))},groupElements(t){const i=t.map((t=>e.getElementById(t)));i.forEach((e=>{e&&(0,mobx_state_tree_1.detach)(e)}));const a=e.activePage,o={id:(0,nanoid_1.nanoid)(10),children:i,type:"group"};return a.children.push(o),e.selectedElementsIds=(0,mobx_state_tree_1.cast)([o.id]),o},ungroupElements(t){const i=t.map((t=>e.getElementById(t))),a=[];i.forEach((e=>{if(e&&"group"===e.type){const t=e.page,i=t.children.indexOf(e);e.children.forEach((e=>{a.push(e.id)})),e.children.forEach((e=>{(0,mobx_state_tree_1.detach)(e),t.children.push(e)})),t.children.splice(i,1)}})),e.selectedElementsIds=(0,mobx_state_tree_1.cast)(a)},deleteElements(t){const i=[];e.find((e=>(t.includes(e.id)&&i.push(e),!1))),i.forEach((e=>{(0,mobx_state_tree_1.destroy)(e)})),e.selectedElementsIds=(0,mobx_state_tree_1.cast)(e.selectedElementsIds.filter((t=>e.getElementById(t))))},on(t,i){if("change"===t){let t=e.toJSON();return(0,mobx_state_tree_1.onSnapshot)(e,(a=>{const o=e.toJSON();!(0,deep_equal_1.deepEqual)(t,o)&&(t=o,i(o))}))}},async _toCanvas({pixelRatio:t,ignoreBackground:i,pageId:a,mimeType:o,includeBleed:n,_skipTimeout:s}={}){var r;const l=t||1;a=a||(null===(r=e.pages[0])||void 0===r?void 0:r.id);const d=e.pages.find((e=>e.id===a));if(!d)throw new Error(`No page for export with id ${a}`);null==d||d.set({_exporting:!0});const c=await(0,wait_1.waitTillAvailable)((()=>konva_1.default.stages.find((e=>e.getAttr("pageId")===a))));if(!c)throw new Error(`Export is failed. Can not find stage for page ${a}. Looks like <Workspace /> component is not mounted, but it is required in order to process the export.`);const p=!!c.findOne(".page-container"),u=e._elementsPixelRatio;l>e._elementsPixelRatio&&e.setElementsPixelRatio(l),await e.waitLoading({_skipTimeout:s});const g=c.findOne(".page-container");if(!g)throw e.setElementsPixelRatio(u),new Error(`Export is failed. Can't find page container. ${p}`);c.find("Transformer").forEach((e=>e.visible(!1))),g.find(".page-background").forEach((e=>e.shadowEnabled(!1))),g.find(".page-background").forEach((e=>e.strokeEnabled(!1))),g.find(".highlighter").forEach((e=>e.visible(!1)));const m=g.findOne(".page-background-group"),_=m.clip();m.clip({x:null,y:null,width:null,height:null});const f=g.findOne(".elements-container"),h=f.clip();f.clip({x:null,y:null,width:null,height:null});const b=g.find((e=>e.getAttr("hideInExport")));b.forEach((e=>{e.setAttr("oldVisible",e.visible()),e.hide()}));const y=g.find((e=>!e.visible()&&e.getAttr("editModeEnabled")));y.forEach((e=>{e.setAttr("oldVisible",e.visible()),e.show()})),i&&g.find(".page-background").forEach((e=>e.hide()));const v=n?d.bleed:0;let x=v;!e.bleedVisible&&n||(e.bleedVisible||n?e.bleedVisible&&n?x=0:e.bleedVisible&&!n&&(x=-d.bleed):x=0);const w=document.createElement("canvas");w.width=Math.round((d.computedWidth+2*v)*l),w.height=Math.round((d.computedHeight+2*v)*l);const P=w.getContext("2d");"image/jpeg"===o&&(P.fillStyle="white",P.fillRect(0,0,w.width,w.height));const E=g.scale();g.scale({x:1,y:1});const S=g.toCanvas({x:g.x()-x,y:g.y()-x,width:d.computedWidth+2*v,height:d.computedHeight+2*v,pixelRatio:l});return g.scale(E),P.drawImage(S,0,0,w.width,w.height),konva_1.default.Util.releaseCanvas(S),i&&g.find(".page-background").forEach((e=>e.show())),b.forEach((e=>{e.visible(e.getAttr("oldVisible"))})),y.forEach((e=>{e.visible(e.getAttr("oldVisible"))})),g.find(".page-background").forEach((e=>e.shadowEnabled(!0))),g.find(".page-background").forEach((e=>e.strokeEnabled(!0))),c.find("Transformer").forEach((e=>e.visible(!0))),g.find(".highlighter").forEach((e=>e.visible(!0))),m.clip(_),f.clip(h),e.setElementsPixelRatio(u),null==d||d.set({_exporting:!1}),w},async toDataURL(t={}){var{mimeType:i,quality:a}=t,o=__rest(t,["mimeType","quality"]);const n=await e._toCanvas(Object.assign({mimeType:i},o)),s=n.toDataURL(i,a);return konva_1.default.Util.releaseCanvas(n),s},async toBlob(t={}){var{mimeType:i,quality:a}=t,o=__rest(t,["mimeType","quality"]);const n=await e._toCanvas(Object.assign({mimeType:i},o)),s=new Promise((e=>{n.toBlob(e,i,a)}));return konva_1.default.Util.releaseCanvas(n),s},async saveAsImage(t={}){var{fileName:i}=t,a=__rest(t,["fileName"]);const o=a.mimeType||"image/png",n=o.split("/")[1];(0,download_1.downloadFile)(await e.toDataURL(a),i||"polotno."+n,o)},async _toPDF(t){const i=t.dpi||e.dpi,a=t.parallel||1,o=t.unit||("px"===e.unit?"mm":e.unit),n=t.pixelRatio||1,s=t.pageIds||e.pages.map((e=>e.id)),r=e.pages.filter((e=>s.includes(e.id))),l=await(0,pdf_1.getJsPDF)(),d=e=>(0,unit_1.pxToUnit)({px:e,unit:o,dpi:i}),c=d(t.cropMarkSize||0),p=r[0]||{},u=t.includeBleed?p.bleed:0,g=d(p.computedWidth+2*u)+2*c,m=d(p.computedHeight+2*u)+2*c;var _=new l({unit:o,orientation:g>m?"landscape":"portrait",format:[g,m],compress:!0,putOnlyUsedFonts:!0});_.deletePage(1);const f=((e,t)=>{for(var i=[],a=0;a<e.length;a+=t)i.push(e.slice(a,a+t));return i})(r,a);let h=0;for(const i of f){const a=i.map((async i=>{const a=t.includeBleed?i.bleed:0,o=d(i.computedWidth+2*a)+2*c,r=d(i.computedHeight+2*a)+2*c;let l=0,p=n;for(;l<10;){l+=1,2===l&&console.error("Polotno can not export PDF with current settings. Quality is automatically reduced.");const a=await e.toDataURL(Object.assign(Object.assign({},t),{pageId:i.id,pixelRatio:p}));if(a.length>20)return t.onProgress&&t.onProgress(++h/s.length*.9),{url:a,width:o,height:r};p*=.8}}));(await Promise.all(a)).forEach((({url:e,width:t,height:i})=>{_.addPage([t,i],t>i?"landscape":"portrait"),c&&(_.setLineWidth(d(1)),_.line(2*c,0,2*c,c),_.line(0,2*c,c,2*c),_.line(t-2*c,0,t-2*c,c),_.line(t,2*c,t-c,2*c),_.line(0,i-2*c,c,i-2*c),_.line(2*c,i,2*c,i-c),_.line(t,i-2*c,t-c,i-2*c),_.line(t-2*c,i,t-2*c,i-c)),_.addImage(e,c,c,t-2*c,i-2*c,void 0,"FAST")}))}return _},toPDFDataURL:async t=>(await e._toPDF(Object.assign({mimeType:"image/jpeg"},t))).output("datauristring"),async toGIFDataURL(t={}){const i=t.pixelRatio||1,a=await(0,gif_lib_1.createGIF)({width:e.width*i,height:e.height*i}),o=1e3/(t.fps||10),n=e.duration/o;for(let t=0;t<n-1;t++){const n=t*o||1;e.setCurrentTime(n);let s=0,r="";for(const t of e.pages)if(s+=t.duration,t.set({_rendering:s>n}),s>n){r=t.id;break}const l=await e._toCanvas({pixelRatio:i,pageId:r,_skipTimeout:!0});a.addFrame(l.getContext("2d"),{delay:o,copy:!0})}for(const t of e.pages)t.set({_rendering:!1});e.stop(),a.render();return new Promise((e=>{a.on("finished",(function(t){!function(e,t){var i=new FileReader;i.onload=function(e){t(e.target.result)},i.readAsDataURL(e)}(t,e)}))}))},async saveAsGIF(t={}){var{fileName:i}=t,a=__rest(t,["fileName"]);const o=await e.toGIFDataURL(a);(0,download_1.downloadFile)(o,i||"polotno.gif")},async toHTML({elementHook:t}={elementHook:void 0}){const i=e.toJSON();return(0,html_1.jsonToHTML)({json:i,elementHook:t})},async saveAsHTML({fileName:t}={}){const i=await e.toHTML(),a="data:text/html;base64,"+window.btoa(unescape(encodeURIComponent(i)));(0,download_1.downloadFile)(a,t||"polotno.html")},async toSVG({elementHook:t}={elementHook:void 0}){const i=e.toJSON();return(0,to_svg_1.jsonToSVG)({json:i,elementHook:t})},async saveAsSVG({fileName:t,elementHook:i}={}){const a=await e.toSVG({elementHook:i}),o="data:text/svg;base64,"+window.btoa(unescape(encodeURIComponent(a)));(0,download_1.downloadFile)(o,t||"polotno.svg")},async saveAsPDF(t={}){var{fileName:i}=t,a=__rest(t,["fileName"]);(await e._toPDF(Object.assign({mimeType:"image/jpeg"},a))).save(i||"polotno.pdf")},async waitLoading({_skipTimeout:e=!1}={}){e||await new Promise((e=>setTimeout(e,50))),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),unit:e.unit,dpi:e.dpi,custom:e.custom}),loadJSON(t,i=!1){var a;const o=Object.assign({},t),n=e.pages.indexOf(e.activePage);let s=null===(a=o.pages[n]||o.pages[0])||void 0===a?void 0:a.id;o._activePageId=s;const r=Object.assign({},(0,mobx_state_tree_1.getSnapshot)(e));Object.assign(r,o),r.history=i?e.history.toJSON():{history:[],undoIdx:-1},(0,mobx_state_tree_1.applySnapshot)(e,r)},clear({keepHistory:t=!1}={}){const i=e.pages.map((e=>e.id));e.deletePages(i),t||e.history.clear()},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 i=e.fonts.find((e=>e.fontFamily===t))||fonts.globalFonts.find((e=>e.fontFamily===t));let a=[{fontStyle:"normal",fontWeight:"normal"}];return i?(i.styles&&(a=i.styles.map((e=>({fontStyle:e.fontStyle||"normal",fontWeight:e.fontWeight||"normal"})))),fonts.injectCustomFont(i)):fonts.injectGoogleFont(t),Promise.all(a.map((e=>fonts.loadFont(t,e.fontStyle,e.fontWeight))))},validate:e=>exports.Store.validate(e,[{path:"",type:exports.Store}]).map((e=>({path:"store"+e.context.map((e=>e.path)).join("."),message:e.message})))}))),exports.createStore=createStore,exports.default=createStore;
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,i,o){void 0===o&&(o=i);var a=Object.getOwnPropertyDescriptor(t,i);a&&!("get"in a?!t.__esModule:a.writable||a.configurable)||(a={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,o,a)}:function(e,t,i,o){void 0===o&&(o=i),e[o]=t[i]}),__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 i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&__createBinding(t,e,i);return __setModuleDefault(t,e),t},__rest=this&&this.__rest||function(e,t){var i={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(i[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(o=Object.getOwnPropertySymbols(e);a<o.length;a++)t.indexOf(o[a])<0&&Object.prototype.propertyIsEnumerable.call(e,o[a])&&(i[o[a]]=e[o[a]])}return i},__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=void 0;const mobx_state_tree_1=require("mobx-state-tree"),history_1=require("./history"),nanoid_1=require("nanoid"),konva_1=__importDefault(require("konva")),download_1=require("../utils/download"),pdf_1=require("../utils/pdf"),gif_lib_1=require("../utils/gif-lib"),validate_key_1=require("../utils/validate-key"),fonts=__importStar(require("../utils/fonts")),loader_1=require("../utils/loader"),unit_1=require("../utils/unit"),deep_equal_1=require("../utils/deep-equal"),wait_1=require("../utils/wait"),html_1=require("../utils/html"),to_svg_1=require("../utils/to-svg"),page_model_1=require("./page-model"),group_model_1=require("./group-model"),audio_model_1=require("./audio-model");function createStore({key:e,showCredit:t}={key:"",showCredit:!1}){const i=exports.Store.create();return(0,validate_key_1.validateKey)(e,t),i}(0,mobx_state_tree_1.setLivelinessChecking)("ignore"),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(page_model_1.Page),fonts:mobx_state_tree_1.types.array(exports.Font),audios:mobx_state_tree_1.types.array(audio_model_1.Audio),width:1080,height:1080,currentTime:0,isPlaying:!1,scale:1,scaleToFit:1,unit:"px",dpi:72,bleedVisible:!1,rulesVisible:!1,openedSidePanel:"",previousOpenedSidePanel:"",custom:mobx_state_tree_1.types.frozen(),selectedElementsIds:mobx_state_tree_1.types.array(mobx_state_tree_1.types.string),animatedElementsIds:mobx_state_tree_1.types.array(mobx_state_tree_1.types.string),history:mobx_state_tree_1.types.optional(history_1.UndoManager,{targetPath:"../pages"}),_elementsPixelRatio:Math.min(2,window.devicePixelRatio||1),_activePageId:""}).views((e=>({get _bleedVisible(){return console.warn("store._bleedVisible is deprecated. Please use store.bleedVisible instead."),e.bleedVisible},get selectedElements(){return e.selectedElementsIds.map((t=>{for(const i of e.pages)for(const e of i.children)if(e.id===t)return e})).filter((e=>!!e))},get children(){return e.pages},get selectedShapes(){const t=[];return(0,group_model_1.forEveryChild)({children:e.selectedElements},(e=>{"group"!==e.type&&t.push(e)})),t},get activePage(){return e.pages.slice().find((t=>t.id===e._activePageId))||(e.pages.length?e.pages[0]:null)},get duration(){let t=0;return e.pages.forEach((e=>{t+=e.duration})),t},get _hasCroppedImages(){return e.find((e=>"image"===e.type&&e._cropModeEnabled))},find(t){let i;return(0,group_model_1.forEveryChild)({children:e.pages},(e=>{if(!i&&t(e))return i=e,!0})),i},getElementById:t=>e.find((e=>e.id===t))}))).actions((e=>{let t=0,i=null,o=!1;return{afterCreate(){e.history.canUndo},setCurrentTime(t){e.currentTime=t},play({animatedElementsIds:a=[],startTime:n=0,currentTime:s=0,endTime:r=e.duration,repeat:l=!1}={}){s&&(console.warn("currentTime property of store.play() is deprecated. Please use startTime instead."),n=s),e.animatedElementsIds=(0,mobx_state_tree_1.cast)(a),e.currentTime=n,e.isPlaying=!0,t=Date.now(),i=r,o=l,requestAnimationFrame(e.seek)},checkActivePage(){let t=0;for(const i of e.pages){if(e.currentTime>=i.startTime&&e.currentTime<i.startTime+i.duration){e.selectPage(i.id);break}t+=i.duration}},seek(){if(!e.isPlaying)return;const a=Date.now(),n=a-t;t=a,e.currentTime+=n,e.checkActivePage();const s=i||e.duration;e.isPlaying&&e.currentTime<s?requestAnimationFrame(e.seek):e.isPlaying&&o?(e.currentTime=0,requestAnimationFrame(e.seek)):e.stop()},stop(){e.isPlaying=!1,e.currentTime=0,e.animatedElementsIds=(0,mobx_state_tree_1.cast)([]),e.checkActivePage()}}})).actions((e=>({set(t){Object.assign(e,t)},setUnit({unit:t,dpi:i}){e.unit=t||e.unit,e.dpi=i||e.dpi},setRole(t){e.role=t},addPage(t){const i=page_model_1.Page.create(Object.assign({id:(0,nanoid_1.nanoid)(10)},t));return e.pages.push(i),e._activePageId=i.id,i},selectPage(t){e._activePageId=t},selectElements(t){const i=t.map((t=>e.getElementById(t))).sort(((e,t)=>e.page.children.indexOf(e)-e.page.children.indexOf(t))).filter((e=>!!e)).map((e=>e.id));e.selectedElementsIds=(0,mobx_state_tree_1.cast)(i)},toggleBleed(t){e.bleedVisible=null!=t?t:!e.bleedVisible},toggleRulers(t){e.rulesVisible=null!=t?t:!e.rulesVisible},openSidePanel(t){e.openedSidePanel!==t&&(e.previousOpenedSidePanel=e.openedSidePanel,e.openedSidePanel=t)},setScale(t){e.scale=t},_setScaleToFit(t){e.scaleToFit=t},setElementsPixelRatio(t){e._elementsPixelRatio=t},setSize(t,i,o){e.pages.forEach((e=>{e.setSize({width:t,height:i,useMagic:o,softChange:!0})})),e.width=t,e.height=i},setPageZIndex(t,i){const o=e.pages.find((e=>e.id===t));o&&((0,mobx_state_tree_1.detach)(o),e.pages.remove(o),e.pages.splice(i,0,o))},deletePages(t){const i=e.pages.indexOf(e.activePage);t.forEach((t=>{const i=e.pages.find((e=>e.id===t));(0,mobx_state_tree_1.destroy)(i)}));const o=Math.min(e.pages.length-1,i),a=e.pages[o];a&&(e._activePageId=a.id),e.selectedElementsIds=(0,mobx_state_tree_1.cast)(e.selectedElementsIds.filter((t=>e.getElementById(t))))},groupElements(t){const i=t.map((t=>e.getElementById(t)));i.forEach((e=>{e&&(0,mobx_state_tree_1.detach)(e)}));const o=e.activePage,a={id:(0,nanoid_1.nanoid)(10),children:i,type:"group"};return o.children.push(a),e.selectedElementsIds=(0,mobx_state_tree_1.cast)([a.id]),a},ungroupElements(t){const i=t.map((t=>e.getElementById(t))),o=[];i.forEach((e=>{if(e&&"group"===e.type){const t=e.page,i=t.children.indexOf(e);e.children.forEach((e=>{o.push(e.id)})),e.children.forEach((e=>{(0,mobx_state_tree_1.detach)(e),t.children.push(e)})),t.children.splice(i,1)}})),e.selectedElementsIds=(0,mobx_state_tree_1.cast)(o)},deleteElements(t){const i=[];e.find((e=>(t.includes(e.id)&&i.push(e),!1))),i.forEach((e=>{(0,mobx_state_tree_1.destroy)(e)})),e.selectedElementsIds=(0,mobx_state_tree_1.cast)(e.selectedElementsIds.filter((t=>e.getElementById(t))))},on(t,i){if("change"===t){let t=e.toJSON();return(0,mobx_state_tree_1.onSnapshot)(e,(o=>{const a=e.toJSON();!(0,deep_equal_1.deepEqual)(t,a)&&(t=a,i(a))}))}},async _toCanvas({pixelRatio:t,ignoreBackground:i,pageId:o,mimeType:a,includeBleed:n,_skipTimeout:s}={}){var r;const l=t||1;o=o||(null===(r=e.pages[0])||void 0===r?void 0:r.id);const d=e.pages.find((e=>e.id===o));if(!d)throw new Error(`No page for export with id ${o}`);null==d||d.set({_exporting:!0});const c=await(0,wait_1.waitTillAvailable)((()=>konva_1.default.stages.find((e=>e.getAttr("pageId")===o))));if(!c)throw new Error(`Export is failed. Can not find stage for page ${o}. Looks like <Workspace /> component is not mounted, but it is required in order to process the export.`);const p=!!c.findOne(".page-container"),u=e._elementsPixelRatio;l>e._elementsPixelRatio&&e.setElementsPixelRatio(l),await e.waitLoading({_skipTimeout:s});const m=c.findOne(".page-container");if(!m)throw e.setElementsPixelRatio(u),new Error(`Export is failed. Can't find page container. ${p}`);c.find("Transformer").forEach((e=>e.visible(!1))),m.find(".page-background").forEach((e=>e.shadowEnabled(!1))),m.find(".page-background").forEach((e=>e.strokeEnabled(!1))),m.find(".highlighter").forEach((e=>e.visible(!1)));const _=m.findOne(".page-background-group"),g=_.clip();_.clip({x:null,y:null,width:null,height:null});const f=m.findOne(".elements-container"),h=f.clip();f.clip({x:null,y:null,width:null,height:null});const b=m.find((e=>e.getAttr("hideInExport")));b.forEach((e=>{e.setAttr("oldVisible",e.visible()),e.hide()}));const y=m.find((e=>!e.visible()&&e.getAttr("editModeEnabled")));y.forEach((e=>{e.setAttr("oldVisible",e.visible()),e.show()})),i&&m.find(".page-background").forEach((e=>e.hide()));const v=n?d.bleed:0;let x=v;!e.bleedVisible&&n||(e.bleedVisible||n?e.bleedVisible&&n?x=0:e.bleedVisible&&!n&&(x=-d.bleed):x=0);const w=document.createElement("canvas");w.width=Math.round((d.computedWidth+2*v)*l),w.height=Math.round((d.computedHeight+2*v)*l);const P=w.getContext("2d");"image/jpeg"===a&&(P.fillStyle="white",P.fillRect(0,0,w.width,w.height));const E=m.scale();m.scale({x:1,y:1});const S=m.toCanvas({x:m.x()-x,y:m.y()-x,width:d.computedWidth+2*v,height:d.computedHeight+2*v,pixelRatio:l});return m.scale(E),P.drawImage(S,0,0,w.width,w.height),konva_1.default.Util.releaseCanvas(S),i&&m.find(".page-background").forEach((e=>e.show())),b.forEach((e=>{e.visible(e.getAttr("oldVisible"))})),y.forEach((e=>{e.visible(e.getAttr("oldVisible"))})),m.find(".page-background").forEach((e=>e.shadowEnabled(!0))),m.find(".page-background").forEach((e=>e.strokeEnabled(!0))),c.find("Transformer").forEach((e=>e.visible(!0))),m.find(".highlighter").forEach((e=>e.visible(!0))),_.clip(g),f.clip(h),e.setElementsPixelRatio(u),null==d||d.set({_exporting:!1}),w},async toDataURL(t={}){var{mimeType:i,quality:o}=t,a=__rest(t,["mimeType","quality"]);const n=await e._toCanvas(Object.assign({mimeType:i},a)),s=n.toDataURL(i,o);return konva_1.default.Util.releaseCanvas(n),s},async toBlob(t={}){var{mimeType:i,quality:o}=t,a=__rest(t,["mimeType","quality"]);const n=await e._toCanvas(Object.assign({mimeType:i},a)),s=new Promise((e=>{n.toBlob(e,i,o)}));return konva_1.default.Util.releaseCanvas(n),s},async saveAsImage(t={}){var{fileName:i}=t,o=__rest(t,["fileName"]);const a=o.mimeType||"image/png",n=a.split("/")[1];(0,download_1.downloadFile)(await e.toDataURL(o),i||"polotno."+n,a)},async _toPDF(t){const i=t.dpi||e.dpi,o=t.parallel||1,a=t.unit||("px"===e.unit?"mm":e.unit),n=t.pixelRatio||1,s=t.pageIds||e.pages.map((e=>e.id)),r=e.pages.filter((e=>s.includes(e.id))),l=await(0,pdf_1.getJsPDF)(),d=e=>(0,unit_1.pxToUnit)({px:e,unit:a,dpi:i}),c=d(t.cropMarkSize||0),p=r[0]||{},u=t.includeBleed?p.bleed:0,m=d(p.computedWidth+2*u)+2*c,_=d(p.computedHeight+2*u)+2*c;var g=new l({unit:a,orientation:m>_?"landscape":"portrait",format:[m,_],compress:!0,putOnlyUsedFonts:!0});g.deletePage(1);const f=((e,t)=>{for(var i=[],o=0;o<e.length;o+=t)i.push(e.slice(o,o+t));return i})(r,o);let h=0;for(const i of f){const o=i.map((async i=>{const o=t.includeBleed?i.bleed:0,a=d(i.computedWidth+2*o)+2*c,r=d(i.computedHeight+2*o)+2*c;let l=0,p=n;for(;l<10;){l+=1,2===l&&console.error("Polotno can not export PDF with current settings. Quality is automatically reduced.");const o=await e.toDataURL(Object.assign(Object.assign({},t),{pageId:i.id,pixelRatio:p}));if(o.length>20)return t.onProgress&&t.onProgress(++h/s.length*.9),{url:o,width:a,height:r};p*=.8}}));(await Promise.all(o)).forEach((({url:e,width:t,height:i})=>{g.addPage([t,i],t>i?"landscape":"portrait"),c&&(g.setLineWidth(d(1)),g.line(2*c,0,2*c,c),g.line(0,2*c,c,2*c),g.line(t-2*c,0,t-2*c,c),g.line(t,2*c,t-c,2*c),g.line(0,i-2*c,c,i-2*c),g.line(2*c,i,2*c,i-c),g.line(t,i-2*c,t-c,i-2*c),g.line(t-2*c,i,t-2*c,i-c)),g.addImage(e,c,c,t-2*c,i-2*c,void 0,"FAST")}))}return g},toPDFDataURL:async t=>(await e._toPDF(Object.assign({mimeType:"image/jpeg"},t))).output("datauristring"),async toGIFDataURL(t={}){const i=t.pixelRatio||1,o=await(0,gif_lib_1.createGIF)({width:e.width*i,height:e.height*i}),a=1e3/(t.fps||10),n=e.duration/a;for(let t=0;t<n-1;t++){const n=t*a||1;e.setCurrentTime(n);let s=0,r="";for(const t of e.pages)if(s+=t.duration,t.set({_rendering:s>n}),s>n){r=t.id;break}const l=await e._toCanvas({pixelRatio:i,pageId:r,_skipTimeout:!0});o.addFrame(l.getContext("2d"),{delay:a,copy:!0})}for(const t of e.pages)t.set({_rendering:!1});e.stop(),o.render();return new Promise((e=>{o.on("finished",(function(t){!function(e,t){var i=new FileReader;i.onload=function(e){t(e.target.result)},i.readAsDataURL(e)}(t,e)}))}))},async saveAsGIF(t={}){var{fileName:i}=t,o=__rest(t,["fileName"]);const a=await e.toGIFDataURL(o);(0,download_1.downloadFile)(a,i||"polotno.gif")},async toHTML({elementHook:t}={elementHook:void 0}){const i=e.toJSON();return(0,html_1.jsonToHTML)({json:i,elementHook:t})},async saveAsHTML({fileName:t}={}){const i=await e.toHTML(),o="data:text/html;base64,"+window.btoa(unescape(encodeURIComponent(i)));(0,download_1.downloadFile)(o,t||"polotno.html")},async toSVG({elementHook:t}={elementHook:void 0}){const i=e.toJSON();return(0,to_svg_1.jsonToSVG)({json:i,elementHook:t})},async saveAsSVG({fileName:t,elementHook:i}={}){const o=await e.toSVG({elementHook:i}),a="data:text/svg;base64,"+window.btoa(unescape(encodeURIComponent(o)));(0,download_1.downloadFile)(a,t||"polotno.svg")},async saveAsPDF(t={}){var{fileName:i}=t,o=__rest(t,["fileName"]);(await e._toPDF(Object.assign({mimeType:"image/jpeg"},o))).save(i||"polotno.pdf")},async waitLoading({_skipTimeout:e=!1}={}){e||await new Promise((e=>setTimeout(e,50))),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),audios:(0,mobx_state_tree_1.getSnapshot)(e.audios),unit:e.unit,dpi:e.dpi,custom:e.custom}),loadJSON(t,i=!1){var o;const a=Object.assign({},t),n=e.pages.indexOf(e.activePage);let s=null===(o=a.pages[n]||a.pages[0])||void 0===o?void 0:o.id;a._activePageId=s;const r=Object.assign({},(0,mobx_state_tree_1.getSnapshot)(e));Object.assign(r,a),r.history=i?e.history.toJSON():{history:[],undoIdx:-1},(0,mobx_state_tree_1.applySnapshot)(e,r)},clear({keepHistory:t=!1}={}){const i=e.pages.map((e=>e.id));e.deletePages(i),t||e.history.clear()},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)))},addAudio(t){const i=audio_model_1.Audio.create(Object.assign({id:(0,nanoid_1.nanoid)(10)},t));e.audios.push(i)},removeAudio(t){const i=e.audios.find((e=>e.id===t));i&&e.audios.remove(i)},async loadFont(t){const i=e.fonts.find((e=>e.fontFamily===t))||fonts.globalFonts.find((e=>e.fontFamily===t));let o=[{fontStyle:"normal",fontWeight:"normal"}];return i?(i.styles&&(o=i.styles.map((e=>({fontStyle:e.fontStyle||"normal",fontWeight:e.fontWeight||"normal"})))),fonts.injectCustomFont(i)):fonts.injectGoogleFont(t),Promise.all(o.map((e=>fonts.loadFont(t,e.fontStyle,e.fontWeight))))},validate:e=>exports.Store.validate(e,[{path:"",type:exports.Store}]).map((e=>({path:"store"+e.context.map((e=>e.path)).join("."),message:e.message})))}))),exports.createStore=createStore,exports.default=createStore;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "polotno",
3
- "version": "2.11.6",
3
+ "version": "2.12.0",
4
4
  "description": "Design Editor Framework",
5
5
  "author": "Anton Lavrenov",
6
6
  "keywords": [
@@ -65,6 +65,15 @@
65
65
  pointer-events: auto;
66
66
  }
67
67
  }
68
+ `,AudioContainer=(0,styled_1.default)("div")`
69
+ position: relative;
70
+
71
+ &:hover {
72
+ .polotno-audio-menu {
73
+ opacity: 1;
74
+ pointer-events: auto;
75
+ }
76
+ }
68
77
  `,PageMenu=(0,styled_1.default)("div")`
69
78
  position: absolute;
70
79
  z-index: 20;
@@ -76,4 +85,15 @@
76
85
  &:hover {
77
86
  display: block;
78
87
  }
79
- `,Page=(0,mobx_react_lite_1.observer)((({page:e,scale:t})=>{const[a,r]=react_1.default.useState(null),l=e.store.activePage===e;react_1.default.useEffect((()=>{let t=null;const a=()=>{t||(t=setTimeout((()=>{(async()=>{const t=await e.store.toDataURL({pageId:e.id,pixelRatio:.1});r(t)})(),t=null}),1e3))},l=(0,mobx_state_tree_1.onSnapshot)(e.children,a),i=new IntersectionObserver((e=>{e.forEach((e=>{e.isIntersecting?a():clearTimeout(t)}))}),{threshold:.1});return o.current&&i.observe(o.current),()=>{i.disconnect(),clearTimeout(t),l()}}),[]);const o=react_1.default.useRef(null),i=60/e.computedHeight*e.computedWidth,n=flags_1.flags.animationsEnabled?e.duration*t:i;return react_1.default.createElement(PagePreviewContainer,{style:{width:n+"px",marginRight:flags_1.flags.animationsEnabled?"0px":"10px",height:"60px"},ref:o},react_1.default.createElement("div",{style:{width:"100%",height:"100%",borderRadius:"15px",backgroundImage:`url("${a}")`,backgroundRepeat:"repeat-x",backgroundSize:"auto 100%",backgroundColor:"white"},onClick:()=>{e.store.selectPage(e.id)}}),l&&react_1.default.createElement("div",{style:{position:"absolute",top:"0",left:"0px",bottom:"0px",right:"0px",borderRadius:"15px",border:"2px solid rgb(0, 161, 255, 0.9)",zIndex:1}}),flags_1.flags.animationsEnabled&&react_1.default.createElement("div",{style:{position:"absolute",zIndex:1,top:"50%",right:"0px",width:"8px",height:"50%",transform:"translateY(-50%) translateX(-3px)",borderRadius:"5px",border:"1px solid rgb(255, 255, 255, 0.6)",backgroundColor:"rgb(0, 0, 0, 0.6)",cursor:"ew-resize"},onMouseDown:t=>{((t,a)=>{t.preventDefault();const r=t=>{t.preventDefault();const r="start"===a?7:-7,{clientX:l}=t,{left:i,width:n}=o.current.getBoundingClientRect(),s=(l-i-r)/n;"start"===a||"end"===a&&e.set({duration:Math.max(1e3,s*e.duration)})};window.addEventListener("mousemove",r),window.addEventListener("mouseup",(()=>{window.removeEventListener("mousemove",r)}))})(t,"end")}}),react_1.default.createElement(PageMenu,{className:"polotno-page-menu",onClick:e=>{e.stopPropagation()}},react_1.default.createElement(core_1.Popover,{content:react_1.default.createElement(core_1.Menu,{style:{width:"100px"}},react_1.default.createElement(core_1.MenuItem,{icon:"trash",text:(0,l10n_1.t)("pagesTimeline.removePage"),onClick:()=>{e.store.deletePages([e.id])}})),position:core_1.Position.TOP},react_1.default.createElement(core_1.Button,{icon:"more",style:{minHeight:"20px",borderRadius:"10px"}}))))})),CurrentTime=(0,mobx_react_lite_1.observer)((({store:e,scale:t})=>{var a;const r=e.isPlaying?e.currentTime:(null===(a=e.activePage)||void 0===a?void 0:a.startTime)||0;return react_1.default.createElement("div",{style:{position:"absolute",left:r*t+"px",top:"-5px",width:"2px",height:"calc(100% + 10px)",backgroundColor:"rgb(0, 161, 255, 0.9)"}})}));exports.Pages=(0,mobx_react_lite_1.observer)((({store:e,scale:t})=>react_1.default.createElement("div",{style:{display:"flex",position:"relative"}},e.pages.map((e=>react_1.default.createElement(Page,{key:e.id,page:e,scale:t}))),flags_1.flags.animationsEnabled&&react_1.default.createElement(CurrentTime,{store:e,scale:t})))),exports.PagesTimeline=(0,mobx_react_lite_1.observer)((({store:e,defaultOpened:t=!1})=>{const[a,r]=react_1.default.useState(t);return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(OuterPagesButtonsContainer,null,react_1.default.createElement(PagesButtonsContainer,null,react_1.default.createElement(core_1.Navbar,{style:{height:"35px",padding:"0 5px"}},react_1.default.createElement(core_1.Navbar.Group,{style:{height:"35px"}},react_1.default.createElement(core_1.Button,{minimal:!0,onClick:()=>{r(!a)},icon:flags_1.flags.animationsEnabled&&!a?"play":null},(0,l10n_1.t)("pagesTimeline.pages")))))),a&&react_1.default.createElement(core_1.Navbar,{style:{padding:"5px",height:"auto",zIndex:1}},react_1.default.createElement("div",{style:{width:"100%",position:"relative",height:a?"90px":"auto"}},react_1.default.createElement("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,overflowX:"auto",padding:"5px",zIndex:1,display:a?"flex":"none"}},react_1.default.createElement("div",{style:{height:"60px",display:"flex"}},flags_1.flags.animationsEnabled&&react_1.default.createElement("div",{style:{width:"60px",paddingRight:"5px",paddingLeft:"60px"}}),react_1.default.createElement(exports.Pages,{store:e,scale:.02}),react_1.default.createElement(core_1.Button,{icon:react_1.default.createElement(icons_1.Plus,null),style:{width:"60px"},onClick:()=>{var t;e.addPage({bleed:(null===(t=e.activePage)||void 0===t?void 0:t.bleed)||0})},minimal:!0}))),a&&flags_1.flags.animationsEnabled&&react_1.default.createElement(core_1.Button,{icon:e.isPlaying?react_1.default.createElement(icons_1.Pause,{size:25}):react_1.default.createElement(icons_1.Play,{size:25}),onClick:()=>{var t;if(e.isPlaying){const t=e.activePage;e.stop(),t&&e.selectPage(t.id)}else e.play({startTime:(null===(t=e.activePage)||void 0===t?void 0:t.startTime)||0})},style:{width:"60px",height:"60px",borderRadius:"50px",position:"absolute",top:"5px",left:"5px",paddingRight:"8px",zIndex:2}}))))}));
88
+ `,AudioMenu=(0,styled_1.default)("div")`
89
+ position: absolute;
90
+ z-index: 20;
91
+ top: -5px;
92
+ right: 8px;
93
+ opacity: 0;
94
+ pointer-events: none;
95
+
96
+ &:hover {
97
+ display: block;
98
+ }
99
+ `,Page=(0,mobx_react_lite_1.observer)((({page:e,scale:t})=>{const[a,o]=react_1.default.useState(null),r=e.store.activePage===e;react_1.default.useEffect((()=>{let t=null;const a=()=>{t||(t=setTimeout((()=>{(async()=>{const t=await e.store.toDataURL({pageId:e.id,pixelRatio:.1});o(t)})(),t=null}),1e3))},r=(0,mobx_state_tree_1.onSnapshot)(e.children,a),n=new IntersectionObserver((e=>{e.forEach((e=>{e.isIntersecting?a():clearTimeout(t)}))}),{threshold:.1});return i.current&&n.observe(i.current),()=>{n.disconnect(),clearTimeout(t),r()}}),[]);const i=react_1.default.useRef(null),n=60/e.computedHeight*e.computedWidth,l=flags_1.flags.animationsEnabled?e.duration*t:n;return react_1.default.createElement(PagePreviewContainer,{style:{width:l+"px",marginRight:flags_1.flags.animationsEnabled?"0px":"10px",height:"60px"},ref:i},react_1.default.createElement("div",{style:{width:"100%",height:"100%",borderRadius:"15px",backgroundImage:`url("${a}")`,backgroundRepeat:"repeat-x",backgroundSize:"auto 100%",backgroundColor:"white"},onClick:()=>{e.store.selectPage(e.id)}}),r&&react_1.default.createElement("div",{style:{position:"absolute",top:"0",left:"0px",bottom:"0px",right:"0px",borderRadius:"15px",border:"2px solid rgb(0, 161, 255, 0.9)",zIndex:1}}),flags_1.flags.animationsEnabled&&react_1.default.createElement("div",{style:{position:"absolute",zIndex:1,top:"50%",right:"0px",width:"8px",height:"50%",transform:"translateY(-50%) translateX(-3px)",borderRadius:"5px",border:"1px solid rgb(255, 255, 255, 0.6)",backgroundColor:"rgb(0, 0, 0, 0.6)",cursor:"ew-resize"},onMouseDown:t=>{((t,a)=>{t.preventDefault();const o=t=>{t.preventDefault();const o="start"===a?7:-7,{clientX:r}=t,{left:n,width:l}=i.current.getBoundingClientRect(),s=(r-n-o)/l;"start"===a||"end"===a&&e.set({duration:Math.max(1e3,s*e.duration)})};window.addEventListener("mousemove",o),window.addEventListener("mouseup",(()=>{window.removeEventListener("mousemove",o)}))})(t,"end")}}),react_1.default.createElement(PageMenu,{className:"polotno-page-menu",onClick:e=>{e.stopPropagation()}},react_1.default.createElement(core_1.Popover,{content:react_1.default.createElement(core_1.Menu,{style:{width:"100px"}},react_1.default.createElement(core_1.MenuItem,{icon:"trash",text:(0,l10n_1.t)("pagesTimeline.removePage"),onClick:()=>{e.store.deletePages([e.id])}})),position:core_1.Position.TOP},react_1.default.createElement(core_1.Button,{icon:"more",style:{minHeight:"20px",borderRadius:"10px"}}))))})),CurrentTime=(0,mobx_react_lite_1.observer)((({store:e,scale:t})=>{var a;const o=e.isPlaying?e.currentTime:(null===(a=e.activePage)||void 0===a?void 0:a.startTime)||0;return react_1.default.createElement("div",{style:{position:"absolute",left:o*t+"px",top:"-5px",width:"2px",height:"calc(100% + 10px)",backgroundColor:"rgb(0, 161, 255, 0.9)"}})}));exports.Pages=(0,mobx_react_lite_1.observer)((({store:e,scale:t})=>react_1.default.createElement("div",{style:{display:"flex",position:"relative"}},e.pages.map((e=>react_1.default.createElement(Page,{key:e.id,page:e,scale:t}))),flags_1.flags.animationsEnabled&&react_1.default.createElement(CurrentTime,{store:e,scale:t}),flags_1.flags.animationsEnabled&&react_1.default.createElement(AudioTimelines,{store:e,scale:t}))));const AudioTimeline=(0,mobx_react_lite_1.observer)((({audio:e,scale:t,store:a})=>{const o=a.duration*t-e.delay*t,r=Math.min((e.endTime-e.startTime)*e.duration*t,o),i=e.delay*t,n=(a,o)=>{a.stopPropagation();const n=a.clientX,l=i,s=r,d=a=>{a.preventDefault();const r=(a.clientX-n)/t;if("start"===o){const a=Math.max(0,l/t+r);e.set({delay:a})}else{const a=Math.max(e.startTime+1,(l+s)/t+r);e.set({endTime:a})}},c=()=>{window.removeEventListener("mousemove",d),window.removeEventListener("mouseup",c)};window.addEventListener("mousemove",d),window.addEventListener("mouseup",c)};return react_1.default.createElement(AudioContainer,{style:{position:"absolute",left:`${i}px`,width:`${r}px`,height:"10px",backgroundColor:"rgba(0, 161, 255, 0.5)",borderRadius:"10px",cursor:"move"},onMouseDown:a=>{const o=a.clientX,r=i,n=a=>{const i=(a.clientX-o)/t,n=Math.max(0,r/t+i);e.set({delay:n,endTime:n+(e.endTime-e.startTime)})},l=()=>{window.removeEventListener("mousemove",n),window.removeEventListener("mouseup",l)};window.addEventListener("mousemove",n),window.addEventListener("mouseup",l)}},react_1.default.createElement("div",{style:{position:"absolute",left:"0",top:"0",width:"10px",height:"100%",cursor:"ew-resize"},onMouseDown:e=>n(e,"start")}),react_1.default.createElement("div",{style:{position:"absolute",right:"0",top:"0",width:"10px",height:"100%",cursor:"ew-resize"},onMouseDown:e=>n(e,"end")}),react_1.default.createElement(AudioMenu,{className:"polotno-audio-menu",onClick:e=>{e.stopPropagation()}},react_1.default.createElement(core_1.Popover,{content:react_1.default.createElement(core_1.Menu,{style:{width:"100px"}},react_1.default.createElement(core_1.MenuItem,{icon:"trash",text:(0,l10n_1.t)("pagesTimeline.removeAudio"),onClick:()=>{a.removeAudio(e.id)}})),position:core_1.Position.TOP},react_1.default.createElement(core_1.Button,{icon:"more",style:{minHeight:"20px",borderRadius:"10px",padding:"0px"}}))))})),AudioTimelines=(0,mobx_react_lite_1.observer)((({store:e,scale:t})=>react_1.default.createElement("div",{style:{position:"absolute",bottom:"-5px",paddingTop:"5px"}},e.audios.map((a=>react_1.default.createElement(AudioTimeline,{key:a.id,audio:a,scale:t,store:e}))))));exports.PagesTimeline=(0,mobx_react_lite_1.observer)((({store:e,defaultOpened:t=!1})=>{const[a,o]=react_1.default.useState(t);return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(OuterPagesButtonsContainer,null,react_1.default.createElement(PagesButtonsContainer,null,react_1.default.createElement(core_1.Navbar,{style:{height:"35px",padding:"0 5px"}},react_1.default.createElement(core_1.Navbar.Group,{style:{height:"35px"}},react_1.default.createElement(core_1.Button,{minimal:!0,onClick:()=>{o(!a)},icon:flags_1.flags.animationsEnabled&&!a?"play":null},(0,l10n_1.t)("pagesTimeline.pages")))))),a&&react_1.default.createElement(core_1.Navbar,{style:{padding:"5px",height:"auto",zIndex:1}},react_1.default.createElement("div",{style:{width:"100%",position:"relative",height:a?"90px":"auto"}},react_1.default.createElement("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,overflowX:"auto",padding:"5px",zIndex:1,display:a?"flex":"none"}},react_1.default.createElement("div",{style:{height:"60px",display:"flex"}},flags_1.flags.animationsEnabled&&react_1.default.createElement("div",{style:{width:"60px",paddingRight:"5px",paddingLeft:"60px"}}),react_1.default.createElement(exports.Pages,{store:e,scale:.02}),react_1.default.createElement(core_1.Button,{icon:react_1.default.createElement(icons_1.Plus,null),style:{width:"60px"},onClick:()=>{var t;e.addPage({bleed:(null===(t=e.activePage)||void 0===t?void 0:t.bleed)||0})},minimal:!0}))),a&&flags_1.flags.animationsEnabled&&react_1.default.createElement(core_1.Button,{icon:e.isPlaying?react_1.default.createElement(icons_1.Pause,{size:25}):react_1.default.createElement(icons_1.Play,{size:25}),onClick:()=>{var t;if(e.isPlaying){const t=e.activePage;e.stop(),t&&e.selectPage(t.id)}else e.play({startTime:(null===(t=e.activePage)||void 0===t?void 0:t.startTime)||0})},style:{width:"60px",height:"60px",borderRadius:"50px",position:"absolute",top:"5px",left:"5px",paddingRight:"8px",zIndex:2}}))))}));
package/polotno-app.d.ts CHANGED
@@ -76,6 +76,27 @@ export declare function createPolotnoApp({ container, key, showCredit, sections
76
76
  url: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
77
77
  styles: import("mobx-state-tree").IType<any, any, any>;
78
78
  }, {}, any, import("mobx-state-tree")._NotCustomized>>;
79
+ audios: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
80
+ id: import("mobx-state-tree").ISimpleType<string>;
81
+ src: import("mobx-state-tree").IType<string, string, string>;
82
+ duration: import("mobx-state-tree").IType<number, number, number>;
83
+ startTime: import("mobx-state-tree").IType<number, number, number>;
84
+ endTime: import("mobx-state-tree").IType<number, number, number>;
85
+ volume: import("mobx-state-tree").IType<number, number, number>;
86
+ delay: import("mobx-state-tree").IType<number, number, number>;
87
+ }, {
88
+ toJSON(): {
89
+ id: string;
90
+ src: string;
91
+ duration: number;
92
+ startTime: number;
93
+ endTime: number;
94
+ volume: number;
95
+ delay: number;
96
+ };
97
+ } & {
98
+ set(attrs: any): void;
99
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
79
100
  width: import("mobx-state-tree").IType<number, number, number>;
80
101
  height: import("mobx-state-tree").IType<number, number, number>;
81
102
  currentTime: import("mobx-state-tree").IType<number, number, number>;
@@ -529,6 +550,15 @@ export declare function createPolotnoApp({ container, key, showCredit, sections
529
550
  styles: import("mobx-state-tree").IType<any, any, any>;
530
551
  }>[];
531
552
  pages: {}[];
553
+ audios: import("mobx-state-tree").ModelSnapshotType<{
554
+ id: import("mobx-state-tree").ISimpleType<string>;
555
+ src: import("mobx-state-tree").IType<string, string, string>;
556
+ duration: import("mobx-state-tree").IType<number, number, number>;
557
+ startTime: import("mobx-state-tree").IType<number, number, number>;
558
+ endTime: import("mobx-state-tree").IType<number, number, number>;
559
+ volume: import("mobx-state-tree").IType<number, number, number>;
560
+ delay: import("mobx-state-tree").IType<number, number, number>;
561
+ }>[];
532
562
  unit: string;
533
563
  dpi: number;
534
564
  custom: any;
@@ -539,6 +569,8 @@ export declare function createPolotnoApp({ container, key, showCredit, sections
539
569
  }): void;
540
570
  addFont(font: import("./utils/fonts").FONT): void;
541
571
  removeFont(fontFamily: string): void;
572
+ addAudio(data: any): void;
573
+ removeAudio(audioId: string): void;
542
574
  loadFont(fontFamily: any): Promise<void[]>;
543
575
  validate(json: any): {
544
576
  path: string;
@@ -606,6 +638,27 @@ export declare function createPolotnoApp({ container, key, showCredit, sections
606
638
  url: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
607
639
  styles: import("mobx-state-tree").IType<any, any, any>;
608
640
  }, {}, any, import("mobx-state-tree")._NotCustomized>>;
641
+ audios: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
642
+ id: import("mobx-state-tree").ISimpleType<string>;
643
+ src: import("mobx-state-tree").IType<string, string, string>;
644
+ duration: import("mobx-state-tree").IType<number, number, number>;
645
+ startTime: import("mobx-state-tree").IType<number, number, number>;
646
+ endTime: import("mobx-state-tree").IType<number, number, number>;
647
+ volume: import("mobx-state-tree").IType<number, number, number>;
648
+ delay: import("mobx-state-tree").IType<number, number, number>;
649
+ }, {
650
+ toJSON(): {
651
+ id: string;
652
+ src: string;
653
+ duration: number;
654
+ startTime: number;
655
+ endTime: number;
656
+ volume: number;
657
+ delay: number;
658
+ };
659
+ } & {
660
+ set(attrs: any): void;
661
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
609
662
  width: import("mobx-state-tree").IType<number, number, number>;
610
663
  height: import("mobx-state-tree").IType<number, number, number>;
611
664
  currentTime: import("mobx-state-tree").IType<number, number, number>;
@@ -1059,6 +1112,15 @@ export declare function createPolotnoApp({ container, key, showCredit, sections
1059
1112
  styles: import("mobx-state-tree").IType<any, any, any>;
1060
1113
  }>[];
1061
1114
  pages: {}[];
1115
+ audios: import("mobx-state-tree").ModelSnapshotType<{
1116
+ id: import("mobx-state-tree").ISimpleType<string>;
1117
+ src: import("mobx-state-tree").IType<string, string, string>;
1118
+ duration: import("mobx-state-tree").IType<number, number, number>;
1119
+ startTime: import("mobx-state-tree").IType<number, number, number>;
1120
+ endTime: import("mobx-state-tree").IType<number, number, number>;
1121
+ volume: import("mobx-state-tree").IType<number, number, number>;
1122
+ delay: import("mobx-state-tree").IType<number, number, number>;
1123
+ }>[];
1062
1124
  unit: string;
1063
1125
  dpi: number;
1064
1126
  custom: any;
@@ -1069,6 +1131,8 @@ export declare function createPolotnoApp({ container, key, showCredit, sections
1069
1131
  }): void;
1070
1132
  addFont(font: import("./utils/fonts").FONT): void;
1071
1133
  removeFont(fontFamily: string): void;
1134
+ addAudio(data: any): void;
1135
+ removeAudio(audioId: string): void;
1072
1136
  loadFont(fontFamily: any): Promise<void[]>;
1073
1137
  validate(json: any): {
1074
1138
  path: string;