{"version":3,"file":"Canvas.mjs","sources":["../../../src/canvas/Canvas.ts"],"sourcesContent":["import { classRegistry } from '../ClassRegistry';\nimport { NONE } from '../constants';\nimport type {\n  CanvasEvents,\n  DragEventData,\n  ObjectEvents,\n  TEventsExtraData,\n  TPointerEvent,\n  TPointerEventNames,\n  Transform,\n} from '../EventTypeDefs';\nimport { Point } from '../Point';\nimport type { ActiveSelection } from '../shapes/ActiveSelection';\nimport type { Group } from '../shapes/Group';\nimport type { IText } from '../shapes/IText/IText';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { type TToCanvasElementOptions } from '../typedefs';\nimport { isTouchEvent, stopEvent } from '../util/dom_event';\nimport { getDocumentFromElement, getWindowFromElement } from '../util/dom_misc';\nimport { sendPointToPlane } from '../util/misc/planeChange';\nimport { isActiveSelection } from '../util/typeAssertions';\nimport type { CanvasOptions, TCanvasOptions } from './CanvasOptions';\nimport { SelectableCanvas } from './SelectableCanvas';\nimport { TextEditingManager } from './TextEditingManager';\n\nconst addEventOptions = { passive: false } as EventListenerOptions;\n\nconst getEventPoints = (canvas: Canvas, e: TPointerEvent) => {\n  const viewportPoint = canvas.getViewportPoint(e);\n  const scenePoint = canvas.getScenePoint(e);\n  return {\n    viewportPoint,\n    scenePoint,\n  };\n};\n\n// just to be clear, the utils are now deprecated and those are here exactly as minifier helpers\n// because el.addEventListener can't me be minified while a const yes and we use it 47 times in this file.\n// few bytes but why give it away.\nconst addListener = (\n  el: HTMLElement | Document,\n  ...args: Parameters<HTMLElement['addEventListener']>\n) => el.addEventListener(...args);\nconst removeListener = (\n  el: HTMLElement | Document,\n  ...args: Parameters<HTMLElement['removeEventListener']>\n) => el.removeEventListener(...args);\n\nconst syntheticEventConfig = {\n  mouse: {\n    in: 'over',\n    out: 'out',\n    targetIn: 'mouseover',\n    targetOut: 'mouseout',\n    canvasIn: 'mouse:over',\n    canvasOut: 'mouse:out',\n  },\n  drag: {\n    in: 'enter',\n    out: 'leave',\n    targetIn: 'dragenter',\n    targetOut: 'dragleave',\n    canvasIn: 'drag:enter',\n    canvasOut: 'drag:leave',\n  },\n} as const;\n\ntype TSyntheticEventContext = {\n  mouse: { e: TPointerEvent };\n  drag: DragEventData;\n};\n\nexport class Canvas extends SelectableCanvas implements CanvasOptions {\n  /**\n   * Contains the id of the touch event that owns the fabric transform\n   * @type Number\n   * @private\n   */\n  declare mainTouchId?: number;\n\n  declare enablePointerEvents: boolean;\n\n  /**\n   * Holds a reference to a setTimeout timer for event synchronization\n   * @type number\n   * @private\n   */\n  declare private _willAddMouseDown: number;\n\n  /**\n   * Holds a reference to an object on the canvas that is receiving the drag over event.\n   * @type FabricObject\n   * @private\n   */\n  declare private _draggedoverTarget?: FabricObject;\n\n  /**\n   * Holds a reference to an object on the canvas from where the drag operation started\n   * @type FabricObject\n   * @private\n   */\n  declare private _dragSource?: FabricObject;\n\n  /**\n   * Holds a reference to an object on the canvas that is the current drop target\n   * May differ from {@link _draggedoverTarget}\n   * @todo inspect whether {@link _draggedoverTarget} and {@link _dropTarget} should be merged somehow\n   * @type FabricObject\n   * @private\n   */\n  declare private _dropTarget: FabricObject<ObjectEvents> | undefined;\n\n  /**\n   * a boolean that keeps track of the click state during a cycle of mouse down/up.\n   * If a mouse move occurs it becomes false.\n   * Is true by default, turns false on mouse move.\n   * Used to determine if a mouseUp is a click\n   */\n  private _isClick: boolean;\n\n  textEditingManager = new TextEditingManager(this);\n\n  constructor(el?: string | HTMLCanvasElement, options: TCanvasOptions = {}) {\n    super(el, options);\n    // bind event handlers\n    (\n      [\n        '_onMouseDown',\n        '_onTouchStart',\n        '_onMouseMove',\n        '_onMouseUp',\n        '_onTouchEnd',\n        '_onResize',\n        // '_onGesture',\n        // '_onDrag',\n        // '_onShake',\n        // '_onLongPress',\n        // '_onOrientationChange',\n        '_onMouseWheel',\n        '_onMouseOut',\n        '_onMouseEnter',\n        '_onContextMenu',\n        '_onClick',\n        '_onDragStart',\n        '_onDragEnd',\n        '_onDragProgress',\n        '_onDragOver',\n        '_onDragEnter',\n        '_onDragLeave',\n        '_onDrop',\n      ] as (keyof this)[]\n    ).forEach((eventHandler) => {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n      this[eventHandler] = (this[eventHandler] as Function).bind(this);\n    });\n    // register event handlers\n    this.addOrRemove(addListener);\n  }\n\n  /**\n   * return an event prefix pointer or mouse.\n   * @private\n   */\n  private _getEventPrefix() {\n    return this.enablePointerEvents ? 'pointer' : 'mouse';\n  }\n\n  addOrRemove(functor: any, forTouch = false) {\n    const canvasElement = this.upperCanvasEl,\n      eventTypePrefix = this._getEventPrefix();\n    functor(getWindowFromElement(canvasElement), 'resize', this._onResize);\n    functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n    functor(\n      canvasElement,\n      `${eventTypePrefix}move`,\n      this._onMouseMove,\n      addEventOptions,\n    );\n    functor(canvasElement, `${eventTypePrefix}out`, this._onMouseOut);\n    functor(canvasElement, `${eventTypePrefix}enter`, this._onMouseEnter);\n    functor(canvasElement, 'wheel', this._onMouseWheel, { passive: false });\n    functor(canvasElement, 'contextmenu', this._onContextMenu);\n    if (!forTouch) {\n      functor(canvasElement, 'click', this._onClick);\n      functor(canvasElement, 'dblclick', this._onClick);\n    }\n    functor(canvasElement, 'dragstart', this._onDragStart);\n    functor(canvasElement, 'dragend', this._onDragEnd);\n    functor(canvasElement, 'dragover', this._onDragOver);\n    functor(canvasElement, 'dragenter', this._onDragEnter);\n    functor(canvasElement, 'dragleave', this._onDragLeave);\n    functor(canvasElement, 'drop', this._onDrop);\n    if (!this.enablePointerEvents) {\n      functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n    }\n  }\n\n  /**\n   * Removes all event listeners, used when disposing the instance\n   */\n  removeListeners() {\n    this.addOrRemove(removeListener);\n    // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n    const eventTypePrefix = this._getEventPrefix();\n    const doc = getDocumentFromElement(this.upperCanvasEl);\n    removeListener(\n      doc,\n      `${eventTypePrefix}up`,\n      this._onMouseUp as EventListener,\n    );\n    removeListener(\n      doc,\n      'touchend',\n      this._onTouchEnd as EventListener,\n      addEventOptions,\n    );\n    removeListener(\n      doc,\n      `${eventTypePrefix}move`,\n      this._onMouseMove as EventListener,\n      addEventOptions,\n    );\n    removeListener(\n      doc,\n      'touchmove',\n      this._onMouseMove as EventListener,\n      addEventOptions,\n    );\n    clearTimeout(this._willAddMouseDown);\n  }\n\n  /**\n   * @private\n   * @param {Event} [e] Event object fired on wheel event\n   */\n  private _onMouseWheel(e: MouseEvent) {\n    this._cacheTransformEventData(e);\n    this._handleEvent(e, 'wheel');\n    this._resetTransformEventData();\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event object fired on mousedown\n   */\n  private _onMouseOut(e: TPointerEvent) {\n    const target = this._hoveredTarget;\n    const shared = {\n      e,\n      ...getEventPoints(this, e),\n    };\n    this.fire('mouse:out', { ...shared, target });\n    this._hoveredTarget = undefined;\n    target && target.fire('mouseout', { ...shared });\n    this._hoveredTargets.forEach((nestedTarget) => {\n      this.fire('mouse:out', { ...shared, target: nestedTarget });\n      nestedTarget && nestedTarget.fire('mouseout', { ...shared });\n    });\n    this._hoveredTargets = [];\n  }\n\n  /**\n   * @private\n   * Used when the mouse cursor enter the canvas from outside\n   * @param {Event} e Event object fired on mouseenter\n   */\n  private _onMouseEnter(e: TPointerEvent) {\n    // This find target and consequent 'mouse:over' is used to\n    // clear old instances on hovered target.\n    // calling findTarget has the side effect of killing target.__corner.\n    // as a short term fix we are not firing this if we are currently transforming.\n    // as a long term fix we need to separate the action of finding a target with the\n    // side effects we added to it.\n    const { target } = this.findTarget(e);\n    // we fire the event only when there is no target, if there is a target, the specific\n    // target event will fire.\n    if (!this._currentTransform && !target) {\n      this.fire('mouse:over', {\n        e,\n        ...getEventPoints(this, e),\n      });\n      this._hoveredTarget = undefined;\n      this._hoveredTargets = [];\n    }\n  }\n\n  /**\n   * supports native like text dragging\n   * @private\n   * @param {DragEvent} e\n   */\n  private _onDragStart(e: DragEvent) {\n    this._isClick = false;\n    const activeObject = this.getActiveObject();\n    if (activeObject && activeObject.onDragStart(e)) {\n      this._dragSource = activeObject;\n      const options = { e, target: activeObject };\n      this.fire('dragstart', options);\n      activeObject.fire('dragstart', options);\n      addListener(\n        this.upperCanvasEl,\n        'drag',\n        this._onDragProgress as EventListener,\n      );\n      return;\n    }\n    stopEvent(e);\n  }\n\n  /**\n   * First we clear top context where the effects are being rendered.\n   * Then we render the effects.\n   * Doing so will render the correct effect for all cases including an overlap between `source` and `target`.\n   * @private\n   */\n  private _renderDragEffects(\n    e: DragEvent,\n    source?: FabricObject,\n    target?: FabricObject,\n  ) {\n    let dirty = false;\n    // clear top context\n    const dropTarget = this._dropTarget;\n    if (dropTarget && dropTarget !== source && dropTarget !== target) {\n      dropTarget.clearContextTop();\n      dirty = true;\n    }\n    source?.clearContextTop();\n    target !== source && target?.clearContextTop();\n    // render effects\n    const ctx = this.contextTop;\n    ctx.save();\n    ctx.transform(...this.viewportTransform);\n    if (source) {\n      ctx.save();\n      source.transform(ctx);\n      source.renderDragSourceEffect(e);\n      ctx.restore();\n      dirty = true;\n    }\n    if (target) {\n      ctx.save();\n      target.transform(ctx);\n      target.renderDropTargetEffect(e);\n      ctx.restore();\n      dirty = true;\n    }\n    ctx.restore();\n    dirty && (this.contextTopDirty = true);\n  }\n\n  /**\n   * supports native like text dragging\n   * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n   * @private\n   * @param {DragEvent} e\n   */\n  private _onDragEnd(e: DragEvent) {\n    const { currentSubTargets } = this.findTarget(e);\n    const didDrop = !!e.dataTransfer && e.dataTransfer.dropEffect !== NONE,\n      dropTarget = didDrop ? this._activeObject : undefined,\n      options = {\n        e,\n        target: this._dragSource as FabricObject,\n        subTargets: currentSubTargets,\n        dragSource: this._dragSource as FabricObject,\n        didDrop,\n        dropTarget: dropTarget as FabricObject,\n      };\n    removeListener(\n      this.upperCanvasEl,\n      'drag',\n      this._onDragProgress as EventListener,\n    );\n    this.fire('dragend', options);\n    this._dragSource && this._dragSource.fire('dragend', options);\n    delete this._dragSource;\n    // we need to call mouse up synthetically because the browser won't\n    this._onMouseUp(e);\n  }\n\n  /**\n   * fire `drag` event on canvas and drag source\n   * @private\n   * @param {DragEvent} e\n   */\n  private _onDragProgress(e: DragEvent) {\n    const options = {\n      e,\n      target: this._dragSource,\n      dragSource: this._dragSource,\n      dropTarget: this._draggedoverTarget as FabricObject,\n    };\n    this.fire('drag', options);\n    this._dragSource && this._dragSource.fire('drag', options);\n  }\n\n  /**\n   * prevent default to allow drop event to be fired\n   * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#specifying_drop_targets\n   * @private\n   * @param {DragEvent} [e] Event object fired on Event.js shake\n   */\n  private _onDragOver(e: DragEvent) {\n    const eventType = 'dragover';\n    const { currentContainer: target, currentSubTargets } = this.findTarget(e);\n    const dragSource = this._dragSource as FabricObject;\n    const options = {\n      e,\n      target,\n      subTargets: currentSubTargets,\n      dragSource,\n      canDrop: false,\n      dropTarget: undefined,\n    };\n    let dropTarget;\n    //  fire on canvas\n    this.fire(eventType, options);\n    //  make sure we fire dragenter events before dragover\n    //  if dragleave is needed, object will not fire dragover so we don't need to trouble ourselves with it\n    this._fireEnterLeaveEvents(e, target, options);\n    if (target) {\n      if (target.canDrop(e)) {\n        dropTarget = target;\n      }\n      target.fire(eventType, options);\n    }\n    //  propagate the event to subtargets\n    for (let i = 0; i < currentSubTargets.length; i++) {\n      const subTarget = currentSubTargets[i];\n      // accept event only if previous targets didn't (the accepting target calls `preventDefault` to inform that the event is taken)\n      // TODO: verify if those should loop in inverse order then?\n      // what is the order of subtargets?\n      if (subTarget.canDrop(e)) {\n        dropTarget = subTarget;\n      }\n      subTarget.fire(eventType, options);\n    }\n    //  render drag effects now that relations between source and target is clear\n    this._renderDragEffects(e, dragSource, dropTarget);\n    this._dropTarget = dropTarget;\n  }\n\n  /**\n   * fire `dragleave` on `dragover` targets\n   * @private\n   * @param {Event} [e] Event object fired on Event.js shake\n   */\n  private _onDragEnter(e: DragEvent) {\n    const { currentContainer, currentSubTargets } = this.findTarget(e);\n    const options = {\n      e,\n      target: currentContainer,\n      subTargets: currentSubTargets,\n      dragSource: this._dragSource,\n    };\n    this.fire('dragenter', options);\n    //  fire dragenter on targets\n    this._fireEnterLeaveEvents(e, currentContainer, options);\n  }\n\n  /**\n   * fire `dragleave` on `dragover` targets\n   * @private\n   * @param {Event} [e] Event object fired on Event.js shake\n   */\n  private _onDragLeave(e: DragEvent) {\n    const { currentSubTargets } = this.findTarget(e);\n    const options = {\n      e,\n      target: this._draggedoverTarget,\n      subTargets: currentSubTargets,\n      dragSource: this._dragSource,\n    };\n    this.fire('dragleave', options);\n\n    //  fire dragleave on targets\n    this._fireEnterLeaveEvents(e, undefined, options);\n    this._renderDragEffects(e, this._dragSource);\n    this._dropTarget = undefined;\n    this._hoveredTargets = [];\n  }\n\n  /**\n   * `drop:before` is a an event that allows you to schedule logic\n   * before the `drop` event. Prefer `drop` event always, but if you need\n   * to run some drop-disabling logic on an event, since there is no way\n   * to handle event handlers ordering, use `drop:before`\n   * @private\n   * @param {Event} e\n   */\n  private _onDrop(e: DragEvent) {\n    const { currentContainer, currentSubTargets } = this.findTarget(e);\n    const options = this._basicEventHandler('drop:before', {\n      e,\n      target: currentContainer,\n      subTargets: currentSubTargets,\n      dragSource: this._dragSource,\n      ...getEventPoints(this, e),\n    });\n    //  will be set by the drop target\n    options.didDrop = false;\n    //  will be set by the drop target, used in case options.target refuses the drop\n    options.dropTarget = undefined;\n    //  fire `drop`\n    this._basicEventHandler('drop', options);\n    //  inform canvas of the drop\n    //  we do this because canvas was unaware of what happened at the time the `drop` event was fired on it\n    //  use for side effects\n    this.fire('drop:after', options);\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event object fired on mousedown\n   */\n  private _onContextMenu(e: TPointerEvent): false {\n    const { target, subTargets } = this.findTarget(e);\n    const options = this._basicEventHandler('contextmenu:before', {\n      e,\n      target,\n      subTargets,\n    });\n    // TODO: this line is silly because the dev can subscribe to the event and prevent it themselves\n    this.stopContextMenu && stopEvent(e);\n    this._basicEventHandler('contextmenu', options);\n    return false;\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event object fired on mousedown\n   */\n  private _onClick(e: TPointerEvent) {\n    const clicks = e.detail;\n    if (clicks > 3 || clicks < 2) return;\n    this._cacheTransformEventData(e);\n    clicks == 2 && e.type === 'dblclick' && this._handleEvent(e, 'dblclick');\n    clicks == 3 && this._handleEvent(e, 'tripleclick');\n    this._resetTransformEventData();\n  }\n\n  /**\n   * This supports gesture event firing\n   * It is a method to keep some code organized, it exposes private methods\n   * in a way that works and still keep them private\n   * This is supposed to mirror _handleEvent\n   */\n  fireEventFromPointerEvent(\n    e: TPointerEvent,\n    eventName: keyof CanvasEvents,\n    secondaryName: keyof ObjectEvents,\n    extraData:\n      | Record<string, unknown>\n      | { rotation: number }\n      | { ping: number } = {},\n  ) {\n    this._cacheTransformEventData(e);\n    const { target, subTargets } = this.findTarget(e),\n      options = {\n        e,\n        target,\n        subTargets,\n        ...getEventPoints(this, e),\n        transform: this._currentTransform,\n        ...extraData,\n      };\n    this.fire(eventName, options);\n    // this may be a little be more complicated of what we want to handle\n    target && target.fire(secondaryName, options);\n    for (let i = 0; i < subTargets.length; i++) {\n      subTargets[i] !== target && subTargets[i].fire(secondaryName, options);\n    }\n    this._resetTransformEventData();\n  }\n\n  /**\n   * Return a the id of an event.\n   * returns either the pointerId or the identifier or 0 for the mouse event\n   * @private\n   * @param {Event} evt Event object\n   */\n  getPointerId(evt: TouchEvent | PointerEvent): number {\n    const changedTouches = (evt as TouchEvent).changedTouches;\n\n    if (changedTouches) {\n      return changedTouches[0] && changedTouches[0].identifier;\n    }\n\n    if (this.enablePointerEvents) {\n      return (evt as PointerEvent).pointerId;\n    }\n\n    return -1;\n  }\n\n  /**\n   * Determines if an event has the id of the event that is considered main\n   * @private\n   * @param {evt} event Event object\n   */\n  _isMainEvent(evt: TPointerEvent): boolean {\n    if ((evt as PointerEvent).isPrimary === true) {\n      return true;\n    }\n    if ((evt as PointerEvent).isPrimary === false) {\n      return false;\n    }\n    if (evt.type === 'touchend' && (evt as TouchEvent).touches.length === 0) {\n      return true;\n    }\n    if ((evt as TouchEvent).changedTouches) {\n      return (\n        (evt as TouchEvent).changedTouches[0].identifier === this.mainTouchId\n      );\n    }\n    return true;\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event object fired on mousedown\n   */\n  _onTouchStart(e: TouchEvent) {\n    this._cacheTransformEventData(e);\n    // we will prevent scrolling if allowTouchScrolling is not enabled and\n    let shouldPreventScrolling = !this.allowTouchScrolling;\n    const currentActiveObject = this._activeObject;\n    if (this.mainTouchId === undefined) {\n      this.mainTouchId = this.getPointerId(e);\n    }\n    this.__onMouseDown(e);\n    const { target } = this.findTarget(e);\n    // after executing fabric logic for mouse down let's see\n    // if we didn't change target or if we are drawing\n    // we want to prevent scrolling anyway\n    if (\n      this.isDrawingMode ||\n      (currentActiveObject && target === currentActiveObject)\n    ) {\n      shouldPreventScrolling = true;\n    }\n    // prevent default, will block scrolling from start\n    shouldPreventScrolling && e.preventDefault();\n    const canvasElement = this.upperCanvasEl,\n      eventTypePrefix = this._getEventPrefix();\n    const doc = getDocumentFromElement(canvasElement);\n    addListener(\n      doc,\n      'touchend',\n      this._onTouchEnd as EventListener,\n      addEventOptions,\n    );\n    // if we scroll don't register the touch move event\n    shouldPreventScrolling &&\n      addListener(\n        doc,\n        'touchmove',\n        this._onMouseMove as EventListener,\n        addEventOptions,\n      );\n    // Unbind mousedown to prevent double triggers from touch devices\n    removeListener(\n      canvasElement,\n      `${eventTypePrefix}down`,\n      this._onMouseDown as EventListener,\n    );\n    this._resetTransformEventData();\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event object fired on mousedown\n   */\n  _onMouseDown(e: TPointerEvent) {\n    this._cacheTransformEventData(e);\n    this.__onMouseDown(e);\n    const canvasElement = this.upperCanvasEl,\n      eventTypePrefix = this._getEventPrefix();\n    // switch from moving on the canvas element to moving on the document\n    removeListener(\n      canvasElement,\n      `${eventTypePrefix}move`,\n      this._onMouseMove as EventListener,\n      addEventOptions,\n    );\n    const doc = getDocumentFromElement(canvasElement);\n    addListener(doc, `${eventTypePrefix}up`, this._onMouseUp as EventListener);\n    addListener(\n      doc,\n      `${eventTypePrefix}move`,\n      this._onMouseMove as EventListener,\n      addEventOptions,\n    );\n    this._resetTransformEventData();\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event object fired on mousedown\n   */\n  _onTouchEnd(e: TouchEvent) {\n    if (e.touches.length > 0) {\n      // if there are still touches stop here\n      return;\n    }\n    this._cacheTransformEventData(e);\n    this.__onMouseUp(e);\n    this._resetTransformEventData();\n    delete this.mainTouchId;\n    const eventTypePrefix = this._getEventPrefix();\n    const doc = getDocumentFromElement(this.upperCanvasEl);\n    removeListener(\n      doc,\n      'touchend',\n      this._onTouchEnd as EventListener,\n      addEventOptions,\n    );\n    removeListener(\n      doc,\n      'touchmove',\n      this._onMouseMove as EventListener,\n      addEventOptions,\n    );\n    if (this._willAddMouseDown) {\n      clearTimeout(this._willAddMouseDown);\n    }\n    this._willAddMouseDown = setTimeout(() => {\n      // Wait 400ms before rebinding mousedown to prevent double triggers\n      // from touch devices\n      addListener(\n        this.upperCanvasEl,\n        `${eventTypePrefix}down`,\n        this._onMouseDown as EventListener,\n      );\n      this._willAddMouseDown = 0;\n    }, 400) as unknown as number;\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event object fired on mouseup\n   */\n  _onMouseUp(e: TPointerEvent) {\n    this._cacheTransformEventData(e);\n    this.__onMouseUp(e);\n    const canvasElement = this.upperCanvasEl,\n      eventTypePrefix = this._getEventPrefix();\n    if (this._isMainEvent(e)) {\n      const doc = getDocumentFromElement(this.upperCanvasEl);\n      removeListener(\n        doc,\n        `${eventTypePrefix}up`,\n        this._onMouseUp as EventListener,\n      );\n      removeListener(\n        doc,\n        `${eventTypePrefix}move`,\n        this._onMouseMove as EventListener,\n        addEventOptions,\n      );\n      addListener(\n        canvasElement,\n        `${eventTypePrefix}move`,\n        this._onMouseMove as EventListener,\n        addEventOptions,\n      );\n    }\n    this._resetTransformEventData();\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event object fired on mousemove\n   */\n  _onMouseMove(e: TPointerEvent) {\n    this._cacheTransformEventData(e);\n\n    const activeObject = this.getActiveObject();\n    !this.allowTouchScrolling &&\n      (!activeObject ||\n        // a drag event sequence is started by the active object flagging itself on mousedown / mousedown:before\n        // we must not prevent the event's default behavior in order for the window to start dragging\n        !activeObject.shouldStartDragging(e)) &&\n      e.preventDefault &&\n      e.preventDefault();\n    this.__onMouseMove(e);\n    this._resetTransformEventData();\n  }\n\n  /**\n   * @private\n   */\n  _onResize() {\n    this.calcOffset();\n    this._resetTransformEventData();\n  }\n\n  /**\n   * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n   * @private\n   * @param {Object} target\n   */\n  _shouldRender(target: FabricObject | undefined) {\n    const activeObject = this.getActiveObject();\n    // if just one of them is available or if they are both but are different objects\n    // this covers: switch of target, from target to no target, selection of target\n    // multiSelection with key and mouse\n    return (\n      !!activeObject !== !!target ||\n      (activeObject && target && activeObject !== target)\n    );\n  }\n\n  /**\n   * Method that defines the actions when mouse is released on canvas.\n   * The method resets the currentTransform parameters, store the image corner\n   * position in the image object and render the canvas on top.\n   * @private\n   * @param {Event} e Event object fired on mouseup\n   */\n  __onMouseUp(e: TPointerEvent) {\n    this._handleEvent(e, 'up:before');\n\n    const transform = this._currentTransform;\n    const isClick = this._isClick;\n    const { target } = this.findTarget(e);\n\n    // if right/middle click just fire events and return\n    // target undefined will make the _handleEvent search the target\n    const { button } = e as MouseEvent;\n    if (button) {\n      ((this.fireMiddleClick && button === 1) ||\n        (this.fireRightClick && button === 2)) &&\n        this._handleEvent(e, 'up');\n      return;\n    }\n\n    if (this.isDrawingMode && this._isCurrentlyDrawing) {\n      this._onMouseUpInDrawingMode(e);\n      return;\n    }\n\n    if (!this._isMainEvent(e)) {\n      return;\n    }\n    let shouldRender = false;\n    if (transform) {\n      this._finalizeCurrentTransform(e);\n      shouldRender = transform.actionPerformed;\n    }\n    if (!isClick) {\n      const targetWasActive = target === this._activeObject;\n      this.handleSelection(e);\n      if (!shouldRender) {\n        shouldRender =\n          this._shouldRender(target) ||\n          (!targetWasActive && target === this._activeObject);\n      }\n    }\n    let pointer, corner;\n    if (target) {\n      const found = target.findControl(\n        this.getViewportPoint(e),\n        isTouchEvent(e),\n      );\n      const { key, control } = found || {};\n      corner = key;\n      if (\n        target.selectable &&\n        target !== this._activeObject &&\n        target.activeOn === 'up'\n      ) {\n        this.setActiveObject(target, e);\n        shouldRender = true;\n      } else if (control) {\n        const mouseUpHandler = control.getMouseUpHandler(e, target, control);\n        if (mouseUpHandler) {\n          pointer = this.getScenePoint(e);\n          mouseUpHandler.call(control, e, transform!, pointer.x, pointer.y);\n        }\n      }\n      target.isMoving = false;\n    }\n    // if we are ending up a transform on a different control or a new object\n    // fire the original mouse up from the corner that started the transform\n    if (\n      transform &&\n      (transform.target !== target || transform.corner !== corner)\n    ) {\n      const originalControl =\n          transform.target && transform.target.controls[transform.corner],\n        originalMouseUpHandler =\n          originalControl &&\n          originalControl.getMouseUpHandler(\n            e,\n            transform.target,\n            originalControl,\n          );\n      pointer = pointer || this.getScenePoint(e);\n      originalMouseUpHandler &&\n        originalMouseUpHandler.call(\n          originalControl,\n          e,\n          transform,\n          pointer.x,\n          pointer.y,\n        );\n    }\n    this._setCursorFromEvent(e, target);\n    this._handleEvent(e, 'up');\n    this._groupSelector = null;\n    this._currentTransform = null;\n    // reset the target information about which corner is selected\n    target && (target.__corner = undefined);\n    if (shouldRender) {\n      this.requestRenderAll();\n    } else if (!isClick && !(this._activeObject as IText)?.isEditing) {\n      this.renderTop();\n    }\n  }\n\n  _basicEventHandler<T extends keyof (CanvasEvents | ObjectEvents)>(\n    eventType: T,\n    options: (CanvasEvents & ObjectEvents)[T],\n  ) {\n    const { target, subTargets = [] } = options as {\n      target?: FabricObject;\n      subTargets: FabricObject[];\n    };\n    this.fire(eventType, options);\n    target && target.fire(eventType, options);\n    for (let i = 0; i < subTargets.length; i++) {\n      subTargets[i] !== target && subTargets[i].fire(eventType, options);\n    }\n    return options;\n  }\n\n  /**\n   * @private\n   * Handle event firing for target and subtargets\n   * @param {TPointerEvent} e event from mouse\n   * @param {TPointerEventNames} eventType\n   */\n  _handleEvent<T extends TPointerEventNames>(\n    e: TPointerEvent,\n    eventType: T,\n    extraData?: TEventsExtraData[T],\n  ) {\n    const { target, subTargets } = this.findTarget(e),\n      options: CanvasEvents[`mouse:${T}`] = {\n        e,\n        target,\n        subTargets,\n        ...getEventPoints(this, e),\n        transform: this._currentTransform,\n        ...(eventType === 'down:before' || eventType === 'down'\n          ? extraData\n          : {}),\n      } as CanvasEvents[`mouse:${T}`];\n    if (eventType === 'up:before' || eventType === 'up') {\n      (options as CanvasEvents[`mouse:up`]).isClick = this._isClick;\n    }\n\n    this.fire(`mouse:${eventType}`, options);\n    // this may be a little be more complicated of what we want to handle\n    target && target.fire(`mouse${eventType}`, options);\n    for (let i = 0; i < subTargets.length; i++) {\n      subTargets[i] !== target &&\n        subTargets[i].fire(`mouse${eventType}`, options);\n    }\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event object fired on mousedown\n   */\n  _onMouseDownInDrawingMode(e: TPointerEvent) {\n    this._isCurrentlyDrawing = true;\n    if (this.getActiveObject()) {\n      this.discardActiveObject(e);\n      this.requestRenderAll();\n    }\n    // TODO: this is a scene point so it should be renamed\n    const pointer = this.getScenePoint(e);\n    this.freeDrawingBrush &&\n      this.freeDrawingBrush.onMouseDown(pointer, { e, pointer });\n    this._handleEvent(e, 'down', { alreadySelected: false });\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event object fired on mousemove\n   */\n  _onMouseMoveInDrawingMode(e: TPointerEvent) {\n    if (this._isCurrentlyDrawing) {\n      const pointer = this.getScenePoint(e);\n      this.freeDrawingBrush &&\n        this.freeDrawingBrush.onMouseMove(pointer, {\n          e,\n          // this is an absolute pointer, the naming is wrong\n          pointer,\n        });\n    }\n    this.setCursor(this.freeDrawingCursor);\n    this._handleEvent(e, 'move');\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event object fired on mouseup\n   */\n  _onMouseUpInDrawingMode(e: TPointerEvent) {\n    const pointer = this.getScenePoint(e);\n    if (this.freeDrawingBrush) {\n      this._isCurrentlyDrawing = !!this.freeDrawingBrush.onMouseUp({\n        e: e,\n        // this is an absolute pointer, the naming is wrong\n        pointer,\n      });\n    } else {\n      this._isCurrentlyDrawing = false;\n    }\n    this._handleEvent(e, 'up');\n  }\n\n  /**\n   * Method that defines the actions when mouse is clicked on canvas.\n   * The method inits the currentTransform parameters and renders all the\n   * canvas so the current image can be placed on the top canvas and the rest\n   * in on the container one.\n   * @private\n   * @param {Event} e Event object fired on mousedown\n   */\n  __onMouseDown(e: TPointerEvent) {\n    this._isClick = true;\n    this._handleEvent(e, 'down:before');\n\n    let { target } = this.findTarget(e);\n    let alreadySelected = !!target && target === this._activeObject;\n    // if right/middle click just fire events\n    const { button } = e as MouseEvent;\n    if (button) {\n      ((this.fireMiddleClick && button === 1) ||\n        (this.fireRightClick && button === 2)) &&\n        this._handleEvent(e, 'down', {\n          alreadySelected,\n        });\n      return;\n    }\n\n    if (this.isDrawingMode) {\n      this._onMouseDownInDrawingMode(e);\n      return;\n    }\n\n    if (!this._isMainEvent(e)) {\n      return;\n    }\n\n    // ignore if some object is being transformed at this moment\n    if (this._currentTransform) {\n      return;\n    }\n\n    let shouldRender = this._shouldRender(target);\n    let grouped = false;\n    if (this.handleMultiSelection(e, target)) {\n      // active object might have changed while grouping\n      target = this._activeObject;\n      grouped = true;\n      shouldRender = true;\n    } else if (this._shouldClearSelection(e, target)) {\n      this.discardActiveObject(e);\n    }\n    // we start a group selector rectangle if\n    // selection is enabled\n    // and there is no target, or the following 3 conditions are satisfied:\n    // target is not selectable ( otherwise we selected it )\n    // target is not editing\n    // target is not already selected ( otherwise we drag )\n    if (\n      this.selection &&\n      (!target ||\n        (!target.selectable &&\n          !(target as IText).isEditing &&\n          target !== this._activeObject))\n    ) {\n      const p = this.getScenePoint(e);\n      this._groupSelector = {\n        x: p.x,\n        y: p.y,\n        deltaY: 0,\n        deltaX: 0,\n      };\n    }\n\n    // check again because things could have changed\n    alreadySelected = !!target && target === this._activeObject;\n    if (target) {\n      if (target.selectable && target.activeOn === 'down') {\n        this.setActiveObject(target, e);\n      }\n      const handle = target.findControl(\n        this.getViewportPoint(e),\n        isTouchEvent(e),\n      );\n      if (target === this._activeObject && (handle || !grouped)) {\n        this._setupCurrentTransform(e, target, alreadySelected);\n        const control = handle ? handle.control : undefined,\n          pointer = this.getScenePoint(e),\n          mouseDownHandler =\n            control && control.getMouseDownHandler(e, target, control);\n        mouseDownHandler &&\n          mouseDownHandler.call(\n            control,\n            e,\n            this._currentTransform!,\n            pointer.x,\n            pointer.y,\n          );\n      }\n    }\n    //  we clear `_objectsToRender` in case of a change in order to repopulate it at rendering\n    //  run before firing the `down` event to give the dev a chance to populate it themselves\n    shouldRender && (this._objectsToRender = undefined);\n    this._handleEvent(e, 'down', { alreadySelected: alreadySelected });\n    // we must renderAll so that we update the visuals\n    shouldRender && this.requestRenderAll();\n  }\n\n  /**\n   * reset cache form common information needed during event processing\n   * @private\n   */\n  _resetTransformEventData() {\n    this._targetInfo = this._viewportPoint = this._scenePoint = undefined;\n  }\n\n  /**\n   * Cache common information needed during event processing\n   * @private\n   * @param {Event} e Event object fired on event\n   */\n  _cacheTransformEventData(e: TPointerEvent) {\n    // reset in order to avoid stale caching\n    this._resetTransformEventData();\n    this._viewportPoint = this.getViewportPoint(e);\n    this._scenePoint = sendPointToPlane(\n      this._viewportPoint,\n      undefined,\n      this.viewportTransform,\n    );\n    this._targetInfo = this.findTarget(e);\n    // TODO: investigate better if this can be made less implicit in the code\n    if (this._currentTransform) {\n      this._targetInfo.target = this._currentTransform.target;\n    }\n  }\n\n  /**\n   * Method that defines the actions when mouse is hovering the canvas.\n   * The currentTransform parameter will define whether the user is rotating/scaling/translating\n   * an image or neither of them (only hovering). A group selection is also possible and would cancel\n   * all any other type of action.\n   * In case of an image transformation only the top canvas will be rendered.\n   * @private\n   * @param {Event} e Event object fired on mousemove\n   */\n  __onMouseMove(e: TPointerEvent) {\n    this._isClick = false;\n    this._handleEvent(e, 'move:before');\n\n    if (this.isDrawingMode) {\n      this._onMouseMoveInDrawingMode(e);\n      return;\n    }\n\n    if (!this._isMainEvent(e)) {\n      return;\n    }\n\n    const groupSelector = this._groupSelector;\n\n    // We initially clicked in an empty area, so we draw a box for multiple selection\n    if (groupSelector) {\n      const pointer = this.getScenePoint(e);\n\n      groupSelector.deltaX = pointer.x - groupSelector.x;\n      groupSelector.deltaY = pointer.y - groupSelector.y;\n\n      this.renderTop();\n    } else if (!this._currentTransform) {\n      const { target } = this.findTarget(e);\n      this._setCursorFromEvent(e, target);\n      this._fireOverOutEvents(e, target);\n    } else {\n      this._transformObject(e);\n    }\n    this.textEditingManager.onMouseMove(e);\n    this._handleEvent(e, 'move');\n  }\n\n  /**\n   * Manage the mouseout, mouseover events for the fabric object on the canvas\n   * @param {Fabric.Object} target the target where the target from the mousemove event\n   * @param {Event} e Event object fired on mousemove\n   * @private\n   */\n  _fireOverOutEvents(e: TPointerEvent, target?: FabricObject) {\n    const { _hoveredTarget, _hoveredTargets } = this,\n      { subTargets } = this.findTarget(e),\n      length = Math.max(_hoveredTargets.length, subTargets.length);\n\n    this.fireSyntheticInOutEvents('mouse', {\n      e,\n      target,\n      oldTarget: _hoveredTarget,\n      fireCanvas: true,\n    });\n    for (let i = 0; i < length; i++) {\n      if (\n        subTargets[i] === target ||\n        (_hoveredTargets[i] && _hoveredTargets[i] === _hoveredTarget)\n      ) {\n        continue;\n      }\n      this.fireSyntheticInOutEvents('mouse', {\n        e,\n        target: subTargets[i],\n        oldTarget: _hoveredTargets[i],\n      });\n    }\n    this._hoveredTarget = target;\n    this._hoveredTargets = subTargets;\n  }\n\n  /**\n   * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n   * @param {Fabric.Object} target the target where the target from the onDrag event\n   * @param {Object} data Event object fired on dragover\n   * @private\n   */\n  _fireEnterLeaveEvents(\n    e: TPointerEvent,\n    target: FabricObject | undefined,\n    data: DragEventData,\n  ) {\n    const draggedoverTarget = this._draggedoverTarget,\n      _hoveredTargets = this._hoveredTargets,\n      { subTargets } = this.findTarget(e),\n      length = Math.max(_hoveredTargets.length, subTargets.length);\n\n    this.fireSyntheticInOutEvents('drag', {\n      ...data,\n      target,\n      oldTarget: draggedoverTarget,\n      fireCanvas: true,\n    });\n    for (let i = 0; i < length; i++) {\n      this.fireSyntheticInOutEvents('drag', {\n        ...data,\n        target: subTargets[i],\n        oldTarget: _hoveredTargets[i],\n      });\n    }\n    this._draggedoverTarget = target;\n  }\n\n  /**\n   * Manage the synthetic in/out events for the fabric objects on the canvas\n   * @param {Fabric.Object} target the target where the target from the supported events\n   * @param {Object} data Event object fired\n   * @param {Object} config configuration for the function to work\n   * @param {String} config.targetName property on the canvas where the old target is stored\n   * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n   * @param {String} config.evtOut name of the event to fire for out\n   * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n   * @param {String} config.evtIn name of the event to fire for in\n   * @private\n   */\n  fireSyntheticInOutEvents<T extends keyof TSyntheticEventContext>(\n    type: T,\n    {\n      target,\n      oldTarget,\n      fireCanvas,\n      e,\n      ...data\n    }: TSyntheticEventContext[T] & {\n      target?: FabricObject;\n      oldTarget?: FabricObject;\n      fireCanvas?: boolean;\n    },\n  ) {\n    const { targetIn, targetOut, canvasIn, canvasOut } =\n      syntheticEventConfig[type];\n    const targetChanged = oldTarget !== target;\n\n    if (oldTarget && targetChanged) {\n      const outOpt: CanvasEvents[typeof canvasOut] = {\n        ...data,\n        e,\n        target: oldTarget,\n        nextTarget: target,\n        ...getEventPoints(this, e),\n      };\n      fireCanvas && this.fire(canvasOut, outOpt);\n      oldTarget.fire(targetOut, outOpt);\n    }\n    if (target && targetChanged) {\n      const inOpt: CanvasEvents[typeof canvasIn] = {\n        ...data,\n        e,\n        target,\n        previousTarget: oldTarget,\n        ...getEventPoints(this, e),\n      };\n      fireCanvas && this.fire(canvasIn, inOpt);\n      target.fire(targetIn, inOpt);\n    }\n  }\n\n  /**\n   * @private\n   * @param {Event} e Event fired on mousemove\n   */\n  _transformObject(e: TPointerEvent) {\n    const scenePoint = this.getScenePoint(e),\n      transform = this._currentTransform!,\n      target = transform.target,\n      //  transform pointer to target's containing coordinate plane\n      //  both pointer and object should agree on every point\n      localPointer = target.group\n        ? sendPointToPlane(\n            scenePoint,\n            undefined,\n            target.group.calcTransformMatrix(),\n          )\n        : scenePoint;\n    transform.shiftKey = e.shiftKey;\n    transform.altKey = !!this.centeredKey && e[this.centeredKey];\n\n    this._performTransformAction(e, transform, localPointer);\n    transform.actionPerformed && this.requestRenderAll();\n  }\n\n  /**\n   * @private\n   */\n  _performTransformAction(\n    e: TPointerEvent,\n    transform: Transform,\n    pointer: Point,\n  ) {\n    const { action, actionHandler, target } = transform;\n\n    const actionPerformed =\n      !!actionHandler && actionHandler(e, transform, pointer.x, pointer.y);\n    actionPerformed && target.setCoords();\n\n    // this object could be created from the function in the control handlers\n    if (action === 'drag' && actionPerformed) {\n      transform.target.isMoving = true;\n      this.setCursor(transform.target.moveCursor || this.moveCursor);\n    }\n    transform.actionPerformed = transform.actionPerformed || actionPerformed;\n  }\n\n  /**\n   * Sets the cursor depending on where the canvas is being hovered.\n   * Note: very buggy in Opera\n   * @param {Event} e Event object\n   * @param {Object} target Object that the mouse is hovering, if so.\n   */\n  _setCursorFromEvent(e: TPointerEvent, target?: FabricObject) {\n    if (!target) {\n      this.setCursor(this.defaultCursor);\n      return;\n    }\n    let hoverCursor = target.hoverCursor || this.hoverCursor;\n    const activeSelection = isActiveSelection(this._activeObject)\n        ? this._activeObject\n        : null,\n      // only show proper corner when group selection is not active\n      corner =\n        (!activeSelection || target.group !== activeSelection) &&\n        // here we call findTargetCorner always with undefined for the touch parameter.\n        // we assume that if you are using a cursor you do not need to interact with\n        // the bigger touch area.\n        target.findControl(this.getViewportPoint(e));\n\n    if (!corner) {\n      if ((target as Group).subTargetCheck) {\n        // hoverCursor should come from top-most subTarget,\n        // so we walk the array backwards\n        const { subTargets } = this.findTarget(e);\n        subTargets\n          .concat()\n          .reverse()\n          .forEach((_target) => {\n            hoverCursor = _target.hoverCursor || hoverCursor;\n          });\n      }\n      this.setCursor(hoverCursor);\n    } else {\n      const { control, coord } = corner;\n      this.setCursor(control.cursorStyleHandler(e, control, target, coord));\n    }\n  }\n\n  /**\n   * ## Handles multiple selection\n   * - toggles `target` selection (selects/deselects `target` if it isn't/is selected respectively)\n   * - sets the active object in case it is not set or in case there is a single active object left under active selection.\n   * ---\n   * - If the active object is the active selection we add/remove `target` from it\n   * - If not, add the active object and `target` to the active selection and make it the active object.\n   * @TODO rewrite this after find target is refactored\n   * @private\n   * @param {TPointerEvent} e Event object\n   * @param {FabricObject} target target of event to select/deselect\n   * @returns true if grouping occurred\n   */\n  protected handleMultiSelection(e: TPointerEvent, target?: FabricObject) {\n    const activeObject = this._activeObject;\n    const isAS = isActiveSelection(activeObject);\n    if (\n      // check if an active object exists on canvas and if the user is pressing the `selectionKey` while canvas supports multi selection.\n      !!activeObject &&\n      this._isSelectionKeyPressed(e) &&\n      this.selection &&\n      // on top of that the user also has to hit a target that is selectable.\n      !!target &&\n      target.selectable &&\n      // group target and active object only if they are different objects\n      // else we try to find a subtarget of `ActiveSelection`\n      (activeObject !== target || isAS) &&\n      //  make sure `activeObject` and `target` aren't ancestors of each other in case `activeObject` is not `ActiveSelection`\n      // if it is then we want to remove `target` from it\n      (isAS ||\n        (!target.isDescendantOf(activeObject) &&\n          !activeObject.isDescendantOf(target))) &&\n      //  target accepts selection\n      !target.onSelect({ e }) &&\n      // make sure we are not on top of a control\n      !activeObject.getActiveControl()\n    ) {\n      if (isAS) {\n        const prevActiveObjects = activeObject.getObjects();\n        let subTargets: FabricObject[] = [];\n        // const { subTargets: testSubTargets } = this.findTarget(e);\n        if (target === activeObject) {\n          const pointer = this.getScenePoint(e);\n          let targetInfo = this.searchPossibleTargets(\n            prevActiveObjects,\n            pointer,\n          );\n          // console.log(testSubTargets.includes(targetInfo.target));\n          if (targetInfo.target) {\n            target = targetInfo.target;\n            subTargets = targetInfo.subTargets;\n          } else {\n            targetInfo = this.searchPossibleTargets(this._objects, pointer);\n            target = targetInfo.target;\n            subTargets = targetInfo.subTargets;\n          }\n          // if nothing is found bail out\n          if (!target || !target.selectable) {\n            return false;\n          }\n        }\n        if (target.group === activeObject) {\n          // `target` is part of active selection => remove it\n          activeObject.remove(target);\n          this._hoveredTarget = target;\n          this._hoveredTargets = subTargets;\n          // if after removing an object we are left with one only...\n          if (activeObject.size() === 1) {\n            // activate last remaining object\n            // deselecting the active selection will remove the remaining object from it\n            this._setActiveObject(activeObject.item(0), e);\n          }\n        } else {\n          // `target` isn't part of active selection => add it\n          activeObject.multiSelectAdd(target);\n          this._hoveredTarget = activeObject;\n          this._hoveredTargets = subTargets;\n        }\n        this._fireSelectionEvents(prevActiveObjects, e);\n      } else {\n        (activeObject as IText).isEditing &&\n          (activeObject as IText).exitEditing();\n        // add the active object and the target to the active selection and set it as the active object\n        const klass =\n          classRegistry.getClass<typeof ActiveSelection>('ActiveSelection');\n        const newActiveSelection = new klass([], {\n          /**\n           * it is crucial to pass the canvas ref before calling {@link ActiveSelection#multiSelectAdd}\n           * since it uses {@link FabricObject#isInFrontOf} which relies on the canvas ref\n           */\n          canvas: this,\n        });\n        newActiveSelection.multiSelectAdd(activeObject, target);\n        this._hoveredTarget = newActiveSelection;\n        // ISSUE 4115: should we consider subTargets here?\n        // this._hoveredTargets = [];\n        // this._hoveredTargets = this.targets.concat();\n        this._setActiveObject(newActiveSelection, e);\n        this._fireSelectionEvents([activeObject], e);\n      }\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * ## Handles selection\n   * - selects objects that are contained in (and possibly intersecting) the selection bounding box\n   * - sets the active object\n   * ---\n   * runs on mouse up after a mouse move\n   */\n  protected handleSelection(e: TPointerEvent) {\n    if (!this.selection || !this._groupSelector) {\n      return false;\n    }\n    const { x, y, deltaX, deltaY } = this._groupSelector,\n      point1 = new Point(x, y),\n      point2 = point1.add(new Point(deltaX, deltaY)),\n      tl = point1.min(point2),\n      br = point1.max(point2),\n      size = br.subtract(tl);\n\n    const collectedObjects = this.collectObjects(\n      {\n        left: tl.x,\n        top: tl.y,\n        width: size.x,\n        height: size.y,\n      },\n      { includeIntersecting: !this.selectionFullyContained },\n    ) as FabricObject[];\n\n    const objects =\n      // though this method runs only after mouse move the pointer could do a mouse up on the same position as mouse down\n      // should it be handled as is?\n      point1.eq(point2)\n        ? collectedObjects[0]\n          ? [collectedObjects[0]]\n          : []\n        : collectedObjects.length > 1\n          ? collectedObjects\n              .filter((object) => !object.onSelect({ e }))\n              .reverse()\n          : // `setActiveObject` will call `onSelect(collectedObjects[0])` in this case\n            collectedObjects;\n\n    // set active object\n    if (objects.length === 1) {\n      // set as active object\n      this.setActiveObject(objects[0], e);\n    } else if (objects.length > 1) {\n      // add to active selection and make it the active object\n      const klass =\n        classRegistry.getClass<typeof ActiveSelection>('ActiveSelection');\n      this.setActiveObject(new klass(objects, { canvas: this }), e);\n    }\n\n    // cleanup\n    this._groupSelector = null;\n    return true;\n  }\n\n  /**\n   * Wraps the original toCanvasElement with a function that removes\n   * the context top for the time the function is run.\n   * So we avoid painting side effects on the upper canvas when exporting\n   */\n  toCanvasElement(\n    multiplier = 1,\n    options?: TToCanvasElementOptions,\n  ): HTMLCanvasElement {\n    const { upper } = this.elements;\n    upper.ctx = undefined as unknown as CanvasRenderingContext2D;\n    const htmlElement = super.toCanvasElement(multiplier, options);\n    upper.ctx = upper.el.getContext('2d')!;\n    return htmlElement;\n  }\n\n  /**\n   * @override clear {@link textEditingManager}\n   */\n  clear() {\n    this.textEditingManager.clear();\n    super.clear();\n  }\n\n  /**\n   * @override clear {@link textEditingManager}\n   */\n  destroy() {\n    this.removeListeners();\n    this.textEditingManager.dispose();\n    super.destroy();\n  }\n}\n"],"names":["addEventOptions","passive","getEventPoints","canvas","e","viewportPoint","getViewportPoint","scenePoint","getScenePoint","addListener","el","_len","arguments","length","args","Array","_key","addEventListener","removeListener","_len2","_key2","removeEventListener","syntheticEventConfig","mouse","in","out","targetIn","targetOut","canvasIn","canvasOut","drag","Canvas","SelectableCanvas","constructor","options","undefined","_defineProperty","TextEditingManager","forEach","eventHandler","bind","addOrRemove","_getEventPrefix","enablePointerEvents","functor","forTouch","canvasElement","upperCanvasEl","eventTypePrefix","getWindowFromElement","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onClick","_onDragStart","_onDragEnd","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","removeListeners","doc","getDocumentFromElement","_onMouseUp","_onTouchEnd","clearTimeout","_willAddMouseDown","_cacheTransformEventData","_handleEvent","_resetTransformEventData","target","_hoveredTarget","shared","fire","_hoveredTargets","nestedTarget","findTarget","_currentTransform","_isClick","activeObject","getActiveObject","onDragStart","_dragSource","_onDragProgress","stopEvent","_renderDragEffects","source","dirty","dropTarget","_dropTarget","clearContextTop","ctx","contextTop","save","transform","viewportTransform","renderDragSourceEffect","restore","renderDropTargetEffect","contextTopDirty","currentSubTargets","didDrop","dataTransfer","dropEffect","NONE","_activeObject","subTargets","dragSource","_draggedoverTarget","eventType","currentContainer","canDrop","_fireEnterLeaveEvents","i","subTarget","_basicEventHandler","stopContextMenu","clicks","detail","type","fireEventFromPointerEvent","eventName","secondaryName","extraData","getPointerId","evt","changedTouches","identifier","pointerId","_isMainEvent","isPrimary","touches","mainTouchId","shouldPreventScrolling","allowTouchScrolling","currentActiveObject","__onMouseDown","isDrawingMode","preventDefault","__onMouseUp","setTimeout","shouldStartDragging","__onMouseMove","calcOffset","_shouldRender","_this$_activeObject","isClick","button","fireMiddleClick","fireRightClick","_isCurrentlyDrawing","_onMouseUpInDrawingMode","shouldRender","_finalizeCurrentTransform","actionPerformed","targetWasActive","handleSelection","pointer","corner","found","findControl","isTouchEvent","key","control","selectable","activeOn","setActiveObject","mouseUpHandler","getMouseUpHandler","call","x","y","isMoving","originalControl","controls","originalMouseUpHandler","_setCursorFromEvent","_groupSelector","__corner","requestRenderAll","isEditing","renderTop","_onMouseDownInDrawingMode","discardActiveObject","freeDrawingBrush","onMouseDown","alreadySelected","_onMouseMoveInDrawingMode","onMouseMove","setCursor","freeDrawingCursor","onMouseUp","grouped","handleMultiSelection","_shouldClearSelection","selection","p","deltaY","deltaX","handle","_setupCurrentTransform","mouseDownHandler","getMouseDownHandler","_objectsToRender","_targetInfo","_viewportPoint","_scenePoint","sendPointToPlane","groupSelector","_fireOverOutEvents","_transformObject","textEditingManager","Math","max","fireSyntheticInOutEvents","oldTarget","fireCanvas","data","draggedoverTarget","_ref","targetChanged","outOpt","nextTarget","inOpt","previousTarget","localPointer","group","calcTransformMatrix","shiftKey","altKey","centeredKey","_performTransformAction","action","actionHandler","setCoords","moveCursor","defaultCursor","hoverCursor","activeSelection","isActiveSelection","subTargetCheck","concat","reverse","_target","coord","cursorStyleHandler","isAS","_isSelectionKeyPressed","isDescendantOf","onSelect","getActiveControl","prevActiveObjects","getObjects","targetInfo","searchPossibleTargets","_objects","remove","size","_setActiveObject","item","multiSelectAdd","_fireSelectionEvents","exitEditing","klass","classRegistry","getClass","newActiveSelection","point1","Point","point2","add","tl","min","br","subtract","collectedObjects","collectObjects","left","top","width","height","includeIntersecting","selectionFullyContained","objects","eq","filter","object","toCanvasElement","multiplier","upper","elements","htmlElement","getContext","clear","destroy","dispose"],"mappings":"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"}