{"version":3,"file":"viewport.min.cjs","sources":["../../../../../../src/in/packages/viewport/src/helper.ts","../../../../../../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 } from '@leafer-ui/interface'\n\n\nexport function getScrollType(leafer: ILeaferBase): string {\n    const { scroll, disabled } = leafer.app.config.move\n    return (!scroll || disabled) ? '' : (scroll === true ? 'free' : scroll)\n}","import { ILeaferBase, ILeaferConfig } from '@leafer-ui/interface'\n\nimport { MoveEvent, ZoomEvent, DataHelper, LeafHelper } from '@leafer-ui/core'\n\nimport { getScrollType } from '../helper'\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            const limit = getScrollType(leafer).includes('limit'), stopLimit = leafer.app.config.move.scrollLimit === 'stop'\n            const move = leafer.getValidMove(e.moveX, e.moveY, limit && stopLimit)\n\n            // check limit\n            if (limit && !stopLimit) {\n                const testMove = leafer.getValidMove(0, 0)\n                if (testMove.x || testMove.y) {\n                    const maxX = 100, maxY = 200, resistance = e.moveType === 'drag' ? 0.3 : 0.05\n\n                    if (Math.abs(testMove.x) > maxX) move.x = 0\n                    else move.x *= resistance\n\n                    if (Math.abs(testMove.y) > maxY) move.y = 0\n                    else move.y *= resistance\n                }\n            }\n\n            leafer.zoomLayer.move(move)\n        }),\n        leafer.on_(MoveEvent.DRAG_ANIMATE, () => {\n            const testMove = leafer.getValidMove(0, 0)\n            if (testMove.x || testMove.y) leafer.interaction.stopDragAnimate()\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, layouter } = leafer\n            const changeScale = leafer.getValidScale(e.scale)\n            if (changeScale !== 1) {\n                layouter.stop()\n                LeafHelper.updateMatrix(leafer) // 节省一次重复布局\n                zoomLayer.scaleOfWorld(e, changeScale)\n                layouter.start()\n            }\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, IGestureType, IPointData, ISingleGestureConfig } from '@leafer-ui/interface'\n\nimport { PointHelper } from '@leafer-ui/core'\n\n\nexport const MultiTouchHelper = {\n\n    state: { // 单一手势识别状态\n        type: 'none' as IGestureType,\n        typeCount: 0,\n        startTime: 0,\n        totalData: null as IMultiTouchData,\n        center: {} as IPointData\n    },\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        return { move, scale, rotation, center }\n    },\n\n    getType(data: IMultiTouchData, config: ISingleGestureConfig): IGestureType {\n        const moveScore = Math.hypot(data.move.x, data.move.y) / (config.move || 5)\n        const scaleScore = Math.abs(data.scale - 1) / (config.scale || 0.03)\n        const rotateScore = Math.abs(data.rotation) / (config.rotation || 2)\n\n        if (moveScore < 1 && scaleScore < 1 && rotateScore < 1) return 'none'\n        if (moveScore >= scaleScore && moveScore >= rotateScore) return 'move'\n        if (scaleScore >= rotateScore) return 'zoom'\n        return 'rotate'\n    },\n\n    // 识别单一手势\n    detect(data: IMultiTouchData, config: ISingleGestureConfig): IGestureType {\n        const { state } = M\n        const type = M.getType(data, config)\n\n        if (!state.totalData) {\n            state.startTime = Date.now()\n            state.center = data.center\n        }\n\n        M.add(data, state.totalData)\n        state.totalData = data\n\n        if (type === state.type) { // 连续多帧一样的类型才进行锁定\n            state.typeCount++\n            if (state.typeCount >= (config.count || 3) && type !== 'none') return type\n        } else {\n            state.type = type\n            state.typeCount = 1\n        }\n\n        if ((Date.now() - state.startTime) >= (config.time || 160)) return M.getType(state.totalData, config) // 限制最长识别时间\n\n        return 'none'\n    },\n\n    add(data: IMultiTouchData, add: IMultiTouchData): void {\n        if (!add) return\n        PointHelper.move(data.move, add.move)\n        data.scale *= add.scale\n        data.rotation += add.rotation\n        data.center = add.center\n    },\n\n    reset() {\n        const { state } = M\n        state.type = 'none'\n        state.typeCount = 0\n        state.startTime = 0\n        state.totalData = null\n    }\n\n}\n\nconst M = MultiTouchHelper","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\nlet totalX: number, totalY: number, totalScale: number, totalRotation: number\n\nexport class Transformer {\n\n    public get transforming(): boolean { return this.moving || this.zooming || this.rotating }\n    public get moving(): boolean { return !!this.moveData }\n    public get zooming(): boolean { return !!this.zoomData }\n    public get rotating(): boolean { return !!this.rotateData }\n\n    public moveData: IMoveEvent\n    public zoomData: IZoomEvent\n    public rotateData: IRotateEvent\n\n    protected interaction: InteractionBase\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            totalX = 0, totalY = 0\n            this.moveData = { ...data, moveX: 0, moveY: 0, totalX, totalY }\n            interaction.emit(MoveEvent.START, this.moveData)\n        }\n\n        data.path = this.moveData.path\n        data.totalX = totalX = totalX + data.moveX\n        data.totalY = totalY = totalY + data.moveY\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            totalScale = 1\n            this.zoomData = { ...data, scale: 1, totalScale }\n            interaction.emit(ZoomEvent.START, this.zoomData)\n        }\n\n        data.path = this.zoomData.path\n        data.totalScale = totalScale = totalScale * data.scale\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            totalRotation = 0\n            this.rotateData = { ...data, rotation: 0, totalRotation }\n            interaction.emit(RotateEvent.START, this.rotateData)\n        }\n\n        data.path = this.rotateData.path\n        data.totalRotation = totalRotation = totalRotation + data.rotation\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, totalX, totalY } as IMoveEvent)\n        if (zoomData) interaction.emit(ZoomEvent.END, { ...zoomData, totalScale } as IZoomEvent)\n        if (rotateData) interaction.emit(RotateEvent.END, { ...rotateData, totalRotation } as IRotateEvent)\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'\nimport { getScrollType } from './helper'\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 { disabled, scrollSpread } = this.app.config.move\n    move.set(moveX, moveY)\n\n    const scrollType = getScrollType(this)\n    if (scrollType) {\n\n        if (scrollType.includes('x')) move.y = 0\n        else if (scrollType.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 && scrollType.includes('limit')) {\n            bounds.set(this.__world).addPoint(this.zoomLayer as IPointData)\n            if (scrollSpread) bounds.spread(scrollSpread)\n            DragBoundsHelper.getValidMove(bounds, this.canvas.bounds, 'auto', move, true)\n            if (scrollType.includes('x')) move.y = 0\n            else if (scrollType.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, ISingleGestureConfig } from '@leafer-ui/interface'\n\nimport { InteractionBase, PointHelper, isObject } 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    const { disabled, singleGesture } = this.config.multiTouch\n    if (disabled) return\n    this.pointerWaitCancel()\n\n    let gestureData = MultiTouchHelper.getData(list)\n    let { moving, zooming, rotating } = this.transformer\n\n    if (singleGesture) {\n\n        if (!this.transformer.transforming) {\n\n            const type = MultiTouchHelper.detect(gestureData, isObject(singleGesture) ? singleGesture : {} as ISingleGestureConfig)\n\n            switch (type) {\n                case 'move': moving = true; break\n                case 'zoom': zooming = true; break\n                case 'rotate': rotating = true; break\n                default: return\n            }\n\n            MultiTouchHelper.reset()\n\n        }\n\n        if (!moving) gestureData.center = MultiTouchHelper.state.center\n\n    } else moving = zooming = rotating = true\n\n    Object.assign(data, gestureData.center)\n    data.multiTouch = true\n\n    if (rotating) this.rotate(getRotateEventData(gestureData.rotation, data))\n    if (zooming) this.zoom(getZoomEventData(gestureData.scale, data))\n    if (moving) this.move(getMoveEventData(gestureData.move, data))\n}","import { IPointerEvent, IFunction, IDragEvent } from '@leafer-ui/interface'\n\nimport { Dragger, BoundsHelper, PointHelper, MoveEvent, isNumber } from '@leafer-ui/core'\n\n\nconst dragger = Dragger.prototype\nconst { abs, min, max, hypot } = Math\n\ndragger.checkDragEndAnimate = function (data: IPointerEvent): boolean | number {\n    const { interaction } = this\n    const dragAnimate = this.canAnimate && this.moving && interaction.m.dragAnimate\n\n    if (dragAnimate) {\n\n        const inertia = isNumber(dragAnimate) ? dragAnimate : 0.95\n        const stopMove = 0.15\n        const maxMove = 150\n\n        let moveX = 0, moveY = 0, flickSpeed = 0 // 快速滑动加速\n        let totalWeight = 0, weight: number, w = 3, s: number, frame: IDragEvent\n\n        const { dragDataList } = this, len = dragDataList.length\n        for (let i = len - 1; i >= max(len - 3, 0); i--) {\n            frame = dragDataList[i]\n            if (frame.time && (Date.now() - frame.time > 100)) break\n            weight = w--\n\n            moveX += frame.moveX * weight\n            moveY += frame.moveY * weight\n            totalWeight += weight\n\n            s = hypot(frame.moveX, frame.moveY)\n            if (s > flickSpeed) flickSpeed = s\n        }\n\n        if (totalWeight) moveX /= totalWeight, moveY /= totalWeight\n\n        if (flickSpeed > 8) {\n            const t = min((flickSpeed - 8) / 17, 1)\n            const boost = 1.15 + t * (1.6 - 1.15)\n            moveX *= boost\n            moveY *= boost\n        }\n\n        const maxAbs = max(abs(moveX), abs(moveY))\n        if (maxAbs > maxMove) {\n            s = maxMove / maxAbs\n            moveX *= s\n            moveY *= s\n        }\n\n        const step = () => {\n            moveX *= inertia\n            moveY *= inertia\n\n            data = { ...data }\n            if (abs(moveX) < stopMove && abs(moveY) < stopMove) return this.dragEndReal(data)\n\n            PointHelper.move(data, moveX, moveY)\n            this.drag(data)\n\n            this.animate(step)\n            interaction.emit(MoveEvent.DRAG_ANIMATE, data)\n        }\n\n        this.animate(step)\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.stopAnimate = function (): void {\n    this.animate(null, 'off')\n    this.interaction.target.nextRender(() => {\n        if (this.dragData) this.dragEndReal(this.dragData)\n    })\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":["getScrollType","leafer","scroll","disabled","app","config","move","addViewport","mergeConfig","custom","addViewportConfig","parentApp","isApp","__eventIds","push","on_","MoveEvent","BEFORE_MOVE","e","limit","includes","stopLimit","scrollLimit","getValidMove","moveX","moveY","testMove","x","y","maxX","maxY","resistance","moveType","Math","abs","zoomLayer","DRAG_ANIMATE","interaction","stopDragAnimate","END","LeafHelper","animateMove","ZoomEvent","BEFORE_ZOOM","layouter","changeScale","getValidScale","scale","stop","updateMatrix","scaleOfWorld","start","viewportConfig","wheel","preventDefault","touch","pointer","preventDefaultMenu","DataHelper","assign","userConfig","debug","Debug","get","LeaferTypeCreator","list","register","name","fn","repeat","run","zoom","min","max","holdSpaceKey","holdMiddleKey","MultiTouchHelper","state","type","typeCount","startTime","totalData","center","getData","a","b","lastCenter","PointHelper","getCenter","from","to","lastDistance","getDistance","rotation","getRotation","getType","data","moveScore","hypot","scaleScore","rotateScore","detect","M","Date","now","add","count","time","reset","sign","within","MathHelper","WheelEventHelper","getMove","event","moveSpeed","deltaX","deltaY","shiftKey","absX","absY","getScale","zoomMode","zoomSpeed","delta","Platform","intWheelDeltaY","ceil","metaKey","ctrlKey","absScale","totalX","totalY","totalScale","totalRotation","Transformer","transforming","this","moving","zooming","rotating","moveData","zoomData","rotateData","constructor","setPath","Object","emit","START","path","MOVE","transformEndWait","ZOOM","rotate","RotateEvent","BEFORE_ROTATE","ROTATE","selector","getByPoint","hitRadius","cancelHover","clearTimeout","transformTimer","setTimeout","transformEnd","p","transformTime","destroy","Leafer","prototype","bounds","Bounds","Point","getMoveEventData","getZoomEventData","initType","checkLimit","scrollSpread","set","scrollType","__world","addPoint","spread","DragBoundsHelper","canvas","scaleX","__","InteractionBase","createTransformer","transformer","posDeltaSpeed","negDeltaSpeed","snap","round","multiTouch","singleGesture","pointerWaitCancel","gestureData","isObject","dragger","Dragger","checkDragEndAnimate","dragAnimate","canAnimate","m","inertia","isNumber","stopMove","maxMove","weight","s","frame","flickSpeed","totalWeight","w","dragDataList","len","length","i","boost","maxAbs","step","dragEndReal","drag","animate","func","off","animateWait","target","nextRender","stopAnimate","dragData","checkDragOut","autoMoveCancel","dragging","shrinkCanvasBounds","hitPoint","autoMoveOnDragOut","downData","canDragOut","autoDistance","dragOut","right","BoundsHelper","bottom","autoMoveTimer","setInterval","pointerMoveReal","clearInterval","Plugin"],"mappings":"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"}