{"version":3,"file":"XObject.mjs","sources":["../../../../src/shapes/canvasx/XObject.ts"],"sourcesContent":["//**Fabric */\n//@ts-nocheck\n// import { FabricObject } from '../Object/FabricObject';\nimport { XCanvas } from '../../../fabric';\nimport { XY, Point } from '../../Point';\nimport {\n  invertTransform,\n  multiplyTransformMatrices,\n} from '../../util/misc/matrix';\n\n//**Utils */\nexport class FabricObject2 {\n  // statefullCache = false;\n  // noScaleCache = true;\n  // borderScaleFactor = 2;\n  // padding = 0;\n  // prototypeselectable = true;\n  // isRemoteEditing = false;\n  // RemoteUserWhoEditing = '';\n  // NUM_FRACTION_DIGITS = 2;\n\n  // borderColor = 'red';\n  // cornerSize = 12;\n  // hasRotatingPoint = false;\n  // minScaleLimit = 0.01;\n  // cornerColor = 'black';\n  // cornerStrokeColor = 'black';\n  // cornerStyle = 'circle';\n  // id = '';\n  // idsInGroup: string[] = [];\n  // selectable = true;\n  // activeSelectWithoutArrow: any[] = [];\n  // activeSelectionWithArrow: any[] = [];\n\n  transformPointToCanvas(point: XY) {\n    const self = this;\n    const toTransformPoint = new Point(point);\n    const transformedPoint = toTransformPoint.transform(\n      self.calcTransformMatrix()\n    );\n    return transformedPoint;\n  }\n  transformPointFromCanvas(point: XY) {\n    const self = this;\n    const toTransformPoint = new Point(point);\n    const transformedPoint = toTransformPoint.transform(\n      invertTransform(self.calcTransformMatrix())\n    );\n    return transformedPoint;\n  }\n\n  transformPointToViewport(point: XY) {\n    const self = this;\n    const toTransformPoint = new Point(point);\n\n    const mCanvas = self.canvas?.viewportTransform;\n    const mObject = self.calcTransformMatrix();\n    const matrix = mCanvas\n      ? multiplyTransformMatrices(mCanvas, mObject)\n      : mObject;\n\n    const transformedPoint = toTransformPoint.transform(matrix);\n    return transformedPoint;\n  }\n\n  text: string = '';\n\n  getText() {\n    if (this.text) return this.text;\n    else return '';\n  }\n\n  saveData(action: string, fields: string[]) {}\n\n  // containsPointNew(point, ismouseup, isFrom) {\n  //   const self = this;\n\n  //   let objContains = false;\n\n  //   if (!self || self === undefined) return objContains;\n\n  //   if (ismouseup) {\n  //     const insideObj = this.extContainsPoint(point);\n\n  //     if (insideObj) {\n  //       objContains = true;\n  //     } else {\n  //       const Apoint = self.convertACoordToRCoord(point.x, point.y);\n\n  //       const currZoom = canvas.getZoom();\n\n  //       const edgeoff = 0.25;\n\n  //       const condition1 =\n  //         Math.abs(Apoint.x) > 0.5 &&\n  //         Math.abs(Apoint.x) < 0.5 + edgeoff &&\n  //         Math.abs(Apoint.y) <= 0.5;\n\n  //       const condition2 =\n  //         Math.abs(Apoint.y) > 0.5 &&\n  //         Math.abs(Apoint.y) < 0.5 + edgeoff &&\n  //         Math.abs(Apoint.x) <= 0.5;\n\n  //       if (condition1) {\n  //         objContains = true;\n  //       } else if (condition2) {\n  //         objContains = true;\n  //       }\n\n  //       // if consider the four middle controls, we can add conditions here\n  //       // using the following values: self.cornerSize, self.controls.xxx.offsetX/offsetY,\n  //       const corSize = self.cornerSize + 10;\n\n  //       let offX;\n\n  //       let offY;\n\n  //       const Lpoint = self.convertRCoordToACoord(-0.6, 0.0);\n\n  //       const Rpoint = self.convertRCoordToACoord(0.6, 0.0);\n\n  //       const Tpoint = self.convertRCoordToACoord(0.0, -0.6);\n\n  //       const Bpoint = self.convertRCoordToACoord(0.0, 0.6);\n\n  //       offX = self.controls.mla.offsetX;\n\n  //       const mlxmin = Lpoint.x + (offX - 0.5 * corSize) / currZoom;\n\n  //       const mlxmax = Lpoint.x + (offX + 0.5 * corSize) / currZoom;\n\n  //       const mlrymin = Lpoint.y + (-0.5 * corSize) / currZoom;\n\n  //       const mlrymax = Lpoint.y + (0.5 * corSize) / currZoom;\n\n  //       if (\n  //         point.x > mlxmin &&\n  //         point.x < mlxmax &&\n  //         point.y > mlrymin &&\n  //         point.y < mlrymax\n  //       ) {\n  //         // the mouse up at mla\n  //         if (isFrom) {\n  //           canvas.arrowStartObject = self;\n\n  //           canvas.arrowStartRx = -0.5;\n\n  //           canvas.arrowStartRy = 0.0;\n  //         } else {\n  //           canvas.arrowEndObject = self;\n\n  //           canvas.arrowEndRx = -100;\n\n  //           canvas.arrowEndRy = 100;\n  //         }\n\n  //         objContains = true;\n  //       }\n\n  //       // mra\n  //       offX = self.controls.mra.offsetX;\n\n  //       const mrxmin = Rpoint.x + (offX - 0.5 * corSize) / currZoom;\n\n  //       const mrxmax = Rpoint.x + (offX + 0.5 * corSize) / currZoom;\n\n  //       if (\n  //         point.x > mrxmin &&\n  //         point.x < mrxmax &&\n  //         point.y > mlrymin &&\n  //         point.y < mlrymax\n  //       ) {\n  //         // the mouse up at mra\n  //         if (isFrom) {\n  //           canvas.arrowStartObject = self;\n\n  //           canvas.arrowStartRx = 0.5;\n\n  //           canvas.arrowStartRy = 0.0;\n  //         } else {\n  //           canvas.arrowEndObject = self;\n\n  //           canvas.arrowEndRx = 0.5;\n\n  //           canvas.arrowEndRy = 0.0;\n  //         }\n\n  //         objContains = true;\n  //       }\n\n  //       // mta\n  //       offY = self.controls.mta.offsetY;\n\n  //       const mtbxmin = Tpoint.x + (-0.5 * corSize) / currZoom;\n\n  //       const mtbxmax = Tpoint.x + (+0.5 * corSize) / currZoom;\n\n  //       const mtymin = Tpoint.y + (offY - 0.5 * corSize) / currZoom;\n\n  //       const mtymax = Tpoint.y + (offY + 0.5 * corSize) / currZoom;\n\n  //       if (\n  //         point.x > mtbxmin &&\n  //         point.x < mtbxmax &&\n  //         point.y > mtymin &&\n  //         point.y < mtymax\n  //       ) {\n  //         // the mouse up at mta\n  //         if (isFrom) {\n  //           canvas.arrowStartObject = self;\n  //           canvas.arrowStartRx = 0.0;\n  //           canvas.arrowStartRy = -0.5;\n  //         } else {\n  //           canvas.arrowEndObject = self;\n  //           canvas.arrowEndRx = 0.0;\n  //           canvas.arrowEndRy = -0.5;\n  //         }\n\n  //         objContains = true;\n  //       }\n\n  //       // mba\n  //       offY = self.controls.mba.offsetY;\n  //       const mbymin = Bpoint.y + (offY - 0.5 * corSize) / currZoom;\n  //       const mbymax = Bpoint.y + (offY + 0.5 * corSize) / currZoom;\n\n  //       if (\n  //         point.x > mtbxmin &&\n  //         point.x < mtbxmax &&\n  //         point.y > mbymin &&\n  //         point.y < mbymax\n  //       ) {\n  //         // the mouse up at mba\n  //         if (isFrom) {\n  //           canvas.arrowStartObject = self;\n  //           canvas.arrowStartRx = 0.0;\n  //           canvas.arrowStartRy = 0.5;\n  //         } else {\n  //           canvas.arrowEndObject = self;\n  //           canvas.arrowEndRx = 0.0;\n  //           canvas.arrowEndRy = 0.5;\n  //         }\n\n  //         objContains = true;\n  //       }\n  //     }\n  //   } else {\n  //     objContains = this.extContainsPoint(point);\n  //   }\n\n  //   return objContains;\n  // }\n\n  // frameExtentContainsPoint(point) {\n  //   const self = this;\n\n  //   let minx;\n\n  //   let maxx;\n\n  //   let miny;\n\n  //   let maxy;\n\n  //   if (self.group) {\n  //     const point1 = Boardx.Util.getOnePointOnCanvasInGroupFrame(self, {\n  //       x: self.aCoords.tl.x,\n  //       y: self.aCoords.tl.y,\n  //     });\n  //     const point2 = Boardx.Util.getOnePointOnCanvasInGroupFrame(self, {\n  //       x: self.aCoords.br.x,\n  //       y: self.aCoords.br.y,\n  //     });\n  //     minx = point1.x;\n  //     maxx = point2.x;\n  //     miny = point1.y;\n  //     maxy = point2.y;\n  //   } else {\n  //     minx = self.aCoords.tl.x;\n  //     maxx = self.aCoords.br.x;\n  //     miny = self.aCoords.tl.y;\n  //     maxy = self.aCoords.br.y;\n  //   }\n  //   if (\n  //     point.x >= minx &&\n  //     point.x <= maxx &&\n  //     point.y >= miny &&\n  //     point.y <= maxy\n  //   ) {\n  //     return true;\n  //   }\n\n  //   return false;\n  // }\n\n  convertACoordToRCoord(ax: any, ay: any) {\n    const target = this;\n    const canvas = this.canvas as XCanvas;\n\n    const obj = canvas?.findById(target.id);\n\n    if (!obj) return null;\n\n    const { left, top, width, height, scaleX, scaleY, angle } = obj;\n\n    // be sure, the origin is at center\n    const angleT = (angle * Math.PI) / 180;\n\n    const deltaX = ax - left;\n\n    const deltaY = ay - top;\n\n    const rx =\n      (deltaX * Math.cos(angleT) + deltaY * Math.sin(angleT)) /\n      (width * scaleX);\n\n    const ry =\n      (-deltaX * Math.sin(angleT) + deltaY * Math.cos(angleT)) /\n      (height * scaleY);\n\n    return {\n      x: parseFloat(rx.toFixed(3)),\n      y: parseFloat(ry.toFixed(3)),\n    };\n  }\n\n  convertRCoordToACoord1(rx: number, ry: number) {\n    const target = this;\n    const canvas = this.canvas as XCanvas;\n    const obj = canvas.findById(target.id);\n\n    if (!obj) return null;\n\n    const { left, top, width, height, scaleX, scaleY, angle } = obj;\n\n    const angle1 = (angle * Math.PI) / 180;\n\n    let offsetX = 0;\n\n    let offsetY = 0;\n\n    if (rx <= 0 && ry <= 0) {\n      if (rx < ry) {\n        rx = -0.5;\n        ry = 0;\n        offsetX = 0;\n      } else {\n        rx = 0;\n        ry = -0.5;\n        offsetY = 0;\n      }\n    }\n\n    if (rx <= 0 && ry >= 0) {\n      if (Math.abs(rx) > ry) {\n        rx = -0.5;\n        ry = 0;\n        offsetX = 0;\n      } else {\n        rx = 0;\n        ry = 0.5;\n        offsetY = 0;\n      }\n    }\n\n    if (rx >= 0 && ry >= 0) {\n      if (rx > ry) {\n        rx = 0.5;\n        ry = 0;\n        offsetX = 0;\n      } else {\n        rx = 0;\n        ry = 0.5;\n        offsetY = 0;\n      }\n    }\n\n    if (rx >= 0 && ry <= 0) {\n      if (rx > Math.abs(ry)) {\n        rx = 0.5;\n        ry = 0;\n        offsetX = 0;\n      } else {\n        rx = 0;\n        ry = -0.5;\n        offsetY = 0;\n      }\n    }\n\n    const ax =\n      (rx * Math.cos(angle1) + ry * Math.sin(angle1)) * (width * scaleX) +\n      left +\n      offsetX;\n\n    const ay =\n      (-rx * Math.sin(angle1) + ry * Math.cos(angle1)) * (height * scaleY) +\n      top +\n      offsetY;\n\n    return {\n      x: parseFloat(ax.toFixed(3)),\n      y: parseFloat(ay.toFixed(3)),\n    };\n  }\n\n  convertRCoordToACoord(rx: number, ry: number) {\n    const target = this;\n    const canvas = this.canvas as XCanvas;\n    const obj = canvas.findById(target.id);\n    if (!obj) return null;\n\n    const { left, top, width, height, scaleX, scaleY, angle } = obj;\n\n    const angle1 = (angle * Math.PI) / 180;\n\n    const ax =\n      (rx * Math.cos(angle1) + ry * Math.sin(angle1)) * (width * scaleX) + left;\n\n    const ay =\n      (-rx * Math.sin(angle1) + ry * Math.cos(angle1)) * (height * scaleY) +\n      top;\n\n    return {\n      x: parseFloat(ax.toFixed(3)),\n      y: parseFloat(ay.toFixed(3)),\n    };\n  }\n\n  convertRCoordToACoordPartialAS(rx: number, ry: number) {\n    const target = this;\n    const canvas = this.canvas as XCanvas;\n    const obj = canvas.findById(target.id);\n\n    if (obj && obj.group) {\n      const angle = ((canvas?.findById(target.id)?.angle ?? 0) * Math.PI) / 180;\n\n      const scaleY =\n        (canvas?.findById(target.id)?.scaleY ?? 0) * obj.group.scaleY;\n\n      if (rx < -0.5) rx = -0.5;\n\n      if (ry < -0.5) ry = -0.5;\n\n      if (rx > 0.5) rx = 0.5;\n\n      if (ry > 0.5) ry = 0.5;\n\n      const ax =\n        (rx * Math.cos(angle) + ry * Math.sin(angle)) *\n          (this.width * this.scaleX) +\n        this.left;\n\n      const ay =\n        (-rx * Math.sin(angle) + ry * Math.cos(angle)) *\n          (this.height * scaleY) +\n        this.top;\n\n      const aax = parseFloat(ax.toFixed(3)); // this reduces digits after decimal not working\n\n      const aay = parseFloat(ay.toFixed(3));\n\n      const point = {\n        x: aax,\n        y: aay,\n      };\n\n      return point;\n    }\n  }\n\n  // async saveData(action, fields) {\n  //   const target = this;\n\n  //   const context = {};\n\n  //   context.fields = fields;\n\n  //   this.idsInGroup = [];\n\n  //   ASnoarrow = [];\n\n  //   ASarrow = [];\n\n  //   if (\n  //     target.objType === 'WBRectNotes' ||\n  //     target.objType === 'XCircleNotes'\n  //   ) {\n  //     target.lastEditedBy = store.getState().user.userInfo.userId;\n  //   }\n\n  //   canvas.requestRenderAll();\n\n  //   // update group\n  //   if (target.parent) {\n  //     let newState = [];\n\n  //     for (const obj of target.getObjects()) {\n  //       if (obj.id) {\n  //         this.idsInGroup.push(obj.id);\n\n  //         if (obj.objType === 'XConnector') {\n  //           this.activeSelectionWithArrow.push(obj.id);\n  //         }\n\n  //         if (obj.objType !== 'XConnector') {\n  //           this.activeSelectWithoutArrow.push(obj.id);\n  //         }\n\n  //         if (\n  //           obj.objType === 'WBRectNotes' ||\n  //           obj.objType === 'XCircleNotes'\n  //         ) {\n  //           obj.lastEditedBy = store.getState().user.userInfo.userId;\n  //         }\n  //       }\n  //     }\n  //     if (action === 'SCALED') {\n  //       for (let i = 0; i < this.activeSelectWithoutArrow.length; i++) {\n  //         const obj = canvas.findById(this.activeSelectWithoutArrow[i]);\n\n  //         if (obj.objType === 'WBShapeNotes') {\n  //           const state = obj.getModifiedObject([\n  //             'width',\n  //             'height',\n  //             'left',\n  //             'top',\n  //             'shapeScaleX',\n  //             'scaleX',\n  //             'scaleY',\n  //             'flipX',\n  //             'flipY',\n  //             'maxHeight',\n  //             'fixedScaleChange',\n  //           ]);\n\n  //           newState = newState.concat(state);\n  //         } else {\n  //           const state = obj.getUndoRedoState(action, context);\n\n  //           newState = newState.concat(state);\n  //         }\n  //       }\n  //       // update arrow\n  //       for (let i = 0; i < this.activeSelectionWithArrow.length; i++) {\n  //         const obj = canvas.findById(this.activeSelectionWithArrow[i]);\n\n  //         const state = obj.getUndoRedoState(action, context);\n\n  //         newState = newState.concat(state);\n  //       }\n\n  //       canvas.pushNewState(newState);\n\n  //       const objArras = [];\n\n  //       let obj = null;\n\n  //       for (let i = 0; i < this.activeSelectionWithArrow.length; i++) {\n  //         obj = canvas.findById(this.activeSelectionWithArrow[i]);\n\n  //         obj.resetStrokeAfterScaling();\n\n  //         objArras.push(obj);\n  //       }\n  //       for (let i = 0; i < this.activeSelectWithoutArrow.length; i++) {\n  //         obj = canvas.findById(this.activeSelectWithoutArrow[i]);\n  //         objArras.push(obj);\n  //       }\n  //     } else if (action === 'MOVED') {\n  //       for (let i = 0; i < this.activeSelectWithoutArrow.length; i++) {\n  //         const obj = canvas.findById(this.activeSelectWithoutArrow[i]);\n  //         const state = obj.getUndoRedoState(action, context);\n  //         newState = newState.concat(state);\n  //       }\n\n  //       for (let i = 0; i < this.activeSelectionWithArrow.length; i++) {\n  //         const obj = canvas.findById(this.activeSelectionWithArrow[i]);\n  //         const state = obj.getUndoRedoState(action, context);\n  //         newState = newState.concat(state);\n  //       }\n\n  //       canvas.pushNewState(newState);\n  //     } else {\n  //       for (let i = 0; i < this.idsInGroup.length; i++) {\n  //         const obj = canvas.findById(this.idsInGroup[i]);\n  //         const state = obj.getUndoRedoState(action, context);\n  //         newState = newState.concat(state);\n  //       }\n\n  //       canvas.pushNewState(newState);\n  //     }\n  //   } else if (\n  //     target.objType &&\n  //     target.objType !== 'common' &&\n  //     !target.isPanelTitle\n  //   ) {\n  //     if (\n  //       target.objType === 'WBRectPanel' &&\n  //       fields &&\n  //       fields.length === 1 &&\n  //       fields[0] === 'zIndex'\n  //     ) {\n  //       const frameSubs = target.subIdList();\n  //       if (frameSubs < 1) {\n  //         const newState = target.getUndoRedoState(action, context);\n  //         canvas.pushNewState(newState);\n  //       } else {\n  //         let newState = [];\n  //         const fmState = target.getUndoRedoState(action, context);\n  //         newState = newState.concat(fmState);\n  //         for (let i = 0; i < frameSubs.length; i++) {\n  //           const obj = canvas.findById(frameSubs[i]);\n  //           const state = obj.getUndoRedoState(action, context);\n  //           newState = newState.concat(state);\n  //         }\n  //         canvas.pushNewState(newState);\n  //       }\n  //       // } else if (action === 'SCALED' && target.objType === 'WBShapeNotes') {\n  //       //   // skip, already handled in other place\n  //     } else {\n  //       const newState = target.getUndoRedoState(action, context);\n  //       canvas.pushNewState(newState);\n  //     }\n\n  //     if (\n  //       target.objType === 'WBRectNotes' ||\n  //       target.objType === 'XCircleNotes'\n  //     ) {\n  //       canvas.changeDefaulNote(target);\n  //       target.styles = {};\n  //     }\n  //   }\n  // }\n\n  // initialize(options) {\n  //   const self = this;\n  //   this.guides = {};\n  //   if (options) {\n  //     this.setOptions(options);\n  //   }\n  //   self.on('mouseover', (e) => {\n  //     if (\n  //       store.getState().board.drawingEraseMode ||\n  //       store.getState().mode.type !== 'default'\n  //     ) {\n  //       return;\n  //     }\n  //     if (\n  //       store.getState().board.isPanMode ||\n  //       e.e.which === 2 ||\n  //       e.e.which === 3\n  //     ) {\n  //       self.hoverCursor = 'grab';\n  //       self.dirty = true;\n  //       canvas.requestRenderAll();\n  //       return;\n  //     }\n\n  //     if (self.selectable === false) {\n  //       if (store.getState().modal.interactionMode === 'mouse') {\n  //         // if switch between mouse & trackpad mode,\n  //         // user may need to refresh the page to have it functioning correctly\n  //         if (store.getState().board.drawingEraseMode) {\n  //           self.hoverCursor =\n  //             \"url(\\\"data:image/svg+xml,%3Csvg width='20' height='17' viewBox='0 0 20 17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12.9596 14.1754L17.6647 8.94993L15.4332 6.94073L10.6822 12.1248L12.9596 14.1754ZM13.9469 5.60242L11.9887 3.83931C9.52618 1.62201 5.73239 1.82083 3.51509 4.28339L2.82482 5.05001L9.19585 10.7865L13.9469 5.60242ZM11.6214 15.6617C12.4422 16.4008 13.7068 16.3345 14.4459 15.5137L19.151 10.2882C19.8901 9.46734 19.8238 8.20274 19.0029 7.46364L13.327 2.35302C10.0436 -0.603384 4.9852 -0.338289 2.0288 2.94513L1.33853 3.71175C0.59943 4.53261 0.665705 5.7972 1.48656 6.5363L11.6214 15.6617Z' fill='%23232930'/%3E%3C/svg%3E\\\") 0 0, auto\";\n  //         } else if (self.locked === true) {\n  //           const isPan = store.getState().board.isPanMode;\n  //           if (isPan) {\n  //             self.hoverCursor = 'grab';\n  //           } else {\n  //             const cursorLock =\n  //               \"data:image/svg+xml,%3Csvg width='10' height='13' viewBox='0 0 10 13' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4.832 0.755L5 0.75C5.70029 0.749965 6.37421 1.01709 6.8843 1.49689C7.39439 1.97669 7.70222 2.63302 7.745 3.332L7.75 3.5V4H8.5C8.89782 4 9.27936 4.15804 9.56066 4.43934C9.84196 4.72064 10 5.10218 10 5.5V11.5C10 11.8978 9.84196 12.2794 9.56066 12.5607C9.27936 12.842 8.89782 13 8.5 13H1.5C1.10218 13 0.720644 12.842 0.43934 12.5607C0.158035 12.2794 0 11.8978 0 11.5V5.5C0 5.10218 0.158035 4.72064 0.43934 4.43934C0.720644 4.15804 1.10218 4 1.5 4H2.25V3.5C2.24997 2.79971 2.51709 2.12579 2.99689 1.6157C3.47669 1.10561 4.13302 0.797781 4.832 0.755L5 0.75L4.832 0.755ZM5 7.5C4.73478 7.5 4.48043 7.60536 4.29289 7.79289C4.10536 7.98043 4 8.23478 4 8.5C4 8.76522 4.10536 9.01957 4.29289 9.20711C4.48043 9.39464 4.73478 9.5 5 9.5C5.26522 9.5 5.51957 9.39464 5.70711 9.20711C5.89464 9.01957 6 8.76522 6 8.5C6 8.23478 5.89464 7.98043 5.70711 7.79289C5.51957 7.60536 5.26522 7.5 5 7.5ZM5.128 2.256L5 2.25C4.69054 2.24986 4.39203 2.36451 4.16223 2.57177C3.93244 2.77903 3.78769 3.06417 3.756 3.372L3.75 3.5V4H6.25V3.5C6.25014 3.19054 6.13549 2.89203 5.92823 2.66223C5.72097 2.43244 5.43583 2.28769 5.128 2.256L5 2.25L5.128 2.256Z' fill='%23232930'/%3E%3C/svg%3E\";\n  //             self.hoverCursor = `url(\"${cursorLock}\") 0 0, auto`;\n  //           }\n  //         } else {\n  //           self.hoverCursor = 'default';\n  //         }\n  //       } else {\n  //         self.hoverCursor = 'default';\n  //       }\n  //     } else if (self.objType === 'WBUrlImage') {\n  //       self.hoverCursor = 'pointer';\n  //     } else {\n  //       self.hoverCursor = 'default';\n  //     }\n  //   });\n  //   self.on('moving', (e) => {\n  //     console.log(e);\n  //   });\n  // }\n\n  // getCloneWidget() {\n  //   const widget = _.clone(this.getObject());\n  //   if (widget.connectorStart)\n  //     widget.connectorStart = { id: this.connectorStart.id };\n  //   if (widget.connectorEnd)\n  //     widget.connectorEnd = { id: this.connectorEnd.id };\n  //   delete widget.id;\n  //   delete widget.emoji;\n  //   widget.isPanel = null;\n  //   if (this.getObject().lines) {\n  //     widget.lines = this.getObject().lines;\n  //   } else {\n  //     widget.lines = null;\n  //   }\n  //   widget.panelObj = null;\n  //   widget.relationship = null;\n  //   widget.selectable = true;\n  //   widget.userEmoji = null;\n  //   widget.zIndex = Date.now() * 100;\n  //   return widget;\n  // }\n\n  // bringObjToFront() {\n  //   const obj = this;\n  //   const intersectingObjects = canvas._getIntersectedObjects(obj);\n  //   if (obj.panelObj) {\n  //     /* overlap with frame */\n  //     const parentPanel = intersectingObjects.filter(\n  //       (o) => o.id === obj.panelObj\n  //     )[0];\n  //     if (parentPanel) {\n  //       /* bring front on a frame is to the top on the frame */\n  //       canvas.toFrameTop(parentPanel, obj);\n  //     } else {\n  //       const newIndex = canvas.createTopZIndex();\n  //       obj.zIndex = newIndex;\n  //       canvas.sortByZIndex();\n  //       obj.saveData('MODIFIED', ['zIndex']);\n  //       /* question: how about stick note with arrow,\n  //     what happens when bring front the note: shall also update arrow zindex */\n  //     }\n  //   } else {\n  //     const newIndex = canvas.createTopZIndex();\n  //     obj.zIndex = newIndex;\n  //     obj.dirty = true;\n  //     canvas.sortByZIndex();\n  //     obj.saveData('MODIFIED', ['zIndex']);\n  //   }\n  // }\n\n  // sendObjToBack() {\n  //   const obj = this;\n  //   let newIndex;\n  //   const intersectingObjects = canvas._getIntersectedObjects(obj);\n  //   if (intersectingObjects.length === 1) {\n  //     /* no overlap */\n  //     const nexZIndex = canvas._objects[0].zIndex;\n  //     newIndex = nexZIndex - 100;\n  //     obj.zIndex = newIndex;\n  //     canvas.sortByZIndex();\n  //     obj.saveData('MODIFIED', ['zIndex']);\n  //   } else if (obj.panelObj) {\n  //     /* overlap with frame */\n  //     const parentPanel = intersectingObjects.filter(\n  //       (o) => o.id === obj.panelObj\n  //     )[0];\n  //     if (parentPanel) {\n  //       /* send back on a frame is to the bottom on the frame */\n  //       canvas.toFrameBottom(parentPanel, obj);\n  //     }\n  //   } else {\n  //     /* with overlap, but not on a frame */\n  //     const nexZIndex = canvas._objects[0].zIndex;\n  //     newIndex = nexZIndex - 100;\n  //     obj.zIndex = newIndex;\n  //     obj.dirty = true;\n  //     canvas.sortByZIndex();\n  //     obj.saveData('MODIFIED', ['zIndex']);\n  //   }\n  // }\n\n  // bringObjForward() {\n  //   const obj = this;\n  //   const intersectingObjects = canvas._getIntersectedObjects(obj);\n  //   if (intersectingObjects.length > 1) {\n  //     intersectingObjects.sort((a, b) => a.zIndex - b.zIndex);\n  //     const index = intersectingObjects.indexOf(obj);\n  //     if (index < intersectingObjects.length - 1) {\n  //       if (obj.panelObj) {\n  //         const parentPanel = intersectingObjects.filter(\n  //           (o) => o.id === obj.panelObj\n  //         )[0];\n  //         if (parentPanel) {\n  //           /* bring forward on a frame is to the bottom on the frame */\n  //           canvas.onFrameForward(parentPanel, obj);\n  //           /* question: onFrameForward only handling the frame's subOBj, what happens\n  //           if need bring over an object not in the frame */\n  //         }\n  //       } else {\n  //         const newIndex = canvas.createUniqueZIndex(\n  //           intersectingObjects[index + 1].zIndex,\n  //           true\n  //         );\n  //         obj.zIndex = newIndex;\n  //         canvas.sortByZIndex();\n  //         obj.dirty = true;\n  //         obj.saveData('MODIFIED', ['zIndex']);\n  //       }\n  //     }\n  //   }\n  // }\n\n  // sendObjBackwards() {\n  //   const obj = this;\n  //   const intersectingObjects = canvas._getIntersectedObjects(obj);\n  //   intersectingObjects.sort((a, b) => a.zIndex - b.zIndex);\n  //   const index = intersectingObjects.indexOf(obj);\n  //   if (intersectingObjects.length > 1) {\n  //     if (index > 0) {\n  //       if (obj.panelObj) {\n  //         const parentPanel = intersectingObjects.filter(\n  //           (o) => o.id === obj.panelObj\n  //         )[0];\n  //         if (parentPanel) {\n  //           /* send back on a frame is to the bottom on the frame */\n  //           canvas.onFrameBackward(parentPanel, obj);\n  //         }\n  //       } else {\n  //         const newIndex = canvas.createUniqueZIndex(\n  //           intersectingObjects[index - 1].zIndex,\n  //           false\n  //         );\n  //         obj.zIndex = newIndex;\n  //         obj.dirty = true;\n  //         canvas.sortByZIndex();\n  //         obj.saveData('MODIFIED', ['zIndex']);\n  //       }\n  //     }\n  //   }\n  // }\n\n  // reSetControl() {\n  //   const obj = this;\n  //   if (obj && obj.controls && obj.objType !== 'XConnector') {\n  //     if (obj.controls.mlaStart) {\n  //       obj.controls.mlaStart.offsetX = -20 * canvas.getZoom() * obj.scaleX;\n  //       obj.controls.mraStart.offsetX = 20 * canvas.getZoom() * obj.scaleX;\n  //       obj.controls.mtaStart.offsetY = -20 * canvas.getZoom() * obj.scaleY;\n  //       obj.controls.mbaStart.offsetY = 20 * canvas.getZoom() * obj.scaleY;\n  //     }\n  //   }\n  // }\n\n  // drawBordersInGroup(ctx, options, styleOverride) {\n  //   styleOverride = styleOverride || {};\n\n  //   var bbox = fabric.util.sizeAfterTransform(this.width, this.height, options),\n  //     strokeWidth = this.strokeWidth,\n  //     strokeUniform = this.strokeUniform,\n  //     borderScaleFactor = this.borderScaleFactor,\n  //     width =\n  //       bbox.x +\n  //       strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleX) +\n  //       borderScaleFactor,\n  //     height =\n  //       bbox.y +\n  //       strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleY) +\n  //       borderScaleFactor;\n  //   ctx.save();\n  //   this._setLineDash(\n  //     ctx,\n  //     styleOverride.borderDashArray || this.borderDashArray\n  //   );\n  //   let color = '#B3CDFD80';\n  //   ctx.strokeStyle = color;\n  //   ctx.strokeRect(-width / 2, -height / 2, width, height);\n  //   ctx.restore();\n  //   return this;\n  // }\n\n  // /**\n  //  * Draws borders of an object's bounding box.\n  //  * Requires public properties: width, height\n  //  * Requires public options: padding, borderColor\n  //  * @param {CanvasRenderingContext2D} ctx Context to draw on\n  //  * @param {Object} styleOverride object to override the object style\n  //  * @return {FabricObject} thisArg\n  //  * @chainable\n  //  */\n  // drawBorders (ctx, styleOverride) {\n  //   styleOverride = styleOverride || {};\n  //   var wh = this._calculateCurrentDimensions(),\n  //     strokeWidth = this.borderScaleFactor,\n  //     width = wh.x + strokeWidth,\n  //     height = wh.y + strokeWidth,\n  //     hasControls =\n  //       typeof styleOverride.hasControls !== 'undefined'\n  //         ? styleOverride.hasControls\n  //         : this.hasControls,\n  //     shouldStroke = false;\n  //   ctx.save();\n  //   ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n  //   this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray);\n  //   ctx.strokeRect(-width / 2, -height / 2, width, height);\n  //   if (hasControls) {\n  //     ctx.beginPath();\n  //     this.forEachControl(function (control, key, fabricObject) {\n  //       if (control.actionName === 'rotate') return;\n  //       // in this moment, the ctx is centered on the object.\n  //       // width and height of the above function are the size of the bbox.\n  //       if (control.withConnection && control.getVisibility(fabricObject, key)) {\n  //         // reset movement for each control\n  //         shouldStroke = true;\n  //         ctx.moveTo(control.x * width, control.y * height);\n  //         ctx.lineTo(\n  //           control.x * width + control.offsetX,\n  //           control.y * height + control.offsetY\n  //         );\n  //       }\n  //     });\n  //     if (shouldStroke) {\n  //       ctx.stroke();\n  //     }\n  //   }\n  //   ctx.restore();\n  //   return this;\n  // };\n  // isActiveSelection() {\n  //   const obj = this;\n\n  //   if (\n  //     obj.objType === 'WBGroup' &&\n  //     obj._objects &&\n  //     obj._objects.length > 0 &&\n  //     !obj.id\n  //   ) {\n  //     return true;\n  //   } else {\n  //     return false;\n  //   }\n  // }\n  // isGroup() {\n  //   const obj = this;\n\n  //   if (\n  //     obj.objType === 'WBGroup' &&\n  //     obj._objects &&\n  //     obj._objects.length > 0 &&\n  //     obj.id\n  //   ) {\n  //     return true;\n  //   } else {\n  //     return false;\n  //   }\n  // }\n}\n"],"names":["FabricObject2","constructor","_defineProperty","transformPointToCanvas","point","self","toTransformPoint","Point","transformedPoint","transform","calcTransformMatrix","transformPointFromCanvas","invertTransform","transformPointToViewport","_self$canvas","mCanvas","canvas","viewportTransform","mObject","matrix","multiplyTransformMatrices","getText","text","saveData","action","fields","convertACoordToRCoord","ax","ay","target","obj","findById","id","left","top","width","height","scaleX","scaleY","angle","angleT","Math","PI","deltaX","deltaY","rx","cos","sin","ry","x","parseFloat","toFixed","y","convertRCoordToACoord1","angle1","offsetX","offsetY","abs","convertRCoordToACoord","convertRCoordToACoordPartialAS","group","_canvas$findById$angl","_canvas$findById","_canvas$findById$scal","_canvas$findById2","aax","aay"],"mappings":";;;;AAUA;AACO,MAAMA,aAAa,CAAC;EAAAC,WAAA,GAAA;AAAAC,IAAAA,eAAA,eAsDV,EAAE,CAAA,CAAA;AAAA,GAAA;AArDjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;EAEAC,sBAAsBA,CAACC,KAAS,EAAE;IAChC,MAAMC,IAAI,GAAG,IAAI,CAAA;AACjB,IAAA,MAAMC,gBAAgB,GAAG,IAAIC,KAAK,CAACH,KAAK,CAAC,CAAA;IACzC,MAAMI,gBAAgB,GAAGF,gBAAgB,CAACG,SAAS,CACjDJ,IAAI,CAACK,mBAAmB,EAC1B,CAAC,CAAA;AACD,IAAA,OAAOF,gBAAgB,CAAA;AACzB,GAAA;EACAG,wBAAwBA,CAACP,KAAS,EAAE;IAClC,MAAMC,IAAI,GAAG,IAAI,CAAA;AACjB,IAAA,MAAMC,gBAAgB,GAAG,IAAIC,KAAK,CAACH,KAAK,CAAC,CAAA;AACzC,IAAA,MAAMI,gBAAgB,GAAGF,gBAAgB,CAACG,SAAS,CACjDG,eAAe,CAACP,IAAI,CAACK,mBAAmB,EAAE,CAC5C,CAAC,CAAA;AACD,IAAA,OAAOF,gBAAgB,CAAA;AACzB,GAAA;EAEAK,wBAAwBA,CAACT,KAAS,EAAE;AAAA,IAAA,IAAAU,YAAA,CAAA;IAClC,MAAMT,IAAI,GAAG,IAAI,CAAA;AACjB,IAAA,MAAMC,gBAAgB,GAAG,IAAIC,KAAK,CAACH,KAAK,CAAC,CAAA;AAEzC,IAAA,MAAMW,OAAO,GAAA,CAAAD,YAAA,GAAGT,IAAI,CAACW,MAAM,MAAA,IAAA,IAAAF,YAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAXA,YAAA,CAAaG,iBAAiB,CAAA;AAC9C,IAAA,MAAMC,OAAO,GAAGb,IAAI,CAACK,mBAAmB,EAAE,CAAA;IAC1C,MAAMS,MAAM,GAAGJ,OAAO,GAClBK,yBAAyB,CAACL,OAAO,EAAEG,OAAO,CAAC,GAC3CA,OAAO,CAAA;AAEX,IAAA,MAAMV,gBAAgB,GAAGF,gBAAgB,CAACG,SAAS,CAACU,MAAM,CAAC,CAAA;AAC3D,IAAA,OAAOX,gBAAgB,CAAA;AACzB,GAAA;AAIAa,EAAAA,OAAOA,GAAG;IACR,IAAI,IAAI,CAACC,IAAI,EAAE,OAAO,IAAI,CAACA,IAAI,CAAC,KAC3B,OAAO,EAAE,CAAA;AAChB,GAAA;AAEAC,EAAAA,QAAQA,CAACC,MAAc,EAAEC,MAAgB,EAAE,EAAC;;AAE5C;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEAC,EAAAA,qBAAqBA,CAACC,EAAO,EAAEC,EAAO,EAAE;IACtC,MAAMC,MAAM,GAAG,IAAI,CAAA;AACnB,IAAA,MAAMb,MAAM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,GAAGhB,UAAU,CAACtB,EAAE,CAACuB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AAErC,MAAA,MAAM/C,KAAK,GAAG;AACZ6C,QAAAA,CAAC,EAAEgB,GAAG;AACNb,QAAAA,CAAC,EAAEc,GAAAA;OACJ,CAAA;AAED,MAAA,OAAO9D,KAAK,CAAA;AACd,KAAA;AACF,GAAA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF;;;;"}