polotno 2.8.3 → 2.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/canvas/html-element.js +1 -1
- package/canvas/image-element.js +1 -1
- package/canvas/text-element.js +1 -1
- package/canvas/video-element.js +1 -1
- package/canvas/workspace-canvas.js +1 -1
- package/model/shape-model.js +1 -1
- package/package.json +1 -1
- package/polotno.bundle.js +56 -55
- package/side-panel/animations-panel.d.ts +12 -0
- package/side-panel/animations-panel.js +1 -0
- package/side-panel/effects-panel.d.ts +12 -0
- package/side-panel/effects-panel.js +1 -0
- package/side-panel/image-clip-panel.js +1 -1
- package/side-panel/side-panel.js +2 -2
- package/toolbar/animations-picker.d.ts +2 -1
- package/toolbar/animations-picker.js +1 -1
- package/toolbar/element-container.js +1 -1
- package/toolbar/filters-picker.d.ts +2 -1
- package/toolbar/filters-picker.js +1 -1
- package/toolbar/history-buttons.js +1 -1
- package/toolbar/position-picker.js +1 -1
- package/toolbar/toolbar.js +3 -2
- package/utils/animations.d.ts +17 -0
- package/utils/animations.js +1 -1
- package/utils/l10n.d.ts +6 -0
- package/utils/l10n.js +1 -1
- package/utils/math.d.ts +7 -0
- package/utils/math.js +1 -1
package/canvas/html-element.js
CHANGED
|
@@ -9,4 +9,4 @@
|
|
|
9
9
|
.ql-direction-rtl {
|
|
10
10
|
direction: rtl;
|
|
11
11
|
}
|
|
12
|
-
`,createQuill=e=>new quill_1.default(e,{toolbar:!1,keyboard:!1,clipboard:{matchVisual:!1},formats:["background","bold","color","font","italic","size","strike","underline","indent","list","align","direction"]});exports.createQuill=createQuill;const RichEditor=({html:e,onBlur:t,onChange:i,element:r})=>{const a=react_1.default.useRef(null);react_1.default.useEffect((()=>{if(!a.current)return;const e=(0,exports.createQuill)(a.current);return exports.quillRef.editor.instance=e,window.__polotnoQuill=e,e.on("text-change",(()=>{e.getSelection()&&(exports.quillRef.currentFormat=e.getFormat()),setTimeout((()=>{var e;i(null===(e=a.current)||void 0===e?void 0:e.childNodes[0].innerHTML)}),10)})),e.setSelection(0,0,"api"),e.on("selection-change",(i=>{i||t(),i&&(exports.quillRef.currentFormat=e.getFormat())})),a.current.childNodes[0].addEventListener("blur",(e=>{var i;(null===(i=e.relatedTarget)||void 0===i?void 0:i.classList.contains("ql-clipboard"))||t()})),()=>{exports.quillRef.editor.instance=null,exports.quillRef.currentFormat={},delete window.__polotnoQuill}}),[]),react_1.default.useEffect((()=>{var t;const i=exports.quillRef.editor.instance;if(!i)return;const n=i.getSelection();if(!((null===(t=a.current)||void 0===t?void 0:t.childNodes[0].innerHTML)===r.text)){var o=i.clipboard.convert("<div class='ql-editor' style='outline: none;'>"+e+"<p><br></p></div>");i.setContents(o),i.history.clear(),n&&(i.setSelection(n.index,n.length),exports.quillRef.currentFormat=i.getFormat())}}),[r.text]);const n={color:r.fill};return r.fill.indexOf("gradient")>=0&&(n["background-color"]=r.fill,n["background-image"]=r.fill,n["background-size"]="100% 100%",n["background-repeat"]="repeat",n["-webkit-background-clip"]="text",n["-moz-background-clip"]="text",n["-webkit-text-fill-color"]="transparent",n["-moz-text-fill-color"]="transparent"),react_1.default.createElement(RichTextContainer,{ref:a,style:Object.assign(Object.assign({},n),{fontSize:r.fontSize,width:r.a.width,fontFamily:r.fontFamily,lineHeight:r.lineHeight,letterSpacing:r.letterSpacing+"rem",textAlign:r.align}),dir:(0,text_element_1.getDir)((0,text_1.removeTags)(r.text))})};function useHtmlSize(e,t,i){return react_1.default.useMemo((()=>(0,html2canvas_1.detectSize)(e)),[e,t.width,i])}function hasNonTransparentPixel(e){const t=e.getContext("2d").getImageData(0,0,e.width,e.height).data;for(let e=0;e<t.length;e+=4)if(0!==t[e+3])return!0;return!1}function isCanvasBlank(e){return!hasNonTransparentPixel(e)}function getHtml(e,{fontFamily:t="",color:i="black"}={}){let r=`color: ${i||e.fill}`;return e.fill.indexOf("gradient")>=0&&(r=`\n background-color: ${i};\n background-image: ${e.fill};\n background-size: 100% 100%;\n background-repeat: repeat;\n -webkit-background-clip: text;\n -moz-background-clip: text;\n -webkit-text-fill-color: transparent;\n -moz-text-fill-color: transparent;\n `),`<div style="white-space: unset; width: ${Math.round(e.width||100)}px; ${r}; font-size: ${e.fontSize}px; font-family: '${t}'; text-decoration: ${e.textDecoration}; text-align: ${e.align}; line-height: ${e.lineHeight}; letter-spacing: ${e.letterSpacing}rem; font-style: ${e.fontStyle}; font-weight: ${e.fontWeight}; -webkit-text-stroke: ${e.strokeWidth}px ${e.stroke};" contentEditable dir="${(0,text_element_1.getDir)((0,text_1.removeTags)(e.text))}">${e.text.replaceAll("\n","</br>")}</div>`}const findFitFontSize=e=>{let t=e.fontSize;for(let i=1;i<50;i++){const i=getHtml(Object.assign(Object.assign({},e.toJSON()),{fontSize:t}),{fontFamily:e.fontFamily}),{height:r}=(0,html2canvas_1.detectSize)(i);if(!(e.height&&r>e.height))break;t-=.5}return t},isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);exports.HTMLElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const i=react_1.default.useRef(null),[r,a]=react_1.default.useState(),[n,o]=react_1.default.useState(!1),[l,s]=react_1.default.useState(!0),[c,d]=react_1.default.useState(!1),u=react_1.default.useRef(e.height),f=t.selectedElements.indexOf(e)>=0,h=e.fontSize/3,{textVerticalResizeEnabled:g}=flags_1.flags,_=(0,text_element_1.usePrevious)(e.fontFamily),[m]=(0,text_element_1.useFontLoader)(t,e.fontFamily),x=e._editModeEnabled;(0,use_fadein_1.useFadeIn)(i);const p=m?e.fontFamily:_!==e.fontFamily?_:"Arial",b=(0,use_color_1.useColor)(e).fill,y=getHtml(e,{fontFamily:p,color:b}),{width:v,height:w}=useHtmlSize(y,e,m);react_1.default.useEffect((()=>{if(!m)return;if(!e.height)return void e.set({height:w});const{textOverflow:i}=flags_1.flags;if("change-font-size"!==i||n)"resize"===i&&(g&&e.height<w&&t.history.ignore((()=>{e.set({height:w})})),g||e.height===w||t.history.ignore((()=>{e.set({height:w})})));else{const i=findFitFontSize(e);i!==e.fontSize?t.history.ignore((()=>{e.set({fontSize:i})})):e.height!==w&&(g&&e.height<w?t.history.ignore((()=>{e.set({height:w})})):g||t.history.ignore((()=>{e.set({height:w})})))}}));const k=react_1.default.useRef(0);react_1.default.useEffect((()=>{n||x||(async()=>{k.current++;const i=k.current,r=(0,loader_1.incrementLoader)(`text ${e.id}`);s(!0);let n=null;const o=isSafari?5:1;for(let a=0;a<o;a++){if(n=await(0,html2canvas_1.htmlToCanvas)({html:y,width:e.width||1,height:e.height||w||1,fontFamily:p,padding:h,pixelRatio:t._elementsPixelRatio,font:t.fonts.find((e=>e.fontFamily===p))||fonts.globalFonts.find((e=>e.fontFamily===p))}),i!==k.current)return void r();isCanvasBlank(n)&&isSafari&&await new Promise((e=>setTimeout(e,50*(a+1))))}n?(a(n),s(!1),konva_1.default.Util.requestAnimFrame(r)):r()})()}),[y,n,w,x,p,e.height,t._elementsPixelRatio]);const S=n||l;react_1.default.useEffect((()=>mobx.autorun((()=>{const t=i.current;(0,apply_filters_1.applyFilter)(t,e)}))),[r,S,e.shadowColor,e.shadowOffsetX,e.shadowOffsetY,e.shadowOpacity]);let E=0;"middle"===e.verticalAlign&&(E=(e.height-w)/2),"bottom"===e.verticalAlign&&(E=e.height-w);const z=(0,text_element_1.getLineHeight)({fontLoaded:m,fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:e.lineHeight}),q=(0,screen_1.useMobile)();return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,{x:e.a.x,y:e.a.y,offsetX:e.backgroundPadding*(e.fontSize*z*.5),offsetY:e.backgroundPadding*(e.fontSize*z*.5),rotation:e.rotation,hideInExport:!e.showInExport,listening:!1,visible:e.backgroundEnabled,opacity:e.backgroundOpacity,fill:e.backgroundColor,width:e.a.width+e.backgroundPadding*(e.fontSize*z),height:e.a.height+e.backgroundPadding*(e.fontSize*z),cornerRadius:e.backgroundCornerRadius*(e.fontSize*z*.5)}),react_1.default.createElement(react_konva_1.Rect,{ref:i,name:"element",x:e.a.x,y:e.a.y,listening:e.selectable,rotation:e.rotation,width:e.a.width,height:e.a.height,visible:!S,draggable:q?e.draggable&&f:e.draggable,preventDefault:!q||f,opacity:x?0:e.a.opacity,hideInExport:!e.showInExport,onMouseEnter:()=>{d(!0)},onMouseLeave:()=>{d(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},id:e.id,onDblClick:()=>{e.contentEditable&&e.toggleEditMode(!0)},onDblTap:()=>{e.contentEditable&&e.toggleEditMode(!0)},onTransformStart:t=>{o(!0),u.current=e.height},onTransform:t=>{var i;const r=t.target,a=(null===(i=r.getStage())||void 0===i?void 0:i.findOne("Transformer")).getActiveAnchor(),n="middle-left"===a||"middle-right"===a,o="top-center"===a||"bottom-center"===a,l=r.scaleX();if(n){const t=r.scaleX(),i=Math.max(r.width()*t,e.fontSize);if(r.width(i),r.scaleX(1),flags_1.flags.textVerticalResizeEnabled){const t=Math.max(w,u.current);e.set({height:t})}e.set({width:i,x:r.x(),y:r.y()})}else if(o){let i="resize"===flags_1.flags.textOverflow?w:e.lineHeight*e.fontSize;const a=Math.max(i,t.target.height()*t.target.scaleY());r.scaleY(1),e.set({x:r.x(),y:r.y(),height:a,rotation:r.rotation()})}else r.scaleX(1),r.scaleY(1),e.set({fontSize:e.fontSize*l,width:r.width()*l,x:r.x(),y:r.y(),rotation:r.rotation(),height:r.height()*l})},onTransformEnd:t=>{o(!1),s(!0);const i=t.target.scaleX();t.target.scaleX(1),t.target.scaleY(1),e.set({fontSize:e.fontSize*i,width:t.target.width()*i,x:t.target.x(),y:t.target.y(),rotation:t.target.rotation(),shadowBlur:e.shadowBlur*i,shadowOffsetX:e.shadowOffsetX*i,shadowOffsetY:e.shadowOffsetY*i,strokeWidth:e.strokeWidth*i})}}),react_1.default.createElement(react_konva_1.Image,{ref:i,image:r,x:e.a.x,y:e.a.y,offsetX:h,offsetY:h-E,listening:!1,rotation:e.rotation,width:e.a.width+2*h,height:e.a.height+2*h,visible:!S,opacity:x?0:e.a.opacity,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,hideInExport:!e.showInExport}),S&&react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.rotation,offsetY:-E},react_1.default.createElement(react_konva_utils_1.Html,{divProps:{style:{pointerEvents:"none"}}},react_1.default.createElement(RichTextContainer,{dangerouslySetInnerHTML:{__html:y},style:{pointerEvents:"none",display:"inline-block"}}))),x&&react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.rotation,offsetY:-E},react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement(RichEditor,{html:y,element:e,onChange:t=>{e.set({text:t})},onBlur:t=>{e.toggleEditMode(!1)}}))),(f||c)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
|
|
12
|
+
`,createQuill=e=>new quill_1.default(e,{toolbar:!1,keyboard:!1,clipboard:{matchVisual:!1},formats:["background","bold","color","font","italic","size","strike","underline","indent","list","align","direction"]});exports.createQuill=createQuill;const RichEditor=({html:e,onBlur:t,onChange:i,element:r})=>{const a=react_1.default.useRef(null);react_1.default.useEffect((()=>{if(!a.current)return;const e=(0,exports.createQuill)(a.current);return exports.quillRef.editor.instance=e,window.__polotnoQuill=e,e.on("text-change",(()=>{e.getSelection()&&(exports.quillRef.currentFormat=e.getFormat()),setTimeout((()=>{var e;i(null===(e=a.current)||void 0===e?void 0:e.childNodes[0].innerHTML)}),10)})),e.setSelection(0,0,"api"),e.on("selection-change",(i=>{i||t(),i&&(exports.quillRef.currentFormat=e.getFormat())})),a.current.childNodes[0].addEventListener("blur",(e=>{var i;(null===(i=e.relatedTarget)||void 0===i?void 0:i.classList.contains("ql-clipboard"))||t()})),()=>{exports.quillRef.editor.instance=null,exports.quillRef.currentFormat={},delete window.__polotnoQuill}}),[]),react_1.default.useEffect((()=>{var t;const i=exports.quillRef.editor.instance;if(!i)return;const n=i.getSelection();if(!((null===(t=a.current)||void 0===t?void 0:t.childNodes[0].innerHTML)===r.text)){var o=i.clipboard.convert("<div class='ql-editor' style='outline: none;'>"+e+"<p><br></p></div>");i.setContents(o),i.history.clear(),n&&(i.setSelection(n.index,n.length),exports.quillRef.currentFormat=i.getFormat())}}),[r.text]);const n={color:r.fill};return r.fill.indexOf("gradient")>=0&&(n["background-color"]=r.fill,n["background-image"]=r.fill,n["background-size"]="100% 100%",n["background-repeat"]="repeat",n["-webkit-background-clip"]="text",n["-moz-background-clip"]="text",n["-webkit-text-fill-color"]="transparent",n["-moz-text-fill-color"]="transparent"),react_1.default.createElement(RichTextContainer,{ref:a,style:Object.assign(Object.assign({},n),{fontSize:r.fontSize,width:r.a.width,fontFamily:r.fontFamily,lineHeight:r.lineHeight,letterSpacing:r.letterSpacing+"rem",textAlign:r.align}),dir:(0,text_element_1.getDir)((0,text_1.removeTags)(r.text))})};function useHtmlSize(e,t,i){return react_1.default.useMemo((()=>(0,html2canvas_1.detectSize)(e)),[e,t.width,i])}function hasNonTransparentPixel(e){const t=e.getContext("2d").getImageData(0,0,e.width,e.height).data;for(let e=0;e<t.length;e+=4)if(0!==t[e+3])return!0;return!1}function isCanvasBlank(e){return!hasNonTransparentPixel(e)}function getHtml(e,{fontFamily:t="",color:i="black"}={}){let r=`color: ${i||e.fill}`;return e.fill.indexOf("gradient")>=0&&(r=`\n background-color: ${i};\n background-image: ${e.fill};\n background-size: 100% 100%;\n background-repeat: repeat;\n -webkit-background-clip: text;\n -moz-background-clip: text;\n -webkit-text-fill-color: transparent;\n -moz-text-fill-color: transparent;\n `),`<div style="white-space: unset; width: ${Math.round(e.width||100)}px; ${r}; font-size: ${e.fontSize}px; font-family: '${t}'; text-decoration: ${e.textDecoration}; text-align: ${e.align}; line-height: ${e.lineHeight}; letter-spacing: ${e.letterSpacing}rem; font-style: ${e.fontStyle}; font-weight: ${e.fontWeight}; -webkit-text-stroke: ${e.strokeWidth}px ${e.stroke};" contentEditable dir="${(0,text_element_1.getDir)((0,text_1.removeTags)(e.text))}">${e.text.replaceAll("\n","</br>")}</div>`}const findFitFontSize=e=>{let t=e.fontSize;for(let i=1;i<50;i++){const i=getHtml(Object.assign(Object.assign({},e.toJSON()),{fontSize:t}),{fontFamily:e.fontFamily}),{height:r}=(0,html2canvas_1.detectSize)(i);if(!(e.height&&r>e.height))break;t-=.5}return t},isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);exports.HTMLElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const i=react_1.default.useRef(null),[r,a]=react_1.default.useState(),[n,o]=react_1.default.useState(!1),[l,s]=react_1.default.useState(!0),[c,d]=react_1.default.useState(!1),u=react_1.default.useRef(e.height),f=t.selectedElements.indexOf(e)>=0,h=e.fontSize/3,{textVerticalResizeEnabled:g}=flags_1.flags,_=(0,text_element_1.usePrevious)(e.fontFamily),[m]=(0,text_element_1.useFontLoader)(t,e.fontFamily),x=e._editModeEnabled;(0,use_fadein_1.useFadeIn)(i);const p=m?e.fontFamily:_!==e.fontFamily?_:"Arial",b=(0,use_color_1.useColor)(e).fill,y=getHtml(e,{fontFamily:p,color:b}),{width:v,height:w}=useHtmlSize(y,e,m);react_1.default.useEffect((()=>{if(!m)return;if(!e.height)return void e.set({height:w});const{textOverflow:i}=flags_1.flags;if("change-font-size"!==i||n)"resize"===i&&(g&&e.height<w&&t.history.ignore((()=>{e.set({height:w})})),g||e.height===w||t.history.ignore((()=>{e.set({height:w})})));else{const i=findFitFontSize(e);i!==e.fontSize?t.history.ignore((()=>{e.set({fontSize:i})})):e.height!==w&&(g&&e.height<w?t.history.ignore((()=>{e.set({height:w})})):g||t.history.ignore((()=>{e.set({height:w})})))}}));const k=react_1.default.useRef(0);react_1.default.useEffect((()=>{n||x||(async()=>{k.current++;const i=k.current,r=(0,loader_1.incrementLoader)(`text ${e.id}`);s(!0);let n=null;const o=isSafari?5:1;for(let a=0;a<o;a++){if(n=await(0,html2canvas_1.htmlToCanvas)({html:y,width:e.width||1,height:e.height||w||1,fontFamily:p,padding:h,pixelRatio:t._elementsPixelRatio,font:t.fonts.find((e=>e.fontFamily===p))||fonts.globalFonts.find((e=>e.fontFamily===p))}),i!==k.current)return void r();isCanvasBlank(n)&&isSafari&&await new Promise((e=>setTimeout(e,50*(a+1))))}n?(a(n),s(!1),konva_1.default.Util.requestAnimFrame(r)):r()})()}),[y,n,w,x,p,e.height,t._elementsPixelRatio]);const S=n||l;react_1.default.useEffect((()=>mobx.autorun((()=>{const t=i.current;(0,apply_filters_1.applyFilter)(t,e)}))),[r,S,e.shadowColor,e.shadowOffsetX,e.shadowOffsetY,e.shadowOpacity]);let E=0;"middle"===e.verticalAlign&&(E=(e.height-w)/2),"bottom"===e.verticalAlign&&(E=e.height-w);const z=(0,text_element_1.getLineHeight)({fontLoaded:m,fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:e.lineHeight}),q=(0,screen_1.useMobile)();return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,{x:e.a.x,y:e.a.y,offsetX:e.backgroundPadding*(e.fontSize*z*.5),offsetY:e.backgroundPadding*(e.fontSize*z*.5),rotation:e.a.rotation,hideInExport:!e.showInExport,listening:!1,visible:e.backgroundEnabled,opacity:e.backgroundOpacity*e.a.opacity,fill:e.backgroundColor,width:e.a.width+e.backgroundPadding*(e.fontSize*z),height:e.a.height+e.backgroundPadding*(e.fontSize*z),cornerRadius:e.backgroundCornerRadius*(e.fontSize*z*.5)}),react_1.default.createElement(react_konva_1.Rect,{ref:i,name:"element",x:e.a.x,y:e.a.y,listening:e.selectable,rotation:e.a.rotation,width:e.a.width,height:e.a.height,visible:!S,draggable:q?e.draggable&&f:e.draggable,preventDefault:!q||f,opacity:x?0:e.a.opacity,hideInExport:!e.showInExport,onMouseEnter:()=>{d(!0)},onMouseLeave:()=>{d(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},id:e.id,onDblClick:()=>{e.contentEditable&&e.toggleEditMode(!0)},onDblTap:()=>{e.contentEditable&&e.toggleEditMode(!0)},onTransformStart:t=>{o(!0),u.current=e.height},onTransform:t=>{var i;const r=t.target,a=(null===(i=r.getStage())||void 0===i?void 0:i.findOne("Transformer")).getActiveAnchor(),n="middle-left"===a||"middle-right"===a,o="top-center"===a||"bottom-center"===a,l=r.scaleX();if(n){const t=r.scaleX(),i=Math.max(r.width()*t,e.fontSize);if(r.width(i),r.scaleX(1),flags_1.flags.textVerticalResizeEnabled){const t=Math.max(w,u.current);e.set({height:t})}e.set({width:i,x:r.x(),y:r.y()})}else if(o){let i="resize"===flags_1.flags.textOverflow?w:e.lineHeight*e.fontSize;const a=Math.max(i,t.target.height()*t.target.scaleY());r.scaleY(1),e.set({x:r.x(),y:r.y(),height:a,rotation:r.rotation()})}else r.scaleX(1),r.scaleY(1),e.set({fontSize:e.fontSize*l,width:r.width()*l,x:r.x(),y:r.y(),rotation:r.rotation(),height:r.height()*l})},onTransformEnd:t=>{o(!1),s(!0);const i=t.target.scaleX();t.target.scaleX(1),t.target.scaleY(1),e.set({fontSize:e.fontSize*i,width:t.target.width()*i,x:t.target.x(),y:t.target.y(),rotation:t.target.rotation(),shadowBlur:e.shadowBlur*i,shadowOffsetX:e.shadowOffsetX*i,shadowOffsetY:e.shadowOffsetY*i,strokeWidth:e.strokeWidth*i})}}),react_1.default.createElement(react_konva_1.Image,{ref:i,image:r,x:e.a.x,y:e.a.y,offsetX:h,offsetY:h-E,listening:!1,rotation:e.rotation,width:e.a.width+2*h,height:e.a.height+2*h,visible:!S,opacity:x?0:e.a.opacity,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,hideInExport:!e.showInExport}),S&&react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.rotation,offsetY:-E},react_1.default.createElement(react_konva_utils_1.Html,{divProps:{style:{pointerEvents:"none"}}},react_1.default.createElement(RichTextContainer,{dangerouslySetInnerHTML:{__html:y},style:{pointerEvents:"none",display:"inline-block"}}))),x&&react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.rotation,offsetY:-E},react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement(RichEditor,{html:y,element:e,onChange:t=>{e.set({text:t})},onBlur:t=>{e.toggleEditMode(!1)}}))),(f||c)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
|
package/canvas/image-element.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,a,r){void 0===r&&(r=a);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 useFlip=(e,t,a)=>{const r=react_1.default.useMemo((()=>{var r,o;const{flipX:i,flipY:n}=e,h="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0,c=navigator.userAgent.toLowerCase().indexOf("firefox")>-1&&h||e.maskSrc;if(!i&&!n&&!c)return t;if(!t||!t.width||!t.height)return null;const d=createCanvas();let l=1;"svg"===e.type&&(l=Math.max(e.a.width/t.width*a,e.a.height/t.height*a)),d.width=Math.max(t.width*l,1),d.height=Math.max(t.height*l,1);let s=i?-d.width:0,u=n?-d.height:0;return null===(r=d.getContext("2d"))||void 0===r||r.scale(i?-1:1,n?-1:1),null===(o=d.getContext("2d"))||void 0===o||o.drawImage(t,s,u,d.width,d.height),d}),[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 h=new ImageData(t,a),c=new Int32Array(e.data.buffer),d=e.width,l=new Int32Array(h.data.buffer),s=h.width,u=t/i,g=a/n,f=Math.round(1/u),p=Math.round(1/g),_=f*p,m=0;m<h.height;m++)for(var w=0;w<s;w++){for(var x=r+Math.round(w/u)+(o+Math.round(m/g))*d,v=0,y=0,M=0,b=0,E=0;E<p;E++)for(var k=0;k<f;k++){var C=c[x+k+E*d];v+=C<<24>>>24,y+=C<<16>>>24,M+=C<<8>>>24,b+=C>>>24}v=Math.round(v/_),y=Math.round(y/_),M=Math.round(M/_),b=Math.round(b/_),l[w+m*s]=b<<24|M<<16|y<<8|v}return h}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 h=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(h,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])},useCornerRadiusAndCrop=(e,t,a,r,o=0,i=!1)=>{const n=Math.floor(Math.max(e.a.width*r,1)),h=Math.floor(Math.max(e.a.height*r,1)),c=Math.min(o*r,n/2,h/2),d=Math.max(e.a.width/a.width,e.a.height/a.height)*r,l=e.page._exportingOrRendering&&flags_1.flags.imageDownScalingEnabled&&d<1&&!i,s=0===a.x&&0===a.y&&a.width===(null==t?void 0:t.width)&&a.height===(null==t?void 0:t.height),u=react_1.default.useMemo((()=>{if(!t||!t.width||!t.height)return;return s&&0===c&&!l?void 0:createCanvas()}),[t,c,l,s]);return react_1.default.useLayoutEffect((()=>{if(!u||!t)return;u.width=n,u.height=h;const e=u.getContext("2d");if(!e)return;c&&(e.beginPath(),e.moveTo(c,0),e.lineTo(n-c,0),e.arc(n-c,c,c,3*Math.PI/2,0,!1),e.lineTo(n,h-c),e.arc(n-c,h-c,c,0,Math.PI/2,!1),e.lineTo(c,h),e.arc(c,h-c,c,Math.PI/2,Math.PI,!1),e.lineTo(0,c),e.arc(c,c,c,Math.PI,3*Math.PI/2,!1),e.clip());const r=l?downScaleCanvas(t,d):t,o=l?{x:Math.floor(a.x*d),y:Math.floor(a.y*d),width:Math.floor(a.width*d),height:Math.floor(a.height*d)}:a;e.drawImage(r,o.x,o.y,o.width,o.height,0,0,u.width,u.height)}),[u,e.a.width,e.a.height,a.x,a.y,a.width,a.height,o,r,i,e.page._exportingOrRendering,l]),react_1.default.useEffect((()=>()=>{u&&"CANVAS"===u.nodeName&&konva_1.default.Util.releaseCanvas(u)}),[u]),u||t},useClip=(e,t,a,r)=>{const o=useSizeFixer(e.clipSrc||""),[i,n]=useImageHook(o,"anonymous"),h=e.clipSrc?n:"loaded";(0,exports.useImageLoader)(h,e.id+"-clip");const c=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(!c)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),c.width=Math.max(t.width,1),c.height=Math.max(t.height,1);const h=c.getContext("2d");h&&(h.save(),h.drawImage(o,0,0,t.width,t.height),konva_1.default.Util.releaseCanvas(o),h.globalCompositeOperation="source-in",h.drawImage(t,0,0,c.width,c.height),h.restore())}),[c,t,i,e.a.width,e.a.height,a,...r]);return e.clipSrc&&i?c: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 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),h=svg.replaceColors(n,e.colorsReplace);t||(o.current=h,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),[h,c]=react_1.default.useState(!1),d=t.selectedElements.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=usePreviousImage({image:u,status:g,type:e.type}),_=useMask(e,useFlip(e,u||p,t._elementsPixelRatio))||PLACEHOLDER_CANVAS;let{cropX:m,cropY:w,cropWidth:x,cropHeight:v}=e;"loaded"!==g&&(m=w=0,x=v=1);const y=_.width*x,M=_.height*v,b=e.a.width/e.a.height;let E,k;const C=y/M,I="svg"===e.type;I?(E=y,k=M):b>=C?(E=y,k=y/b):(E=M*b,k=M);const S={x:_.width*m,y:_.height*w,width:E,height:k},R=null!==(a=e.cornerRadius)&&void 0!==a?a:0,O=e.page._exportingOrRendering?1:Math.min(2,t.scale),D=t._elementsPixelRatio*O;let L=useClip(e,useCornerRadiusAndCrop(e,_,S,D,R,r||e._cropModeEnabled||"svg"===e.type),D,[S,R,D]);const P=Math.max(e.a.width/E,e.a.height/k);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})}),[L,e.page._exportingOrRendering,r,x,v,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 X=react_1.default.useRef(null),Y=react_1.default.useRef(null),A=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(Y.current.nodes([X.current]),A.current.nodes([n.current]))}),[e._cropModeEnabled]);var H=react_1.default.useRef(null),T=react_1.default.useRef(0),W=react_1.default.useRef(!1);const q=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,E/r),n=Math.min(1,k/o),h=1-i,c=Math.min(h,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:-c*_.width,y:-l*_.height,scaleX:1,scaleY:1}),e.set({cropX:c,cropY:l,cropWidth:i,cropHeight:n})},F=()=>{"svg"!==e.type&&e.contentEditable&&setTimeout((()=>{e.toggleCropMode(!0)}))},z="svg"===e.type&&p,B="loading"===g&&!z,N="failed"===g,j=!B&&!N,U=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),V=j?e.a.opacity:0;(0,use_fadein_1.useFadeIn)(i,V);const G=e.selectable||"admin"===t.role,$=(0,screen_1.useMobile)();return react_1.default.createElement(react_1.default.Fragment,null,B&&react_1.default.createElement(LoadingPlaceholder,{element:e}),N&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:i,name:"element",id:e.id,image:L,x:e.a.x,y:e.a.y,width:e.a.width||1,height:e.a.height||1,rotation:e.rotation,opacity:V,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,customCrop:S,listening:G,draggable:$?e.draggable&&d:e.draggable,preventDefault:!$||d,hideInExport:!e.showInExport,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()})},onDblClick:F,onDblTap:F,onTransformStart:()=>{o(!0),U.current={cropX:e.cropX,cropY:e.cropY,cropWidth:e.cropWidth,cropHeight:e.cropHeight}},onTransform:t=>{var a;const r=t.currentTarget,o=Math.abs(r.scaleX()-1)<1e-7?1:r.scaleX(),i=Math.abs(r.scaleY()-1)<1e-7?1:r.scaleY();r.scaleX(1),r.scaleY(1);const n=null===(a=t.target.getStage())||void 0===a?void 0:a.findOne("Transformer"),h=1-E/_.width,c=Math.min(h,Math.max(0,e.cropX)),d=1-k/_.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&&U.current.cropHeight>k/_.height;let f=u?e.cropWidth:e.cropWidth*o;g&&(f=e.cropWidth);const p=!u&&i<1&&U.current.cropWidth>E/_.width;let m=u?e.cropHeight:e.cropHeight*i;p&&(m=e.cropHeight),I&&(f=e.cropWidth,m=e.cropHeight),e.set({cropX:c,cropY:l,x:r.x(),y:r.y(),width:r.width()*o,height:r.height()*i,rotation:t.target.rotation(),cropWidth:Math.min(f,1-c),cropHeight:Math.min(m,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:E/_.width,cropHeight:k/_.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:V,offsetX:-e.borderSize/2,offsetY:-e.borderSize/2,stroke:e.borderColor,strokeWidth:e.borderSize,listening:!1,visible:!!e.borderSize,rotation:e.rotation,cornerRadius:Math.max(0,R-e.borderSize),hideInExport:!e.showInExport}),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:L,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:P,scaleY:P},react_1.default.createElement(react_konva_1.Image,{image:_,ref:n,opacity:.4,draggable:!0,x:-e.cropX*_.width,y:-e.cropY*_.height,onDragMove:q,onTransform:q,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()&&W.current&&(o.startDrag(),W.current=!1),a&&r){konva_1.default.hitOnDragEnabled=!0,o.isDragging()&&(W.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(!H.current)return void(H.current=getCenter(i,n));var h=getCenter(i,n),c=getDistance(i,n);T.current||(T.current=c);const f=o.position();var d={x:h.x-f.x,y:h.y-f.y},l=c/T.current;o.scaleX(l),o.scaleY(l);const p=t.point(h),_=t.point(H.current);var s=p.x-_.x,u=p.y-_.y,g={x:Math.min(0,h.x-d.x*l+s),y:Math.min(0,h.y-d.y*l+u)};o.position(g),T.current=c,H.current=h,q(e)}},onTouchEnd:e=>{T.current=0,H.current=null,konva_1.default.hitOnDragEnabled=!1}}),react_1.default.createElement(react_konva_1.Transformer,{ref:A,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:E,height:k,ref:X,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*_.width-1e-9&&(t.target.x(-e.cropX*_.width),t.target.scaleX(1)),t.target.y()<-e.cropY*_.height-1e-9&&(t.target.y(-e.cropY*_.height),t.target.scaleY(1));const a=Math.min(1,Math.max(0,e.cropX+t.target.x()/_.width)),r=Math.min(1,Math.max(0,t.target.y()/_.height+e.cropY)),o=t.target.width()*t.target.scaleX(),i=t.target.height()*t.target.scaleY(),n=Math.min(1-a,o/_.width),h=Math.min(1-r,i/_.height),c=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:c.x,y:c.y,cropX:a,cropY:r,cropWidth:n,cropHeight:h,width:Math.min(o*P,_.width*(1-a)*P),height:Math.min(i*P,_.height*(1-r)*P)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:Y,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}))),(h||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"),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,h="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0,c=navigator.userAgent.toLowerCase().indexOf("firefox")>-1&&h||e.maskSrc;if(!i&&!n&&!c)return t;if(!t||!t.width||!t.height)return null;const d=createCanvas();let l=1;"svg"===e.type&&(l=Math.max(e.a.width/t.width*a,e.a.height/t.height*a)),d.width=Math.max(t.width*l,1),d.height=Math.max(t.height*l,1);let s=i?-d.width:0,u=n?-d.height:0;return null===(r=d.getContext("2d"))||void 0===r||r.scale(i?-1:1,n?-1:1),null===(o=d.getContext("2d"))||void 0===o||o.drawImage(t,s,u,d.width,d.height),d}),[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 h=new ImageData(t,a),c=new Int32Array(e.data.buffer),d=e.width,l=new Int32Array(h.data.buffer),s=h.width,u=t/i,g=a/n,f=Math.round(1/u),p=Math.round(1/g),_=f*p,m=0;m<h.height;m++)for(var w=0;w<s;w++){for(var x=r+Math.round(w/u)+(o+Math.round(m/g))*d,v=0,y=0,M=0,b=0,E=0;E<p;E++)for(var k=0;k<f;k++){var C=c[x+k+E*d];v+=C<<24>>>24,y+=C<<16>>>24,M+=C<<8>>>24,b+=C>>>24}v=Math.round(v/_),y=Math.round(y/_),M=Math.round(M/_),b=Math.round(b/_),l[w+m*s]=b<<24|M<<16|y<<8|v}return h}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 h=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(h,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])},useCornerRadiusAndCrop=(e,t,a,r,o=0,i=!1)=>{const n=Math.floor(Math.max(e.a.width*r,1)),h=Math.floor(Math.max(e.a.height*r,1)),c=Math.min(o*r,n/2,h/2),d=Math.max(e.a.width/a.width,e.a.height/a.height)*r,l=e.page._exportingOrRendering&&flags_1.flags.imageDownScalingEnabled&&d<1&&!i,s=0===a.x&&0===a.y&&a.width===(null==t?void 0:t.width)&&a.height===(null==t?void 0:t.height),u=react_1.default.useMemo((()=>{if(!t||!t.width||!t.height)return;return s&&0===c&&!l?void 0:createCanvas()}),[t,c,l,s]);return react_1.default.useLayoutEffect((()=>{if(!u||!t)return;u.width=n,u.height=h;const e=u.getContext("2d");if(!e)return;c&&(e.beginPath(),e.moveTo(c,0),e.lineTo(n-c,0),e.arc(n-c,c,c,3*Math.PI/2,0,!1),e.lineTo(n,h-c),e.arc(n-c,h-c,c,0,Math.PI/2,!1),e.lineTo(c,h),e.arc(c,h-c,c,Math.PI/2,Math.PI,!1),e.lineTo(0,c),e.arc(c,c,c,Math.PI,3*Math.PI/2,!1),e.clip());const r=l?downScaleCanvas(t,d):t,o=l?{x:Math.floor(a.x*d),y:Math.floor(a.y*d),width:Math.floor(a.width*d),height:Math.floor(a.height*d)}:a;e.drawImage(r,o.x,o.y,o.width,o.height,0,0,u.width,u.height)}),[u,e.a.width,e.a.height,a.x,a.y,a.width,a.height,o,r,i,e.page._exportingOrRendering,l]),react_1.default.useEffect((()=>()=>{u&&"CANVAS"===u.nodeName&&konva_1.default.Util.releaseCanvas(u)}),[u]),u||t},useClip=(e,t,a,r)=>{const o=useSizeFixer(e.clipSrc||""),[i,n]=useImageHook(o,"anonymous"),h=e.clipSrc?n:"loaded";(0,exports.useImageLoader)(h,e.id+"-clip");const c=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(!c)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),c.width=Math.max(t.width,1),c.height=Math.max(t.height,1);const h=c.getContext("2d");h&&(h.save(),h.drawImage(o,0,0,t.width,t.height),konva_1.default.Util.releaseCanvas(o),h.globalCompositeOperation="source-in",h.drawImage(t,0,0,c.width,c.height),h.restore())}),[c,t,i,e.a.width,e.a.height,a,...r]);return e.clipSrc&&i?c: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 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),h=svg.replaceColors(n,e.colorsReplace);t||(o.current=h,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),[h,c]=react_1.default.useState(!1),d=t.selectedElements.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=usePreviousImage({image:u,status:g,type:e.type}),_=useMask(e,useFlip(e,u||p,t._elementsPixelRatio))||PLACEHOLDER_CANVAS;let{cropX:m,cropY:w,cropWidth:x,cropHeight:v}=e;"loaded"!==g&&(m=w=0,x=v=1);const y=_.width*x,M=_.height*v,b=e.a.width/e.a.height;let E,k;const C=y/M,I="svg"===e.type;I?(E=y,k=M):b>=C?(E=y,k=y/b):(E=M*b,k=M);const S={x:_.width*m,y:_.height*w,width:E,height:k},R=null!==(a=e.cornerRadius)&&void 0!==a?a:0,O=e.page._exportingOrRendering?1:Math.min(2,t.scale),D=t._elementsPixelRatio*O;let L=useClip(e,useCornerRadiusAndCrop(e,_,S,D,R,r||e._cropModeEnabled||"svg"===e.type),D,[S,R,D]);const P=Math.max(e.a.width/E,e.a.height/k);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})}),[L,e.page._exportingOrRendering,r,x,v,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 X=react_1.default.useRef(null),Y=react_1.default.useRef(null),A=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(Y.current.nodes([X.current]),A.current.nodes([n.current]))}),[e._cropModeEnabled]);var H=react_1.default.useRef(null),T=react_1.default.useRef(0),W=react_1.default.useRef(!1);const q=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,E/r),n=Math.min(1,k/o),h=1-i,c=Math.min(h,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:-c*_.width,y:-l*_.height,scaleX:1,scaleY:1}),e.set({cropX:c,cropY:l,cropWidth:i,cropHeight:n})},F=()=>{"svg"!==e.type&&e.contentEditable&&setTimeout((()=>{e.toggleCropMode(!0)}))},z="svg"===e.type&&p,B="loading"===g&&!z,N="failed"===g,j=!B&&!N,U=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),V=j?e.a.opacity:0;(0,use_fadein_1.useFadeIn)(i,V);const G=e.selectable||"admin"===t.role,$=(0,screen_1.useMobile)();return react_1.default.createElement(react_1.default.Fragment,null,B&&react_1.default.createElement(LoadingPlaceholder,{element:e}),N&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:i,name:"element",id:e.id,image:L,x:e.a.x,y:e.a.y,width:e.a.width||1,height:e.a.height||1,rotation:e.a.rotation,opacity:V,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,customCrop:S,listening:G,draggable:$?e.draggable&&d:e.draggable,preventDefault:!$||d,hideInExport:!e.showInExport,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()})},onDblClick:F,onDblTap:F,onTransformStart:()=>{o(!0),U.current={cropX:e.cropX,cropY:e.cropY,cropWidth:e.cropWidth,cropHeight:e.cropHeight}},onTransform:t=>{var a;const r=t.currentTarget,o=Math.abs(r.scaleX()-1)<1e-7?1:r.scaleX(),i=Math.abs(r.scaleY()-1)<1e-7?1:r.scaleY();r.scaleX(1),r.scaleY(1);const n=null===(a=t.target.getStage())||void 0===a?void 0:a.findOne("Transformer"),h=1-E/_.width,c=Math.min(h,Math.max(0,e.cropX)),d=1-k/_.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&&U.current.cropHeight>k/_.height;let f=u?e.cropWidth:e.cropWidth*o;g&&(f=e.cropWidth);const p=!u&&i<1&&U.current.cropWidth>E/_.width;let m=u?e.cropHeight:e.cropHeight*i;p&&(m=e.cropHeight),I&&(f=e.cropWidth,m=e.cropHeight),e.set({cropX:c,cropY:l,x:r.x(),y:r.y(),width:r.width()*o,height:r.height()*i,rotation:t.target.rotation(),cropWidth:Math.min(f,1-c),cropHeight:Math.min(m,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:E/_.width,cropHeight:k/_.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:V,offsetX:-e.borderSize/2,offsetY:-e.borderSize/2,stroke:e.borderColor,strokeWidth:e.borderSize,listening:!1,visible:!!e.borderSize,rotation:e.rotation,cornerRadius:Math.max(0,R-e.borderSize),hideInExport:!e.showInExport}),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:L,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:P,scaleY:P},react_1.default.createElement(react_konva_1.Image,{image:_,ref:n,opacity:.4,draggable:!0,x:-e.cropX*_.width,y:-e.cropY*_.height,onDragMove:q,onTransform:q,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()&&W.current&&(o.startDrag(),W.current=!1),a&&r){konva_1.default.hitOnDragEnabled=!0,o.isDragging()&&(W.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(!H.current)return void(H.current=getCenter(i,n));var h=getCenter(i,n),c=getDistance(i,n);T.current||(T.current=c);const f=o.position();var d={x:h.x-f.x,y:h.y-f.y},l=c/T.current;o.scaleX(l),o.scaleY(l);const p=t.point(h),_=t.point(H.current);var s=p.x-_.x,u=p.y-_.y,g={x:Math.min(0,h.x-d.x*l+s),y:Math.min(0,h.y-d.y*l+u)};o.position(g),T.current=c,H.current=h,q(e)}},onTouchEnd:e=>{T.current=0,H.current=null,konva_1.default.hitOnDragEnabled=!1}}),react_1.default.createElement(react_konva_1.Transformer,{ref:A,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:E,height:k,ref:X,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*_.width-1e-9&&(t.target.x(-e.cropX*_.width),t.target.scaleX(1)),t.target.y()<-e.cropY*_.height-1e-9&&(t.target.y(-e.cropY*_.height),t.target.scaleY(1));const a=Math.min(1,Math.max(0,e.cropX+t.target.x()/_.width)),r=Math.min(1,Math.max(0,t.target.y()/_.height+e.cropY)),o=t.target.width()*t.target.scaleX(),i=t.target.height()*t.target.scaleY(),n=Math.min(1-a,o/_.width),h=Math.min(1-r,i/_.height),c=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:c.x,y:c.y,cropX:a,cropY:r,cropWidth:n,cropHeight:h,width:Math.min(o*P,_.width*(1-a)*P),height:Math.min(i*P,_.height*(1-r)*P)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:Y,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}))),(h||d)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
|
package/canvas/text-element.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TextElement=exports.usePrevious=exports.getLineHeight=exports.useFontLoader=exports.getDir=exports.isRTLText=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")),svg_round_corners_1=require("svg-round-corners"),use_color_1=require("./use-color"),loader_1=require("../utils/loader"),fonts_1=require("../utils/fonts"),flags_1=require("../utils/flags"),text_1=require("../utils/text"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),highlighter_1=require("./highlighter"),screen_1=require("../utils/screen"),mobx_state_tree_1=require("mobx-state-tree");konva_1.default._fixTextRendering=!0;const 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:"pre-wrap",userSelect:"text",wordBreak:"normal"};function isRTL(e){var t="֑-߿יִ-﷽ﹰ-ﻼ";return new RegExp("^[^"+t+"]*?["+t+"]").test(e)}function isRTLText(e){e=e.replace(/\s/g,"");let t=0;for(var r=0;r<e.length;r++){isRTL(e[r])&&(t+=1)}return t>e.length/2}function getDir(e){return isRTLText(e)?"rtl":"ltr"}exports.isRTLText=isRTLText,exports.getDir=getDir;const TextInput=(0,mobx_react_lite_1.observer)((({textNodeRef:e,element:t,onBlur:r,selectAll:n,cursorPosition:i})=>{const[o,a]=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()+l.fontSize()*l.lineHeight()+"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,e.letterSpacing=t.letterSpacing+"em";const r=`\n .polotno-input::placeholder {\n color: ${o.color};\n opacity: 0.6;\n }\n `;styleNode.innerHTML="",styleNode.appendChild(document.createTextNode(r)),JSON.stringify(e)!==JSON.stringify(o)&&a(e)}));const s=react_1.default.useRef(null);react_1.default.useEffect((()=>{const e=setTimeout((()=>{var e;const t=s.current;if(!t)return;null===(e=s.current)||void 0===e||e.focus();const r=i||t.value.length;t.selectionStart=t.selectionEnd=r,n&&(null==t||t.select(),document.execCommand("selectAll",!1,null))}));return()=>{clearTimeout(e)}}),[]),react_1.default.useEffect((()=>{window.addEventListener("blur",r);const e=e=>{var t;(null===(t=s.current)||void 0===t?void 0:t.contains(e.target))||r()};return window.addEventListener("touchstart",e),()=>{window.removeEventListener("blur",r),window.removeEventListener("touchstart",e)}}),[]);let u=0;const d=l.textArr.length*l.lineHeight()*l.fontSize();"middle"===t.verticalAlign&&(u=(t.a.height-d)/2),"bottom"===t.verticalAlign&&(u=t.a.height-d);const c=(0,text_1.removeTags)(t.text);return react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement("textarea",{className:"polotno-input",ref:s,dir:getDir(c),style:Object.assign(Object.assign(Object.assign({},initialStyles),o),{paddingTop:u+"px"}),value:c,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.useReducer((e=>e+1),0),i=react_1.default.useRef((0,fonts_1.isFontLoaded)(t));return react_1.default.useLayoutEffect((()=>{if(i.current=(0,fonts_1.isFontLoaded)(t),i.current)return;let r=!0;return(async()=>{i.current=!1,n();const o=(0,loader_1.incrementLoader)(`text ${t}`);await e.loadFont(t),setTimeout(o,100),r&&(i.current=!0,n())})(),()=>{r=!1}}),[t]),[i.current]};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 i=e.offsetHeight;return document.body.removeChild(e),i/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),i=r.textArr,o=Math.floor(n.y/(r.fontSize()*r.lineHeight())),a=i.slice(0,o).reduce(((e,t)=>e+t.text.length),o),l=null!==(t=i[o])&&void 0!==t?t:i[0];let s=0;"right"===r.align()?s=r.width()-l.width:"center"===r.align()&&(s=r.width()/2-l.width/2);return a+Math.round((n.x-s)/l.width*l.text.length)}function usePrevious(e){const t=react_1.default.useRef(e),r=react_1.default.useRef(e);return react_1.default.useMemo((()=>{r.current=t.current,t.current=e}),[e]),r.current}function isNonSpaceSeparatedLanguage(e){return/[\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFFEF\u4E00-\u9FAF\uAC00-\uD7AF]/.test(e)}function findFitFontSize(e,t){const r=e.fontSize(),n=e.height(),i=(0,text_1.removeTags)(t.text);let o=t.a.fontSize;e.height(void 0);const a=Math.round(2*t.a.fontSize)-1;for(let r=1;r<a;r++){const r=t.a.height&&e.height()>t.a.height;let n=i.split("\n").join(" ").split(/[\s-]+/).reduce(((e,t)=>isNonSpaceSeparatedLanguage(t)?e.concat(t.split("")):e.concat(t)),[]),a=e.textArr.map((e=>e.text)).join(";");const l=n.find((e=>!a.includes(e)||(a=a.replace(e,""),!1)));if(!(r||l))break;o-=.5,e.fontSize(o)}return e.fontSize(r),e.height(n),o}function generateBackgroundShape({lines:e,lineHeight:t,width:r,align:n="left",padding:i=0,cornerRadius:o=0}){var a;e.forEach(((e,t)=>{e.cx=r/2,"right"===n?e.cx=r-e.width/2:"left"===n&&(e.cx=e.width/2),"justify"!==n||e.lastInParagraph||(e.width=r),"justify"===n&&(e.cx=e.width/2)}));let l=`M ${null===(a=e[0])||void 0===a?void 0:a.cx} ${-i}`;e.forEach(((r,n)=>{const{cx:o}=r,a=e[n-1];a&&a.width>r.width?l+=` L ${o+r.width/2+i} ${n*t+i}`:l+=` L ${o+r.width/2+i} ${n*t-i}`;const s=e[n+1];s&&s.width>r.width?l+=` L ${o+r.width/2+i} ${(n+1)*t-i}`:l+=` L ${o+r.width/2+i} ${(n+1)*t+i}`}));for(var s=e.length-1;s>=0;s--){const r=e[s],{cx:n}=r,o=e[s+1];o&&o.width>r.width?l+=` L ${n-r.width/2-i} ${(s+1)*t-i}`:l+=` L ${n-r.width/2-i} ${(s+1)*t+i}`;const a=e[s-1];a&&a.width>r.width?l+=` L ${n-r.width/2-i} ${s*t+i}`:l+=` L ${n-r.width/2-i} ${s*t-i}`}l+=" Z";const u=(0,svg_round_corners_1.parsePath)(l);return(0,svg_round_corners_1.roundCommands)(u,o).path}exports.getLineHeight=getLineHeight,exports.usePrevious=usePrevious,exports.TextElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),n=react_1.default.useRef(null),{editorEnabled:i,selectAll:o}=useEditor(e),[a,l]=react_1.default.useState(!1),[s,u]=react_1.default.useState(!1),d=react_1.default.useRef(e.a.height),c=t.selectedElements.indexOf(e)>=0,{textVerticalResizeEnabled:f}=flags_1.flags,h=usePrevious(e.fontFamily),[g,_]=react_1.default.useState([]);react_1.default.useEffect((()=>{var e,t;const n=null!==(t=null===(e=r.current)||void 0===e?void 0:e.textArr)&&void 0!==t?t:[];JSON.stringify(n)!==JSON.stringify(g)&&_(n)})),react_1.default.useEffect((()=>{if(e.a.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[p]=(0,exports.useFontLoader)(t,e.fontFamily),x=(0,text_1.removeTags)(e.text),v=()=>{const e=r.current.clone({height:void 0}),t=Math.ceil(e.fontSize()*e.lineHeight()*e.textArr.length+1);return e.destroy(),t};react_1.default.useLayoutEffect((()=>{if(!p)return;const{textOverflow:n}=flags_1.flags;if(e.a.height)if("change-font-size"!==n||s||t.isPlaying){if("resize"===n){const n=v();f&&e.a.height<n&&t.history.ignore((()=>{var t;(0,mobx_state_tree_1.isAlive)(e)&&e.set({height:n}),null===(t=r.current)||void 0===t||t.height(n)}),!1,!0),f||e.a.height===n||t.history.ignore((()=>{var t;(0,mobx_state_tree_1.isAlive)(e)&&e.set({height:n}),null===(t=r.current)||void 0===t||t.height(n)}),!1,!0)}}else{const n=findFitFontSize(r.current,e);if(n!==e.a.fontSize)return void t.history.ignore((()=>{e.set({fontSize:n})}),!1,!0);const i=v();e.a.height===i||f||t.history.ignore((()=>{e.set({height:i})}),!1,!0)}else{const r=v();t.history.ignore((()=>{e.set({height:r})}),!1,!0)}})),react_1.default.useLayoutEffect((()=>{const t=r.current;t&&(t.width(t.width()+1e-8),t._setTextData(),(0,apply_filters_1.applyFilter)(t,e))}),[p]);const m=react_1.default.useRef(null),y=react_1.default.useRef(0),w=r=>{r.evt.preventDefault();const n=t.selectedShapes.find((t=>t===e));n&&e.contentEditable&&(y.current=getCursorPosition(r),e.toggleEditMode())},S=!x&&e.placeholder?.6:e.a.opacity;(0,use_fadein_1.useFadeIn)(r,S);const b=(0,exports.getLineHeight)({fontLoaded:p,fontFamily:e.fontFamily,fontSize:e.a.fontSize,lineHeight:e.lineHeight}),E=e.selectable||"admin"===t.role,L=(0,use_color_1.useColor)(e),F=react_1.default.useMemo((()=>e.backgroundEnabled?generateBackgroundShape({lines:JSON.parse(JSON.stringify(g)),cornerRadius:e.backgroundCornerRadius*(e.a.fontSize*b*.5),lineHeight:b*e.a.fontSize,padding:e.backgroundPadding*(e.a.fontSize*b*.5),width:e.a.width,align:e.align}):""),[e.backgroundEnabled,e.backgroundCornerRadius,e.a.fontSize,b,e.backgroundPadding,e.a.width,e.align,g]),T=(0,screen_1.useMobile)();let z=0;return"middle"===e.verticalAlign?z=(e.a.height-g.length*b*e.a.fontSize)/2:"bottom"===e.verticalAlign&&(z=e.a.height-g.length*b*e.a.fontSize),react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Path,{ref:n,x:e.a.x,y:e.a.y,rotation:e.a.rotation,hideInExport:!e.showInExport,listening:!1,visible:e.backgroundEnabled,opacity:e.backgroundOpacity,data:F,fill:e.backgroundColor,offsetY:-z}),react_1.default.createElement(react_konva_1.Text,Object.assign({ref:r,id:e.id,name:"element",hideInExport:!e.showInExport,editModeEnabled:e._editModeEnabled,x:e.a.x,y:e.a.y,rotation:e.a.rotation,width:e.a.width,height:e.a.height,text:x||e.placeholder},L,{stroke:e.stroke,lineJoin:"round",strokeWidth:e.strokeWidth,fillAfterStrokeEnabled:!0,fontSize:e.a.fontSize,fontFamily:`"${e.fontFamily}", "${h}"`,fontStyle:e.fontStyle+" "+e.fontWeight,textDecoration:e.textDecoration,align:e.align,verticalAlign:e.verticalAlign,draggable:T?e.draggable&&c:e.draggable,preventDefault:!T||c,opacity:S,visible:!e._editModeEnabled,ellipsis:"ellipsis"===flags_1.flags.textOverflow,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,lineHeight:b,letterSpacing:e.letterSpacing*e.a.fontSize,listening:E,onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onMouseEnter:()=>{l(!0)},onMouseLeave:()=>{l(!1)},onClick:w,onTap:w,onTransformStart:()=>{u(!0),d.current=r.current.height()},onTransform:t=>{var r,i;const o=t.target;null===(r=n.current)||void 0===r||r.setAttrs({x:o.x(),y:o.y(),rotation:o.rotation(),scale:o.scale()});const a=(null===(i=o.getStage())||void 0===i?void 0:i.findOne("Transformer")).getActiveAnchor();if("middle-left"===a||"middle-right"===a){const t=o.scaleX(),r=o.width()*t,n=e.a.fontSize;let i=r;r<n&&(i=n,m.current&&o.position(m.current)),o.width(i),o.scaleX(1),o.scaleY(1);const a=v();if("ellipsis"!==flags_1.flags.textOverflow){const t=Math.max(a,d.current);o.height(t),e.set({height:o.height()})}e.set({x:o.x(),y:o.y(),width:o.width(),rotation:o.rotation()}),(0,apply_filters_1.applyFilter)(o,e)}if("top-center"===a||"bottom-center"===a){let r="resize"===flags_1.flags.textOverflow?v():b*e.a.fontSize;t.target.height(Math.max(r,t.target.height()*t.target.scaleY())),t.target.scaleY(1)}m.current=t.target.position()},onTransformEnd:t=>{var r;const i=t.target.scaleX();t.target.scaleX(1),t.target.scaleY(1),e.set({fontSize:Math.round(e.a.fontSize*i),width:Math.ceil(t.target.width()*i),x:t.target.x(),y:t.target.y(),rotation:t.target.rotation(),height:t.target.height()*i,shadowBlur:e.shadowBlur*i,shadowOffsetX:e.shadowOffsetX*i,shadowOffsetY:e.shadowOffsetY*i,strokeWidth:e.strokeWidth*i}),null===(r=n.current)||void 0===r||r.setAttrs({scaleX:1,scaleY:1}),u(!1)}})),i&&react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.a.rotation},react_1.default.createElement(TextInput,{textNodeRef:r,element:e,selectAll:o,cursorPosition:y.current,onBlur:()=>{e.toggleEditMode(!1)}})),!s&&(a||c)&&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.usePrevious=exports.getLineHeight=exports.useFontLoader=exports.getDir=exports.isRTLText=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")),svg_round_corners_1=require("svg-round-corners"),use_color_1=require("./use-color"),loader_1=require("../utils/loader"),fonts_1=require("../utils/fonts"),flags_1=require("../utils/flags"),text_1=require("../utils/text"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),highlighter_1=require("./highlighter"),screen_1=require("../utils/screen"),mobx_state_tree_1=require("mobx-state-tree");konva_1.default._fixTextRendering=!0;const 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:"pre-wrap",userSelect:"text",wordBreak:"normal"};function isRTL(e){var t="֑-߿יִ-﷽ﹰ-ﻼ";return new RegExp("^[^"+t+"]*?["+t+"]").test(e)}function isRTLText(e){e=e.replace(/\s/g,"");let t=0;for(var r=0;r<e.length;r++){isRTL(e[r])&&(t+=1)}return t>e.length/2}function getDir(e){return isRTLText(e)?"rtl":"ltr"}exports.isRTLText=isRTLText,exports.getDir=getDir;const TextInput=(0,mobx_react_lite_1.observer)((({textNodeRef:e,element:t,onBlur:r,selectAll:n,cursorPosition:i})=>{const[o,a]=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()+l.fontSize()*l.lineHeight()+"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,e.letterSpacing=t.letterSpacing+"em";const r=`\n .polotno-input::placeholder {\n color: ${o.color};\n opacity: 0.6;\n }\n `;styleNode.innerHTML="",styleNode.appendChild(document.createTextNode(r)),JSON.stringify(e)!==JSON.stringify(o)&&a(e)}));const s=react_1.default.useRef(null);react_1.default.useEffect((()=>{const e=setTimeout((()=>{var e;const t=s.current;if(!t)return;null===(e=s.current)||void 0===e||e.focus();const r=i||t.value.length;t.selectionStart=t.selectionEnd=r,n&&(null==t||t.select(),document.execCommand("selectAll",!1,null))}));return()=>{clearTimeout(e)}}),[]),react_1.default.useEffect((()=>{window.addEventListener("blur",r);const e=e=>{var t;(null===(t=s.current)||void 0===t?void 0:t.contains(e.target))||r()};return window.addEventListener("touchstart",e),()=>{window.removeEventListener("blur",r),window.removeEventListener("touchstart",e)}}),[]);let u=0;const d=l.textArr.length*l.lineHeight()*l.fontSize();"middle"===t.verticalAlign&&(u=(t.a.height-d)/2),"bottom"===t.verticalAlign&&(u=t.a.height-d);const c=(0,text_1.removeTags)(t.text);return react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement("textarea",{className:"polotno-input",ref:s,dir:getDir(c),style:Object.assign(Object.assign(Object.assign({},initialStyles),o),{paddingTop:u+"px"}),value:c,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.useReducer((e=>e+1),0),i=react_1.default.useRef((0,fonts_1.isFontLoaded)(t));return react_1.default.useLayoutEffect((()=>{if(i.current=(0,fonts_1.isFontLoaded)(t),i.current)return;let r=!0;return(async()=>{i.current=!1,n();const o=(0,loader_1.incrementLoader)(`text ${t}`);await e.loadFont(t),setTimeout(o,100),r&&(i.current=!0,n())})(),()=>{r=!1}}),[t]),[i.current]};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 i=e.offsetHeight;return document.body.removeChild(e),i/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),i=r.textArr,o=Math.floor(n.y/(r.fontSize()*r.lineHeight())),a=i.slice(0,o).reduce(((e,t)=>e+t.text.length),o),l=null!==(t=i[o])&&void 0!==t?t:i[0];let s=0;"right"===r.align()?s=r.width()-l.width:"center"===r.align()&&(s=r.width()/2-l.width/2);return a+Math.round((n.x-s)/l.width*l.text.length)}function usePrevious(e){const t=react_1.default.useRef(e),r=react_1.default.useRef(e);return react_1.default.useMemo((()=>{r.current=t.current,t.current=e}),[e]),r.current}function isNonSpaceSeparatedLanguage(e){return/[\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFFEF\u4E00-\u9FAF\uAC00-\uD7AF]/.test(e)}function findFitFontSize(e,t){const r=e.fontSize(),n=e.height(),i=(0,text_1.removeTags)(t.text);let o=t.a.fontSize;e.height(void 0);const a=Math.round(2*t.a.fontSize)-1;for(let r=1;r<a;r++){const r=t.a.height&&e.height()>t.a.height;let n=i.split("\n").join(" ").split(/[\s-]+/).reduce(((e,t)=>isNonSpaceSeparatedLanguage(t)?e.concat(t.split("")):e.concat(t)),[]),a=e.textArr.map((e=>e.text)).join(";");const l=n.find((e=>!a.includes(e)||(a=a.replace(e,""),!1)));if(!(r||l))break;o-=.5,e.fontSize(o)}return e.fontSize(r),e.height(n),o}function generateBackgroundShape({lines:e,lineHeight:t,width:r,align:n="left",padding:i=0,cornerRadius:o=0}){var a;e.forEach(((e,t)=>{e.cx=r/2,"right"===n?e.cx=r-e.width/2:"left"===n&&(e.cx=e.width/2),"justify"!==n||e.lastInParagraph||(e.width=r),"justify"===n&&(e.cx=e.width/2)}));let l=`M ${null===(a=e[0])||void 0===a?void 0:a.cx} ${-i}`;e.forEach(((r,n)=>{const{cx:o}=r,a=e[n-1];a&&a.width>r.width?l+=` L ${o+r.width/2+i} ${n*t+i}`:l+=` L ${o+r.width/2+i} ${n*t-i}`;const s=e[n+1];s&&s.width>r.width?l+=` L ${o+r.width/2+i} ${(n+1)*t-i}`:l+=` L ${o+r.width/2+i} ${(n+1)*t+i}`}));for(var s=e.length-1;s>=0;s--){const r=e[s],{cx:n}=r,o=e[s+1];o&&o.width>r.width?l+=` L ${n-r.width/2-i} ${(s+1)*t-i}`:l+=` L ${n-r.width/2-i} ${(s+1)*t+i}`;const a=e[s-1];a&&a.width>r.width?l+=` L ${n-r.width/2-i} ${s*t+i}`:l+=` L ${n-r.width/2-i} ${s*t-i}`}l+=" Z";const u=(0,svg_round_corners_1.parsePath)(l);return(0,svg_round_corners_1.roundCommands)(u,o).path}exports.getLineHeight=getLineHeight,exports.usePrevious=usePrevious,exports.TextElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),n=react_1.default.useRef(null),{editorEnabled:i,selectAll:o}=useEditor(e),[a,l]=react_1.default.useState(!1),[s,u]=react_1.default.useState(!1),d=react_1.default.useRef(e.a.height),c=t.selectedElements.indexOf(e)>=0,{textVerticalResizeEnabled:f}=flags_1.flags,h=usePrevious(e.fontFamily),[g,_]=react_1.default.useState([]);react_1.default.useEffect((()=>{var e,t;const n=null!==(t=null===(e=r.current)||void 0===e?void 0:e.textArr)&&void 0!==t?t:[];JSON.stringify(n)!==JSON.stringify(g)&&_(n)})),react_1.default.useEffect((()=>{if(e.a.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[p]=(0,exports.useFontLoader)(t,e.fontFamily),x=(0,text_1.removeTags)(e.text),v=()=>{const e=r.current.clone({height:void 0}),t=Math.ceil(e.fontSize()*e.lineHeight()*e.textArr.length+1);return e.destroy(),t};react_1.default.useLayoutEffect((()=>{if(!p)return;const{textOverflow:n}=flags_1.flags;if(e.a.height)if("change-font-size"!==n||s||t.isPlaying){if("resize"===n){const n=v();f&&e.a.height<n&&t.history.ignore((()=>{var t;(0,mobx_state_tree_1.isAlive)(e)&&e.set({height:n}),null===(t=r.current)||void 0===t||t.height(n)}),!1,!0),f||e.a.height===n||t.history.ignore((()=>{var t;(0,mobx_state_tree_1.isAlive)(e)&&e.set({height:n}),null===(t=r.current)||void 0===t||t.height(n)}),!1,!0)}}else{const n=findFitFontSize(r.current,e);if(n!==e.a.fontSize)return void t.history.ignore((()=>{e.set({fontSize:n})}),!1,!0);const i=v();e.a.height===i||f||t.history.ignore((()=>{e.set({height:i})}),!1,!0)}else{const r=v();t.history.ignore((()=>{e.set({height:r})}),!1,!0)}})),react_1.default.useLayoutEffect((()=>{const t=r.current;t&&(t.width(t.width()+1e-8),t._setTextData(),(0,apply_filters_1.applyFilter)(t,e))}),[p]);const m=react_1.default.useRef(null),y=react_1.default.useRef(0),w=r=>{r.evt.preventDefault();const n=t.selectedShapes.find((t=>t===e));n&&e.contentEditable&&(y.current=getCursorPosition(r),e.toggleEditMode())},S=!x&&e.placeholder?.6:e.a.opacity;(0,use_fadein_1.useFadeIn)(r,S);const b=(0,exports.getLineHeight)({fontLoaded:p,fontFamily:e.fontFamily,fontSize:e.a.fontSize,lineHeight:e.lineHeight}),E=e.selectable||"admin"===t.role,L=(0,use_color_1.useColor)(e),F=react_1.default.useMemo((()=>e.backgroundEnabled?generateBackgroundShape({lines:JSON.parse(JSON.stringify(g)),cornerRadius:e.backgroundCornerRadius*(e.a.fontSize*b*.5),lineHeight:b*e.a.fontSize,padding:e.backgroundPadding*(e.a.fontSize*b*.5),width:e.a.width,align:e.align}):""),[e.backgroundEnabled,e.backgroundCornerRadius,e.a.fontSize,b,e.backgroundPadding,e.a.width,e.align,g]),T=(0,screen_1.useMobile)();let z=0;return"middle"===e.verticalAlign?z=(e.a.height-g.length*b*e.a.fontSize)/2:"bottom"===e.verticalAlign&&(z=e.a.height-g.length*b*e.a.fontSize),react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Path,{ref:n,x:e.a.x,y:e.a.y,rotation:e.a.rotation,hideInExport:!e.showInExport,listening:!1,visible:e.backgroundEnabled,opacity:e.backgroundOpacity*S,data:F,fill:e.backgroundColor,offsetY:-z}),react_1.default.createElement(react_konva_1.Text,Object.assign({ref:r,id:e.id,name:"element",hideInExport:!e.showInExport,editModeEnabled:e._editModeEnabled,x:e.a.x,y:e.a.y,rotation:e.a.rotation,width:e.a.width,height:e.a.height,text:x||e.placeholder},L,{stroke:e.stroke,lineJoin:"round",strokeWidth:e.strokeWidth,fillAfterStrokeEnabled:!0,fontSize:e.a.fontSize,fontFamily:`"${e.fontFamily}", "${h}"`,fontStyle:e.fontStyle+" "+e.fontWeight,textDecoration:e.textDecoration,align:e.align,verticalAlign:e.verticalAlign,draggable:T?e.draggable&&c:e.draggable,preventDefault:!T||c,opacity:S,visible:!e._editModeEnabled,ellipsis:"ellipsis"===flags_1.flags.textOverflow,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,lineHeight:b,letterSpacing:e.letterSpacing*e.a.fontSize,listening:E,onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onMouseEnter:()=>{l(!0)},onMouseLeave:()=>{l(!1)},onClick:w,onTap:w,onTransformStart:()=>{u(!0),d.current=r.current.height()},onTransform:t=>{var r,i;const o=t.target;null===(r=n.current)||void 0===r||r.setAttrs({x:o.x(),y:o.y(),rotation:o.rotation(),scale:o.scale()});const a=(null===(i=o.getStage())||void 0===i?void 0:i.findOne("Transformer")).getActiveAnchor();if("middle-left"===a||"middle-right"===a){const t=o.scaleX(),r=o.width()*t,n=e.a.fontSize;let i=r;r<n&&(i=n,m.current&&o.position(m.current)),o.width(i),o.scaleX(1),o.scaleY(1);const a=v();if("ellipsis"!==flags_1.flags.textOverflow){const t=Math.max(a,d.current);o.height(t),e.set({height:o.height()})}e.set({x:o.x(),y:o.y(),width:o.width(),rotation:o.rotation()}),(0,apply_filters_1.applyFilter)(o,e)}if("top-center"===a||"bottom-center"===a){let r="resize"===flags_1.flags.textOverflow?v():b*e.a.fontSize;t.target.height(Math.max(r,t.target.height()*t.target.scaleY())),t.target.scaleY(1)}m.current=t.target.position()},onTransformEnd:t=>{var r;const i=t.target.scaleX();t.target.scaleX(1),t.target.scaleY(1),e.set({fontSize:Math.round(e.a.fontSize*i),width:Math.ceil(t.target.width()*i),x:t.target.x(),y:t.target.y(),rotation:t.target.rotation(),height:t.target.height()*i,shadowBlur:e.shadowBlur*i,shadowOffsetX:e.shadowOffsetX*i,shadowOffsetY:e.shadowOffsetY*i,strokeWidth:e.strokeWidth*i}),null===(r=n.current)||void 0===r||r.setAttrs({scaleX:1,scaleY:1}),u(!1)}})),i&&react_1.default.createElement(react_konva_1.Group,{x:e.a.x,y:e.a.y,rotation:e.a.rotation},react_1.default.createElement(TextInput,{textNodeRef:r,element:e,selectAll:o,cursorPosition:y.current,onBlur:()=>{e.toggleEditMode(!1)}})),!s&&(a||c)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
|
package/canvas/video-element.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(t,e,r);return __setModuleDefault(t,e),t},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.VideoElement=exports.useImageLoader=exports.setImageLoaderHook=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),mobx_1=require("mobx"),react_konva_1=require("react-konva"),use_image_1=__importDefault(require("use-image")),konva_1=__importDefault(require("konva")),react_konva_utils_1=require("react-konva-utils"),highlighter_1=require("./highlighter"),loader_1=require("../utils/loader"),svg=__importStar(require("../utils/svg")),flags_1=require("../utils/flags"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),screen_1=require("../utils/screen");function createCanvas(){return document.createElement("canvas")}async function getFixedUrl(e){if(!(e.indexOf("data:image/svg+xml")>=0||e.indexOf(".svg")>=0))return e;const t=await svg.urlToString(e),r=svg.fixSize(t);return svg.svgToURL(r)}const useSizeFixer=e=>{const[t,r]=react_1.default.useState(e);return react_1.default.useEffect((()=>{(async()=>{const a=await getFixedUrl(e);a!==t&&r(a)})()}),[e]),t},playIcon=new window.Image;playIcon.src=svg.svgToURL('\n <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path opacity="0.6" d="M4 5.49683V18.5032C4 20.05 5.68077 21.0113 7.01404 20.227L18.0694 13.7239C19.384 12.9506 19.384 11.0494 18.0694 10.2761L7.01404 3.77296C5.68077 2.98869 4 3.95 4 5.49683Z" fill="white"/>\n <path d="M4 5.49683V18.5032C4 20.05 5.68077 21.0113 7.01404 20.227L18.0694 13.7239C19.384 12.9506 19.384 11.0494 18.0694 10.2761L7.01404 3.77296C5.68077 2.98869 4 3.95 4 5.49683Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n');const pauseIcon=new window.Image;pauseIcon.src=svg.svgToURL('\n <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path opacity="0.6" d="M14 19L14 5C14 3.89543 14.8954 3 16 3L17 3C18.1046 3 19 3.89543 19 5L19 19C19 20.1046 18.1046 21 17 21L16 21C14.8954 21 14 20.1046 14 19Z" fill="white"/>\n <path opacity="0.6" d="M10 19L10 5C10 3.89543 9.10457 3 8 3L7 3C5.89543 3 5 3.89543 5 5L5 19C5 20.1046 5.89543 21 7 21L8 21C9.10457 21 10 20.1046 10 19Z" fill="white"/>\n <path d="M14 19L14 5C14 3.89543 14.8954 3 16 3L17 3C18.1046 3 19 3.89543 19 5L19 19C19 20.1046 18.1046 21 17 21L16 21C14.8954 21 14 20.1046 14 19Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n <path d="M10 19L10 5C10 3.89543 9.10457 3 8 3L7 3C5.89543 3 5 3.89543 5 5L5 19C5 20.1046 5.89543 21 7 21L8 21C9.10457 21 10 20.1046 10 19Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n');const useFlip=(e,t,r)=>{const a=react_1.default.useMemo((()=>{var a,i;const{flipX:o,flipY:n}=e,d="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0,c=navigator.userAgent.toLowerCase().indexOf("firefox")>-1&&d||e.maskSrc;if(!o&&!n&&!c)return t;if(!t||!t.width||!t.height)return null;const l=createCanvas();let h=1;"svg"===e.type&&(h=Math.max(e.width/t.width*r,e.height/t.height*r)),l.width=Math.max(t.width*h,1),l.height=Math.max(t.height*h,1);let u=o?-l.width:0,s=n?-l.height:0;return null===(a=l.getContext("2d"))||void 0===a||a.scale(o?-1:1,n?-1:1),null===(i=l.getContext("2d"))||void 0===i||i.drawImage(t,u,s,l.width,l.height),l}),[e.maskSrc,e.flipX,e.flipY,t,e.width,e.height,r]);return react_1.default.useEffect((()=>()=>{a&&"CANVAS"===a.nodeName&&konva_1.default.Util.releaseCanvas(a)}),[a]),a};function getCrop(e,t){const r=t.width/t.height;let a,i;r>=e.width/e.height?(a=e.width,i=e.width/r):(a=e.height*r,i=e.height);return{x:(e.width-a)/2,y:(e.height-i)/2,width:a,height:i}}function downsample(e,t,r,a,i,o,n){for(var d=new ImageData(t,r),c=new Int32Array(e.data.buffer),l=e.width,h=new Int32Array(d.data.buffer),u=d.width,s=t/o,g=r/n,f=Math.round(1/s),p=Math.round(1/g),_=f*p,m=0;m<d.height;m++)for(var w=0;w<u;w++){for(var v=a+Math.round(w/s)+(i+Math.round(m/g))*l,x=0,y=0,M=0,E=0,b=0;b<p;b++)for(var L=0;L<f;L++){var C=c[v+L+b*l];x+=C<<24>>>24,y+=C<<16>>>24,M+=C<<8>>>24,E+=C>>>24}x=Math.round(x/_),y=Math.round(y/_),M=Math.round(M/_),E=Math.round(E/_),h[w+m*u]=E<<24|M<<16|y<<8|x}return d}function downScaleCanvas(e,t){var r,a;const i=createCanvas();i.width=e.width,i.height=e.height,null===(r=i.getContext("2d"))||void 0===r||r.drawImage(e,0,0,i.width,i.height);const o=downsample(i.getContext("2d").getImageData(0,0,i.width,i.height),Math.floor(i.width*t),Math.floor(i.height*t),0,0,i.width,i.height);return i.width=Math.floor(i.width*t),i.height=Math.floor(i.height*t),null===(a=i.getContext("2d"))||void 0===a||a.putImageData(o,0,0),i}const useCornerRadiusAndCrop=(e,t,r,a,i=0,o=!1)=>{const n=Math.floor(Math.max(e.width*a,1)),d=Math.floor(Math.max(e.height*a,1)),c=Math.min(i*a,n/2,d/2),l=Math.max(e.width/r.width,e.height/r.height)*a,h=e.page._exportingOrRendering&&flags_1.flags.imageDownScalingEnabled&&l<1&&!o,u=0===r.x&&0===r.y&&r.width===(null==t?void 0:t.width)&&r.height===(null==t?void 0:t.height),s=react_1.default.useMemo((()=>{if(!t||!t.width||!t.height)return;return u&&0===c&&!h?void 0:createCanvas()}),[t,c,h,u]);return react_1.default.useLayoutEffect((()=>{if(!s||!t)return;s.width=n,s.height=d;const e=s.getContext("2d");if(!e)return;c&&(e.beginPath(),e.moveTo(c,0),e.lineTo(n-c,0),e.arc(n-c,c,c,3*Math.PI/2,0,!1),e.lineTo(n,d-c),e.arc(n-c,d-c,c,0,Math.PI/2,!1),e.lineTo(c,d),e.arc(c,d-c,c,Math.PI/2,Math.PI,!1),e.lineTo(0,c),e.arc(c,c,c,Math.PI,3*Math.PI/2,!1),e.clip());const a=h?downScaleCanvas(t,l):t,i=h?{x:Math.floor(r.x*l),y:Math.floor(r.y*l),width:Math.floor(r.width*l),height:Math.floor(r.height*l)}:r;e.drawImage(a,i.x,i.y,i.width,i.height,0,0,s.width,s.height)}),[s,e.width,e.height,r.x,r.y,r.width,r.height,i,a,o,e.page._exportingOrRendering,h]),react_1.default.useEffect((()=>()=>{s&&"CANVAS"===s.nodeName&&konva_1.default.Util.releaseCanvas(s)}),[s]),s||t},useClip=(e,t,r,a)=>{const i=useSizeFixer(e.clipSrc||""),[o,n]=useImageHook(i,"anonymous"),d=e.clipSrc?n:"loaded";(0,exports.useImageLoader)(d,e.id+"-clip");const c=react_1.default.useMemo((()=>{if(t&&o)return createCanvas()}),[t,o]);react_1.default.useLayoutEffect((()=>{var a;if(!o)return;if(!t||!t.width||!t.height)return;if(!o||!o.width||!o.height)return;if(!c)return;const i=createCanvas(),n=Math.max(e.width/o.width*r,e.height/o.height*r);i.width=o.width*n,i.height=o.height*n,null===(a=i.getContext("2d"))||void 0===a||a.drawImage(o,0,0,i.width,i.height),c.width=Math.max(t.width,1),c.height=Math.max(t.height,1);const d=c.getContext("2d");d&&(d.save(),d.drawImage(i,0,0,t.width,t.height),konva_1.default.Util.releaseCanvas(i),d.globalCompositeOperation="source-in",d.drawImage(t,0,0,c.width,c.height),d.restore())}),[c,t,o,e.width,e.height,r,...a]);return e.clipSrc&&o?c:t},PLACEHOLDER_CANVAS=createCanvas(),LoadingPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t=Math.min(30,e.width/4,e.height/4),r=react_1.default.useRef(null);return react_1.default.useEffect((()=>{const e=r.current;if(!e)return;const t=new konva_1.default.Animation((t=>{e.rotate(((null==t?void 0:t.timeDiff)||0)/2)}),e.getLayer());return t.start(),()=>{t.stop()}})),react_1.default.createElement(react_konva_1.Group,{x:e.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.width,height:e.height,fill:"rgba(124, 173, 212, 0.8)"}),react_1.default.createElement(react_konva_1.Arc,{ref:r,x:e.width/2,y:e.height/2,fill:"white",outerRadius:Math.abs(t),innerRadius:Math.max(1,t-5),angle:270}))})),ErrorPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t="Can not load the video...",r=Math.max(10,Math.min(30,e.width/25));return react_1.default.createElement(react_konva_1.Group,{x:e.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.width,height:e.height,fill:"rgba(223, 102, 102, 0.8)"}),react_1.default.createElement(react_konva_1.Text,{text:t,fontSize:r,width:e.width,height:e.height,align:"center",fill:"white",verticalAlign:"middle",padding:5}))}));let useImageHook=use_image_1.default;const setImageLoaderHook=e=>{useImageHook=e};exports.setImageLoaderHook=setImageLoaderHook;const useImageLoader=(e,t)=>{const r=react_1.default.useRef(),a=()=>{var e;null===(e=r.current)||void 0===e||e.call(r),r.current=void 0};react_1.default.useEffect((()=>a),[]),react_1.default.useLayoutEffect((()=>{"loading"!==e||r.current||(r.current=(0,loader_1.incrementLoader)(`video ${t}`)),"loading"!==e&&a(),"failed"===e&&(0,loader_1.triggerLoadError)(`video ${t}`)}),[e])};exports.useImageLoader=useImageLoader;const usePreviousImage=({image:e,status:t,type:r})=>{const a=react_1.default.useRef();react_1.default.useEffect((()=>{a.current=e||a.current}),[e]);return"failed"!==t||"failed"!==t&&"svg"===r?a.current:void 0};function isBuffered(e,t){for(var r=e.buffered,a=0;a<r.length;a++)if(t>=r.start(a)&&t<=r.end(a))return!0;return!1}const useImageSource=e=>{const[t,r]=react_1.default.useReducer((e=>e+1),0),a=react_1.default.useRef("loading"),i=react_1.default.useRef(e.src),o=react_1.default.useRef(e.src);return o.current!==e.src&&(o.current=e.src,a.current="loading"),react_1.default.useEffect((()=>{if("image"===e.type)return;if(!e.src)return;let t=!1;return(async()=>{a.current="loading",r();const o=await svg.urlToString(e.src),n=svg.fixSize(o),d=svg.replaceColors(n,e.colorsReplace);t||(i.current=d,a.current="loaded",r())})(),()=>{t=!0}}),[e.src,JSON.stringify(e.colorsReplace)]),"image"===e.type?[e.src,"loaded"]:[i.current,a.current]};function useVideo(e,t,r){const a=react_1.default.useRef("loading"),i=react_1.default.useRef(),[o,n]=react_1.default.useState(0),d=react_1.default.useRef(),c=react_1.default.useRef(),l=react_1.default.useRef();return d.current===e&&c.current===t&&l.current===r||(a.current="loading",i.current=void 0,d.current=e,c.current=t,l.current=r),react_1.default.useLayoutEffect((function(){if(e){var o=document.createElement("video");return o.addEventListener("canplay",d),o.addEventListener("error",c),t&&(o.crossOrigin=t),r&&(o.referrerpolicy=r),o.src=e,function(){o.removeEventListener("canplay",d),o.removeEventListener("error",c)}}function d(){a.current="loaded",i.current=o,i.current.currentTime=0,n(Math.random()),i.current.removeEventListener("canplay",d)}function c(e){a.current="failed",i.current=void 0,n(Math.random())}}),[e,t,r]),[i.current,a.current]}exports.VideoElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{var r;const[a,i]=react_1.default.useState(!1),o=react_1.default.useRef(null),n=react_1.default.useRef(null),[d,c]=react_1.default.useState(!1),l=t.selectedElements.indexOf(e)>=0,[h,u]=react_1.default.useState(!1),[s,g]=useVideo(e.src,"anonymous"),f=t.activePage===e.page;(0,exports.useImageLoader)(g,e.id+"-video"),s&&(s.width=s.videoWidth,s.height=s.videoHeight);const p=s||PLACEHOLDER_CANVAS;react_1.default.useEffect((()=>{s&&t.history.ignore((()=>{e.set({duration:1e3*s.duration})}))}),[s]),react_1.default.useEffect((()=>{var r;if(!s)return;const a=f&&(t.isPlaying||h);if(!a)return void s.pause();a&&(s.currentTime=e.startTime*s.duration,s.play());const i=new konva_1.default.Animation((()=>{}),null===(r=o.current)||void 0===r?void 0:r.getLayer());i.start();const n=()=>{u(!1),s.currentTime=e.startTime*s.duration},d=()=>{s.currentTime>=e.endTime*s.duration&&(s.pause(),s.currentTime=e.startTime*s.duration,u(!1))};return s.addEventListener("ended",n),s.addEventListener("timeupdate",d),()=>{i.stop(),s.removeEventListener("ended",n),s.removeEventListener("timeupdate",d)}}),[s,h,t.isPlaying,f]);const _=react_1.default.useRef();react_1.default.useEffect((()=>(0,mobx_1.autorun)((()=>{var r,a;if(s){const i=(t.currentTime-e.page.startTime)%e.duration;(Math.abs(1e3*s.currentTime-i)>500||!t.isPlaying)&&(s.currentTime=i/1e3,t.isPlaying||0===s.currentTime||(_.current=(0,loader_1.incrementLoader)(`video ${e.id}`))),null===(a=null===(r=o.current)||void 0===r?void 0:r.getLayer())||void 0===a||a.batchDraw()}}))),[t,s]),react_1.default.useEffect((()=>{if(!s)return;let t=null;const r=()=>{var r,a;_.current&&(null===(a=null===(r=o.current)||void 0===r?void 0:r.getLayer())||void 0===a||a.batchDraw(),_.current(),_.current=null),isBuffered(s,s.currentTime)||(t&&console.error("finish already exists"),t=(0,loader_1.incrementLoader)(`video ${e.id}`))},a=()=>{t&&(t(),t=null)};return s.addEventListener("timeupdate",r),s.addEventListener("canplay",a),()=>{s.removeEventListener("timeupdate",r),s.removeEventListener("canplay",a)}}),[s,e.id,loader_1.incrementLoader]);let{cropX:m,cropY:w,cropWidth:v,cropHeight:x}=e;"loaded"!==g&&(m=w=0,v=x=1);const y=p.width*v,M=p.height*x,E=e.width/e.height;let b,L;const C=y/M,k="svg"===e.type;k?(b=y,L=M):E>=C?(b=y,L=y/E):(b=M*E,L=M);const I={x:p.width*m,y:p.height*w,width:b,height:L},R=null!==(r=e.cornerRadius)&&void 0!==r?r:0;let S=useClip(e,useCornerRadiusAndCrop(e,p,I,t._elementsPixelRatio,R,a||e._cropModeEnabled||"svg"===e.type),t._elementsPixelRatio,[I,R,t._elementsPixelRatio]);const T=Math.max(e.width/b,e.height/L);react_1.default.useEffect((()=>{var t;if(!e._cropModeEnabled)return;const r=null===(t=o.current)||void 0===t?void 0:t.getStage();function a(t){e._cropModeEnabled&&t.target!==n.current&&e.toggleCropMode(!1)}function i(t){e._cropModeEnabled&&t.target.parentNode!==r.content&&e.toggleCropMode(!1)}return document.body.addEventListener("click",i),null==r||r.on("click",a),null==r||r.on("tap",a),()=>{document.body.removeEventListener("click",i),document.body.removeEventListener("touchstart",i),null==r||r.off("click",a),null==r||r.off("click",a)}}),[e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{if(a||e._cropModeEnabled)return;(0,apply_filters_1.applyFilter)(o.current,e);return(0,mobx_1.autorun)((()=>{(0,apply_filters_1.applyFilter)(o.current,e)}),{delay:100})}),[p,a,v,x,e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{var t;a||e._cropModeEnabled?null===(t=o.current)||void 0===t||t.clearCache():(0,apply_filters_1.applyFilter)(o.current,e)}),[a,e.width,e.height,e._cropModeEnabled]),react_1.default.useEffect((()=>{(0,apply_filters_1.applyFilter)(o.current,e)}),[e.shadowEnabled,e.shadowBlur,e.cornerRadius,e.shadowColor,e.shadowOffsetX,e.shadowOffsetY,e.shadowOpacity]);const O=react_1.default.useRef(null),P=react_1.default.useRef(null),X=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(P.current.nodes([O.current]),X.current.nodes([n.current]))}),[e._cropModeEnabled]);const Y=t=>{Math.round(t.target.x())>0&&(t.target.x(0),t.target.scaleX(1)),Math.round(t.target.y())>0&&(t.target.y(0),t.target.scaleY(1));const r=t.target.width()*t.target.scaleX(),a=t.target.height()*t.target.scaleY(),i=Math.min(1,b/r),o=Math.min(1,L/a),n=1-i,d=Math.min(n,Math.max(0,Math.round(-t.target.x())/r)),c=1-o,l=Math.min(c,Math.max(0,Math.round(-t.target.y())/a));t.target.setAttrs({x:-d*p.width,y:-l*p.height,scaleX:1,scaleY:1}),e.set({cropX:d,cropY:l,cropWidth:i,cropHeight:o})},A=()=>{"svg"!==e.type&&e.contentEditable&&setTimeout((()=>{e.toggleCropMode(!0)}))},H="loading"===g,D="failed"===g,W=!H&&!D,q=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),B=W?e.a.opacity:0;(0,use_fadein_1.useFadeIn)(o,B);const F=e.selectable||"admin"===t.role,z=(0,screen_1.useMobile)();return react_1.default.createElement(react_1.default.Fragment,null,H&&react_1.default.createElement(LoadingPlaceholder,{element:e}),D&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:o,name:"element",id:e.id,image:p,x:e.x,y:e.y,width:e.width||1,height:e.height||1,rotation:e.rotation,opacity:B,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,customCrop:I,listening:F,cropX:I.x,cropY:I.y,cropWidth:I.width,cropHeight:I.height,draggable:z?e.draggable&&l:e.draggable,preventDefault:!z||l,hideInExport:!e.showInExport,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()})},onDblClick:A,onDblTap:A,onTransformStart:()=>{i(!0),q.current={cropX:e.cropX,cropY:e.cropY,cropWidth:e.cropWidth,cropHeight:e.cropHeight}},onTransform:t=>{var r;const a=t.currentTarget,i=Math.abs(a.scaleX()-1)<1e-7?1:a.scaleX(),o=Math.abs(a.scaleY()-1)<1e-7?1:a.scaleY();a.scaleX(1),a.scaleY(1);const n=null===(r=t.target.getStage())||void 0===r?void 0:r.findOne("Transformer"),d=1-b/p.width,c=Math.min(d,Math.max(0,e.cropX)),l=1-L/p.height,h=Math.min(l,Math.max(0,e.cropY)),u=n.getActiveAnchor(),s=!(u.indexOf("middle")>=0||u.indexOf("center")>=0),g=!s&&i<1&&q.current.cropHeight>L/p.height;let f=s?e.cropWidth:e.cropWidth*i;g&&(f=e.cropWidth);const _=!s&&o<1&&q.current.cropWidth>b/p.width;let m=s?e.cropHeight:e.cropHeight*o;_&&(m=e.cropHeight),k&&(f=e.cropWidth,m=e.cropHeight),e.set({cropX:c,cropY:h,x:a.x(),y:a.y(),width:a.width()*i,height:a.height()*o,rotation:t.target.rotation(),cropWidth:Math.min(f,1-c),cropHeight:Math.min(m,1-h)})},onTransformEnd:t=>{const r=t.currentTarget;e.set({width:r.width(),height:r.height(),x:r.x(),y:r.y(),rotation:t.target.rotation(),cropWidth:b/p.width,cropHeight:L/p.height}),i(!1)}}),react_1.default.createElement(react_konva_1.Rect,{x:e.x,y:e.y,width:Math.max(e.width-e.borderSize,0),height:Math.max(e.height-e.borderSize,0),opacity:B,offsetX:-e.borderSize/2,offsetY:-e.borderSize/2,stroke:e.borderColor,strokeWidth:e.borderSize,listening:!1,visible:!!e.borderSize,rotation:e.rotation,cornerRadius:Math.max(0,R-e.borderSize),hideInExport:!e.showInExport}),!h&&!t.isPlaying&&react_1.default.createElement(react_konva_1.Image,{image:playIcon,x:e.x+e.width/2-15/t.scale,y:e.y+e.height/2-15/t.scale,width:30/t.scale,height:30/t.scale,hideInExport:!0,onClick:()=>{u(!0)}}),h&&!t.isPlaying&&react_1.default.createElement(react_konva_1.Image,{image:pauseIcon,x:e.x+e.width/2-15/t.scale,y:e.y+e.height/2-15/t.scale,width:30/t.scale,height:30/t.scale,hideInExport:!0,onClick:()=>{u(!1)}}),e._cropModeEnabled&&react_1.default.createElement(react_konva_utils_1.Portal,{selector:".page-abs-container",enabled:!0},react_1.default.createElement(react_konva_1.Rect,{x:-window.innerWidth/t.scale,y:-window.innerWidth/t.scale,width:window.innerWidth/t.scale*3,height:window.innerWidth/t.scale*3,fill:"rgba(0,0,0,0.3)"}),react_1.default.createElement(react_konva_1.Image,{listening:!1,image:S,x:e.x,y:e.y,width:e.width,height:e.height,rotation:e.rotation,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur}),react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,scaleX:T,scaleY:T},react_1.default.createElement(react_konva_1.Image,{image:p,ref:n,opacity:.4,draggable:!0,x:-e.cropX*p.width,y:-e.cropY*p.height,onDragMove:Y,onTransform:Y}),react_1.default.createElement(react_konva_1.Transformer,{ref:X,anchorSize:20,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,rotateEnabled:!1,borderEnabled:!1,anchorCornerRadius:10,anchorStrokeWidth:2,borderStrokeWidth:2}),react_1.default.createElement(react_konva_1.Rect,{width:b,height:L,ref:O,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*p.width-1e-9&&(t.target.x(-e.cropX*p.width),t.target.scaleX(1)),t.target.y()<-e.cropY*p.height-1e-9&&(t.target.y(-e.cropY*p.height),t.target.scaleY(1));const r=Math.min(1,Math.max(0,e.cropX+t.target.x()/p.width)),a=Math.min(1,Math.max(0,t.target.y()/p.height+e.cropY)),i=t.target.width()*t.target.scaleX(),o=t.target.height()*t.target.scaleY(),n=Math.min(1-r,i/p.width),d=Math.min(1-a,o/p.height),c=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:c.x,y:c.y,cropX:r,cropY:a,cropWidth:n,cropHeight:d,width:Math.min(i*T,p.width*(1-r)*T),height:Math.min(o*T,p.height*(1-a)*T)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:P,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,keepRatio:!1,rotateEnabled:!1,anchorFill:"rgb(240, 240, 240)",anchorStrokeWidth:2,borderStrokeWidth:2}))),(d||l)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
|
|
1
|
+
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(t,e,r);return __setModuleDefault(t,e),t},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.VideoElement=exports.useImageLoader=exports.setImageLoaderHook=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),mobx_1=require("mobx"),react_konva_1=require("react-konva"),use_image_1=__importDefault(require("use-image")),konva_1=__importDefault(require("konva")),react_konva_utils_1=require("react-konva-utils"),highlighter_1=require("./highlighter"),loader_1=require("../utils/loader"),svg=__importStar(require("../utils/svg")),flags_1=require("../utils/flags"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),screen_1=require("../utils/screen");function createCanvas(){return document.createElement("canvas")}async function getFixedUrl(e){if(!(e.indexOf("data:image/svg+xml")>=0||e.indexOf(".svg")>=0))return e;const t=await svg.urlToString(e),r=svg.fixSize(t);return svg.svgToURL(r)}const useSizeFixer=e=>{const[t,r]=react_1.default.useState(e);return react_1.default.useEffect((()=>{(async()=>{const a=await getFixedUrl(e);a!==t&&r(a)})()}),[e]),t},playIcon=new window.Image;playIcon.src=svg.svgToURL('\n <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path opacity="0.6" d="M4 5.49683V18.5032C4 20.05 5.68077 21.0113 7.01404 20.227L18.0694 13.7239C19.384 12.9506 19.384 11.0494 18.0694 10.2761L7.01404 3.77296C5.68077 2.98869 4 3.95 4 5.49683Z" fill="white"/>\n <path d="M4 5.49683V18.5032C4 20.05 5.68077 21.0113 7.01404 20.227L18.0694 13.7239C19.384 12.9506 19.384 11.0494 18.0694 10.2761L7.01404 3.77296C5.68077 2.98869 4 3.95 4 5.49683Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n');const pauseIcon=new window.Image;pauseIcon.src=svg.svgToURL('\n <svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n <path opacity="0.6" d="M14 19L14 5C14 3.89543 14.8954 3 16 3L17 3C18.1046 3 19 3.89543 19 5L19 19C19 20.1046 18.1046 21 17 21L16 21C14.8954 21 14 20.1046 14 19Z" fill="white"/>\n <path opacity="0.6" d="M10 19L10 5C10 3.89543 9.10457 3 8 3L7 3C5.89543 3 5 3.89543 5 5L5 19C5 20.1046 5.89543 21 7 21L8 21C9.10457 21 10 20.1046 10 19Z" fill="white"/>\n <path d="M14 19L14 5C14 3.89543 14.8954 3 16 3L17 3C18.1046 3 19 3.89543 19 5L19 19C19 20.1046 18.1046 21 17 21L16 21C14.8954 21 14 20.1046 14 19Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n <path d="M10 19L10 5C10 3.89543 9.10457 3 8 3L7 3C5.89543 3 5 3.89543 5 5L5 19C5 20.1046 5.89543 21 7 21L8 21C9.10457 21 10 20.1046 10 19Z" stroke="#323232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n');const useFlip=(e,t,r)=>{const a=react_1.default.useMemo((()=>{var a,i;const{flipX:o,flipY:n}=e,c="svg"===e.type||e.src.indexOf("data:image/svg+xml")>=0||e.src.indexOf(".svg")>=0,d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1&&c||e.maskSrc;if(!o&&!n&&!d)return t;if(!t||!t.width||!t.height)return null;const l=createCanvas();let h=1;"svg"===e.type&&(h=Math.max(e.width/t.width*r,e.height/t.height*r)),l.width=Math.max(t.width*h,1),l.height=Math.max(t.height*h,1);let u=o?-l.width:0,s=n?-l.height:0;return null===(a=l.getContext("2d"))||void 0===a||a.scale(o?-1:1,n?-1:1),null===(i=l.getContext("2d"))||void 0===i||i.drawImage(t,u,s,l.width,l.height),l}),[e.maskSrc,e.flipX,e.flipY,t,e.width,e.height,r]);return react_1.default.useEffect((()=>()=>{a&&"CANVAS"===a.nodeName&&konva_1.default.Util.releaseCanvas(a)}),[a]),a};function getCrop(e,t){const r=t.width/t.height;let a,i;r>=e.width/e.height?(a=e.width,i=e.width/r):(a=e.height*r,i=e.height);return{x:(e.width-a)/2,y:(e.height-i)/2,width:a,height:i}}function downsample(e,t,r,a,i,o,n){for(var c=new ImageData(t,r),d=new Int32Array(e.data.buffer),l=e.width,h=new Int32Array(c.data.buffer),u=c.width,s=t/o,g=r/n,f=Math.round(1/s),p=Math.round(1/g),_=f*p,m=0;m<c.height;m++)for(var w=0;w<u;w++){for(var v=a+Math.round(w/s)+(i+Math.round(m/g))*l,x=0,y=0,M=0,E=0,b=0;b<p;b++)for(var L=0;L<f;L++){var C=d[v+L+b*l];x+=C<<24>>>24,y+=C<<16>>>24,M+=C<<8>>>24,E+=C>>>24}x=Math.round(x/_),y=Math.round(y/_),M=Math.round(M/_),E=Math.round(E/_),h[w+m*u]=E<<24|M<<16|y<<8|x}return c}function downScaleCanvas(e,t){var r,a;const i=createCanvas();i.width=e.width,i.height=e.height,null===(r=i.getContext("2d"))||void 0===r||r.drawImage(e,0,0,i.width,i.height);const o=downsample(i.getContext("2d").getImageData(0,0,i.width,i.height),Math.floor(i.width*t),Math.floor(i.height*t),0,0,i.width,i.height);return i.width=Math.floor(i.width*t),i.height=Math.floor(i.height*t),null===(a=i.getContext("2d"))||void 0===a||a.putImageData(o,0,0),i}const useCornerRadiusAndCrop=(e,t,r,a,i=0,o=!1)=>{const n=Math.floor(Math.max(e.width*a,1)),c=Math.floor(Math.max(e.height*a,1)),d=Math.min(i*a,n/2,c/2),l=Math.max(e.width/r.width,e.height/r.height)*a,h=e.page._exportingOrRendering&&flags_1.flags.imageDownScalingEnabled&&l<1&&!o,u=0===r.x&&0===r.y&&r.width===(null==t?void 0:t.width)&&r.height===(null==t?void 0:t.height),s=react_1.default.useMemo((()=>{if(!t||!t.width||!t.height)return;return u&&0===d&&!h?void 0:createCanvas()}),[t,d,h,u]);return react_1.default.useLayoutEffect((()=>{if(!s||!t)return;s.width=n,s.height=c;const e=s.getContext("2d");if(!e)return;d&&(e.beginPath(),e.moveTo(d,0),e.lineTo(n-d,0),e.arc(n-d,d,d,3*Math.PI/2,0,!1),e.lineTo(n,c-d),e.arc(n-d,c-d,d,0,Math.PI/2,!1),e.lineTo(d,c),e.arc(d,c-d,d,Math.PI/2,Math.PI,!1),e.lineTo(0,d),e.arc(d,d,d,Math.PI,3*Math.PI/2,!1),e.clip());const a=h?downScaleCanvas(t,l):t,i=h?{x:Math.floor(r.x*l),y:Math.floor(r.y*l),width:Math.floor(r.width*l),height:Math.floor(r.height*l)}:r;e.drawImage(a,i.x,i.y,i.width,i.height,0,0,s.width,s.height)}),[s,e.width,e.height,r.x,r.y,r.width,r.height,i,a,o,e.page._exportingOrRendering,h]),react_1.default.useEffect((()=>()=>{s&&"CANVAS"===s.nodeName&&konva_1.default.Util.releaseCanvas(s)}),[s]),s||t},useClip=(e,t,r,a)=>{const i=useSizeFixer(e.clipSrc||""),[o,n]=useImageHook(i,"anonymous"),c=e.clipSrc?n:"loaded";(0,exports.useImageLoader)(c,e.id+"-clip");const d=react_1.default.useMemo((()=>{if(t&&o)return createCanvas()}),[t,o]);react_1.default.useLayoutEffect((()=>{var a;if(!o)return;if(!t||!t.width||!t.height)return;if(!o||!o.width||!o.height)return;if(!d)return;const i=createCanvas(),n=Math.max(e.width/o.width*r,e.height/o.height*r);i.width=o.width*n,i.height=o.height*n,null===(a=i.getContext("2d"))||void 0===a||a.drawImage(o,0,0,i.width,i.height),d.width=Math.max(t.width,1),d.height=Math.max(t.height,1);const c=d.getContext("2d");c&&(c.save(),c.drawImage(i,0,0,t.width,t.height),konva_1.default.Util.releaseCanvas(i),c.globalCompositeOperation="source-in",c.drawImage(t,0,0,d.width,d.height),c.restore())}),[d,t,o,e.width,e.height,r,...a]);return e.clipSrc&&o?d:t},PLACEHOLDER_CANVAS=createCanvas(),LoadingPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t=Math.min(30,e.width/4,e.height/4),r=react_1.default.useRef(null);return react_1.default.useEffect((()=>{const e=r.current;if(!e)return;const t=new konva_1.default.Animation((t=>{e.rotate(((null==t?void 0:t.timeDiff)||0)/2)}),e.getLayer());return t.start(),()=>{t.stop()}})),react_1.default.createElement(react_konva_1.Group,{x:e.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.width,height:e.height,fill:"rgba(124, 173, 212, 0.8)"}),react_1.default.createElement(react_konva_1.Arc,{ref:r,x:e.width/2,y:e.height/2,fill:"white",outerRadius:Math.abs(t),innerRadius:Math.max(1,t-5),angle:270}))})),ErrorPlaceholder=(0,mobx_react_lite_1.observer)((({element:e})=>{const t="Can not load the video...",r=Math.max(10,Math.min(30,e.width/25));return react_1.default.createElement(react_konva_1.Group,{x:e.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.width,height:e.height,fill:"rgba(223, 102, 102, 0.8)"}),react_1.default.createElement(react_konva_1.Text,{text:t,fontSize:r,width:e.width,height:e.height,align:"center",fill:"white",verticalAlign:"middle",padding:5}))}));let useImageHook=use_image_1.default;const setImageLoaderHook=e=>{useImageHook=e};exports.setImageLoaderHook=setImageLoaderHook;const useImageLoader=(e,t)=>{const r=react_1.default.useRef(),a=()=>{var e;null===(e=r.current)||void 0===e||e.call(r),r.current=void 0};react_1.default.useEffect((()=>a),[]),react_1.default.useLayoutEffect((()=>{"loading"!==e||r.current||(r.current=(0,loader_1.incrementLoader)(`video ${t}`)),"loading"!==e&&a(),"failed"===e&&(0,loader_1.triggerLoadError)(`video ${t}`)}),[e])};exports.useImageLoader=useImageLoader;const usePreviousImage=({image:e,status:t,type:r})=>{const a=react_1.default.useRef();react_1.default.useEffect((()=>{a.current=e||a.current}),[e]);return"failed"!==t||"failed"!==t&&"svg"===r?a.current:void 0};function isBuffered(e,t){for(var r=e.buffered,a=0;a<r.length;a++)if(t>=r.start(a)&&t<=r.end(a))return!0;return!1}const useImageSource=e=>{const[t,r]=react_1.default.useReducer((e=>e+1),0),a=react_1.default.useRef("loading"),i=react_1.default.useRef(e.src),o=react_1.default.useRef(e.src);return o.current!==e.src&&(o.current=e.src,a.current="loading"),react_1.default.useEffect((()=>{if("image"===e.type)return;if(!e.src)return;let t=!1;return(async()=>{a.current="loading",r();const o=await svg.urlToString(e.src),n=svg.fixSize(o),c=svg.replaceColors(n,e.colorsReplace);t||(i.current=c,a.current="loaded",r())})(),()=>{t=!0}}),[e.src,JSON.stringify(e.colorsReplace)]),"image"===e.type?[e.src,"loaded"]:[i.current,a.current]};function useVideo(e,t,r){const a=react_1.default.useRef("loading"),i=react_1.default.useRef(),[o,n]=react_1.default.useState(0),c=react_1.default.useRef(),d=react_1.default.useRef(),l=react_1.default.useRef();return c.current===e&&d.current===t&&l.current===r||(a.current="loading",i.current=void 0,c.current=e,d.current=t,l.current=r),react_1.default.useLayoutEffect((function(){if(e){var o=document.createElement("video");return o.addEventListener("canplay",c),o.addEventListener("error",d),t&&(o.crossOrigin=t),r&&(o.referrerpolicy=r),o.src=e,function(){o.removeEventListener("canplay",c),o.removeEventListener("error",d)}}function c(){a.current="loaded",i.current=o,i.current.currentTime=0,n(Math.random()),i.current.removeEventListener("canplay",c)}function d(e){a.current="failed",i.current=void 0,n(Math.random())}}),[e,t,r]),[i.current,a.current]}exports.VideoElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{var r;const[a,i]=react_1.default.useState(!1),o=react_1.default.useRef(null),n=react_1.default.useRef(null),[c,d]=react_1.default.useState(!1),l=t.selectedElements.indexOf(e)>=0,[h,u]=react_1.default.useState(!1),[s,g]=useVideo(e.src,"anonymous"),f=t.activePage===e.page;(0,exports.useImageLoader)(g,e.id+"-video"),s&&(s.width=s.videoWidth,s.height=s.videoHeight);const p=s||PLACEHOLDER_CANVAS;react_1.default.useEffect((()=>{s&&t.history.ignore((()=>{e.set({duration:1e3*s.duration})}))}),[s]),react_1.default.useEffect((()=>{var r;if(!s)return;const a=f&&(t.isPlaying||h);if(!a)return void s.pause();a&&(s.currentTime=e.startTime*s.duration,s.play());const i=new konva_1.default.Animation((()=>{}),null===(r=o.current)||void 0===r?void 0:r.getLayer());i.start();const n=()=>{u(!1),s.currentTime=e.startTime*s.duration},c=()=>{s.currentTime>=e.endTime*s.duration&&(s.pause(),s.currentTime=e.startTime*s.duration,u(!1))};return s.addEventListener("ended",n),s.addEventListener("timeupdate",c),()=>{i.stop(),s.removeEventListener("ended",n),s.removeEventListener("timeupdate",c)}}),[s,h,t.isPlaying,f]);const _=react_1.default.useRef();react_1.default.useEffect((()=>{const r=(0,mobx_1.autorun)((()=>{var r,a;if(s){const i=(t.currentTime-e.page.startTime)%e.duration;(Math.abs(1e3*s.currentTime-i)>500||!t.isPlaying)&&(s.currentTime=i/1e3,t.isPlaying||0===s.currentTime||(_.current=(0,loader_1.incrementLoader)(`video ${e.id}`))),null===(a=null===(r=o.current)||void 0===r?void 0:r.getLayer())||void 0===a||a.batchDraw()}}));return()=>{r(),_.current&&(_.current(),_.current=null)}}),[t,s]),react_1.default.useEffect((()=>{if(!s)return;let t=null;const r=()=>{var r,a;_.current&&(null===(a=null===(r=o.current)||void 0===r?void 0:r.getLayer())||void 0===a||a.batchDraw(),_.current(),_.current=null),isBuffered(s,s.currentTime)||(t&&(console.error("finish already exists"),t()),t=(0,loader_1.incrementLoader)(`video ${e.id}`))},a=()=>{t&&(t(),t=null)};return s.addEventListener("timeupdate",r),s.addEventListener("canplay",a),()=>{s.removeEventListener("timeupdate",r),s.removeEventListener("canplay",a)}}),[s,e.id,loader_1.incrementLoader]);let{cropX:m,cropY:w,cropWidth:v,cropHeight:x}=e;"loaded"!==g&&(m=w=0,v=x=1);const y=p.width*v,M=p.height*x,E=e.width/e.height;let b,L;const C=y/M,k="svg"===e.type;k?(b=y,L=M):E>=C?(b=y,L=y/E):(b=M*E,L=M);const I={x:p.width*m,y:p.height*w,width:b,height:L},R=null!==(r=e.cornerRadius)&&void 0!==r?r:0;let S=useClip(e,useCornerRadiusAndCrop(e,p,I,t._elementsPixelRatio,R,a||e._cropModeEnabled||"svg"===e.type),t._elementsPixelRatio,[I,R,t._elementsPixelRatio]);const T=Math.max(e.width/b,e.height/L);react_1.default.useEffect((()=>{var t;if(!e._cropModeEnabled)return;const r=null===(t=o.current)||void 0===t?void 0:t.getStage();function a(t){e._cropModeEnabled&&t.target!==n.current&&e.toggleCropMode(!1)}function i(t){e._cropModeEnabled&&t.target.parentNode!==r.content&&e.toggleCropMode(!1)}return document.body.addEventListener("click",i),null==r||r.on("click",a),null==r||r.on("tap",a),()=>{document.body.removeEventListener("click",i),document.body.removeEventListener("touchstart",i),null==r||r.off("click",a),null==r||r.off("click",a)}}),[e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{if(a||e._cropModeEnabled)return;(0,apply_filters_1.applyFilter)(o.current,e);return(0,mobx_1.autorun)((()=>{(0,apply_filters_1.applyFilter)(o.current,e)}),{delay:100})}),[p,a,v,x,e._cropModeEnabled]),react_1.default.useLayoutEffect((()=>{var t;a||e._cropModeEnabled?null===(t=o.current)||void 0===t||t.clearCache():(0,apply_filters_1.applyFilter)(o.current,e)}),[a,e.width,e.height,e._cropModeEnabled]),react_1.default.useEffect((()=>{(0,apply_filters_1.applyFilter)(o.current,e)}),[e.shadowEnabled,e.shadowBlur,e.cornerRadius,e.shadowColor,e.shadowOffsetX,e.shadowOffsetY,e.shadowOpacity]);const O=react_1.default.useRef(null),P=react_1.default.useRef(null),X=react_1.default.useRef(null);react_1.default.useLayoutEffect((()=>{e._cropModeEnabled&&(P.current.nodes([O.current]),X.current.nodes([n.current]))}),[e._cropModeEnabled]);const Y=t=>{Math.round(t.target.x())>0&&(t.target.x(0),t.target.scaleX(1)),Math.round(t.target.y())>0&&(t.target.y(0),t.target.scaleY(1));const r=t.target.width()*t.target.scaleX(),a=t.target.height()*t.target.scaleY(),i=Math.min(1,b/r),o=Math.min(1,L/a),n=1-i,c=Math.min(n,Math.max(0,Math.round(-t.target.x())/r)),d=1-o,l=Math.min(d,Math.max(0,Math.round(-t.target.y())/a));t.target.setAttrs({x:-c*p.width,y:-l*p.height,scaleX:1,scaleY:1}),e.set({cropX:c,cropY:l,cropWidth:i,cropHeight:o})},A=()=>{"svg"!==e.type&&e.contentEditable&&setTimeout((()=>{e.toggleCropMode(!0)}))},H="loading"===g,D="failed"===g,W=!H&&!D,q=react_1.default.useRef({cropX:0,cropY:0,cropWidth:0,cropHeight:0}),B=W?e.a.opacity:0;(0,use_fadein_1.useFadeIn)(o,B);const F=e.selectable||"admin"===t.role,z=(0,screen_1.useMobile)();return react_1.default.createElement(react_1.default.Fragment,null,H&&react_1.default.createElement(LoadingPlaceholder,{element:e}),D&&react_1.default.createElement(ErrorPlaceholder,{element:e}),react_1.default.createElement(react_konva_1.Image,{ref:o,name:"element",id:e.id,image:p,x:e.x,y:e.y,width:e.width||1,height:e.height||1,rotation:e.rotation,opacity:B,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,shadowOffsetX:e.shadowOffsetX,shadowOffsetY:e.shadowOffsetY,shadowColor:e.shadowColor,shadowOpacity:e.shadowOpacity,customCrop:I,listening:F,cropX:I.x,cropY:I.y,cropWidth:I.width,cropHeight:I.height,draggable:z?e.draggable&&l:e.draggable,preventDefault:!z||l,hideInExport:!e.showInExport,onMouseEnter:()=>{d(!0)},onMouseLeave:()=>{d(!1)},onDragMove:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDragEnd:t=>{e.set({x:t.target.x(),y:t.target.y()})},onDblClick:A,onDblTap:A,onTransformStart:()=>{i(!0),q.current={cropX:e.cropX,cropY:e.cropY,cropWidth:e.cropWidth,cropHeight:e.cropHeight}},onTransform:t=>{var r;const a=t.currentTarget,i=Math.abs(a.scaleX()-1)<1e-7?1:a.scaleX(),o=Math.abs(a.scaleY()-1)<1e-7?1:a.scaleY();a.scaleX(1),a.scaleY(1);const n=null===(r=t.target.getStage())||void 0===r?void 0:r.findOne("Transformer"),c=1-b/p.width,d=Math.min(c,Math.max(0,e.cropX)),l=1-L/p.height,h=Math.min(l,Math.max(0,e.cropY)),u=n.getActiveAnchor(),s=!(u.indexOf("middle")>=0||u.indexOf("center")>=0),g=!s&&i<1&&q.current.cropHeight>L/p.height;let f=s?e.cropWidth:e.cropWidth*i;g&&(f=e.cropWidth);const _=!s&&o<1&&q.current.cropWidth>b/p.width;let m=s?e.cropHeight:e.cropHeight*o;_&&(m=e.cropHeight),k&&(f=e.cropWidth,m=e.cropHeight),e.set({cropX:d,cropY:h,x:a.x(),y:a.y(),width:a.width()*i,height:a.height()*o,rotation:t.target.rotation(),cropWidth:Math.min(f,1-d),cropHeight:Math.min(m,1-h)})},onTransformEnd:t=>{const r=t.currentTarget;e.set({width:r.width(),height:r.height(),x:r.x(),y:r.y(),rotation:t.target.rotation(),cropWidth:b/p.width,cropHeight:L/p.height}),i(!1)}}),react_1.default.createElement(react_konva_1.Rect,{x:e.x,y:e.y,width:Math.max(e.width-e.borderSize,0),height:Math.max(e.height-e.borderSize,0),opacity:B,offsetX:-e.borderSize/2,offsetY:-e.borderSize/2,stroke:e.borderColor,strokeWidth:e.borderSize,listening:!1,visible:!!e.borderSize,rotation:e.rotation,cornerRadius:Math.max(0,R-e.borderSize),hideInExport:!e.showInExport}),!h&&!t.isPlaying&&react_1.default.createElement(react_konva_1.Image,{image:playIcon,x:e.x+e.width/2-15/t.scale,y:e.y+e.height/2-15/t.scale,width:30/t.scale,height:30/t.scale,hideInExport:!0,onClick:()=>{u(!0)}}),h&&!t.isPlaying&&react_1.default.createElement(react_konva_1.Image,{image:pauseIcon,x:e.x+e.width/2-15/t.scale,y:e.y+e.height/2-15/t.scale,width:30/t.scale,height:30/t.scale,hideInExport:!0,onClick:()=>{u(!1)}}),e._cropModeEnabled&&react_1.default.createElement(react_konva_utils_1.Portal,{selector:".page-abs-container",enabled:!0},react_1.default.createElement(react_konva_1.Rect,{x:-window.innerWidth/t.scale,y:-window.innerWidth/t.scale,width:window.innerWidth/t.scale*3,height:window.innerWidth/t.scale*3,fill:"rgba(0,0,0,0.3)"}),react_1.default.createElement(react_konva_1.Image,{listening:!1,image:S,x:e.x,y:e.y,width:e.width,height:e.height,rotation:e.rotation,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur}),react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,scaleX:T,scaleY:T},react_1.default.createElement(react_konva_1.Image,{image:p,ref:n,opacity:.4,draggable:!0,x:-e.cropX*p.width,y:-e.cropY*p.height,onDragMove:Y,onTransform:Y}),react_1.default.createElement(react_konva_1.Transformer,{ref:X,anchorSize:20,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,rotateEnabled:!1,borderEnabled:!1,anchorCornerRadius:10,anchorStrokeWidth:2,borderStrokeWidth:2}),react_1.default.createElement(react_konva_1.Rect,{width:b,height:L,ref:O,listening:!1,onTransform:t=>{t.target.x()<-e.cropX*p.width-1e-9&&(t.target.x(-e.cropX*p.width),t.target.scaleX(1)),t.target.y()<-e.cropY*p.height-1e-9&&(t.target.y(-e.cropY*p.height),t.target.scaleY(1));const r=Math.min(1,Math.max(0,e.cropX+t.target.x()/p.width)),a=Math.min(1,Math.max(0,t.target.y()/p.height+e.cropY)),i=t.target.width()*t.target.scaleX(),o=t.target.height()*t.target.scaleY(),n=Math.min(1-r,i/p.width),c=Math.min(1-a,o/p.height),d=t.target.getAbsolutePosition(t.target.getParent().getParent());t.target.scale({x:1,y:1}),t.target.position({x:0,y:0}),e.set({x:d.x,y:d.y,cropX:r,cropY:a,cropWidth:n,cropHeight:c,width:Math.min(i*T,p.width*(1-r)*T),height:Math.min(o*T,p.height*(1-a)*T)})}}),react_1.default.createElement(react_konva_1.Transformer,{ref:P,enabledAnchors:["top-left","top-right","bottom-left","bottom-right"],boundBoxFunc:(e,t)=>t.width<5||t.height<5?e:t,keepRatio:!1,rotateEnabled:!1,anchorFill:"rgb(240, 240, 240)",anchorStrokeWidth:2,borderStrokeWidth:2}))),(c||l)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.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})=>{const d=null!=s?s:20,h=null!=i?i:55,[g,f]=react_1.default.useState({width:100,height:100}),p=react_1.default.useRef(g),m=react_1.default.useRef(null),_=react_1.default.useRef(null),v=e.bleedVisible?Math.max(0,...e.pages.map((e=>e.bleed))):0,w=Math.max(...e.pages.map((e=>e.computedWidth))),b=Math.max(...e.pages.map((e=>e.computedHeight))),E=w+2*v,x=b+2*v,k=async({skipTimeout:t}={skipTimeout:!1})=>{if(t||await new Promise((e=>setTimeout(e,50))),null===m.current)return;const r=m.current.getBoundingClientRect();0!==r.width&&0!==r.height||(console.warn(ZERO_SIZE_WARNING),console.log(m.current));const a=_.current.clientWidth||r.width,n={width:a,height:r.height};(p.current.width!==n.width||p.current.height!==n.height)&&(f(n),p.current=n);const l=(a-2*d)/E,o=(r.height-2*h)/x,c=Math.max(Math.min(l,o),.01);e.scaleToFit!==c&&(e.setScale(c),e._setScaleToFit(c))};react_1.default.useLayoutEffect((()=>{k({skipTimeout:!0})}),[]),react_1.default.useEffect((()=>{k()}),[E,x]),react_1.default.useEffect((()=>{const e=m.current;if(window.ResizeObserver){const t=new ResizeObserver((()=>{k({skipTimeout:!0})}));return t.observe(e),()=>t.unobserve(e)}{const e=setInterval((()=>{k({skipTimeout:!0})}),100);return()=>clearInterval(e)}}),[E,x]);const y=Math.max(d,(g.width-E*e.scale)/2),P=x*e.scale*e.pages.length,C=Math.max(h,(g.height-P)/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=_.current)||void 0===t||t.addEventListener("wheel",r),()=>{var e;return null===(e=_.current)||void 0===e?void 0:e.removeEventListener("wheel",r)}}),[]);const M=react_1.default.useRef(!1);useSaveScrollOnScaleChange(_,E*e.scale+2*y,x*e.scale+2*C,e.scale,e,M);const{handleScroll:T}=useScrollOnActiveChange(_,x*e.scale+2*C,e,g,M),R=g.width>=E*e.scale+2*y,S=r||"rgba(232, 232, 232, 0.9)",L=e.pages.indexOf(e.activePage),O=(null==o?void 0:o.NoPages)||NoPages,W=Math.min(3,Math.max(1,Math.ceil(g.height/2/(x*e.scale))));return react_1.default.createElement("div",{ref:m,style:{width:"100%",height:"100%",position:"relative",outline:"none",flex:1,backgroundColor:S},tabIndex:0,className:"polotno-workspace-container"},react_1.default.createElement("div",{ref:_,onScroll:T,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",overflow:"auto",overflowX:R?"hidden":"auto"},className:"polotno-workspace-inner"},e.pages.map(((r,c)=>Math.abs(c-L)<=W||r.
|
|
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})=>{const d=null!=s?s:20,h=null!=i?i:55,[g,f]=react_1.default.useState({width:100,height:100}),p=react_1.default.useRef(g),m=react_1.default.useRef(null),_=react_1.default.useRef(null),v=e.bleedVisible?Math.max(0,...e.pages.map((e=>e.bleed))):0,w=Math.max(...e.pages.map((e=>e.computedWidth))),b=Math.max(...e.pages.map((e=>e.computedHeight))),E=w+2*v,x=b+2*v,k=async({skipTimeout:t}={skipTimeout:!1})=>{if(t||await new Promise((e=>setTimeout(e,50))),null===m.current)return;const r=m.current.getBoundingClientRect();0!==r.width&&0!==r.height||(console.warn(ZERO_SIZE_WARNING),console.log(m.current));const a=_.current.clientWidth||r.width,n={width:a,height:r.height};(p.current.width!==n.width||p.current.height!==n.height)&&(f(n),p.current=n);const l=(a-2*d)/E,o=(r.height-2*h)/x,c=Math.max(Math.min(l,o),.01);e.scaleToFit!==c&&(e.setScale(c),e._setScaleToFit(c))};react_1.default.useLayoutEffect((()=>{k({skipTimeout:!0})}),[]),react_1.default.useEffect((()=>{k()}),[E,x]),react_1.default.useEffect((()=>{const e=m.current;if(window.ResizeObserver){const t=new ResizeObserver((()=>{k({skipTimeout:!0})}));return t.observe(e),()=>t.unobserve(e)}{const e=setInterval((()=>{k({skipTimeout:!0})}),100);return()=>clearInterval(e)}}),[E,x]);const y=Math.max(d,(g.width-E*e.scale)/2),P=x*e.scale*e.pages.length,C=Math.max(h,(g.height-P)/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=_.current)||void 0===t||t.addEventListener("wheel",r),()=>{var e;return null===(e=_.current)||void 0===e?void 0:e.removeEventListener("wheel",r)}}),[]);const M=react_1.default.useRef(!1);useSaveScrollOnScaleChange(_,E*e.scale+2*y,x*e.scale+2*C,e.scale,e,M);const{handleScroll:T}=useScrollOnActiveChange(_,x*e.scale+2*C,e,g,M),R=g.width>=E*e.scale+2*y,S=r||"rgba(232, 232, 232, 0.9)",L=e.pages.indexOf(e.activePage),O=(null==o?void 0:o.NoPages)||NoPages,W=Math.min(3,Math.max(1,Math.ceil(g.height/2/(x*e.scale))));return react_1.default.createElement("div",{ref:m,style:{width:"100%",height:"100%",position:"relative",outline:"none",flex:1,backgroundColor:S},tabIndex:0,className:"polotno-workspace-container"},react_1.default.createElement("div",{ref:_,onScroll:T,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%",overflow:"auto",overflowX:R?"hidden":"auto"},className:"polotno-workspace-inner"},e.pages.map(((r,c)=>Math.abs(c-L)<=W||r._exportingOrRendering?react_1.default.createElement(page_1.default,{key:r.id,page:r,xPadding:y,yPadding:C,width:E*e.scale+2*y,height:x*e.scale+2*C,store:e,pageControlsEnabled:t,backColor:S,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:E*e.scale+2*y,height:x*e.scale+2*C,backgroundColor:S,xPadding:y,yPadding:C}))),e.rulesVisible&&react_1.default.createElement(rules_1.TopRules,{store:e,xPadding:y,yPadding:C,width:E*e.scale+2*y,height:x*e.scale+2*C}),0===e.pages.length&&react_1.default.createElement(O,{store:e})))})),exports.default=exports.WorkspaceCanvas;
|
package/model/shape-model.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Shape=exports.Animation=void 0;const mobx_state_tree_1=require("mobx-state-tree"),animations_1=require("../utils/animations"),mobx_1=require("mobx"),node_model_1=require("./node-model");exports.Animation=mobx_state_tree_1.types.model("Animation",{delay:0,duration:500,enabled:!0,type:mobx_state_tree_1.types.enumeration("Type",["enter","exit"]),name:"none",data:mobx_state_tree_1.types.frozen({})}),exports.Shape=node_model_1.Node.named("Shape").props({x:0,y:0,width:100,height:100,rotation:0,opacity:1,animations:mobx_state_tree_1.types.array(exports.Animation),blurEnabled:!1,blurRadius:10,brightnessEnabled:!1,brightness:0,sepiaEnabled:!1,grayscaleEnabled:!1,shadowEnabled:!1,shadowBlur:5,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"black",shadowOpacity:1,visible:!0,draggable:!0,resizable:!0,selectable:!0,contentEditable:!0,styleEditable:!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),e.locked&&(t.draggable=!1,t.contentEditable=!1,t.styleEditable=!1,t.resizable=!1),t})).views((e=>{const t=(0,mobx_1.observable)({x:e.x,y:e.y,width:e.width,height:e.height,rotation:e.rotation,opacity:e.opacity,color:e.color,fontSize:e.fontSize}),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Shape=exports.Animation=void 0;const mobx_state_tree_1=require("mobx-state-tree"),animations_1=require("../utils/animations"),mobx_1=require("mobx"),node_model_1=require("./node-model");exports.Animation=mobx_state_tree_1.types.model("Animation",{delay:0,duration:500,enabled:!0,type:mobx_state_tree_1.types.enumeration("Type",["enter","exit","loop"]),name:"none",data:mobx_state_tree_1.types.frozen({})}),exports.Shape=node_model_1.Node.named("Shape").props({x:0,y:0,width:100,height:100,rotation:0,opacity:1,animations:mobx_state_tree_1.types.array(exports.Animation),blurEnabled:!1,blurRadius:10,brightnessEnabled:!1,brightness:0,sepiaEnabled:!1,grayscaleEnabled:!1,shadowEnabled:!1,shadowBlur:5,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"black",shadowOpacity:1,visible:!0,draggable:!0,resizable:!0,selectable:!0,contentEditable:!0,styleEditable:!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),e.locked&&(t.draggable=!1,t.contentEditable=!1,t.styleEditable=!1,t.resizable=!1),t})).views((e=>{const t=(0,mobx_1.observable)({x:e.x,y:e.y,width:e.width,height:e.height,rotation:e.rotation,opacity:e.opacity,color:e.color,fontSize:e.fontSize}),a=(0,mobx_1.action)((e=>{Object.assign(t,e)}));return{get a(){const{currentTime:i}=e.store;if(a({x:e.x,y:e.y,width:e.width,height:e.height,rotation:e.rotation,opacity:e.opacity,color:e.color,fontSize:e.fontSize}),0===i)return t;const n=i-e.page.startTime;if(n>e.page.duration)return t;if(n<0)return t;const o=e.store.animatedElementsIds;if(o.length&&!o.includes(e.id))return t;const s=e.animations.find((e=>"enter"===e.type));(null==s?void 0:s.enabled)&&n<s.delay&&a({opacity:0});if((null==s?void 0:s.enabled)&&n>=s.delay&&n<=s.delay+s.duration){const t=n-s.delay,i=(0,animations_1.animate)({element:e,animation:s,dTime:t});a(i)}const r=e.animations.find((e=>"exit"===e.type));if((null==r?void 0:r.enabled)&&n>=e.page.duration-r.duration-r.delay&&n<=e.page.duration-r.delay){const t=n-(e.page.duration-r.duration),i=(0,animations_1.animate)({element:e,animation:r,dTime:t});a(i)}const d=e.animations.find((e=>"loop"===e.type));if(null==d?void 0:d.enabled){const t=n,i=(0,animations_1.animate)({element:e,animation:d,dTime:t});a(i)}return t},animated:t=>e.a[t]}})).actions((e=>({setAnimation(t,a){const i=e.animations.find((e=>e.type===t));i?Object.assign(i,a):e.animations.push(Object.assign({type:t},a))}})));
|