{"version":3,"file":"ITextBehavior.mjs","sources":["../../../../src/shapes/IText/ITextBehavior.ts"],"sourcesContent":["import type {\n  ObjectEvents,\n  TPointerEvent,\n  TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { FabricText } from '../Text/Text';\nimport { animate } from '../../util/animation/animate';\nimport type { TOnAnimationChangeCallback } from '../../util/animation/types';\nimport type { ValueAnimation } from '../../util/animation/ValueAnimation';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport type { TOptions } from '../../typedefs';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { LEFT, MODIFIED, RIGHT, reNewline } from '../../constants';\nimport type { IText } from './IText';\n\n/**\n *  extend this regex to support non english languages\n *\n *  - ` `      Matches a SPACE character (char code 32).\n *  - `\\n`     Matches a LINE FEED character (char code 10).\n *  - `\\.`     Matches a \".\" character (char code 46).\n *  - `,`      Matches a \",\" character (char code 44).\n *  - `;`      Matches a \";\" character (char code 59).\n *  - `!`      Matches a \"!\" character (char code 33).\n *  - `\\?`     Matches a \"?\" character (char code 63).\n *  - `\\-`     Matches a \"-\" character (char code 45).\n */\n// eslint-disable-next-line no-useless-escape\nconst reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\nexport type ITextEvents = ObjectEvents & {\n  'selection:changed': never;\n  changed: never | { index: number; action: string };\n  tripleclick: TPointerEventInfo;\n  'editing:entered': never | { e: TPointerEvent };\n  'editing:exited': never;\n};\n\nexport abstract class ITextBehavior<\n  Props extends TOptions<TextProps> = Partial<TextProps>,\n  SProps extends SerializedTextProps = SerializedTextProps,\n  EventSpec extends ITextEvents = ITextEvents,\n> extends FabricText<Props, SProps, EventSpec> {\n  declare abstract isEditing: boolean;\n  declare abstract cursorDelay: number;\n  declare abstract selectionStart: number;\n  declare abstract selectionEnd: number;\n  declare abstract cursorDuration: number;\n  declare abstract editable: boolean;\n  declare abstract editingBorderColor: string;\n\n  declare abstract compositionStart: number;\n  declare abstract compositionEnd: number;\n\n  declare abstract hiddenTextarea: HTMLTextAreaElement | null;\n\n  /**\n   * Helps determining when the text is in composition, so that the cursor\n   * rendering is altered.\n   */\n  protected declare inCompositionMode: boolean;\n\n  protected declare _reSpace: RegExp;\n  private declare _currentTickState?: ValueAnimation;\n  private declare _currentTickCompleteState?: ValueAnimation;\n  protected _currentCursorOpacity = 1;\n  private declare _textBeforeEdit: string;\n  protected declare __selectionStartOnMouseDown: number;\n\n  protected declare selected: boolean;\n  protected declare cursorOffsetCache: { left?: number; top?: number };\n  protected declare _savedProps?: {\n    hasControls: boolean;\n    borderColor: string;\n    lockMovementX: boolean;\n    lockMovementY: boolean;\n    selectable: boolean;\n    hoverCursor: CSSStyleDeclaration['cursor'] | null;\n    defaultCursor?: CSSStyleDeclaration['cursor'];\n    moveCursor?: CSSStyleDeclaration['cursor'];\n  };\n  protected declare _selectionDirection: 'left' | 'right' | null;\n\n  abstract initHiddenTextarea(): void;\n  abstract _fireSelectionChanged(): void;\n  abstract renderCursorOrSelection(): void;\n  abstract getSelectionStartFromPointer(e: TPointerEvent): number;\n  abstract _getCursorBoundaries(\n    index: number,\n    skipCaching?: boolean,\n  ): {\n    left: number;\n    top: number;\n    leftOffset: number;\n    topOffset: number;\n  };\n\n  /**\n   * Initializes all the interactive behavior of IText\n   */\n  initBehavior() {\n    this._tick = this._tick.bind(this);\n    this._onTickComplete = this._onTickComplete.bind(this);\n    this.updateSelectionOnMouseMove =\n      this.updateSelectionOnMouseMove.bind(this);\n  }\n\n  onDeselect(options?: { e?: TPointerEvent; object?: FabricObject }) {\n    this.isEditing && this.exitEditing();\n    this.selected = false;\n    return super.onDeselect(options);\n  }\n\n  /**\n   * @private\n   */\n  _animateCursor({\n    toValue,\n    duration,\n    delay,\n    onComplete,\n  }: {\n    toValue: number;\n    duration: number;\n    delay?: number;\n    onComplete?: TOnAnimationChangeCallback<number, void>;\n  }) {\n    return animate({\n      startValue: this._currentCursorOpacity,\n      endValue: toValue,\n      duration,\n      delay,\n      onComplete,\n      abort: () =>\n        !this.canvas ||\n        // we do not want to animate a selection, only cursor\n        this.selectionStart !== this.selectionEnd,\n      onChange: (value) => {\n        this._currentCursorOpacity = value;\n        this.renderCursorOrSelection();\n      },\n    });\n  }\n\n  /**\n   * changes the cursor from visible to invisible\n   */\n  private _tick(delay?: number) {\n    this._currentTickState = this._animateCursor({\n      toValue: 0,\n      duration: this.cursorDuration / 2,\n      delay: Math.max(delay || 0, 100),\n      onComplete: this._onTickComplete,\n    });\n  }\n\n  /**\n   * Changes the cursor from invisible to visible\n   */\n  private _onTickComplete() {\n    this._currentTickCompleteState?.abort();\n    this._currentTickCompleteState = this._animateCursor({\n      toValue: 1,\n      duration: this.cursorDuration,\n      onComplete: this._tick,\n    });\n  }\n\n  /**\n   * Initializes delayed cursor\n   */\n  initDelayedCursor(restart?: boolean) {\n    this.abortCursorAnimation();\n    this._tick(restart ? 0 : this.cursorDelay);\n  }\n\n  /**\n   * Aborts cursor animation, clears all timeouts and clear textarea context if necessary\n   */\n  abortCursorAnimation() {\n    let shouldClear = false;\n    [this._currentTickState, this._currentTickCompleteState].forEach(\n      (cursorAnimation) => {\n        if (cursorAnimation && !cursorAnimation.isDone()) {\n          shouldClear = true;\n          cursorAnimation.abort();\n        }\n      },\n    );\n\n    this._currentCursorOpacity = 1;\n\n    //  make sure we clear context even if instance is not editing\n    if (shouldClear) {\n      this.clearContextTop();\n    }\n  }\n\n  /**\n   * Restart tue cursor animation if either is in complete state ( between animations )\n   * or if it never started before\n   */\n  restartCursorIfNeeded() {\n    if (\n      [this._currentTickState, this._currentTickCompleteState].some(\n        (cursorAnimation) => !cursorAnimation || cursorAnimation.isDone(),\n      )\n    ) {\n      this.initDelayedCursor();\n    }\n  }\n\n  /**\n   * Selects entire text\n   */\n  selectAll() {\n    this.selectionStart = 0;\n    this.selectionEnd = this._text.length;\n    this._fireSelectionChanged();\n    this._updateTextarea();\n    return this;\n  }\n\n  /**\n   * Returns selected text\n   * @return {String}\n   */\n  getSelectedText(): string {\n    return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n  }\n\n  /**\n   * Find new selection index representing start of current word according to current selection index\n   * @param {Number} startFrom Current selection index\n   * @return {Number} New selection index\n   */\n  findWordBoundaryLeft(startFrom: number): number {\n    let offset = 0,\n      index = startFrom - 1;\n\n    // remove space before cursor first\n    if (this._reSpace.test(this._text[index])) {\n      while (this._reSpace.test(this._text[index])) {\n        offset++;\n        index--;\n      }\n    }\n    while (/\\S/.test(this._text[index]) && index > -1) {\n      offset++;\n      index--;\n    }\n\n    return startFrom - offset;\n  }\n\n  /**\n   * Find new selection index representing end of current word according to current selection index\n   * @param {Number} startFrom Current selection index\n   * @return {Number} New selection index\n   */\n  findWordBoundaryRight(startFrom: number): number {\n    let offset = 0,\n      index = startFrom;\n\n    // remove space after cursor first\n    if (this._reSpace.test(this._text[index])) {\n      while (this._reSpace.test(this._text[index])) {\n        offset++;\n        index++;\n      }\n    }\n    while (/\\S/.test(this._text[index]) && index < this._text.length) {\n      offset++;\n      index++;\n    }\n\n    return startFrom + offset;\n  }\n\n  /**\n   * Find new selection index representing start of current line according to current selection index\n   * @param {Number} startFrom Current selection index\n   * @return {Number} New selection index\n   */\n  findLineBoundaryLeft(startFrom: number): number {\n    let offset = 0,\n      index = startFrom - 1;\n\n    while (!/\\n/.test(this._text[index]) && index > -1) {\n      offset++;\n      index--;\n    }\n\n    return startFrom - offset;\n  }\n\n  /**\n   * Find new selection index representing end of current line according to current selection index\n   * @param {Number} startFrom Current selection index\n   * @return {Number} New selection index\n   */\n  findLineBoundaryRight(startFrom: number): number {\n    let offset = 0,\n      index = startFrom;\n\n    while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n      offset++;\n      index++;\n    }\n\n    return startFrom + offset;\n  }\n\n  /**\n   * Finds index corresponding to beginning or end of a word\n   * @param {Number} selectionStart Index of a character\n   * @param {Number} direction 1 or -1\n   * @return {Number} Index of the beginning or end of a word\n   */\n  searchWordBoundary(selectionStart: number, direction: 1 | -1): number {\n    const text = this._text;\n    // if we land on a space we move the cursor backwards\n    // if we are searching boundary end we move the cursor backwards ONLY if we don't land on a line break\n    let index =\n        selectionStart > 0 &&\n        this._reSpace.test(text[selectionStart]) &&\n        (direction === -1 || !reNewline.test(text[selectionStart - 1]))\n          ? selectionStart - 1\n          : selectionStart,\n      _char = text[index];\n    while (index > 0 && index < text.length && !reNonWord.test(_char)) {\n      index += direction;\n      _char = text[index];\n    }\n    if (direction === -1 && reNonWord.test(_char)) {\n      index++;\n    }\n    return index;\n  }\n\n  /**\n   * TODO fix: selectionStart set as 0 will be ignored?\n   * Selects a word based on the index\n   * @param {Number} selectionStart Index of a character\n   */\n  selectWord(selectionStart?: number) {\n    selectionStart = selectionStart || this.selectionStart;\n    // search backwards\n    const newSelectionStart = this.searchWordBoundary(selectionStart, -1),\n      // search forward\n      newSelectionEnd = Math.max(\n        newSelectionStart,\n        this.searchWordBoundary(selectionStart, 1),\n      );\n\n    this.selectionStart = newSelectionStart;\n    this.selectionEnd = newSelectionEnd;\n    this._fireSelectionChanged();\n    this._updateTextarea();\n    this.renderCursorOrSelection();\n  }\n\n  /**\n   * TODO fix: selectionStart set as 0 will be ignored?\n   * Selects a line based on the index\n   * @param {Number} selectionStart Index of a character\n   */\n  selectLine(selectionStart?: number) {\n    selectionStart = selectionStart || this.selectionStart;\n    const newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n      newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n    this.selectionStart = newSelectionStart;\n    this.selectionEnd = newSelectionEnd;\n    this._fireSelectionChanged();\n    this._updateTextarea();\n    return this;\n  }\n\n  /**\n   * Enters editing state\n   */\n  enterEditing(e?: TPointerEvent) {\n    if (this.isEditing || !this.editable) {\n      return;\n    }\n    if (this.canvas) {\n      this.canvas.calcOffset();\n      this.canvas.textEditingManager.exitTextEditing();\n    }\n\n    this.isEditing = true;\n\n    this.initHiddenTextarea();\n    this.hiddenTextarea!.focus();\n    this.hiddenTextarea!.value = this.text;\n    this._updateTextarea();\n    this._saveEditingProps();\n    this._setEditingProps();\n    this._textBeforeEdit = this.text;\n\n    this._tick();\n    this.fire('editing:entered', e ? { e } : undefined);\n    this._fireSelectionChanged();\n    if (this.canvas) {\n      this.canvas.fire('text:editing:entered', {\n        target: this as unknown as IText,\n        e,\n      });\n      this.canvas.requestRenderAll();\n    }\n  }\n\n  /**\n   * called by {@link Canvas#textEditingManager}\n   */\n  updateSelectionOnMouseMove(e: TPointerEvent) {\n    if (this.getActiveControl()) {\n      return;\n    }\n\n    const el = this.hiddenTextarea!;\n    // regain focus\n    getDocumentFromElement(el).activeElement !== el && el.focus();\n\n    const newSelectionStart = this.getSelectionStartFromPointer(e),\n      currentStart = this.selectionStart,\n      currentEnd = this.selectionEnd;\n    if (\n      (newSelectionStart !== this.__selectionStartOnMouseDown ||\n        currentStart === currentEnd) &&\n      (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n    ) {\n      return;\n    }\n    if (newSelectionStart > this.__selectionStartOnMouseDown) {\n      this.selectionStart = this.__selectionStartOnMouseDown;\n      this.selectionEnd = newSelectionStart;\n    } else {\n      this.selectionStart = newSelectionStart;\n      this.selectionEnd = this.__selectionStartOnMouseDown;\n    }\n    if (\n      this.selectionStart !== currentStart ||\n      this.selectionEnd !== currentEnd\n    ) {\n      this._fireSelectionChanged();\n      this._updateTextarea();\n      this.renderCursorOrSelection();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _setEditingProps() {\n    this.hoverCursor = 'text';\n\n    if (this.canvas) {\n      this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n    }\n\n    this.borderColor = this.editingBorderColor;\n    this.hasControls = this.selectable = false;\n    this.lockMovementX = this.lockMovementY = true;\n  }\n\n  /**\n   * convert from textarea to grapheme indexes\n   */\n  fromStringToGraphemeSelection(start: number, end: number, text: string) {\n    const smallerTextStart = text.slice(0, start),\n      graphemeStart = this.graphemeSplit(smallerTextStart).length;\n    if (start === end) {\n      return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n    }\n    const smallerTextEnd = text.slice(start, end),\n      graphemeEnd = this.graphemeSplit(smallerTextEnd).length;\n    return {\n      selectionStart: graphemeStart,\n      selectionEnd: graphemeStart + graphemeEnd,\n    };\n  }\n\n  /**\n   * convert from fabric to textarea values\n   */\n  fromGraphemeToStringSelection(\n    start: number,\n    end: number,\n    graphemes: string[],\n  ) {\n    const smallerTextStart = graphemes.slice(0, start),\n      graphemeStart = smallerTextStart.join('').length;\n    if (start === end) {\n      return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n    }\n    const smallerTextEnd = graphemes.slice(start, end),\n      graphemeEnd = smallerTextEnd.join('').length;\n    return {\n      selectionStart: graphemeStart,\n      selectionEnd: graphemeStart + graphemeEnd,\n    };\n  }\n\n  /**\n   * @private\n   */\n  _updateTextarea() {\n    this.cursorOffsetCache = {};\n    if (!this.hiddenTextarea) {\n      return;\n    }\n    if (!this.inCompositionMode) {\n      const newSelection = this.fromGraphemeToStringSelection(\n        this.selectionStart,\n        this.selectionEnd,\n        this._text,\n      );\n      this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n      this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n    }\n    this.updateTextareaPosition();\n  }\n\n  /**\n   * @private\n   */\n  updateFromTextArea() {\n    if (!this.hiddenTextarea) {\n      return;\n    }\n    this.cursorOffsetCache = {};\n    const textarea = this.hiddenTextarea;\n    this.text = textarea.value;\n    this.set('dirty', true);\n    this.initDimensions();\n    this.setCoords();\n    const newSelection = this.fromStringToGraphemeSelection(\n      textarea.selectionStart,\n      textarea.selectionEnd,\n      textarea.value,\n    );\n    this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n    if (!this.inCompositionMode) {\n      this.selectionStart = newSelection.selectionStart;\n    }\n    this.updateTextareaPosition();\n  }\n\n  /**\n   * @private\n   */\n  updateTextareaPosition() {\n    if (this.selectionStart === this.selectionEnd) {\n      const style = this._calcTextareaPosition();\n      this.hiddenTextarea!.style.left = style.left;\n      this.hiddenTextarea!.style.top = style.top;\n    }\n  }\n\n  /**\n   * @private\n   * @return {Object} style contains style for hiddenTextarea\n   */\n  _calcTextareaPosition() {\n    if (!this.canvas) {\n      return { left: '1px', top: '1px' };\n    }\n    const desiredPosition = this.inCompositionMode\n        ? this.compositionStart\n        : this.selectionStart,\n      boundaries = this._getCursorBoundaries(desiredPosition),\n      cursorLocation = this.get2DCursorLocation(desiredPosition),\n      lineIndex = cursorLocation.lineIndex,\n      charIndex = cursorLocation.charIndex,\n      charHeight =\n        this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') *\n        this.lineHeight,\n      leftOffset = boundaries.leftOffset,\n      retinaScaling = this.getCanvasRetinaScaling(),\n      upperCanvas = this.canvas.upperCanvasEl,\n      upperCanvasWidth = upperCanvas.width / retinaScaling,\n      upperCanvasHeight = upperCanvas.height / retinaScaling,\n      maxWidth = upperCanvasWidth - charHeight,\n      maxHeight = upperCanvasHeight - charHeight;\n\n    const p = new Point(\n      boundaries.left + leftOffset,\n      boundaries.top + boundaries.topOffset + charHeight,\n    )\n      .transform(this.calcTransformMatrix())\n      .transform(this.canvas.viewportTransform)\n      .multiply(\n        new Point(\n          upperCanvas.clientWidth / upperCanvasWidth,\n          upperCanvas.clientHeight / upperCanvasHeight,\n        ),\n      );\n\n    if (p.x < 0) {\n      p.x = 0;\n    }\n    if (p.x > maxWidth) {\n      p.x = maxWidth;\n    }\n    if (p.y < 0) {\n      p.y = 0;\n    }\n    if (p.y > maxHeight) {\n      p.y = maxHeight;\n    }\n\n    // add canvas offset on document\n    p.x += this.canvas._offset.left;\n    p.y += this.canvas._offset.top;\n\n    return {\n      left: `${p.x}px`,\n      top: `${p.y}px`,\n      fontSize: `${charHeight}px`,\n      charHeight: charHeight,\n    };\n  }\n\n  /**\n   * @private\n   */\n  _saveEditingProps() {\n    this._savedProps = {\n      hasControls: this.hasControls,\n      borderColor: this.borderColor,\n      lockMovementX: this.lockMovementX,\n      lockMovementY: this.lockMovementY,\n      hoverCursor: this.hoverCursor,\n      selectable: this.selectable,\n      defaultCursor: this.canvas && this.canvas.defaultCursor,\n      moveCursor: this.canvas && this.canvas.moveCursor,\n    };\n  }\n\n  /**\n   * @private\n   */\n  _restoreEditingProps() {\n    if (!this._savedProps) {\n      return;\n    }\n\n    this.hoverCursor = this._savedProps.hoverCursor;\n    this.hasControls = this._savedProps.hasControls;\n    this.borderColor = this._savedProps.borderColor;\n    this.selectable = this._savedProps.selectable;\n    this.lockMovementX = this._savedProps.lockMovementX;\n    this.lockMovementY = this._savedProps.lockMovementY;\n\n    if (this.canvas) {\n      this.canvas.defaultCursor =\n        this._savedProps.defaultCursor || this.canvas.defaultCursor;\n      this.canvas.moveCursor =\n        this._savedProps.moveCursor || this.canvas.moveCursor;\n    }\n\n    delete this._savedProps;\n  }\n\n  /**\n   * runs the actual logic that exits from editing state, see {@link exitEditing}\n   */\n  protected _exitEditing() {\n    const hiddenTextarea = this.hiddenTextarea;\n    this.selected = false;\n    this.isEditing = false;\n\n    if (hiddenTextarea) {\n      hiddenTextarea.blur && hiddenTextarea.blur();\n      hiddenTextarea.parentNode &&\n        hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n    }\n    this.hiddenTextarea = null;\n    this.abortCursorAnimation();\n    this.selectionStart !== this.selectionEnd && this.clearContextTop();\n  }\n\n  /**\n   * Exits from editing state and fires relevant events\n   */\n  exitEditing() {\n    const isTextChanged = this._textBeforeEdit !== this.text;\n    this._exitEditing();\n    this.selectionEnd = this.selectionStart;\n    this._restoreEditingProps();\n    if (this._forceClearCache) {\n      this.initDimensions();\n      this.setCoords();\n    }\n    this.fire('editing:exited');\n    isTextChanged && this.fire(MODIFIED);\n    if (this.canvas) {\n      this.canvas.fire('text:editing:exited', {\n        target: this as unknown as IText,\n      });\n      // todo: evaluate add an action to this event\n      isTextChanged && this.canvas.fire('object:modified', { target: this });\n    }\n    return this;\n  }\n\n  /**\n   * @private\n   */\n  _removeExtraneousStyles() {\n    for (const prop in this.styles) {\n      if (!this._textLines[prop as unknown as number]) {\n        delete this.styles[prop];\n      }\n    }\n  }\n\n  /**\n   * remove and reflow a style block from start to end.\n   * @param {Number} start linear start position for removal (included in removal)\n   * @param {Number} end linear end position for removal ( excluded from removal )\n   */\n  removeStyleFromTo(start: number, end: number) {\n    const { lineIndex: lineStart, charIndex: charStart } =\n        this.get2DCursorLocation(start, true),\n      { lineIndex: lineEnd, charIndex: charEnd } = this.get2DCursorLocation(\n        end,\n        true,\n      );\n    if (lineStart !== lineEnd) {\n      // step1 remove the trailing of lineStart\n      if (this.styles[lineStart]) {\n        for (\n          let i = charStart;\n          i < this._unwrappedTextLines[lineStart].length;\n          i++\n        ) {\n          delete this.styles[lineStart][i];\n        }\n      }\n      // step2 move the trailing of lineEnd to lineStart if needed\n      if (this.styles[lineEnd]) {\n        for (\n          let i = charEnd;\n          i < this._unwrappedTextLines[lineEnd].length;\n          i++\n        ) {\n          const styleObj = this.styles[lineEnd][i];\n          if (styleObj) {\n            this.styles[lineStart] || (this.styles[lineStart] = {});\n            this.styles[lineStart][charStart + i - charEnd] = styleObj;\n          }\n        }\n      }\n      // step3 detects lines will be completely removed.\n      for (let i = lineStart + 1; i <= lineEnd; i++) {\n        delete this.styles[i];\n      }\n      // step4 shift remaining lines.\n      this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n    } else {\n      // remove and shift left on the same line\n      if (this.styles[lineStart]) {\n        const styleObj = this.styles[lineStart];\n        const diff = charEnd - charStart;\n        for (let i = charStart; i < charEnd; i++) {\n          delete styleObj[i];\n        }\n        for (const char in this.styles[lineStart]) {\n          const numericChar = parseInt(char, 10);\n          if (numericChar >= charEnd) {\n            styleObj[numericChar - diff] = styleObj[char];\n            delete styleObj[char];\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Shifts line styles up or down\n   * @param {Number} lineIndex Index of a line\n   * @param {Number} offset Can any number?\n   */\n  shiftLineStyles(lineIndex: number, offset: number) {\n    const clonedStyles = Object.assign({}, this.styles);\n    for (const line in this.styles) {\n      const numericLine = parseInt(line, 10);\n      if (numericLine > lineIndex) {\n        this.styles[numericLine + offset] = clonedStyles[numericLine];\n        if (!clonedStyles[numericLine - offset]) {\n          delete this.styles[numericLine];\n        }\n      }\n    }\n  }\n\n  /**\n   * Handle insertion of more consecutive style lines for when one or more\n   * newlines gets added to the text. Since current style needs to be shifted\n   * first we shift the current style of the number lines needed, then we add\n   * new lines from the last to the first.\n   * @param {Number} lineIndex Index of a line\n   * @param {Number} charIndex Index of a char\n   * @param {Number} qty number of lines to add\n   * @param {Array} copiedStyle Array of objects styles\n   */\n  insertNewlineStyleObject(\n    lineIndex: number,\n    charIndex: number,\n    qty: number,\n    copiedStyle?: { [index: number]: TextStyleDeclaration },\n  ) {\n    const newLineStyles: { [index: number]: TextStyleDeclaration } = {};\n    const originalLineLength = this._unwrappedTextLines[lineIndex].length;\n    const isEndOfLine = originalLineLength === charIndex;\n\n    let someStyleIsCarryingOver = false;\n    qty || (qty = 1);\n    this.shiftLineStyles(lineIndex, qty);\n    const currentCharStyle = this.styles[lineIndex]\n      ? this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]\n      : undefined;\n\n    // we clone styles of all chars\n    // after cursor onto the current line\n    for (const index in this.styles[lineIndex]) {\n      const numIndex = parseInt(index, 10);\n      if (numIndex >= charIndex) {\n        someStyleIsCarryingOver = true;\n        newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n        // remove lines from the previous line since they're on a new line now\n        if (!(isEndOfLine && charIndex === 0)) {\n          delete this.styles[lineIndex][index];\n        }\n      }\n    }\n    let styleCarriedOver = false;\n    if (someStyleIsCarryingOver && !isEndOfLine) {\n      // if is end of line, the extra style we copied\n      // is probably not something we want\n      this.styles[lineIndex + qty] = newLineStyles;\n      styleCarriedOver = true;\n    }\n    if (styleCarriedOver || originalLineLength > charIndex) {\n      // skip the last line of since we already prepared it.\n      // or contains text without style that we don't want to style\n      // just because it changed lines\n      qty--;\n    }\n    // for the all the lines or all the other lines\n    // we clone current char style onto the next (otherwise empty) line\n    while (qty > 0) {\n      if (copiedStyle && copiedStyle[qty - 1]) {\n        this.styles[lineIndex + qty] = {\n          0: { ...copiedStyle[qty - 1] },\n        };\n      } else if (currentCharStyle) {\n        this.styles[lineIndex + qty] = {\n          0: { ...currentCharStyle },\n        };\n      } else {\n        delete this.styles[lineIndex + qty];\n      }\n      qty--;\n    }\n    this._forceClearCache = true;\n  }\n\n  /**\n   * Inserts style object for a given line/char index\n   * @param {Number} lineIndex Index of a line\n   * @param {Number} charIndex Index of a char\n   * @param {Number} quantity number Style object to insert, if given\n   * @param {Array} copiedStyle array of style objects\n   */\n  insertCharStyleObject(\n    lineIndex: number,\n    charIndex: number,\n    quantity: number,\n    copiedStyle?: TextStyleDeclaration[],\n  ) {\n    if (!this.styles) {\n      this.styles = {};\n    }\n    const currentLineStyles = this.styles[lineIndex],\n      currentLineStylesCloned = currentLineStyles\n        ? { ...currentLineStyles }\n        : {};\n\n    quantity || (quantity = 1);\n    // shift all char styles by quantity forward\n    // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n    for (const index in currentLineStylesCloned) {\n      const numericIndex = parseInt(index, 10);\n      if (numericIndex >= charIndex) {\n        currentLineStyles[numericIndex + quantity] =\n          currentLineStylesCloned[numericIndex];\n        // only delete the style if there was nothing moved there\n        if (!currentLineStylesCloned[numericIndex - quantity]) {\n          delete currentLineStyles[numericIndex];\n        }\n      }\n    }\n    this._forceClearCache = true;\n    if (copiedStyle) {\n      while (quantity--) {\n        if (!Object.keys(copiedStyle[quantity]).length) {\n          continue;\n        }\n        if (!this.styles[lineIndex]) {\n          this.styles[lineIndex] = {};\n        }\n        this.styles[lineIndex][charIndex + quantity] = {\n          ...copiedStyle[quantity],\n        };\n      }\n      return;\n    }\n    if (!currentLineStyles) {\n      return;\n    }\n    const newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n    while (newStyle && quantity--) {\n      this.styles[lineIndex][charIndex + quantity] = { ...newStyle };\n    }\n  }\n\n  /**\n   * Inserts style object(s)\n   * @param {Array} insertedText Characters at the location where style is inserted\n   * @param {Number} start cursor index for inserting style\n   * @param {Array} [copiedStyle] array of style objects to insert.\n   */\n  insertNewStyleBlock(\n    insertedText: string[],\n    start: number,\n    copiedStyle?: TextStyleDeclaration[],\n  ) {\n    const cursorLoc = this.get2DCursorLocation(start, true),\n      addedLines = [0];\n    let linesLength = 0;\n    // get an array of how many char per lines are being added.\n    for (let i = 0; i < insertedText.length; i++) {\n      if (insertedText[i] === '\\n') {\n        linesLength++;\n        addedLines[linesLength] = 0;\n      } else {\n        addedLines[linesLength]++;\n      }\n    }\n    // for the first line copy the style from the current char position.\n    if (addedLines[0] > 0) {\n      this.insertCharStyleObject(\n        cursorLoc.lineIndex,\n        cursorLoc.charIndex,\n        addedLines[0],\n        copiedStyle,\n      );\n      copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n    }\n    linesLength &&\n      this.insertNewlineStyleObject(\n        cursorLoc.lineIndex,\n        cursorLoc.charIndex + addedLines[0],\n        linesLength,\n      );\n    let i;\n    for (i = 1; i < linesLength; i++) {\n      if (addedLines[i] > 0) {\n        this.insertCharStyleObject(\n          cursorLoc.lineIndex + i,\n          0,\n          addedLines[i],\n          copiedStyle,\n        );\n      } else if (copiedStyle) {\n        // this test is required in order to close #6841\n        // when a pasted buffer begins with a newline then\n        // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n        // may be undefined for some reason\n        if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n          this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n        }\n      }\n      copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n    }\n    if (addedLines[i] > 0) {\n      this.insertCharStyleObject(\n        cursorLoc.lineIndex + i,\n        0,\n        addedLines[i],\n        copiedStyle,\n      );\n    }\n  }\n\n  /**\n   * Removes characters from start/end\n   * start/end ar per grapheme position in _text array.\n   *\n   * @param {Number} start\n   * @param {Number} end default to start + 1\n   */\n  removeChars(start: number, end: number = start + 1) {\n    this.removeStyleFromTo(start, end);\n    this._text.splice(start, end - start);\n    this.text = this._text.join('');\n    this.set('dirty', true);\n    this.initDimensions();\n    this.setCoords();\n    this._removeExtraneousStyles();\n  }\n\n  /**\n   * insert characters at start position, before start position.\n   * start  equal 1 it means the text get inserted between actual grapheme 0 and 1\n   * if style array is provided, it must be as the same length of text in graphemes\n   * if end is provided and is bigger than start, old text is replaced.\n   * start/end ar per grapheme position in _text array.\n   *\n   * @param {String} text text to insert\n   * @param {Array} style array of style objects\n   * @param {Number} start\n   * @param {Number} end default to start + 1\n   */\n  insertChars(\n    text: string,\n    style: TextStyleDeclaration[] | undefined,\n    start: number,\n    end: number = start,\n  ) {\n    if (end > start) {\n      this.removeStyleFromTo(start, end);\n    }\n    const graphemes = this.graphemeSplit(text);\n    this.insertNewStyleBlock(graphemes, start, style);\n    this._text = [\n      ...this._text.slice(0, start),\n      ...graphemes,\n      ...this._text.slice(end),\n    ];\n    this.text = this._text.join('');\n    this.set('dirty', true);\n    this.initDimensions();\n    this.setCoords();\n    this._removeExtraneousStyles();\n  }\n\n  /**\n   * Set the selectionStart and selectionEnd according to the new position of cursor\n   * mimic the key - mouse navigation when shift is pressed.\n   */\n  setSelectionStartEndWithShift(\n    start: number,\n    end: number,\n    newSelection: number,\n  ) {\n    if (newSelection <= start) {\n      if (end === start) {\n        this._selectionDirection = LEFT;\n      } else if (this._selectionDirection === RIGHT) {\n        this._selectionDirection = LEFT;\n        this.selectionEnd = start;\n      }\n      this.selectionStart = newSelection;\n    } else if (newSelection > start && newSelection < end) {\n      if (this._selectionDirection === RIGHT) {\n        this.selectionEnd = newSelection;\n      } else {\n        this.selectionStart = newSelection;\n      }\n    } else {\n      // newSelection is > selection start and end\n      if (end === start) {\n        this._selectionDirection = RIGHT;\n      } else if (this._selectionDirection === LEFT) {\n        this._selectionDirection = RIGHT;\n        this.selectionStart = end;\n      }\n      this.selectionEnd = newSelection;\n    }\n  }\n}\n"],"names":["reNonWord","ITextBehavior","FabricText","constructor","arguments","_defineProperty","initBehavior","_tick","bind","_onTickComplete","updateSelectionOnMouseMove","onDeselect","options","isEditing","exitEditing","selected","_animateCursor","_ref","toValue","duration","delay","onComplete","animate","startValue","_currentCursorOpacity","endValue","abort","canvas","selectionStart","selectionEnd","onChange","value","renderCursorOrSelection","_currentTickState","cursorDuration","Math","max","_this$_currentTickCom","_currentTickCompleteState","initDelayedCursor","restart","abortCursorAnimation","cursorDelay","shouldClear","forEach","cursorAnimation","isDone","clearContextTop","restartCursorIfNeeded","some","selectAll","_text","length","_fireSelectionChanged","_updateTextarea","getSelectedText","slice","join","findWordBoundaryLeft","startFrom","offset","index","_reSpace","test","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","direction","text","reNewline","_char","selectWord","newSelectionStart","newSelectionEnd","selectLine","enterEditing","e","editable","calcOffset","textEditingManager","exitTextEditing","initHiddenTextarea","hiddenTextarea","focus","_saveEditingProps","_setEditingProps","_textBeforeEdit","fire","undefined","target","requestRenderAll","getActiveControl","el","getDocumentFromElement","activeElement","getSelectionStartFromPointer","currentStart","currentEnd","__selectionStartOnMouseDown","hoverCursor","defaultCursor","moveCursor","borderColor","editingBorderColor","hasControls","selectable","lockMovementX","lockMovementY","fromStringToGraphemeSelection","start","end","smallerTextStart","graphemeStart","graphemeSplit","smallerTextEnd","graphemeEnd","fromGraphemeToStringSelection","graphemes","cursorOffsetCache","inCompositionMode","newSelection","updateTextareaPosition","updateFromTextArea","textarea","set","initDimensions","setCoords","style","_calcTextareaPosition","left","top","desiredPosition","compositionStart","boundaries","_getCursorBoundaries","cursorLocation","get2DCursorLocation","lineIndex","charIndex","charHeight","getValueOfPropertyAt","lineHeight","leftOffset","retinaScaling","getCanvasRetinaScaling","upperCanvas","upperCanvasEl","upperCanvasWidth","width","upperCanvasHeight","height","maxWidth","maxHeight","p","Point","topOffset","transform","calcTransformMatrix","viewportTransform","multiply","clientWidth","clientHeight","x","y","_offset","concat","fontSize","_savedProps","_restoreEditingProps","_exitEditing","blur","parentNode","removeChild","isTextChanged","_forceClearCache","MODIFIED","_removeExtraneousStyles","prop","styles","_textLines","removeStyleFromTo","lineStart","charStart","lineEnd","charEnd","i","_unwrappedTextLines","styleObj","shiftLineStyles","diff","char","numericChar","parseInt","clonedStyles","Object","assign","line","numericLine","insertNewlineStyleObject","qty","copiedStyle","newLineStyles","originalLineLength","isEndOfLine","someStyleIsCarryingOver","currentCharStyle","numIndex","styleCarriedOver","_objectSpread","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","keys","newStyle","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","removeChars","splice","insertChars","setSelectionStartEndWithShift","_selectionDirection","LEFT","RIGHT"],"mappings":"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"}