polotno 0.40.0 → 0.41.2

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.
@@ -10,4 +10,4 @@
10
10
  line-height: auto;
11
11
  margin: 0;
12
12
  }
13
- `,RichEditor=({html:e,onBlur:t,onChange:r,element:a})=>{const i=react_1.default.useRef(null);return react_1.default.useEffect((()=>{if(!i.current)return;const e=new quill_1.default(i.current,{toolbar:!1,keyboard:!1,clipboard:{matchVisual:!1}});return exports.quillRef.editor.instance=e,window.__polotnoQuill=e,e.on("text-change",(()=>{var t;e.getSelection()&&(exports.quillRef.currentFormat=e.getFormat()),r(null===(t=i.current)||void 0===t?void 0:t.childNodes[0].innerHTML)})),e.setSelection(0,0,"api"),e.on("selection-change",(r=>{r||t(),r&&(exports.quillRef.currentFormat=e.getFormat())})),i.current.childNodes[0].addEventListener("blur",(e=>{var r;(null===(r=e.relatedTarget)||void 0===r?void 0:r.classList.contains("ql-clipboard"))||t()})),()=>{exports.quillRef.editor.instance=null,exports.quillRef.currentFormat={},delete window.__polotnoQuill}}),[]),react_1.default.useEffect((()=>{var t;const r=exports.quillRef.editor.instance,n=r.getSelection();if(!((null===(t=i.current)||void 0===t?void 0:t.childNodes[0].innerHTML)===a.text)){var l=r.clipboard.convert("<div class='ql-editor' style='outline: none;'>"+e+"<p><br></p></div>");r.setContents(l),r.history.clear(),n&&(r.setSelection(n.index,n.length),exports.quillRef.currentFormat=r.getFormat())}}),[a.text]),react_1.default.createElement(RichTextContainer,{ref:i,style:{fontSize:a.fontSize,color:a.fill,width:a.width,fontFamily:a.fontFamily,lineHeight:a.lineHeight,letterSpacing:a.letterSpacing,textAlign:a.align}})};function useHtmlSize(e,t,r){return react_1.default.useMemo((()=>(0,html2canvas_1.detectSize)(e)),[e,t.width,r])}exports.HTMLElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),[a,i]=react_1.default.useState(),[n,l]=react_1.default.useState(!1),[o,u]=react_1.default.useState(!0),[c,s]=react_1.default.useState(!1),[d,f]=react_1.default.useState(!1),_=t.selectedElements.indexOf(e)>=0,[m]=(0,text_element_1.useFontLoader)(t,e.fontFamily);(0,use_fadein_1.useFadeIn)(r);const h=m?e.fontFamily:"Arial",g=`<div style="width: ${e.width||100}px; color: ${e.fill}; font-size: ${e.fontSize}px; font-family: '${h}'; text-decoration: ${e.textDecoration}; text-align: ${e.align}; line-height: ${e.lineHeight}; letter-spacing: ${e.letterSpacing}; font-style: ${e.fontStyle}; font-weight: ${e.fontWeight}; -webkit-text-stroke: ${e.strokeWidth}px ${e.stroke}" contentEditable>${e.text}</div>`,{width:p,height:v}=useHtmlSize(g,e,m);react_1.default.useEffect((()=>{e.set({height:v})}),[v]),react_1.default.useLayoutEffect((()=>{if(n||c)return;const t=(0,loader_1.incrementLoader)(`text ${e.id}`);u(!0),async function(){await new Promise((e=>setTimeout(e)));const r=await(0,html2canvas_1.htmlToCanvas)({html:g,width:e.width||1,height:v||1,fontFamily:h});i(r),u(!1),konva_1.default.Util.requestAnimFrame(t)}()}),[g,n,v,c,h]);const x=n||o;return react_1.default.useLayoutEffect((()=>mobx.autorun((()=>{const t=r.current;(0,apply_filters_1.applyFilter)(t,e)}))),[a,x]),react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Image,{ref:r,name:"element",image:a,x:e.x,y:e.y,rotation:e.rotation,width:e.width,height:e.height,visible:!x,draggable:!e.locked,opacity:c?0:e.opacity,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,onMouseEnter:()=>{f(!0)},onMouseLeave:()=>{f(!1)},onDragStart:()=>{t.history.startTransaction()},onDragMove:t=>{setTimeout((()=>{e.set({x:t.target.x(),y:t.target.y()})}))},onDragEnd:r=>{e.set({x:r.target.x(),y:r.target.y()}),t.history.endTransaction()},id:e.id,onDblClick:()=>{e.locked||s(!0)},onDblTap:()=>{e.locked||s(!0)},onTransformStart:e=>{var t;const r=(null===(t=e.target.getStage())||void 0===t?void 0:t.findOne("Transformer")).getActiveAnchor();("middle-left"===r||"middle-right"===r)&&l(!0)},onTransform:t=>{var r;const a=(null===(r=t.target.getStage())||void 0===r?void 0:r.findOne("Transformer")).getActiveAnchor();if("middle-left"===a||"middle-right"===a){const r=t.target.scaleX(),a=Math.max(t.target.width()*r,e.fontSize);t.target.width(a),t.target.scaleX(1),e.set({width:a})}e.set({x:t.target.x(),y:t.target.y(),rotation:t.target.rotation()})},onTransformEnd:t=>{l(!1),u(!0);const r=t.target.scaleX();t.target.scaleX(1),t.target.scaleY(1),e.set({fontSize:e.fontSize*r,width:t.target.width()*r,x:t.target.x(),y:t.target.y(),rotation:t.target.rotation()})}}),x&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(react_konva_utils_1.Html,{divProps:{style:{pointerEvents:"none"}}},react_1.default.createElement(RichTextContainer,{dangerouslySetInnerHTML:{__html:g},style:{pointerEvents:"none",display:"inline-block"}}))),c&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement(RichEditor,{html:g,element:e,onChange:t=>{e.set({text:t})},onBlur:e=>{s(!1)}}))),(_||d)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
13
+ `,RichEditor=({html:e,onBlur:t,onChange:r,element:a})=>{const i=react_1.default.useRef(null);return react_1.default.useEffect((()=>{if(!i.current)return;const e=new quill_1.default(i.current,{toolbar:!1,keyboard:!1,clipboard:{matchVisual:!1}});return exports.quillRef.editor.instance=e,window.__polotnoQuill=e,e.on("text-change",(()=>{var t;e.getSelection()&&(exports.quillRef.currentFormat=e.getFormat()),r(null===(t=i.current)||void 0===t?void 0:t.childNodes[0].innerHTML)})),e.setSelection(0,0,"api"),e.on("selection-change",(r=>{r||t(),r&&(exports.quillRef.currentFormat=e.getFormat())})),i.current.childNodes[0].addEventListener("blur",(e=>{var r;(null===(r=e.relatedTarget)||void 0===r?void 0:r.classList.contains("ql-clipboard"))||t()})),()=>{exports.quillRef.editor.instance=null,exports.quillRef.currentFormat={},delete window.__polotnoQuill}}),[]),react_1.default.useEffect((()=>{var t;const r=exports.quillRef.editor.instance,n=r.getSelection();if(!((null===(t=i.current)||void 0===t?void 0:t.childNodes[0].innerHTML)===a.text)){var l=r.clipboard.convert("<div class='ql-editor' style='outline: none;'>"+e+"<p><br></p></div>");r.setContents(l),r.history.clear(),n&&(r.setSelection(n.index,n.length),exports.quillRef.currentFormat=r.getFormat())}}),[a.text]),react_1.default.createElement(RichTextContainer,{ref:i,style:{fontSize:a.fontSize,color:a.fill,width:a.width,fontFamily:a.fontFamily,lineHeight:a.lineHeight,letterSpacing:a.letterSpacing,textAlign:a.align}})};function useHtmlSize(e,t,r){return react_1.default.useMemo((()=>(0,html2canvas_1.detectSize)(e)),[e,t.width,r])}const PADDING=10;exports.HTMLElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),[a,i]=react_1.default.useState(),[n,l]=react_1.default.useState(!1),[o,u]=react_1.default.useState(!0),[c,s]=react_1.default.useState(!1),[d,f]=react_1.default.useState(!1),_=t.selectedElements.indexOf(e)>=0,[m]=(0,text_element_1.useFontLoader)(t,e.fontFamily);(0,use_fadein_1.useFadeIn)(r);const h=m?e.fontFamily:"Arial",g=`<div style="width: ${e.width||100}px; color: ${e.fill}; font-size: ${e.fontSize}px; font-family: '${h}'; text-decoration: ${e.textDecoration}; text-align: ${e.align}; line-height: ${e.lineHeight}; letter-spacing: ${e.letterSpacing}; font-style: ${e.fontStyle}; font-weight: ${e.fontWeight}; -webkit-text-stroke: ${e.strokeWidth}px ${e.stroke};" contentEditable>${e.text}</div>`,{width:p,height:v}=useHtmlSize(g,e,m);react_1.default.useEffect((()=>{e.set({height:v})}),[v]),react_1.default.useLayoutEffect((()=>{if(n||c)return;const t=(0,loader_1.incrementLoader)(`text ${e.id}`);u(!0),async function(){await new Promise((e=>setTimeout(e)));const r=await(0,html2canvas_1.htmlToCanvas)({html:g,width:e.width||1,height:v||1,fontFamily:h});i(r),u(!1),konva_1.default.Util.requestAnimFrame(t)}()}),[g,n,v,c,h]);const x=n||o;return react_1.default.useLayoutEffect((()=>mobx.autorun((()=>{const t=r.current;(0,apply_filters_1.applyFilter)(t,e)}))),[a,x]),react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Image,{ref:r,name:"element",image:a,x:e.x,y:e.y,rotation:e.rotation,width:e.width,height:e.height,visible:!x,draggable:!e.locked,opacity:c?0:e.opacity,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,onMouseEnter:()=>{f(!0)},onMouseLeave:()=>{f(!1)},onDragStart:()=>{t.history.startTransaction()},onDragMove:t=>{setTimeout((()=>{e.set({x:t.target.x(),y:t.target.y()})}))},onDragEnd:r=>{e.set({x:r.target.x(),y:r.target.y()}),t.history.endTransaction()},id:e.id,onDblClick:()=>{e.locked||s(!0)},onDblTap:()=>{e.locked||s(!0)},onTransformStart:e=>{var t;const r=(null===(t=e.target.getStage())||void 0===t?void 0:t.findOne("Transformer")).getActiveAnchor();("middle-left"===r||"middle-right"===r)&&l(!0)},onTransform:t=>{var r;const a=(null===(r=t.target.getStage())||void 0===r?void 0:r.findOne("Transformer")).getActiveAnchor();if("middle-left"===a||"middle-right"===a){const r=t.target.scaleX(),a=Math.max(t.target.width()*r,e.fontSize);t.target.width(a),t.target.scaleX(1),e.set({width:a})}e.set({x:t.target.x(),y:t.target.y(),rotation:t.target.rotation()})},onTransformEnd:t=>{l(!1),u(!0);const r=t.target.scaleX();t.target.scaleX(1),t.target.scaleY(1),e.set({fontSize:e.fontSize*r,width:t.target.width()*r,x:t.target.x(),y:t.target.y(),rotation:t.target.rotation()})}}),x&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(react_konva_utils_1.Html,{divProps:{style:{pointerEvents:"none"}}},react_1.default.createElement(RichTextContainer,{dangerouslySetInnerHTML:{__html:g},style:{pointerEvents:"none",display:"inline-block"}}))),c&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement(RichEditor,{html:g,element:e,onChange:t=>{e.set({text:t})},onBlur:e=>{s(!1)}}))),(_||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.TextElement=exports.useFontLoader=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),react_konva_utils_1=require("react-konva-utils"),mobx_1=require("mobx"),konva_1=__importDefault(require("konva")),loader_1=require("../utils/loader"),fonts_1=require("../utils/fonts"),flags_1=require("../utils/flags"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),highlighter_1=require("./highlighter"),styleNode=document.createElement("style");styleNode.type="text/css",document.head.appendChild(styleNode);const initialStyles={border:"none",padding:"0px",overflow:"hidden",background:"none",outline:"none",resize:"none",overflowWrap:"break-word",whiteSpace:"normal",userSelect:"text",wordBreak:"normal"},TextInput=(0,mobx_react_lite_1.observer)((({textNodeRef:e,element:t,onBlur:r,selectAll:n,cursorPosition:o})=>{const[a,i]=react_1.default.useState(initialStyles),l=e.current;react_1.default.useLayoutEffect((()=>{const e={};e.width=l.width()-2*l.padding()+"px",e.height=l.height()-2*l.padding()+10+"px",e.fontSize=l.fontSize()+"px",e.lineHeight=l.lineHeight()+.01,e.fontFamily='"'+l.fontFamily()+'"',e.textAlign=l.align(),e.color=l.fill(),e.fontWeight=t.fontWeight,e.fontStyle=t.fontStyle;const r=`\n .polotno-input::placeholder {\n color: ${a.color};\n opacity: 0.6;\n }\n `;styleNode.innerHTML="",styleNode.appendChild(document.createTextNode(r)),JSON.stringify(e)!==JSON.stringify(a)&&i(e)}));const s=react_1.default.useRef(null);return react_1.default.useEffect((()=>{var e;const t=s.current;if(!t)return;null===(e=s.current)||void 0===e||e.focus();const r=o||t.value.length;t.selectionStart=t.selectionEnd=r,n&&(null==t||t.select(),document.execCommand("selectAll",!1,null))}),[]),react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement("textarea",{className:"polotno-input",ref:s,style:Object.assign(Object.assign({},initialStyles),a),value:t.text,onChange:e=>{t.set({text:e.target.value})},placeholder:t.placeholder,onBlur:r}))})),useEditor=e=>{const[t,r]=react_1.default.useState(!1),n=react_1.default.useRef(!1);return react_1.default.useEffect((()=>{var t=!0;return setTimeout((()=>{t&&(e._editModeEnabled&&(n.current=!0),r(!0),setTimeout((()=>{n.current=!1}),50))}),50),()=>{t=!1}}),[]),{editorEnabled:t&&e._editModeEnabled,selectAll:n.current}},useFontLoader=(e,t)=>{const[r,n]=react_1.default.useState((0,fonts_1.isFontLoaded)(t));return react_1.default.useLayoutEffect((()=>{if((0,fonts_1.isFontLoaded)(t))return void n(!0);let o=!0;return(async()=>{r&&n(!1);const a=(0,loader_1.incrementLoader)(`text ${t}`);await e.loadFont(t),konva_1.default.Util.requestAnimFrame(a),o&&n(!0)})(),()=>{o=!1}}),[t]),[r]};exports.useFontLoader=useFontLoader;const getLineHeight=({fontLoaded:e,fontFamily:t,fontSize:r,lineHeight:n})=>react_1.default.useMemo((()=>{if("number"==typeof n)return n;const e=document.createElement("div");e.style.fontFamily=t,e.style.fontSize=r+"px",e.style.lineHeight=n,e.innerText="Test text",document.body.appendChild(e);const o=e.offsetHeight;return document.body.removeChild(e),o/r}),[e,t,r,n]);function getRelativePointerPosition(e){var t=e.getAbsoluteTransform().copy();t.invert();var r=e.getStage().getPointerPosition();return t.point(r)}function getCursorPosition(e){var t;const r=e.target,n=getRelativePointerPosition(r),o=r.textArr,a=Math.floor(n.y/(r.fontSize()*r.lineHeight())),i=o.slice(0,a).reduce(((e,t)=>e+t.text.length),a),l=null!==(t=o[a])&&void 0!==t?t:o[0];let s=0;"right"===r.align()?s=r.width()-l.width:"center"===r.align()&&(s=r.width()/2-l.width/2);return i+Math.round((n.x-s)/l.width*l.text.length)}exports.TextElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),{editorEnabled:n,selectAll:o}=useEditor(e),[a,i]=react_1.default.useState(!1),[l,s]=react_1.default.useState(!1),d=t.selectedElements.indexOf(e)>=0;react_1.default.useEffect((()=>{if(e.width)return;const t=r.current;t.width(600),e.set({width:1.4*t.getTextWidth()})}),[]),react_1.default.useLayoutEffect((()=>(0,mobx_1.autorun)((()=>{const t=r.current;(0,apply_filters_1.applyFilter)(t,e)}))));const[u]=(0,exports.useFontLoader)(t,e.fontFamily),c=react_1.default.useRef(null);react_1.default.useEffect((()=>{if(!u)return;const t=r.current,n=e.height&&t.height()>e.height,{forceTextFitEnabled:o}=flags_1.flags;n&&o&&!l?(c.current||(c.current=(0,loader_1.incrementLoader)()),e.set({fontSize:e.fontSize-.1})):o&&c.current?(c.current(),c.current=null):e.height!==t.height()&&e.set({height:t.height()})})),react_1.default.useLayoutEffect((()=>{const t=r.current;t&&(t.width(t.width()+1e-8),t._setTextData(),(0,apply_filters_1.applyFilter)(t,e))}),[u]);const f=react_1.default.useRef(null),g=react_1.default.useRef(0),h=r=>{t.selectedElements.find((t=>t===e))&&!e.locked&&(g.current=getCursorPosition(r),e.toggleEditMode())},_=!e.text&&e.placeholder,m=e._editModeEnabled?0:_?.6:e.opacity;(0,use_fadein_1.useFadeIn)(r,m);const p=getLineHeight({fontLoaded:u,fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:e.lineHeight}),y=e.selectable||"admin"===t.role;return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Text,{ref:r,id:e.id,name:"element",hideOnExport:!e.showInExport,x:e.x,y:e.y,rotation:e.rotation,width:e.width,text:e.text||e.placeholder,fill:e.fill,stroke:e.stroke,strokeWidth:e.strokeWidth,fillAfterStrokeEnabled:!0,fontSize:e.fontSize,fontFamily:e.fontFamily,fontStyle:e.fontStyle+" "+e.fontWeight,textDecoration:e.textDecoration,align:e.align,draggable:!e.locked,opacity:m,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,lineHeight:p,letterSpacing:e.letterSpacing*e.fontSize,listening:y,onDragStart:()=>{t.history.startTransaction()},onDragMove:t=>{setTimeout((()=>{e.set({x:t.target.x(),y:t.target.y()})}))},onDragEnd:r=>{e.set({x:r.target.x(),y:r.target.y()}),t.history.endTransaction()},onMouseEnter:()=>{i(!0)},onMouseLeave:()=>{i(!1)},onClick:h,onTap:h,onTransformStart:()=>{s(!0),t.history.startTransaction()},onTransform:t=>{var r;const n=(null===(r=t.target.getStage())||void 0===r?void 0:r.findOne("Transformer")).getActiveAnchor();if("middle-left"===n||"middle-right"===n){const r=t.target.scaleX(),n=t.target.width()*r,o=e.fontSize;let a=n;n<o&&(a=o,f.current&&t.target.position(f.current)),t.target.width(a),t.target.scaleX(1),e.set({x:t.target.x(),y:t.target.y(),width:t.target.width(),rotation:t.target.rotation()}),(0,apply_filters_1.applyFilter)(t.target,e)}t.target.strokeWidth(e.strokeWidth/t.target.scaleX()),f.current=t.target.position()},onTransformEnd:r=>{s(!1);const n=r.target.scaleX();r.target.scaleX(1),r.target.scaleY(1),r.target.strokeWidth(e.strokeWidth),e.set({fontSize:Math.round(e.fontSize*n),width:Math.ceil(r.target.width()*n),x:r.target.x(),y:r.target.y(),rotation:r.target.rotation()}),t.history.endTransaction()}}),n&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(TextInput,{textNodeRef:r,element:e,selectAll:o,cursorPosition:g.current,onBlur:()=>{e.toggleEditMode(!1)}})),!l&&(a||d)&&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.TextElement=exports.useFontLoader=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),react_konva_utils_1=require("react-konva-utils"),mobx_1=require("mobx"),konva_1=__importDefault(require("konva")),loader_1=require("../utils/loader"),fonts_1=require("../utils/fonts"),flags_1=require("../utils/flags"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),highlighter_1=require("./highlighter"),styleNode=document.createElement("style");styleNode.type="text/css",document.head.appendChild(styleNode);const initialStyles={border:"none",padding:"0px",overflow:"hidden",background:"none",outline:"none",resize:"none",overflowWrap:"break-word",whiteSpace:"normal",userSelect:"text",wordBreak:"normal"},TextInput=(0,mobx_react_lite_1.observer)((({textNodeRef:e,element:t,onBlur:r,selectAll:n,cursorPosition:o})=>{const[a,i]=react_1.default.useState(initialStyles),l=e.current;react_1.default.useLayoutEffect((()=>{const e={};e.width=l.width()-2*l.padding()+"px",e.height=l.height()-2*l.padding()+10+"px",e.fontSize=l.fontSize()+"px",e.lineHeight=l.lineHeight()+.01,e.fontFamily='"'+l.fontFamily()+'"',e.textAlign=l.align(),e.color=l.fill(),e.fontWeight=t.fontWeight,e.fontStyle=t.fontStyle;const r=`\n .polotno-input::placeholder {\n color: ${a.color};\n opacity: 0.6;\n }\n `;styleNode.innerHTML="",styleNode.appendChild(document.createTextNode(r)),JSON.stringify(e)!==JSON.stringify(a)&&i(e)}));const s=react_1.default.useRef(null);return react_1.default.useEffect((()=>{var e;const t=s.current;if(!t)return;null===(e=s.current)||void 0===e||e.focus();const r=o||t.value.length;t.selectionStart=t.selectionEnd=r,n&&(null==t||t.select(),document.execCommand("selectAll",!1,null))}),[]),react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement("textarea",{className:"polotno-input",ref:s,style:Object.assign(Object.assign({},initialStyles),a),value:t.text,onChange:e=>{t.set({text:e.target.value})},placeholder:t.placeholder,onBlur:r}))})),useEditor=e=>{const[t,r]=react_1.default.useState(!1),n=react_1.default.useRef(!1);return react_1.default.useEffect((()=>{var t=!0;return setTimeout((()=>{t&&(e._editModeEnabled&&(n.current=!0),r(!0),setTimeout((()=>{n.current=!1}),50))}),50),()=>{t=!1}}),[]),{editorEnabled:t&&e._editModeEnabled,selectAll:n.current}},useFontLoader=(e,t)=>{const[r,n]=react_1.default.useState((0,fonts_1.isFontLoaded)(t));return react_1.default.useLayoutEffect((()=>{if((0,fonts_1.isFontLoaded)(t))return void n(!0);let o=!0;return(async()=>{r&&n(!1);const a=(0,loader_1.incrementLoader)(`text ${t}`);await e.loadFont(t),konva_1.default.Util.requestAnimFrame(a),o&&n(!0)})(),()=>{o=!1}}),[t]),[r]};exports.useFontLoader=useFontLoader;const getLineHeight=({fontLoaded:e,fontFamily:t,fontSize:r,lineHeight:n})=>react_1.default.useMemo((()=>{if("number"==typeof n)return n;const e=document.createElement("div");e.style.fontFamily=t,e.style.fontSize=r+"px",e.style.lineHeight=n,e.innerText="Test text",document.body.appendChild(e);const o=e.offsetHeight;return document.body.removeChild(e),o/r}),[e,t,r,n]);function getRelativePointerPosition(e){var t=e.getAbsoluteTransform().copy();t.invert();var r=e.getStage().getPointerPosition();return t.point(r)}function getCursorPosition(e){var t;const r=e.target,n=getRelativePointerPosition(r),o=r.textArr,a=Math.floor(n.y/(r.fontSize()*r.lineHeight())),i=o.slice(0,a).reduce(((e,t)=>e+t.text.length),a),l=null!==(t=o[a])&&void 0!==t?t:o[0];let s=0;"right"===r.align()?s=r.width()-l.width:"center"===r.align()&&(s=r.width()/2-l.width/2);return i+Math.round((n.x-s)/l.width*l.text.length)}exports.TextElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),{editorEnabled:n,selectAll:o}=useEditor(e),[a,i]=react_1.default.useState(!1),[l,s]=react_1.default.useState(!1),d=t.selectedElements.indexOf(e)>=0;react_1.default.useEffect((()=>{if(e.width)return;const t=r.current;t.width(600),e.set({width:1.4*t.getTextWidth()})}),[]),react_1.default.useLayoutEffect((()=>(0,mobx_1.autorun)((()=>{const t=r.current;(0,apply_filters_1.applyFilter)(t,e)}))));const[u]=(0,exports.useFontLoader)(t,e.fontFamily),c=react_1.default.useRef(null);react_1.default.useEffect((()=>{if(!u)return;const t=r.current,n=e.height&&t.height()>e.height,o=e.text.split("\n").join(" ").split(" ");let a=t.textArr.map((e=>e.text)).join(";");const i=o.find((e=>!a.includes(e)||(a=a.replace(e,""),!1))),s=n||i,{forceTextFitEnabled:d}=flags_1.flags;s&&d&&!l?(c.current||(c.current=(0,loader_1.incrementLoader)()),e.set({fontSize:e.fontSize-.1})):d&&c.current?(c.current(),c.current=null):e.height!==t.height()&&e.set({height:t.height()})})),react_1.default.useLayoutEffect((()=>{const t=r.current;t&&(t.width(t.width()+1e-8),t._setTextData(),(0,apply_filters_1.applyFilter)(t,e))}),[u]);const f=react_1.default.useRef(null),g=react_1.default.useRef(0),h=r=>{t.selectedElements.find((t=>t===e))&&!e.locked&&(g.current=getCursorPosition(r),e.toggleEditMode())},_=!e.text&&e.placeholder,p=e._editModeEnabled?0:_?.6:e.opacity;(0,use_fadein_1.useFadeIn)(r,p);const m=getLineHeight({fontLoaded:u,fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:e.lineHeight}),y=e.selectable||"admin"===t.role;return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Text,{ref:r,id:e.id,name:"element",hideOnExport:!e.showInExport,x:e.x,y:e.y,rotation:e.rotation,width:e.width,text:e.text||e.placeholder,fill:e.fill,stroke:e.stroke,strokeWidth:e.strokeWidth,fillAfterStrokeEnabled:!0,fontSize:e.fontSize,fontFamily:e.fontFamily,fontStyle:e.fontStyle+" "+e.fontWeight,textDecoration:e.textDecoration,align:e.align,draggable:!e.locked,opacity:p,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,lineHeight:m,letterSpacing:e.letterSpacing*e.fontSize,listening:y,onDragStart:()=>{t.history.startTransaction()},onDragMove:t=>{setTimeout((()=>{e.set({x:t.target.x(),y:t.target.y()})}))},onDragEnd:r=>{e.set({x:r.target.x(),y:r.target.y()}),t.history.endTransaction()},onMouseEnter:()=>{i(!0)},onMouseLeave:()=>{i(!1)},onClick:h,onTap:h,onTransformStart:()=>{s(!0),t.history.startTransaction()},onTransform:t=>{var r;const n=(null===(r=t.target.getStage())||void 0===r?void 0:r.findOne("Transformer")).getActiveAnchor();if("middle-left"===n||"middle-right"===n){const r=t.target.scaleX(),n=t.target.width()*r,o=e.fontSize;let a=n;n<o&&(a=o,f.current&&t.target.position(f.current)),t.target.width(a),t.target.scaleX(1),e.set({x:t.target.x(),y:t.target.y(),width:t.target.width(),rotation:t.target.rotation()}),(0,apply_filters_1.applyFilter)(t.target,e)}t.target.strokeWidth(e.strokeWidth/t.target.scaleX()),f.current=t.target.position()},onTransformEnd:r=>{s(!1);const n=r.target.scaleX();r.target.scaleX(1),r.target.scaleY(1),r.target.strokeWidth(e.strokeWidth),e.set({fontSize:Math.round(e.fontSize*n),width:Math.ceil(r.target.width()*n),x:r.target.x(),y:r.target.y(),rotation:r.target.rotation()}),t.history.endTransaction()}}),n&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(TextInput,{textNodeRef:r,element:e,selectAll:o,cursorPosition:g.current,onBlur:()=>{e.toggleEditMode(!1)}})),!l&&(a||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.Workspace=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),page_1=__importDefault(require("./page")),hotkeys_1=require("./hotkeys"),l10n_1=require("../utils/l10n"),ZERO_SIZE_WARNING="Polotno warning: <Workspace /> component can not automatically detect its size.\nWidth or height of parent elements is equal 0.\nPlease make sure it has non-zero size. You may need to adjust it with your styles. <Workspace /> will automatically fit into parent container.\nFor simpler debugging here is the log of the parent element:",useSaveScrollOnScaleChange=(e,t,r,a,o)=>{const n=react_1.default.useRef({width:t,height:r}),l=react_1.default.useRef({top:0,left:0});react_1.default.useEffect((()=>{const t=e.current,r=()=>{l.current={top:t.scrollTop,left:t.scrollLeft}};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]),react_1.default.useLayoutEffect((()=>{if(!e.current)return;const a=e.current,o=(l.current.left+a.offsetWidth/2)/n.current.width,c=(l.current.top+a.offsetHeight/2)/n.current.height;a.scrollLeft=o*t-a.offsetWidth/2,a.scrollTop=c*r-a.offsetHeight/2,n.current={width:t,height:r}}),[a,t,r])},useScrollOnActiveChange=(e,t,r)=>{const a=react_1.default.useRef(!1),o=react_1.default.useRef(null);react_1.default.useEffect((()=>{const t=e.current,r=()=>{a.current=!0,clearTimeout(o.current),o.current=setTimeout((()=>{a.current=!1}),300)};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]);const n=r.pages.indexOf(r.activePage);react_1.default.useLayoutEffect((()=>{if(!r.activePage)return;if(!e.current)return;if(a.current)return;const o=e.current,n=r.pages.indexOf(r.activePage)*t;Math.abs(n-o.scrollTop)>.9*t&&(o.scrollTop=n)}),[r.activePage,n])};exports.Workspace=(0,mobx_react_lite_1.observer)((({store:e,pageControlsEnabled:t,backgroundColor:r,pageBorderColor:a,activePageBorderColor:o,components:n})=>{const[l,c]=react_1.default.useState({width:100,height:100}),s=react_1.default.useRef(l),i=react_1.default.useRef(null),u=react_1.default.useRef(null),d=e._bleedVisible?Math.max(0,...e.pages.map((e=>e.bleed))):0,h=Math.max(...e.pages.map((e=>e.computedWidth))),f=Math.max(...e.pages.map((e=>e.computedHeight))),g=h+2*d,p=f+2*d,_=()=>{if(null===i.current)return;const t=i.current.getBoundingClientRect();0!==t.width&&0!==t.height||(console.warn(ZERO_SIZE_WARNING),console.log(i.current));const r=u.current.clientWidth||t.width,a={width:r,height:t.height};(s.current.width!==a.width||s.current.height!==a.height)&&(c(a),s.current=a);const o=(r-16)/g,n=(t.height-90)/p,l=Math.max(Math.min(o,n),.01);e.scaleToFit!==l&&(e.setScale(l),e._setScaleToFit(l))};react_1.default.useEffect(_,[g,p]),react_1.default.useEffect((()=>{const e=i.current;if(window.ResizeObserver){const t=new ResizeObserver(_);return t.observe(e),()=>t.unobserve(e)}{const e=setInterval(_,100);return()=>clearInterval(e)}}),[g,p]);const m=Math.max(8,(l.width-g*e.scale)/2),v=p*e.scale*e.pages.length,w=Math.max(45,(l.height-v)/e.pages.length/2);react_1.default.useEffect((()=>{const t=t=>{(0,hotkeys_1.handleHotkey)(t,e)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)}),[]);useSaveScrollOnScaleChange(u,g*e.scale+2*m,p*e.scale+2*w,e.scale),useScrollOnActiveChange(u,p*e.scale+2*w,e);const E=l.width>=g*e.scale+2*m,b=r||"#e8e8e8",x=e.pages.indexOf(e.activePage);return react_1.default.createElement("div",{ref:i,style:{width:"100%",height:"100%",position:"relative",outline:"none",flex:1,backgroundColor:b},tabIndex:0,className:"polotno-workspace-container"},react_1.default.createElement("div",{ref:u,onScroll:t=>{const r=t.currentTarget.childNodes[0].offsetHeight,a=t.currentTarget.scrollTop,o=Math.floor((a+l.height/2)/r),n=e.pages[o];n&&n.select()},style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",overflow:"auto",overflowX:E?"hidden":"auto"},className:"polotno-workspace-inner"},e.pages.map(((r,l)=>Math.abs(l-x)<=1||r._exporting?react_1.default.createElement(page_1.default,{key:r.id,page:r,xPadding:m,yPadding:w,width:g*e.scale+2*m,height:p*e.scale+2*w,store:e,pageControlsEnabled:t,backColor:b,pageBorderColor:a||"lightgrey",activePageBorderColor:o||"rgb(0, 161, 255)",components:n}):react_1.default.createElement("div",{key:r.id,style:{width:g*e.scale+2*m+"px",height:p*e.scale+2*w+"px"}}))),0===e.pages.length&&react_1.default.createElement("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center"}},react_1.default.createElement("p",null,(0,l10n_1.t)("workspace.noPages")),react_1.default.createElement("button",{onClick:()=>{e.addPage()}},(0,l10n_1.t)("workspace.addPage")))))})),exports.default=exports.Workspace;
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Workspace=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),page_1=__importDefault(require("./page")),hotkeys_1=require("./hotkeys"),l10n_1=require("../utils/l10n"),ZERO_SIZE_WARNING="Polotno warning: <Workspace /> component can not automatically detect its size.\nWidth or height of parent elements is equal 0.\nPlease make sure it has non-zero size. You may need to adjust it with your styles. <Workspace /> will automatically fit into parent container.\nFor simpler debugging here is the log of the parent element:",useSaveScrollOnScaleChange=(e,t,r,a,o)=>{const n=react_1.default.useRef({width:t,height:r}),l=react_1.default.useRef({top:0,left:0});react_1.default.useEffect((()=>{const t=e.current,r=()=>{l.current={top:t.scrollTop,left:t.scrollLeft}};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]),react_1.default.useLayoutEffect((()=>{if(!e.current)return;const a=e.current,o=(l.current.left+a.offsetWidth/2)/n.current.width,c=(l.current.top+a.offsetHeight/2)/n.current.height;a.scrollLeft=o*t-a.offsetWidth/2,a.scrollTop=c*r-a.offsetHeight/2,n.current={width:t,height:r}}),[a,t,r])},useScrollOnActiveChange=(e,t,r)=>{const a=react_1.default.useRef(!1),o=react_1.default.useRef(null);react_1.default.useEffect((()=>{const t=e.current,r=()=>{a.current=!0,clearTimeout(o.current),o.current=setTimeout((()=>{a.current=!1}),300)};return t.addEventListener("scroll",r),()=>{t.removeEventListener("scroll",r)}}),[]);const n=r.pages.indexOf(r.activePage);react_1.default.useLayoutEffect((()=>{if(!r.activePage)return;if(!e.current)return;if(a.current)return;const o=e.current,n=r.pages.indexOf(r.activePage)*t;Math.abs(n-o.scrollTop)>.9*t&&(o.scrollTop=n)}),[r.activePage,n])},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")));exports.Workspace=(0,mobx_react_lite_1.observer)((({store:e,pageControlsEnabled:t,backgroundColor:r,pageBorderColor:a,activePageBorderColor:o,components:n})=>{const[l,c]=react_1.default.useState({width:100,height:100}),s=react_1.default.useRef(l),i=react_1.default.useRef(null),u=react_1.default.useRef(null),d=e._bleedVisible?Math.max(0,...e.pages.map((e=>e.bleed))):0,f=Math.max(...e.pages.map((e=>e.computedWidth))),h=Math.max(...e.pages.map((e=>e.computedHeight))),g=f+2*d,p=h+2*d,_=()=>{if(null===i.current)return;const t=i.current.getBoundingClientRect();0!==t.width&&0!==t.height||(console.warn(ZERO_SIZE_WARNING),console.log(i.current));const r=u.current.clientWidth||t.width,a={width:r,height:t.height};(s.current.width!==a.width||s.current.height!==a.height)&&(c(a),s.current=a);const o=(r-16)/g,n=(t.height-90)/p,l=Math.max(Math.min(o,n),.01);e.scaleToFit!==l&&(e.setScale(l),e._setScaleToFit(l))};react_1.default.useEffect(_,[g,p]),react_1.default.useEffect((()=>{const e=i.current;if(window.ResizeObserver){const t=new ResizeObserver(_);return t.observe(e),()=>t.unobserve(e)}{const e=setInterval(_,100);return()=>clearInterval(e)}}),[g,p]);const m=Math.max(8,(l.width-g*e.scale)/2),v=p*e.scale*e.pages.length,w=Math.max(45,(l.height-v)/e.pages.length/2);react_1.default.useEffect((()=>{const t=t=>{(0,hotkeys_1.handleHotkey)(t,e)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)}),[]);useSaveScrollOnScaleChange(u,g*e.scale+2*m,p*e.scale+2*w,e.scale),useScrollOnActiveChange(u,p*e.scale+2*w,e);const E=l.width>=g*e.scale+2*m,b=r||"#e8e8e8",x=e.pages.indexOf(e.activePage),k=(null==n?void 0:n.NoPages)||NoPages;return react_1.default.createElement("div",{ref:i,style:{width:"100%",height:"100%",position:"relative",outline:"none",flex:1,backgroundColor:b},tabIndex:0,className:"polotno-workspace-container"},react_1.default.createElement("div",{ref:u,onScroll:t=>{const r=t.currentTarget.childNodes[0].offsetHeight,a=t.currentTarget.scrollTop,o=Math.floor((a+l.height/2)/r),n=e.pages[o];n&&n.select()},style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",overflow:"auto",overflowX:E?"hidden":"auto"},className:"polotno-workspace-inner"},e.pages.map(((r,l)=>Math.abs(l-x)<=1||r._exporting?react_1.default.createElement(page_1.default,{key:r.id,page:r,xPadding:m,yPadding:w,width:g*e.scale+2*m,height:p*e.scale+2*w,store:e,pageControlsEnabled:t,backColor:b,pageBorderColor:a||"lightgrey",activePageBorderColor:o||"rgb(0, 161, 255)",components:n}):react_1.default.createElement("div",{key:r.id,style:{width:g*e.scale+2*m+"px",height:p*e.scale+2*w+"px"}}))),0===e.pages.length&&react_1.default.createElement(k,{store:e})))})),exports.default=exports.Workspace;
package/model/store.d.ts CHANGED
@@ -2,6 +2,7 @@ import { Instance } from 'mobx-state-tree';
2
2
  export declare const Element: import("mobx-state-tree").IModelType<{
3
3
  id: import("mobx-state-tree").ISimpleType<string>;
4
4
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
5
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
5
6
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
6
7
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
7
8
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -32,6 +33,7 @@ export declare const Element: import("mobx-state-tree").IModelType<{
32
33
  clone(attrs: any): {
33
34
  id: string;
34
35
  type: string;
36
+ name: string;
35
37
  x: number;
36
38
  y: number;
37
39
  rotation: number;
@@ -61,6 +63,7 @@ export declare const Element: import("mobx-state-tree").IModelType<{
61
63
  } & any & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
62
64
  id: import("mobx-state-tree").ISimpleType<string>;
63
65
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
66
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
64
67
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
65
68
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
66
69
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -90,6 +93,7 @@ export declare const Element: import("mobx-state-tree").IModelType<{
90
93
  } & any, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
91
94
  id: import("mobx-state-tree").ISimpleType<string>;
92
95
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
96
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
93
97
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
94
98
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
95
99
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -121,6 +125,7 @@ export declare const Element: import("mobx-state-tree").IModelType<{
121
125
  }, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
122
126
  id: import("mobx-state-tree").ISimpleType<string>;
123
127
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
128
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
124
129
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
125
130
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
126
131
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -147,6 +152,7 @@ export declare type ElementType = Instance<typeof Element>;
147
152
  export declare const TextElement: import("mobx-state-tree").IModelType<{
148
153
  id: import("mobx-state-tree").ISimpleType<string>;
149
154
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
155
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
150
156
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
151
157
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
152
158
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -195,6 +201,7 @@ export declare const TextElement: import("mobx-state-tree").IModelType<{
195
201
  clone(attrs: any): {
196
202
  id: string;
197
203
  type: string;
204
+ name: string;
198
205
  x: number;
199
206
  y: number;
200
207
  rotation: number;
@@ -224,6 +231,7 @@ export declare const TextElement: import("mobx-state-tree").IModelType<{
224
231
  } & any & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
225
232
  id: import("mobx-state-tree").ISimpleType<string>;
226
233
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
234
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
227
235
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
228
236
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
229
237
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -253,6 +261,7 @@ export declare const TextElement: import("mobx-state-tree").IModelType<{
253
261
  } & any, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
254
262
  id: import("mobx-state-tree").ISimpleType<string>;
255
263
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
264
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
256
265
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
257
266
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
258
267
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -286,6 +295,7 @@ export declare const TextElement: import("mobx-state-tree").IModelType<{
286
295
  }, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
287
296
  id: import("mobx-state-tree").ISimpleType<string>;
288
297
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
298
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
289
299
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
290
300
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
291
301
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -312,6 +322,7 @@ export declare type TextElementType = Instance<typeof TextElement>;
312
322
  export declare const ImageElement: import("mobx-state-tree").IModelType<{
313
323
  id: import("mobx-state-tree").ISimpleType<string>;
314
324
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
325
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
315
326
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
316
327
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
317
328
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -358,6 +369,7 @@ export declare const ImageElement: import("mobx-state-tree").IModelType<{
358
369
  clone(attrs: any): {
359
370
  id: string;
360
371
  type: string;
372
+ name: string;
361
373
  x: number;
362
374
  y: number;
363
375
  rotation: number;
@@ -387,6 +399,7 @@ export declare const ImageElement: import("mobx-state-tree").IModelType<{
387
399
  } & any & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
388
400
  id: import("mobx-state-tree").ISimpleType<string>;
389
401
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
402
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
390
403
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
391
404
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
392
405
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -416,6 +429,7 @@ export declare const ImageElement: import("mobx-state-tree").IModelType<{
416
429
  } & any, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
417
430
  id: import("mobx-state-tree").ISimpleType<string>;
418
431
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
432
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
419
433
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
420
434
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
421
435
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -449,6 +463,7 @@ export declare const ImageElement: import("mobx-state-tree").IModelType<{
449
463
  }, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
450
464
  id: import("mobx-state-tree").ISimpleType<string>;
451
465
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
466
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
452
467
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
453
468
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
454
469
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -475,6 +490,7 @@ export declare type ImageElementType = Instance<typeof ImageElement>;
475
490
  export declare const SVGElement: import("mobx-state-tree").IModelType<{
476
491
  id: import("mobx-state-tree").ISimpleType<string>;
477
492
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
493
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
478
494
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
479
495
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
480
496
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -522,6 +538,7 @@ export declare const SVGElement: import("mobx-state-tree").IModelType<{
522
538
  clone(attrs: any): {
523
539
  id: string;
524
540
  type: string;
541
+ name: string;
525
542
  x: number;
526
543
  y: number;
527
544
  rotation: number;
@@ -551,6 +568,7 @@ export declare const SVGElement: import("mobx-state-tree").IModelType<{
551
568
  } & any & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
552
569
  id: import("mobx-state-tree").ISimpleType<string>;
553
570
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
571
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
554
572
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
555
573
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
556
574
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -580,6 +598,7 @@ export declare const SVGElement: import("mobx-state-tree").IModelType<{
580
598
  } & any, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
581
599
  id: import("mobx-state-tree").ISimpleType<string>;
582
600
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
601
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
583
602
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
584
603
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
585
604
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -652,6 +671,7 @@ export declare const Page: import("mobx-state-tree").IModelType<{
652
671
  moveElementsDown(ids: Array<string>): void;
653
672
  canMoveElementsBottom(ids: Array<string>): any;
654
673
  moveElementsBottom(ids: Array<string>): void;
674
+ setElementZIndex(id: any, zIndex: any): void;
655
675
  } & {
656
676
  moveElementUp(id: any): void;
657
677
  moveElementDown(id: any): void;
@@ -664,7 +684,7 @@ export declare const Font: import("mobx-state-tree").IModelType<{
664
684
  url: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
665
685
  styles: import("mobx-state-tree").IType<any, any, any>;
666
686
  }, {}, any, import("mobx-state-tree")._NotCustomized>;
667
- interface ExportOptions {
687
+ export interface ExportOptions {
668
688
  pixelRatio?: number;
669
689
  ignoreBackground?: boolean;
670
690
  pageId?: string;
@@ -672,7 +692,7 @@ interface ExportOptions {
672
692
  mimeType?: 'image/png' | 'image/jpeg';
673
693
  quality?: number;
674
694
  }
675
- interface PDFExportOptions extends ExportOptions {
695
+ export interface PDFExportOptions extends ExportOptions {
676
696
  dpi?: number;
677
697
  parallel?: number;
678
698
  unit?: 'pt' | 'mm' | 'cm' | 'in';
@@ -712,6 +732,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
712
732
  moveElementsDown(ids: Array<string>): void;
713
733
  canMoveElementsBottom(ids: Array<string>): any;
714
734
  moveElementsBottom(ids: Array<string>): void;
735
+ setElementZIndex(id: any, zIndex: any): void;
715
736
  } & {
716
737
  moveElementUp(id: any): void;
717
738
  moveElementDown(id: any): void;
@@ -757,6 +778,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
757
778
  readonly selectedElements: ({
758
779
  id: string;
759
780
  type: string;
781
+ name: string;
760
782
  x: number;
761
783
  y: number;
762
784
  rotation: number;
@@ -787,6 +809,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
787
809
  clone(attrs: any): {
788
810
  id: string;
789
811
  type: string;
812
+ name: string;
790
813
  x: number;
791
814
  y: number;
792
815
  rotation: number;
@@ -816,6 +839,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
816
839
  } & any & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
817
840
  id: import("mobx-state-tree").ISimpleType<string>;
818
841
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
842
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
819
843
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
820
844
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
821
845
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -845,6 +869,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
845
869
  } & any, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
846
870
  id: import("mobx-state-tree").ISimpleType<string>;
847
871
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
872
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
848
873
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
849
874
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
850
875
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -876,6 +901,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
876
901
  } & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
877
902
  id: import("mobx-state-tree").ISimpleType<string>;
878
903
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
904
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
879
905
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
880
906
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
881
907
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -906,6 +932,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
906
932
  clone(attrs: any): {
907
933
  id: string;
908
934
  type: string;
935
+ name: string;
909
936
  x: number;
910
937
  y: number;
911
938
  rotation: number;
@@ -935,6 +962,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
935
962
  } & any & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
936
963
  id: import("mobx-state-tree").ISimpleType<string>;
937
964
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
965
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
938
966
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
939
967
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
940
968
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -964,6 +992,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
964
992
  } & any, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
965
993
  id: import("mobx-state-tree").ISimpleType<string>;
966
994
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
995
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
967
996
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
968
997
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
969
998
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -995,6 +1024,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
995
1024
  }, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
996
1025
  id: import("mobx-state-tree").ISimpleType<string>;
997
1026
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
1027
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
998
1028
  x: import("mobx-state-tree").IType<number | undefined, number, number>;
999
1029
  y: import("mobx-state-tree").IType<number | undefined, number, number>;
1000
1030
  rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
@@ -1049,6 +1079,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
1049
1079
  moveElementsDown(ids: Array<string>): void;
1050
1080
  canMoveElementsBottom(ids: Array<string>): any;
1051
1081
  moveElementsBottom(ids: Array<string>): void;
1082
+ setElementZIndex(id: any, zIndex: any): void;
1052
1083
  } & {
1053
1084
  moveElementUp(id: any): void;
1054
1085
  moveElementDown(id: any): void;
@@ -1086,6 +1117,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
1086
1117
  moveElementsDown(ids: Array<string>): void;
1087
1118
  canMoveElementsBottom(ids: Array<string>): any;
1088
1119
  moveElementsBottom(ids: Array<string>): void;
1120
+ setElementZIndex(id: any, zIndex: any): void;
1089
1121
  } & {
1090
1122
  moveElementUp(id: any): void;
1091
1123
  moveElementDown(id: any): void;
@@ -1127,6 +1159,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
1127
1159
  moveElementsDown(ids: Array<string>): void;
1128
1160
  canMoveElementsBottom(ids: Array<string>): any;
1129
1161
  moveElementsBottom(ids: Array<string>): void;
1162
+ setElementZIndex(id: any, zIndex: any): void;
1130
1163
  } & {
1131
1164
  moveElementUp(id: any): void;
1132
1165
  moveElementDown(id: any): void;
@@ -1164,6 +1197,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
1164
1197
  moveElementsDown(ids: Array<string>): void;
1165
1198
  canMoveElementsBottom(ids: Array<string>): any;
1166
1199
  moveElementsBottom(ids: Array<string>): void;
1200
+ setElementZIndex(id: any, zIndex: any): void;
1167
1201
  } & {
1168
1202
  moveElementUp(id: any): void;
1169
1203
  moveElementDown(id: any): void;
@@ -1212,7 +1246,7 @@ export declare const Store: import("mobx-state-tree").IModelType<{
1212
1246
  loadFont(fontFamily: any): Promise<void>;
1213
1247
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
1214
1248
  export declare type StoreType = Instance<typeof Store>;
1215
- interface StoreProps {
1249
+ export interface StoreProps {
1216
1250
  key: string;
1217
1251
  showCredit: boolean;
1218
1252
  }
package/model/store.js CHANGED
@@ -1 +1 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,o,s){void 0===s&&(s=o),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,s){void 0===s&&(s=o),e[s]=t[o]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&__createBinding(t,e,o);return __setModuleDefault(t,e),t},__rest=this&&this.__rest||function(e,t){var o={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(o[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(s=Object.getOwnPropertySymbols(e);n<s.length;n++)t.indexOf(s[n])<0&&Object.prototype.propertyIsEnumerable.call(e,s[n])&&(o[s[n]]=e[s[n]])}return o},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.createStore=exports.Store=exports.Font=exports.Page=exports.registerShapeModel=exports.SVGElement=exports.ImageElement=exports.TextElement=exports.Element=void 0;const mobx_state_tree_1=require("mobx-state-tree"),history_1=require("./history"),nanoid_1=require("nanoid"),konva_1=__importDefault(require("konva")),download_1=require("../utils/download"),pdf_1=require("../utils/pdf"),validate_key_1=require("../utils/validate-key"),fonts=__importStar(require("../utils/fonts")),svg_1=require("../utils/svg"),loader_1=require("../utils/loader");(0,mobx_state_tree_1.setLivelinessChecking)("ignore"),exports.Element=mobx_state_tree_1.types.model("Element",{id:mobx_state_tree_1.types.identifier,type:"none",x:0,y:0,rotation:0,opacity:1,visible:!0,locked:!1,blurEnabled:!1,blurRadius:10,brightnessEnabled:!1,brightness:0,sepiaEnabled:!1,grayscaleEnabled:!1,shadowEnabled:!1,shadowBlur:5,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"black",custom:mobx_state_tree_1.types.frozen(),selectable:!0,alwaysOnTop:!1,showInExport:!0}).preProcessSnapshot((e=>{const t=Object.assign(Object.assign({},e),{x:e.x||0,y:e.y||0});return"width"in e&&(t.width=t.width||1),"height"in e&&(t.height=t.height||1),t})).postProcessSnapshot((e=>{const t=Object.assign({},e),o={};for(var s in t)"_"!==s[0]&&(o[s]=e[s]);return o})).views((e=>({get page(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Page)},get store(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Store)}}))).actions((e=>({toJSON:()=>Object.assign({},(0,mobx_state_tree_1.getSnapshot)(e))}))).actions((e=>({clone(t){const o=e.toJSON();return t.id=t.id||(0,nanoid_1.nanoid)(10),Object.assign(o,t),e.page.addElement(o)},set(t){Object.assign(e,t)},moveUp(){e.page.moveElementsUp([e.id])},moveTop(){e.page.moveElementsTop([e.id])},moveDown(){e.page.moveElementsDown([e.id])},moveBottom(){e.page.moveElementsBottom([e.id])},beforeDestroy(){e.store.history.endTransaction()}}))),exports.TextElement=exports.Element.named("Text").props({type:"text",text:"",placeholder:"",fontSize:14,fontFamily:"Roboto",fontStyle:"normal",fontWeight:"normal",textDecoration:"",fill:"black",align:"center",width:100,height:14,strokeWidth:0,stroke:"black",lineHeight:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.union(mobx_state_tree_1.types.number,mobx_state_tree_1.types.string),1.2),letterSpacing:0,_editModeEnabled:!1}).preProcessSnapshot((e=>Object.assign({},e))).actions((e=>({toggleEditMode(t){e._editModeEnabled=null!=t?t:!e._editModeEnabled,e._editModeEnabled?e.store.history.startTransaction():e.store.history.endTransaction()}}))),exports.ImageElement=exports.Element.named("Image").props({type:"image",width:100,height:100,src:"",cropX:0,cropY:0,cropWidth:1,cropHeight:1,cornerRadius:0,flipX:!1,flipY:!1,clipSrc:"",borderColor:"black",borderSize:0,_cropModeEnabled:!1}).actions((e=>({toggleCropMode(t){e._cropModeEnabled=null!=t?t:!e._cropModeEnabled,e._cropModeEnabled?e.store.history.startTransaction():e.store.history.endTransaction()}}))),exports.SVGElement=exports.Element.named("SVG").props({type:"svg",src:"",maskSrc:"",__svgString:"",cropX:0,cropY:0,cropWidth:1,cropHeight:1,keepRatio:!0,flipX:!1,flipY:!1,width:100,height:100,borderColor:"black",borderSize:0,colorsReplace:mobx_state_tree_1.types.map(mobx_state_tree_1.types.string)}).preProcessSnapshot((e=>Object.assign(Object.assign({},e),{src:e.src||e.svgSource}))).views((e=>({get colors(){return e.__svgString?(0,svg_1.getColors)(e.__svgString):[]},get __finalSrc(){return e.__svgString?(0,svg_1.replaceColors)(e.__svgString,e.colorsReplace):this.src},get __isLoaded(){if(!e.__svgString)return!1;return!(Array.from(e.colorsReplace.keys()).length>0)||e.__finalSrc!==e.src}}))).actions((e=>{let t=()=>{};return{async _loadSVG(){if(!e.src)return;const t=await(0,svg_1.urlToString)(e.src);(0,mobx_state_tree_1.isAlive)(e)&&(0,mobx_state_tree_1.hasParent)(e)&&e.store.history.ignore((()=>{e.set({__svgString:(0,svg_1.fixSize)(t)})}))},async afterCreate(){e._loadSVG();let o=e.src;t=(0,mobx_state_tree_1.onSnapshot)(e,(t=>{t.src===o&&e.__svgString||(e._loadSVG(),o=e.src)}))},beforeDestroy(){t()},replaceColor(t,o){e.colorsReplace.set(t,o)}}}));const TYPES_MAP={svg:exports.SVGElement,text:exports.TextElement,image:exports.ImageElement},ADDITIONAL_TYPES=[];function registerShapeModel(e){const t=e.type;if(!t)throw new Error('You must pass "type" attribute to custom model.');const o=exports.Element.named(t).props(e);TYPES_MAP[t]=o,ADDITIONAL_TYPES.push(o)}exports.registerShapeModel=registerShapeModel;const additionalTypesUnion=[...new Array(20)].map(((e,t)=>mobx_state_tree_1.types.late((()=>ADDITIONAL_TYPES[t])))),ElementTypes=mobx_state_tree_1.types.union({dispatcher:e=>{const t=TYPES_MAP[e.type];if(!t)throw new Error(`Unknown element type: "${e.type}"`);return t}},exports.SVGElement,exports.TextElement,exports.ImageElement,...additionalTypesUnion);function createStore({key:e,showCredit:t}={key:"",showCredit:!1}){const o=exports.Store.create();return(0,validate_key_1.validateKey)(e,t),o}exports.Page=mobx_state_tree_1.types.model("Page",{id:mobx_state_tree_1.types.identifier,children:mobx_state_tree_1.types.array(ElementTypes),width:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.union(mobx_state_tree_1.types.number,mobx_state_tree_1.types.literal("auto")),"auto"),height:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.union(mobx_state_tree_1.types.number,mobx_state_tree_1.types.literal("auto")),"auto"),background:"white",bleed:0,custom:mobx_state_tree_1.types.frozen(),_exporting:!1}).postProcessSnapshot((e=>{const t=Object.assign({},e),o={};for(var s in t)"_"!==s[0]&&(o[s]=e[s]);return o})).views((e=>({get store(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Store)}}))).views((e=>({get computedWidth(){return"auto"===e.width?e.store.width:e.width},get computedHeight(){return"auto"===e.height?e.store.height:e.height}}))).actions((e=>({toJSON:()=>JSON.parse(JSON.stringify((0,mobx_state_tree_1.getSnapshot)(e))),_forEachElementUp(t,o){const s=t.map((t=>({id:t,index:e.children.findIndex((e=>e.id===t))})));s.sort(((e,t)=>t.index-e.index));for(const{index:n}of s){if(-1==n)continue;const s=n<e.children.length-1&&e.children[n+1],a=t.indexOf(null==s?void 0:s.id)>=0;n===e.children.length-1||a||o(n)}},_forEachElementDown(t,o){const s=t.map((t=>({id:t,index:e.children.findIndex((e=>e.id===t))})));s.sort(((e,t)=>e.index-t.index));for(const{index:n}of s){if(-1==n)continue;const s=n>0&&e.children[n-1],a=t.indexOf(null==s?void 0:s.id)>=0;0===n||a||o(n)}return!1}}))).actions((e=>({clone(t){const o=e.toJSON();o.children.forEach((e=>{e.id=(0,nanoid_1.nanoid)(10)}));const s=Object.assign(Object.assign(Object.assign({},o),{id:(0,nanoid_1.nanoid)(10)}),t),n=e.store.addPage(s),a=e.store.pages.indexOf(e);n.setZIndex(a+1),n.select()},setZIndex(t){e.store.setPageZIndex(e.id,t)},set(t){Object.assign(e,t)},select(){e.store.selectPage(e.id)},addElement(t){const o=TYPES_MAP[t.type];if(!o)return void console.error("Can not find model with type "+t.type);const s=o.create(Object.assign({id:(0,nanoid_1.nanoid)(10)},t));return e.children.push(s),s.selectable&&e.store.selectElements([s.id]),s},canMoveElementsUp(t){let o=!1;return e._forEachElementUp(t,(()=>{o=o||!0})),o},moveElementsUp(t){e._forEachElementUp(t,(t=>{const o=e.children[t];(0,mobx_state_tree_1.detach)(o),e.children.splice(t+1,0,o)}))},canMoveElementsTop(e){return this.canMoveElementsUp(e)},moveElementsTop(t){const o=[],s=[];e.children.forEach((e=>{t.indexOf(e.id)>=0?o.push(e):s.push(e)})),e.children.replace(s.concat(o))},canMoveElementsDown(t){let o=!1;return e._forEachElementDown(t,(()=>{o=o||!0})),o},moveElementsDown(t){e._forEachElementDown(t,(t=>{const o=e.children[t];(0,mobx_state_tree_1.detach)(o),e.children.splice(t-1,0,o)}))},canMoveElementsBottom(e){return this.canMoveElementsDown(e)},moveElementsBottom(t){const o=[],s=[];e.children.forEach((e=>{t.indexOf(e.id)>=0?o.push(e):s.push(e)})),e.children.replace(o.concat(s))}}))).actions((e=>({moveElementUp(t){console.warn("page.moveElementUp(id) is deprecated. Please use page.moveElementsUp([id1, id2]) instead."),e.moveElementsUp([t])},moveElementDown(t){console.warn("page.moveElementDown(id) is deprecated. Please use page.moveElementsDown([id1, id2]) instead."),e.moveElementsDown([t])},moveElementTop(t){console.warn("page.moveElementTop(id) is deprecated. Please use page.moveElementsTop([id1, id2]) instead."),e.moveElementsTop([t])},moveElementBottom(t){console.warn("page.moveElementBottom(id) is deprecated. Please use page.moveElementsBottom([id1, id2]) instead."),e.moveElementsBottom([t])}}))),exports.Font=mobx_state_tree_1.types.model("Font",{fontFamily:mobx_state_tree_1.types.string,url:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.string,""),styles:mobx_state_tree_1.types.frozen()}).preProcessSnapshot((e=>Object.assign(Object.assign({},e),{fontFamily:e.fontFamily||e.name}))),exports.Store=mobx_state_tree_1.types.model("Store",{role:"",pages:mobx_state_tree_1.types.array(exports.Page),fonts:mobx_state_tree_1.types.array(exports.Font),width:1080,height:1080,scale:1,scaleToFit:1,_bleedVisible:!1,openedSidePanel:"",selectedElementsIds: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:2,_activePageId:""}).views((e=>({get selectedElements(){return e.selectedElementsIds.map((t=>{for(const o of e.pages)for(const e of o.children)if(e.id===t)return e})).filter((e=>!!e))},get activePage(){return e.pages.slice().find((t=>t.id===e._activePageId))||(e.pages.length?e.pages[0]:null)}}))).actions((e=>({setRole(t){e.role=t},getElementById(t){for(const o of e.pages)for(const e of o.children)if(e.id===t)return e},addPage(t){const o=exports.Page.create(Object.assign({id:(0,nanoid_1.nanoid)(10)},t));return e.pages.push(o),e._activePageId=o.id,o},selectPage(t){e._activePageId=t},selectElements(t){e.selectedElementsIds=(0,mobx_state_tree_1.cast)(t)},_toggleBleed(t){e._bleedVisible=null!=t?t:!e._bleedVisible},openSidePanel(t){e.openedSidePanel=t},setScale(t){e.scale=t},_setScaleToFit(t){e.scaleToFit=t},setElementsPixelRatio(t){e._elementsPixelRatio=t},setSize(t,o,s){if(s){const s=t/e.width,n=o/e.height;for(const t of e.pages)for(const e of t.children)e.set({x:e.x*s,y:e.y*n}),"text"===e.type?e.set({fontSize:e.fontSize*s,width:Math.max(e.width*s,2)}):"image"===e.type?e.set({width:e.width*s,height:e.height*n}):"svg"===e.type&&e.set({width:Math.max(e.width*s,2),height:Math.max(e.height*s,2)})}e.width=t,e.height=o},setPageZIndex(t,o){const s=e.pages.find((e=>e.id===t));s&&((0,mobx_state_tree_1.detach)(s),e.pages.remove(s),e.pages.splice(o,0,s))},deletePages(t){const o=e.pages.indexOf(e.activePage);t.forEach((t=>{const o=e.pages.find((e=>e.id===t));(0,mobx_state_tree_1.destroy)(o)}));const s=Math.min(e.pages.length-1,o),n=e.pages[s];n&&(e._activePageId=n.id),e.selectedElementsIds=(0,mobx_state_tree_1.cast)(e.selectedElementsIds.filter((t=>e.getElementById(t))))},deleteElements(t){t.forEach((t=>{e.pages.forEach((e=>{const o=e.children.find((e=>e.id===t));o&&(0,mobx_state_tree_1.destroy)(o)}))})),e.selectedElementsIds=(0,mobx_state_tree_1.cast)([])},on(t,o){if("change"===t){let t=e.toJSON();return(0,mobx_state_tree_1.onSnapshot)(e,(s=>{const n=e.toJSON();JSON.stringify(n)!==JSON.stringify(t)&&(t=n,o(n))}))}},async toDataURL({pixelRatio:t,ignoreBackground:o,pageId:s,mimeType:n,includeBleed:a,quality:r}={}){var i;const l=t||1;s=s||(null===(i=e.pages[0])||void 0===i?void 0:i.id);const d=e.pages.find((e=>e.id===s));if(!d)throw new Error(`No page for export with id ${s}`);null==d||d.set({_exporting:!0}),await new Promise((e=>{setTimeout(e,0)})),await e.waitLoading();const c=konva_1.default.stages.find((e=>e.getAttr("pageId")===s));if(!c)throw new Error(`Export is failed. Can not find stage for page ${s}. Looks like <Workspace /> component is not mounted, but it is required in order to process the export.`);const p=c.findOne(".page-container");c.find("Transformer").forEach((e=>e.visible(!1))),p.findOne(".page-background").shadowEnabled(!1),p.findOne(".page-background").strokeEnabled(!1),p.find(".highlighter").forEach((e=>e.visible(!1)));const _=p.findOne(".page-background-group"),m=_.clip();_.clip({x:null,y:null,width:null,height:null});const g=p.find((e=>e.getAttr("hideInExport")));g.forEach((e=>{e.setAttr("oldVisible",e.visible()),e.hide()})),o&&p.findOne(".page-background").hide();const h=a?d.bleed:0;let f=h;e._bleedVisible&&a?f=0:e._bleedVisible&&!a&&(f=-d.bleed);const u=document.createElement("canvas");u.width=(d.computedWidth+2*h)*l,u.height=(d.computedHeight+2*h)*l;const b=u.getContext("2d");"image/jpeg"===n&&(b.fillStyle="white",b.fillRect(0,0,u.width,u.height));const x=p.toCanvas({x:p.x()-f*p.scaleX(),y:p.y()-f*p.scaleY(),width:(d.computedWidth+2*h)*p.scaleX(),height:(d.computedHeight+2*h)*p.scaleY(),pixelRatio:1/p.scaleX()*l});b.drawImage(x,0,0);const y=u.toDataURL(n,r);return o&&p.findOne(".page-background").show(),g.forEach((e=>{e.visible(e.getAttr("oldVisible"))})),p.findOne(".page-background").shadowEnabled(!0),p.findOne(".page-background").strokeEnabled(!0),c.find("Transformer").forEach((e=>e.visible(!0))),p.find(".highlighter").forEach((e=>e.visible(!0))),_.clip(m),null==d||d.set({_exporting:!1}),y},async saveAsImage(t={}){var{fileName:o}=t,s=__rest(t,["fileName"]);const n=s.mimeType||"image/png",a=n.split("/")[1];(0,download_1.downloadFile)(await e.toDataURL(s),o||"polotno."+a,n)},async _toPDF(t){const o=t.dpi||300,s=t.parallel||1,n=t.unit||"mm",a=t.pixelUnitRatio||25.4/o,r=t.pixelRatio||1,i=await(0,pdf_1.getJsPDF)(),l=e=>e*a,d=e.pages[0]||{},c=t.includeBleed?d.bleed:0,p=l(d.computedWidth+2*c),_=l(d.computedHeight+2*c);var m=new i({unit:n,orientation:p>_?"landscape":"portrait",format:[p,_],compress:!0});m.deletePage(1);const g=e._elementsPixelRatio;e.setElementsPixelRatio(r),await new Promise((e=>setTimeout(e)));const h=((e,t)=>{for(var o=[],s=0;s<e.length;s+=t)o.push(e.slice(s,s+t));return o})(e.pages,s);for(const o of h){const s=o.map((async o=>{const s=t.includeBleed?o.bleed:0,n=l(o.computedWidth+2*s),a=l(o.computedHeight+2*s);let i=0,d=r;for(;i<10;){i+=1,2===i&&console.error("Polotno can not export PDF with current settings. Quality is automatically reduced.");const s=await e.toDataURL(Object.assign(Object.assign({},t),{pageId:o.id,pixelRatio:d}));if(s.length>20)return{url:s,width:n,height:a};d*=.8}}));(await Promise.all(s)).forEach((({url:e,width:t,height:o})=>{m.addPage([t,o],t>o?"landscape":"portrait"),m.addImage(e,0,0,t,o,void 0,"FAST")}))}return e.setElementsPixelRatio(g),m},toPDFDataURL:async t=>(await e._toPDF(Object.assign({mimeType:"image/jpeg"},t))).output("datauristring"),async saveAsPDF(t={}){var{fileName:o}=t,s=__rest(t,["fileName"]);(await e._toPDF(Object.assign({mimeType:"image/jpeg"},s))).save(o||"polotno.pdf")},async waitLoading(){await(0,loader_1.whenLoaded)()},toJSON:()=>({width:e.width,height:e.height,fonts:(0,mobx_state_tree_1.getSnapshot)(e.fonts),pages:(0,mobx_state_tree_1.getSnapshot)(e.pages)}),loadJSON(t,o=!1){var s;const n=Object.assign({},t);e.pages.forEach((e=>e.children.forEach((e=>(0,mobx_state_tree_1.detach)(e)))));const a=e.pages.indexOf(e.activePage);let r=null===(s=n.pages[a]||n.pages[0])||void 0===s?void 0:s.id;e.pages=(0,mobx_state_tree_1.cast)([]),n._activePageId=r,n.scale=e.scale,n.openedSidePanel=e.openedSidePanel,n._bleedVisible=e._bleedVisible,o&&(n.history=e.history.toJSON()),(0,mobx_state_tree_1.applySnapshot)(e,n)},addFont(t){e.removeFont(t.fontFamily),e.fonts.push(t),e.loadFont(t.fontFamily)},removeFont(t){e.fonts.filter((e=>e.fontFamily===t)).forEach((e=>(0,mobx_state_tree_1.destroy)(e)))},async loadFont(t){const o=e.fonts.find((e=>e.fontFamily===t))||fonts.globalFonts.find((e=>e.fontFamily===t));o?fonts.injectCustomFont(o):fonts.injectGoogleFont(t),await fonts.loadFont(t)}}))),exports.createStore=createStore,exports.default=createStore;
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,o,s){void 0===s&&(s=o),Object.defineProperty(e,s,{enumerable:!0,get:function(){return t[o]}})}:function(e,t,o,s){void 0===s&&(s=o),e[s]=t[o]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var o in e)"default"!==o&&Object.prototype.hasOwnProperty.call(e,o)&&__createBinding(t,e,o);return __setModuleDefault(t,e),t},__rest=this&&this.__rest||function(e,t){var o={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(o[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(s=Object.getOwnPropertySymbols(e);n<s.length;n++)t.indexOf(s[n])<0&&Object.prototype.propertyIsEnumerable.call(e,s[n])&&(o[s[n]]=e[s[n]])}return o},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.createStore=exports.Store=exports.Font=exports.Page=exports.registerShapeModel=exports.SVGElement=exports.ImageElement=exports.TextElement=exports.Element=void 0;const mobx_state_tree_1=require("mobx-state-tree"),history_1=require("./history"),nanoid_1=require("nanoid"),konva_1=__importDefault(require("konva")),download_1=require("../utils/download"),pdf_1=require("../utils/pdf"),validate_key_1=require("../utils/validate-key"),fonts=__importStar(require("../utils/fonts")),svg_1=require("../utils/svg"),loader_1=require("../utils/loader");(0,mobx_state_tree_1.setLivelinessChecking)("ignore"),exports.Element=mobx_state_tree_1.types.model("Element",{id:mobx_state_tree_1.types.identifier,type:"none",name:"",x:0,y:0,rotation:0,opacity:1,visible:!0,locked:!1,blurEnabled:!1,blurRadius:10,brightnessEnabled:!1,brightness:0,sepiaEnabled:!1,grayscaleEnabled:!1,shadowEnabled:!1,shadowBlur:5,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"black",custom:mobx_state_tree_1.types.frozen(),selectable:!0,alwaysOnTop:!1,showInExport:!0}).preProcessSnapshot((e=>{const t=Object.assign(Object.assign({},e),{x:e.x||0,y:e.y||0});return"width"in e&&(t.width=t.width||1),"height"in e&&(t.height=t.height||1),t})).postProcessSnapshot((e=>{const t=Object.assign({},e),o={};for(var s in t)"_"!==s[0]&&(o[s]=e[s]);return o})).views((e=>({get page(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Page)},get store(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Store)}}))).actions((e=>({toJSON:()=>Object.assign({},(0,mobx_state_tree_1.getSnapshot)(e))}))).actions((e=>({clone(t){const o=e.toJSON();return t.id=t.id||(0,nanoid_1.nanoid)(10),Object.assign(o,t),e.page.addElement(o)},set(t){Object.assign(e,t)},moveUp(){e.page.moveElementsUp([e.id])},moveTop(){e.page.moveElementsTop([e.id])},moveDown(){e.page.moveElementsDown([e.id])},moveBottom(){e.page.moveElementsBottom([e.id])},beforeDestroy(){e.store.history.endTransaction()}}))),exports.TextElement=exports.Element.named("Text").props({type:"text",text:"",placeholder:"",fontSize:14,fontFamily:"Roboto",fontStyle:"normal",fontWeight:"normal",textDecoration:"",fill:"black",align:"center",width:100,height:14,strokeWidth:0,stroke:"black",lineHeight:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.union(mobx_state_tree_1.types.number,mobx_state_tree_1.types.string),1.2),letterSpacing:0,_editModeEnabled:!1}).preProcessSnapshot((e=>Object.assign({},e))).actions((e=>({toggleEditMode(t){e._editModeEnabled=null!=t?t:!e._editModeEnabled,e._editModeEnabled?e.store.history.startTransaction():e.store.history.endTransaction()}}))),exports.ImageElement=exports.Element.named("Image").props({type:"image",width:100,height:100,src:"",cropX:0,cropY:0,cropWidth:1,cropHeight:1,cornerRadius:0,flipX:!1,flipY:!1,clipSrc:"",borderColor:"black",borderSize:0,_cropModeEnabled:!1}).actions((e=>({toggleCropMode(t){e._cropModeEnabled=null!=t?t:!e._cropModeEnabled,e._cropModeEnabled?e.store.history.startTransaction():e.store.history.endTransaction()}}))),exports.SVGElement=exports.Element.named("SVG").props({type:"svg",src:"",maskSrc:"",__svgString:"",cropX:0,cropY:0,cropWidth:1,cropHeight:1,keepRatio:!0,flipX:!1,flipY:!1,width:100,height:100,borderColor:"black",borderSize:0,colorsReplace:mobx_state_tree_1.types.map(mobx_state_tree_1.types.string)}).preProcessSnapshot((e=>Object.assign(Object.assign({},e),{src:e.src||e.svgSource}))).views((e=>({get colors(){return e.__svgString?(0,svg_1.getColors)(e.__svgString):[]},get __finalSrc(){return e.__svgString?(0,svg_1.replaceColors)(e.__svgString,e.colorsReplace):this.src},get __isLoaded(){if(!e.__svgString)return!1;return!(Array.from(e.colorsReplace.keys()).length>0)||e.__finalSrc!==e.src}}))).actions((e=>{let t=()=>{};return{async _loadSVG(){if(!e.src)return;const t=await(0,svg_1.urlToString)(e.src);(0,mobx_state_tree_1.isAlive)(e)&&(0,mobx_state_tree_1.hasParent)(e)&&e.store.history.ignore((()=>{e.set({__svgString:(0,svg_1.fixSize)(t)})}))},async afterCreate(){e._loadSVG();let o=e.src;t=(0,mobx_state_tree_1.onSnapshot)(e,(t=>{t.src===o&&e.__svgString||(e._loadSVG(),o=e.src)}))},beforeDestroy(){t()},replaceColor(t,o){e.colorsReplace.set(t,o)}}}));const TYPES_MAP={svg:exports.SVGElement,text:exports.TextElement,image:exports.ImageElement},ADDITIONAL_TYPES=[];function registerShapeModel(e){const t=e.type;if(!t)throw new Error('You must pass "type" attribute to custom model.');const o=exports.Element.named(t).props(e);TYPES_MAP[t]=o,ADDITIONAL_TYPES.push(o)}exports.registerShapeModel=registerShapeModel;const additionalTypesUnion=[...new Array(20)].map(((e,t)=>mobx_state_tree_1.types.late((()=>ADDITIONAL_TYPES[t])))),ElementTypes=mobx_state_tree_1.types.union({dispatcher:e=>{const t=TYPES_MAP[e.type];if(!t)throw new Error(`Unknown element type: "${e.type}"`);return t}},exports.SVGElement,exports.TextElement,exports.ImageElement,...additionalTypesUnion);function createStore({key:e,showCredit:t}={key:"",showCredit:!1}){const o=exports.Store.create();return(0,validate_key_1.validateKey)(e,t),o}exports.Page=mobx_state_tree_1.types.model("Page",{id:mobx_state_tree_1.types.identifier,children:mobx_state_tree_1.types.array(ElementTypes),width:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.union(mobx_state_tree_1.types.number,mobx_state_tree_1.types.literal("auto")),"auto"),height:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.union(mobx_state_tree_1.types.number,mobx_state_tree_1.types.literal("auto")),"auto"),background:"white",bleed:0,custom:mobx_state_tree_1.types.frozen(),_exporting:!1}).postProcessSnapshot((e=>{const t=Object.assign({},e),o={};for(var s in t)"_"!==s[0]&&(o[s]=e[s]);return o})).views((e=>({get store(){return(0,mobx_state_tree_1.getParentOfType)(e,exports.Store)}}))).views((e=>({get computedWidth(){return"auto"===e.width?e.store.width:e.width},get computedHeight(){return"auto"===e.height?e.store.height:e.height}}))).actions((e=>({toJSON:()=>JSON.parse(JSON.stringify((0,mobx_state_tree_1.getSnapshot)(e))),_forEachElementUp(t,o){const s=t.map((t=>({id:t,index:e.children.findIndex((e=>e.id===t))})));s.sort(((e,t)=>t.index-e.index));for(const{index:n}of s){if(-1==n)continue;const s=n<e.children.length-1&&e.children[n+1],a=t.indexOf(null==s?void 0:s.id)>=0;n===e.children.length-1||a||o(n)}},_forEachElementDown(t,o){const s=t.map((t=>({id:t,index:e.children.findIndex((e=>e.id===t))})));s.sort(((e,t)=>e.index-t.index));for(const{index:n}of s){if(-1==n)continue;const s=n>0&&e.children[n-1],a=t.indexOf(null==s?void 0:s.id)>=0;0===n||a||o(n)}return!1}}))).actions((e=>({clone(t){const o=e.toJSON();o.children.forEach((e=>{e.id=(0,nanoid_1.nanoid)(10)}));const s=Object.assign(Object.assign(Object.assign({},o),{id:(0,nanoid_1.nanoid)(10)}),t),n=e.store.addPage(s),a=e.store.pages.indexOf(e);n.setZIndex(a+1),n.select()},setZIndex(t){e.store.setPageZIndex(e.id,t)},set(t){Object.assign(e,t)},select(){e.store.selectPage(e.id)},addElement(t){const o=TYPES_MAP[t.type];if(!o)return void console.error("Can not find model with type "+t.type);const s=o.create(Object.assign({id:(0,nanoid_1.nanoid)(10)},t));return e.children.push(s),s.selectable&&e.store.selectElements([s.id]),s},canMoveElementsUp(t){let o=!1;return e._forEachElementUp(t,(()=>{o=o||!0})),o},moveElementsUp(t){e._forEachElementUp(t,(t=>{const o=e.children[t];(0,mobx_state_tree_1.detach)(o),e.children.splice(t+1,0,o)}))},canMoveElementsTop(e){return this.canMoveElementsUp(e)},moveElementsTop(t){const o=[],s=[];e.children.forEach((e=>{t.indexOf(e.id)>=0?o.push(e):s.push(e)})),e.children.replace(s.concat(o))},canMoveElementsDown(t){let o=!1;return e._forEachElementDown(t,(()=>{o=o||!0})),o},moveElementsDown(t){e._forEachElementDown(t,(t=>{const o=e.children[t];(0,mobx_state_tree_1.detach)(o),e.children.splice(t-1,0,o)}))},canMoveElementsBottom(e){return this.canMoveElementsDown(e)},moveElementsBottom(t){const o=[],s=[];e.children.forEach((e=>{t.indexOf(e.id)>=0?o.push(e):s.push(e)})),e.children.replace(o.concat(s))},setElementZIndex(t,o){const s=e.children.find((e=>e.id===t));s&&((0,mobx_state_tree_1.detach)(s),e.children.remove(s),e.children.splice(o,0,s))}}))).actions((e=>({moveElementUp(t){console.warn("page.moveElementUp(id) is deprecated. Please use page.moveElementsUp([id1, id2]) instead."),e.moveElementsUp([t])},moveElementDown(t){console.warn("page.moveElementDown(id) is deprecated. Please use page.moveElementsDown([id1, id2]) instead."),e.moveElementsDown([t])},moveElementTop(t){console.warn("page.moveElementTop(id) is deprecated. Please use page.moveElementsTop([id1, id2]) instead."),e.moveElementsTop([t])},moveElementBottom(t){console.warn("page.moveElementBottom(id) is deprecated. Please use page.moveElementsBottom([id1, id2]) instead."),e.moveElementsBottom([t])}}))),exports.Font=mobx_state_tree_1.types.model("Font",{fontFamily:mobx_state_tree_1.types.string,url:mobx_state_tree_1.types.optional(mobx_state_tree_1.types.string,""),styles:mobx_state_tree_1.types.frozen()}).preProcessSnapshot((e=>Object.assign(Object.assign({},e),{fontFamily:e.fontFamily||e.name}))),exports.Store=mobx_state_tree_1.types.model("Store",{role:"",pages:mobx_state_tree_1.types.array(exports.Page),fonts:mobx_state_tree_1.types.array(exports.Font),width:1080,height:1080,scale:1,scaleToFit:1,_bleedVisible:!1,openedSidePanel:"",selectedElementsIds: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:2,_activePageId:""}).views((e=>({get selectedElements(){return e.selectedElementsIds.map((t=>{for(const o of e.pages)for(const e of o.children)if(e.id===t)return e})).filter((e=>!!e))},get activePage(){return e.pages.slice().find((t=>t.id===e._activePageId))||(e.pages.length?e.pages[0]:null)}}))).actions((e=>({setRole(t){e.role=t},getElementById(t){for(const o of e.pages)for(const e of o.children)if(e.id===t)return e},addPage(t){const o=exports.Page.create(Object.assign({id:(0,nanoid_1.nanoid)(10)},t));return e.pages.push(o),e._activePageId=o.id,o},selectPage(t){e._activePageId=t},selectElements(t){e.selectedElementsIds=(0,mobx_state_tree_1.cast)(t)},_toggleBleed(t){e._bleedVisible=null!=t?t:!e._bleedVisible},openSidePanel(t){e.openedSidePanel=t},setScale(t){e.scale=t},_setScaleToFit(t){e.scaleToFit=t},setElementsPixelRatio(t){e._elementsPixelRatio=t},setSize(t,o,s){if(s){const s=t/e.width,n=o/e.height;for(const t of e.pages)for(const e of t.children)e.set({x:e.x*s,y:e.y*n}),"text"===e.type?e.set({fontSize:e.fontSize*s,width:Math.max(e.width*s,2)}):"image"===e.type?e.set({width:e.width*s,height:e.height*n}):"svg"===e.type&&e.set({width:Math.max(e.width*s,2),height:Math.max(e.height*s,2)})}e.width=t,e.height=o},setPageZIndex(t,o){const s=e.pages.find((e=>e.id===t));s&&((0,mobx_state_tree_1.detach)(s),e.pages.remove(s),e.pages.splice(o,0,s))},deletePages(t){const o=e.pages.indexOf(e.activePage);t.forEach((t=>{const o=e.pages.find((e=>e.id===t));(0,mobx_state_tree_1.destroy)(o)}));const s=Math.min(e.pages.length-1,o),n=e.pages[s];n&&(e._activePageId=n.id),e.selectedElementsIds=(0,mobx_state_tree_1.cast)(e.selectedElementsIds.filter((t=>e.getElementById(t))))},deleteElements(t){t.forEach((t=>{e.pages.forEach((e=>{const o=e.children.find((e=>e.id===t));o&&(0,mobx_state_tree_1.destroy)(o)}))})),e.selectedElementsIds=(0,mobx_state_tree_1.cast)([])},on(t,o){if("change"===t){let t=e.toJSON();return(0,mobx_state_tree_1.onSnapshot)(e,(s=>{const n=e.toJSON();JSON.stringify(n)!==JSON.stringify(t)&&(t=n,o(n))}))}},async toDataURL({pixelRatio:t,ignoreBackground:o,pageId:s,mimeType:n,includeBleed:a,quality:r}={}){var i;const l=t||1;s=s||(null===(i=e.pages[0])||void 0===i?void 0:i.id);const d=e.pages.find((e=>e.id===s));if(!d)throw new Error(`No page for export with id ${s}`);null==d||d.set({_exporting:!0}),await new Promise((e=>{setTimeout(e,0)})),await e.waitLoading();const c=konva_1.default.stages.find((e=>e.getAttr("pageId")===s));if(!c)throw new Error(`Export is failed. Can not find stage for page ${s}. Looks like <Workspace /> component is not mounted, but it is required in order to process the export.`);const p=c.findOne(".page-container");c.find("Transformer").forEach((e=>e.visible(!1))),p.findOne(".page-background").shadowEnabled(!1),p.findOne(".page-background").strokeEnabled(!1),p.find(".highlighter").forEach((e=>e.visible(!1)));const _=p.findOne(".page-background-group"),m=_.clip();_.clip({x:null,y:null,width:null,height:null});const g=p.find((e=>e.getAttr("hideInExport")));g.forEach((e=>{e.setAttr("oldVisible",e.visible()),e.hide()})),o&&p.findOne(".page-background").hide();const h=a?d.bleed:0;let f=h;e._bleedVisible&&a?f=0:e._bleedVisible&&!a&&(f=-d.bleed);const u=document.createElement("canvas");u.width=(d.computedWidth+2*h)*l,u.height=(d.computedHeight+2*h)*l;const b=u.getContext("2d");"image/jpeg"===n&&(b.fillStyle="white",b.fillRect(0,0,u.width,u.height));const x=p.toCanvas({x:p.x()-f*p.scaleX(),y:p.y()-f*p.scaleY(),width:(d.computedWidth+2*h)*p.scaleX(),height:(d.computedHeight+2*h)*p.scaleY(),pixelRatio:1/p.scaleX()*l});b.drawImage(x,0,0);const y=u.toDataURL(n,r);return o&&p.findOne(".page-background").show(),g.forEach((e=>{e.visible(e.getAttr("oldVisible"))})),p.findOne(".page-background").shadowEnabled(!0),p.findOne(".page-background").strokeEnabled(!0),c.find("Transformer").forEach((e=>e.visible(!0))),p.find(".highlighter").forEach((e=>e.visible(!0))),_.clip(m),null==d||d.set({_exporting:!1}),y},async saveAsImage(t={}){var{fileName:o}=t,s=__rest(t,["fileName"]);const n=s.mimeType||"image/png",a=n.split("/")[1];(0,download_1.downloadFile)(await e.toDataURL(s),o||"polotno."+a,n)},async _toPDF(t){const o=t.dpi||300,s=t.parallel||1,n=t.unit||"mm",a=t.pixelUnitRatio||25.4/o,r=t.pixelRatio||1,i=await(0,pdf_1.getJsPDF)(),l=e=>e*a,d=e.pages[0]||{},c=t.includeBleed?d.bleed:0,p=l(d.computedWidth+2*c),_=l(d.computedHeight+2*c);var m=new i({unit:n,orientation:p>_?"landscape":"portrait",format:[p,_],compress:!0});m.deletePage(1);const g=e._elementsPixelRatio;e.setElementsPixelRatio(r),await new Promise((e=>setTimeout(e)));const h=((e,t)=>{for(var o=[],s=0;s<e.length;s+=t)o.push(e.slice(s,s+t));return o})(e.pages,s);for(const o of h){const s=o.map((async o=>{const s=t.includeBleed?o.bleed:0,n=l(o.computedWidth+2*s),a=l(o.computedHeight+2*s);let i=0,d=r;for(;i<10;){i+=1,2===i&&console.error("Polotno can not export PDF with current settings. Quality is automatically reduced.");const s=await e.toDataURL(Object.assign(Object.assign({},t),{pageId:o.id,pixelRatio:d}));if(s.length>20)return{url:s,width:n,height:a};d*=.8}}));(await Promise.all(s)).forEach((({url:e,width:t,height:o})=>{m.addPage([t,o],t>o?"landscape":"portrait"),m.addImage(e,0,0,t,o,void 0,"FAST")}))}return e.setElementsPixelRatio(g),m},toPDFDataURL:async t=>(await e._toPDF(Object.assign({mimeType:"image/jpeg"},t))).output("datauristring"),async saveAsPDF(t={}){var{fileName:o}=t,s=__rest(t,["fileName"]);(await e._toPDF(Object.assign({mimeType:"image/jpeg"},s))).save(o||"polotno.pdf")},async waitLoading(){await(0,loader_1.whenLoaded)()},toJSON:()=>({width:e.width,height:e.height,fonts:(0,mobx_state_tree_1.getSnapshot)(e.fonts),pages:(0,mobx_state_tree_1.getSnapshot)(e.pages)}),loadJSON(t,o=!1){var s;const n=Object.assign({},t);e.pages.forEach((e=>e.children.forEach((e=>(0,mobx_state_tree_1.detach)(e)))));const a=e.pages.indexOf(e.activePage);let r=null===(s=n.pages[a]||n.pages[0])||void 0===s?void 0:s.id;e.pages=(0,mobx_state_tree_1.cast)([]),n._activePageId=r,n.scale=e.scale,n.openedSidePanel=e.openedSidePanel,n._bleedVisible=e._bleedVisible,o&&(n.history=e.history.toJSON()),(0,mobx_state_tree_1.applySnapshot)(e,n)},addFont(t){e.removeFont(t.fontFamily),e.fonts.push(t),e.loadFont(t.fontFamily)},removeFont(t){e.fonts.filter((e=>e.fontFamily===t)).forEach((e=>(0,mobx_state_tree_1.destroy)(e)))},async loadFont(t){const o=e.fonts.find((e=>e.fontFamily===t))||fonts.globalFonts.find((e=>e.fontFamily===t));o?fonts.injectCustomFont(o):fonts.injectGoogleFont(t),await fonts.loadFont(t)}}))),exports.createStore=createStore,exports.default=createStore;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "polotno",
3
- "version": "0.40.0",
3
+ "version": "0.41.2",
4
4
  "description": "Design Editor Framework",
5
5
  "author": "Anton Lavrenov",
6
6
  "keywords": [
@@ -25,7 +25,9 @@
25
25
  "react-color": "^2.19.3",
26
26
  "react-konva": "^17.0.2-5",
27
27
  "react-konva-utils": "0.2.0",
28
+ "react-sortablejs": "^6.1.1",
28
29
  "react-window": "^1.8.6",
30
+ "sortablejs": "^1.14.0",
29
31
  "swr": "^1.2.2",
30
32
  "typescipt": "^1.0.0",
31
33
  "use-image": "^1.0.10"