polotno 0.42.4 → 0.42.7
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/hotkeys.js +1 -1
- package/canvas/html-element.js +1 -1
- package/canvas/page.js +1 -1
- package/canvas/text-element.js +1 -1
- package/config.d.ts +1 -0
- package/config.js +1 -1
- package/package.json +20 -20
- package/polotno.bundle.js +43 -43
- package/side-panel/layers-panel.js +1 -1
- package/svg-parser/svg-parser.d.ts +16 -0
- package/svg-parser/svg-parser.js +1 -0
- package/toolbar/html-toolbar.js +2 -2
- package/toolbar/text-toolbar.js +1 -1
- package/utils/flags.d.ts +2 -0
- package/utils/flags.js +1 -1
- package/utils/fonts.js +1 -1
- package/utils/html2canvas.d.ts +2 -1
- package/utils/html2canvas.js +1 -1
- package/utils/text.d.ts +1 -0
- package/utils/text.js +1 -0
- package/utils/unit.js +1 -1
package/canvas/hotkeys.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.handleHotkey=void 0;let clipBoard=[];function handleHotkey(e,t){var l,o,d,n;if("INPUT"===(null===(l=document.activeElement)||void 0===l?void 0:l.tagName)||"TEXTAREA"===(null===(o=document.activeElement)||void 0===o?void 0:o.tagName)||"true"===(null===(d=document.activeElement)||void 0===d?void 0:d.contentEditable))return;46!==e.keyCode&&8!==e.keyCode||t.deleteElements(t.selectedElementsIds);const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.handleHotkey=void 0;let clipBoard=[];function handleHotkey(e,t){var l,o,d,n;if("INPUT"===(null===(l=document.activeElement)||void 0===l?void 0:l.tagName)||"TEXTAREA"===(null===(o=document.activeElement)||void 0===o?void 0:o.tagName)||"true"===(null===(d=document.activeElement)||void 0===d?void 0:d.contentEditable))return;46!==e.keyCode&&8!==e.keyCode||t.deleteElements(t.selectedElementsIds);const c=e.ctrlKey||e.metaKey,r=e.shiftKey;if(c&&"KeyZ"===e.code&&(e.preventDefault(),t.history.undo()),c&&r&&"KeyZ"===e.code&&(e.preventDefault(),t.history.redo()),c&&"KeyA"===e.code){e.preventDefault();const l=null===(n=t.activePage)||void 0===n?void 0:n.children.filter((e=>e.selectable)),o=(null==l?void 0:l.map((e=>e.id)))||[];t.selectElements(o)}if(c&&"KeyC"===e.code&&(e.preventDefault(),clipBoard=t.selectedElements.map((e=>e.toJSON()))),c&&"KeyX"===e.code&&(e.preventDefault(),clipBoard=t.selectedElements.map((e=>e.toJSON())),t.deleteElements(t.selectedElementsIds)),c&&"KeyV"===e.code){e.preventDefault();const l=t.width/20;t.history.transaction((()=>{const e=[];clipBoard.forEach((o=>{var d;delete o.id,o.x+=l,o.y+=l;const n=null===(d=t.activePage)||void 0===d?void 0:d.addElement(o);e.push(null==n?void 0:n.id)})),t.selectElements(e)})),t.history.redo()}"ArrowDown"===e.code&&(e.preventDefault(),t.selectedElements.forEach((e=>{e.set({y:e.y+1})}))),"ArrowUp"===e.code&&(e.preventDefault(),t.selectedElements.forEach((e=>{e.set({y:e.y-1})}))),"ArrowLeft"===e.code&&(e.preventDefault(),t.selectedElements.forEach((e=>{e.set({x:e.x-1})}))),"ArrowRight"===e.code&&(e.preventDefault(),t.selectedElements.forEach((e=>{e.set({x:e.x+1})})))}exports.handleHotkey=handleHotkey;
|
package/canvas/html-element.js
CHANGED
|
@@ -13,4 +13,4 @@
|
|
|
13
13
|
strong {
|
|
14
14
|
font-weight: 1800;
|
|
15
15
|
}
|
|
16
|
-
`,RichEditor=({html:e,onBlur:t,onChange:r,element:a})=>{const i=react_1.default.useRef(null);return react_1.default.useEffect((()=>{if(!i.current)return;const e=new quill_1.default(i.current,{toolbar:!1,keyboard:!1,clipboard:{matchVisual:!1}});return exports.quillRef.editor.instance=e,window.__polotnoQuill=e,e.on("text-change",(()=>{var t;e.getSelection()&&(exports.quillRef.currentFormat=e.getFormat()),r(null===(t=i.current)||void 0===t?void 0:t.childNodes[0].innerHTML)})),e.setSelection(0,0,"api"),e.on("selection-change",(r=>{r||t(),r&&(exports.quillRef.currentFormat=e.getFormat())})),i.current.childNodes[0].addEventListener("blur",(e=>{var r;(null===(r=e.relatedTarget)||void 0===r?void 0:r.classList.contains("ql-clipboard"))||t()})),()=>{exports.quillRef.editor.instance=null,exports.quillRef.currentFormat={},delete window.__polotnoQuill}}),[]),react_1.default.useEffect((()=>{var t;const r=exports.quillRef.editor.instance,n=r.getSelection();if(!((null===(t=i.current)||void 0===t?void 0:t.childNodes[0].innerHTML)===a.text)){var
|
|
16
|
+
`,RichEditor=({html:e,onBlur:t,onChange:r,element:a})=>{const i=react_1.default.useRef(null);return react_1.default.useEffect((()=>{if(!i.current)return;const e=new quill_1.default(i.current,{toolbar:!1,keyboard:!1,clipboard:{matchVisual:!1}});return exports.quillRef.editor.instance=e,window.__polotnoQuill=e,e.on("text-change",(()=>{var t;e.getSelection()&&(exports.quillRef.currentFormat=e.getFormat()),r(null===(t=i.current)||void 0===t?void 0:t.childNodes[0].innerHTML)})),e.setSelection(0,0,"api"),e.on("selection-change",(r=>{r||t(),r&&(exports.quillRef.currentFormat=e.getFormat())})),i.current.childNodes[0].addEventListener("blur",(e=>{var r;(null===(r=e.relatedTarget)||void 0===r?void 0:r.classList.contains("ql-clipboard"))||t()})),()=>{exports.quillRef.editor.instance=null,exports.quillRef.currentFormat={},delete window.__polotnoQuill}}),[]),react_1.default.useEffect((()=>{var t;const r=exports.quillRef.editor.instance,n=r.getSelection();if(!((null===(t=i.current)||void 0===t?void 0:t.childNodes[0].innerHTML)===a.text)){var o=r.clipboard.convert("<div class='ql-editor' style='outline: none;'>"+e+"<p><br></p></div>");r.setContents(o),r.history.clear(),n&&(r.setSelection(n.index,n.length),exports.quillRef.currentFormat=r.getFormat())}}),[a.text]),react_1.default.createElement(RichTextContainer,{ref:i,style:{fontSize:a.fontSize,color:a.fill,width:a.width,fontFamily:a.fontFamily,lineHeight:a.lineHeight,letterSpacing:a.letterSpacing,textAlign:a.align}})};function useHtmlSize(e,t,r){return react_1.default.useMemo((()=>(0,html2canvas_1.detectSize)(e)),[e,t.width,r])}exports.HTMLElement=(0,mobx_react_lite_1.observer)((({element:e,store:t})=>{const r=react_1.default.useRef(null),[a,i]=react_1.default.useState(),[n,o]=react_1.default.useState(!1),[l,s]=react_1.default.useState(!0),[c,u]=react_1.default.useState(!1),[d,f]=react_1.default.useState(!1),_=react_1.default.useRef(e.height),h=t.selectedElements.indexOf(e)>=0,m=e.fontSize/4,[g]=(0,text_element_1.useFontLoader)(t,e.fontFamily);(0,use_fadein_1.useFadeIn)(r);const p=g?e.fontFamily:"Arial",x=`<div style="width: ${e.width||100}px; color: ${e.fill}; font-size: ${e.fontSize}px; font-family: '${p}'; text-decoration: ${e.textDecoration}; text-align: ${e.align}; line-height: ${e.lineHeight}; letter-spacing: ${e.letterSpacing}; font-style: ${e.fontStyle}; font-weight: ${e.fontWeight}; -webkit-text-stroke: ${e.strokeWidth}px ${e.stroke};" contentEditable>${e.text}</div>`,{width:v,height:y}=useHtmlSize(x,e,g);react_1.default.useEffect((()=>{e.set({height:y})}),[y]),react_1.default.useLayoutEffect((()=>{if(n||c)return;const t=(0,loader_1.incrementLoader)(`text ${e.id}`);s(!0),async function(){await new Promise((e=>setTimeout(e)));const r=await(0,html2canvas_1.htmlToCanvas)({html:x,width:e.width||1,height:y||1,fontFamily:p,padding:m});i(r),s(!1),konva_1.default.Util.requestAnimFrame(t)}()}),[x,n,y,c,p]);const b=n||l;return react_1.default.useLayoutEffect((()=>mobx.autorun((()=>{const t=r.current;(0,apply_filters_1.applyFilter)(t,e)}))),[a,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:!b,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=>{o(!0),_.current=e.height},onTransform:t=>{var r;const a=t.target,i=(null===(r=a.getStage())||void 0===r?void 0:r.findOne("Transformer")).getActiveAnchor(),n="middle-left"===i||"middle-right"===i,o="top-center"===i||"bottom-center"===i,l=a.scaleX();if(n){const t=a.scaleX(),r=Math.max(a.width()*t,e.fontSize);a.width(r),a.scaleX(1),e.set({width:r,x:a.x()})}else if(o){const r=Math.max(y,_.current),i=Math.max(r,t.target.height()*t.target.scaleY());a.scaleY(1),console.log(i),e.set({x:a.x(),y:a.y(),height:i,rotation:a.rotation()})}else a.scaleX(1),a.scaleY(1),e.set({fontSize:e.fontSize*l,width:a.width()*l,x:a.x(),y:a.y(),rotation:a.rotation()})},onTransformEnd:t=>{o(!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:a,x:e.x,y:e.y,offsetX:m,offsetY:m,listening:!1,rotation:e.rotation,width:e.width+2*m,height:e.height+2*m,visible:!b,opacity:c?0:e.opacity,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,hideInExport:!e.showInExport}),b&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(react_konva_utils_1.Html,{divProps:{style:{pointerEvents:"none"}}},react_1.default.createElement(RichTextContainer,{dangerouslySetInnerHTML:{__html:x},style:{pointerEvents:"none",display:"inline-block"}}))),c&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement(RichEditor,{html:x,element:e,onChange:t=>{e.set({text:t})},onBlur:e=>{u(!1)}}))),(h||d)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
|
package/canvas/page.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __rest=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.registerNextDomDrop=exports.registerTransformerAttrs=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")),element_1=__importDefault(require("./element")),use_transformer_snap_1=require("./use-transformer-snap"),image_element_1=require("./image-element"),crop_1=require("../utils/crop"),page_controls_1=require("./page-controls"),validate_key_1=require("../utils/validate-key"),math_1=require("../utils/math"),unit_1=require("../utils/unit"),DEFAULT_TRANSFORMER_ATTRIBUTES={enabledAnchors:["top-left","top-center","top-right","middle-left","bottom-left","bottom-right","bottom-center","middle-right"],rotateEnabled:!0,rotationSnaps:[0,45,90,135,180,225,270,315],ignoreStroke:!0,anchorStrokeWidth:2,borderStrokeWidth:2},transformerAttributes={text:{enabledAnchors:["top-left","top-right","middle-left","bottom-left","bottom-right","middle-right"]},svg:{enabledAnchors:["top-left","top-right","bottom-left","bottom-right"]},many:{enabledAnchors:["top-left","top-right","bottom-left","bottom-right"]}};function registerTransformerAttrs(e,t){transformerAttributes[e]=transformerAttributes[e]||t,Object.assign(transformerAttributes[e],t)}exports.registerTransformerAttrs=registerTransformerAttrs;const Background=e=>react_1.default.createElement(react_konva_1.Rect,Object.assign({},e,{preventDefault:!1})),ImageBackground=e=>{var{url:t}=e,n=__rest(e,["url"]);const[r,a]=(0,use_image_1.default)(t,"anonymous"),o=r?(0,crop_1.getCrop)(r,{width:n.width,height:n.height},"center-middle"):{};return(0,image_element_1.useImageLoader)(a),react_1.default.createElement(react_konva_1.Image,Object.assign({image:r},n,o))},ColorBackground=e=>react_1.default.createElement(react_konva_1.Rect,Object.assign({},e)),PageBackground=e=>{const{background:t,scale:n,borderColor:r}=e,a=__rest(e,["background","scale","borderColor"]),o=t.indexOf("http")>=0||t.indexOf(".png")>=0||t.indexOf(".jpg")>=0;return react_1.default.createElement(react_1.default.Fragment,null,o?react_1.default.createElement(ImageBackground,Object.assign({url:t},a)):react_1.default.createElement(ColorBackground,Object.assign({fill:t},a)))},Selection=(0,mobx_react_lite_1.observer)((({selection:e})=>e.visible?react_1.default.createElement(react_konva_1.Rect,{name:"selection",x:Math.min(e.x1,e.x2),y:Math.min(e.y1,e.y2),width:Math.abs(e.x1-e.x2),height:Math.abs(e.y1-e.y2),fill:"rgba(0, 161, 255, 0.3)"}):null)),Elements=(0,mobx_react_lite_1.observer)((({elements:e,store:t})=>{const n=e.filter((e=>e.alwaysOnTop)),r=e.filter((e=>!e.alwaysOnTop)).concat(n);return react_1.default.createElement(react_1.default.Fragment,null,r.map((e=>react_1.default.createElement(element_1.default,{key:e.id,store:t,element:e,onClick:()=>{console.warn("Polotno warning: onClick callback is deprecated. Just stop using it. Polotno will do selection automatically.")}}))))}));let onDomDrop=null;const registerNextDomDrop=e=>{onDomDrop=e};exports.registerNextDomDrop=registerNextDomDrop,exports.default=(0,mobx_react_lite_1.observer)((({store:e,page:t,width:n,height:r,pageControlsEnabled:a,backColor:o,pageBorderColor:i,activePageBorderColor:l,components:c})=>{const s=e._bleedVisible?t.bleed:0,d=t.computedWidth+2*s,m=t.computedHeight+2*s,u=(n-d*e.scale)/2,g=(r-m*e.scale)/2,_=react_1.default.useRef(null),h=react_1.default.useRef(null),p=react_1.default.useRef(null),f=null==a||a,[x,b]=react_1.default.useState(null),v=e.selectedElements.find((e=>e._cropModeEnabled)),E=e.selectedElements.filter((e=>e.locked)).length>0,y=e.selectedElements.filter((e=>!e.visible)).length>0;react_1.default.useEffect((()=>{var t,n;if(!_.current)return;const r=_.current.getStage(),a=e.selectedElements.map((e=>e._cropModeEnabled?null:r.findOne("#"+e.id))).filter((e=>e)),o=1===e.selectedElements.length&&(null===(t=e.selectedElements[0])||void 0===t?void 0:t.type)||"many";E?(_.current.enabledAnchors([]),_.current.rotateEnabled(!1)):transformerAttributes[o]?(_.current.setAttrs(Object.assign(Object.assign({},DEFAULT_TRANSFORMER_ATTRIBUTES),transformerAttributes[o])),"svg"!==o||e.selectedElements[0].keepRatio||_.current.setAttrs({enabledAnchors:DEFAULT_TRANSFORMER_ATTRIBUTES.enabledAnchors})):_.current.setAttrs(DEFAULT_TRANSFORMER_ATTRIBUTES),_.current.nodes(a),null===(n=_.current.getLayer())||void 0===n||n.batchDraw()}),[e.selectedElements,v,E,y]);const k=(0,mobx_react_lite_1.useLocalObservable)((()=>({visible:!1,x1:0,y1:0,x2:0,y2:0}))),w=react_1.default.useRef(!1),Y=(0,mobx_1.action)((n=>{var r,a;w.current=!1,e.activePage!==t&&t.select();const o=n.target.findAncestor(".elements-container"),i=n.target.findAncestor("Transformer"),l=n.target.findAncestor(".page-abs-container");if(o||i||l)return;const c=null===(r=n.target.getStage())||void 0===r?void 0:r.getPointerPosition();c&&(k.visible=!0,k.x1=c.x,k.y1=c.y,k.x2=c.x,k.y2=c.y,(null===(a=n.target.getStage())||void 0===a?void 0:a.getPointersPositions().length)>=2&&(k.visible=!1))}));react_1.default.useEffect((()=>{const t=(0,mobx_1.action)((e=>{var t,n;if(!k.visible)return;null===(t=h.current)||void 0===t||t.setPointersPositions(e);let r=(null===(n=h.current)||void 0===n?void 0:n.getPointerPosition())||{x:k.x2,y:k.y2};k.x2=r.x,k.y2=r.y})),n=(0,mobx_1.action)((()=>{if(!k.visible)return;if(!h.current)return;const t=h.current.findOne(".selection"),n=t?t.getClientRect():{width:0,height:0,x:0,y:0};if(n.width&&n.height){const t=[];h.current.find(".element").forEach((r=>{const a=r.getClientRect(),o=e.getElementById(r.id()),i=null==o?void 0:o.locked,l=null==o?void 0:o.selectable;konva_1.default.Util.haveIntersection(n,a)&&!i&&l&&t.push(r.id())})),e.selectElements(t)}k.visible=!1,w.current=!0}));return window.addEventListener("mousemove",t),window.addEventListener("touchmove",t),window.addEventListener("mouseup",n),window.addEventListener("touchend",n),()=>{window.removeEventListener("mousemove",t),window.removeEventListener("touchmove",t),window.removeEventListener("mouseup",n),window.removeEventListener("touchend",n)}}),[]);const X=t=>{if(w.current)return;const n=t.evt.ctrlKey||t.evt.metaKey||t.evt.shiftKey,r=t.target.findAncestor(".elements-container"),a=t.target.findAncestor(".page-abs-container"),o=t.target.findAncestor("Transformer");if(!(n||r||o||a))return void e.selectElements([]);const i=t.target.findAncestor(".element",!0),l=e.selectedElementsIds.indexOf(null==i?void 0:i.id())>=0;i&&n&&!l&&e.selectElements(e.selectedElementsIds.concat([i.id()])),i&&n&&l&&e.selectElements(e.selectedElementsIds.filter((e=>e!==i.id()))),!i||n||l||e.selectElements([i.id()])};(0,use_transformer_snap_1.useSnap)(_);const A=e.activePage===t,D=(null==c?void 0:c.PageControls)||page_controls_1.PageControls;return react_1.default.createElement("div",{ref:p,onDragOver:e=>e.preventDefault(),onDrop:t=>{if(t.preventDefault(),!h.current)return;h.current.setPointersPositions(t);const n=h.current.findOne(".elements-container").getRelativePointerPosition(),r=h.current.getPointerPosition(),a=h.current.getIntersection(r),o=a&&a.findAncestor(".element",!0),i=o?e.getElementById(o.id()):void 0;onDomDrop&&(onDomDrop(n,i),onDomDrop=null)},style:{position:"relative",width:n+"px"},className:"polotno-page-container"+(A?" active-page":"")},react_1.default.createElement(react_konva_1.Stage,{ref:h,width:n,height:r,onClick:X,onTap:X,onMouseDown:Y,onMouseMove:n=>{if(!n.evt.altKey&&x)return void b(null);if(!n.evt.altKey)return;const r=n.target.findAncestor(".element",!0),a=null==r?void 0:r.id();if(!e.selectedElements[0])return;if(e.selectedElementsIds.includes(a))return;const o=(0,math_1.getTotalClientRect)(e.selectedElements),i=a?e.getElementById(a):{x:0,y:0,width:t.computedWidth,height:t.computedHeight,rotation:0},l=(0,math_1.getClientRect)(i),c=[];o.minX>l.maxX&&c.push({distance:o.minX-l.maxX,box1:o,box2:l,points:[{x:o.minX,y:o.minY+o.height/2},{x:l.maxX,y:o.minY+o.height/2},{x:l.maxX,y:l.minY+l.height/2}]}),o.maxX<l.minX&&c.push({distance:l.minX-o.maxX,box1:o,box2:l,points:[{x:o.maxX,y:o.minY+o.height/2},{x:l.minX,y:o.minY+o.height/2},{x:l.minX,y:l.minY+l.height/2}]}),o.minY>l.maxY&&c.push({box1:o,box2:l,distance:o.minY-l.maxY,points:[{x:o.minX+o.width/2,y:o.minY},{x:o.minX+o.width/2,y:l.maxY},{x:l.minX+l.width/2,y:l.maxY}]}),o.maxY<l.minY&&c.push({box1:o,box2:l,distance:l.minY-o.maxY,points:[{x:o.minX+o.width/2,y:o.maxY},{x:o.minX+o.width/2,y:l.minY},{x:l.minX+l.width/2,y:l.minY}]});o.minX>=l.minX&&o.maxX<=l.maxX&&o.minY>=l.minY&&o.maxY<=l.maxY&&(c.push({distance:o.minX-l.minX,box1:o,box2:l,points:[{x:o.minX,y:o.minY+o.height/2},{x:l.minX,y:o.minY+o.height/2},{x:l.minX,y:l.minY+l.height/2}]}),c.push({distance:l.maxX-o.maxX,box1:o,box2:l,points:[{x:o.maxX,y:o.minY+o.height/2},{x:l.maxX,y:o.minY+o.height/2},{x:l.maxX,y:l.minY+l.height/2}]}),c.push({box1:o,box2:l,distance:o.minY-l.minY,points:[{x:o.minX+o.width/2,y:o.minY},{x:o.minX+o.width/2,y:l.minY},{x:l.minX+l.width/2,y:l.minY}]}),c.push({box1:o,box2:l,distance:l.maxY-o.maxY,points:[{x:o.minX+o.width/2,y:o.maxY},{x:o.minX+o.width/2,y:l.maxY},{x:l.minX+l.width/2,y:l.maxY}]})),JSON.stringify(x)!==JSON.stringify(c)&&b(c)},onDragStart:t=>{var n;if(t.target.hasName("element")){const r=t.target.id();!(e.selectedElementsIds.indexOf(r)>=0)&&r&&(e.selectElements([r]),null===(n=_.current)||void 0===n||n.startDrag(t))}x&&b(null)},pageId:t.id,style:{position:"relative"}},react_1.default.createElement(react_konva_1.Layer,null,react_1.default.createElement(Background,{width:n,height:r,fill:o}),react_1.default.createElement(react_konva_1.Group,{x:u,y:g,scaleX:e.scale,scaleY:e.scale,name:"page-container"},react_1.default.createElement(react_konva_1.Rect,{name:"page-highlight",hideInExport:!0,x:-1.5/e.scale,y:-1.5/e.scale,width:d+3/e.scale,height:m+3/e.scale,stroke:A&&e.pages.length>1?l:i,strokeWidth:3,listening:!1,strokeScaleEnabled:!1}),react_1.default.createElement(react_konva_1.Group,{name:"page-background-group",x:s,y:s,clipX:-s,clipY:-s,clipWidth:t.computedWidth+2*s,clipHeight:t.computedHeight+2*s},react_1.default.createElement(PageBackground,{x:-t.bleed,y:-t.bleed,width:t.computedWidth+2*t.bleed,height:t.computedHeight+2*t.bleed,background:t.background,shadowBlur:10,shadowColor:"lightgrey",name:"page-background",preventDefault:!1,scale:e.scale})),react_1.default.createElement(react_konva_1.Group,{x:s,y:s,clipX:-s,clipY:-s,clipWidth:t.computedWidth+2*s,clipHeight:t.computedHeight+2*s,name:"elements-container"},react_1.default.createElement(react_konva_1.Rect,{name:"elements-area",width:t.computedWidth,height:t.computedHeight,listening:!1}),react_1.default.createElement(Elements,{elements:t.children,store:e})),react_1.default.createElement(react_konva_1.Rect,{stroke:"red",name:"bleed",strokeWidth:t.bleed,x:t.bleed/2,y:t.bleed/2,width:t.computedWidth+t.bleed,height:t.computedHeight+t.bleed,opacity:.1,listening:!1,visible:t.bleed>0&&e._bleedVisible,hideInExport:!0})),react_1.default.createElement(react_konva_1.Group,{x:u+s*e.scale,y:g+s*e.scale,scaleX:e.scale,scaleY:e.scale,name:"page-abs-container"},react_1.default.createElement(react_konva_1.Transformer,{ref:_,boundBoxFunc:(e,t)=>{const n=t.width<1||t.height<1,r=e.width<1||e.height<1;return n&&!r?e:t}}),x&&x.map((({points:t,distance:n,box1:r,box2:a},o)=>react_1.default.createElement(react_konva_1.Group,{name:"distances-container",hideInExport:!0,key:o,listening:!1},react_1.default.createElement(react_konva_1.Rect,Object.assign({},r,{stroke:"rgb(0, 161, 255)",strokeWidth:1,strokeScaleEnabled:!1})),react_1.default.createElement(react_konva_1.Rect,Object.assign({},a,{stroke:"rgb(0, 161, 255)",strokeWidth:1,strokeScaleEnabled:!1})),react_1.default.createElement(react_konva_1.Line,{points:[t[0].x,t[0].y,t[1].x,t[1].y],stroke:"rgb(0, 161, 255)",strokeWidth:1,strokeScaleEnabled:!1}),react_1.default.createElement(react_konva_1.Line,{points:[t[1].x,t[1].y,t[2].x,t[2].y],stroke:"rgb(0, 161, 255)",strokeWidth:1,strokeScaleEnabled:!1}),react_1.default.createElement(react_konva_1.Label,{x:(t[0].x+t[1].x)/2,y:(t[0].y+t[1].y)/2,offsetY:-10,scaleX:1/e.scale,scaleY:1/e.scale},react_1.default.createElement(react_konva_1.Tag,{cornerRadius:5,fill:"rgb(0, 161, 255)",pointerDirection:"down"}),react_1.default.createElement(react_konva_1.Text,{align:"center",verticalAlign:"middle",fill:"white",padding:5,text:(0,unit_1.pxToUnitString)({unit:e.unit,dpi:e.dpi,px:n})})))))),react_1.default.createElement(Selection,{selection:k}),validate_key_1.shouldShowCredit.value&&react_1.default.createElement(react_konva_1.Text,{text:"Powered by polotno.dev",fontSize:14,fill:"rgba(0,0,0,0.6)",x:n-170,y:r-18,onMouseEnter:e=>{e.target.getStage().container().style.cursor="pointer"},onMouseLeave:e=>{e.target.getStage().container().style.cursor=""},onTouchStart:e=>{e.cancelBubble=!0},onMouseDown:e=>{e.cancelBubble=!0},onClick:()=>{window.open("https://polotno.dev")},onTap:()=>{window.open("https://polotno.dev")}}),react_1.default.createElement(react_konva_1.Group,{name:"line-guides"}))),f&&A&&react_1.default.createElement(D,{store:e,page:t,xPadding:u,yPadding:g}))}));
|
|
1
|
+
"use strict";var __rest=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.registerNextDomDrop=exports.registerTransformerAttrs=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")),element_1=__importDefault(require("./element")),use_transformer_snap_1=require("./use-transformer-snap"),image_element_1=require("./image-element"),crop_1=require("../utils/crop"),page_controls_1=require("./page-controls"),validate_key_1=require("../utils/validate-key"),math_1=require("../utils/math"),unit_1=require("../utils/unit"),flags_1=require("../utils/flags"),DEFAULT_TRANSFORMER_ATTRIBUTES={enabledAnchors:["top-left","top-center","top-right","middle-left","bottom-left","bottom-right","bottom-center","middle-right"],rotateEnabled:!0,rotationSnaps:[0,45,90,135,180,225,270,315],ignoreStroke:!0,anchorStrokeWidth:2,borderStrokeWidth:2},transformerAttributes={text:{enabledAnchors:["top-left","top-right","middle-left","bottom-left","bottom-right","middle-right"]},svg:{enabledAnchors:["top-left","top-right","bottom-left","bottom-right"]},many:{enabledAnchors:["top-left","top-right","bottom-left","bottom-right"]}};function registerTransformerAttrs(e,t){transformerAttributes[e]=transformerAttributes[e]||t,Object.assign(transformerAttributes[e],t)}exports.registerTransformerAttrs=registerTransformerAttrs;const Background=e=>react_1.default.createElement(react_konva_1.Rect,Object.assign({},e,{preventDefault:!1})),ImageBackground=e=>{var{url:t}=e,n=__rest(e,["url"]);const[r,a]=(0,use_image_1.default)(t,"anonymous"),o=r?(0,crop_1.getCrop)(r,{width:n.width,height:n.height},"center-middle"):{};return(0,image_element_1.useImageLoader)(a),react_1.default.createElement(react_konva_1.Image,Object.assign({image:r},n,o))},ColorBackground=e=>react_1.default.createElement(react_konva_1.Rect,Object.assign({},e)),PageBackground=e=>{const{background:t,scale:n,borderColor:r}=e,a=__rest(e,["background","scale","borderColor"]),o=t.indexOf("http")>=0||t.indexOf(".png")>=0||t.indexOf(".jpg")>=0;return react_1.default.createElement(react_1.default.Fragment,null,o?react_1.default.createElement(ImageBackground,Object.assign({url:t},a)):react_1.default.createElement(ColorBackground,Object.assign({fill:t},a)))},Selection=(0,mobx_react_lite_1.observer)((({selection:e})=>e.visible?react_1.default.createElement(react_konva_1.Rect,{name:"selection",x:Math.min(e.x1,e.x2),y:Math.min(e.y1,e.y2),width:Math.abs(e.x1-e.x2),height:Math.abs(e.y1-e.y2),fill:"rgba(0, 161, 255, 0.3)"}):null)),Elements=(0,mobx_react_lite_1.observer)((({elements:e,store:t})=>{const n=e.filter((e=>e.alwaysOnTop)),r=e.filter((e=>!e.alwaysOnTop)).concat(n);return react_1.default.createElement(react_1.default.Fragment,null,r.map((e=>react_1.default.createElement(element_1.default,{key:e.id,store:t,element:e,onClick:()=>{console.warn("Polotno warning: onClick callback is deprecated. Just stop using it. Polotno will do selection automatically.")}}))))}));let onDomDrop=null;const registerNextDomDrop=e=>{onDomDrop=e};exports.registerNextDomDrop=registerNextDomDrop,exports.default=(0,mobx_react_lite_1.observer)((({store:e,page:t,width:n,height:r,pageControlsEnabled:a,backColor:o,pageBorderColor:i,activePageBorderColor:l,components:s})=>{const c=e._bleedVisible?t.bleed:0,d=t.computedWidth+2*c,m=t.computedHeight+2*c,u=(n-d*e.scale)/2,g=(r-m*e.scale)/2,_=react_1.default.useRef(null),h=react_1.default.useRef(null),f=react_1.default.useRef(null),p=null==a||a,[b,x]=react_1.default.useState(null),v=e.selectedElements.find((e=>e._cropModeEnabled)),E=e.selectedElements.filter((e=>e.locked)).length>0,y=e.selectedElements.filter((e=>!e.visible)).length>0;react_1.default.useEffect((()=>{var t,n,r;if(!_.current)return;const a=_.current.getStage(),o=e.selectedElements.map((e=>e._cropModeEnabled?null:a.findOne("#"+e.id))).filter((e=>e)),i=1===e.selectedElements.length&&(null===(t=e.selectedElements[0])||void 0===t?void 0:t.type)||"many";E?(_.current.enabledAnchors([]),_.current.rotateEnabled(!1)):transformerAttributes[i]?(_.current.setAttrs(Object.assign(Object.assign({},DEFAULT_TRANSFORMER_ATTRIBUTES),transformerAttributes[i])),"svg"!==i||e.selectedElements[0].keepRatio||_.current.setAttrs({enabledAnchors:DEFAULT_TRANSFORMER_ATTRIBUTES.enabledAnchors}),"text"===i&&flags_1.flags.textVerticalResizeEnabled&&_.current.setAttrs({enabledAnchors:null===(n=transformerAttributes.text.enabledAnchors)||void 0===n?void 0:n.concat(["bottom-center"])})):_.current.setAttrs(DEFAULT_TRANSFORMER_ATTRIBUTES),_.current.nodes(o),null===(r=_.current.getLayer())||void 0===r||r.batchDraw()}),[e.selectedElements,v,E,y]);const k=(0,mobx_react_lite_1.useLocalObservable)((()=>({visible:!1,x1:0,y1:0,x2:0,y2:0}))),w=react_1.default.useRef(!1),A=(0,mobx_1.action)((n=>{var r,a;w.current=!1,e.activePage!==t&&t.select();const o=n.target.findAncestor(".elements-container"),i=n.target.findAncestor("Transformer"),l=n.target.findAncestor(".page-abs-container");if(o||i||l)return;const s=null===(r=n.target.getStage())||void 0===r?void 0:r.getPointerPosition();s&&(k.visible=!0,k.x1=s.x,k.y1=s.y,k.x2=s.x,k.y2=s.y,(null===(a=n.target.getStage())||void 0===a?void 0:a.getPointersPositions().length)>=2&&(k.visible=!1))}));react_1.default.useEffect((()=>{const t=(0,mobx_1.action)((e=>{var t,n;if(!k.visible)return;null===(t=h.current)||void 0===t||t.setPointersPositions(e);let r=(null===(n=h.current)||void 0===n?void 0:n.getPointerPosition())||{x:k.x2,y:k.y2};k.x2=r.x,k.y2=r.y})),n=(0,mobx_1.action)((()=>{if(!k.visible)return;if(!h.current)return;const t=h.current.findOne(".selection"),n=t?t.getClientRect():{width:0,height:0,x:0,y:0};if(n.width&&n.height){const t=[];h.current.find(".element").forEach((r=>{const a=r.getClientRect(),o=e.getElementById(r.id()),i=null==o?void 0:o.locked,l=null==o?void 0:o.selectable;konva_1.default.Util.haveIntersection(n,a)&&!i&&l&&t.push(r.id())})),e.selectElements(t)}k.visible=!1,w.current=!0}));return window.addEventListener("mousemove",t),window.addEventListener("touchmove",t),window.addEventListener("mouseup",n),window.addEventListener("touchend",n),()=>{window.removeEventListener("mousemove",t),window.removeEventListener("touchmove",t),window.removeEventListener("mouseup",n),window.removeEventListener("touchend",n)}}),[]);const Y=t=>{if(w.current)return;const n=t.evt.ctrlKey||t.evt.metaKey||t.evt.shiftKey,r=t.target.findAncestor(".elements-container"),a=t.target.findAncestor(".page-abs-container"),o=t.target.findAncestor("Transformer");if(!(n||r||o||a))return void e.selectElements([]);const i=t.target.findAncestor(".element",!0),l=e.selectedElementsIds.indexOf(null==i?void 0:i.id())>=0;i&&n&&!l&&e.selectElements(e.selectedElementsIds.concat([i.id()])),i&&n&&l&&e.selectElements(e.selectedElementsIds.filter((e=>e!==i.id()))),!i||n||l||e.selectElements([i.id()])};(0,use_transformer_snap_1.useSnap)(_);const X=e.activePage===t,D=(null==s?void 0:s.PageControls)||page_controls_1.PageControls;return react_1.default.createElement("div",{ref:f,onDragOver:e=>e.preventDefault(),onDrop:t=>{if(t.preventDefault(),!h.current)return;h.current.setPointersPositions(t);const n=h.current.findOne(".elements-container").getRelativePointerPosition(),r=h.current.getPointerPosition(),a=h.current.getIntersection(r),o=a&&a.findAncestor(".element",!0),i=o?e.getElementById(o.id()):void 0;onDomDrop&&(onDomDrop(n,i),onDomDrop=null)},style:{position:"relative",width:n+"px"},className:"polotno-page-container"+(X?" active-page":"")},react_1.default.createElement(react_konva_1.Stage,{ref:h,width:n,height:r,onClick:Y,onTap:Y,onMouseDown:A,onMouseMove:n=>{if(!n.evt.altKey&&b)return void x(null);if(!n.evt.altKey)return;const r=n.target.findAncestor(".element",!0),a=null==r?void 0:r.id();if(!e.selectedElements[0])return;if(e.selectedElementsIds.includes(a))return;const o=(0,math_1.getTotalClientRect)(e.selectedElements),i=a?e.getElementById(a):{x:0,y:0,width:t.computedWidth,height:t.computedHeight,rotation:0},l=(0,math_1.getClientRect)(i),s=[];o.minX>l.maxX&&s.push({distance:o.minX-l.maxX,box1:o,box2:l,points:[{x:o.minX,y:o.minY+o.height/2},{x:l.maxX,y:o.minY+o.height/2},{x:l.maxX,y:l.minY+l.height/2}]}),o.maxX<l.minX&&s.push({distance:l.minX-o.maxX,box1:o,box2:l,points:[{x:o.maxX,y:o.minY+o.height/2},{x:l.minX,y:o.minY+o.height/2},{x:l.minX,y:l.minY+l.height/2}]}),o.minY>l.maxY&&s.push({box1:o,box2:l,distance:o.minY-l.maxY,points:[{x:o.minX+o.width/2,y:o.minY},{x:o.minX+o.width/2,y:l.maxY},{x:l.minX+l.width/2,y:l.maxY}]}),o.maxY<l.minY&&s.push({box1:o,box2:l,distance:l.minY-o.maxY,points:[{x:o.minX+o.width/2,y:o.maxY},{x:o.minX+o.width/2,y:l.minY},{x:l.minX+l.width/2,y:l.minY}]});o.minX>=l.minX&&o.maxX<=l.maxX&&o.minY>=l.minY&&o.maxY<=l.maxY&&(s.push({distance:o.minX-l.minX,box1:o,box2:l,points:[{x:o.minX,y:o.minY+o.height/2},{x:l.minX,y:o.minY+o.height/2},{x:l.minX,y:l.minY+l.height/2}]}),s.push({distance:l.maxX-o.maxX,box1:o,box2:l,points:[{x:o.maxX,y:o.minY+o.height/2},{x:l.maxX,y:o.minY+o.height/2},{x:l.maxX,y:l.minY+l.height/2}]}),s.push({box1:o,box2:l,distance:o.minY-l.minY,points:[{x:o.minX+o.width/2,y:o.minY},{x:o.minX+o.width/2,y:l.minY},{x:l.minX+l.width/2,y:l.minY}]}),s.push({box1:o,box2:l,distance:l.maxY-o.maxY,points:[{x:o.minX+o.width/2,y:o.maxY},{x:o.minX+o.width/2,y:l.maxY},{x:l.minX+l.width/2,y:l.maxY}]})),JSON.stringify(b)!==JSON.stringify(s)&&x(s)},onDragStart:t=>{var n;if(t.target.hasName("element")){const r=t.target.id();!(e.selectedElementsIds.indexOf(r)>=0)&&r&&(e.selectElements([r]),null===(n=_.current)||void 0===n||n.startDrag(t))}b&&x(null)},pageId:t.id,style:{position:"relative"}},react_1.default.createElement(react_konva_1.Layer,null,react_1.default.createElement(Background,{width:n,height:r,fill:o}),react_1.default.createElement(react_konva_1.Group,{x:u,y:g,scaleX:e.scale,scaleY:e.scale,name:"page-container"},react_1.default.createElement(react_konva_1.Rect,{name:"page-highlight",hideInExport:!0,x:-1.5/e.scale,y:-1.5/e.scale,width:d+3/e.scale,height:m+3/e.scale,stroke:X&&e.pages.length>1?l:i,strokeWidth:3,listening:!1,strokeScaleEnabled:!1}),react_1.default.createElement(react_konva_1.Group,{name:"page-background-group",x:c,y:c,clipX:-c,clipY:-c,clipWidth:t.computedWidth+2*c,clipHeight:t.computedHeight+2*c},react_1.default.createElement(PageBackground,{x:-t.bleed,y:-t.bleed,width:t.computedWidth+2*t.bleed,height:t.computedHeight+2*t.bleed,background:t.background,shadowBlur:10,shadowColor:"lightgrey",name:"page-background",preventDefault:!1,scale:e.scale})),react_1.default.createElement(react_konva_1.Group,{x:c,y:c,clipX:-c,clipY:-c,clipWidth:t.computedWidth+2*c,clipHeight:t.computedHeight+2*c,name:"elements-container"},react_1.default.createElement(react_konva_1.Rect,{name:"elements-area",width:t.computedWidth,height:t.computedHeight,listening:!1}),react_1.default.createElement(Elements,{elements:t.children,store:e})),react_1.default.createElement(react_konva_1.Rect,{stroke:"red",name:"bleed",strokeWidth:t.bleed,x:t.bleed/2,y:t.bleed/2,width:t.computedWidth+t.bleed,height:t.computedHeight+t.bleed,opacity:.1,listening:!1,visible:t.bleed>0&&e._bleedVisible,hideInExport:!0})),react_1.default.createElement(react_konva_1.Group,{x:u+c*e.scale,y:g+c*e.scale,scaleX:e.scale,scaleY:e.scale,name:"page-abs-container"},react_1.default.createElement(react_konva_1.Transformer,{ref:_,boundBoxFunc:(e,t)=>{const n=t.width<1||t.height<1,r=e.width<1||e.height<1;return n&&!r?e:t}}),b&&b.map((({points:t,distance:n,box1:r,box2:a},o)=>react_1.default.createElement(react_konva_1.Group,{name:"distances-container",hideInExport:!0,key:o,listening:!1},react_1.default.createElement(react_konva_1.Rect,Object.assign({},r,{stroke:"rgb(0, 161, 255)",strokeWidth:1,strokeScaleEnabled:!1})),react_1.default.createElement(react_konva_1.Rect,Object.assign({},a,{stroke:"rgb(0, 161, 255)",strokeWidth:1,strokeScaleEnabled:!1})),react_1.default.createElement(react_konva_1.Line,{points:[t[0].x,t[0].y,t[1].x,t[1].y],stroke:"rgb(0, 161, 255)",strokeWidth:1,strokeScaleEnabled:!1}),react_1.default.createElement(react_konva_1.Line,{points:[t[1].x,t[1].y,t[2].x,t[2].y],stroke:"rgb(0, 161, 255)",strokeWidth:1,strokeScaleEnabled:!1}),react_1.default.createElement(react_konva_1.Label,{x:(t[0].x+t[1].x)/2,y:(t[0].y+t[1].y)/2,offsetY:-10,scaleX:1/e.scale,scaleY:1/e.scale},react_1.default.createElement(react_konva_1.Tag,{cornerRadius:5,fill:"rgb(0, 161, 255)",pointerDirection:"down"}),react_1.default.createElement(react_konva_1.Text,{align:"center",verticalAlign:"middle",fill:"white",padding:5,text:(0,unit_1.pxToUnitString)({unit:e.unit,dpi:e.dpi,px:n})})))))),react_1.default.createElement(Selection,{selection:k}),validate_key_1.shouldShowCredit.value&&react_1.default.createElement(react_konva_1.Text,{text:"Powered by polotno.dev",fontSize:14,fill:"rgba(0,0,0,0.6)",x:n-170,y:r-18,onMouseEnter:e=>{e.target.getStage().container().style.cursor="pointer"},onMouseLeave:e=>{e.target.getStage().container().style.cursor=""},onTouchStart:e=>{e.cancelBubble=!0},onMouseDown:e=>{e.cancelBubble=!0},onClick:()=>{window.open("https://polotno.dev")},onTap:()=>{window.open("https://polotno.dev")}}),react_1.default.createElement(react_konva_1.Group,{name:"line-guides"}))),p&&X&&react_1.default.createElement(D,{store:e,page:t,xPadding:u,yPadding:g}))}));
|
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.useFontLoader=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),react_konva_utils_1=require("react-konva-utils"),mobx_1=require("mobx"),konva_1=__importDefault(require("konva")),loader_1=require("../utils/loader"),fonts_1=require("../utils/fonts"),flags_1=require("../utils/flags"),apply_filters_1=require("./apply-filters"),use_fadein_1=require("./use-fadein"),highlighter_1=require("./highlighter"),styleNode=document.createElement("style");styleNode.type="text/css",document.head.appendChild(styleNode);const initialStyles={border:"none",padding:"0px",overflow:"hidden",background:"none",outline:"none",resize:"none",overflowWrap:"break-word",whiteSpace:"normal",userSelect:"text",wordBreak:"normal"},TextInput=(0,mobx_react_lite_1.observer)((({textNodeRef:e,element:t,onBlur:r,selectAll:n,cursorPosition:o})=>{const[a
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TextElement=exports.useFontLoader=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),react_konva_utils_1=require("react-konva-utils"),mobx_1=require("mobx"),konva_1=__importDefault(require("konva")),loader_1=require("../utils/loader"),fonts_1=require("../utils/fonts"),flags_1=require("../utils/flags"),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:"normal",userSelect:"text",wordBreak:"normal"},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);return react_1.default.useEffect((()=>{var e;const t=s.current;if(!t)return;null===(e=s.current)||void 0===e||e.focus();const r=o||t.value.length;t.selectionStart=t.selectionEnd=r,n&&(null==t||t.select(),document.execCommand("selectAll",!1,null))}),[]),react_1.default.createElement(react_konva_utils_1.Html,null,react_1.default.createElement("textarea",{className:"polotno-input",ref:s,style:Object.assign(Object.assign({},initialStyles),i),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;for(let r=1;r<50;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=(react_1.default.useRef(null),(0,text_1.removeTags)(e.text));react_1.default.useEffect((()=>{if(!h)return;const{forceTextFitEnabled:t}=flags_1.flags;if(e.height&&t&&!l){const t=findFitFontSize(r.current,e);e.set({fontSize:t})}else{const t=r.current,n=t.clone({height:void 0}),o=t.fontSize()*t.lineHeight()*t.textArr.length;n.destroy(),d&&e.height<o&&e.set({height:o}),d||e.height===o||e.set({height:o})}})),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 _=react_1.default.useRef(null),x=react_1.default.useRef(0),m=r=>{const n=t.selectedElements.find((t=>t===e));n&&!e.locked&&(x.current=getCursorPosition(r),e.toggleEditMode())},p=!g&&e.placeholder,y=e._editModeEnabled?0:p?.6:e.opacity;(0,use_fadein_1.useFadeIn)(r,y);const S=getLineHeight({fontLoaded:h,fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:e.lineHeight}),v=e.selectable||"admin"===t.role;return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Text,{ref:r,id:e.id,name:"element",hideOnExport:!e.showInExport,x:e.x,y:e.y,rotation:e.rotation,width:e.width,text: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,draggable:!e.locked,opacity:y,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,lineHeight:S,letterSpacing:e.letterSpacing*e.fontSize,listening:v,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,_.current&&n.position(_.current)),n.width(i),n.scaleX(1),n.setHeight(void 0),flags_1.flags.textVerticalResizeEnabled){const e=n.fontSize()*n.lineHeight()*n.textArr.length,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=n.fontSize()*n.lineHeight()*n.textArr.length;t.target.height(Math.max(e,t.target.height()*t.target.scaleY())),t.target.scaleY(1)}t.target.strokeWidth(e.strokeWidth/t.target.scaleX()),_.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:x.current,onBlur:()=>{e.toggleEditMode(!1)}})),!l&&(i||u)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
|
package/config.d.ts
CHANGED
|
@@ -13,3 +13,4 @@ export { useDownScaling } from './utils/flags';
|
|
|
13
13
|
export { useRemoveBackground as unstable_setRemoveBackgroundEnabled } from './utils/flags';
|
|
14
14
|
export { useHtmlTextRender as unstable_useHtmlTextRender } from './utils/flags';
|
|
15
15
|
export { setForceTextFit as unstable_setForceTextFit } from './utils/flags';
|
|
16
|
+
export { setTextVerticalResizeEnabled as unstable_setTextVerticalResizeEnabled } from './utils/flags';
|
package/config.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.unstable_setForceTextFit=exports.unstable_useHtmlTextRender=exports.unstable_setRemoveBackgroundEnabled=exports.useDownScaling=exports.setAPI=exports.getGoogleFontImage=exports.getGoogleFontsListAPI=exports.unstable_registerNextDomDrop=exports.getTranslations=exports.setTranslations=exports.unstable_registerToolbarComponent=exports.unstable_registerTransformerAttrs=exports.unstable_registerShapeComponent=exports.unstable_registerShapeModel=exports.unstable_setImageLoaderHook=exports.toggleFadeInAnimation=exports.setUploadFunc=exports.addGlobalFont=exports.setGoogleFonts=void 0;var fonts_1=require("./utils/fonts");Object.defineProperty(exports,"setGoogleFonts",{enumerable:!0,get:function(){return fonts_1.setGoogleFonts}}),Object.defineProperty(exports,"addGlobalFont",{enumerable:!0,get:function(){return fonts_1.addGlobalFont}});var upload_panel_1=require("./side-panel/upload-panel");Object.defineProperty(exports,"setUploadFunc",{enumerable:!0,get:function(){return upload_panel_1.setUploadFunc}});var use_fadein_1=require("./canvas/use-fadein");Object.defineProperty(exports,"toggleFadeInAnimation",{enumerable:!0,get:function(){return use_fadein_1.toggleFadeInAnimation}});var image_element_1=require("./canvas/image-element");Object.defineProperty(exports,"unstable_setImageLoaderHook",{enumerable:!0,get:function(){return image_element_1.setImageLoaderHook}});var store_1=require("./model/store");Object.defineProperty(exports,"unstable_registerShapeModel",{enumerable:!0,get:function(){return store_1.registerShapeModel}});var element_1=require("./canvas/element");Object.defineProperty(exports,"unstable_registerShapeComponent",{enumerable:!0,get:function(){return element_1.registerShapeComponent}});var page_1=require("./canvas/page");Object.defineProperty(exports,"unstable_registerTransformerAttrs",{enumerable:!0,get:function(){return page_1.registerTransformerAttrs}});var toolbar_1=require("./toolbar/toolbar");Object.defineProperty(exports,"unstable_registerToolbarComponent",{enumerable:!0,get:function(){return toolbar_1.registerToolbarComponent}});var l10n_1=require("./utils/l10n");Object.defineProperty(exports,"setTranslations",{enumerable:!0,get:function(){return l10n_1.setTranslations}}),Object.defineProperty(exports,"getTranslations",{enumerable:!0,get:function(){return l10n_1.getTranslations}});var page_2=require("./canvas/page");Object.defineProperty(exports,"unstable_registerNextDomDrop",{enumerable:!0,get:function(){return page_2.registerNextDomDrop}});var api_1=require("./utils/api");Object.defineProperty(exports,"getGoogleFontsListAPI",{enumerable:!0,get:function(){return api_1.getGoogleFontsListAPI}}),Object.defineProperty(exports,"getGoogleFontImage",{enumerable:!0,get:function(){return api_1.getGoogleFontImage}}),Object.defineProperty(exports,"setAPI",{enumerable:!0,get:function(){return api_1.setAPI}});var flags_1=require("./utils/flags");Object.defineProperty(exports,"useDownScaling",{enumerable:!0,get:function(){return flags_1.useDownScaling}});var flags_2=require("./utils/flags");Object.defineProperty(exports,"unstable_setRemoveBackgroundEnabled",{enumerable:!0,get:function(){return flags_2.useRemoveBackground}});var flags_3=require("./utils/flags");Object.defineProperty(exports,"unstable_useHtmlTextRender",{enumerable:!0,get:function(){return flags_3.useHtmlTextRender}});var flags_4=require("./utils/flags");Object.defineProperty(exports,"unstable_setForceTextFit",{enumerable:!0,get:function(){return flags_4.setForceTextFit}});
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.unstable_setTextVerticalResizeEnabled=exports.unstable_setForceTextFit=exports.unstable_useHtmlTextRender=exports.unstable_setRemoveBackgroundEnabled=exports.useDownScaling=exports.setAPI=exports.getGoogleFontImage=exports.getGoogleFontsListAPI=exports.unstable_registerNextDomDrop=exports.getTranslations=exports.setTranslations=exports.unstable_registerToolbarComponent=exports.unstable_registerTransformerAttrs=exports.unstable_registerShapeComponent=exports.unstable_registerShapeModel=exports.unstable_setImageLoaderHook=exports.toggleFadeInAnimation=exports.setUploadFunc=exports.addGlobalFont=exports.setGoogleFonts=void 0;var fonts_1=require("./utils/fonts");Object.defineProperty(exports,"setGoogleFonts",{enumerable:!0,get:function(){return fonts_1.setGoogleFonts}}),Object.defineProperty(exports,"addGlobalFont",{enumerable:!0,get:function(){return fonts_1.addGlobalFont}});var upload_panel_1=require("./side-panel/upload-panel");Object.defineProperty(exports,"setUploadFunc",{enumerable:!0,get:function(){return upload_panel_1.setUploadFunc}});var use_fadein_1=require("./canvas/use-fadein");Object.defineProperty(exports,"toggleFadeInAnimation",{enumerable:!0,get:function(){return use_fadein_1.toggleFadeInAnimation}});var image_element_1=require("./canvas/image-element");Object.defineProperty(exports,"unstable_setImageLoaderHook",{enumerable:!0,get:function(){return image_element_1.setImageLoaderHook}});var store_1=require("./model/store");Object.defineProperty(exports,"unstable_registerShapeModel",{enumerable:!0,get:function(){return store_1.registerShapeModel}});var element_1=require("./canvas/element");Object.defineProperty(exports,"unstable_registerShapeComponent",{enumerable:!0,get:function(){return element_1.registerShapeComponent}});var page_1=require("./canvas/page");Object.defineProperty(exports,"unstable_registerTransformerAttrs",{enumerable:!0,get:function(){return page_1.registerTransformerAttrs}});var toolbar_1=require("./toolbar/toolbar");Object.defineProperty(exports,"unstable_registerToolbarComponent",{enumerable:!0,get:function(){return toolbar_1.registerToolbarComponent}});var l10n_1=require("./utils/l10n");Object.defineProperty(exports,"setTranslations",{enumerable:!0,get:function(){return l10n_1.setTranslations}}),Object.defineProperty(exports,"getTranslations",{enumerable:!0,get:function(){return l10n_1.getTranslations}});var page_2=require("./canvas/page");Object.defineProperty(exports,"unstable_registerNextDomDrop",{enumerable:!0,get:function(){return page_2.registerNextDomDrop}});var api_1=require("./utils/api");Object.defineProperty(exports,"getGoogleFontsListAPI",{enumerable:!0,get:function(){return api_1.getGoogleFontsListAPI}}),Object.defineProperty(exports,"getGoogleFontImage",{enumerable:!0,get:function(){return api_1.getGoogleFontImage}}),Object.defineProperty(exports,"setAPI",{enumerable:!0,get:function(){return api_1.setAPI}});var flags_1=require("./utils/flags");Object.defineProperty(exports,"useDownScaling",{enumerable:!0,get:function(){return flags_1.useDownScaling}});var flags_2=require("./utils/flags");Object.defineProperty(exports,"unstable_setRemoveBackgroundEnabled",{enumerable:!0,get:function(){return flags_2.useRemoveBackground}});var flags_3=require("./utils/flags");Object.defineProperty(exports,"unstable_useHtmlTextRender",{enumerable:!0,get:function(){return flags_3.useHtmlTextRender}});var flags_4=require("./utils/flags");Object.defineProperty(exports,"unstable_setForceTextFit",{enumerable:!0,get:function(){return flags_4.setForceTextFit}});var flags_5=require("./utils/flags");Object.defineProperty(exports,"unstable_setTextVerticalResizeEnabled",{enumerable:!0,get:function(){return flags_5.setTextVerticalResizeEnabled}});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "polotno",
|
|
3
|
-
"version": "0.42.
|
|
3
|
+
"version": "0.42.7",
|
|
4
4
|
"description": "Design Editor Framework",
|
|
5
5
|
"author": "Anton Lavrenov",
|
|
6
6
|
"keywords": [
|
|
@@ -10,27 +10,26 @@
|
|
|
10
10
|
"design editor"
|
|
11
11
|
],
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@blueprintjs/core": "^4.
|
|
14
|
-
"@blueprintjs/popover2": "^1.
|
|
15
|
-
"@blueprintjs/select": "^4.
|
|
13
|
+
"@blueprintjs/core": "^4.3.0",
|
|
14
|
+
"@blueprintjs/popover2": "^1.2.0",
|
|
15
|
+
"@blueprintjs/select": "^4.2.0",
|
|
16
16
|
"@meronex/icons": "^4.0.0",
|
|
17
17
|
"gradient-parser": "^1.0.2",
|
|
18
|
-
"konva": "^8.3.
|
|
18
|
+
"konva": "^8.3.8",
|
|
19
19
|
"mobx": "6.5.0",
|
|
20
20
|
"mobx-react-lite": "^3.3.0",
|
|
21
|
-
"mobx-state-tree": "5.1.
|
|
22
|
-
"nanoid": "3.3.
|
|
21
|
+
"mobx-state-tree": "5.1.4",
|
|
22
|
+
"nanoid": "3.3.4",
|
|
23
23
|
"quill": "^1.3.7",
|
|
24
24
|
"rasterizehtml": "^1.3.1",
|
|
25
25
|
"react-color": "^2.19.3",
|
|
26
|
-
"react-konva": "
|
|
27
|
-
"react-konva-utils": "0.2.0",
|
|
26
|
+
"react-konva": "17.0.2-6",
|
|
27
|
+
"react-konva-utils": "^0.2.0",
|
|
28
28
|
"react-sortablejs": "^6.1.1",
|
|
29
|
-
"react-window": "^1.8.
|
|
29
|
+
"react-window": "^1.8.7",
|
|
30
30
|
"sortablejs": "^1.15.0",
|
|
31
|
-
"swr": "^1.
|
|
32
|
-
"
|
|
33
|
-
"use-image": "^1.0.10"
|
|
31
|
+
"swr": "^1.3.0",
|
|
32
|
+
"use-image": "^1.0.12"
|
|
34
33
|
},
|
|
35
34
|
"targets": {
|
|
36
35
|
"bundle": {
|
|
@@ -51,19 +50,20 @@
|
|
|
51
50
|
}
|
|
52
51
|
],
|
|
53
52
|
"devDependencies": {
|
|
54
|
-
"@types/jest": "^27.
|
|
55
|
-
"@types/react": "^17.0.
|
|
53
|
+
"@types/jest": "^27.5.0",
|
|
54
|
+
"@types/react": "^17.0.44",
|
|
56
55
|
"@types/sanitize-html": "^2.6.2",
|
|
57
56
|
"buffer": "^6.0.3",
|
|
58
|
-
"jest": "^27
|
|
59
|
-
"parcel": "^2.
|
|
57
|
+
"jest": "^27",
|
|
58
|
+
"parcel": "^2.5.0",
|
|
60
59
|
"process": "^0.11.10",
|
|
61
60
|
"querystring-es3": "^0.2.1",
|
|
62
61
|
"react": "^17.0.2",
|
|
63
62
|
"react-dom": "^17.0.2",
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
63
|
+
"svg-path-bounds": "^1.0.2",
|
|
64
|
+
"ts-jest": "^27.1.4",
|
|
65
|
+
"typescript": "^4.6.4",
|
|
66
|
+
"uglifyjs-folder": "^3.1.2"
|
|
67
67
|
},
|
|
68
68
|
"homepage": "https://polotno.dev/",
|
|
69
69
|
"scripts": {
|