polotno 0.43.1 → 0.43.4

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/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"),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}))}));
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"),i=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,i))},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"]),i=t.indexOf("http")>=0||t.indexOf(".png")>=0||t.indexOf(".jpg")>=0,[o]=(0,use_image_1.default)("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 8 8'%3E%3Cg fill='rgba(112, 112, 116, 1)' fill-opacity='1'%3E%3Cpath fill-rule='evenodd' d='M0 0h4v4H0V0zm4 4h4v4H4V4z'/%3E%3C/g%3E%3C/svg%3E");return react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Rect,Object.assign({fillPatternImage:o},a,{opacity:.2})),i?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:i,pageBorderColor:o,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,[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,r;if(!_.current)return;const a=_.current.getStage(),i=e.selectedElements.map((e=>e._cropModeEnabled?null:a.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}),"text"===o&&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(i),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 i=n.target.findAncestor(".elements-container"),o=n.target.findAncestor("Transformer"),l=n.target.findAncestor(".page-abs-container");if(i||o||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(),i=e.getElementById(r.id()),o=null==i?void 0:i.locked,l=null==i?void 0:i.selectable;konva_1.default.Util.haveIntersection(n,a)&&!o&&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"),i=t.target.findAncestor("Transformer");if(!(n||r||i||a))return void e.selectElements([]);const o=t.target.findAncestor(".element",!0),l=e.selectedElementsIds.indexOf(null==o?void 0:o.id())>=0;o&&n&&!l&&e.selectElements(e.selectedElementsIds.concat([o.id()])),o&&n&&l&&e.selectElements(e.selectedElementsIds.filter((e=>e!==o.id()))),!o||n||l||e.selectElements([o.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),i=a&&a.findAncestor(".element",!0),o=i?e.getElementById(i.id()):void 0;onDomDrop&&(onDomDrop(n,o),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&&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 i=(0,math_1.getTotalClientRect)(e.selectedElements),o=a?e.getElementById(a):{x:0,y:0,width:t.computedWidth,height:t.computedHeight,rotation:0},l=(0,math_1.getClientRect)(o),s=[];i.minX>l.maxX&&s.push({distance:i.minX-l.maxX,box1:i,box2:l,points:[{x:i.minX,y:i.minY+i.height/2},{x:l.maxX,y:i.minY+i.height/2},{x:l.maxX,y:l.minY+l.height/2}]}),i.maxX<l.minX&&s.push({distance:l.minX-i.maxX,box1:i,box2:l,points:[{x:i.maxX,y:i.minY+i.height/2},{x:l.minX,y:i.minY+i.height/2},{x:l.minX,y:l.minY+l.height/2}]}),i.minY>l.maxY&&s.push({box1:i,box2:l,distance:i.minY-l.maxY,points:[{x:i.minX+i.width/2,y:i.minY},{x:i.minX+i.width/2,y:l.maxY},{x:l.minX+l.width/2,y:l.maxY}]}),i.maxY<l.minY&&s.push({box1:i,box2:l,distance:l.minY-i.maxY,points:[{x:i.minX+i.width/2,y:i.maxY},{x:i.minX+i.width/2,y:l.minY},{x:l.minX+l.width/2,y:l.minY}]});i.minX>=l.minX&&i.maxX<=l.maxX&&i.minY>=l.minY&&i.maxY<=l.maxY&&(s.push({distance:i.minX-l.minX,box1:i,box2:l,points:[{x:i.minX,y:i.minY+i.height/2},{x:l.minX,y:i.minY+i.height/2},{x:l.minX,y:l.minY+l.height/2}]}),s.push({distance:l.maxX-i.maxX,box1:i,box2:l,points:[{x:i.maxX,y:i.minY+i.height/2},{x:l.maxX,y:i.minY+i.height/2},{x:l.maxX,y:l.minY+l.height/2}]}),s.push({box1:i,box2:l,distance:i.minY-l.minY,points:[{x:i.minX+i.width/2,y:i.minY},{x:i.minX+i.width/2,y:l.minY},{x:l.minX+l.width/2,y:l.minY}]}),s.push({box1:i,box2:l,distance:l.maxY-i.maxY,points:[{x:i.minX+i.width/2,y:i.maxY},{x:i.minX+i.width/2,y:l.maxY},{x:l.minX+l.width/2,y:l.maxY}]})),JSON.stringify(x)!==JSON.stringify(s)&&b(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))}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:i}),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:o,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}}),x&&x.map((({points:t,distance:n,box1:r,box2:a},i)=>react_1.default.createElement(react_konva_1.Group,{name:"distances-container",hideInExport:!0,key:i,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}))}));
@@ -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"),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);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 d=l.textArr.length*l.lineHeight()*l.fontSize();return"middle"===t.verticalAlign&&(c=(t.height-d)/2),"bottom"===t.verticalAlign&&(c=t.height-d),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(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),d=t.selectedElements.indexOf(e)>=0,{textVerticalResizeEnabled:u}=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,t=e.clone({height:void 0}),n=Math.ceil(e.fontSize()*e.lineHeight()*e.textArr.length+1);return t.destroy(),n};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=_();u&&e.height<t&&e.set({height:t}),u||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 m=react_1.default.useRef(null),p=react_1.default.useRef(0),x=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",hideOnExport:!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:x,onTap:x,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,m.current&&n.position(m.current)),n.width(i),n.scaleX(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=_();console.log(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()),m.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||d)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TextElement=exports.useFontLoader=void 0;const react_1=__importDefault(require("react")),mobx_react_lite_1=require("mobx-react-lite"),react_konva_1=require("react-konva"),react_konva_utils_1=require("react-konva-utils"),mobx_1=require("mobx"),konva_1=__importDefault(require("konva")),loader_1=require("../utils/loader"),fonts_1=require("../utils/fonts"),flags_1=require("../utils/flags"),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);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 d=l.textArr.length*l.lineHeight()*l.fontSize();return"middle"===t.verticalAlign&&(c=(t.height-d)/2),"bottom"===t.verticalAlign&&(c=t.height-d),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(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})=>{var r,n;const o=react_1.default.useRef(null),{editorEnabled:i,selectAll:a}=useEditor(e),[l,s]=react_1.default.useState(!1),[c,d]=react_1.default.useState(!1),u=react_1.default.useRef(e.height),f=t.selectedElements.indexOf(e)>=0,{textVerticalResizeEnabled:h}=flags_1.flags,g=usePrevious(e.fontFamily);react_1.default.useEffect((()=>{if(e.width)return;const t=o.current;t.width(600),e.set({width:1.4*t.getTextWidth()})}),[]),react_1.default.useLayoutEffect((()=>(0,mobx_1.autorun)((()=>{const t=o.current;(0,apply_filters_1.applyFilter)(t,e)}))));const[_]=(0,exports.useFontLoader)(t,e.fontFamily),m=(0,text_1.removeTags)(e.text),p=()=>{const e=o.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(!_)return;const{forceTextFitEnabled:t}=flags_1.flags;if(e.height&&t&&!c){const t=findFitFontSize(o.current,e);if(t!==e.fontSize)return void e.set({fontSize:t});const r=p();e.height!==r&&e.set({height:r})}else{const t=p();h&&e.height<t&&e.set({height:t}),h||e.height===t||e.set({height:t})}})),react_1.default.useLayoutEffect((()=>{const t=o.current;t&&(t.width(t.width()+1e-8),t._setTextData(),(0,apply_filters_1.applyFilter)(t,e))}),[_]);const x=react_1.default.useRef(null),y=react_1.default.useRef(0),v=r=>{const n=t.selectedElements.find((t=>t===e));n&&!e.locked&&(y.current=getCursorPosition(r),e.toggleEditMode())},S=!m&&e.placeholder,E=e._editModeEnabled?0:S?.6:e.opacity;(0,use_fadein_1.useFadeIn)(o,E);const b=getLineHeight({fontLoaded:_,fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:e.lineHeight}),w=e.selectable||"admin"===t.role;return console.log(e.height,null===(r=o.current)||void 0===r?void 0:r.height(),null===(n=o.current)||void 0===n?void 0:n.scaleY()),react_1.default.createElement(react_1.default.Fragment,null,react_1.default.createElement(react_konva_1.Text,{ref:o,id:e.id,name:"element",hideOnExport:!e.showInExport,x:e.x,y:e.y,rotation:e.rotation,width:e.width,height:e.height||void 0,text:m||e.placeholder,fill:e.fill,stroke:e.stroke,strokeWidth:e.strokeWidth,fillAfterStrokeEnabled:!0,fontSize:e.fontSize,fontFamily:`"${e.fontFamily}", "${g}"`,fontStyle:e.fontStyle+" "+e.fontWeight,textDecoration:e.textDecoration,align:e.align,verticalAlign:e.verticalAlign,draggable:!e.locked,opacity:E,shadowEnabled:e.shadowEnabled,shadowBlur:e.shadowBlur,lineHeight:b,letterSpacing:e.letterSpacing*e.fontSize,listening:w,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:()=>{s(!0)},onMouseLeave:()=>{s(!1)},onClick:v,onTap:v,onTransformStart:()=>{d(!0),t.history.startTransaction(),u.current=o.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=p(),t=Math.max(e,u.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=p();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=>{d(!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()}}),i&&react_1.default.createElement(react_konva_1.Group,{x:e.x,y:e.y,rotation:e.rotation},react_1.default.createElement(TextInput,{textNodeRef:o,element:e,selectAll:a,cursorPosition:y.current,onBlur:()=>{e.toggleEditMode(!1)}})),!c&&(l||f)&&react_1.default.createElement(highlighter_1.Highlighter,{element:e}))}));
@@ -7,7 +7,7 @@ export declare const UndoManager: import("mobx-state-tree").IModelType<{
7
7
  readonly canRedo: boolean;
8
8
  } & {
9
9
  startTransaction(): void;
10
- endTransaction(skipSave?: boolean | undefined): void;
10
+ endTransaction(skipSave?: boolean): void;
11
11
  ignore(func: any): Promise<void>;
12
12
  transaction(func: any): Promise<void>;
13
13
  requestAddState(state: any): void;
package/model/store.d.ts CHANGED
@@ -292,7 +292,7 @@ export declare const TextElement: import("mobx-state-tree").IModelType<{
292
292
  moveBottom(): void;
293
293
  beforeDestroy(): void;
294
294
  } & {
295
- toggleEditMode(editing?: boolean | undefined): void;
295
+ toggleEditMode(editing?: boolean): void;
296
296
  }, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
297
297
  id: import("mobx-state-tree").ISimpleType<string>;
298
298
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
@@ -460,7 +460,7 @@ export declare const ImageElement: import("mobx-state-tree").IModelType<{
460
460
  moveBottom(): void;
461
461
  beforeDestroy(): void;
462
462
  } & {
463
- toggleCropMode(flag?: boolean | undefined): void;
463
+ toggleCropMode(flag?: boolean): void;
464
464
  }, import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
465
465
  id: import("mobx-state-tree").ISimpleType<string>;
466
466
  type: import("mobx-state-tree").IType<string | undefined, string, string>;
@@ -1214,12 +1214,12 @@ export declare const Store: import("mobx-state-tree").IModelType<{
1214
1214
  }, import("mobx-state-tree")._NotCustomized, {}>>;
1215
1215
  selectPage(id: any): void;
1216
1216
  selectElements(ids: Array<string>): void;
1217
- _toggleBleed(bleedVisible?: boolean | undefined): void;
1217
+ _toggleBleed(bleedVisible?: boolean): void;
1218
1218
  openSidePanel(panelName: string): void;
1219
1219
  setScale(scale: number): void;
1220
1220
  _setScaleToFit(scale: number): void;
1221
1221
  setElementsPixelRatio(ratio: number): void;
1222
- setSize(width: number, height: number, doMagic?: boolean | undefined): void;
1222
+ setSize(width: number, height: number, doMagic?: boolean): void;
1223
1223
  setPageZIndex(id: any, zIndex: any): void;
1224
1224
  deletePages(ids: Array<string>): void;
1225
1225
  deleteElements(ids: Array<string>): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "polotno",
3
- "version": "0.43.1",
3
+ "version": "0.43.4",
4
4
  "description": "Design Editor Framework",
5
5
  "author": "Anton Lavrenov",
6
6
  "keywords": [
@@ -10,15 +10,15 @@
10
10
  "design editor"
11
11
  ],
12
12
  "dependencies": {
13
- "@blueprintjs/core": "^4.3.0",
14
- "@blueprintjs/popover2": "^1.2.0",
15
- "@blueprintjs/select": "^4.2.0",
13
+ "@blueprintjs/core": "^4.3.2",
14
+ "@blueprintjs/popover2": "^1.2.2",
15
+ "@blueprintjs/select": "^4.2.2",
16
16
  "@meronex/icons": "^4.0.0",
17
17
  "gradient-parser": "^1.0.2",
18
18
  "konva": "^8.3.8",
19
- "mobx": "6.5.0",
20
- "mobx-react-lite": "^3.3.0",
21
- "mobx-state-tree": "5.1.4",
19
+ "mobx": "6.6.0",
20
+ "mobx-react-lite": "^3.4.0",
21
+ "mobx-state-tree": "5.1.5",
22
22
  "nanoid": "3.3.4",
23
23
  "quill": "^1.3.7",
24
24
  "rasterizehtml": "^1.3.1",
@@ -50,19 +50,19 @@
50
50
  }
51
51
  ],
52
52
  "devDependencies": {
53
- "@types/jest": "^27.5.0",
53
+ "@types/jest": "^27.5.1",
54
54
  "@types/react": "^17.0.44",
55
55
  "@types/sanitize-html": "^2.6.2",
56
56
  "buffer": "^6.0.3",
57
57
  "jest": "^27",
58
- "parcel": "^2.5.0",
58
+ "parcel": "^2.6.0",
59
59
  "process": "^0.11.10",
60
60
  "querystring-es3": "^0.2.1",
61
61
  "react": "^17.0.2",
62
62
  "react-dom": "^17.0.2",
63
63
  "svg-path-bounds": "^1.0.2",
64
64
  "ts-jest": "^27.1.4",
65
- "typescript": "^4.6.4",
65
+ "typescript": "^4.7.2",
66
66
  "uglifyjs-folder": "^3.1.2"
67
67
  },
68
68
  "homepage": "https://polotno.dev/",