polotno 0.43.13 → 0.43.14
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/package.json +1 -1
- package/polotno.bundle.js +36 -36
- package/utils/html2canvas.d.ts +2 -1
- package/utils/html2canvas.js +1 -1
package/canvas/html-element.js
CHANGED
|
@@ -16,4 +16,4 @@
|
|
|
16
16
|
.ql-direction-rtl {
|
|
17
17
|
direction: rtl;
|
|
18
18
|
}
|
|
19
|
-
`,RichEditor=({html:e,onBlur:t,onChange:r,element:i})=>{const a=react_1.default.useRef(null);return react_1.default.useEffect((()=>{if(!a.current)return;const e=new quill_1.default(a.current,{toolbar:!1,keyboard:!1,clipboard:{matchVisual:!1}});return exports.quillRef.editor.instance=e,window.__polotnoQuill=e,e.on("text-change",(()=>{e.getSelection()&&(exports.quillRef.currentFormat=e.getFormat()),setTimeout((()=>{var e;r(null===(e=a.current)||void 0===e?void 0:e.childNodes[0].innerHTML)}),10)})),e.setSelection(0,0,"api"),e.on("selection-change",(r=>{r||t(),r&&(exports.quillRef.currentFormat=e.getFormat())})),a.current.childNodes[0].addEventListener("blur",(e=>{var r;(null===(r=e.relatedTarget)||void 0===r?void 0:r.classList.contains("ql-clipboard"))||t()})),()=>{exports.quillRef.editor.instance=null,exports.quillRef.currentFormat={},delete window.__polotnoQuill}}),[]),react_1.default.useEffect((()=>{var t;const r=exports.quillRef.editor.instance,n=r.getSelection();if(!((null===(t=a.current)||void 0===t?void 0:t.childNodes[0].innerHTML)===i.text)){var l=r.clipboard.convert("<div class='ql-editor' style='outline: none;'>"+e+"<p><br></p></div>");r.setContents(l),r.history.clear(),n&&(r.setSelection(n.index,n.length),exports.quillRef.currentFormat=r.getFormat())}}),[i.text]),react_1.default.createElement(RichTextContainer,{ref:a,style:{fontSize:i.fontSize,color:i.fill,width:i.width,fontFamily:i.fontFamily,lineHeight:i.lineHeight,letterSpacing:i.letterSpacing+"rem",textAlign:i.align},dir:(0,text_element_1.getDir)((0,text_1.removeTags)(i.text))})};function useHtmlSize(e,t,r){return react_1.default.useMemo((()=>(0,html2canvas_1.detectSize)(e)),[e,t.width,r])}function getHtml(e,t){return`<div style="white-space: pre-wrap; width: ${e.width||100}px; color: ${e.fill}; 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}</div>`}const findFitFontSize=e=>{let t=e.fontSize;for(let r=1;r<50;r++){const r=getHtml(Object.assign(Object.assign({},e.toJSON()),{fontSize:t}),e.fontFamily),{height:i}=(0,html2canvas_1.detectSize)(r);if(!(e.height&&i>e.height))break;t-=.5}return t};exports.HTMLElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),[i,a]=react_1.default.useState(),[n,l]=react_1.default.useState(!1),[o,s]=react_1.default.useState(!0),[c,u]=react_1.default.useState(!1),[d,f]=react_1.default.useState(!1),h=react_1.default.useRef(e.height),_=t.selectedElements.indexOf(e)>=0,g=e.fontSize/4,{textVerticalResizeEnabled:m}=flags_1.flags,[x]=(0,text_element_1.useFontLoader)(t,e.fontFamily);(0,use_fadein_1.useFadeIn)(r);const p=x?e.fontFamily:"Arial",v=getHtml(e,p),{width:y,height:b}=useHtmlSize(v,e,x);react_1.default.useEffect((()=>{if(!x)return;const{forceTextFitEnabled:t}=flags_1.flags;if(e.height&&t&&!n){const t=findFitFontSize(e);t!==e.fontSize?e.set({fontSize:t}):e.height!==b&&e.set({height:b})}else m&&e.height<b&&e.set({height:b}),m||e.height===b||e.set({height:b})}));const w=react_1.default.useRef(0);react_1.default.useLayoutEffect((()=>{if(n||c)return;w.current++;const
|
|
19
|
+
`,RichEditor=({html:e,onBlur:t,onChange:r,element:i})=>{const a=react_1.default.useRef(null);return react_1.default.useEffect((()=>{if(!a.current)return;const e=new quill_1.default(a.current,{toolbar:!1,keyboard:!1,clipboard:{matchVisual:!1}});return exports.quillRef.editor.instance=e,window.__polotnoQuill=e,e.on("text-change",(()=>{e.getSelection()&&(exports.quillRef.currentFormat=e.getFormat()),setTimeout((()=>{var e;r(null===(e=a.current)||void 0===e?void 0:e.childNodes[0].innerHTML)}),10)})),e.setSelection(0,0,"api"),e.on("selection-change",(r=>{r||t(),r&&(exports.quillRef.currentFormat=e.getFormat())})),a.current.childNodes[0].addEventListener("blur",(e=>{var r;(null===(r=e.relatedTarget)||void 0===r?void 0:r.classList.contains("ql-clipboard"))||t()})),()=>{exports.quillRef.editor.instance=null,exports.quillRef.currentFormat={},delete window.__polotnoQuill}}),[]),react_1.default.useEffect((()=>{var t;const r=exports.quillRef.editor.instance,n=r.getSelection();if(!((null===(t=a.current)||void 0===t?void 0:t.childNodes[0].innerHTML)===i.text)){var l=r.clipboard.convert("<div class='ql-editor' style='outline: none;'>"+e+"<p><br></p></div>");r.setContents(l),r.history.clear(),n&&(r.setSelection(n.index,n.length),exports.quillRef.currentFormat=r.getFormat())}}),[i.text]),react_1.default.createElement(RichTextContainer,{ref:a,style:{fontSize:i.fontSize,color:i.fill,width:i.width,fontFamily:i.fontFamily,lineHeight:i.lineHeight,letterSpacing:i.letterSpacing+"rem",textAlign:i.align},dir:(0,text_element_1.getDir)((0,text_1.removeTags)(i.text))})};function useHtmlSize(e,t,r){return react_1.default.useMemo((()=>(0,html2canvas_1.detectSize)(e)),[e,t.width,r])}function getHtml(e,t){return`<div style="white-space: pre-wrap; width: ${e.width||100}px; color: ${e.fill}; 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}</div>`}const findFitFontSize=e=>{let t=e.fontSize;for(let r=1;r<50;r++){const r=getHtml(Object.assign(Object.assign({},e.toJSON()),{fontSize:t}),e.fontFamily),{height:i}=(0,html2canvas_1.detectSize)(r);if(!(e.height&&i>e.height))break;t-=.5}return t};exports.HTMLElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),[i,a]=react_1.default.useState(),[n,l]=react_1.default.useState(!1),[o,s]=react_1.default.useState(!0),[c,u]=react_1.default.useState(!1),[d,f]=react_1.default.useState(!1),h=react_1.default.useRef(e.height),_=t.selectedElements.indexOf(e)>=0,g=e.fontSize/4,{textVerticalResizeEnabled:m}=flags_1.flags,[x]=(0,text_element_1.useFontLoader)(t,e.fontFamily);(0,use_fadein_1.useFadeIn)(r);const p=x?e.fontFamily:"Arial",v=getHtml(e,p),{width:y,height:b}=useHtmlSize(v,e,x);react_1.default.useEffect((()=>{if(!x)return;const{forceTextFitEnabled:t}=flags_1.flags;if(e.height&&t&&!n){const t=findFitFontSize(e);t!==e.fontSize?e.set({fontSize:t}):e.height!==b&&e.set({height:b})}else m&&e.height<b&&e.set({height:b}),m||e.height===b||e.set({height:b})}));const w=react_1.default.useRef(0);react_1.default.useLayoutEffect((()=>{if(n||c)return;w.current++;const r=w.current,i=(0,loader_1.incrementLoader)(`text ${e.id}`);s(!0),async function(){await new Promise((e=>setTimeout(e)));const n=await(0,html2canvas_1.htmlToCanvas)({html:v,width:e.width||1,height:e.height||b||1,fontFamily:p,padding:g,font:t.fonts.find((e=>e.fontFamily===p))||t.globalFonts.find((e=>e.fontFamily===p))});r===w.current?(a(n),s(!1),konva_1.default.Util.requestAnimFrame(i)):i()}()}),[v,n,b,c,p]);const S=n||o;react_1.default.useLayoutEffect((()=>mobx.autorun((()=>{const t=r.current;(0,apply_filters_1.applyFilter)(t,e)}))),[i,S]);let E=0;return"middle"===e.verticalAlign&&(E=(e.height-b)/2),"bottom"===e.verticalAlign&&(E=e.height-b),react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,{ref:r,name:"element",x:e.x,y:e.y,listening:e.selectable,rotation:e.rotation,width:e.width,height:e.height,visible:!S,draggable:!e.locked,opacity:c?0:e.opacity,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,hideInExport:!e.showInExport,onMouseEnter:()=>{f(!0)},onMouseLeave:()=>{f(!1)},onDragStart:()=>{t.history.startTransaction()},onDragMove:t=>{setTimeout((()=>{e.set({x:t.target.x(),y:t.target.y()})}))},onDragEnd:r=>{e.set({x:r.target.x(),y:r.target.y()}),t.history.endTransaction()},id:e.id,onDblClick:()=>{e.locked||u(!0)},onDblTap:()=>{e.locked||u(!0)},onTransformStart:t=>{l(!0),h.current=e.height},onTransform:t=>{var r;const i=t.target,a=(null===(r=i.getStage())||void 0===r?void 0:r.findOne("Transformer")).getActiveAnchor(),n="middle-left"===a||"middle-right"===a,l="top-center"===a||"bottom-center"===a,o=i.scaleX();if(n){const t=i.scaleX(),r=Math.max(i.width()*t,e.fontSize);if(i.width(r),i.scaleX(1),flags_1.flags.textVerticalResizeEnabled){const t=Math.max(b,h.current);e.set({height:t})}e.set({width:r,x:i.x()})}else if(l){const r=Math.max(b),a=Math.max(r,t.target.height()*t.target.scaleY());i.scaleY(1),e.set({x:i.x(),y:i.y(),height:a,rotation:i.rotation()})}else i.scaleX(1),i.scaleY(1),e.set({fontSize:e.fontSize*o,width:i.width()*o,x:i.x(),y:i.y(),rotation:i.rotation()})},onTransformEnd:t=>{l(!1),s(!0);const r=t.target.scaleX();t.target.scaleX(1),t.target.scaleY(1),e.set({fontSize:e.fontSize*r,width:t.target.width()*r,x:t.target.x(),y:t.target.y(),rotation:t.target.rotation()})}}),react_1.default.createElement(react_konva_1.Image,{ref:r,image:i,x:e.x,y:e.y,offsetX:g,offsetY:g-E,listening:!1,rotation:e.rotation,width:e.width+2*g,height:e.height+2*g,visible:!S,opacity:c?0:e.opacity,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,hideInExport:!e.showInExport}),S&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.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:v},style:{pointerEvents:"none",display:"inline-block"}}))),c&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation,offsetY:-E},react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement(RichEditor,{html:v,element:e,onChange:t=>{e.set({text:t})},onBlur:e=>{u(!1)}}))),(_||d)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
|