polotno 0.43.8 → 0.43.11

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.
@@ -1,4 +1,4 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var a=Object.getOwnPropertyDescriptor(t,r);a&&!("get"in a?!t.__esModule:a.writable||a.configurable)||(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,a)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=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.HTMLElement=exports.quillRef=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),quill_1=__importDefault(require("quill/dist/quill")),konva_1=__importDefault(require("konva")),mobx=__importStar(require("mobx")),flags_1=require("../utils/flags"),apply_filters_1=require("./apply-filters"),text_element_1=require("./text-element"),html2canvas_1=require("../utils/html2canvas"),use_fadein_1=require("./use-fadein"),highlighter_1=require("./highlighter"),react_konva_utils_1=require("react-konva-utils"),styled_1=__importDefault(require("../utils/styled")),loader_1=require("../utils/loader");exports.quillRef=mobx.observable({enabled:!1,currentFormat:{},editor:mobx.observable.object({instance:null},{},{deep:!1})});const RichTextContainer=(0,styled_1.default)("div",react_1.default.forwardRef)`
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var a=Object.getOwnPropertyDescriptor(t,r);a&&!("get"in a?!t.__esModule:a.writable||a.configurable)||(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,a)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=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.HTMLElement=exports.quillRef=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),quill_1=__importDefault(require("quill/dist/quill")),konva_1=__importDefault(require("konva")),mobx=__importStar(require("mobx")),flags_1=require("../utils/flags"),apply_filters_1=require("./apply-filters"),text_element_1=require("./text-element"),html2canvas_1=require("../utils/html2canvas"),use_fadein_1=require("./use-fadein"),highlighter_1=require("./highlighter"),react_konva_utils_1=require("react-konva-utils"),styled_1=__importDefault(require("../utils/styled")),loader_1=require("../utils/loader"),text_1=require("../utils/text");exports.quillRef=mobx.observable({enabled:!1,currentFormat:{},editor:mobx.observable.object({instance:null},{},{deep:!1})});const RichTextContainer=(0,styled_1.default)("div",react_1.default.forwardRef)`
2
2
  .ql-editor {
3
3
  outline: none;
4
4
  }
@@ -13,4 +13,7 @@
13
13
  strong {
14
14
  font-weight: 1800;
15
15
  }
16
- `,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",(()=>{var t;e.getSelection()&&(exports.quillRef.currentFormat=e.getFormat()),r(null===(t=a.current)||void 0===t?void 0:t.childNodes[0].innerHTML)})),e.setSelection(0,0,"api"),e.on("selection-change",(r=>{r||t(),r&&(exports.quillRef.currentFormat=e.getFormat())})),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}})};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>${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,[p]=(0,text_element_1.useFontLoader)(t,e.fontFamily);(0,use_fadein_1.useFadeIn)(r);const x=p?e.fontFamily:"Arial",v=getHtml(e,x),{width:y,height:b}=useHtmlSize(v,e,p);react_1.default.useEffect((()=>{if(!p)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 t=w.current,r=(0,loader_1.incrementLoader)(`text ${e.id}`);s(!0),async function(){await new Promise((e=>setTimeout(e)));const i=await(0,html2canvas_1.htmlToCanvas)({html:v,width:e.width||1,height:e.height||b||1,fontFamily:x,padding:g});t===w.current&&(a(i),s(!1),konva_1.default.Util.requestAnimFrame(r))}()}),[v,n,b,c,x]);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}))}));
16
+ .ql-direction-rtl {
17
+ direction: rtl;
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 t=w.current,r=(0,loader_1.incrementLoader)(`text ${e.id}`);s(!0),async function(){await new Promise((e=>setTimeout(e)));const i=await(0,html2canvas_1.htmlToCanvas)({html:v,width:e.width||1,height:e.height||b||1,fontFamily:p,padding:g});t===w.current&&(a(i),s(!1),konva_1.default.Util.requestAnimFrame(r))}()}),[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}))}));
@@ -5,6 +5,7 @@ declare type ShapeProps = {
5
5
  element: TextElementType;
6
6
  };
7
7
  export declare function isRTLText(string: string): boolean;
8
+ export declare function getDir(string: string): "ltr" | "rtl";
8
9
  export declare const useFontLoader: (store: StoreType, fontFamily: string) => any[];
9
10
  export declare const TextElement: (({ element, store }: ShapeProps) => JSX.Element) & {
10
11
  displayName: string;
@@ -1 +1 @@
1
- "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TextElement=exports.useFontLoader=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")),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"),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){return new RegExp("^[^֑-߿‏‫‮יִ-﷽ﹰ-ﻼ]*?[֑-߿‏‫‮יִ-﷽ﹰ-ﻼ]").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;const TextInput=(0,mobx_react_lite_1.observer)((({textNodeRef:e,element:t,onBlur:r,selectAll:n,cursorPosition:o})=>{const[i,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()+10+"px",e.fontSize=l.fontSize()+"px",e.lineHeight=l.lineHeight()+.01,e.fontFamily=l.fontFamily(),e.textAlign=l.align(),e.color=l.fill(),e.fontWeight=t.fontWeight,e.fontStyle=t.fontStyle;const r=`\n .polotno-input::placeholder {\n color: ${i.color};\n opacity: 0.6;\n }\n `;styleNode.innerHTML="",styleNode.appendChild(document.createTextNode(r)),JSON.stringify(e)!==JSON.stringify(i)&&a(e)}));const s=react_1.default.useRef(null);react_1.default.useEffect((()=>{var e;const t=s.current;if(!t)return;null===(e=s.current)||void 0===e||e.focus();const r=o||t.value.length;t.selectionStart=t.selectionEnd=r,n&&(null==t||t.select(),document.execCommand("selectAll",!1,null))}),[]);let c=0;const u=l.textArr.length*l.lineHeight()*l.fontSize();return"middle"===t.verticalAlign&&(c=(t.height-u)/2),"bottom"===t.verticalAlign&&(c=t.height-u),react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement("textarea",{className:"polotno-input",ref:s,dir:getDir(t.text),style:Object.assign(Object.assign(Object.assign({},initialStyles),i),{paddingTop:c+"px"}),value:t.text,onChange:e=>{t.set({text:e.target.value})},placeholder:t.placeholder,onBlur:r}))})),useEditor=e=>{const[t,r]=react_1.default.useState(!1),n=react_1.default.useRef(!1);return react_1.default.useEffect((()=>{var t=!0;return setTimeout((()=>{t&&(e._editModeEnabled&&(n.current=!0),r(!0),setTimeout((()=>{n.current=!1}),50))}),50),()=>{t=!1}}),[]),{editorEnabled:t&&e._editModeEnabled,selectAll:n.current}},useFontLoader=(e,t)=>{const[r,n]=react_1.default.useState((0,fonts_1.isFontLoaded)(t));return react_1.default.useLayoutEffect((()=>{if((0,fonts_1.isFontLoaded)(t))return void n(!0);let o=!0;return(async()=>{r&&n(!1);const i=(0,loader_1.incrementLoader)(`text ${t}`);await e.loadFont(t),konva_1.default.Util.requestAnimFrame(i),o&&n(!0)})(),()=>{o=!1}}),[t]),[r]};exports.useFontLoader=useFontLoader;const getLineHeight=({fontLoaded:e,fontFamily:t,fontSize:r,lineHeight:n})=>react_1.default.useMemo((()=>{if("number"==typeof n)return n;const e=document.createElement("div");e.style.fontFamily=t,e.style.fontSize=r+"px",e.style.lineHeight=n,e.innerText="Test text",document.body.appendChild(e);const o=e.offsetHeight;return document.body.removeChild(e),o/r}),[e,t,r,n]);function getRelativePointerPosition(e){var t=e.getAbsoluteTransform().copy();t.invert();var r=e.getStage().getPointerPosition();return t.point(r)}function getCursorPosition(e){var t;const r=e.target,n=getRelativePointerPosition(r),o=r.textArr,i=Math.floor(n.y/(r.fontSize()*r.lineHeight())),a=o.slice(0,i).reduce(((e,t)=>e+t.text.length),i),l=null!==(t=o[i])&&void 0!==t?t:o[0];let s=0;"right"===r.align()?s=r.width()-l.width:"center"===r.align()&&(s=r.width()/2-l.width/2);return 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.useEffect((()=>{r.current=t.current,t.current=e}),[e]),r.current}function findFitFontSize(e,t){const r=e.getAttrs(),n=(0,text_1.removeTags)(t.text);let o=t.fontSize;const i=Math.round(2*t.fontSize)-1;for(let r=1;r<i;r++){const r=t.height&&e.height()>t.height,i=n.split("\n").join(" ").split(" ");let a=e.textArr.map((e=>e.text)).join(";");const l=i.find((e=>!a.includes(e)||(a=a.replace(e,""),!1)));if(!(r||l))break;o-=.5,e.fontSize(o)}return e.fontSize(r.fontSize),o}exports.TextElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),{editorEnabled:n,selectAll:o}=useEditor(e),[i,a]=react_1.default.useState(!1),[l,s]=react_1.default.useState(!1),c=react_1.default.useRef(e.height),u=t.selectedElements.indexOf(e)>=0,{textVerticalResizeEnabled:d}=flags_1.flags,f=usePrevious(e.fontFamily);react_1.default.useEffect((()=>{if(e.width)return;const t=r.current;t.width(600),e.set({width:1.4*t.getTextWidth()})}),[]),react_1.default.useLayoutEffect((()=>(0,mobx_1.autorun)((()=>{const t=r.current;(0,apply_filters_1.applyFilter)(t,e)}))));const[h]=(0,exports.useFontLoader)(t,e.fontFamily),g=(0,text_1.removeTags)(e.text),_=()=>{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.useEffect((()=>{if(!h)return;const{forceTextFitEnabled:t}=flags_1.flags;if(e.height&&t&&!l){const t=findFitFontSize(r.current,e);if(t!==e.fontSize)return void e.set({fontSize:t});const n=_();e.height!==n&&e.set({height:n})}else{const t=_();d&&e.height<t&&e.set({height:t}),d||e.height===t||e.set({height:t})}})),react_1.default.useLayoutEffect((()=>{const t=r.current;t&&(t.width(t.width()+1e-8),t._setTextData(),(0,apply_filters_1.applyFilter)(t,e))}),[h]);const x=react_1.default.useRef(null),p=react_1.default.useRef(0),m=r=>{const n=t.selectedElements.find((t=>t===e));n&&!e.locked&&(p.current=getCursorPosition(r),e.toggleEditMode())},y=!g&&e.placeholder,v=e._editModeEnabled?0:y?.6:e.opacity;(0,use_fadein_1.useFadeIn)(r,v);const S=getLineHeight({fontLoaded:h,fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:e.lineHeight}),E=e.selectable||"admin"===t.role;return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Text,{ref:r,id:e.id,name:"element",hideInExport:!e.showInExport,x:e.x,y:e.y,rotation:e.rotation,width:e.width,height:e.height||void 0,text:g||e.placeholder,fill:e.fill,stroke:e.stroke,strokeWidth:e.strokeWidth,fillAfterStrokeEnabled:!0,fontSize:e.fontSize,fontFamily:`"${e.fontFamily}", "${f}"`,fontStyle:e.fontStyle+" "+e.fontWeight,textDecoration:e.textDecoration,align:e.align,verticalAlign:e.verticalAlign,draggable:!e.locked,opacity:v,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,lineHeight:S,letterSpacing:e.letterSpacing*e.fontSize,listening:E,onDragStart:()=>{t.history.startTransaction()},hideInExport:!e.showInExport,onDragMove:t=>{setTimeout((()=>{e.set({x:t.target.x(),y:t.target.y()})}))},onDragEnd:r=>{e.set({x:r.target.x(),y:r.target.y()}),t.history.endTransaction()},onMouseEnter:()=>{a(!0)},onMouseLeave:()=>{a(!1)},onClick:m,onTap:m,onTransformStart:()=>{s(!0),t.history.startTransaction(),c.current=r.current.height()},onTransform:t=>{var r;const n=t.target,o=(null===(r=n.getStage())||void 0===r?void 0:r.findOne("Transformer")).getActiveAnchor();if("middle-left"===o||"middle-right"===o){const t=n.scaleX(),r=n.width()*t,o=e.fontSize;let i=r;if(r<o&&(i=o,x.current&&n.position(x.current)),n.width(i),n.scaleX(1),n.scaleY(1),n.setHeight(void 0),flags_1.flags.textVerticalResizeEnabled){const e=_(),t=Math.max(e,c.current);n.height(t)}e.set({x:n.x(),y:n.y(),width:n.width(),height:n.height(),rotation:n.rotation()}),(0,apply_filters_1.applyFilter)(n,e)}if("top-center"===o||"bottom-center"===o){const e=_();t.target.height(Math.max(e,t.target.height()*t.target.scaleY())),t.target.scaleY(1)}t.target.strokeWidth(e.strokeWidth/t.target.scaleX()),x.current=t.target.position()},onTransformEnd:r=>{s(!1);const n=r.target.scaleX();r.target.scaleX(1),r.target.scaleY(1),r.target.strokeWidth(e.strokeWidth),e.set({fontSize:Math.round(e.fontSize*n),width:Math.ceil(r.target.width()*n),x:r.target.x(),y:r.target.y(),rotation:r.target.rotation(),height:r.target.height()}),t.history.endTransaction()}}),n&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(TextInput,{textNodeRef:r,element:e,selectAll:o,cursorPosition:p.current,onBlur:()=>{e.toggleEditMode(!1)}})),!l&&(i||u)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TextElement=exports.useFontLoader=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")),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"),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){return new RegExp("^[^֑-߿‏‫‮יִ-﷽ﹰ-ﻼ]*?[֑-߿‏‫‮יִ-﷽ﹰ-ﻼ]").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:o})=>{const[i,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()+10+"px",e.fontSize=l.fontSize()+"px",e.lineHeight=l.lineHeight()+.01,e.fontFamily=l.fontFamily(),e.textAlign=l.align(),e.color=l.fill(),e.fontWeight=t.fontWeight,e.fontStyle=t.fontStyle;const r=`\n .polotno-input::placeholder {\n color: ${i.color};\n opacity: 0.6;\n }\n `;styleNode.innerHTML="",styleNode.appendChild(document.createTextNode(r)),JSON.stringify(e)!==JSON.stringify(i)&&a(e)}));const s=react_1.default.useRef(null);react_1.default.useEffect((()=>{var e;const t=s.current;if(!t)return;null===(e=s.current)||void 0===e||e.focus();const r=o||t.value.length;t.selectionStart=t.selectionEnd=r,n&&(null==t||t.select(),document.execCommand("selectAll",!1,null))}),[]);let c=0;const u=l.textArr.length*l.lineHeight()*l.fontSize();return"middle"===t.verticalAlign&&(c=(t.height-u)/2),"bottom"===t.verticalAlign&&(c=t.height-u),react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement("textarea",{className:"polotno-input",ref:s,dir:getDir(t.text),style:Object.assign(Object.assign(Object.assign({},initialStyles),i),{paddingTop:c+"px"}),value:t.text,onChange:e=>{t.set({text:e.target.value})},placeholder:t.placeholder,onBlur:r}))})),useEditor=e=>{const[t,r]=react_1.default.useState(!1),n=react_1.default.useRef(!1);return react_1.default.useEffect((()=>{var t=!0;return setTimeout((()=>{t&&(e._editModeEnabled&&(n.current=!0),r(!0),setTimeout((()=>{n.current=!1}),50))}),50),()=>{t=!1}}),[]),{editorEnabled:t&&e._editModeEnabled,selectAll:n.current}},useFontLoader=(e,t)=>{const[r,n]=react_1.default.useState((0,fonts_1.isFontLoaded)(t));return react_1.default.useLayoutEffect((()=>{if((0,fonts_1.isFontLoaded)(t))return void n(!0);let o=!0;return(async()=>{r&&n(!1);const i=(0,loader_1.incrementLoader)(`text ${t}`);await e.loadFont(t),konva_1.default.Util.requestAnimFrame(i),o&&n(!0)})(),()=>{o=!1}}),[t]),[r]};exports.useFontLoader=useFontLoader;const getLineHeight=({fontLoaded:e,fontFamily:t,fontSize:r,lineHeight:n})=>react_1.default.useMemo((()=>{if("number"==typeof n)return n;const e=document.createElement("div");e.style.fontFamily=t,e.style.fontSize=r+"px",e.style.lineHeight=n,e.innerText="Test text",document.body.appendChild(e);const o=e.offsetHeight;return document.body.removeChild(e),o/r}),[e,t,r,n]);function getRelativePointerPosition(e){var t=e.getAbsoluteTransform().copy();t.invert();var r=e.getStage().getPointerPosition();return t.point(r)}function getCursorPosition(e){var t;const r=e.target,n=getRelativePointerPosition(r),o=r.textArr,i=Math.floor(n.y/(r.fontSize()*r.lineHeight())),a=o.slice(0,i).reduce(((e,t)=>e+t.text.length),i),l=null!==(t=o[i])&&void 0!==t?t:o[0];let s=0;"right"===r.align()?s=r.width()-l.width:"center"===r.align()&&(s=r.width()/2-l.width/2);return 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.useEffect((()=>{r.current=t.current,t.current=e}),[e]),r.current}function findFitFontSize(e,t){const r=e.getAttrs(),n=(0,text_1.removeTags)(t.text);let o=t.fontSize;const i=Math.round(2*t.fontSize)-1;for(let r=1;r<i;r++){const r=t.height&&e.height()>t.height,i=n.split("\n").join(" ").split(" ");let a=e.textArr.map((e=>e.text)).join(";");const l=i.find((e=>!a.includes(e)||(a=a.replace(e,""),!1)));if(!(r||l))break;o-=.5,e.fontSize(o)}return e.fontSize(r.fontSize),o}exports.TextElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),{editorEnabled:n,selectAll:o}=useEditor(e),[i,a]=react_1.default.useState(!1),[l,s]=react_1.default.useState(!1),c=react_1.default.useRef(e.height),u=t.selectedElements.indexOf(e)>=0,{textVerticalResizeEnabled:d}=flags_1.flags,f=usePrevious(e.fontFamily);react_1.default.useEffect((()=>{if(e.width)return;const t=r.current;t.width(600),e.set({width:1.4*t.getTextWidth()})}),[]),react_1.default.useLayoutEffect((()=>(0,mobx_1.autorun)((()=>{const t=r.current;(0,apply_filters_1.applyFilter)(t,e)}))));const[h]=(0,exports.useFontLoader)(t,e.fontFamily),g=(0,text_1.removeTags)(e.text),_=()=>{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.useEffect((()=>{if(!h)return;const{forceTextFitEnabled:t}=flags_1.flags;if(e.height&&t&&!l){const t=findFitFontSize(r.current,e);if(t!==e.fontSize)return void e.set({fontSize:t});const n=_();e.height!==n&&e.set({height:n})}else{const t=_();d&&e.height<t&&e.set({height:t}),d||e.height===t||e.set({height:t})}})),react_1.default.useLayoutEffect((()=>{const t=r.current;t&&(t.width(t.width()+1e-8),t._setTextData(),(0,apply_filters_1.applyFilter)(t,e))}),[h]);const x=react_1.default.useRef(null),p=react_1.default.useRef(0),m=r=>{const n=t.selectedElements.find((t=>t===e));n&&!e.locked&&(p.current=getCursorPosition(r),e.toggleEditMode())},y=!g&&e.placeholder,v=e._editModeEnabled?0:y?.6:e.opacity;(0,use_fadein_1.useFadeIn)(r,v);const S=getLineHeight({fontLoaded:h,fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:e.lineHeight}),E=e.selectable||"admin"===t.role;return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Text,{ref:r,id:e.id,name:"element",hideInExport:!e.showInExport,x:e.x,y:e.y,rotation:e.rotation,width:e.width,height:e.height||void 0,text:g||e.placeholder,fill:e.fill,stroke:e.stroke,strokeWidth:e.strokeWidth,fillAfterStrokeEnabled:!0,fontSize:e.fontSize,fontFamily:`"${e.fontFamily}", "${f}"`,fontStyle:e.fontStyle+" "+e.fontWeight,textDecoration:e.textDecoration,align:e.align,verticalAlign:e.verticalAlign,draggable:!e.locked,opacity:v,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,lineHeight:S,letterSpacing:e.letterSpacing*e.fontSize,listening:E,onDragStart:()=>{t.history.startTransaction()},hideInExport:!e.showInExport,onDragMove:t=>{setTimeout((()=>{e.set({x:t.target.x(),y:t.target.y()})}))},onDragEnd:r=>{e.set({x:r.target.x(),y:r.target.y()}),t.history.endTransaction()},onMouseEnter:()=>{a(!0)},onMouseLeave:()=>{a(!1)},onClick:m,onTap:m,onTransformStart:()=>{s(!0),t.history.startTransaction(),c.current=r.current.height()},onTransform:t=>{var r;const n=t.target,o=(null===(r=n.getStage())||void 0===r?void 0:r.findOne("Transformer")).getActiveAnchor();if("middle-left"===o||"middle-right"===o){const t=n.scaleX(),r=n.width()*t,o=e.fontSize;let i=r;if(r<o&&(i=o,x.current&&n.position(x.current)),n.width(i),n.scaleX(1),n.scaleY(1),n.setHeight(void 0),flags_1.flags.textVerticalResizeEnabled){const e=_(),t=Math.max(e,c.current);n.height(t)}e.set({x:n.x(),y:n.y(),width:n.width(),height:n.height(),rotation:n.rotation()}),(0,apply_filters_1.applyFilter)(n,e)}if("top-center"===o||"bottom-center"===o){const e=_();t.target.height(Math.max(e,t.target.height()*t.target.scaleY())),t.target.scaleY(1)}t.target.strokeWidth(e.strokeWidth/t.target.scaleX()),x.current=t.target.position()},onTransformEnd:r=>{s(!1);const n=r.target.scaleX();r.target.scaleX(1),r.target.scaleY(1),r.target.strokeWidth(e.strokeWidth),e.set({fontSize:Math.round(e.fontSize*n),width:Math.ceil(r.target.width()*n),x:r.target.x(),y:r.target.y(),rotation:r.target.rotation(),height:r.target.height()}),t.history.endTransaction()}}),n&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(TextInput,{textNodeRef:r,element:e,selectAll:o,cursorPosition:p.current,onBlur:()=>{e.toggleEditMode(!1)}})),!l&&(i||u)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "polotno",
3
- "version": "0.43.8",
3
+ "version": "0.43.11",
4
4
  "description": "Design Editor Framework",
5
5
  "author": "Anton Lavrenov",
6
6
  "keywords": [