{"version":3,"file":"X_Textbox.mjs","sources":["../../../../src/shapes/canvasx/X_Textbox.ts"],"sourcesContent":["import { TClassProperties } from '../../typedefs';\nimport { IText } from '../IText/IText';\nimport { classRegistry } from '../../ClassRegistry';\nimport { createTextboxDefaultControls } from '../../controls/X_commonControls';\nimport { EventName, TextAlign, WidgetType, Origin } from './types';\nimport { Textbox } from '../Textbox';\n\nimport { isTransformCentered, getLocalPoint } from '../../controls/util';\n// @TODO: Many things here are configuration related and shouldn't be on the class nor prototype\n// regexes, list of properties that are not suppose to change by instances, magic consts.\n// this will be a separated effort\nexport const textboxDefaultValues: Partial<TClassProperties<X_Textbox>> = {\n  minWidth: 20,\n  dynamicMinWidth: 2,\n  // _wordJoiners: /[ \\t\\r]/,\n  splitByGrapheme: true,\n  objType: 'X_Textbox',\n};\n\n/**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n */\nexport class X_Textbox extends Textbox {\n  /**\n   * Minimum width of textbox, in pixels.\n   * @type Number\n   * @default\n   */\n  declare minWidth: number;\n\n  /* boardx cusotm function */\n  declare objType: string;\n\n  declare hasNoText: boolean;\n  /**\n   * Minimum calculated width of a textbox, in pixels.\n   * fixed to 2 so that an empty textbox cannot go to 0\n   * and is still selectable without text.\n   * @type Number\n   * @default\n   */\n  declare dynamicMinWidth: number;\n\n  declare oneLine: boolean;\n\n  declare fromCopy: boolean;\n  /**\n   * Use this boolean property in order to split strings that have no white space concept.\n   * this is a cheap way to help with chinese/japanese\n   * @type Boolean\n   * @since 2.6.0\n   */\n  declare splitByGrapheme: boolean;\n\n  static textLayoutProperties = [...IText.textLayoutProperties, 'width'];\n\n  static ownDefaults: Record<string, any> = textboxDefaultValues;\n\n  static getDefaults() {\n    return {\n      ...super.getDefaults(),\n      controls: createTextboxDefaultControls(),\n      ...X_Textbox.ownDefaults,\n    };\n  }\n  constructor(text: string, options: any) {\n    super(text, options);\n    // if (this.objType !== 'WBText' && this.objType !== 'WBTextbox') {\n    // this.addControls();\n    // }\n    this.InitializeEvent();\n    this.resetResizeControls();\n  }\n\n  // /**\n  //  * Unlike superclass's version of this function, Textbox does not update\n  //  * its width.\n  //  * @private\n  //  * @override\n  //  */\n  // initDimensions() {\n  //   if (!this.initialized) {\n  //     return;\n  //   }\n  //   this.isEditing && this.initDelayedCursor();\n  //   this._clearCache();\n  //   // clear dynamicMinWidth as it will be different after we re-wrap line\n  //   this.dynamicMinWidth = 0;\n  //   // wrap lines\n  //   this._styleMap = this._generateStyleMap(this._splitText());\n  //   // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n  //   if (this.dynamicMinWidth > this.width) {\n  //     this._set('width', this.dynamicMinWidth);\n  //   }\n  //   if (this.textAlign.indexOf('justify') !== -1) {\n  //     // once text is measured we need to make space fatter to make justified text.\n  //     this.enlargeSpaces();\n  //   }\n  //   // clear cache and re-calculate height\n  //   this.height = this.calcTextHeight();\n  // }\n\n  /**\n   * Generate an object that translates the style object so that it is\n   * broken up by visual lines (new lines and automatic wrapping).\n   * The original text styles object is broken up by actual lines (new lines only),\n   * which is only sufficient for Text / IText\n   * @private\n   */\n  _generateStyleMap(textInfo: any) {\n    let realLineCount = 0,\n      realLineCharCount = 0,\n      charCount = 0;\n    const map: any = {};\n\n    for (let i = 0; i < textInfo.graphemeLines.length; i++) {\n      if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n        realLineCharCount = 0;\n        charCount++;\n        realLineCount++;\n      } else if (\n        !this.splitByGrapheme &&\n        this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) &&\n        i > 0\n      ) {\n        // this case deals with space's that are removed from end of lines when wrapping\n        realLineCharCount++;\n        charCount++;\n      }\n\n      map[i] = { line: realLineCount, offset: realLineCharCount };\n\n      charCount += textInfo.graphemeLines[i].length;\n      realLineCharCount += textInfo.graphemeLines[i].length;\n    }\n\n    return map;\n  }\n\n  /**\n   * Returns true if object has a style property or has it on a specified line\n   * @param {Number} lineIndex\n   * @return {Boolean}\n   */\n  styleHas(property: any, lineIndex: number): boolean {\n    if (this._styleMap && !this.isWrapping) {\n      const map = this._styleMap[lineIndex];\n      if (map) {\n        lineIndex = map.line;\n      }\n    }\n    return super.styleHas(property, lineIndex);\n  }\n\n  /**\n   * Returns true if object has no styling or no styling in a line\n   * @param {Number} lineIndex , lineIndex is on wrapped lines.\n   * @return {Boolean}\n   */\n  isEmptyStyles(lineIndex: number): boolean {\n    if (!this.styles) {\n      return true;\n    }\n    let offset: number = 0,\n      nextLineIndex = lineIndex + 1,\n      nextOffset: any,\n      shouldLimit = false;\n    const map = this._styleMap[lineIndex],\n      mapNextLine = this._styleMap[lineIndex + 1];\n    if (map) {\n      lineIndex = map.line;\n      offset = map.offset;\n    }\n    if (mapNextLine) {\n      nextLineIndex = mapNextLine.line;\n      shouldLimit = nextLineIndex === lineIndex;\n      nextOffset = mapNextLine.offset;\n    }\n    const obj =\n      typeof lineIndex === 'undefined'\n        ? this.styles\n        : { line: this.styles[lineIndex] };\n    for (const p1 in obj as any) {\n      for (const p2 in obj[p1] as any) {\n        if (Number(p2) >= offset && (!shouldLimit || Number(p2) < nextOffset)) {\n          // eslint-disable-next-line no-unused-vars\n          for (const p3 in obj[p1][p2]) {\n            return false;\n          }\n        }\n      }\n    }\n    return true;\n  }\n\n  // /**\n  //  * @param {Number} lineIndex\n  //  * @param {Number} charIndex\n  //  * @private\n  //  */\n  // _getStyleDeclaration(lineIndex: number, charIndex: number) {\n  //   if (this._styleMap && !this.isWrapping) {\n  //     const map = this._styleMap[lineIndex];\n  //     if (!map) {\n  //       return null;\n  //     }\n  //     lineIndex = map.line;\n  //     charIndex = map.offset + charIndex;\n  //   }\n  //   return super._getStyleDeclaration(lineIndex, charIndex);\n  // }\n\n  /**\n   * @param {Number} lineIndex\n   * @param {Number} charIndex\n   * @param {Object} style\n   * @private\n   */\n  _setStyleDeclaration(lineIndex: number, charIndex: number, style: object) {\n    const map = this._styleMap[lineIndex];\n    lineIndex = map.line;\n    charIndex = map.offset + charIndex;\n\n    this.styles[lineIndex][charIndex] = style;\n  }\n\n  /**\n   * @param {Number} lineIndex\n   * @param {Number} charIndex\n   * @private\n   */\n  _deleteStyleDeclaration(lineIndex: number, charIndex: number) {\n    const map = this._styleMap[lineIndex];\n    lineIndex = map.line;\n    charIndex = map.offset + charIndex;\n    delete this.styles[lineIndex][charIndex];\n  }\n\n  /**\n   * probably broken need a fix\n   * Returns the real style line that correspond to the wrapped lineIndex line\n   * Used just to verify if the line does exist or not.\n   * @param {Number} lineIndex\n   * @returns {Boolean} if the line exists or not\n   * @private\n   */\n  _getLineStyle(lineIndex: number): boolean {\n    const map = this._styleMap[lineIndex];\n    return !!this.styles[map.line];\n  }\n\n  /**\n   * Set the line style to an empty object so that is initialized\n   * @param {Number} lineIndex\n   * @param {Object} style\n   * @private\n   */\n  _setLineStyle(lineIndex: number) {\n    const map = this._styleMap[lineIndex];\n    this.styles[map.line] = {};\n  }\n\n  // /**\n  //  * Wraps text using the 'width' property of Textbox. First this function\n  //  * splits text on newlines, so we preserve newlines entered by the user.\n  //  * Then it wraps each line using the width of the Textbox by calling\n  //  * _wrapLine().\n  //  * @param {Array} lines The string array of text that is split into lines\n  //  * @param {Number} desiredWidth width you want to wrap to\n  //  * @returns {Array} Array of lines\n  //  */\n  // _wrapText(lines: Array<any>, desiredWidth: number): Array<any> {\n  //   const wrapped = [];\n  //   this.isWrapping = true;\n  //   for (let i = 0; i < lines.length; i++) {\n  //     wrapped.push(...this._wrapLine(lines[i], i, desiredWidth));\n  //   }\n  //   this.isWrapping = false;\n  //   return wrapped;\n  // }\n\n  /**\n   * Helper function to measure a string of text, given its lineIndex and charIndex offset\n   * It gets called when charBounds are not available yet.\n   * Override if necessary\n   * Use with {@link Textbox#wordSplit}\n   *\n   * @param {CanvasRenderingContext2D} ctx\n   * @param {String} text\n   * @param {number} lineIndex\n   * @param {number} charOffset\n   * @returns {number}\n   */\n  _measureWord(word: any, lineIndex: number, charOffset = 0): number {\n    let width = 0,\n      prevGrapheme;\n    const skipLeft = true;\n    for (let i = 0, len = word.length; i < len; i++) {\n      const box = this._getGraphemeBox(\n        word[i],\n        lineIndex,\n        i + charOffset,\n        prevGrapheme,\n        skipLeft\n      );\n      width += box.kernedWidth;\n      prevGrapheme = word[i];\n    }\n    return width;\n  }\n\n  /**\n   * Override this method to customize word splitting\n   * Use with {@link Textbox#_measureWord}\n   * @param {string} value\n   * @returns {string[]} array of words\n   */\n  wordSplit(value: string): string[] {\n    return value.split(this._wordJoiners);\n  }\n\n  /**\n   * Wraps a line of text using the width of the Textbox and a context.\n   * @param {Array} line The grapheme array that represent the line\n   * @param {Number} lineIndex\n   * @param {Number} desiredWidth width you want to wrap the line to\n   * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n   * @returns {Array} Array of line(s) into which the given text is wrapped\n   * to.\n   */\n  graphemeSplitForRectNotes(textstring: string): string[] {\n    const graphemes = [];\n    const words = textstring.split(/\\b/);\n    for (let i = 0; i < words.length; i++) {\n      // 检查单词是否全为拉丁字母，长度不大于16\n      if (/^[a-zA-Z]{1,16}$/.test(words[i])) {\n        graphemes.push(words[i]);\n      } else {\n        for (let j = 0; j < words[i].length; j++) {\n          graphemes.push(words[i][j]);\n        }\n      }\n    }\n    return graphemes;\n  }\n\n  // _wrapLine(\n  //   _line: any,\n  //   lineIndex: number,\n  //   desiredWidth: number,\n  //   reservedSpace = 0\n  // ): Array<any> {\n  //   const additionalSpace = this._getWidthOfCharSpacing(),\n  //     splitByGrapheme = this.splitByGrapheme,\n  //     graphemeLines = [],\n  //     words: any = splitByGrapheme\n  //       ? this.graphemeSplitForRectNotes(_line)\n  //       : this.wordSplit(_line),\n  //     infix = splitByGrapheme ? '' : ' ';\n\n  //   let lineWidth = 0,\n  //     line: any[] = [],\n  //     // spaces in different languages?\n  //     offset = 0,\n  //     infixWidth = 0,\n  //     largestWordWidth = 0,\n  //     lineJustStarted = true;\n  //   // fix a difference between split and graphemeSplit\n  //   if (words.length === 0) {\n  //     words.push([]);\n  //   }\n  //   desiredWidth -= reservedSpace;\n  //   // measure words\n  //   const data = words.map((word: any) => {\n  //     // if using splitByGrapheme words are already in graphemes.\n  //     word = splitByGrapheme ? word : this.graphemeSplitForRectNotes(word);\n  //     const width = this._measureWord(word, lineIndex, offset);\n  //     largestWordWidth = Math.max(width, largestWordWidth);\n  //     offset += word.length + 1;\n  //     return { word: word, width: width };\n  //   });\n  //   const maxWidth = Math.max(\n  //     desiredWidth,\n  //     largestWordWidth,\n  //     this.dynamicMinWidth\n  //   );\n  //   // layout words\n  //   offset = 0;\n  //   let i;\n  //   for (i = 0; i < words.length; i++) {\n  //     const word = data[i].word;\n  //     const wordWidth = data[i].width;\n  //     offset += word.length;\n\n  //     lineWidth += infixWidth + wordWidth - additionalSpace;\n  //     if (lineWidth > maxWidth && !lineJustStarted) {\n  //       graphemeLines.push(line);\n  //       line = [];\n  //       lineWidth = wordWidth;\n  //       lineJustStarted = true;\n  //     } else {\n  //       lineWidth += additionalSpace;\n  //     }\n\n  //     if (!lineJustStarted && !splitByGrapheme) {\n  //       line.push(infix);\n  //     }\n  //     if (word.length > 1) {\n  //       line = line.concat(word.split(''));\n  //     } else {\n  //       line = line.concat(word);\n  //     }\n\n  //     infixWidth = splitByGrapheme\n  //       ? 0\n  //       : this._measureWord([infix], lineIndex, offset);\n  //     offset++;\n  //     lineJustStarted = false;\n  //   }\n\n  //   i && graphemeLines.push(line);\n\n  //   if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n  //     this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n  //   }\n  //   return graphemeLines;\n  // }\n\n  /**\n   * Detect if the text line is ended with an hard break\n   * text and itext do not have wrapping, return false\n   * @param {Number} lineIndex text to split\n   * @return {Boolean}\n   */\n  isEndOfWrapping(lineIndex: number): boolean {\n    if (!this._styleMap[lineIndex + 1]) {\n      // is last line, return true;\n      return true;\n    }\n    if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n      // this is last line before a line break, return true;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Detect if a line has a linebreak and so we need to account for it when moving\n   * and counting style.\n   * @return Number\n   */\n  missingNewlineOffset(lineIndex: number) {\n    if (this.splitByGrapheme) {\n      return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n    }\n    return 1;\n  }\n\n  /**\n   * Gets lines of text to render in the Textbox. This function calculates\n   * text wrapping on the fly every time it is called.\n   * @param {String} text text to split\n   * @returns {Array} Array of lines in the Textbox.\n   * @override\n   */\n  _splitTextIntoLines(text: string) {\n    const newText = super._splitTextIntoLines(text);\n    if (!this.fromCopy) {\n      if (\n        (this.objType === 'WBText' || this.objType === 'WBTextbox') &&\n        this.textLines &&\n        this.textLines.length > 1 &&\n        this.isEditing\n      ) {\n        this.oneLine = false;\n      } else {\n        this.oneLine = true;\n      }\n    } else {\n      this.oneLine = false;\n    }\n    if (\n      (this.objType === 'WBText' || this.objType === 'WBTextbox') &&\n      newText &&\n      newText.lines &&\n      this.oneLine &&\n      this.isEditing\n    ) {\n      if (newText.lines[0].length > 1) {\n        this.width =\n          this._measureWord(newText.lines[0], 0, 0) > this.width\n            ? this._measureWord(newText.lines[0], 0, 0) + 10\n            : this.width;\n      }\n    }\n    const graphemeLines = this._wrapText(newText.lines, this.width);\n    const lines = new Array(graphemeLines.length);\n    for (let i = 0; i < graphemeLines.length; i++) {\n      lines[i] = graphemeLines[i].join('');\n    }\n    newText.lines = lines;\n    newText.graphemeLines = graphemeLines;\n    return newText;\n  }\n\n  getMinWidth() {\n    return Math.max(this.minWidth, this.dynamicMinWidth);\n  }\n\n  // _removeExtraneousStyles() {\n  //   const linesToKeep = {};\n  //   for (const prop in this._styleMap) {\n  //     if (this._textLines[prop]) {\n  //       linesToKeep[this._styleMap[prop].line] = 1;\n  //     }\n  //   }\n  //   for (const prop in this.styles) {\n  //     if (!linesToKeep[prop]) {\n  //       delete this.styles[prop];\n  //     }\n  //   }\n  // }\n  // addControls() {\n  //   function renderCustomControl(ctx, left, top, fabricObject) {\n  //     const styleOverride1 = {\n  //       cornerSize: 10,\n  //       cornerStrokeColor: this.isHovering ? '#31A4F5' : '#b3cdfd',\n  //       cornerColor: this.isHovering ? '#31A4F5' : '#b3cdfd',\n  //       lineWidth: 2,\n  //     };\n  //     renderCircleControl.call(\n  //       fabricObject,\n  //       ctx,\n  //       left,\n  //       top,\n  //       styleOverride1,\n  //       fabricObject\n  //     );\n  //   }\n\n  //   this.controls.mtaStart = new Control({\n  //     x: 0,\n  //     y: -0.5,\n  //     offsetX: 0,\n  //     offsetY: -20,\n  //     render: renderCustomControl,\n  //     mouseDownHandler: (eventData, transformData) => {\n  //       this.controlMousedownProcess(transformData, 0.0, -0.5);\n  //       return true;\n  //     },\n  //     name: 'mtaStart',\n  //   });\n\n  //   this.controls.mbaStart = new Control({\n  //     x: 0,\n  //     y: 0.5,\n  //     offsetX: 0,\n  //     offsetY: 20,\n  //     render: renderCustomControl,\n  //     mouseDownHandler: (eventData, transformData) => {\n  //       this.controlMousedownProcess(transformData, 0.0, 0.5);\n  //       return true;\n  //     },\n  //     name: 'mbaStart',\n  //   });\n\n  //   this.controls.mlaStart = new Control({\n  //     x: -0.5,\n  //     y: 0,\n  //     offsetX: -20,\n  //     offsetY: 0,\n  //     render: renderCustomControl,\n  //     mouseDownHandler: (eventData, transformData) => {\n  //       this.controlMousedownProcess(transformData, -0.5, 0.0);\n  //       return true;\n  //     },\n  //     name: 'mlaStart',\n  //   });\n\n  //   this.controls.mraStart = new Control({\n  //     x: 0.5,\n  //     y: 0,\n  //     offsetX: 20,\n  //     offsetY: 0,\n  //     render: renderCustomControl,\n  //     mouseDownHandler: (eventData, transformData) => {\n  //       this.controlMousedownProcess(transformData, 0.5, 0.0);\n  //       return true;\n  //     },\n  //     name: 'mraStart',\n  //   });\n  // }\n\n  controlMousedownProcess(transformData: any, rx: any, ry: any) {\n    return;\n  }\n  /**\n   * Returns object representation of an instance\n   * @method toObject\n   * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n   * @return {Object} object representation of an instance\n   */\n\n  getObject() {\n    const object = {};\n\n    const keys = [\n      'id', // string, the id of the object\n      'angle', //  integer, angle for recording rotating\n      'backgroundColor', // string,  background color, works when the image is transparent\n      'fill', // the font color\n      'width', // integer, width of the object\n      'height', // integer, height of the object\n      'left', // integer left for position\n      'lines', // array, the arrows array [{…}]\n      'locked', // boolean, lock status for the widget， this is connected to lock\n      'lockMovementX', // boolean, lock the verticle movement\n      'lockMovementY', // boolean, lock the horizontal movement\n      'lockScalingFlip', // boolean,  make it can not be inverted by pulling the width to the negative side\n      'objType', // object type\n      'originX', // string, Horizontal origin of transformation of an object (one of \"left\", \"right\", \"center\") See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n      'originY', // string, Vertical origin of transformation of an object (one of \"top\", \"bottom\", \"center\") See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n      'scaleX', // nunber, Object scale factor (horizontal)\n      'scaleY', // number, Object scale factor (vertical)\n      'selectable', // boolean, When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection). But events still fire on it.\n      'top', // integer, Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom}\n      'userId', // string, user identity\n      'whiteboardId', // whiteboard id, string\n      'zIndex', // the index for the object on whiteboard, integer\n      'version', // version of the app, string\n      'isPanel', // is this a panel, boolean\n      'panelObj', // if this is a panel, the id of the panel, string\n      'relationship', // array, viewporttransform\n      'subObjList', // [\"5H9qYfNGt4vizhcuS\"] array list id for sub objects\n      'fontFamily', // string, font family\n      'fontSize', // integer, font size\n      'fontWeight', // integer, font weight\n      'lineHeight', // integer, font height\n      'text', // string, text\n      'textAlign', // string, alignment\n      'editable',\n      'shapeScaleX',\n      'shapeScaleY',\n      'maxHeight',\n      'tempTop',\n      'fixedScaleChange',\n      'preTop',\n    ];\n    keys.forEach((key) => {\n      //@ts-ignore\n      object[key] = this[key];\n    });\n    return object;\n  }\n\n  // toObject(propertiesToInclude: Array<any>): object {\n  //   return super.toObject(\n  //     ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude)\n  //   );\n  // }\n  /**extend function for fronted */\n  checkTextboxChange() {}\n  InitializeEvent() {\n    const self = this;\n    const canvas = this.canvas;\n\n    self.on(EventName.EDITINGENTERED, () => {\n      // if it is in draw widget mode, then skip update\n      // if (canvas.drawTempWidget) return;\n\n      self.originX = self.textAlign;\n\n      if (self.textAlign === TextAlign.LEFT) {\n        self.left -= (self.width * self.scaleX) / 2;\n      }\n\n      if (self.textAlign === TextAlign.RIGHT) {\n        self.left += (self.width * self.scaleX) / 2;\n      }\n\n      if (self.objType === WidgetType.WBText) {\n        self.originY = 'top';\n\n        self.top -= (self.height * self.scaleY) / 2;\n\n        self.tempTop = self.top;\n\n        if (self.text === 'Type here...') {\n          self.selectAll();\n\n          self.text = '';\n\n          // self.hiddenTextarea.value = '';\n\n          self.dirty = true;\n\n          self.fill = 'rgb(0, 0, 0)';\n\n          canvas?.requestRenderAll();\n        }\n      }\n    });\n\n    self.on(EventName.EDITINGEXITED, () => {\n      // if it is in draw widget mode, then skip update\n      // if (canvas.drawTempWidget) return;\n\n      // if (self.text === '' && self.objType === WidgetType.WBText) {\n      //   canvas.removeWidget(self);\n\n      //   return;\n      // }\n\n      self.originX = Origin.Center;\n\n      self.originY = Origin.Center;\n\n      if (self.textAlign === Origin.Left) {\n        self.left += (self.width * self.scaleX) / 2;\n      }\n\n      if (self.textAlign === Origin.Right) {\n        self.left -= (self.width * self.scaleX) / 2;\n      }\n\n      if (self.objType === WidgetType.WBText) {\n        self.top = self.tempTop + (self.height * self.scaleY) / 2;\n        self.tempTop = self.top;\n      }\n    });\n\n    self.on(EventName.MODIFIED, () => {\n      self.checkTextboxChange();\n\n      // canvas.requestRenderAll();\n    });\n    self.on(EventName.CHANGED, () => {\n      if (self.styles[0]) {\n        self.styles = {};\n\n        // self.canvas.requestRenderAll();\n      }\n    });\n  }\n\n  changeWidth(eventData: any, transform: any, x: any, y: any) {\n    var target = transform.target,\n      localPoint = getLocalPoint(\n        transform,\n        transform.originX,\n        transform.originY,\n        x,\n        y\n      ),\n      strokePadding =\n        target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n      multiplier = isTransformCentered(transform) ? 2 : 1,\n      oldWidth = target.width,\n      newWidth =\n        Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding,\n      shapeScaleX =\n        Math.abs(target.aCoords['tl'].x - target.aCoords['tr'].x) / 138;\n    target.set('shapeScaleX', shapeScaleX);\n    target.set('width', Math.max(newWidth, 0));\n\n    target.initDimensions();\n\n    target.set('dirty', true);\n\n    if (target.objType === 'WBTextbox' || target.objType === 'WBText') {\n      target.set('fixedScaleChange', false);\n    }\n\n    if (target.objType !== 'WBText') {\n      target.saveData('MODIFIED', ['width']);\n    }\n\n    return oldWidth !== newWidth;\n  }\n\n  resetResizeControls() {\n    const self = this;\n    const textAlign = self.textAlign;\n\n    if (\n      self.objType === 'WBText' &&\n      (textAlign === 'left' || textAlign === 'center')\n    ) {\n      self.setControlVisible('ml', false);\n      self.setControlVisible('mr', true);\n    }\n\n    if (self.objType === 'WBText' && textAlign === 'right') {\n      self.setControlVisible('ml', true);\n      self.setControlVisible('mr', false);\n    }\n    if (self.canvas) self.canvas.requestRenderAll();\n  }\n}\n\nclassRegistry.setClass(Textbox);\n// classRegistry.getSVGClass(Textbox);\n"],"names":["textboxDefaultValues","minWidth","dynamicMinWidth","splitByGrapheme","objType","X_Textbox","Textbox","getDefaults","_objectSpread","controls","createTextboxDefaultControls","ownDefaults","constructor","text","options","InitializeEvent","resetResizeControls","_generateStyleMap","textInfo","realLineCount","realLineCharCount","charCount","map","i","graphemeLines","length","graphemeText","_reSpaceAndTab","test","line","offset","styleHas","property","lineIndex","_styleMap","isWrapping","isEmptyStyles","styles","nextLineIndex","nextOffset","shouldLimit","mapNextLine","obj","p1","p2","Number","p3","_setStyleDeclaration","charIndex","style","_deleteStyleDeclaration","_getLineStyle","_setLineStyle","_measureWord","word","charOffset","arguments","undefined","width","prevGrapheme","skipLeft","len","box","_getGraphemeBox","kernedWidth","wordSplit","value","split","_wordJoiners","graphemeSplitForRectNotes","textstring","graphemes","words","push","j","isEndOfWrapping","missingNewlineOffset","_splitTextIntoLines","newText","fromCopy","textLines","isEditing","oneLine","lines","_wrapText","Array","join","getMinWidth","Math","max","controlMousedownProcess","transformData","rx","ry","getObject","object","keys","forEach","key","checkTextboxChange","self","canvas","on","EventName","EDITINGENTERED","originX","textAlign","TextAlign","LEFT","left","scaleX","RIGHT","WidgetType","WBText","originY","top","height","scaleY","tempTop","selectAll","dirty","fill","requestRenderAll","EDITINGEXITED","Origin","Center","Left","Right","MODIFIED","CHANGED","changeWidth","eventData","transform","x","y","target","localPoint","getLocalPoint","strokePadding","strokeWidth","strokeUniform","multiplier","isTransformCentered","oldWidth","newWidth","abs","shapeScaleX","aCoords","set","initDimensions","saveData","setControlVisible","_defineProperty","IText","textLayoutProperties","classRegistry","setClass"],"mappings":"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AA;AAChB,GAAA;AAEAS,EAAAA,WAAWA,GAAG;IACZ,OAAOC,IAAI,CAACC,GAAG,CAAC,IAAI,CAACxF,QAAQ,EAAE,IAAI,CAACC,eAAe,CAAC,CAAA;AACtD,GAAA;;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEAwF,EAAAA,uBAAuBA,CAACC,aAAkB,EAAEC,EAAO,EAAEC,EAAO,EAAE;AAC5D,IAAA,OAAA;AACF,GAAA;AACA;AACF;AACA;AACA;AACA;AACA;;AAEEC,EAAAA,SAASA,GAAG;IACV,MAAMC,MAAM,GAAG,EAAE,CAAA;IAEjB,MAAMC,IAAI,GAAG,CACX,IAAI;AAAE;IACN,OAAO;AAAE;IACT,iBAAiB;AAAE;IACnB,MAAM;AAAE;IACR,OAAO;AAAE;IACT,QAAQ;AAAE;IACV,MAAM;AAAE;IACR,OAAO;AAAE;IACT,QAAQ;AAAE;IACV,eAAe;AAAE;IACjB,eAAe;AAAE;IACjB,iBAAiB;AAAE;IACnB,SAAS;AAAE;IACX,SAAS;AAAE;IACX,SAAS;AAAE;IACX,QAAQ;AAAE;IACV,QAAQ;AAAE;IACV,YAAY;AAAE;IACd,KAAK;AAAE;IACP,QAAQ;AAAE;IACV,cAAc;AAAE;IAChB,QAAQ;AAAE;IACV,SAAS;AAAE;IACX,SAAS;AAAE;IACX,UAAU;AAAE;IACZ,cAAc;AAAE;IAChB,YAAY;AAAE;IACd,YAAY;AAAE;IACd,UAAU;AAAE;IACZ,YAAY;AAAE;IACd,YAAY;AAAE;IAC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"}