@leafer-in/viewport 1.9.4 → 1.9.5

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/dist/viewport.cjs CHANGED
@@ -138,7 +138,8 @@ const WheelEventHelper = {
138
138
  if (zoom) {
139
139
  zoomSpeed = within(zoomSpeed, 0, 1);
140
140
  const min = event.deltaY ? config.delta.y : config.delta.x;
141
- scale = within(1 - delta / (min * 4) * zoomSpeed, .5, 1.5);
141
+ const absScale = within(1 - abs$1(delta) / (min * 4) * zoomSpeed, .5, 2);
142
+ scale = delta > 0 ? absScale : 1 / absScale;
142
143
  }
143
144
  return scale;
144
145
  }
@@ -136,7 +136,8 @@ const WheelEventHelper = {
136
136
  if (zoom) {
137
137
  zoomSpeed = within(zoomSpeed, 0, 1);
138
138
  const min = event.deltaY ? config.delta.y : config.delta.x;
139
- scale = within(1 - delta / (min * 4) * zoomSpeed, .5, 1.5);
139
+ const absScale = within(1 - abs$1(delta) / (min * 4) * zoomSpeed, .5, 2);
140
+ scale = delta > 0 ? absScale : 1 / absScale;
140
141
  }
141
142
  return scale;
142
143
  }
@@ -1,2 +1,2 @@
1
- import{MoveEvent as t,LeafHelper as e,ZoomEvent as o,DataHelper as a,Debug as i,PointHelper as n,MathHelper as s,Platform as r,RotateEvent as c,Leafer as m,Bounds as h,Point as l,DragBoundsHelper as u,InteractionBase as d,Dragger as g,isNumber as f,BoundsHelper as v,Plugin as p}from"@leafer-ui/core";function D(a,i,n){y(a.parentApp?a.parentApp:a,i),a.isApp||n||a.__eventIds.push(a.on_(t.BEFORE_MOVE,t=>{a.zoomLayer.move(a.getValidMove(t.moveX,t.moveY,!1))}),a.on_(t.END,t=>{e.animateMove(a.zoomLayer,a.getValidMove(t.moveX,t.moveY))}),a.on_(o.BEFORE_ZOOM,t=>{const{zoomLayer:e}=a,o=a.getValidScale(t.scale);1!==o&&e.scaleOfWorld(t,o)}))}function y(t,e){const o={wheel:{preventDefault:!0},touch:{preventDefault:!0},pointer:{preventDefaultMenu:!0}};e&&a.assign(o,e),a.assign(t.config,o,t.userConfig)}const O=i.get("LeaferTypeCreator"),M={list:{},register(t,e){E[t]&&O.repeat(t),E[t]=e},run(t,e){const o=E[t];o&&o(e)}},{list:E,register:T}=M;T("viewport",D),T("custom",function(t){D(t,null,!0)}),T("design",function(t){D(t,{zoom:{min:.01,max:256},move:{holdSpaceKey:!0,holdMiddleKey:!0}})}),T("document",function(t){D(t,{zoom:{min:1},move:{scroll:"limit"}})});const b={getData(t){const e=t[0],o=t[1],a=n.getCenter(e.from,o.from),i=n.getCenter(e.to,o.to),s={x:i.x-a.x,y:i.y-a.y},r=n.getDistance(e.from,o.from);return{move:s,scale:n.getDistance(e.to,o.to)/r,rotation:n.getRotation(e.from,o.from,e.to,o.to),center:i}}},{abs:x,max:z}=Math,{sign:j,within:X}=s,Y={getMove(t,e){let{moveSpeed:o}=e,{deltaX:a,deltaY:i}=t;t.shiftKey&&!a&&(a=i,i=0);const n=x(a),s=x(i);return n>50&&(a=z(50,n/3)*j(a)),s>50&&(i=z(50,s/3)*j(i)),{x:-a*o*2,y:-i*o*2}},getScale(t,e){let o,a=1,{zoomMode:i,zoomSpeed:n}=e;const s=t.deltaY||t.deltaX;if(i?(o="mouse"===i||!t.deltaX&&(r.intWheelDeltaY?Math.abs(s)>17:Math.ceil(s)!==s),(t.shiftKey||t.metaKey||t.ctrlKey)&&(o=!0)):o=!t.shiftKey&&(t.metaKey||t.ctrlKey),o){n=X(n,0,1);const o=t.deltaY?e.delta.y:e.delta.x;a=X(1-s/(4*o)*n,.5,1.5)}return a}};class R{get transforming(){return!!(this.moveData||this.zoomData||this.rotateData)}constructor(t){this.interaction=t}move(e){const{interaction:o}=this;e.moveType||(e.moveType="move"),this.moveData||(this.setPath(e),this.moveData=Object.assign(Object.assign({},e),{moveX:0,moveY:0}),o.emit(t.START,this.moveData)),e.path=this.moveData.path,o.emit(t.BEFORE_MOVE,e),o.emit(t.MOVE,e),this.transformEndWait()}zoom(t){const{interaction:e}=this;this.zoomData||(this.setPath(t),this.zoomData=Object.assign(Object.assign({},t),{scale:1}),e.emit(o.START,this.zoomData)),t.path=this.zoomData.path,e.emit(o.BEFORE_ZOOM,t),e.emit(o.ZOOM,t),this.transformEndWait()}rotate(t){const{interaction:e}=this;this.rotateData||(this.setPath(t),this.rotateData=Object.assign(Object.assign({},t),{rotation:0}),e.emit(c.START,this.rotateData)),t.path=this.rotateData.path,e.emit(c.BEFORE_ROTATE,t),e.emit(c.ROTATE,t),this.transformEndWait()}setPath(t){const{interaction:e}=this,{path:o}=e.selector.getByPoint(t,e.hitRadius);t.path=o,e.cancelHover()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout(()=>{this.transformEnd()},this.interaction.p.transformTime)}transformEnd(){const{interaction:e,moveData:a,zoomData:i,rotateData:n}=this;a&&e.emit(t.END,a),i&&e.emit(o.END,i),n&&e.emit(c.END,n),this.reset()}reset(){this.zoomData=this.moveData=this.rotateData=null}destroy(){this.reset()}}const S=m.prototype,_=new h,w=new l;function A(t,e){return Object.assign(Object.assign({},e),{moveX:t.x,moveY:t.y})}function C(t,e){return Object.assign(Object.assign({},e),{scale:t})}S.initType=function(t){M.run(t,this)},S.getValidMove=function(t,e,o=!0){const{scroll:a,disabled:i}=this.app.config.move;if(w.set(t,e),a){const t=!0===a?"":a;t.includes("x")?w.y=0:t.includes("y")?w.x=0:Math.abs(w.x)>Math.abs(w.y)?w.y=0:w.x=0,o&&t.includes("limit")&&(_.set(this.__world).addPoint(this.zoomLayer),u.getValidMove(_,this.canvas.bounds,"inner",w,!0),t.includes("x")?w.y=0:t.includes("y")&&(w.x=0))}return{x:i?0:w.x,y:i?0:w.y}},S.getValidScale=function(t){const{scaleX:e}=this.zoomLayer.__,{min:o,max:a,disabled:i}=this.app.config.zoom,n=Math.abs(e*t);return o&&n<o?t=o/e:a&&n>a&&(t=a/e),i?1:t};const K=d.prototype;K.createTransformer=function(){this.transformer=new R(this)},K.move=function(t){this.transformer.move(t)},K.zoom=function(t){this.transformer.zoom(t)},K.rotate=function(t){this.transformer.rotate(t)},K.transformEnd=function(){this.transformer.transformEnd()},K.wheel=function(t){const{wheel:e,pointer:o}=this.config,{posDeltaSpeed:a,negDeltaSpeed:i}=e;if(e.disabled)return;t.deltaX>0?a&&(t.deltaX*=a):i&&(t.deltaX*=i),t.deltaY>0?a&&(t.deltaY*=a):i&&(t.deltaY*=i);const s=e.getScale?e.getScale(t,e):Y.getScale(t,e);if(1!==s)this.zoom(C(s,t));else{const a=e.getMove?e.getMove(t,e):Y.getMove(t,e);o.snap&&n.round(a),this.move(A(a,t))}},K.multiTouch=function(t,e){if(this.config.multiTouch.disabled)return;const{move:o,rotation:a,scale:i,center:n}=b.getData(e);Object.assign(t,n),t.multiTouch=!0,this.pointerWaitCancel(),this.rotate(function(t,e){return Object.assign(Object.assign({},e),{rotation:t})}(a,t)),this.zoom(C(i,t)),this.move(A(o,t))};const V=g.prototype,{abs:W}=Math;V.checkDragEndAnimate=function(t,e){const{moveX:o,moveY:a}=this.dragData,i=W(o),s=W(a),r=e?1:.1,c=this.canAnimate&&this.moving&&(i>r||s>r)&&this.interaction.m.dragAnimate;if(c){const r="touch"===t.pointerType?3:1,m=70;i*(e=e?f(c)?c:.95:r)>m?e=m/i:s*e>m&&(e=m/s),t=Object.assign({},t),n.move(t,o*e,a*e),this.drag(t),this.animate(()=>{this.dragEnd(t,1)})}return c},V.animate=function(t,e){const o=t||this.animateWait;o&&this.interaction.target.nextRender(o,null,e),this.animateWait=t},V.checkDragOut=function(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)},V.autoMoveOnDragOut=function(t){const{interaction:e,downData:o,canDragOut:a}=this,{autoDistance:i,dragOut:s}=e.m;if(!s||!a||!i)return;const r=e.shrinkCanvasBounds,{x:c,y:m}=r,h=v.maxX(r),l=v.maxY(r),u=t.x<c?i:h<t.x?-i:0,d=t.y<m?i:l<t.y?-i:0;let g=0,f=0;this.autoMoveTimer=setInterval(()=>{g+=u,f+=d,n.move(o,u,d),n.move(this.dragData,u,d),e.move(Object.assign(Object.assign({},t),{moveX:u,moveY:d,totalX:g,totalY:f,moveType:"drag"})),e.pointerMoveReal(t)},10)},V.autoMoveCancel=function(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)},p.add("viewport");export{M as LeaferTypeCreator,b as MultiTouchHelper,R as Transformer,Y as WheelEventHelper,D as addViewport,y as addViewportConfig};
1
+ import{MoveEvent as t,LeafHelper as e,ZoomEvent as o,DataHelper as a,Debug as i,PointHelper as n,MathHelper as s,Platform as r,RotateEvent as c,Leafer as m,Bounds as h,Point as l,DragBoundsHelper as u,InteractionBase as d,Dragger as g,isNumber as f,BoundsHelper as v,Plugin as p}from"@leafer-ui/core";function D(a,i,n){y(a.parentApp?a.parentApp:a,i),a.isApp||n||a.__eventIds.push(a.on_(t.BEFORE_MOVE,t=>{a.zoomLayer.move(a.getValidMove(t.moveX,t.moveY,!1))}),a.on_(t.END,t=>{e.animateMove(a.zoomLayer,a.getValidMove(t.moveX,t.moveY))}),a.on_(o.BEFORE_ZOOM,t=>{const{zoomLayer:e}=a,o=a.getValidScale(t.scale);1!==o&&e.scaleOfWorld(t,o)}))}function y(t,e){const o={wheel:{preventDefault:!0},touch:{preventDefault:!0},pointer:{preventDefaultMenu:!0}};e&&a.assign(o,e),a.assign(t.config,o,t.userConfig)}const O=i.get("LeaferTypeCreator"),M={list:{},register(t,e){E[t]&&O.repeat(t),E[t]=e},run(t,e){const o=E[t];o&&o(e)}},{list:E,register:T}=M;T("viewport",D),T("custom",function(t){D(t,null,!0)}),T("design",function(t){D(t,{zoom:{min:.01,max:256},move:{holdSpaceKey:!0,holdMiddleKey:!0}})}),T("document",function(t){D(t,{zoom:{min:1},move:{scroll:"limit"}})});const b={getData(t){const e=t[0],o=t[1],a=n.getCenter(e.from,o.from),i=n.getCenter(e.to,o.to),s={x:i.x-a.x,y:i.y-a.y},r=n.getDistance(e.from,o.from);return{move:s,scale:n.getDistance(e.to,o.to)/r,rotation:n.getRotation(e.from,o.from,e.to,o.to),center:i}}},{abs:x,max:z}=Math,{sign:j,within:X}=s,Y={getMove(t,e){let{moveSpeed:o}=e,{deltaX:a,deltaY:i}=t;t.shiftKey&&!a&&(a=i,i=0);const n=x(a),s=x(i);return n>50&&(a=z(50,n/3)*j(a)),s>50&&(i=z(50,s/3)*j(i)),{x:-a*o*2,y:-i*o*2}},getScale(t,e){let o,a=1,{zoomMode:i,zoomSpeed:n}=e;const s=t.deltaY||t.deltaX;if(i?(o="mouse"===i||!t.deltaX&&(r.intWheelDeltaY?Math.abs(s)>17:Math.ceil(s)!==s),(t.shiftKey||t.metaKey||t.ctrlKey)&&(o=!0)):o=!t.shiftKey&&(t.metaKey||t.ctrlKey),o){n=X(n,0,1);const o=t.deltaY?e.delta.y:e.delta.x,i=X(1-x(s)/(4*o)*n,.5,2);a=s>0?i:1/i}return a}};class R{get transforming(){return!!(this.moveData||this.zoomData||this.rotateData)}constructor(t){this.interaction=t}move(e){const{interaction:o}=this;e.moveType||(e.moveType="move"),this.moveData||(this.setPath(e),this.moveData=Object.assign(Object.assign({},e),{moveX:0,moveY:0}),o.emit(t.START,this.moveData)),e.path=this.moveData.path,o.emit(t.BEFORE_MOVE,e),o.emit(t.MOVE,e),this.transformEndWait()}zoom(t){const{interaction:e}=this;this.zoomData||(this.setPath(t),this.zoomData=Object.assign(Object.assign({},t),{scale:1}),e.emit(o.START,this.zoomData)),t.path=this.zoomData.path,e.emit(o.BEFORE_ZOOM,t),e.emit(o.ZOOM,t),this.transformEndWait()}rotate(t){const{interaction:e}=this;this.rotateData||(this.setPath(t),this.rotateData=Object.assign(Object.assign({},t),{rotation:0}),e.emit(c.START,this.rotateData)),t.path=this.rotateData.path,e.emit(c.BEFORE_ROTATE,t),e.emit(c.ROTATE,t),this.transformEndWait()}setPath(t){const{interaction:e}=this,{path:o}=e.selector.getByPoint(t,e.hitRadius);t.path=o,e.cancelHover()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout(()=>{this.transformEnd()},this.interaction.p.transformTime)}transformEnd(){const{interaction:e,moveData:a,zoomData:i,rotateData:n}=this;a&&e.emit(t.END,a),i&&e.emit(o.END,i),n&&e.emit(c.END,n),this.reset()}reset(){this.zoomData=this.moveData=this.rotateData=null}destroy(){this.reset()}}const S=m.prototype,_=new h,w=new l;function A(t,e){return Object.assign(Object.assign({},e),{moveX:t.x,moveY:t.y})}function C(t,e){return Object.assign(Object.assign({},e),{scale:t})}S.initType=function(t){M.run(t,this)},S.getValidMove=function(t,e,o=!0){const{scroll:a,disabled:i}=this.app.config.move;if(w.set(t,e),a){const t=!0===a?"":a;t.includes("x")?w.y=0:t.includes("y")?w.x=0:Math.abs(w.x)>Math.abs(w.y)?w.y=0:w.x=0,o&&t.includes("limit")&&(_.set(this.__world).addPoint(this.zoomLayer),u.getValidMove(_,this.canvas.bounds,"inner",w,!0),t.includes("x")?w.y=0:t.includes("y")&&(w.x=0))}return{x:i?0:w.x,y:i?0:w.y}},S.getValidScale=function(t){const{scaleX:e}=this.zoomLayer.__,{min:o,max:a,disabled:i}=this.app.config.zoom,n=Math.abs(e*t);return o&&n<o?t=o/e:a&&n>a&&(t=a/e),i?1:t};const K=d.prototype;K.createTransformer=function(){this.transformer=new R(this)},K.move=function(t){this.transformer.move(t)},K.zoom=function(t){this.transformer.zoom(t)},K.rotate=function(t){this.transformer.rotate(t)},K.transformEnd=function(){this.transformer.transformEnd()},K.wheel=function(t){const{wheel:e,pointer:o}=this.config,{posDeltaSpeed:a,negDeltaSpeed:i}=e;if(e.disabled)return;t.deltaX>0?a&&(t.deltaX*=a):i&&(t.deltaX*=i),t.deltaY>0?a&&(t.deltaY*=a):i&&(t.deltaY*=i);const s=e.getScale?e.getScale(t,e):Y.getScale(t,e);if(1!==s)this.zoom(C(s,t));else{const a=e.getMove?e.getMove(t,e):Y.getMove(t,e);o.snap&&n.round(a),this.move(A(a,t))}},K.multiTouch=function(t,e){if(this.config.multiTouch.disabled)return;const{move:o,rotation:a,scale:i,center:n}=b.getData(e);Object.assign(t,n),t.multiTouch=!0,this.pointerWaitCancel(),this.rotate(function(t,e){return Object.assign(Object.assign({},e),{rotation:t})}(a,t)),this.zoom(C(i,t)),this.move(A(o,t))};const V=g.prototype,{abs:W}=Math;V.checkDragEndAnimate=function(t,e){const{moveX:o,moveY:a}=this.dragData,i=W(o),s=W(a),r=e?1:.1,c=this.canAnimate&&this.moving&&(i>r||s>r)&&this.interaction.m.dragAnimate;if(c){const r="touch"===t.pointerType?3:1,m=70;i*(e=e?f(c)?c:.95:r)>m?e=m/i:s*e>m&&(e=m/s),t=Object.assign({},t),n.move(t,o*e,a*e),this.drag(t),this.animate(()=>{this.dragEnd(t,1)})}return c},V.animate=function(t,e){const o=t||this.animateWait;o&&this.interaction.target.nextRender(o,null,e),this.animateWait=t},V.checkDragOut=function(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)},V.autoMoveOnDragOut=function(t){const{interaction:e,downData:o,canDragOut:a}=this,{autoDistance:i,dragOut:s}=e.m;if(!s||!a||!i)return;const r=e.shrinkCanvasBounds,{x:c,y:m}=r,h=v.maxX(r),l=v.maxY(r),u=t.x<c?i:h<t.x?-i:0,d=t.y<m?i:l<t.y?-i:0;let g=0,f=0;this.autoMoveTimer=setInterval(()=>{g+=u,f+=d,n.move(o,u,d),n.move(this.dragData,u,d),e.move(Object.assign(Object.assign({},t),{moveX:u,moveY:d,totalX:g,totalY:f,moveType:"drag"})),e.pointerMoveReal(t)},10)},V.autoMoveCancel=function(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)},p.add("viewport");export{M as LeaferTypeCreator,b as MultiTouchHelper,R as Transformer,Y as WheelEventHelper,D as addViewport,y as addViewportConfig};
2
2
  //# sourceMappingURL=viewport.esm.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.esm.min.js","sources":["../../../../../../src/in/packages/viewport/src/type/viewport.ts","../../../../../../src/in/packages/viewport/src/LeaferTypeCreator.ts","../../../../../../src/in/packages/viewport/src/type/custom.ts","../../../../../../src/in/packages/viewport/src/type/design.ts","../../../../../../src/in/packages/viewport/src/type/document.ts","../../../../../../src/in/packages/viewport/src/interaction/MultiTouchHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/WheelEventHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/Transformer.ts","../../../../../../src/in/packages/viewport/src/Leafer.ts","../../../../../../src/in/packages/viewport/src/interaction/Interaction.ts","../../../../../../src/in/packages/viewport/src/interaction/Dragger.ts","../../../../../../src/in/packages/viewport/src/index.ts"],"sourcesContent":["import { ILeaferBase, ILeaferConfig } from '@leafer-ui/interface'\n\nimport { MoveEvent, ZoomEvent, DataHelper, LeafHelper } from '@leafer-ui/core'\n\n\nexport function addViewport(leafer: ILeaferBase, mergeConfig?: ILeaferConfig, custom?: boolean): void {\n addViewportConfig(leafer.parentApp ? leafer.parentApp : leafer, mergeConfig)\n if (leafer.isApp || custom) return\n\n leafer.__eventIds.push(\n leafer.on_(MoveEvent.BEFORE_MOVE, (e: MoveEvent) => {\n leafer.zoomLayer.move(leafer.getValidMove(e.moveX, e.moveY, false))\n }),\n leafer.on_(MoveEvent.END, (e: MoveEvent) => {\n LeafHelper.animateMove(leafer.zoomLayer, leafer.getValidMove(e.moveX, e.moveY))\n }),\n leafer.on_(ZoomEvent.BEFORE_ZOOM, (e: ZoomEvent) => {\n const { zoomLayer } = leafer\n const changeScale = leafer.getValidScale(e.scale)\n if (changeScale !== 1) zoomLayer.scaleOfWorld(e, changeScale)\n })\n )\n}\n\nexport function addViewportConfig(leafer: ILeaferBase, mergeConfig?: ILeaferConfig): void {\n const viewportConfig: ILeaferConfig = {\n wheel: { preventDefault: true },\n touch: { preventDefault: true },\n pointer: { preventDefaultMenu: true }\n }\n if (mergeConfig) DataHelper.assign(viewportConfig, mergeConfig)\n DataHelper.assign(leafer.config, viewportConfig, leafer.userConfig)\n}","import { ILeaferBase, ILeaferTypeList, ILeaferTypeFunction } from '@leafer-ui/interface'\n\nimport { Debug } from '@leafer-ui/core'\n\nimport { addViewport } from './type/viewport'\nimport { custom } from './type/custom'\nimport { design } from './type/design'\nimport { document } from './type/document'\n\n\nconst debug = Debug.get('LeaferTypeCreator')\n\nexport const LeaferTypeCreator = {\n\n list: {} as ILeaferTypeList,\n\n register(name: string, fn: ILeaferTypeFunction): void {\n list[name] && debug.repeat(name)\n list[name] = fn\n },\n\n run(name: string, leafer: ILeaferBase): void {\n const fn = list[name]\n fn && fn(leafer)\n }\n\n}\n\nconst { list, register } = LeaferTypeCreator\n\nregister('viewport', addViewport)\nregister('custom', custom)\nregister('design', design)\nregister('document', document)","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function custom(leafer: ILeaferBase): void {\n addViewport(leafer, null, true)\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function design(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: {\n min: 0.01,\n max: 256\n },\n move: {\n holdSpaceKey: true,\n holdMiddleKey: true,\n }\n })\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function document(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: { min: 1 },\n move: { scroll: 'limit' }\n })\n}\n","import { IMultiTouchData, IKeepTouchData } from '@leafer-ui/interface'\n\nimport { PointHelper } from '@leafer-ui/core'\n\n\nexport const MultiTouchHelper = {\n\n getData(list: IKeepTouchData[]): IMultiTouchData {\n const a = list[0], b = list[1]\n const lastCenter = PointHelper.getCenter(a.from, b.from)\n const center = PointHelper.getCenter(a.to, b.to)\n const move = { x: center.x - lastCenter.x, y: center.y - lastCenter.y }\n\n const lastDistance = PointHelper.getDistance(a.from, b.from)\n const distance = PointHelper.getDistance(a.to, b.to)\n const scale = distance / lastDistance\n\n const rotation = PointHelper.getRotation(a.from, b.from, a.to, b.to)\n\n return { move, scale, rotation, center }\n }\n\n}","import { IPointData, IWheelEvent, IWheelConfig } from '@leafer-ui/interface'\n\nimport { MathHelper, Platform } from '@leafer-ui/core'\n\n\nconst { abs, max } = Math, { sign, within } = MathHelper\n\nexport const WheelEventHelper = {\n\n getMove(event: IWheelEvent, config: IWheelConfig): IPointData {\n let { moveSpeed } = config\n let { deltaX, deltaY } = event\n if (event.shiftKey && !deltaX) { // Window\n deltaX = deltaY\n deltaY = 0\n }\n const absX = abs(deltaX), absY = abs(deltaY)\n if (absX > 50) deltaX = max(50, absX / 3) * sign(deltaX)\n if (absY > 50) deltaY = max(50, absY / 3) * sign(deltaY)\n return { x: -deltaX * moveSpeed * 2, y: -deltaY * moveSpeed * 2 }\n },\n\n getScale(event: IWheelEvent, config: IWheelConfig): number {\n\n let zoom: boolean\n let scale = 1\n let { zoomMode, zoomSpeed } = config\n\n const delta = event.deltaY || event.deltaX\n\n if (zoomMode) {\n // mac 触摸板滚动手势的deltaY是整数, 鼠标滚动/触摸板缩放的deltaY有小数点, firfox鼠标滚动为整数,为18或19的倍数\n // windows 始终是整数\n zoom = (zoomMode === 'mouse') ? true : (!event.deltaX && (Platform.intWheelDeltaY ? Math.abs(delta) > 17 : Math.ceil(delta) !== delta))\n if (event.shiftKey || event.metaKey || event.ctrlKey) zoom = true\n } else {\n zoom = !event.shiftKey && (event.metaKey || event.ctrlKey)\n }\n\n if (zoom) {\n zoomSpeed = within(zoomSpeed, 0, 1)\n const min = event.deltaY ? config.delta.y : config.delta.x\n scale = within(1 - delta / (min * 4) * zoomSpeed, 0.5, 1.5) // zoomSpeed\n }\n\n return scale\n }\n\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, ITimer } from '@leafer-ui/interface'\n\nimport { InteractionBase, MoveEvent, ZoomEvent, RotateEvent } from '@leafer-ui/core'\n\n\nexport class Transformer {\n\n public get transforming(): boolean { return !!(this.moveData || this.zoomData || this.rotateData) }\n\n protected interaction: InteractionBase\n protected moveData: IMoveEvent\n protected zoomData: IZoomEvent\n protected rotateData: IRotateEvent\n protected transformTimer: ITimer\n\n constructor(interaction: InteractionBase) {\n this.interaction = interaction\n }\n\n public move(data: IMoveEvent): void {\n const { interaction } = this\n if (!data.moveType) data.moveType = 'move'\n\n if (!this.moveData) {\n this.setPath(data)\n this.moveData = { ...data, moveX: 0, moveY: 0 }\n interaction.emit(MoveEvent.START, this.moveData)\n }\n\n data.path = this.moveData.path\n interaction.emit(MoveEvent.BEFORE_MOVE, data)\n interaction.emit(MoveEvent.MOVE, data)\n\n this.transformEndWait()\n }\n\n public zoom(data: IZoomEvent): void {\n const { interaction } = this\n\n if (!this.zoomData) {\n this.setPath(data)\n this.zoomData = { ...data, scale: 1 }\n interaction.emit(ZoomEvent.START, this.zoomData)\n }\n\n data.path = this.zoomData.path\n interaction.emit(ZoomEvent.BEFORE_ZOOM, data)\n interaction.emit(ZoomEvent.ZOOM, data)\n\n this.transformEndWait()\n }\n\n public rotate(data: IRotateEvent): void {\n const { interaction } = this\n\n if (!this.rotateData) {\n this.setPath(data)\n this.rotateData = { ...data, rotation: 0 }\n interaction.emit(RotateEvent.START, this.rotateData)\n }\n\n data.path = this.rotateData.path\n interaction.emit(RotateEvent.BEFORE_ROTATE, data)\n interaction.emit(RotateEvent.ROTATE, data)\n\n this.transformEndWait()\n }\n\n public setPath(data: any): void {\n const { interaction } = this\n const { path } = interaction.selector.getByPoint(data, interaction.hitRadius)\n data.path = path\n interaction.cancelHover()\n }\n\n protected transformEndWait(): void {\n clearTimeout(this.transformTimer)\n this.transformTimer = setTimeout(() => {\n this.transformEnd()\n }, this.interaction.p.transformTime)\n }\n\n public transformEnd(): void {\n const { interaction, moveData, zoomData, rotateData } = this\n if (moveData) interaction.emit(MoveEvent.END, moveData)\n if (zoomData) interaction.emit(ZoomEvent.END, zoomData)\n if (rotateData) interaction.emit(RotateEvent.END, rotateData)\n this.reset()\n }\n\n public reset(): void {\n this.zoomData = this.moveData = this.rotateData = null\n }\n\n public destroy(): void {\n this.reset()\n }\n}","import { ILeaferType, IPointData } from '@leafer-ui/interface'\n\nimport { Leafer, Bounds, Point, DragBoundsHelper } from '@leafer-ui/core'\n\nimport { LeaferTypeCreator } from './LeaferTypeCreator'\n\n\nconst leafer = Leafer.prototype\nconst bounds = new Bounds(), move = new Point()\n\nleafer.initType = function (type: ILeaferType) {\n LeaferTypeCreator.run(type, this)\n}\n\nleafer.getValidMove = function (moveX: number, moveY: number, checkLimit = true): IPointData {\n const { scroll, disabled } = this.app.config.move\n move.set(moveX, moveY)\n\n if (scroll) {\n const type = scroll === true ? '' : scroll\n\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n else Math.abs(move.x) > Math.abs(move.y) ? move.y = 0 : move.x = 0\n\n if (checkLimit && type.includes('limit')) {\n bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)\n DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'inner', move, true)\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n }\n }\n\n return { x: disabled ? 0 : move.x, y: disabled ? 0 : move.y }\n}\n\nleafer.getValidScale = function (changeScale: number): number {\n const { scaleX } = this.zoomLayer.__, { min, max, disabled } = this.app.config.zoom, absScale = Math.abs(scaleX * changeScale)\n if (min && absScale < min) changeScale = min / scaleX\n else if (max && absScale > max) changeScale = max / scaleX\n return disabled ? 1 : changeScale // fix 不能过滤小数位\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, IWheelEvent, IKeepTouchData, IPointData, IEvent, IPointerEvent } from '@leafer-ui/interface'\n\nimport { InteractionBase, PointHelper } from '@leafer-ui/core'\n\nimport { WheelEventHelper } from './WheelEventHelper'\nimport { Transformer } from './Transformer'\nimport { MultiTouchHelper } from './MultiTouchHelper'\n\n\nfunction getMoveEventData(move: IPointData, event: IEvent): IMoveEvent {\n return { ...event, moveX: move.x, moveY: move.y } as IMoveEvent\n}\n\nfunction getRotateEventData(rotation: number, event: IEvent): IRotateEvent {\n return { ...event, rotation } as IRotateEvent\n}\n\nfunction getZoomEventData(scale: number, event: IEvent): IZoomEvent {\n return { ...event, scale, } as IZoomEvent\n}\n\n\nconst interaction = InteractionBase.prototype\n\ninteraction.createTransformer = function (): void {\n this.transformer = new Transformer(this)\n}\n\ninteraction.move = function (data: IMoveEvent): void {\n this.transformer.move(data)\n}\n\ninteraction.zoom = function (data: IZoomEvent): void {\n this.transformer.zoom(data)\n}\n\ninteraction.rotate = function (data: IRotateEvent): void {\n this.transformer.rotate(data)\n}\n\ninteraction.transformEnd = function (): void {\n this.transformer.transformEnd()\n}\n\n\ninteraction.wheel = function (data: IWheelEvent): void {\n const { wheel, pointer } = this.config, { posDeltaSpeed, negDeltaSpeed } = wheel\n if (wheel.disabled) return\n\n if (data.deltaX > 0) posDeltaSpeed && (data.deltaX *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaX *= negDeltaSpeed)\n\n if (data.deltaY > 0) posDeltaSpeed && (data.deltaY *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaY *= negDeltaSpeed)\n\n const scale = wheel.getScale ? wheel.getScale(data, wheel) : WheelEventHelper.getScale(data, wheel)\n if (scale !== 1) this.zoom(getZoomEventData(scale, data))\n else {\n const move = wheel.getMove ? wheel.getMove(data, wheel) : WheelEventHelper.getMove(data, wheel)\n if (pointer.snap) PointHelper.round(move)\n this.move(getMoveEventData(move, data))\n }\n}\n\n\ninteraction.multiTouch = function (data: IPointerEvent, list: IKeepTouchData[]): void {\n if (this.config.multiTouch.disabled) return\n const { move, rotation, scale, center } = MultiTouchHelper.getData(list)\n\n Object.assign(data, center)\n data.multiTouch = true\n\n this.pointerWaitCancel()\n\n this.rotate(getRotateEventData(rotation, data))\n this.zoom(getZoomEventData(scale, data))\n this.move(getMoveEventData(move, data))\n}","import { IPointerEvent, IFunction } from '@leafer-ui/interface'\n\nimport { Dragger, BoundsHelper, PointHelper, isNumber } from '@leafer-ui/core'\n\n\nconst dragger = Dragger.prototype\nconst { abs } = Math\n\ndragger.checkDragEndAnimate = function (data: IPointerEvent, speed?: number): boolean | number {\n const { moveX, moveY } = this.dragData\n const absMoveX = abs(moveX), absMoveY = abs(moveY), minMove = speed ? 1 : 0.1\n const dragAnimate = this.canAnimate && this.moving && (absMoveX > minMove || absMoveY > minMove) && this.interaction.m.dragAnimate\n\n if (dragAnimate) {\n const inertia = data.pointerType === 'touch' ? 3 : 1, maxMove = 70\n speed = speed ? (isNumber(dragAnimate) ? dragAnimate : 0.95) : inertia\n if (absMoveX * speed > maxMove) speed = maxMove / absMoveX\n else if (absMoveY * speed > maxMove) speed = maxMove / absMoveY\n\n data = { ...data }\n PointHelper.move(data, moveX * speed, moveY * speed)\n\n this.drag(data)\n this.animate(() => { this.dragEnd(data, 1) })\n }\n\n return dragAnimate\n}\n\ndragger.animate = function (func?: IFunction, off?: 'off'): void { // dragEnd animation\n const animateWait = func || this.animateWait\n if (animateWait) this.interaction.target.nextRender(animateWait, null, off)\n this.animateWait = func\n}\n\ndragger.checkDragOut = function (data: IPointerEvent): void {\n const { interaction } = this\n this.autoMoveCancel()\n if (this.dragging && !interaction.shrinkCanvasBounds.hitPoint(data)) this.autoMoveOnDragOut(data)\n}\n\ndragger.autoMoveOnDragOut = function (data: IPointerEvent): void {\n const { interaction, downData, canDragOut } = this\n const { autoDistance, dragOut } = interaction.m\n if (!dragOut || !canDragOut || !autoDistance) return\n\n const bounds = interaction.shrinkCanvasBounds\n const { x, y } = bounds\n const right = BoundsHelper.maxX(bounds)\n const bottom = BoundsHelper.maxY(bounds)\n\n const moveX = data.x < x ? autoDistance : (right < data.x ? -autoDistance : 0)\n const moveY = data.y < y ? autoDistance : (bottom < data.y ? -autoDistance : 0)\n let totalX = 0, totalY = 0\n\n this.autoMoveTimer = setInterval(() => {\n totalX += moveX\n totalY += moveY\n\n PointHelper.move(downData, moveX, moveY)\n PointHelper.move(this.dragData, moveX, moveY)\n\n interaction.move({ ...data, moveX, moveY, totalX, totalY, moveType: 'drag' })\n interaction.pointerMoveReal(data)\n }, 10)\n}\n\ndragger.autoMoveCancel = function (): void {\n if (this.autoMoveTimer) {\n clearInterval(this.autoMoveTimer)\n this.autoMoveTimer = 0\n }\n}","export { LeaferTypeCreator } from './LeaferTypeCreator'\nexport { addViewport, addViewportConfig } from './type/viewport'\nexport { MultiTouchHelper } from './interaction/MultiTouchHelper'\nexport { WheelEventHelper } from './interaction/WheelEventHelper'\nexport { Transformer } from './interaction/Transformer'\n\nimport { Plugin } from '@leafer-ui/core'\n\nimport './Leafer'\nimport './interaction/Interaction'\nimport './interaction/Dragger'\n\nPlugin.add('viewport')"],"names":["addViewport","leafer","mergeConfig","custom","addViewportConfig","parentApp","isApp","__eventIds","push","on_","MoveEvent","BEFORE_MOVE","e","zoomLayer","move","getValidMove","moveX","moveY","END","LeafHelper","animateMove","ZoomEvent","BEFORE_ZOOM","changeScale","getValidScale","scale","scaleOfWorld","viewportConfig","wheel","preventDefault","touch","pointer","preventDefaultMenu","DataHelper","assign","config","userConfig","debug","Debug","get","LeaferTypeCreator","list","register","name","fn","repeat","run","zoom","min","max","holdSpaceKey","holdMiddleKey","scroll","MultiTouchHelper","getData","a","b","lastCenter","PointHelper","getCenter","from","center","to","x","y","lastDistance","getDistance","rotation","getRotation","abs","Math","sign","within","MathHelper","WheelEventHelper","getMove","event","moveSpeed","deltaX","deltaY","shiftKey","absX","absY","getScale","zoomMode","zoomSpeed","delta","Platform","intWheelDeltaY","ceil","metaKey","ctrlKey","Transformer","transforming","this","moveData","zoomData","rotateData","constructor","interaction","data","moveType","setPath","Object","emit","START","path","MOVE","transformEndWait","ZOOM","rotate","RotateEvent","BEFORE_ROTATE","ROTATE","selector","getByPoint","hitRadius","cancelHover","clearTimeout","transformTimer","setTimeout","transformEnd","p","transformTime","reset","destroy","Leafer","prototype","bounds","Bounds","Point","getMoveEventData","getZoomEventData","initType","type","checkLimit","disabled","app","set","includes","__world","addPoint","DragBoundsHelper","canvas","scaleX","__","absScale","InteractionBase","createTransformer","transformer","posDeltaSpeed","negDeltaSpeed","snap","round","multiTouch","pointerWaitCancel","getRotateEventData","dragger","Dragger","checkDragEndAnimate","speed","dragData","absMoveX","absMoveY","minMove","dragAnimate","canAnimate","moving","m","inertia","pointerType","maxMove","isNumber","drag","animate","dragEnd","func","off","animateWait","target","nextRender","checkDragOut","autoMoveCancel","dragging","shrinkCanvasBounds","hitPoint","autoMoveOnDragOut","downData","canDragOut","autoDistance","dragOut","right","BoundsHelper","maxX","bottom","maxY","totalX","totalY","autoMoveTimer","setInterval","pointerMoveReal","clearInterval","Plugin","add"],"mappings":"sTAKgBA,EAAYC,EAAqBC,EAA6BC,GAC1EC,EAAkBH,EAAOI,UAAYJ,EAAOI,UAAYJ,EAAQC,GAC5DD,EAAOK,OAASH,GAEpBF,EAAOM,WAAWC,KACdP,EAAOQ,IAAIC,EAAUC,YAAcC,IAC/BX,EAAOY,UAAUC,KAAKb,EAAOc,aAAaH,EAAEI,MAAOJ,EAAEK,OAAO,MAEhEhB,EAAOQ,IAAIC,EAAUQ,IAAMN,IACvBO,EAAWC,YAAYnB,EAAOY,UAAWZ,EAAOc,aAAaH,EAAEI,MAAOJ,EAAEK,UAE5EhB,EAAOQ,IAAIY,EAAUC,YAAcV,IAC/B,MAAMC,UAAEA,GAAcZ,EAChBsB,EAActB,EAAOuB,cAAcZ,EAAEa,OACvB,IAAhBF,GAAmBV,EAAUa,aAAad,EAAGW,KAG7D,CAEM,SAAUnB,EAAkBH,EAAqBC,GACnD,MAAMyB,EAAgC,CAClCC,MAAO,CAAEC,gBAAgB,GACzBC,MAAO,CAAED,gBAAgB,GACzBE,QAAS,CAAEC,oBAAoB,IAE/B9B,GAAa+B,EAAWC,OAAOP,EAAgBzB,GACnD+B,EAAWC,OAAOjC,EAAOkC,OAAQR,EAAgB1B,EAAOmC,WAC5D,CCtBA,MAAMC,EAAQC,EAAMC,IAAI,qBAEXC,EAAoB,CAE7BC,KAAM,CAAA,EAEN,QAAAC,CAASC,EAAcC,GACnBH,EAAKE,IAASN,EAAMQ,OAAOF,GAC3BF,EAAKE,GAAQC,CACjB,EAEA,GAAAE,CAAIH,EAAc1C,GACd,MAAM2C,EAAKH,EAAKE,GAChBC,GAAMA,EAAG3C,EACb,IAIEwC,KAAEA,EAAIC,SAAEA,GAAaF,EAE3BE,EAAS,WAAY1C,GACrB0C,EAAS,SC1BH,SAAiBzC,GACnBD,EAAYC,EAAQ,MAAM,EAC9B,GDyBAyC,EAAS,SE3BH,SAAiBzC,GACnBD,EAAYC,EAAQ,CAChB8C,KAAM,CACFC,IAAK,IACLC,IAAK,KAETnC,KAAM,CACFoC,cAAc,EACdC,eAAe,IAG3B,GFiBAT,EAAS,WG5BH,SAAmBzC,GACrBD,EAAYC,EAAQ,CAChB8C,KAAM,CAAEC,IAAK,GACblC,KAAM,CAAEsC,OAAQ,UAExB,GCLO,MAAMC,EAAmB,CAE5B,OAAAC,CAAQb,GACJ,MAAMc,EAAId,EAAK,GAAIe,EAAIf,EAAK,GACtBgB,EAAaC,EAAYC,UAAUJ,EAAEK,KAAMJ,EAAEI,MAC7CC,EAASH,EAAYC,UAAUJ,EAAEO,GAAIN,EAAEM,IACvChD,EAAO,CAAEiD,EAAGF,EAAOE,EAAIN,EAAWM,EAAGC,EAAGH,EAAOG,EAAIP,EAAWO,GAE9DC,EAAeP,EAAYQ,YAAYX,EAAEK,KAAMJ,EAAEI,MAMvD,MAAO,CAAE9C,OAAMW,MALEiC,EAAYQ,YAAYX,EAAEO,GAAIN,EAAEM,IACxBG,EAIHE,SAFLT,EAAYU,YAAYb,EAAEK,KAAMJ,EAAEI,KAAML,EAAEO,GAAIN,EAAEM,IAEjCD,SACpC,ICfEQ,IAAEA,EAAGpB,IAAEA,GAAQqB,MAAMC,KAAEA,EAAIC,OAAEA,GAAWC,EAEjCC,EAAmB,CAE5B,OAAAC,CAAQC,EAAoBzC,GACxB,IAAI0C,UAAEA,GAAc1C,GAChB2C,OAAEA,EAAMC,OAAEA,GAAWH,EACrBA,EAAMI,WAAaF,IACnBA,EAASC,EACTA,EAAS,GAEb,MAAME,EAAOZ,EAAIS,GAASI,EAAOb,EAAIU,GAGrC,OAFIE,EAAO,KAAIH,EAAS7B,EAAI,GAAIgC,EAAO,GAAKV,EAAKO,IAC7CI,EAAO,KAAIH,EAAS9B,EAAI,GAAIiC,EAAO,GAAKX,EAAKQ,IAC1C,CAAEhB,GAAIe,EAASD,EAAY,EAAGb,GAAIe,EAASF,EAAY,EAClE,EAEA,QAAAM,CAASP,EAAoBzC,GAEzB,IAAIY,EACAtB,EAAQ,GACR2D,SAAEA,EAAQC,UAAEA,GAAclD,EAE9B,MAAMmD,EAAQV,EAAMG,QAAUH,EAAME,OAWpC,GATIM,GAGArC,EAAqB,UAAbqC,IAAiCR,EAAME,SAAWS,EAASC,eAAiBlB,KAAKD,IAAIiB,GAAS,GAAKhB,KAAKmB,KAAKH,KAAWA,IAC5HV,EAAMI,UAAYJ,EAAMc,SAAWd,EAAMe,WAAS5C,GAAO,IAE7DA,GAAQ6B,EAAMI,WAAaJ,EAAMc,SAAWd,EAAMe,SAGlD5C,EAAM,CACNsC,EAAYb,EAAOa,EAAW,EAAG,GACjC,MAAMrC,EAAM4B,EAAMG,OAAS5C,EAAOmD,MAAMtB,EAAI7B,EAAOmD,MAAMvB,EACzDtC,EAAQ+C,EAAO,EAAIc,GAAe,EAANtC,GAAWqC,EAAW,GAAK,IAC3D,CAEA,OAAO5D,CACX,SCzCSmE,EAET,gBAAWC,GAA0B,SAAUC,KAAKC,UAAYD,KAAKE,UAAYF,KAAKG,WAAY,CAQlG,WAAAC,CAAYC,GACRL,KAAKK,YAAcA,CACvB,CAEO,IAAArF,CAAKsF,GACR,MAAMD,YAAEA,GAAgBL,KACnBM,EAAKC,WAAUD,EAAKC,SAAW,QAE/BP,KAAKC,WACND,KAAKQ,QAAQF,GACbN,KAAKC,SAAQQ,OAAArE,OAAAqE,OAAArE,OAAA,CAAA,EAAQkE,GAAI,CAAEpF,MAAO,EAAGC,MAAO,IAC5CkF,EAAYK,KAAK9F,EAAU+F,MAAOX,KAAKC,WAG3CK,EAAKM,KAAOZ,KAAKC,SAASW,KAC1BP,EAAYK,KAAK9F,EAAUC,YAAayF,GACxCD,EAAYK,KAAK9F,EAAUiG,KAAMP,GAEjCN,KAAKc,kBACT,CAEO,IAAA7D,CAAKqD,GACR,MAAMD,YAAEA,GAAgBL,KAEnBA,KAAKE,WACNF,KAAKQ,QAAQF,GACbN,KAAKE,SAAQO,OAAArE,OAAAqE,OAAArE,OAAA,CAAA,EAAQkE,IAAM3E,MAAO,IAClC0E,EAAYK,KAAKnF,EAAUoF,MAAOX,KAAKE,WAG3CI,EAAKM,KAAOZ,KAAKE,SAASU,KAC1BP,EAAYK,KAAKnF,EAAUC,YAAa8E,GACxCD,EAAYK,KAAKnF,EAAUwF,KAAMT,GAEjCN,KAAKc,kBACT,CAEO,MAAAE,CAAOV,GACV,MAAMD,YAAEA,GAAgBL,KAEnBA,KAAKG,aACNH,KAAKQ,QAAQF,GACbN,KAAKG,WAAUM,OAAArE,OAAAqE,OAAArE,OAAA,CAAA,EAAQkE,IAAMjC,SAAU,IACvCgC,EAAYK,KAAKO,EAAYN,MAAOX,KAAKG,aAG7CG,EAAKM,KAAOZ,KAAKG,WAAWS,KAC5BP,EAAYK,KAAKO,EAAYC,cAAeZ,GAC5CD,EAAYK,KAAKO,EAAYE,OAAQb,GAErCN,KAAKc,kBACT,CAEO,OAAAN,CAAQF,GACX,MAAMD,YAAEA,GAAgBL,MAClBY,KAAEA,GAASP,EAAYe,SAASC,WAAWf,EAAMD,EAAYiB,WACnEhB,EAAKM,KAAOA,EACZP,EAAYkB,aAChB,CAEU,gBAAAT,GACNU,aAAaxB,KAAKyB,gBAClBzB,KAAKyB,eAAiBC,WAAW,KAC7B1B,KAAK2B,gBACN3B,KAAKK,YAAYuB,EAAEC,cAC1B,CAEO,YAAAF,GACH,MAAMtB,YAAEA,EAAWJ,SAAEA,EAAQC,SAAEA,EAAQC,WAAEA,GAAeH,KACpDC,GAAUI,EAAYK,KAAK9F,EAAUQ,IAAK6E,GAC1CC,GAAUG,EAAYK,KAAKnF,EAAUH,IAAK8E,GAC1CC,GAAYE,EAAYK,KAAKO,EAAY7F,IAAK+E,GAClDH,KAAK8B,OACT,CAEO,KAAAA,GACH9B,KAAKE,SAAWF,KAAKC,SAAWD,KAAKG,WAAa,IACtD,CAEO,OAAA4B,GACH/B,KAAK8B,OACT,ECzFJ,MAAM3H,EAAS6H,EAAOC,UAChBC,EAAS,IAAIC,EAAUnH,EAAO,IAAIoH,ECCxC,SAASC,EAAiBrH,EAAkB8D,GACxC,OAAO2B,OAAArE,OAAAqE,OAAArE,OAAA,CAAA,EAAK0C,GAAK,CAAE5D,MAAOF,EAAKiD,EAAG9C,MAAOH,EAAKkD,GAClD,CAMA,SAASoE,EAAiB3G,EAAemD,GACrC,OAAO2B,OAAArE,OAAAqE,OAAArE,OAAA,CAAA,EAAK0C,GAAK,CAAEnD,SACvB,CDTAxB,EAAOoI,SAAW,SAAUC,GACxB9F,EAAkBM,IAAIwF,EAAMxC,KAChC,EAEA7F,EAAOc,aAAe,SAAUC,EAAeC,EAAesH,GAAa,GACvE,MAAMnF,OAAEA,EAAMoF,SAAEA,GAAa1C,KAAK2C,IAAItG,OAAOrB,KAG7C,GAFAA,EAAK4H,IAAI1H,EAAOC,GAEZmC,EAAQ,CACR,MAAMkF,GAAkB,IAAXlF,EAAkB,GAAKA,EAEhCkF,EAAKK,SAAS,KAAM7H,EAAKkD,EAAI,EACxBsE,EAAKK,SAAS,KAAM7H,EAAKiD,EAAI,EACjCO,KAAKD,IAAIvD,EAAKiD,GAAKO,KAAKD,IAAIvD,EAAKkD,GAAKlD,EAAKkD,EAAI,EAAIlD,EAAKiD,EAAI,EAE7DwE,GAAcD,EAAKK,SAAS,WAC5BX,EAAOU,IAAI5C,KAAK8C,SAASC,SAAS/C,KAAKjF,WACvCiI,EAAiB/H,aAAaiH,EAAQlC,KAAKiD,OAAOf,OAAQ,QAASlH,GAAM,GACrEwH,EAAKK,SAAS,KAAM7H,EAAKkD,EAAI,EACxBsE,EAAKK,SAAS,OAAM7H,EAAKiD,EAAI,GAE9C,CAEA,MAAO,CAAEA,EAAGyE,EAAW,EAAI1H,EAAKiD,EAAGC,EAAGwE,EAAW,EAAI1H,EAAKkD,EAC9D,EAEA/D,EAAOuB,cAAgB,SAAUD,GAC7B,MAAMyH,OAAEA,GAAWlD,KAAKjF,UAAUoI,IAAIjG,IAAEA,EAAGC,IAAEA,EAAGuF,SAAEA,GAAa1C,KAAK2C,IAAItG,OAAOY,KAAMmG,EAAW5E,KAAKD,IAAI2E,EAASzH,GAGlH,OAFIyB,GAAOkG,EAAWlG,EAAKzB,EAAcyB,EAAMgG,EACtC/F,GAAOiG,EAAWjG,IAAK1B,EAAc0B,EAAM+F,GAC7CR,EAAW,EAAIjH,CAC1B,ECnBA,MAAM4E,EAAcgD,EAAgBpB,UAEpC5B,EAAYiD,kBAAoB,WAC5BtD,KAAKuD,YAAc,IAAIzD,EAAYE,KACvC,EAEAK,EAAYrF,KAAO,SAAUsF,GACzBN,KAAKuD,YAAYvI,KAAKsF,EAC1B,EAEAD,EAAYpD,KAAO,SAAUqD,GACzBN,KAAKuD,YAAYtG,KAAKqD,EAC1B,EAEAD,EAAYW,OAAS,SAAUV,GAC3BN,KAAKuD,YAAYvC,OAAOV,EAC5B,EAEAD,EAAYsB,aAAe,WACvB3B,KAAKuD,YAAY5B,cACrB,EAGAtB,EAAYvE,MAAQ,SAAUwE,GAC1B,MAAMxE,MAAEA,EAAKG,QAAEA,GAAY+D,KAAK3D,QAAQmH,cAAEA,EAAaC,cAAEA,GAAkB3H,EAC3E,GAAIA,EAAM4G,SAAU,OAEhBpC,EAAKtB,OAAS,EAAGwE,IAAkBlD,EAAKtB,QAAUwE,GACjDC,IAAkBnD,EAAKtB,QAAUyE,GAElCnD,EAAKrB,OAAS,EAAGuE,IAAkBlD,EAAKrB,QAAUuE,GACjDC,IAAkBnD,EAAKrB,QAAUwE,GAEtC,MAAM9H,EAAQG,EAAMuD,SAAWvD,EAAMuD,SAASiB,EAAMxE,GAAS8C,EAAiBS,SAASiB,EAAMxE,GAC7F,GAAc,IAAVH,EAAaqE,KAAK/C,KAAKqF,EAAiB3G,EAAO2E,QAC9C,CACD,MAAMtF,EAAOc,EAAM+C,QAAU/C,EAAM+C,QAAQyB,EAAMxE,GAAS8C,EAAiBC,QAAQyB,EAAMxE,GACrFG,EAAQyH,MAAM9F,EAAY+F,MAAM3I,GACpCgF,KAAKhF,KAAKqH,EAAiBrH,EAAMsF,GACrC,CACJ,EAGAD,EAAYuD,WAAa,SAAUtD,EAAqB3D,GACpD,GAAIqD,KAAK3D,OAAOuH,WAAWlB,SAAU,OACrC,MAAM1H,KAAEA,EAAIqD,SAAEA,EAAQ1C,MAAEA,EAAKoC,OAAEA,GAAWR,EAAiBC,QAAQb,GAEnE8D,OAAOrE,OAAOkE,EAAMvC,GACpBuC,EAAKsD,YAAa,EAElB5D,KAAK6D,oBAEL7D,KAAKgB,OA7DT,SAA4B3C,EAAkBS,GAC1C,OAAO2B,OAAArE,OAAAqE,OAAArE,OAAA,CAAA,EAAK0C,GAAK,CAAET,YACvB,CA2DgByF,CAAmBzF,EAAUiC,IACzCN,KAAK/C,KAAKqF,EAAiB3G,EAAO2E,IAClCN,KAAKhF,KAAKqH,EAAiBrH,EAAMsF,GACrC,ECxEA,MAAMyD,EAAUC,EAAQ/B,WAClB1D,IAAEA,GAAQC,KAEhBuF,EAAQE,oBAAsB,SAAU3D,EAAqB4D,GACzD,MAAMhJ,MAAEA,EAAKC,MAAEA,GAAU6E,KAAKmE,SACxBC,EAAW7F,EAAIrD,GAAQmJ,EAAW9F,EAAIpD,GAAQmJ,EAAUJ,EAAQ,EAAI,GACpEK,EAAcvE,KAAKwE,YAAcxE,KAAKyE,SAAWL,EAAWE,GAAWD,EAAWC,IAAYtE,KAAKK,YAAYqE,EAAEH,YAEvH,GAAIA,EAAa,CACb,MAAMI,EAA+B,UAArBrE,EAAKsE,YAA0B,EAAI,EAAGC,EAAU,GAE5DT,GADJF,EAAQA,EAASY,EAASP,GAAeA,EAAc,IAAQI,GACxCE,EAASX,EAAQW,EAAUT,EACzCC,EAAWH,EAAQW,IAASX,EAAQW,EAAUR,GAEvD/D,EAAIG,OAAArE,OAAA,CAAA,EAAQkE,GACZ1C,EAAY5C,KAAKsF,EAAMpF,EAAQgJ,EAAO/I,EAAQ+I,GAE9ClE,KAAK+E,KAAKzE,GACVN,KAAKgF,QAAQ,KAAQhF,KAAKiF,QAAQ3E,EAAM,IAC5C,CAEA,OAAOiE,CACX,EAEAR,EAAQiB,QAAU,SAAUE,EAAkBC,GAC1C,MAAMC,EAAcF,GAAQlF,KAAKoF,YAC7BA,GAAapF,KAAKK,YAAYgF,OAAOC,WAAWF,EAAa,KAAMD,GACvEnF,KAAKoF,YAAcF,CACvB,EAEAnB,EAAQwB,aAAe,SAAUjF,GAC7B,MAAMD,YAAEA,GAAgBL,KACxBA,KAAKwF,iBACDxF,KAAKyF,WAAapF,EAAYqF,mBAAmBC,SAASrF,IAAON,KAAK4F,kBAAkBtF,EAChG,EAEAyD,EAAQ6B,kBAAoB,SAAUtF,GAClC,MAAMD,YAAEA,EAAWwF,SAAEA,EAAQC,WAAEA,GAAe9F,MACxC+F,aAAEA,EAAYC,QAAEA,GAAY3F,EAAYqE,EAC9C,IAAKsB,IAAYF,IAAeC,EAAc,OAE9C,MAAM7D,EAAS7B,EAAYqF,oBACrBzH,EAAEA,EAACC,EAAEA,GAAMgE,EACX+D,EAAQC,EAAaC,KAAKjE,GAC1BkE,EAASF,EAAaG,KAAKnE,GAE3BhH,EAAQoF,EAAKrC,EAAIA,EAAI8H,EAAgBE,EAAQ3F,EAAKrC,GAAK8H,EAAe,EACtE5K,EAAQmF,EAAKpC,EAAIA,EAAI6H,EAAgBK,EAAS9F,EAAKpC,GAAK6H,EAAe,EAC7E,IAAIO,EAAS,EAAGC,EAAS,EAEzBvG,KAAKwG,cAAgBC,YAAY,KAC7BH,GAAUpL,EACVqL,GAAUpL,EAEVyC,EAAY5C,KAAK6K,EAAU3K,EAAOC,GAClCyC,EAAY5C,KAAKgF,KAAKmE,SAAUjJ,EAAOC,GAEvCkF,EAAYrF,KAAIyF,OAAArE,OAAAqE,OAAArE,OAAA,GAAMkE,GAAI,CAAEpF,QAAOC,QAAOmL,SAAQC,SAAQhG,SAAU,UACpEF,EAAYqG,gBAAgBpG,IAC7B,GACP,EAEAyD,EAAQyB,eAAiB,WACjBxF,KAAKwG,gBACLG,cAAc3G,KAAKwG,eACnBxG,KAAKwG,cAAgB,EAE7B,EC5DAI,EAAOC,IAAI"}
1
+ {"version":3,"file":"viewport.esm.min.js","sources":["../../../../../../src/in/packages/viewport/src/type/viewport.ts","../../../../../../src/in/packages/viewport/src/LeaferTypeCreator.ts","../../../../../../src/in/packages/viewport/src/type/custom.ts","../../../../../../src/in/packages/viewport/src/type/design.ts","../../../../../../src/in/packages/viewport/src/type/document.ts","../../../../../../src/in/packages/viewport/src/interaction/MultiTouchHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/WheelEventHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/Transformer.ts","../../../../../../src/in/packages/viewport/src/Leafer.ts","../../../../../../src/in/packages/viewport/src/interaction/Interaction.ts","../../../../../../src/in/packages/viewport/src/interaction/Dragger.ts","../../../../../../src/in/packages/viewport/src/index.ts"],"sourcesContent":["import { ILeaferBase, ILeaferConfig } from '@leafer-ui/interface'\n\nimport { MoveEvent, ZoomEvent, DataHelper, LeafHelper } from '@leafer-ui/core'\n\n\nexport function addViewport(leafer: ILeaferBase, mergeConfig?: ILeaferConfig, custom?: boolean): void {\n addViewportConfig(leafer.parentApp ? leafer.parentApp : leafer, mergeConfig)\n if (leafer.isApp || custom) return\n\n leafer.__eventIds.push(\n leafer.on_(MoveEvent.BEFORE_MOVE, (e: MoveEvent) => {\n leafer.zoomLayer.move(leafer.getValidMove(e.moveX, e.moveY, false))\n }),\n leafer.on_(MoveEvent.END, (e: MoveEvent) => {\n LeafHelper.animateMove(leafer.zoomLayer, leafer.getValidMove(e.moveX, e.moveY))\n }),\n leafer.on_(ZoomEvent.BEFORE_ZOOM, (e: ZoomEvent) => {\n const { zoomLayer } = leafer\n const changeScale = leafer.getValidScale(e.scale)\n if (changeScale !== 1) zoomLayer.scaleOfWorld(e, changeScale)\n })\n )\n}\n\nexport function addViewportConfig(leafer: ILeaferBase, mergeConfig?: ILeaferConfig): void {\n const viewportConfig: ILeaferConfig = {\n wheel: { preventDefault: true },\n touch: { preventDefault: true },\n pointer: { preventDefaultMenu: true }\n }\n if (mergeConfig) DataHelper.assign(viewportConfig, mergeConfig)\n DataHelper.assign(leafer.config, viewportConfig, leafer.userConfig)\n}","import { ILeaferBase, ILeaferTypeList, ILeaferTypeFunction } from '@leafer-ui/interface'\n\nimport { Debug } from '@leafer-ui/core'\n\nimport { addViewport } from './type/viewport'\nimport { custom } from './type/custom'\nimport { design } from './type/design'\nimport { document } from './type/document'\n\n\nconst debug = Debug.get('LeaferTypeCreator')\n\nexport const LeaferTypeCreator = {\n\n list: {} as ILeaferTypeList,\n\n register(name: string, fn: ILeaferTypeFunction): void {\n list[name] && debug.repeat(name)\n list[name] = fn\n },\n\n run(name: string, leafer: ILeaferBase): void {\n const fn = list[name]\n fn && fn(leafer)\n }\n\n}\n\nconst { list, register } = LeaferTypeCreator\n\nregister('viewport', addViewport)\nregister('custom', custom)\nregister('design', design)\nregister('document', document)","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function custom(leafer: ILeaferBase): void {\n addViewport(leafer, null, true)\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function design(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: {\n min: 0.01,\n max: 256\n },\n move: {\n holdSpaceKey: true,\n holdMiddleKey: true,\n }\n })\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function document(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: { min: 1 },\n move: { scroll: 'limit' }\n })\n}\n","import { IMultiTouchData, IKeepTouchData } from '@leafer-ui/interface'\n\nimport { PointHelper } from '@leafer-ui/core'\n\n\nexport const MultiTouchHelper = {\n\n getData(list: IKeepTouchData[]): IMultiTouchData {\n const a = list[0], b = list[1]\n const lastCenter = PointHelper.getCenter(a.from, b.from)\n const center = PointHelper.getCenter(a.to, b.to)\n const move = { x: center.x - lastCenter.x, y: center.y - lastCenter.y }\n\n const lastDistance = PointHelper.getDistance(a.from, b.from)\n const distance = PointHelper.getDistance(a.to, b.to)\n const scale = distance / lastDistance\n\n const rotation = PointHelper.getRotation(a.from, b.from, a.to, b.to)\n\n return { move, scale, rotation, center }\n }\n\n}","import { IPointData, IWheelEvent, IWheelConfig } from '@leafer-ui/interface'\n\nimport { MathHelper, Platform } from '@leafer-ui/core'\n\n\nconst { abs, max } = Math, { sign, within } = MathHelper\n\nexport const WheelEventHelper = {\n\n getMove(event: IWheelEvent, config: IWheelConfig): IPointData {\n let { moveSpeed } = config\n let { deltaX, deltaY } = event\n if (event.shiftKey && !deltaX) { // Window\n deltaX = deltaY\n deltaY = 0\n }\n const absX = abs(deltaX), absY = abs(deltaY)\n if (absX > 50) deltaX = max(50, absX / 3) * sign(deltaX)\n if (absY > 50) deltaY = max(50, absY / 3) * sign(deltaY)\n return { x: -deltaX * moveSpeed * 2, y: -deltaY * moveSpeed * 2 }\n },\n\n getScale(event: IWheelEvent, config: IWheelConfig): number {\n\n let zoom: boolean\n let scale = 1\n let { zoomMode, zoomSpeed } = config\n\n const delta = event.deltaY || event.deltaX\n\n if (zoomMode) {\n // mac 触摸板滚动手势的deltaY是整数, 鼠标滚动/触摸板缩放的deltaY有小数点, firfox鼠标滚动为整数,为18或19的倍数\n // windows 始终是整数\n zoom = (zoomMode === 'mouse') ? true : (!event.deltaX && (Platform.intWheelDeltaY ? Math.abs(delta) > 17 : Math.ceil(delta) !== delta))\n if (event.shiftKey || event.metaKey || event.ctrlKey) zoom = true\n } else {\n zoom = !event.shiftKey && (event.metaKey || event.ctrlKey)\n }\n\n if (zoom) {\n zoomSpeed = within(zoomSpeed, 0, 1)\n const min = event.deltaY ? config.delta.y : config.delta.x\n const absScale = within(1 - abs(delta) / (min * 4) * zoomSpeed, 0.5, 2)\n scale = delta > 0 ? absScale : 1 / absScale // 让 scale 放大、缩小可以定位在有规律的刻度上\n }\n\n return scale\n }\n\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, ITimer } from '@leafer-ui/interface'\n\nimport { InteractionBase, MoveEvent, ZoomEvent, RotateEvent } from '@leafer-ui/core'\n\n\nexport class Transformer {\n\n public get transforming(): boolean { return !!(this.moveData || this.zoomData || this.rotateData) }\n\n protected interaction: InteractionBase\n protected moveData: IMoveEvent\n protected zoomData: IZoomEvent\n protected rotateData: IRotateEvent\n protected transformTimer: ITimer\n\n constructor(interaction: InteractionBase) {\n this.interaction = interaction\n }\n\n public move(data: IMoveEvent): void {\n const { interaction } = this\n if (!data.moveType) data.moveType = 'move'\n\n if (!this.moveData) {\n this.setPath(data)\n this.moveData = { ...data, moveX: 0, moveY: 0 }\n interaction.emit(MoveEvent.START, this.moveData)\n }\n\n data.path = this.moveData.path\n interaction.emit(MoveEvent.BEFORE_MOVE, data)\n interaction.emit(MoveEvent.MOVE, data)\n\n this.transformEndWait()\n }\n\n public zoom(data: IZoomEvent): void {\n const { interaction } = this\n\n if (!this.zoomData) {\n this.setPath(data)\n this.zoomData = { ...data, scale: 1 }\n interaction.emit(ZoomEvent.START, this.zoomData)\n }\n\n data.path = this.zoomData.path\n interaction.emit(ZoomEvent.BEFORE_ZOOM, data)\n interaction.emit(ZoomEvent.ZOOM, data)\n\n this.transformEndWait()\n }\n\n public rotate(data: IRotateEvent): void {\n const { interaction } = this\n\n if (!this.rotateData) {\n this.setPath(data)\n this.rotateData = { ...data, rotation: 0 }\n interaction.emit(RotateEvent.START, this.rotateData)\n }\n\n data.path = this.rotateData.path\n interaction.emit(RotateEvent.BEFORE_ROTATE, data)\n interaction.emit(RotateEvent.ROTATE, data)\n\n this.transformEndWait()\n }\n\n public setPath(data: any): void {\n const { interaction } = this\n const { path } = interaction.selector.getByPoint(data, interaction.hitRadius)\n data.path = path\n interaction.cancelHover()\n }\n\n protected transformEndWait(): void {\n clearTimeout(this.transformTimer)\n this.transformTimer = setTimeout(() => {\n this.transformEnd()\n }, this.interaction.p.transformTime)\n }\n\n public transformEnd(): void {\n const { interaction, moveData, zoomData, rotateData } = this\n if (moveData) interaction.emit(MoveEvent.END, moveData)\n if (zoomData) interaction.emit(ZoomEvent.END, zoomData)\n if (rotateData) interaction.emit(RotateEvent.END, rotateData)\n this.reset()\n }\n\n public reset(): void {\n this.zoomData = this.moveData = this.rotateData = null\n }\n\n public destroy(): void {\n this.reset()\n }\n}","import { ILeaferType, IPointData } from '@leafer-ui/interface'\n\nimport { Leafer, Bounds, Point, DragBoundsHelper } from '@leafer-ui/core'\n\nimport { LeaferTypeCreator } from './LeaferTypeCreator'\n\n\nconst leafer = Leafer.prototype\nconst bounds = new Bounds(), move = new Point()\n\nleafer.initType = function (type: ILeaferType) {\n LeaferTypeCreator.run(type, this)\n}\n\nleafer.getValidMove = function (moveX: number, moveY: number, checkLimit = true): IPointData {\n const { scroll, disabled } = this.app.config.move\n move.set(moveX, moveY)\n\n if (scroll) {\n const type = scroll === true ? '' : scroll\n\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n else Math.abs(move.x) > Math.abs(move.y) ? move.y = 0 : move.x = 0\n\n if (checkLimit && type.includes('limit')) {\n bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)\n DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'inner', move, true)\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n }\n }\n\n return { x: disabled ? 0 : move.x, y: disabled ? 0 : move.y }\n}\n\nleafer.getValidScale = function (changeScale: number): number {\n const { scaleX } = this.zoomLayer.__, { min, max, disabled } = this.app.config.zoom, absScale = Math.abs(scaleX * changeScale)\n if (min && absScale < min) changeScale = min / scaleX\n else if (max && absScale > max) changeScale = max / scaleX\n return disabled ? 1 : changeScale // fix 不能过滤小数位\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, IWheelEvent, IKeepTouchData, IPointData, IEvent, IPointerEvent } from '@leafer-ui/interface'\n\nimport { InteractionBase, PointHelper } from '@leafer-ui/core'\n\nimport { WheelEventHelper } from './WheelEventHelper'\nimport { Transformer } from './Transformer'\nimport { MultiTouchHelper } from './MultiTouchHelper'\n\n\nfunction getMoveEventData(move: IPointData, event: IEvent): IMoveEvent {\n return { ...event, moveX: move.x, moveY: move.y } as IMoveEvent\n}\n\nfunction getRotateEventData(rotation: number, event: IEvent): IRotateEvent {\n return { ...event, rotation } as IRotateEvent\n}\n\nfunction getZoomEventData(scale: number, event: IEvent): IZoomEvent {\n return { ...event, scale, } as IZoomEvent\n}\n\n\nconst interaction = InteractionBase.prototype\n\ninteraction.createTransformer = function (): void {\n this.transformer = new Transformer(this)\n}\n\ninteraction.move = function (data: IMoveEvent): void {\n this.transformer.move(data)\n}\n\ninteraction.zoom = function (data: IZoomEvent): void {\n this.transformer.zoom(data)\n}\n\ninteraction.rotate = function (data: IRotateEvent): void {\n this.transformer.rotate(data)\n}\n\ninteraction.transformEnd = function (): void {\n this.transformer.transformEnd()\n}\n\n\ninteraction.wheel = function (data: IWheelEvent): void {\n const { wheel, pointer } = this.config, { posDeltaSpeed, negDeltaSpeed } = wheel\n if (wheel.disabled) return\n\n if (data.deltaX > 0) posDeltaSpeed && (data.deltaX *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaX *= negDeltaSpeed)\n\n if (data.deltaY > 0) posDeltaSpeed && (data.deltaY *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaY *= negDeltaSpeed)\n\n const scale = wheel.getScale ? wheel.getScale(data, wheel) : WheelEventHelper.getScale(data, wheel)\n if (scale !== 1) this.zoom(getZoomEventData(scale, data))\n else {\n const move = wheel.getMove ? wheel.getMove(data, wheel) : WheelEventHelper.getMove(data, wheel)\n if (pointer.snap) PointHelper.round(move)\n this.move(getMoveEventData(move, data))\n }\n}\n\n\ninteraction.multiTouch = function (data: IPointerEvent, list: IKeepTouchData[]): void {\n if (this.config.multiTouch.disabled) return\n const { move, rotation, scale, center } = MultiTouchHelper.getData(list)\n\n Object.assign(data, center)\n data.multiTouch = true\n\n this.pointerWaitCancel()\n\n this.rotate(getRotateEventData(rotation, data))\n this.zoom(getZoomEventData(scale, data))\n this.move(getMoveEventData(move, data))\n}","import { IPointerEvent, IFunction } from '@leafer-ui/interface'\n\nimport { Dragger, BoundsHelper, PointHelper, isNumber } from '@leafer-ui/core'\n\n\nconst dragger = Dragger.prototype\nconst { abs } = Math\n\ndragger.checkDragEndAnimate = function (data: IPointerEvent, speed?: number): boolean | number {\n const { moveX, moveY } = this.dragData\n const absMoveX = abs(moveX), absMoveY = abs(moveY), minMove = speed ? 1 : 0.1\n const dragAnimate = this.canAnimate && this.moving && (absMoveX > minMove || absMoveY > minMove) && this.interaction.m.dragAnimate\n\n if (dragAnimate) {\n const inertia = data.pointerType === 'touch' ? 3 : 1, maxMove = 70\n speed = speed ? (isNumber(dragAnimate) ? dragAnimate : 0.95) : inertia\n if (absMoveX * speed > maxMove) speed = maxMove / absMoveX\n else if (absMoveY * speed > maxMove) speed = maxMove / absMoveY\n\n data = { ...data }\n PointHelper.move(data, moveX * speed, moveY * speed)\n\n this.drag(data)\n this.animate(() => { this.dragEnd(data, 1) })\n }\n\n return dragAnimate\n}\n\ndragger.animate = function (func?: IFunction, off?: 'off'): void { // dragEnd animation\n const animateWait = func || this.animateWait\n if (animateWait) this.interaction.target.nextRender(animateWait, null, off)\n this.animateWait = func\n}\n\ndragger.checkDragOut = function (data: IPointerEvent): void {\n const { interaction } = this\n this.autoMoveCancel()\n if (this.dragging && !interaction.shrinkCanvasBounds.hitPoint(data)) this.autoMoveOnDragOut(data)\n}\n\ndragger.autoMoveOnDragOut = function (data: IPointerEvent): void {\n const { interaction, downData, canDragOut } = this\n const { autoDistance, dragOut } = interaction.m\n if (!dragOut || !canDragOut || !autoDistance) return\n\n const bounds = interaction.shrinkCanvasBounds\n const { x, y } = bounds\n const right = BoundsHelper.maxX(bounds)\n const bottom = BoundsHelper.maxY(bounds)\n\n const moveX = data.x < x ? autoDistance : (right < data.x ? -autoDistance : 0)\n const moveY = data.y < y ? autoDistance : (bottom < data.y ? -autoDistance : 0)\n let totalX = 0, totalY = 0\n\n this.autoMoveTimer = setInterval(() => {\n totalX += moveX\n totalY += moveY\n\n PointHelper.move(downData, moveX, moveY)\n PointHelper.move(this.dragData, moveX, moveY)\n\n interaction.move({ ...data, moveX, moveY, totalX, totalY, moveType: 'drag' })\n interaction.pointerMoveReal(data)\n }, 10)\n}\n\ndragger.autoMoveCancel = function (): void {\n if (this.autoMoveTimer) {\n clearInterval(this.autoMoveTimer)\n this.autoMoveTimer = 0\n }\n}","export { LeaferTypeCreator } from './LeaferTypeCreator'\nexport { addViewport, addViewportConfig } from './type/viewport'\nexport { MultiTouchHelper } from './interaction/MultiTouchHelper'\nexport { WheelEventHelper } from './interaction/WheelEventHelper'\nexport { Transformer } from './interaction/Transformer'\n\nimport { Plugin } from '@leafer-ui/core'\n\nimport './Leafer'\nimport './interaction/Interaction'\nimport './interaction/Dragger'\n\nPlugin.add('viewport')"],"names":["addViewport","leafer","mergeConfig","custom","addViewportConfig","parentApp","isApp","__eventIds","push","on_","MoveEvent","BEFORE_MOVE","e","zoomLayer","move","getValidMove","moveX","moveY","END","LeafHelper","animateMove","ZoomEvent","BEFORE_ZOOM","changeScale","getValidScale","scale","scaleOfWorld","viewportConfig","wheel","preventDefault","touch","pointer","preventDefaultMenu","DataHelper","assign","config","userConfig","debug","Debug","get","LeaferTypeCreator","list","register","name","fn","repeat","run","zoom","min","max","holdSpaceKey","holdMiddleKey","scroll","MultiTouchHelper","getData","a","b","lastCenter","PointHelper","getCenter","from","center","to","x","y","lastDistance","getDistance","rotation","getRotation","abs","Math","sign","within","MathHelper","WheelEventHelper","getMove","event","moveSpeed","deltaX","deltaY","shiftKey","absX","absY","getScale","zoomMode","zoomSpeed","delta","Platform","intWheelDeltaY","ceil","metaKey","ctrlKey","absScale","Transformer","transforming","this","moveData","zoomData","rotateData","constructor","interaction","data","moveType","setPath","Object","emit","START","path","MOVE","transformEndWait","ZOOM","rotate","RotateEvent","BEFORE_ROTATE","ROTATE","selector","getByPoint","hitRadius","cancelHover","clearTimeout","transformTimer","setTimeout","transformEnd","p","transformTime","reset","destroy","Leafer","prototype","bounds","Bounds","Point","getMoveEventData","getZoomEventData","initType","type","checkLimit","disabled","app","set","includes","__world","addPoint","DragBoundsHelper","canvas","scaleX","__","InteractionBase","createTransformer","transformer","posDeltaSpeed","negDeltaSpeed","snap","round","multiTouch","pointerWaitCancel","getRotateEventData","dragger","Dragger","checkDragEndAnimate","speed","dragData","absMoveX","absMoveY","minMove","dragAnimate","canAnimate","moving","m","inertia","pointerType","maxMove","isNumber","drag","animate","dragEnd","func","off","animateWait","target","nextRender","checkDragOut","autoMoveCancel","dragging","shrinkCanvasBounds","hitPoint","autoMoveOnDragOut","downData","canDragOut","autoDistance","dragOut","right","BoundsHelper","maxX","bottom","maxY","totalX","totalY","autoMoveTimer","setInterval","pointerMoveReal","clearInterval","Plugin","add"],"mappings":"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"}
package/dist/viewport.js CHANGED
@@ -124,7 +124,8 @@ this.LeaferIN.viewport = function(exports, core) {
124
124
  if (zoom) {
125
125
  zoomSpeed = within(zoomSpeed, 0, 1);
126
126
  const min = event.deltaY ? config.delta.y : config.delta.x;
127
- scale = within(1 - delta / (min * 4) * zoomSpeed, .5, 1.5);
127
+ const absScale = within(1 - abs$1(delta) / (min * 4) * zoomSpeed, .5, 2);
128
+ scale = delta > 0 ? absScale : 1 / absScale;
128
129
  }
129
130
  return scale;
130
131
  }
@@ -1,2 +1,2 @@
1
- "use strict";var t=require("@leafer-ui/core");function e(e,a,n){o(e.parentApp?e.parentApp:e,a),e.isApp||n||e.__eventIds.push(e.on_(t.MoveEvent.BEFORE_MOVE,t=>{e.zoomLayer.move(e.getValidMove(t.moveX,t.moveY,!1))}),e.on_(t.MoveEvent.END,o=>{t.LeafHelper.animateMove(e.zoomLayer,e.getValidMove(o.moveX,o.moveY))}),e.on_(t.ZoomEvent.BEFORE_ZOOM,t=>{const{zoomLayer:o}=e,a=e.getValidScale(t.scale);1!==a&&o.scaleOfWorld(t,a)}))}function o(e,o){const a={wheel:{preventDefault:!0},touch:{preventDefault:!0},pointer:{preventDefaultMenu:!0}};o&&t.DataHelper.assign(a,o),t.DataHelper.assign(e.config,a,e.userConfig)}const a=t.Debug.get("LeaferTypeCreator"),n={list:{},register(t,e){i[t]&&a.repeat(t),i[t]=e},run(t,e){const o=i[t];o&&o(e)}},{list:i,register:s}=n;s("viewport",e),s("custom",function(t){e(t,null,!0)}),s("design",function(t){e(t,{zoom:{min:.01,max:256},move:{holdSpaceKey:!0,holdMiddleKey:!0}})}),s("document",function(t){e(t,{zoom:{min:1},move:{scroll:"limit"}})});const r={getData(e){const o=e[0],a=e[1],n=t.PointHelper.getCenter(o.from,a.from),i=t.PointHelper.getCenter(o.to,a.to),s={x:i.x-n.x,y:i.y-n.y},r=t.PointHelper.getDistance(o.from,a.from);return{move:s,scale:t.PointHelper.getDistance(o.to,a.to)/r,rotation:t.PointHelper.getRotation(o.from,a.from,o.to,a.to),center:i}}},{abs:c,max:m}=Math,{sign:h,within:l}=t.MathHelper,u={getMove(t,e){let{moveSpeed:o}=e,{deltaX:a,deltaY:n}=t;t.shiftKey&&!a&&(a=n,n=0);const i=c(a),s=c(n);return i>50&&(a=m(50,i/3)*h(a)),s>50&&(n=m(50,s/3)*h(n)),{x:-a*o*2,y:-n*o*2}},getScale(e,o){let a,n=1,{zoomMode:i,zoomSpeed:s}=o;const r=e.deltaY||e.deltaX;if(i?(a="mouse"===i||!e.deltaX&&(t.Platform.intWheelDeltaY?Math.abs(r)>17:Math.ceil(r)!==r),(e.shiftKey||e.metaKey||e.ctrlKey)&&(a=!0)):a=!e.shiftKey&&(e.metaKey||e.ctrlKey),a){s=l(s,0,1);const t=e.deltaY?o.delta.y:o.delta.x;n=l(1-r/(4*t)*s,.5,1.5)}return n}};class v{get transforming(){return!!(this.moveData||this.zoomData||this.rotateData)}constructor(t){this.interaction=t}move(e){const{interaction:o}=this;e.moveType||(e.moveType="move"),this.moveData||(this.setPath(e),this.moveData=Object.assign(Object.assign({},e),{moveX:0,moveY:0}),o.emit(t.MoveEvent.START,this.moveData)),e.path=this.moveData.path,o.emit(t.MoveEvent.BEFORE_MOVE,e),o.emit(t.MoveEvent.MOVE,e),this.transformEndWait()}zoom(e){const{interaction:o}=this;this.zoomData||(this.setPath(e),this.zoomData=Object.assign(Object.assign({},e),{scale:1}),o.emit(t.ZoomEvent.START,this.zoomData)),e.path=this.zoomData.path,o.emit(t.ZoomEvent.BEFORE_ZOOM,e),o.emit(t.ZoomEvent.ZOOM,e),this.transformEndWait()}rotate(e){const{interaction:o}=this;this.rotateData||(this.setPath(e),this.rotateData=Object.assign(Object.assign({},e),{rotation:0}),o.emit(t.RotateEvent.START,this.rotateData)),e.path=this.rotateData.path,o.emit(t.RotateEvent.BEFORE_ROTATE,e),o.emit(t.RotateEvent.ROTATE,e),this.transformEndWait()}setPath(t){const{interaction:e}=this,{path:o}=e.selector.getByPoint(t,e.hitRadius);t.path=o,e.cancelHover()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout(()=>{this.transformEnd()},this.interaction.p.transformTime)}transformEnd(){const{interaction:e,moveData:o,zoomData:a,rotateData:n}=this;o&&e.emit(t.MoveEvent.END,o),a&&e.emit(t.ZoomEvent.END,a),n&&e.emit(t.RotateEvent.END,n),this.reset()}reset(){this.zoomData=this.moveData=this.rotateData=null}destroy(){this.reset()}}const d=t.Leafer.prototype,p=new t.Bounds,g=new t.Point;function f(t,e){return Object.assign(Object.assign({},e),{moveX:t.x,moveY:t.y})}function D(t,e){return Object.assign(Object.assign({},e),{scale:t})}d.initType=function(t){n.run(t,this)},d.getValidMove=function(e,o,a=!0){const{scroll:n,disabled:i}=this.app.config.move;if(g.set(e,o),n){const e=!0===n?"":n;e.includes("x")?g.y=0:e.includes("y")?g.x=0:Math.abs(g.x)>Math.abs(g.y)?g.y=0:g.x=0,a&&e.includes("limit")&&(p.set(this.__world).addPoint(this.zoomLayer),t.DragBoundsHelper.getValidMove(p,this.canvas.bounds,"inner",g,!0),e.includes("x")?g.y=0:e.includes("y")&&(g.x=0))}return{x:i?0:g.x,y:i?0:g.y}},d.getValidScale=function(t){const{scaleX:e}=this.zoomLayer.__,{min:o,max:a,disabled:n}=this.app.config.zoom,i=Math.abs(e*t);return o&&i<o?t=o/e:a&&i>a&&(t=a/e),n?1:t};const E=t.InteractionBase.prototype;E.createTransformer=function(){this.transformer=new v(this)},E.move=function(t){this.transformer.move(t)},E.zoom=function(t){this.transformer.zoom(t)},E.rotate=function(t){this.transformer.rotate(t)},E.transformEnd=function(){this.transformer.transformEnd()},E.wheel=function(e){const{wheel:o,pointer:a}=this.config,{posDeltaSpeed:n,negDeltaSpeed:i}=o;if(o.disabled)return;e.deltaX>0?n&&(e.deltaX*=n):i&&(e.deltaX*=i),e.deltaY>0?n&&(e.deltaY*=n):i&&(e.deltaY*=i);const s=o.getScale?o.getScale(e,o):u.getScale(e,o);if(1!==s)this.zoom(D(s,e));else{const n=o.getMove?o.getMove(e,o):u.getMove(e,o);a.snap&&t.PointHelper.round(n),this.move(f(n,e))}},E.multiTouch=function(t,e){if(this.config.multiTouch.disabled)return;const{move:o,rotation:a,scale:n,center:i}=r.getData(e);Object.assign(t,i),t.multiTouch=!0,this.pointerWaitCancel(),this.rotate(function(t,e){return Object.assign(Object.assign({},e),{rotation:t})}(a,t)),this.zoom(D(n,t)),this.move(f(o,t))};const y=t.Dragger.prototype,{abs:M}=Math;y.checkDragEndAnimate=function(e,o){const{moveX:a,moveY:n}=this.dragData,i=M(a),s=M(n),r=o?1:.1,c=this.canAnimate&&this.moving&&(i>r||s>r)&&this.interaction.m.dragAnimate;if(c){const r="touch"===e.pointerType?3:1,m=70;i*(o=o?t.isNumber(c)?c:.95:r)>m?o=m/i:s*o>m&&(o=m/s),e=Object.assign({},e),t.PointHelper.move(e,a*o,n*o),this.drag(e),this.animate(()=>{this.dragEnd(e,1)})}return c},y.animate=function(t,e){const o=t||this.animateWait;o&&this.interaction.target.nextRender(o,null,e),this.animateWait=t},y.checkDragOut=function(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)},y.autoMoveOnDragOut=function(e){const{interaction:o,downData:a,canDragOut:n}=this,{autoDistance:i,dragOut:s}=o.m;if(!s||!n||!i)return;const r=o.shrinkCanvasBounds,{x:c,y:m}=r,h=t.BoundsHelper.maxX(r),l=t.BoundsHelper.maxY(r),u=e.x<c?i:h<e.x?-i:0,v=e.y<m?i:l<e.y?-i:0;let d=0,p=0;this.autoMoveTimer=setInterval(()=>{d+=u,p+=v,t.PointHelper.move(a,u,v),t.PointHelper.move(this.dragData,u,v),o.move(Object.assign(Object.assign({},e),{moveX:u,moveY:v,totalX:d,totalY:p,moveType:"drag"})),o.pointerMoveReal(e)},10)},y.autoMoveCancel=function(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)},t.Plugin.add("viewport"),exports.LeaferTypeCreator=n,exports.MultiTouchHelper=r,exports.Transformer=v,exports.WheelEventHelper=u,exports.addViewport=e,exports.addViewportConfig=o;
1
+ "use strict";var t=require("@leafer-ui/core");function e(e,a,n){o(e.parentApp?e.parentApp:e,a),e.isApp||n||e.__eventIds.push(e.on_(t.MoveEvent.BEFORE_MOVE,t=>{e.zoomLayer.move(e.getValidMove(t.moveX,t.moveY,!1))}),e.on_(t.MoveEvent.END,o=>{t.LeafHelper.animateMove(e.zoomLayer,e.getValidMove(o.moveX,o.moveY))}),e.on_(t.ZoomEvent.BEFORE_ZOOM,t=>{const{zoomLayer:o}=e,a=e.getValidScale(t.scale);1!==a&&o.scaleOfWorld(t,a)}))}function o(e,o){const a={wheel:{preventDefault:!0},touch:{preventDefault:!0},pointer:{preventDefaultMenu:!0}};o&&t.DataHelper.assign(a,o),t.DataHelper.assign(e.config,a,e.userConfig)}const a=t.Debug.get("LeaferTypeCreator"),n={list:{},register(t,e){i[t]&&a.repeat(t),i[t]=e},run(t,e){const o=i[t];o&&o(e)}},{list:i,register:s}=n;s("viewport",e),s("custom",function(t){e(t,null,!0)}),s("design",function(t){e(t,{zoom:{min:.01,max:256},move:{holdSpaceKey:!0,holdMiddleKey:!0}})}),s("document",function(t){e(t,{zoom:{min:1},move:{scroll:"limit"}})});const r={getData(e){const o=e[0],a=e[1],n=t.PointHelper.getCenter(o.from,a.from),i=t.PointHelper.getCenter(o.to,a.to),s={x:i.x-n.x,y:i.y-n.y},r=t.PointHelper.getDistance(o.from,a.from);return{move:s,scale:t.PointHelper.getDistance(o.to,a.to)/r,rotation:t.PointHelper.getRotation(o.from,a.from,o.to,a.to),center:i}}},{abs:c,max:m}=Math,{sign:h,within:l}=t.MathHelper,u={getMove(t,e){let{moveSpeed:o}=e,{deltaX:a,deltaY:n}=t;t.shiftKey&&!a&&(a=n,n=0);const i=c(a),s=c(n);return i>50&&(a=m(50,i/3)*h(a)),s>50&&(n=m(50,s/3)*h(n)),{x:-a*o*2,y:-n*o*2}},getScale(e,o){let a,n=1,{zoomMode:i,zoomSpeed:s}=o;const r=e.deltaY||e.deltaX;if(i?(a="mouse"===i||!e.deltaX&&(t.Platform.intWheelDeltaY?Math.abs(r)>17:Math.ceil(r)!==r),(e.shiftKey||e.metaKey||e.ctrlKey)&&(a=!0)):a=!e.shiftKey&&(e.metaKey||e.ctrlKey),a){s=l(s,0,1);const t=e.deltaY?o.delta.y:o.delta.x,a=l(1-c(r)/(4*t)*s,.5,2);n=r>0?a:1/a}return n}};class v{get transforming(){return!!(this.moveData||this.zoomData||this.rotateData)}constructor(t){this.interaction=t}move(e){const{interaction:o}=this;e.moveType||(e.moveType="move"),this.moveData||(this.setPath(e),this.moveData=Object.assign(Object.assign({},e),{moveX:0,moveY:0}),o.emit(t.MoveEvent.START,this.moveData)),e.path=this.moveData.path,o.emit(t.MoveEvent.BEFORE_MOVE,e),o.emit(t.MoveEvent.MOVE,e),this.transformEndWait()}zoom(e){const{interaction:o}=this;this.zoomData||(this.setPath(e),this.zoomData=Object.assign(Object.assign({},e),{scale:1}),o.emit(t.ZoomEvent.START,this.zoomData)),e.path=this.zoomData.path,o.emit(t.ZoomEvent.BEFORE_ZOOM,e),o.emit(t.ZoomEvent.ZOOM,e),this.transformEndWait()}rotate(e){const{interaction:o}=this;this.rotateData||(this.setPath(e),this.rotateData=Object.assign(Object.assign({},e),{rotation:0}),o.emit(t.RotateEvent.START,this.rotateData)),e.path=this.rotateData.path,o.emit(t.RotateEvent.BEFORE_ROTATE,e),o.emit(t.RotateEvent.ROTATE,e),this.transformEndWait()}setPath(t){const{interaction:e}=this,{path:o}=e.selector.getByPoint(t,e.hitRadius);t.path=o,e.cancelHover()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout(()=>{this.transformEnd()},this.interaction.p.transformTime)}transformEnd(){const{interaction:e,moveData:o,zoomData:a,rotateData:n}=this;o&&e.emit(t.MoveEvent.END,o),a&&e.emit(t.ZoomEvent.END,a),n&&e.emit(t.RotateEvent.END,n),this.reset()}reset(){this.zoomData=this.moveData=this.rotateData=null}destroy(){this.reset()}}const d=t.Leafer.prototype,p=new t.Bounds,g=new t.Point;function f(t,e){return Object.assign(Object.assign({},e),{moveX:t.x,moveY:t.y})}function D(t,e){return Object.assign(Object.assign({},e),{scale:t})}d.initType=function(t){n.run(t,this)},d.getValidMove=function(e,o,a=!0){const{scroll:n,disabled:i}=this.app.config.move;if(g.set(e,o),n){const e=!0===n?"":n;e.includes("x")?g.y=0:e.includes("y")?g.x=0:Math.abs(g.x)>Math.abs(g.y)?g.y=0:g.x=0,a&&e.includes("limit")&&(p.set(this.__world).addPoint(this.zoomLayer),t.DragBoundsHelper.getValidMove(p,this.canvas.bounds,"inner",g,!0),e.includes("x")?g.y=0:e.includes("y")&&(g.x=0))}return{x:i?0:g.x,y:i?0:g.y}},d.getValidScale=function(t){const{scaleX:e}=this.zoomLayer.__,{min:o,max:a,disabled:n}=this.app.config.zoom,i=Math.abs(e*t);return o&&i<o?t=o/e:a&&i>a&&(t=a/e),n?1:t};const E=t.InteractionBase.prototype;E.createTransformer=function(){this.transformer=new v(this)},E.move=function(t){this.transformer.move(t)},E.zoom=function(t){this.transformer.zoom(t)},E.rotate=function(t){this.transformer.rotate(t)},E.transformEnd=function(){this.transformer.transformEnd()},E.wheel=function(e){const{wheel:o,pointer:a}=this.config,{posDeltaSpeed:n,negDeltaSpeed:i}=o;if(o.disabled)return;e.deltaX>0?n&&(e.deltaX*=n):i&&(e.deltaX*=i),e.deltaY>0?n&&(e.deltaY*=n):i&&(e.deltaY*=i);const s=o.getScale?o.getScale(e,o):u.getScale(e,o);if(1!==s)this.zoom(D(s,e));else{const n=o.getMove?o.getMove(e,o):u.getMove(e,o);a.snap&&t.PointHelper.round(n),this.move(f(n,e))}},E.multiTouch=function(t,e){if(this.config.multiTouch.disabled)return;const{move:o,rotation:a,scale:n,center:i}=r.getData(e);Object.assign(t,i),t.multiTouch=!0,this.pointerWaitCancel(),this.rotate(function(t,e){return Object.assign(Object.assign({},e),{rotation:t})}(a,t)),this.zoom(D(n,t)),this.move(f(o,t))};const y=t.Dragger.prototype,{abs:M}=Math;y.checkDragEndAnimate=function(e,o){const{moveX:a,moveY:n}=this.dragData,i=M(a),s=M(n),r=o?1:.1,c=this.canAnimate&&this.moving&&(i>r||s>r)&&this.interaction.m.dragAnimate;if(c){const r="touch"===e.pointerType?3:1,m=70;i*(o=o?t.isNumber(c)?c:.95:r)>m?o=m/i:s*o>m&&(o=m/s),e=Object.assign({},e),t.PointHelper.move(e,a*o,n*o),this.drag(e),this.animate(()=>{this.dragEnd(e,1)})}return c},y.animate=function(t,e){const o=t||this.animateWait;o&&this.interaction.target.nextRender(o,null,e),this.animateWait=t},y.checkDragOut=function(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)},y.autoMoveOnDragOut=function(e){const{interaction:o,downData:a,canDragOut:n}=this,{autoDistance:i,dragOut:s}=o.m;if(!s||!n||!i)return;const r=o.shrinkCanvasBounds,{x:c,y:m}=r,h=t.BoundsHelper.maxX(r),l=t.BoundsHelper.maxY(r),u=e.x<c?i:h<e.x?-i:0,v=e.y<m?i:l<e.y?-i:0;let d=0,p=0;this.autoMoveTimer=setInterval(()=>{d+=u,p+=v,t.PointHelper.move(a,u,v),t.PointHelper.move(this.dragData,u,v),o.move(Object.assign(Object.assign({},e),{moveX:u,moveY:v,totalX:d,totalY:p,moveType:"drag"})),o.pointerMoveReal(e)},10)},y.autoMoveCancel=function(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)},t.Plugin.add("viewport"),exports.LeaferTypeCreator=n,exports.MultiTouchHelper=r,exports.Transformer=v,exports.WheelEventHelper=u,exports.addViewport=e,exports.addViewportConfig=o;
2
2
  //# sourceMappingURL=viewport.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.min.cjs","sources":["../../../../../../src/in/packages/viewport/src/type/viewport.ts","../../../../../../src/in/packages/viewport/src/LeaferTypeCreator.ts","../../../../../../src/in/packages/viewport/src/type/custom.ts","../../../../../../src/in/packages/viewport/src/type/design.ts","../../../../../../src/in/packages/viewport/src/type/document.ts","../../../../../../src/in/packages/viewport/src/interaction/MultiTouchHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/WheelEventHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/Transformer.ts","../../../../../../src/in/packages/viewport/src/Leafer.ts","../../../../../../src/in/packages/viewport/src/interaction/Interaction.ts","../../../../../../src/in/packages/viewport/src/interaction/Dragger.ts","../../../../../../src/in/packages/viewport/src/index.ts"],"sourcesContent":["import { ILeaferBase, ILeaferConfig } from '@leafer-ui/interface'\n\nimport { MoveEvent, ZoomEvent, DataHelper, LeafHelper } from '@leafer-ui/core'\n\n\nexport function addViewport(leafer: ILeaferBase, mergeConfig?: ILeaferConfig, custom?: boolean): void {\n addViewportConfig(leafer.parentApp ? leafer.parentApp : leafer, mergeConfig)\n if (leafer.isApp || custom) return\n\n leafer.__eventIds.push(\n leafer.on_(MoveEvent.BEFORE_MOVE, (e: MoveEvent) => {\n leafer.zoomLayer.move(leafer.getValidMove(e.moveX, e.moveY, false))\n }),\n leafer.on_(MoveEvent.END, (e: MoveEvent) => {\n LeafHelper.animateMove(leafer.zoomLayer, leafer.getValidMove(e.moveX, e.moveY))\n }),\n leafer.on_(ZoomEvent.BEFORE_ZOOM, (e: ZoomEvent) => {\n const { zoomLayer } = leafer\n const changeScale = leafer.getValidScale(e.scale)\n if (changeScale !== 1) zoomLayer.scaleOfWorld(e, changeScale)\n })\n )\n}\n\nexport function addViewportConfig(leafer: ILeaferBase, mergeConfig?: ILeaferConfig): void {\n const viewportConfig: ILeaferConfig = {\n wheel: { preventDefault: true },\n touch: { preventDefault: true },\n pointer: { preventDefaultMenu: true }\n }\n if (mergeConfig) DataHelper.assign(viewportConfig, mergeConfig)\n DataHelper.assign(leafer.config, viewportConfig, leafer.userConfig)\n}","import { ILeaferBase, ILeaferTypeList, ILeaferTypeFunction } from '@leafer-ui/interface'\n\nimport { Debug } from '@leafer-ui/core'\n\nimport { addViewport } from './type/viewport'\nimport { custom } from './type/custom'\nimport { design } from './type/design'\nimport { document } from './type/document'\n\n\nconst debug = Debug.get('LeaferTypeCreator')\n\nexport const LeaferTypeCreator = {\n\n list: {} as ILeaferTypeList,\n\n register(name: string, fn: ILeaferTypeFunction): void {\n list[name] && debug.repeat(name)\n list[name] = fn\n },\n\n run(name: string, leafer: ILeaferBase): void {\n const fn = list[name]\n fn && fn(leafer)\n }\n\n}\n\nconst { list, register } = LeaferTypeCreator\n\nregister('viewport', addViewport)\nregister('custom', custom)\nregister('design', design)\nregister('document', document)","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function custom(leafer: ILeaferBase): void {\n addViewport(leafer, null, true)\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function design(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: {\n min: 0.01,\n max: 256\n },\n move: {\n holdSpaceKey: true,\n holdMiddleKey: true,\n }\n })\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function document(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: { min: 1 },\n move: { scroll: 'limit' }\n })\n}\n","import { IMultiTouchData, IKeepTouchData } from '@leafer-ui/interface'\n\nimport { PointHelper } from '@leafer-ui/core'\n\n\nexport const MultiTouchHelper = {\n\n getData(list: IKeepTouchData[]): IMultiTouchData {\n const a = list[0], b = list[1]\n const lastCenter = PointHelper.getCenter(a.from, b.from)\n const center = PointHelper.getCenter(a.to, b.to)\n const move = { x: center.x - lastCenter.x, y: center.y - lastCenter.y }\n\n const lastDistance = PointHelper.getDistance(a.from, b.from)\n const distance = PointHelper.getDistance(a.to, b.to)\n const scale = distance / lastDistance\n\n const rotation = PointHelper.getRotation(a.from, b.from, a.to, b.to)\n\n return { move, scale, rotation, center }\n }\n\n}","import { IPointData, IWheelEvent, IWheelConfig } from '@leafer-ui/interface'\n\nimport { MathHelper, Platform } from '@leafer-ui/core'\n\n\nconst { abs, max } = Math, { sign, within } = MathHelper\n\nexport const WheelEventHelper = {\n\n getMove(event: IWheelEvent, config: IWheelConfig): IPointData {\n let { moveSpeed } = config\n let { deltaX, deltaY } = event\n if (event.shiftKey && !deltaX) { // Window\n deltaX = deltaY\n deltaY = 0\n }\n const absX = abs(deltaX), absY = abs(deltaY)\n if (absX > 50) deltaX = max(50, absX / 3) * sign(deltaX)\n if (absY > 50) deltaY = max(50, absY / 3) * sign(deltaY)\n return { x: -deltaX * moveSpeed * 2, y: -deltaY * moveSpeed * 2 }\n },\n\n getScale(event: IWheelEvent, config: IWheelConfig): number {\n\n let zoom: boolean\n let scale = 1\n let { zoomMode, zoomSpeed } = config\n\n const delta = event.deltaY || event.deltaX\n\n if (zoomMode) {\n // mac 触摸板滚动手势的deltaY是整数, 鼠标滚动/触摸板缩放的deltaY有小数点, firfox鼠标滚动为整数,为18或19的倍数\n // windows 始终是整数\n zoom = (zoomMode === 'mouse') ? true : (!event.deltaX && (Platform.intWheelDeltaY ? Math.abs(delta) > 17 : Math.ceil(delta) !== delta))\n if (event.shiftKey || event.metaKey || event.ctrlKey) zoom = true\n } else {\n zoom = !event.shiftKey && (event.metaKey || event.ctrlKey)\n }\n\n if (zoom) {\n zoomSpeed = within(zoomSpeed, 0, 1)\n const min = event.deltaY ? config.delta.y : config.delta.x\n scale = within(1 - delta / (min * 4) * zoomSpeed, 0.5, 1.5) // zoomSpeed\n }\n\n return scale\n }\n\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, ITimer } from '@leafer-ui/interface'\n\nimport { InteractionBase, MoveEvent, ZoomEvent, RotateEvent } from '@leafer-ui/core'\n\n\nexport class Transformer {\n\n public get transforming(): boolean { return !!(this.moveData || this.zoomData || this.rotateData) }\n\n protected interaction: InteractionBase\n protected moveData: IMoveEvent\n protected zoomData: IZoomEvent\n protected rotateData: IRotateEvent\n protected transformTimer: ITimer\n\n constructor(interaction: InteractionBase) {\n this.interaction = interaction\n }\n\n public move(data: IMoveEvent): void {\n const { interaction } = this\n if (!data.moveType) data.moveType = 'move'\n\n if (!this.moveData) {\n this.setPath(data)\n this.moveData = { ...data, moveX: 0, moveY: 0 }\n interaction.emit(MoveEvent.START, this.moveData)\n }\n\n data.path = this.moveData.path\n interaction.emit(MoveEvent.BEFORE_MOVE, data)\n interaction.emit(MoveEvent.MOVE, data)\n\n this.transformEndWait()\n }\n\n public zoom(data: IZoomEvent): void {\n const { interaction } = this\n\n if (!this.zoomData) {\n this.setPath(data)\n this.zoomData = { ...data, scale: 1 }\n interaction.emit(ZoomEvent.START, this.zoomData)\n }\n\n data.path = this.zoomData.path\n interaction.emit(ZoomEvent.BEFORE_ZOOM, data)\n interaction.emit(ZoomEvent.ZOOM, data)\n\n this.transformEndWait()\n }\n\n public rotate(data: IRotateEvent): void {\n const { interaction } = this\n\n if (!this.rotateData) {\n this.setPath(data)\n this.rotateData = { ...data, rotation: 0 }\n interaction.emit(RotateEvent.START, this.rotateData)\n }\n\n data.path = this.rotateData.path\n interaction.emit(RotateEvent.BEFORE_ROTATE, data)\n interaction.emit(RotateEvent.ROTATE, data)\n\n this.transformEndWait()\n }\n\n public setPath(data: any): void {\n const { interaction } = this\n const { path } = interaction.selector.getByPoint(data, interaction.hitRadius)\n data.path = path\n interaction.cancelHover()\n }\n\n protected transformEndWait(): void {\n clearTimeout(this.transformTimer)\n this.transformTimer = setTimeout(() => {\n this.transformEnd()\n }, this.interaction.p.transformTime)\n }\n\n public transformEnd(): void {\n const { interaction, moveData, zoomData, rotateData } = this\n if (moveData) interaction.emit(MoveEvent.END, moveData)\n if (zoomData) interaction.emit(ZoomEvent.END, zoomData)\n if (rotateData) interaction.emit(RotateEvent.END, rotateData)\n this.reset()\n }\n\n public reset(): void {\n this.zoomData = this.moveData = this.rotateData = null\n }\n\n public destroy(): void {\n this.reset()\n }\n}","import { ILeaferType, IPointData } from '@leafer-ui/interface'\n\nimport { Leafer, Bounds, Point, DragBoundsHelper } from '@leafer-ui/core'\n\nimport { LeaferTypeCreator } from './LeaferTypeCreator'\n\n\nconst leafer = Leafer.prototype\nconst bounds = new Bounds(), move = new Point()\n\nleafer.initType = function (type: ILeaferType) {\n LeaferTypeCreator.run(type, this)\n}\n\nleafer.getValidMove = function (moveX: number, moveY: number, checkLimit = true): IPointData {\n const { scroll, disabled } = this.app.config.move\n move.set(moveX, moveY)\n\n if (scroll) {\n const type = scroll === true ? '' : scroll\n\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n else Math.abs(move.x) > Math.abs(move.y) ? move.y = 0 : move.x = 0\n\n if (checkLimit && type.includes('limit')) {\n bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)\n DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'inner', move, true)\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n }\n }\n\n return { x: disabled ? 0 : move.x, y: disabled ? 0 : move.y }\n}\n\nleafer.getValidScale = function (changeScale: number): number {\n const { scaleX } = this.zoomLayer.__, { min, max, disabled } = this.app.config.zoom, absScale = Math.abs(scaleX * changeScale)\n if (min && absScale < min) changeScale = min / scaleX\n else if (max && absScale > max) changeScale = max / scaleX\n return disabled ? 1 : changeScale // fix 不能过滤小数位\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, IWheelEvent, IKeepTouchData, IPointData, IEvent, IPointerEvent } from '@leafer-ui/interface'\n\nimport { InteractionBase, PointHelper } from '@leafer-ui/core'\n\nimport { WheelEventHelper } from './WheelEventHelper'\nimport { Transformer } from './Transformer'\nimport { MultiTouchHelper } from './MultiTouchHelper'\n\n\nfunction getMoveEventData(move: IPointData, event: IEvent): IMoveEvent {\n return { ...event, moveX: move.x, moveY: move.y } as IMoveEvent\n}\n\nfunction getRotateEventData(rotation: number, event: IEvent): IRotateEvent {\n return { ...event, rotation } as IRotateEvent\n}\n\nfunction getZoomEventData(scale: number, event: IEvent): IZoomEvent {\n return { ...event, scale, } as IZoomEvent\n}\n\n\nconst interaction = InteractionBase.prototype\n\ninteraction.createTransformer = function (): void {\n this.transformer = new Transformer(this)\n}\n\ninteraction.move = function (data: IMoveEvent): void {\n this.transformer.move(data)\n}\n\ninteraction.zoom = function (data: IZoomEvent): void {\n this.transformer.zoom(data)\n}\n\ninteraction.rotate = function (data: IRotateEvent): void {\n this.transformer.rotate(data)\n}\n\ninteraction.transformEnd = function (): void {\n this.transformer.transformEnd()\n}\n\n\ninteraction.wheel = function (data: IWheelEvent): void {\n const { wheel, pointer } = this.config, { posDeltaSpeed, negDeltaSpeed } = wheel\n if (wheel.disabled) return\n\n if (data.deltaX > 0) posDeltaSpeed && (data.deltaX *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaX *= negDeltaSpeed)\n\n if (data.deltaY > 0) posDeltaSpeed && (data.deltaY *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaY *= negDeltaSpeed)\n\n const scale = wheel.getScale ? wheel.getScale(data, wheel) : WheelEventHelper.getScale(data, wheel)\n if (scale !== 1) this.zoom(getZoomEventData(scale, data))\n else {\n const move = wheel.getMove ? wheel.getMove(data, wheel) : WheelEventHelper.getMove(data, wheel)\n if (pointer.snap) PointHelper.round(move)\n this.move(getMoveEventData(move, data))\n }\n}\n\n\ninteraction.multiTouch = function (data: IPointerEvent, list: IKeepTouchData[]): void {\n if (this.config.multiTouch.disabled) return\n const { move, rotation, scale, center } = MultiTouchHelper.getData(list)\n\n Object.assign(data, center)\n data.multiTouch = true\n\n this.pointerWaitCancel()\n\n this.rotate(getRotateEventData(rotation, data))\n this.zoom(getZoomEventData(scale, data))\n this.move(getMoveEventData(move, data))\n}","import { IPointerEvent, IFunction } from '@leafer-ui/interface'\n\nimport { Dragger, BoundsHelper, PointHelper, isNumber } from '@leafer-ui/core'\n\n\nconst dragger = Dragger.prototype\nconst { abs } = Math\n\ndragger.checkDragEndAnimate = function (data: IPointerEvent, speed?: number): boolean | number {\n const { moveX, moveY } = this.dragData\n const absMoveX = abs(moveX), absMoveY = abs(moveY), minMove = speed ? 1 : 0.1\n const dragAnimate = this.canAnimate && this.moving && (absMoveX > minMove || absMoveY > minMove) && this.interaction.m.dragAnimate\n\n if (dragAnimate) {\n const inertia = data.pointerType === 'touch' ? 3 : 1, maxMove = 70\n speed = speed ? (isNumber(dragAnimate) ? dragAnimate : 0.95) : inertia\n if (absMoveX * speed > maxMove) speed = maxMove / absMoveX\n else if (absMoveY * speed > maxMove) speed = maxMove / absMoveY\n\n data = { ...data }\n PointHelper.move(data, moveX * speed, moveY * speed)\n\n this.drag(data)\n this.animate(() => { this.dragEnd(data, 1) })\n }\n\n return dragAnimate\n}\n\ndragger.animate = function (func?: IFunction, off?: 'off'): void { // dragEnd animation\n const animateWait = func || this.animateWait\n if (animateWait) this.interaction.target.nextRender(animateWait, null, off)\n this.animateWait = func\n}\n\ndragger.checkDragOut = function (data: IPointerEvent): void {\n const { interaction } = this\n this.autoMoveCancel()\n if (this.dragging && !interaction.shrinkCanvasBounds.hitPoint(data)) this.autoMoveOnDragOut(data)\n}\n\ndragger.autoMoveOnDragOut = function (data: IPointerEvent): void {\n const { interaction, downData, canDragOut } = this\n const { autoDistance, dragOut } = interaction.m\n if (!dragOut || !canDragOut || !autoDistance) return\n\n const bounds = interaction.shrinkCanvasBounds\n const { x, y } = bounds\n const right = BoundsHelper.maxX(bounds)\n const bottom = BoundsHelper.maxY(bounds)\n\n const moveX = data.x < x ? autoDistance : (right < data.x ? -autoDistance : 0)\n const moveY = data.y < y ? autoDistance : (bottom < data.y ? -autoDistance : 0)\n let totalX = 0, totalY = 0\n\n this.autoMoveTimer = setInterval(() => {\n totalX += moveX\n totalY += moveY\n\n PointHelper.move(downData, moveX, moveY)\n PointHelper.move(this.dragData, moveX, moveY)\n\n interaction.move({ ...data, moveX, moveY, totalX, totalY, moveType: 'drag' })\n interaction.pointerMoveReal(data)\n }, 10)\n}\n\ndragger.autoMoveCancel = function (): void {\n if (this.autoMoveTimer) {\n clearInterval(this.autoMoveTimer)\n this.autoMoveTimer = 0\n }\n}","export { LeaferTypeCreator } from './LeaferTypeCreator'\nexport { addViewport, addViewportConfig } from './type/viewport'\nexport { MultiTouchHelper } from './interaction/MultiTouchHelper'\nexport { WheelEventHelper } from './interaction/WheelEventHelper'\nexport { Transformer } from './interaction/Transformer'\n\nimport { Plugin } from '@leafer-ui/core'\n\nimport './Leafer'\nimport './interaction/Interaction'\nimport './interaction/Dragger'\n\nPlugin.add('viewport')"],"names":["addViewport","leafer","mergeConfig","custom","addViewportConfig","parentApp","isApp","__eventIds","push","on_","MoveEvent","BEFORE_MOVE","e","zoomLayer","move","getValidMove","moveX","moveY","END","LeafHelper","animateMove","ZoomEvent","BEFORE_ZOOM","changeScale","getValidScale","scale","scaleOfWorld","viewportConfig","wheel","preventDefault","touch","pointer","preventDefaultMenu","DataHelper","assign","config","userConfig","debug","Debug","get","LeaferTypeCreator","list","register","name","fn","repeat","run","zoom","min","max","holdSpaceKey","holdMiddleKey","scroll","MultiTouchHelper","getData","a","b","lastCenter","PointHelper","getCenter","from","center","to","x","y","lastDistance","getDistance","rotation","getRotation","abs","Math","sign","within","MathHelper","WheelEventHelper","getMove","event","moveSpeed","deltaX","deltaY","shiftKey","absX","absY","getScale","zoomMode","zoomSpeed","delta","Platform","intWheelDeltaY","ceil","metaKey","ctrlKey","Transformer","transforming","this","moveData","zoomData","rotateData","constructor","interaction","data","moveType","setPath","Object","emit","START","path","MOVE","transformEndWait","ZOOM","rotate","RotateEvent","BEFORE_ROTATE","ROTATE","selector","getByPoint","hitRadius","cancelHover","clearTimeout","transformTimer","setTimeout","transformEnd","p","transformTime","reset","destroy","Leafer","prototype","bounds","Bounds","Point","getMoveEventData","getZoomEventData","initType","type","checkLimit","disabled","app","set","includes","__world","addPoint","DragBoundsHelper","canvas","scaleX","__","absScale","InteractionBase","createTransformer","transformer","posDeltaSpeed","negDeltaSpeed","snap","round","multiTouch","pointerWaitCancel","getRotateEventData","dragger","Dragger","checkDragEndAnimate","speed","dragData","absMoveX","absMoveY","minMove","dragAnimate","canAnimate","moving","m","inertia","pointerType","maxMove","isNumber","drag","animate","dragEnd","func","off","animateWait","target","nextRender","checkDragOut","autoMoveCancel","dragging","shrinkCanvasBounds","hitPoint","autoMoveOnDragOut","downData","canDragOut","autoDistance","dragOut","right","BoundsHelper","maxX","bottom","maxY","totalX","totalY","autoMoveTimer","setInterval","pointerMoveReal","clearInterval","Plugin","add"],"mappings":"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"}
1
+ {"version":3,"file":"viewport.min.cjs","sources":["../../../../../../src/in/packages/viewport/src/type/viewport.ts","../../../../../../src/in/packages/viewport/src/LeaferTypeCreator.ts","../../../../../../src/in/packages/viewport/src/type/custom.ts","../../../../../../src/in/packages/viewport/src/type/design.ts","../../../../../../src/in/packages/viewport/src/type/document.ts","../../../../../../src/in/packages/viewport/src/interaction/MultiTouchHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/WheelEventHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/Transformer.ts","../../../../../../src/in/packages/viewport/src/Leafer.ts","../../../../../../src/in/packages/viewport/src/interaction/Interaction.ts","../../../../../../src/in/packages/viewport/src/interaction/Dragger.ts","../../../../../../src/in/packages/viewport/src/index.ts"],"sourcesContent":["import { ILeaferBase, ILeaferConfig } from '@leafer-ui/interface'\n\nimport { MoveEvent, ZoomEvent, DataHelper, LeafHelper } from '@leafer-ui/core'\n\n\nexport function addViewport(leafer: ILeaferBase, mergeConfig?: ILeaferConfig, custom?: boolean): void {\n addViewportConfig(leafer.parentApp ? leafer.parentApp : leafer, mergeConfig)\n if (leafer.isApp || custom) return\n\n leafer.__eventIds.push(\n leafer.on_(MoveEvent.BEFORE_MOVE, (e: MoveEvent) => {\n leafer.zoomLayer.move(leafer.getValidMove(e.moveX, e.moveY, false))\n }),\n leafer.on_(MoveEvent.END, (e: MoveEvent) => {\n LeafHelper.animateMove(leafer.zoomLayer, leafer.getValidMove(e.moveX, e.moveY))\n }),\n leafer.on_(ZoomEvent.BEFORE_ZOOM, (e: ZoomEvent) => {\n const { zoomLayer } = leafer\n const changeScale = leafer.getValidScale(e.scale)\n if (changeScale !== 1) zoomLayer.scaleOfWorld(e, changeScale)\n })\n )\n}\n\nexport function addViewportConfig(leafer: ILeaferBase, mergeConfig?: ILeaferConfig): void {\n const viewportConfig: ILeaferConfig = {\n wheel: { preventDefault: true },\n touch: { preventDefault: true },\n pointer: { preventDefaultMenu: true }\n }\n if (mergeConfig) DataHelper.assign(viewportConfig, mergeConfig)\n DataHelper.assign(leafer.config, viewportConfig, leafer.userConfig)\n}","import { ILeaferBase, ILeaferTypeList, ILeaferTypeFunction } from '@leafer-ui/interface'\n\nimport { Debug } from '@leafer-ui/core'\n\nimport { addViewport } from './type/viewport'\nimport { custom } from './type/custom'\nimport { design } from './type/design'\nimport { document } from './type/document'\n\n\nconst debug = Debug.get('LeaferTypeCreator')\n\nexport const LeaferTypeCreator = {\n\n list: {} as ILeaferTypeList,\n\n register(name: string, fn: ILeaferTypeFunction): void {\n list[name] && debug.repeat(name)\n list[name] = fn\n },\n\n run(name: string, leafer: ILeaferBase): void {\n const fn = list[name]\n fn && fn(leafer)\n }\n\n}\n\nconst { list, register } = LeaferTypeCreator\n\nregister('viewport', addViewport)\nregister('custom', custom)\nregister('design', design)\nregister('document', document)","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function custom(leafer: ILeaferBase): void {\n addViewport(leafer, null, true)\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function design(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: {\n min: 0.01,\n max: 256\n },\n move: {\n holdSpaceKey: true,\n holdMiddleKey: true,\n }\n })\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function document(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: { min: 1 },\n move: { scroll: 'limit' }\n })\n}\n","import { IMultiTouchData, IKeepTouchData } from '@leafer-ui/interface'\n\nimport { PointHelper } from '@leafer-ui/core'\n\n\nexport const MultiTouchHelper = {\n\n getData(list: IKeepTouchData[]): IMultiTouchData {\n const a = list[0], b = list[1]\n const lastCenter = PointHelper.getCenter(a.from, b.from)\n const center = PointHelper.getCenter(a.to, b.to)\n const move = { x: center.x - lastCenter.x, y: center.y - lastCenter.y }\n\n const lastDistance = PointHelper.getDistance(a.from, b.from)\n const distance = PointHelper.getDistance(a.to, b.to)\n const scale = distance / lastDistance\n\n const rotation = PointHelper.getRotation(a.from, b.from, a.to, b.to)\n\n return { move, scale, rotation, center }\n }\n\n}","import { IPointData, IWheelEvent, IWheelConfig } from '@leafer-ui/interface'\n\nimport { MathHelper, Platform } from '@leafer-ui/core'\n\n\nconst { abs, max } = Math, { sign, within } = MathHelper\n\nexport const WheelEventHelper = {\n\n getMove(event: IWheelEvent, config: IWheelConfig): IPointData {\n let { moveSpeed } = config\n let { deltaX, deltaY } = event\n if (event.shiftKey && !deltaX) { // Window\n deltaX = deltaY\n deltaY = 0\n }\n const absX = abs(deltaX), absY = abs(deltaY)\n if (absX > 50) deltaX = max(50, absX / 3) * sign(deltaX)\n if (absY > 50) deltaY = max(50, absY / 3) * sign(deltaY)\n return { x: -deltaX * moveSpeed * 2, y: -deltaY * moveSpeed * 2 }\n },\n\n getScale(event: IWheelEvent, config: IWheelConfig): number {\n\n let zoom: boolean\n let scale = 1\n let { zoomMode, zoomSpeed } = config\n\n const delta = event.deltaY || event.deltaX\n\n if (zoomMode) {\n // mac 触摸板滚动手势的deltaY是整数, 鼠标滚动/触摸板缩放的deltaY有小数点, firfox鼠标滚动为整数,为18或19的倍数\n // windows 始终是整数\n zoom = (zoomMode === 'mouse') ? true : (!event.deltaX && (Platform.intWheelDeltaY ? Math.abs(delta) > 17 : Math.ceil(delta) !== delta))\n if (event.shiftKey || event.metaKey || event.ctrlKey) zoom = true\n } else {\n zoom = !event.shiftKey && (event.metaKey || event.ctrlKey)\n }\n\n if (zoom) {\n zoomSpeed = within(zoomSpeed, 0, 1)\n const min = event.deltaY ? config.delta.y : config.delta.x\n const absScale = within(1 - abs(delta) / (min * 4) * zoomSpeed, 0.5, 2)\n scale = delta > 0 ? absScale : 1 / absScale // 让 scale 放大、缩小可以定位在有规律的刻度上\n }\n\n return scale\n }\n\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, ITimer } from '@leafer-ui/interface'\n\nimport { InteractionBase, MoveEvent, ZoomEvent, RotateEvent } from '@leafer-ui/core'\n\n\nexport class Transformer {\n\n public get transforming(): boolean { return !!(this.moveData || this.zoomData || this.rotateData) }\n\n protected interaction: InteractionBase\n protected moveData: IMoveEvent\n protected zoomData: IZoomEvent\n protected rotateData: IRotateEvent\n protected transformTimer: ITimer\n\n constructor(interaction: InteractionBase) {\n this.interaction = interaction\n }\n\n public move(data: IMoveEvent): void {\n const { interaction } = this\n if (!data.moveType) data.moveType = 'move'\n\n if (!this.moveData) {\n this.setPath(data)\n this.moveData = { ...data, moveX: 0, moveY: 0 }\n interaction.emit(MoveEvent.START, this.moveData)\n }\n\n data.path = this.moveData.path\n interaction.emit(MoveEvent.BEFORE_MOVE, data)\n interaction.emit(MoveEvent.MOVE, data)\n\n this.transformEndWait()\n }\n\n public zoom(data: IZoomEvent): void {\n const { interaction } = this\n\n if (!this.zoomData) {\n this.setPath(data)\n this.zoomData = { ...data, scale: 1 }\n interaction.emit(ZoomEvent.START, this.zoomData)\n }\n\n data.path = this.zoomData.path\n interaction.emit(ZoomEvent.BEFORE_ZOOM, data)\n interaction.emit(ZoomEvent.ZOOM, data)\n\n this.transformEndWait()\n }\n\n public rotate(data: IRotateEvent): void {\n const { interaction } = this\n\n if (!this.rotateData) {\n this.setPath(data)\n this.rotateData = { ...data, rotation: 0 }\n interaction.emit(RotateEvent.START, this.rotateData)\n }\n\n data.path = this.rotateData.path\n interaction.emit(RotateEvent.BEFORE_ROTATE, data)\n interaction.emit(RotateEvent.ROTATE, data)\n\n this.transformEndWait()\n }\n\n public setPath(data: any): void {\n const { interaction } = this\n const { path } = interaction.selector.getByPoint(data, interaction.hitRadius)\n data.path = path\n interaction.cancelHover()\n }\n\n protected transformEndWait(): void {\n clearTimeout(this.transformTimer)\n this.transformTimer = setTimeout(() => {\n this.transformEnd()\n }, this.interaction.p.transformTime)\n }\n\n public transformEnd(): void {\n const { interaction, moveData, zoomData, rotateData } = this\n if (moveData) interaction.emit(MoveEvent.END, moveData)\n if (zoomData) interaction.emit(ZoomEvent.END, zoomData)\n if (rotateData) interaction.emit(RotateEvent.END, rotateData)\n this.reset()\n }\n\n public reset(): void {\n this.zoomData = this.moveData = this.rotateData = null\n }\n\n public destroy(): void {\n this.reset()\n }\n}","import { ILeaferType, IPointData } from '@leafer-ui/interface'\n\nimport { Leafer, Bounds, Point, DragBoundsHelper } from '@leafer-ui/core'\n\nimport { LeaferTypeCreator } from './LeaferTypeCreator'\n\n\nconst leafer = Leafer.prototype\nconst bounds = new Bounds(), move = new Point()\n\nleafer.initType = function (type: ILeaferType) {\n LeaferTypeCreator.run(type, this)\n}\n\nleafer.getValidMove = function (moveX: number, moveY: number, checkLimit = true): IPointData {\n const { scroll, disabled } = this.app.config.move\n move.set(moveX, moveY)\n\n if (scroll) {\n const type = scroll === true ? '' : scroll\n\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n else Math.abs(move.x) > Math.abs(move.y) ? move.y = 0 : move.x = 0\n\n if (checkLimit && type.includes('limit')) {\n bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)\n DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'inner', move, true)\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n }\n }\n\n return { x: disabled ? 0 : move.x, y: disabled ? 0 : move.y }\n}\n\nleafer.getValidScale = function (changeScale: number): number {\n const { scaleX } = this.zoomLayer.__, { min, max, disabled } = this.app.config.zoom, absScale = Math.abs(scaleX * changeScale)\n if (min && absScale < min) changeScale = min / scaleX\n else if (max && absScale > max) changeScale = max / scaleX\n return disabled ? 1 : changeScale // fix 不能过滤小数位\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, IWheelEvent, IKeepTouchData, IPointData, IEvent, IPointerEvent } from '@leafer-ui/interface'\n\nimport { InteractionBase, PointHelper } from '@leafer-ui/core'\n\nimport { WheelEventHelper } from './WheelEventHelper'\nimport { Transformer } from './Transformer'\nimport { MultiTouchHelper } from './MultiTouchHelper'\n\n\nfunction getMoveEventData(move: IPointData, event: IEvent): IMoveEvent {\n return { ...event, moveX: move.x, moveY: move.y } as IMoveEvent\n}\n\nfunction getRotateEventData(rotation: number, event: IEvent): IRotateEvent {\n return { ...event, rotation } as IRotateEvent\n}\n\nfunction getZoomEventData(scale: number, event: IEvent): IZoomEvent {\n return { ...event, scale, } as IZoomEvent\n}\n\n\nconst interaction = InteractionBase.prototype\n\ninteraction.createTransformer = function (): void {\n this.transformer = new Transformer(this)\n}\n\ninteraction.move = function (data: IMoveEvent): void {\n this.transformer.move(data)\n}\n\ninteraction.zoom = function (data: IZoomEvent): void {\n this.transformer.zoom(data)\n}\n\ninteraction.rotate = function (data: IRotateEvent): void {\n this.transformer.rotate(data)\n}\n\ninteraction.transformEnd = function (): void {\n this.transformer.transformEnd()\n}\n\n\ninteraction.wheel = function (data: IWheelEvent): void {\n const { wheel, pointer } = this.config, { posDeltaSpeed, negDeltaSpeed } = wheel\n if (wheel.disabled) return\n\n if (data.deltaX > 0) posDeltaSpeed && (data.deltaX *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaX *= negDeltaSpeed)\n\n if (data.deltaY > 0) posDeltaSpeed && (data.deltaY *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaY *= negDeltaSpeed)\n\n const scale = wheel.getScale ? wheel.getScale(data, wheel) : WheelEventHelper.getScale(data, wheel)\n if (scale !== 1) this.zoom(getZoomEventData(scale, data))\n else {\n const move = wheel.getMove ? wheel.getMove(data, wheel) : WheelEventHelper.getMove(data, wheel)\n if (pointer.snap) PointHelper.round(move)\n this.move(getMoveEventData(move, data))\n }\n}\n\n\ninteraction.multiTouch = function (data: IPointerEvent, list: IKeepTouchData[]): void {\n if (this.config.multiTouch.disabled) return\n const { move, rotation, scale, center } = MultiTouchHelper.getData(list)\n\n Object.assign(data, center)\n data.multiTouch = true\n\n this.pointerWaitCancel()\n\n this.rotate(getRotateEventData(rotation, data))\n this.zoom(getZoomEventData(scale, data))\n this.move(getMoveEventData(move, data))\n}","import { IPointerEvent, IFunction } from '@leafer-ui/interface'\n\nimport { Dragger, BoundsHelper, PointHelper, isNumber } from '@leafer-ui/core'\n\n\nconst dragger = Dragger.prototype\nconst { abs } = Math\n\ndragger.checkDragEndAnimate = function (data: IPointerEvent, speed?: number): boolean | number {\n const { moveX, moveY } = this.dragData\n const absMoveX = abs(moveX), absMoveY = abs(moveY), minMove = speed ? 1 : 0.1\n const dragAnimate = this.canAnimate && this.moving && (absMoveX > minMove || absMoveY > minMove) && this.interaction.m.dragAnimate\n\n if (dragAnimate) {\n const inertia = data.pointerType === 'touch' ? 3 : 1, maxMove = 70\n speed = speed ? (isNumber(dragAnimate) ? dragAnimate : 0.95) : inertia\n if (absMoveX * speed > maxMove) speed = maxMove / absMoveX\n else if (absMoveY * speed > maxMove) speed = maxMove / absMoveY\n\n data = { ...data }\n PointHelper.move(data, moveX * speed, moveY * speed)\n\n this.drag(data)\n this.animate(() => { this.dragEnd(data, 1) })\n }\n\n return dragAnimate\n}\n\ndragger.animate = function (func?: IFunction, off?: 'off'): void { // dragEnd animation\n const animateWait = func || this.animateWait\n if (animateWait) this.interaction.target.nextRender(animateWait, null, off)\n this.animateWait = func\n}\n\ndragger.checkDragOut = function (data: IPointerEvent): void {\n const { interaction } = this\n this.autoMoveCancel()\n if (this.dragging && !interaction.shrinkCanvasBounds.hitPoint(data)) this.autoMoveOnDragOut(data)\n}\n\ndragger.autoMoveOnDragOut = function (data: IPointerEvent): void {\n const { interaction, downData, canDragOut } = this\n const { autoDistance, dragOut } = interaction.m\n if (!dragOut || !canDragOut || !autoDistance) return\n\n const bounds = interaction.shrinkCanvasBounds\n const { x, y } = bounds\n const right = BoundsHelper.maxX(bounds)\n const bottom = BoundsHelper.maxY(bounds)\n\n const moveX = data.x < x ? autoDistance : (right < data.x ? -autoDistance : 0)\n const moveY = data.y < y ? autoDistance : (bottom < data.y ? -autoDistance : 0)\n let totalX = 0, totalY = 0\n\n this.autoMoveTimer = setInterval(() => {\n totalX += moveX\n totalY += moveY\n\n PointHelper.move(downData, moveX, moveY)\n PointHelper.move(this.dragData, moveX, moveY)\n\n interaction.move({ ...data, moveX, moveY, totalX, totalY, moveType: 'drag' })\n interaction.pointerMoveReal(data)\n }, 10)\n}\n\ndragger.autoMoveCancel = function (): void {\n if (this.autoMoveTimer) {\n clearInterval(this.autoMoveTimer)\n this.autoMoveTimer = 0\n }\n}","export { LeaferTypeCreator } from './LeaferTypeCreator'\nexport { addViewport, addViewportConfig } from './type/viewport'\nexport { MultiTouchHelper } from './interaction/MultiTouchHelper'\nexport { WheelEventHelper } from './interaction/WheelEventHelper'\nexport { Transformer } from './interaction/Transformer'\n\nimport { Plugin } from '@leafer-ui/core'\n\nimport './Leafer'\nimport './interaction/Interaction'\nimport './interaction/Dragger'\n\nPlugin.add('viewport')"],"names":["addViewport","leafer","mergeConfig","custom","addViewportConfig","parentApp","isApp","__eventIds","push","on_","MoveEvent","BEFORE_MOVE","e","zoomLayer","move","getValidMove","moveX","moveY","END","LeafHelper","animateMove","ZoomEvent","BEFORE_ZOOM","changeScale","getValidScale","scale","scaleOfWorld","viewportConfig","wheel","preventDefault","touch","pointer","preventDefaultMenu","DataHelper","assign","config","userConfig","debug","Debug","get","LeaferTypeCreator","list","register","name","fn","repeat","run","zoom","min","max","holdSpaceKey","holdMiddleKey","scroll","MultiTouchHelper","getData","a","b","lastCenter","PointHelper","getCenter","from","center","to","x","y","lastDistance","getDistance","rotation","getRotation","abs","Math","sign","within","MathHelper","WheelEventHelper","getMove","event","moveSpeed","deltaX","deltaY","shiftKey","absX","absY","getScale","zoomMode","zoomSpeed","delta","Platform","intWheelDeltaY","ceil","metaKey","ctrlKey","absScale","Transformer","transforming","this","moveData","zoomData","rotateData","constructor","interaction","data","moveType","setPath","Object","emit","START","path","MOVE","transformEndWait","ZOOM","rotate","RotateEvent","BEFORE_ROTATE","ROTATE","selector","getByPoint","hitRadius","cancelHover","clearTimeout","transformTimer","setTimeout","transformEnd","p","transformTime","reset","destroy","Leafer","prototype","bounds","Bounds","Point","getMoveEventData","getZoomEventData","initType","type","checkLimit","disabled","app","set","includes","__world","addPoint","DragBoundsHelper","canvas","scaleX","__","InteractionBase","createTransformer","transformer","posDeltaSpeed","negDeltaSpeed","snap","round","multiTouch","pointerWaitCancel","getRotateEventData","dragger","Dragger","checkDragEndAnimate","speed","dragData","absMoveX","absMoveY","minMove","dragAnimate","canAnimate","moving","m","inertia","pointerType","maxMove","isNumber","drag","animate","dragEnd","func","off","animateWait","target","nextRender","checkDragOut","autoMoveCancel","dragging","shrinkCanvasBounds","hitPoint","autoMoveOnDragOut","downData","canDragOut","autoDistance","dragOut","right","BoundsHelper","maxX","bottom","maxY","totalX","totalY","autoMoveTimer","setInterval","pointerMoveReal","clearInterval","Plugin","add"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- this.LeaferIN=this.LeaferIN||{},this.LeaferIN.viewport=function(t,e){"use strict";function o(t,o,n){a(t.parentApp?t.parentApp:t,o),t.isApp||n||t.__eventIds.push(t.on_(e.MoveEvent.BEFORE_MOVE,e=>{t.zoomLayer.move(t.getValidMove(e.moveX,e.moveY,!1))}),t.on_(e.MoveEvent.END,o=>{e.LeafHelper.animateMove(t.zoomLayer,t.getValidMove(o.moveX,o.moveY))}),t.on_(e.ZoomEvent.BEFORE_ZOOM,e=>{const{zoomLayer:o}=t,a=t.getValidScale(e.scale);1!==a&&o.scaleOfWorld(e,a)}))}function a(t,o){const a={wheel:{preventDefault:!0},touch:{preventDefault:!0},pointer:{preventDefaultMenu:!0}};o&&e.DataHelper.assign(a,o),e.DataHelper.assign(t.config,a,t.userConfig)}const n=e.Debug.get("LeaferTypeCreator"),i={list:{},register(t,e){s[t]&&n.repeat(t),s[t]=e},run(t,e){const o=s[t];o&&o(e)}},{list:s,register:r}=i;r("viewport",o),r("custom",function(t){o(t,null,!0)}),r("design",function(t){o(t,{zoom:{min:.01,max:256},move:{holdSpaceKey:!0,holdMiddleKey:!0}})}),r("document",function(t){o(t,{zoom:{min:1},move:{scroll:"limit"}})});const c={getData(t){const o=t[0],a=t[1],n=e.PointHelper.getCenter(o.from,a.from),i=e.PointHelper.getCenter(o.to,a.to),s={x:i.x-n.x,y:i.y-n.y},r=e.PointHelper.getDistance(o.from,a.from);return{move:s,scale:e.PointHelper.getDistance(o.to,a.to)/r,rotation:e.PointHelper.getRotation(o.from,a.from,o.to,a.to),center:i}}},{abs:m,max:h}=Math,{sign:l,within:u}=e.MathHelper,v={getMove(t,e){let{moveSpeed:o}=e,{deltaX:a,deltaY:n}=t;t.shiftKey&&!a&&(a=n,n=0);const i=m(a),s=m(n);return i>50&&(a=h(50,i/3)*l(a)),s>50&&(n=h(50,s/3)*l(n)),{x:-a*o*2,y:-n*o*2}},getScale(t,o){let a,n=1,{zoomMode:i,zoomSpeed:s}=o;const r=t.deltaY||t.deltaX;if(i?(a="mouse"===i||!t.deltaX&&(e.Platform.intWheelDeltaY?Math.abs(r)>17:Math.ceil(r)!==r),(t.shiftKey||t.metaKey||t.ctrlKey)&&(a=!0)):a=!t.shiftKey&&(t.metaKey||t.ctrlKey),a){s=u(s,0,1);const e=t.deltaY?o.delta.y:o.delta.x;n=u(1-r/(4*e)*s,.5,1.5)}return n}};class d{get transforming(){return!!(this.moveData||this.zoomData||this.rotateData)}constructor(t){this.interaction=t}move(t){const{interaction:o}=this;t.moveType||(t.moveType="move"),this.moveData||(this.setPath(t),this.moveData=Object.assign(Object.assign({},t),{moveX:0,moveY:0}),o.emit(e.MoveEvent.START,this.moveData)),t.path=this.moveData.path,o.emit(e.MoveEvent.BEFORE_MOVE,t),o.emit(e.MoveEvent.MOVE,t),this.transformEndWait()}zoom(t){const{interaction:o}=this;this.zoomData||(this.setPath(t),this.zoomData=Object.assign(Object.assign({},t),{scale:1}),o.emit(e.ZoomEvent.START,this.zoomData)),t.path=this.zoomData.path,o.emit(e.ZoomEvent.BEFORE_ZOOM,t),o.emit(e.ZoomEvent.ZOOM,t),this.transformEndWait()}rotate(t){const{interaction:o}=this;this.rotateData||(this.setPath(t),this.rotateData=Object.assign(Object.assign({},t),{rotation:0}),o.emit(e.RotateEvent.START,this.rotateData)),t.path=this.rotateData.path,o.emit(e.RotateEvent.BEFORE_ROTATE,t),o.emit(e.RotateEvent.ROTATE,t),this.transformEndWait()}setPath(t){const{interaction:e}=this,{path:o}=e.selector.getByPoint(t,e.hitRadius);t.path=o,e.cancelHover()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout(()=>{this.transformEnd()},this.interaction.p.transformTime)}transformEnd(){const{interaction:t,moveData:o,zoomData:a,rotateData:n}=this;o&&t.emit(e.MoveEvent.END,o),a&&t.emit(e.ZoomEvent.END,a),n&&t.emit(e.RotateEvent.END,n),this.reset()}reset(){this.zoomData=this.moveData=this.rotateData=null}destroy(){this.reset()}}const f=e.Leafer.prototype,g=new e.Bounds,p=new e.Point;function D(t,e){return Object.assign(Object.assign({},e),{moveX:t.x,moveY:t.y})}function E(t,e){return Object.assign(Object.assign({},e),{scale:t})}f.initType=function(t){i.run(t,this)},f.getValidMove=function(t,o,a=!0){const{scroll:n,disabled:i}=this.app.config.move;if(p.set(t,o),n){const t=!0===n?"":n;t.includes("x")?p.y=0:t.includes("y")?p.x=0:Math.abs(p.x)>Math.abs(p.y)?p.y=0:p.x=0,a&&t.includes("limit")&&(g.set(this.__world).addPoint(this.zoomLayer),e.DragBoundsHelper.getValidMove(g,this.canvas.bounds,"inner",p,!0),t.includes("x")?p.y=0:t.includes("y")&&(p.x=0))}return{x:i?0:p.x,y:i?0:p.y}},f.getValidScale=function(t){const{scaleX:e}=this.zoomLayer.__,{min:o,max:a,disabled:n}=this.app.config.zoom,i=Math.abs(e*t);return o&&i<o?t=o/e:a&&i>a&&(t=a/e),n?1:t};const y=e.InteractionBase.prototype;y.createTransformer=function(){this.transformer=new d(this)},y.move=function(t){this.transformer.move(t)},y.zoom=function(t){this.transformer.zoom(t)},y.rotate=function(t){this.transformer.rotate(t)},y.transformEnd=function(){this.transformer.transformEnd()},y.wheel=function(t){const{wheel:o,pointer:a}=this.config,{posDeltaSpeed:n,negDeltaSpeed:i}=o;if(o.disabled)return;t.deltaX>0?n&&(t.deltaX*=n):i&&(t.deltaX*=i),t.deltaY>0?n&&(t.deltaY*=n):i&&(t.deltaY*=i);const s=o.getScale?o.getScale(t,o):v.getScale(t,o);if(1!==s)this.zoom(E(s,t));else{const n=o.getMove?o.getMove(t,o):v.getMove(t,o);a.snap&&e.PointHelper.round(n),this.move(D(n,t))}},y.multiTouch=function(t,e){if(this.config.multiTouch.disabled)return;const{move:o,rotation:a,scale:n,center:i}=c.getData(e);Object.assign(t,i),t.multiTouch=!0,this.pointerWaitCancel(),this.rotate(function(t,e){return Object.assign(Object.assign({},e),{rotation:t})}(a,t)),this.zoom(E(n,t)),this.move(D(o,t))};const M=e.Dragger.prototype,{abs:O}=Math;return M.checkDragEndAnimate=function(t,o){const{moveX:a,moveY:n}=this.dragData,i=O(a),s=O(n),r=o?1:.1,c=this.canAnimate&&this.moving&&(i>r||s>r)&&this.interaction.m.dragAnimate;if(c){const r="touch"===t.pointerType?3:1,m=70;i*(o=o?e.isNumber(c)?c:.95:r)>m?o=m/i:s*o>m&&(o=m/s),t=Object.assign({},t),e.PointHelper.move(t,a*o,n*o),this.drag(t),this.animate(()=>{this.dragEnd(t,1)})}return c},M.animate=function(t,e){const o=t||this.animateWait;o&&this.interaction.target.nextRender(o,null,e),this.animateWait=t},M.checkDragOut=function(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)},M.autoMoveOnDragOut=function(t){const{interaction:o,downData:a,canDragOut:n}=this,{autoDistance:i,dragOut:s}=o.m;if(!s||!n||!i)return;const r=o.shrinkCanvasBounds,{x:c,y:m}=r,h=e.BoundsHelper.maxX(r),l=e.BoundsHelper.maxY(r),u=t.x<c?i:h<t.x?-i:0,v=t.y<m?i:l<t.y?-i:0;let d=0,f=0;this.autoMoveTimer=setInterval(()=>{d+=u,f+=v,e.PointHelper.move(a,u,v),e.PointHelper.move(this.dragData,u,v),o.move(Object.assign(Object.assign({},t),{moveX:u,moveY:v,totalX:d,totalY:f,moveType:"drag"})),o.pointerMoveReal(t)},10)},M.autoMoveCancel=function(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)},e.Plugin.add("viewport"),t.LeaferTypeCreator=i,t.MultiTouchHelper=c,t.Transformer=d,t.WheelEventHelper=v,t.addViewport=o,t.addViewportConfig=a,t}({},LeaferUI);
1
+ this.LeaferIN=this.LeaferIN||{},this.LeaferIN.viewport=function(t,e){"use strict";function o(t,o,n){a(t.parentApp?t.parentApp:t,o),t.isApp||n||t.__eventIds.push(t.on_(e.MoveEvent.BEFORE_MOVE,e=>{t.zoomLayer.move(t.getValidMove(e.moveX,e.moveY,!1))}),t.on_(e.MoveEvent.END,o=>{e.LeafHelper.animateMove(t.zoomLayer,t.getValidMove(o.moveX,o.moveY))}),t.on_(e.ZoomEvent.BEFORE_ZOOM,e=>{const{zoomLayer:o}=t,a=t.getValidScale(e.scale);1!==a&&o.scaleOfWorld(e,a)}))}function a(t,o){const a={wheel:{preventDefault:!0},touch:{preventDefault:!0},pointer:{preventDefaultMenu:!0}};o&&e.DataHelper.assign(a,o),e.DataHelper.assign(t.config,a,t.userConfig)}const n=e.Debug.get("LeaferTypeCreator"),i={list:{},register(t,e){s[t]&&n.repeat(t),s[t]=e},run(t,e){const o=s[t];o&&o(e)}},{list:s,register:r}=i;r("viewport",o),r("custom",function(t){o(t,null,!0)}),r("design",function(t){o(t,{zoom:{min:.01,max:256},move:{holdSpaceKey:!0,holdMiddleKey:!0}})}),r("document",function(t){o(t,{zoom:{min:1},move:{scroll:"limit"}})});const c={getData(t){const o=t[0],a=t[1],n=e.PointHelper.getCenter(o.from,a.from),i=e.PointHelper.getCenter(o.to,a.to),s={x:i.x-n.x,y:i.y-n.y},r=e.PointHelper.getDistance(o.from,a.from);return{move:s,scale:e.PointHelper.getDistance(o.to,a.to)/r,rotation:e.PointHelper.getRotation(o.from,a.from,o.to,a.to),center:i}}},{abs:m,max:h}=Math,{sign:l,within:u}=e.MathHelper,v={getMove(t,e){let{moveSpeed:o}=e,{deltaX:a,deltaY:n}=t;t.shiftKey&&!a&&(a=n,n=0);const i=m(a),s=m(n);return i>50&&(a=h(50,i/3)*l(a)),s>50&&(n=h(50,s/3)*l(n)),{x:-a*o*2,y:-n*o*2}},getScale(t,o){let a,n=1,{zoomMode:i,zoomSpeed:s}=o;const r=t.deltaY||t.deltaX;if(i?(a="mouse"===i||!t.deltaX&&(e.Platform.intWheelDeltaY?Math.abs(r)>17:Math.ceil(r)!==r),(t.shiftKey||t.metaKey||t.ctrlKey)&&(a=!0)):a=!t.shiftKey&&(t.metaKey||t.ctrlKey),a){s=u(s,0,1);const e=t.deltaY?o.delta.y:o.delta.x,a=u(1-m(r)/(4*e)*s,.5,2);n=r>0?a:1/a}return n}};class d{get transforming(){return!!(this.moveData||this.zoomData||this.rotateData)}constructor(t){this.interaction=t}move(t){const{interaction:o}=this;t.moveType||(t.moveType="move"),this.moveData||(this.setPath(t),this.moveData=Object.assign(Object.assign({},t),{moveX:0,moveY:0}),o.emit(e.MoveEvent.START,this.moveData)),t.path=this.moveData.path,o.emit(e.MoveEvent.BEFORE_MOVE,t),o.emit(e.MoveEvent.MOVE,t),this.transformEndWait()}zoom(t){const{interaction:o}=this;this.zoomData||(this.setPath(t),this.zoomData=Object.assign(Object.assign({},t),{scale:1}),o.emit(e.ZoomEvent.START,this.zoomData)),t.path=this.zoomData.path,o.emit(e.ZoomEvent.BEFORE_ZOOM,t),o.emit(e.ZoomEvent.ZOOM,t),this.transformEndWait()}rotate(t){const{interaction:o}=this;this.rotateData||(this.setPath(t),this.rotateData=Object.assign(Object.assign({},t),{rotation:0}),o.emit(e.RotateEvent.START,this.rotateData)),t.path=this.rotateData.path,o.emit(e.RotateEvent.BEFORE_ROTATE,t),o.emit(e.RotateEvent.ROTATE,t),this.transformEndWait()}setPath(t){const{interaction:e}=this,{path:o}=e.selector.getByPoint(t,e.hitRadius);t.path=o,e.cancelHover()}transformEndWait(){clearTimeout(this.transformTimer),this.transformTimer=setTimeout(()=>{this.transformEnd()},this.interaction.p.transformTime)}transformEnd(){const{interaction:t,moveData:o,zoomData:a,rotateData:n}=this;o&&t.emit(e.MoveEvent.END,o),a&&t.emit(e.ZoomEvent.END,a),n&&t.emit(e.RotateEvent.END,n),this.reset()}reset(){this.zoomData=this.moveData=this.rotateData=null}destroy(){this.reset()}}const f=e.Leafer.prototype,g=new e.Bounds,p=new e.Point;function D(t,e){return Object.assign(Object.assign({},e),{moveX:t.x,moveY:t.y})}function E(t,e){return Object.assign(Object.assign({},e),{scale:t})}f.initType=function(t){i.run(t,this)},f.getValidMove=function(t,o,a=!0){const{scroll:n,disabled:i}=this.app.config.move;if(p.set(t,o),n){const t=!0===n?"":n;t.includes("x")?p.y=0:t.includes("y")?p.x=0:Math.abs(p.x)>Math.abs(p.y)?p.y=0:p.x=0,a&&t.includes("limit")&&(g.set(this.__world).addPoint(this.zoomLayer),e.DragBoundsHelper.getValidMove(g,this.canvas.bounds,"inner",p,!0),t.includes("x")?p.y=0:t.includes("y")&&(p.x=0))}return{x:i?0:p.x,y:i?0:p.y}},f.getValidScale=function(t){const{scaleX:e}=this.zoomLayer.__,{min:o,max:a,disabled:n}=this.app.config.zoom,i=Math.abs(e*t);return o&&i<o?t=o/e:a&&i>a&&(t=a/e),n?1:t};const y=e.InteractionBase.prototype;y.createTransformer=function(){this.transformer=new d(this)},y.move=function(t){this.transformer.move(t)},y.zoom=function(t){this.transformer.zoom(t)},y.rotate=function(t){this.transformer.rotate(t)},y.transformEnd=function(){this.transformer.transformEnd()},y.wheel=function(t){const{wheel:o,pointer:a}=this.config,{posDeltaSpeed:n,negDeltaSpeed:i}=o;if(o.disabled)return;t.deltaX>0?n&&(t.deltaX*=n):i&&(t.deltaX*=i),t.deltaY>0?n&&(t.deltaY*=n):i&&(t.deltaY*=i);const s=o.getScale?o.getScale(t,o):v.getScale(t,o);if(1!==s)this.zoom(E(s,t));else{const n=o.getMove?o.getMove(t,o):v.getMove(t,o);a.snap&&e.PointHelper.round(n),this.move(D(n,t))}},y.multiTouch=function(t,e){if(this.config.multiTouch.disabled)return;const{move:o,rotation:a,scale:n,center:i}=c.getData(e);Object.assign(t,i),t.multiTouch=!0,this.pointerWaitCancel(),this.rotate(function(t,e){return Object.assign(Object.assign({},e),{rotation:t})}(a,t)),this.zoom(E(n,t)),this.move(D(o,t))};const M=e.Dragger.prototype,{abs:O}=Math;return M.checkDragEndAnimate=function(t,o){const{moveX:a,moveY:n}=this.dragData,i=O(a),s=O(n),r=o?1:.1,c=this.canAnimate&&this.moving&&(i>r||s>r)&&this.interaction.m.dragAnimate;if(c){const r="touch"===t.pointerType?3:1,m=70;i*(o=o?e.isNumber(c)?c:.95:r)>m?o=m/i:s*o>m&&(o=m/s),t=Object.assign({},t),e.PointHelper.move(t,a*o,n*o),this.drag(t),this.animate(()=>{this.dragEnd(t,1)})}return c},M.animate=function(t,e){const o=t||this.animateWait;o&&this.interaction.target.nextRender(o,null,e),this.animateWait=t},M.checkDragOut=function(t){const{interaction:e}=this;this.autoMoveCancel(),this.dragging&&!e.shrinkCanvasBounds.hitPoint(t)&&this.autoMoveOnDragOut(t)},M.autoMoveOnDragOut=function(t){const{interaction:o,downData:a,canDragOut:n}=this,{autoDistance:i,dragOut:s}=o.m;if(!s||!n||!i)return;const r=o.shrinkCanvasBounds,{x:c,y:m}=r,h=e.BoundsHelper.maxX(r),l=e.BoundsHelper.maxY(r),u=t.x<c?i:h<t.x?-i:0,v=t.y<m?i:l<t.y?-i:0;let d=0,f=0;this.autoMoveTimer=setInterval(()=>{d+=u,f+=v,e.PointHelper.move(a,u,v),e.PointHelper.move(this.dragData,u,v),o.move(Object.assign(Object.assign({},t),{moveX:u,moveY:v,totalX:d,totalY:f,moveType:"drag"})),o.pointerMoveReal(t)},10)},M.autoMoveCancel=function(){this.autoMoveTimer&&(clearInterval(this.autoMoveTimer),this.autoMoveTimer=0)},e.Plugin.add("viewport"),t.LeaferTypeCreator=i,t.MultiTouchHelper=c,t.Transformer=d,t.WheelEventHelper=v,t.addViewport=o,t.addViewportConfig=a,t}({},LeaferUI);
2
2
  //# sourceMappingURL=viewport.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.min.js","sources":["../../../../../../src/in/packages/viewport/src/type/viewport.ts","../../../../../../src/in/packages/viewport/src/LeaferTypeCreator.ts","../../../../../../src/in/packages/viewport/src/type/custom.ts","../../../../../../src/in/packages/viewport/src/type/design.ts","../../../../../../src/in/packages/viewport/src/type/document.ts","../../../../../../src/in/packages/viewport/src/interaction/MultiTouchHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/WheelEventHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/Transformer.ts","../../../../../../src/in/packages/viewport/src/Leafer.ts","../../../../../../src/in/packages/viewport/src/interaction/Interaction.ts","../../../../../../src/in/packages/viewport/src/interaction/Dragger.ts","../../../../../../src/in/packages/viewport/src/index.ts"],"sourcesContent":["import { ILeaferBase, ILeaferConfig } from '@leafer-ui/interface'\n\nimport { MoveEvent, ZoomEvent, DataHelper, LeafHelper } from '@leafer-ui/core'\n\n\nexport function addViewport(leafer: ILeaferBase, mergeConfig?: ILeaferConfig, custom?: boolean): void {\n addViewportConfig(leafer.parentApp ? leafer.parentApp : leafer, mergeConfig)\n if (leafer.isApp || custom) return\n\n leafer.__eventIds.push(\n leafer.on_(MoveEvent.BEFORE_MOVE, (e: MoveEvent) => {\n leafer.zoomLayer.move(leafer.getValidMove(e.moveX, e.moveY, false))\n }),\n leafer.on_(MoveEvent.END, (e: MoveEvent) => {\n LeafHelper.animateMove(leafer.zoomLayer, leafer.getValidMove(e.moveX, e.moveY))\n }),\n leafer.on_(ZoomEvent.BEFORE_ZOOM, (e: ZoomEvent) => {\n const { zoomLayer } = leafer\n const changeScale = leafer.getValidScale(e.scale)\n if (changeScale !== 1) zoomLayer.scaleOfWorld(e, changeScale)\n })\n )\n}\n\nexport function addViewportConfig(leafer: ILeaferBase, mergeConfig?: ILeaferConfig): void {\n const viewportConfig: ILeaferConfig = {\n wheel: { preventDefault: true },\n touch: { preventDefault: true },\n pointer: { preventDefaultMenu: true }\n }\n if (mergeConfig) DataHelper.assign(viewportConfig, mergeConfig)\n DataHelper.assign(leafer.config, viewportConfig, leafer.userConfig)\n}","import { ILeaferBase, ILeaferTypeList, ILeaferTypeFunction } from '@leafer-ui/interface'\n\nimport { Debug } from '@leafer-ui/core'\n\nimport { addViewport } from './type/viewport'\nimport { custom } from './type/custom'\nimport { design } from './type/design'\nimport { document } from './type/document'\n\n\nconst debug = Debug.get('LeaferTypeCreator')\n\nexport const LeaferTypeCreator = {\n\n list: {} as ILeaferTypeList,\n\n register(name: string, fn: ILeaferTypeFunction): void {\n list[name] && debug.repeat(name)\n list[name] = fn\n },\n\n run(name: string, leafer: ILeaferBase): void {\n const fn = list[name]\n fn && fn(leafer)\n }\n\n}\n\nconst { list, register } = LeaferTypeCreator\n\nregister('viewport', addViewport)\nregister('custom', custom)\nregister('design', design)\nregister('document', document)","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function custom(leafer: ILeaferBase): void {\n addViewport(leafer, null, true)\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function design(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: {\n min: 0.01,\n max: 256\n },\n move: {\n holdSpaceKey: true,\n holdMiddleKey: true,\n }\n })\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function document(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: { min: 1 },\n move: { scroll: 'limit' }\n })\n}\n","import { IMultiTouchData, IKeepTouchData } from '@leafer-ui/interface'\n\nimport { PointHelper } from '@leafer-ui/core'\n\n\nexport const MultiTouchHelper = {\n\n getData(list: IKeepTouchData[]): IMultiTouchData {\n const a = list[0], b = list[1]\n const lastCenter = PointHelper.getCenter(a.from, b.from)\n const center = PointHelper.getCenter(a.to, b.to)\n const move = { x: center.x - lastCenter.x, y: center.y - lastCenter.y }\n\n const lastDistance = PointHelper.getDistance(a.from, b.from)\n const distance = PointHelper.getDistance(a.to, b.to)\n const scale = distance / lastDistance\n\n const rotation = PointHelper.getRotation(a.from, b.from, a.to, b.to)\n\n return { move, scale, rotation, center }\n }\n\n}","import { IPointData, IWheelEvent, IWheelConfig } from '@leafer-ui/interface'\n\nimport { MathHelper, Platform } from '@leafer-ui/core'\n\n\nconst { abs, max } = Math, { sign, within } = MathHelper\n\nexport const WheelEventHelper = {\n\n getMove(event: IWheelEvent, config: IWheelConfig): IPointData {\n let { moveSpeed } = config\n let { deltaX, deltaY } = event\n if (event.shiftKey && !deltaX) { // Window\n deltaX = deltaY\n deltaY = 0\n }\n const absX = abs(deltaX), absY = abs(deltaY)\n if (absX > 50) deltaX = max(50, absX / 3) * sign(deltaX)\n if (absY > 50) deltaY = max(50, absY / 3) * sign(deltaY)\n return { x: -deltaX * moveSpeed * 2, y: -deltaY * moveSpeed * 2 }\n },\n\n getScale(event: IWheelEvent, config: IWheelConfig): number {\n\n let zoom: boolean\n let scale = 1\n let { zoomMode, zoomSpeed } = config\n\n const delta = event.deltaY || event.deltaX\n\n if (zoomMode) {\n // mac 触摸板滚动手势的deltaY是整数, 鼠标滚动/触摸板缩放的deltaY有小数点, firfox鼠标滚动为整数,为18或19的倍数\n // windows 始终是整数\n zoom = (zoomMode === 'mouse') ? true : (!event.deltaX && (Platform.intWheelDeltaY ? Math.abs(delta) > 17 : Math.ceil(delta) !== delta))\n if (event.shiftKey || event.metaKey || event.ctrlKey) zoom = true\n } else {\n zoom = !event.shiftKey && (event.metaKey || event.ctrlKey)\n }\n\n if (zoom) {\n zoomSpeed = within(zoomSpeed, 0, 1)\n const min = event.deltaY ? config.delta.y : config.delta.x\n scale = within(1 - delta / (min * 4) * zoomSpeed, 0.5, 1.5) // zoomSpeed\n }\n\n return scale\n }\n\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, ITimer } from '@leafer-ui/interface'\n\nimport { InteractionBase, MoveEvent, ZoomEvent, RotateEvent } from '@leafer-ui/core'\n\n\nexport class Transformer {\n\n public get transforming(): boolean { return !!(this.moveData || this.zoomData || this.rotateData) }\n\n protected interaction: InteractionBase\n protected moveData: IMoveEvent\n protected zoomData: IZoomEvent\n protected rotateData: IRotateEvent\n protected transformTimer: ITimer\n\n constructor(interaction: InteractionBase) {\n this.interaction = interaction\n }\n\n public move(data: IMoveEvent): void {\n const { interaction } = this\n if (!data.moveType) data.moveType = 'move'\n\n if (!this.moveData) {\n this.setPath(data)\n this.moveData = { ...data, moveX: 0, moveY: 0 }\n interaction.emit(MoveEvent.START, this.moveData)\n }\n\n data.path = this.moveData.path\n interaction.emit(MoveEvent.BEFORE_MOVE, data)\n interaction.emit(MoveEvent.MOVE, data)\n\n this.transformEndWait()\n }\n\n public zoom(data: IZoomEvent): void {\n const { interaction } = this\n\n if (!this.zoomData) {\n this.setPath(data)\n this.zoomData = { ...data, scale: 1 }\n interaction.emit(ZoomEvent.START, this.zoomData)\n }\n\n data.path = this.zoomData.path\n interaction.emit(ZoomEvent.BEFORE_ZOOM, data)\n interaction.emit(ZoomEvent.ZOOM, data)\n\n this.transformEndWait()\n }\n\n public rotate(data: IRotateEvent): void {\n const { interaction } = this\n\n if (!this.rotateData) {\n this.setPath(data)\n this.rotateData = { ...data, rotation: 0 }\n interaction.emit(RotateEvent.START, this.rotateData)\n }\n\n data.path = this.rotateData.path\n interaction.emit(RotateEvent.BEFORE_ROTATE, data)\n interaction.emit(RotateEvent.ROTATE, data)\n\n this.transformEndWait()\n }\n\n public setPath(data: any): void {\n const { interaction } = this\n const { path } = interaction.selector.getByPoint(data, interaction.hitRadius)\n data.path = path\n interaction.cancelHover()\n }\n\n protected transformEndWait(): void {\n clearTimeout(this.transformTimer)\n this.transformTimer = setTimeout(() => {\n this.transformEnd()\n }, this.interaction.p.transformTime)\n }\n\n public transformEnd(): void {\n const { interaction, moveData, zoomData, rotateData } = this\n if (moveData) interaction.emit(MoveEvent.END, moveData)\n if (zoomData) interaction.emit(ZoomEvent.END, zoomData)\n if (rotateData) interaction.emit(RotateEvent.END, rotateData)\n this.reset()\n }\n\n public reset(): void {\n this.zoomData = this.moveData = this.rotateData = null\n }\n\n public destroy(): void {\n this.reset()\n }\n}","import { ILeaferType, IPointData } from '@leafer-ui/interface'\n\nimport { Leafer, Bounds, Point, DragBoundsHelper } from '@leafer-ui/core'\n\nimport { LeaferTypeCreator } from './LeaferTypeCreator'\n\n\nconst leafer = Leafer.prototype\nconst bounds = new Bounds(), move = new Point()\n\nleafer.initType = function (type: ILeaferType) {\n LeaferTypeCreator.run(type, this)\n}\n\nleafer.getValidMove = function (moveX: number, moveY: number, checkLimit = true): IPointData {\n const { scroll, disabled } = this.app.config.move\n move.set(moveX, moveY)\n\n if (scroll) {\n const type = scroll === true ? '' : scroll\n\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n else Math.abs(move.x) > Math.abs(move.y) ? move.y = 0 : move.x = 0\n\n if (checkLimit && type.includes('limit')) {\n bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)\n DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'inner', move, true)\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n }\n }\n\n return { x: disabled ? 0 : move.x, y: disabled ? 0 : move.y }\n}\n\nleafer.getValidScale = function (changeScale: number): number {\n const { scaleX } = this.zoomLayer.__, { min, max, disabled } = this.app.config.zoom, absScale = Math.abs(scaleX * changeScale)\n if (min && absScale < min) changeScale = min / scaleX\n else if (max && absScale > max) changeScale = max / scaleX\n return disabled ? 1 : changeScale // fix 不能过滤小数位\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, IWheelEvent, IKeepTouchData, IPointData, IEvent, IPointerEvent } from '@leafer-ui/interface'\n\nimport { InteractionBase, PointHelper } from '@leafer-ui/core'\n\nimport { WheelEventHelper } from './WheelEventHelper'\nimport { Transformer } from './Transformer'\nimport { MultiTouchHelper } from './MultiTouchHelper'\n\n\nfunction getMoveEventData(move: IPointData, event: IEvent): IMoveEvent {\n return { ...event, moveX: move.x, moveY: move.y } as IMoveEvent\n}\n\nfunction getRotateEventData(rotation: number, event: IEvent): IRotateEvent {\n return { ...event, rotation } as IRotateEvent\n}\n\nfunction getZoomEventData(scale: number, event: IEvent): IZoomEvent {\n return { ...event, scale, } as IZoomEvent\n}\n\n\nconst interaction = InteractionBase.prototype\n\ninteraction.createTransformer = function (): void {\n this.transformer = new Transformer(this)\n}\n\ninteraction.move = function (data: IMoveEvent): void {\n this.transformer.move(data)\n}\n\ninteraction.zoom = function (data: IZoomEvent): void {\n this.transformer.zoom(data)\n}\n\ninteraction.rotate = function (data: IRotateEvent): void {\n this.transformer.rotate(data)\n}\n\ninteraction.transformEnd = function (): void {\n this.transformer.transformEnd()\n}\n\n\ninteraction.wheel = function (data: IWheelEvent): void {\n const { wheel, pointer } = this.config, { posDeltaSpeed, negDeltaSpeed } = wheel\n if (wheel.disabled) return\n\n if (data.deltaX > 0) posDeltaSpeed && (data.deltaX *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaX *= negDeltaSpeed)\n\n if (data.deltaY > 0) posDeltaSpeed && (data.deltaY *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaY *= negDeltaSpeed)\n\n const scale = wheel.getScale ? wheel.getScale(data, wheel) : WheelEventHelper.getScale(data, wheel)\n if (scale !== 1) this.zoom(getZoomEventData(scale, data))\n else {\n const move = wheel.getMove ? wheel.getMove(data, wheel) : WheelEventHelper.getMove(data, wheel)\n if (pointer.snap) PointHelper.round(move)\n this.move(getMoveEventData(move, data))\n }\n}\n\n\ninteraction.multiTouch = function (data: IPointerEvent, list: IKeepTouchData[]): void {\n if (this.config.multiTouch.disabled) return\n const { move, rotation, scale, center } = MultiTouchHelper.getData(list)\n\n Object.assign(data, center)\n data.multiTouch = true\n\n this.pointerWaitCancel()\n\n this.rotate(getRotateEventData(rotation, data))\n this.zoom(getZoomEventData(scale, data))\n this.move(getMoveEventData(move, data))\n}","import { IPointerEvent, IFunction } from '@leafer-ui/interface'\n\nimport { Dragger, BoundsHelper, PointHelper, isNumber } from '@leafer-ui/core'\n\n\nconst dragger = Dragger.prototype\nconst { abs } = Math\n\ndragger.checkDragEndAnimate = function (data: IPointerEvent, speed?: number): boolean | number {\n const { moveX, moveY } = this.dragData\n const absMoveX = abs(moveX), absMoveY = abs(moveY), minMove = speed ? 1 : 0.1\n const dragAnimate = this.canAnimate && this.moving && (absMoveX > minMove || absMoveY > minMove) && this.interaction.m.dragAnimate\n\n if (dragAnimate) {\n const inertia = data.pointerType === 'touch' ? 3 : 1, maxMove = 70\n speed = speed ? (isNumber(dragAnimate) ? dragAnimate : 0.95) : inertia\n if (absMoveX * speed > maxMove) speed = maxMove / absMoveX\n else if (absMoveY * speed > maxMove) speed = maxMove / absMoveY\n\n data = { ...data }\n PointHelper.move(data, moveX * speed, moveY * speed)\n\n this.drag(data)\n this.animate(() => { this.dragEnd(data, 1) })\n }\n\n return dragAnimate\n}\n\ndragger.animate = function (func?: IFunction, off?: 'off'): void { // dragEnd animation\n const animateWait = func || this.animateWait\n if (animateWait) this.interaction.target.nextRender(animateWait, null, off)\n this.animateWait = func\n}\n\ndragger.checkDragOut = function (data: IPointerEvent): void {\n const { interaction } = this\n this.autoMoveCancel()\n if (this.dragging && !interaction.shrinkCanvasBounds.hitPoint(data)) this.autoMoveOnDragOut(data)\n}\n\ndragger.autoMoveOnDragOut = function (data: IPointerEvent): void {\n const { interaction, downData, canDragOut } = this\n const { autoDistance, dragOut } = interaction.m\n if (!dragOut || !canDragOut || !autoDistance) return\n\n const bounds = interaction.shrinkCanvasBounds\n const { x, y } = bounds\n const right = BoundsHelper.maxX(bounds)\n const bottom = BoundsHelper.maxY(bounds)\n\n const moveX = data.x < x ? autoDistance : (right < data.x ? -autoDistance : 0)\n const moveY = data.y < y ? autoDistance : (bottom < data.y ? -autoDistance : 0)\n let totalX = 0, totalY = 0\n\n this.autoMoveTimer = setInterval(() => {\n totalX += moveX\n totalY += moveY\n\n PointHelper.move(downData, moveX, moveY)\n PointHelper.move(this.dragData, moveX, moveY)\n\n interaction.move({ ...data, moveX, moveY, totalX, totalY, moveType: 'drag' })\n interaction.pointerMoveReal(data)\n }, 10)\n}\n\ndragger.autoMoveCancel = function (): void {\n if (this.autoMoveTimer) {\n clearInterval(this.autoMoveTimer)\n this.autoMoveTimer = 0\n }\n}","export { LeaferTypeCreator } from './LeaferTypeCreator'\nexport { addViewport, addViewportConfig } from './type/viewport'\nexport { MultiTouchHelper } from './interaction/MultiTouchHelper'\nexport { WheelEventHelper } from './interaction/WheelEventHelper'\nexport { Transformer } from './interaction/Transformer'\n\nimport { Plugin } from '@leafer-ui/core'\n\nimport './Leafer'\nimport './interaction/Interaction'\nimport './interaction/Dragger'\n\nPlugin.add('viewport')"],"names":["addViewport","leafer","mergeConfig","custom","addViewportConfig","parentApp","isApp","__eventIds","push","on_","MoveEvent","BEFORE_MOVE","e","zoomLayer","move","getValidMove","moveX","moveY","END","LeafHelper","animateMove","ZoomEvent","BEFORE_ZOOM","changeScale","getValidScale","scale","scaleOfWorld","viewportConfig","wheel","preventDefault","touch","pointer","preventDefaultMenu","DataHelper","assign","config","userConfig","debug","Debug","get","LeaferTypeCreator","list","register","name","fn","repeat","run","zoom","min","max","holdSpaceKey","holdMiddleKey","scroll","MultiTouchHelper","getData","a","b","lastCenter","PointHelper","getCenter","from","center","to","x","y","lastDistance","getDistance","rotation","getRotation","abs","Math","sign","within","MathHelper","WheelEventHelper","getMove","event","moveSpeed","deltaX","deltaY","shiftKey","absX","absY","getScale","zoomMode","zoomSpeed","delta","Platform","intWheelDeltaY","ceil","metaKey","ctrlKey","Transformer","transforming","this","moveData","zoomData","rotateData","constructor","interaction","data","moveType","setPath","Object","emit","START","path","MOVE","transformEndWait","ZOOM","rotate","RotateEvent","BEFORE_ROTATE","ROTATE","selector","getByPoint","hitRadius","cancelHover","clearTimeout","transformTimer","setTimeout","transformEnd","p","transformTime","reset","destroy","Leafer","prototype","bounds","Bounds","Point","getMoveEventData","getZoomEventData","initType","type","checkLimit","disabled","app","set","includes","__world","addPoint","DragBoundsHelper","canvas","scaleX","__","absScale","InteractionBase","createTransformer","transformer","posDeltaSpeed","negDeltaSpeed","snap","round","multiTouch","pointerWaitCancel","getRotateEventData","dragger","Dragger","checkDragEndAnimate","speed","dragData","absMoveX","absMoveY","minMove","dragAnimate","canAnimate","moving","m","inertia","pointerType","maxMove","isNumber","drag","animate","dragEnd","func","off","animateWait","target","nextRender","checkDragOut","autoMoveCancel","dragging","shrinkCanvasBounds","hitPoint","autoMoveOnDragOut","downData","canDragOut","autoDistance","dragOut","right","BoundsHelper","maxX","bottom","maxY","totalX","totalY","autoMoveTimer","setInterval","pointerMoveReal","clearInterval","Plugin","add"],"mappings":"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"}
1
+ {"version":3,"file":"viewport.min.js","sources":["../../../../../../src/in/packages/viewport/src/type/viewport.ts","../../../../../../src/in/packages/viewport/src/LeaferTypeCreator.ts","../../../../../../src/in/packages/viewport/src/type/custom.ts","../../../../../../src/in/packages/viewport/src/type/design.ts","../../../../../../src/in/packages/viewport/src/type/document.ts","../../../../../../src/in/packages/viewport/src/interaction/MultiTouchHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/WheelEventHelper.ts","../../../../../../src/in/packages/viewport/src/interaction/Transformer.ts","../../../../../../src/in/packages/viewport/src/Leafer.ts","../../../../../../src/in/packages/viewport/src/interaction/Interaction.ts","../../../../../../src/in/packages/viewport/src/interaction/Dragger.ts","../../../../../../src/in/packages/viewport/src/index.ts"],"sourcesContent":["import { ILeaferBase, ILeaferConfig } from '@leafer-ui/interface'\n\nimport { MoveEvent, ZoomEvent, DataHelper, LeafHelper } from '@leafer-ui/core'\n\n\nexport function addViewport(leafer: ILeaferBase, mergeConfig?: ILeaferConfig, custom?: boolean): void {\n addViewportConfig(leafer.parentApp ? leafer.parentApp : leafer, mergeConfig)\n if (leafer.isApp || custom) return\n\n leafer.__eventIds.push(\n leafer.on_(MoveEvent.BEFORE_MOVE, (e: MoveEvent) => {\n leafer.zoomLayer.move(leafer.getValidMove(e.moveX, e.moveY, false))\n }),\n leafer.on_(MoveEvent.END, (e: MoveEvent) => {\n LeafHelper.animateMove(leafer.zoomLayer, leafer.getValidMove(e.moveX, e.moveY))\n }),\n leafer.on_(ZoomEvent.BEFORE_ZOOM, (e: ZoomEvent) => {\n const { zoomLayer } = leafer\n const changeScale = leafer.getValidScale(e.scale)\n if (changeScale !== 1) zoomLayer.scaleOfWorld(e, changeScale)\n })\n )\n}\n\nexport function addViewportConfig(leafer: ILeaferBase, mergeConfig?: ILeaferConfig): void {\n const viewportConfig: ILeaferConfig = {\n wheel: { preventDefault: true },\n touch: { preventDefault: true },\n pointer: { preventDefaultMenu: true }\n }\n if (mergeConfig) DataHelper.assign(viewportConfig, mergeConfig)\n DataHelper.assign(leafer.config, viewportConfig, leafer.userConfig)\n}","import { ILeaferBase, ILeaferTypeList, ILeaferTypeFunction } from '@leafer-ui/interface'\n\nimport { Debug } from '@leafer-ui/core'\n\nimport { addViewport } from './type/viewport'\nimport { custom } from './type/custom'\nimport { design } from './type/design'\nimport { document } from './type/document'\n\n\nconst debug = Debug.get('LeaferTypeCreator')\n\nexport const LeaferTypeCreator = {\n\n list: {} as ILeaferTypeList,\n\n register(name: string, fn: ILeaferTypeFunction): void {\n list[name] && debug.repeat(name)\n list[name] = fn\n },\n\n run(name: string, leafer: ILeaferBase): void {\n const fn = list[name]\n fn && fn(leafer)\n }\n\n}\n\nconst { list, register } = LeaferTypeCreator\n\nregister('viewport', addViewport)\nregister('custom', custom)\nregister('design', design)\nregister('document', document)","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function custom(leafer: ILeaferBase): void {\n addViewport(leafer, null, true)\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function design(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: {\n min: 0.01,\n max: 256\n },\n move: {\n holdSpaceKey: true,\n holdMiddleKey: true,\n }\n })\n}\n","import { ILeaferBase } from '@leafer-ui/interface'\n\nimport { addViewport } from './viewport'\n\n\nexport function document(leafer: ILeaferBase): void {\n addViewport(leafer, {\n zoom: { min: 1 },\n move: { scroll: 'limit' }\n })\n}\n","import { IMultiTouchData, IKeepTouchData } from '@leafer-ui/interface'\n\nimport { PointHelper } from '@leafer-ui/core'\n\n\nexport const MultiTouchHelper = {\n\n getData(list: IKeepTouchData[]): IMultiTouchData {\n const a = list[0], b = list[1]\n const lastCenter = PointHelper.getCenter(a.from, b.from)\n const center = PointHelper.getCenter(a.to, b.to)\n const move = { x: center.x - lastCenter.x, y: center.y - lastCenter.y }\n\n const lastDistance = PointHelper.getDistance(a.from, b.from)\n const distance = PointHelper.getDistance(a.to, b.to)\n const scale = distance / lastDistance\n\n const rotation = PointHelper.getRotation(a.from, b.from, a.to, b.to)\n\n return { move, scale, rotation, center }\n }\n\n}","import { IPointData, IWheelEvent, IWheelConfig } from '@leafer-ui/interface'\n\nimport { MathHelper, Platform } from '@leafer-ui/core'\n\n\nconst { abs, max } = Math, { sign, within } = MathHelper\n\nexport const WheelEventHelper = {\n\n getMove(event: IWheelEvent, config: IWheelConfig): IPointData {\n let { moveSpeed } = config\n let { deltaX, deltaY } = event\n if (event.shiftKey && !deltaX) { // Window\n deltaX = deltaY\n deltaY = 0\n }\n const absX = abs(deltaX), absY = abs(deltaY)\n if (absX > 50) deltaX = max(50, absX / 3) * sign(deltaX)\n if (absY > 50) deltaY = max(50, absY / 3) * sign(deltaY)\n return { x: -deltaX * moveSpeed * 2, y: -deltaY * moveSpeed * 2 }\n },\n\n getScale(event: IWheelEvent, config: IWheelConfig): number {\n\n let zoom: boolean\n let scale = 1\n let { zoomMode, zoomSpeed } = config\n\n const delta = event.deltaY || event.deltaX\n\n if (zoomMode) {\n // mac 触摸板滚动手势的deltaY是整数, 鼠标滚动/触摸板缩放的deltaY有小数点, firfox鼠标滚动为整数,为18或19的倍数\n // windows 始终是整数\n zoom = (zoomMode === 'mouse') ? true : (!event.deltaX && (Platform.intWheelDeltaY ? Math.abs(delta) > 17 : Math.ceil(delta) !== delta))\n if (event.shiftKey || event.metaKey || event.ctrlKey) zoom = true\n } else {\n zoom = !event.shiftKey && (event.metaKey || event.ctrlKey)\n }\n\n if (zoom) {\n zoomSpeed = within(zoomSpeed, 0, 1)\n const min = event.deltaY ? config.delta.y : config.delta.x\n const absScale = within(1 - abs(delta) / (min * 4) * zoomSpeed, 0.5, 2)\n scale = delta > 0 ? absScale : 1 / absScale // 让 scale 放大、缩小可以定位在有规律的刻度上\n }\n\n return scale\n }\n\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, ITimer } from '@leafer-ui/interface'\n\nimport { InteractionBase, MoveEvent, ZoomEvent, RotateEvent } from '@leafer-ui/core'\n\n\nexport class Transformer {\n\n public get transforming(): boolean { return !!(this.moveData || this.zoomData || this.rotateData) }\n\n protected interaction: InteractionBase\n protected moveData: IMoveEvent\n protected zoomData: IZoomEvent\n protected rotateData: IRotateEvent\n protected transformTimer: ITimer\n\n constructor(interaction: InteractionBase) {\n this.interaction = interaction\n }\n\n public move(data: IMoveEvent): void {\n const { interaction } = this\n if (!data.moveType) data.moveType = 'move'\n\n if (!this.moveData) {\n this.setPath(data)\n this.moveData = { ...data, moveX: 0, moveY: 0 }\n interaction.emit(MoveEvent.START, this.moveData)\n }\n\n data.path = this.moveData.path\n interaction.emit(MoveEvent.BEFORE_MOVE, data)\n interaction.emit(MoveEvent.MOVE, data)\n\n this.transformEndWait()\n }\n\n public zoom(data: IZoomEvent): void {\n const { interaction } = this\n\n if (!this.zoomData) {\n this.setPath(data)\n this.zoomData = { ...data, scale: 1 }\n interaction.emit(ZoomEvent.START, this.zoomData)\n }\n\n data.path = this.zoomData.path\n interaction.emit(ZoomEvent.BEFORE_ZOOM, data)\n interaction.emit(ZoomEvent.ZOOM, data)\n\n this.transformEndWait()\n }\n\n public rotate(data: IRotateEvent): void {\n const { interaction } = this\n\n if (!this.rotateData) {\n this.setPath(data)\n this.rotateData = { ...data, rotation: 0 }\n interaction.emit(RotateEvent.START, this.rotateData)\n }\n\n data.path = this.rotateData.path\n interaction.emit(RotateEvent.BEFORE_ROTATE, data)\n interaction.emit(RotateEvent.ROTATE, data)\n\n this.transformEndWait()\n }\n\n public setPath(data: any): void {\n const { interaction } = this\n const { path } = interaction.selector.getByPoint(data, interaction.hitRadius)\n data.path = path\n interaction.cancelHover()\n }\n\n protected transformEndWait(): void {\n clearTimeout(this.transformTimer)\n this.transformTimer = setTimeout(() => {\n this.transformEnd()\n }, this.interaction.p.transformTime)\n }\n\n public transformEnd(): void {\n const { interaction, moveData, zoomData, rotateData } = this\n if (moveData) interaction.emit(MoveEvent.END, moveData)\n if (zoomData) interaction.emit(ZoomEvent.END, zoomData)\n if (rotateData) interaction.emit(RotateEvent.END, rotateData)\n this.reset()\n }\n\n public reset(): void {\n this.zoomData = this.moveData = this.rotateData = null\n }\n\n public destroy(): void {\n this.reset()\n }\n}","import { ILeaferType, IPointData } from '@leafer-ui/interface'\n\nimport { Leafer, Bounds, Point, DragBoundsHelper } from '@leafer-ui/core'\n\nimport { LeaferTypeCreator } from './LeaferTypeCreator'\n\n\nconst leafer = Leafer.prototype\nconst bounds = new Bounds(), move = new Point()\n\nleafer.initType = function (type: ILeaferType) {\n LeaferTypeCreator.run(type, this)\n}\n\nleafer.getValidMove = function (moveX: number, moveY: number, checkLimit = true): IPointData {\n const { scroll, disabled } = this.app.config.move\n move.set(moveX, moveY)\n\n if (scroll) {\n const type = scroll === true ? '' : scroll\n\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n else Math.abs(move.x) > Math.abs(move.y) ? move.y = 0 : move.x = 0\n\n if (checkLimit && type.includes('limit')) {\n bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)\n DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'inner', move, true)\n if (type.includes('x')) move.y = 0\n else if (type.includes('y')) move.x = 0\n }\n }\n\n return { x: disabled ? 0 : move.x, y: disabled ? 0 : move.y }\n}\n\nleafer.getValidScale = function (changeScale: number): number {\n const { scaleX } = this.zoomLayer.__, { min, max, disabled } = this.app.config.zoom, absScale = Math.abs(scaleX * changeScale)\n if (min && absScale < min) changeScale = min / scaleX\n else if (max && absScale > max) changeScale = max / scaleX\n return disabled ? 1 : changeScale // fix 不能过滤小数位\n}","import { IMoveEvent, IZoomEvent, IRotateEvent, IWheelEvent, IKeepTouchData, IPointData, IEvent, IPointerEvent } from '@leafer-ui/interface'\n\nimport { InteractionBase, PointHelper } from '@leafer-ui/core'\n\nimport { WheelEventHelper } from './WheelEventHelper'\nimport { Transformer } from './Transformer'\nimport { MultiTouchHelper } from './MultiTouchHelper'\n\n\nfunction getMoveEventData(move: IPointData, event: IEvent): IMoveEvent {\n return { ...event, moveX: move.x, moveY: move.y } as IMoveEvent\n}\n\nfunction getRotateEventData(rotation: number, event: IEvent): IRotateEvent {\n return { ...event, rotation } as IRotateEvent\n}\n\nfunction getZoomEventData(scale: number, event: IEvent): IZoomEvent {\n return { ...event, scale, } as IZoomEvent\n}\n\n\nconst interaction = InteractionBase.prototype\n\ninteraction.createTransformer = function (): void {\n this.transformer = new Transformer(this)\n}\n\ninteraction.move = function (data: IMoveEvent): void {\n this.transformer.move(data)\n}\n\ninteraction.zoom = function (data: IZoomEvent): void {\n this.transformer.zoom(data)\n}\n\ninteraction.rotate = function (data: IRotateEvent): void {\n this.transformer.rotate(data)\n}\n\ninteraction.transformEnd = function (): void {\n this.transformer.transformEnd()\n}\n\n\ninteraction.wheel = function (data: IWheelEvent): void {\n const { wheel, pointer } = this.config, { posDeltaSpeed, negDeltaSpeed } = wheel\n if (wheel.disabled) return\n\n if (data.deltaX > 0) posDeltaSpeed && (data.deltaX *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaX *= negDeltaSpeed)\n\n if (data.deltaY > 0) posDeltaSpeed && (data.deltaY *= posDeltaSpeed)\n else negDeltaSpeed && (data.deltaY *= negDeltaSpeed)\n\n const scale = wheel.getScale ? wheel.getScale(data, wheel) : WheelEventHelper.getScale(data, wheel)\n if (scale !== 1) this.zoom(getZoomEventData(scale, data))\n else {\n const move = wheel.getMove ? wheel.getMove(data, wheel) : WheelEventHelper.getMove(data, wheel)\n if (pointer.snap) PointHelper.round(move)\n this.move(getMoveEventData(move, data))\n }\n}\n\n\ninteraction.multiTouch = function (data: IPointerEvent, list: IKeepTouchData[]): void {\n if (this.config.multiTouch.disabled) return\n const { move, rotation, scale, center } = MultiTouchHelper.getData(list)\n\n Object.assign(data, center)\n data.multiTouch = true\n\n this.pointerWaitCancel()\n\n this.rotate(getRotateEventData(rotation, data))\n this.zoom(getZoomEventData(scale, data))\n this.move(getMoveEventData(move, data))\n}","import { IPointerEvent, IFunction } from '@leafer-ui/interface'\n\nimport { Dragger, BoundsHelper, PointHelper, isNumber } from '@leafer-ui/core'\n\n\nconst dragger = Dragger.prototype\nconst { abs } = Math\n\ndragger.checkDragEndAnimate = function (data: IPointerEvent, speed?: number): boolean | number {\n const { moveX, moveY } = this.dragData\n const absMoveX = abs(moveX), absMoveY = abs(moveY), minMove = speed ? 1 : 0.1\n const dragAnimate = this.canAnimate && this.moving && (absMoveX > minMove || absMoveY > minMove) && this.interaction.m.dragAnimate\n\n if (dragAnimate) {\n const inertia = data.pointerType === 'touch' ? 3 : 1, maxMove = 70\n speed = speed ? (isNumber(dragAnimate) ? dragAnimate : 0.95) : inertia\n if (absMoveX * speed > maxMove) speed = maxMove / absMoveX\n else if (absMoveY * speed > maxMove) speed = maxMove / absMoveY\n\n data = { ...data }\n PointHelper.move(data, moveX * speed, moveY * speed)\n\n this.drag(data)\n this.animate(() => { this.dragEnd(data, 1) })\n }\n\n return dragAnimate\n}\n\ndragger.animate = function (func?: IFunction, off?: 'off'): void { // dragEnd animation\n const animateWait = func || this.animateWait\n if (animateWait) this.interaction.target.nextRender(animateWait, null, off)\n this.animateWait = func\n}\n\ndragger.checkDragOut = function (data: IPointerEvent): void {\n const { interaction } = this\n this.autoMoveCancel()\n if (this.dragging && !interaction.shrinkCanvasBounds.hitPoint(data)) this.autoMoveOnDragOut(data)\n}\n\ndragger.autoMoveOnDragOut = function (data: IPointerEvent): void {\n const { interaction, downData, canDragOut } = this\n const { autoDistance, dragOut } = interaction.m\n if (!dragOut || !canDragOut || !autoDistance) return\n\n const bounds = interaction.shrinkCanvasBounds\n const { x, y } = bounds\n const right = BoundsHelper.maxX(bounds)\n const bottom = BoundsHelper.maxY(bounds)\n\n const moveX = data.x < x ? autoDistance : (right < data.x ? -autoDistance : 0)\n const moveY = data.y < y ? autoDistance : (bottom < data.y ? -autoDistance : 0)\n let totalX = 0, totalY = 0\n\n this.autoMoveTimer = setInterval(() => {\n totalX += moveX\n totalY += moveY\n\n PointHelper.move(downData, moveX, moveY)\n PointHelper.move(this.dragData, moveX, moveY)\n\n interaction.move({ ...data, moveX, moveY, totalX, totalY, moveType: 'drag' })\n interaction.pointerMoveReal(data)\n }, 10)\n}\n\ndragger.autoMoveCancel = function (): void {\n if (this.autoMoveTimer) {\n clearInterval(this.autoMoveTimer)\n this.autoMoveTimer = 0\n }\n}","export { LeaferTypeCreator } from './LeaferTypeCreator'\nexport { addViewport, addViewportConfig } from './type/viewport'\nexport { MultiTouchHelper } from './interaction/MultiTouchHelper'\nexport { WheelEventHelper } from './interaction/WheelEventHelper'\nexport { Transformer } from './interaction/Transformer'\n\nimport { Plugin } from '@leafer-ui/core'\n\nimport './Leafer'\nimport './interaction/Interaction'\nimport './interaction/Dragger'\n\nPlugin.add('viewport')"],"names":["addViewport","leafer","mergeConfig","custom","addViewportConfig","parentApp","isApp","__eventIds","push","on_","MoveEvent","BEFORE_MOVE","e","zoomLayer","move","getValidMove","moveX","moveY","END","LeafHelper","animateMove","ZoomEvent","BEFORE_ZOOM","changeScale","getValidScale","scale","scaleOfWorld","viewportConfig","wheel","preventDefault","touch","pointer","preventDefaultMenu","DataHelper","assign","config","userConfig","debug","Debug","get","LeaferTypeCreator","list","register","name","fn","repeat","run","zoom","min","max","holdSpaceKey","holdMiddleKey","scroll","MultiTouchHelper","getData","a","b","lastCenter","PointHelper","getCenter","from","center","to","x","y","lastDistance","getDistance","rotation","getRotation","abs","Math","sign","within","MathHelper","WheelEventHelper","getMove","event","moveSpeed","deltaX","deltaY","shiftKey","absX","absY","getScale","zoomMode","zoomSpeed","delta","Platform","intWheelDeltaY","ceil","metaKey","ctrlKey","absScale","Transformer","transforming","this","moveData","zoomData","rotateData","constructor","interaction","data","moveType","setPath","Object","emit","START","path","MOVE","transformEndWait","ZOOM","rotate","RotateEvent","BEFORE_ROTATE","ROTATE","selector","getByPoint","hitRadius","cancelHover","clearTimeout","transformTimer","setTimeout","transformEnd","p","transformTime","reset","destroy","Leafer","prototype","bounds","Bounds","Point","getMoveEventData","getZoomEventData","initType","type","checkLimit","disabled","app","set","includes","__world","addPoint","DragBoundsHelper","canvas","scaleX","__","InteractionBase","createTransformer","transformer","posDeltaSpeed","negDeltaSpeed","snap","round","multiTouch","pointerWaitCancel","getRotateEventData","dragger","Dragger","checkDragEndAnimate","speed","dragData","absMoveX","absMoveY","minMove","dragAnimate","canAnimate","moving","m","inertia","pointerType","maxMove","isNumber","drag","animate","dragEnd","func","off","animateWait","target","nextRender","checkDragOut","autoMoveCancel","dragging","shrinkCanvasBounds","hitPoint","autoMoveOnDragOut","downData","canDragOut","autoDistance","dragOut","right","BoundsHelper","maxX","bottom","maxY","totalX","totalY","autoMoveTimer","setInterval","pointerMoveReal","clearInterval","Plugin","add"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leafer-in/viewport",
3
- "version": "1.9.4",
3
+ "version": "1.9.5",
4
4
  "description": "@leafer-in/viewport",
5
5
  "author": "Chao (Leafer) Wan",
6
6
  "license": "MIT",
@@ -34,8 +34,8 @@
34
34
  "leaferjs"
35
35
  ],
36
36
  "peerDependencies": {
37
- "@leafer-ui/core": "^1.9.4",
38
- "@leafer-ui/interface": "^1.9.4",
39
- "@leafer-in/interface": "^1.9.4"
37
+ "@leafer-ui/core": "^1.9.5",
38
+ "@leafer-ui/interface": "^1.9.5",
39
+ "@leafer-in/interface": "^1.9.5"
40
40
  }
41
41
  }
@@ -40,7 +40,8 @@ export const WheelEventHelper = {
40
40
  if (zoom) {
41
41
  zoomSpeed = within(zoomSpeed, 0, 1)
42
42
  const min = event.deltaY ? config.delta.y : config.delta.x
43
- scale = within(1 - delta / (min * 4) * zoomSpeed, 0.5, 1.5) // zoomSpeed
43
+ const absScale = within(1 - abs(delta) / (min * 4) * zoomSpeed, 0.5, 2)
44
+ scale = delta > 0 ? absScale : 1 / absScale // 让 scale 放大、缩小可以定位在有规律的刻度上
44
45
  }
45
46
 
46
47
  return scale