{"version":3,"file":"ITextKeyBehavior.mjs","sources":["../../../../src/shapes/IText/ITextKeyBehavior.ts"],"sourcesContent":["import { config } from '../../config';\nimport { getFabricDocument, getEnv } from '../../env';\nimport { capValue } from '../../util/misc/capValue';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextBehavior } from './ITextBehavior';\nimport type { TKeyMapIText } from './constants';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, LEFT, RIGHT } from '../../constants';\nimport type { IText } from './IText';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\n\nexport abstract class ITextKeyBehavior<\n  Props extends TOptions<TextProps> = Partial<TextProps>,\n  SProps extends SerializedTextProps = SerializedTextProps,\n  EventSpec extends ITextEvents = ITextEvents,\n> extends ITextBehavior<Props, SProps, EventSpec> {\n  /**\n   * For functionalities on keyDown\n   * Map a special key to a function of the instance/prototype\n   * If you need different behavior for ESC or TAB or arrows, you have to change\n   * this map setting the name of a function that you build on the IText or\n   * your prototype.\n   * the map change will affect all Instances unless you need for only some text Instances\n   * in that case you have to clone this object and assign your Instance.\n   * this.keysMap = Object.assign({}, this.keysMap);\n   * The function must be in IText.prototype.myFunction And will receive event as args[0]\n   */\n  declare keysMap: TKeyMapIText;\n\n  declare keysMapRtl: TKeyMapIText;\n\n  /**\n   * For functionalities on keyUp + ctrl || cmd\n   */\n  declare ctrlKeysMapUp: TKeyMapIText;\n\n  /**\n   * For functionalities on keyDown + ctrl || cmd\n   */\n  declare ctrlKeysMapDown: TKeyMapIText;\n\n  declare hiddenTextarea: HTMLTextAreaElement | null;\n\n  /**\n   * DOM container to append the hiddenTextarea.\n   * An alternative to attaching to the document.body.\n   * Useful to reduce laggish redraw of the full document.body tree and\n   * also with modals event capturing that won't let the textarea take focus.\n   * @type HTMLElement\n   * @default\n   */\n  declare hiddenTextareaContainer?: HTMLElement | null;\n\n  private declare _clickHandlerInitialized: boolean;\n  private declare _copyDone: boolean;\n  private declare fromPaste: boolean;\n\n  /**\n   * Initializes hidden textarea (needed to bring up keyboard in iOS)\n   */\n  initHiddenTextarea() {\n    const doc =\n      (this.canvas && getDocumentFromElement(this.canvas.getElement())) ||\n      getFabricDocument();\n    const textarea = doc.createElement('textarea');\n    Object.entries({\n      autocapitalize: 'off',\n      autocorrect: 'off',\n      autocomplete: 'off',\n      spellcheck: 'false',\n      'data-fabric': 'textarea',\n      wrap: 'off',\n    }).map(([attribute, value]) => textarea.setAttribute(attribute, value));\n    const { top, left, fontSize } = this._calcTextareaPosition();\n    // line-height: 1px; was removed from the style to fix this:\n    // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n    textarea.style.cssText = `position: absolute; top: ${top}; left: ${left}; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; padding-top: ${fontSize};`;\n\n    (this.hiddenTextareaContainer || doc.body).appendChild(textarea);\n\n    Object.entries({\n      blur: 'blur',\n      keydown: 'onKeyDown',\n      keyup: 'onKeyUp',\n      input: 'onInput',\n      copy: 'copy',\n      cut: 'copy',\n      paste: 'paste',\n      compositionstart: 'onCompositionStart',\n      compositionupdate: 'onCompositionUpdate',\n      compositionend: 'onCompositionEnd',\n    } as Record<string, keyof this>).map(([eventName, handler]) =>\n      textarea.addEventListener(\n        eventName,\n        (this[handler] as EventListener).bind(this),\n      ),\n    );\n    this.hiddenTextarea = textarea;\n  }\n\n  /**\n   * Override this method to customize cursor behavior on textbox blur\n   */\n  blur() {\n    this.abortCursorAnimation();\n  }\n\n  /**\n   * Handles keydown event\n   * only used for arrows and combination of modifier keys.\n   * @param {KeyboardEvent} e Event object\n   */\n  onKeyDown(e: KeyboardEvent) {\n    if (!this.isEditing) {\n      return;\n    }\n    const keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n    if (e.keyCode in keyMap) {\n      // @ts-expect-error legacy method calling pattern\n      this[keyMap[e.keyCode]](e);\n    } else if (e.keyCode in this.ctrlKeysMapDown && (e.ctrlKey || e.metaKey)) {\n      // @ts-expect-error legacy method calling pattern\n      this[this.ctrlKeysMapDown[e.keyCode]](e);\n    } else {\n      return;\n    }\n    e.stopImmediatePropagation();\n    e.preventDefault();\n    if (e.keyCode >= 33 && e.keyCode <= 40) {\n      // if i press an arrow key just update selection\n      this.inCompositionMode = false;\n      this.clearContextTop();\n      this.renderCursorOrSelection();\n    } else {\n      this.canvas && this.canvas.requestRenderAll();\n    }\n  }\n\n  /**\n   * Handles keyup event\n   * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n   * if a copy/cut event fired, keyup is dismissed\n   * @param {KeyboardEvent} e Event object\n   */\n  onKeyUp(e: KeyboardEvent) {\n    if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n      this._copyDone = false;\n      return;\n    }\n    if (e.keyCode in this.ctrlKeysMapUp && (e.ctrlKey || e.metaKey)) {\n      // @ts-expect-error legacy method calling pattern\n      this[this.ctrlKeysMapUp[e.keyCode]](e);\n    } else {\n      return;\n    }\n    e.stopImmediatePropagation();\n    e.preventDefault();\n    this.canvas && this.canvas.requestRenderAll();\n  }\n\n  /**\n   * Handles onInput event\n   * @param {Event} e Event object\n   */\n  onInput(this: this & { hiddenTextarea: HTMLTextAreaElement }, e: Event) {\n    const fromPaste = this.fromPaste;\n    this.fromPaste = false;\n    e && e.stopPropagation();\n    if (!this.isEditing) {\n      return;\n    }\n    const updateAndFire = () => {\n      this.updateFromTextArea();\n      this.fire(CHANGED);\n      if (this.canvas) {\n        this.canvas.fire('text:changed', { target: this as unknown as IText });\n        this.canvas.requestRenderAll();\n      }\n    };\n    if (this.hiddenTextarea.value === '') {\n      this.styles = {};\n      updateAndFire();\n      return;\n    }\n    // decisions about style changes.\n    const nextText = this._splitTextIntoLines(\n        this.hiddenTextarea.value,\n      ).graphemeText,\n      charCount = this._text.length,\n      nextCharCount = nextText.length,\n      selectionStart = this.selectionStart,\n      selectionEnd = this.selectionEnd,\n      selection = selectionStart !== selectionEnd;\n    let copiedStyle: TextStyleDeclaration[] | undefined,\n      removedText,\n      charDiff = nextCharCount - charCount,\n      removeFrom,\n      removeTo;\n\n    const textareaSelection = this.fromStringToGraphemeSelection(\n      this.hiddenTextarea.selectionStart,\n      this.hiddenTextarea.selectionEnd,\n      this.hiddenTextarea.value,\n    );\n    const backDelete = selectionStart > textareaSelection.selectionStart;\n\n    if (selection) {\n      removedText = this._text.slice(selectionStart, selectionEnd);\n      charDiff += selectionEnd - selectionStart;\n    } else if (nextCharCount < charCount) {\n      if (backDelete) {\n        removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);\n      } else {\n        removedText = this._text.slice(\n          selectionStart,\n          selectionStart - charDiff,\n        );\n      }\n    }\n    const insertedText = nextText.slice(\n      textareaSelection.selectionEnd - charDiff,\n      textareaSelection.selectionEnd,\n    );\n    if (removedText && removedText.length) {\n      if (insertedText.length) {\n        // let's copy some style before deleting.\n        // we want to copy the style before the cursor OR the style at the cursor if selection\n        // is bigger than 0.\n        copiedStyle = this.getSelectionStyles(\n          selectionStart,\n          selectionStart + 1,\n          false,\n        );\n        // now duplicate the style one for each inserted text.\n        copiedStyle = insertedText.map(\n          () =>\n            // this return an array of references, but that is fine since we are\n            // copying the style later.\n            copiedStyle![0],\n        );\n      }\n      if (selection) {\n        removeFrom = selectionStart;\n        removeTo = selectionEnd;\n      } else if (backDelete) {\n        // detect differences between forwardDelete and backDelete\n        removeFrom = selectionEnd - removedText.length;\n        removeTo = selectionEnd;\n      } else {\n        removeFrom = selectionEnd;\n        removeTo = selectionEnd + removedText.length;\n      }\n      this.removeStyleFromTo(removeFrom, removeTo);\n    }\n    if (insertedText.length) {\n      const { copyPasteData } = getEnv();\n      if (\n        fromPaste &&\n        insertedText.join('') === copyPasteData.copiedText &&\n        !config.disableStyleCopyPaste\n      ) {\n        copiedStyle = copyPasteData.copiedTextStyle;\n      }\n      this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);\n    }\n    updateAndFire();\n  }\n\n  /**\n   * Composition start\n   */\n  onCompositionStart() {\n    this.inCompositionMode = true;\n  }\n\n  /**\n   * Composition end\n   */\n  onCompositionEnd() {\n    this.inCompositionMode = false;\n  }\n\n  onCompositionUpdate({ target }: CompositionEvent) {\n    const { selectionStart, selectionEnd } = target as HTMLTextAreaElement;\n    this.compositionStart = selectionStart;\n    this.compositionEnd = selectionEnd;\n    this.updateTextareaPosition();\n  }\n\n  /**\n   * Copies selected text\n   */\n  copy() {\n    if (this.selectionStart === this.selectionEnd) {\n      //do not cut-copy if no selection\n      return;\n    }\n    const { copyPasteData } = getEnv();\n    copyPasteData.copiedText = this.getSelectedText();\n    if (!config.disableStyleCopyPaste) {\n      copyPasteData.copiedTextStyle = this.getSelectionStyles(\n        this.selectionStart,\n        this.selectionEnd,\n        true,\n      );\n    } else {\n      copyPasteData.copiedTextStyle = undefined;\n    }\n    this._copyDone = true;\n  }\n\n  /**\n   * Pastes text\n   */\n  paste() {\n    this.fromPaste = true;\n  }\n\n  /**\n   * Finds the width in pixels before the cursor on the same line\n   * @private\n   * @param {Number} lineIndex\n   * @param {Number} charIndex\n   * @return {Number} widthBeforeCursor width before cursor\n   */\n  _getWidthBeforeCursor(lineIndex: number, charIndex: number): number {\n    let widthBeforeCursor = this._getLineLeftOffset(lineIndex),\n      bound;\n\n    if (charIndex > 0) {\n      bound = this.__charBounds[lineIndex][charIndex - 1];\n      widthBeforeCursor += bound.left + bound.width;\n    }\n    return widthBeforeCursor;\n  }\n\n  /**\n   * Gets start offset of a selection\n   * @param {KeyboardEvent} e Event object\n   * @param {Boolean} isRight\n   * @return {Number}\n   */\n  getDownCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n    const selectionProp = this._getSelectionForOffset(e, isRight),\n      cursorLocation = this.get2DCursorLocation(selectionProp),\n      lineIndex = cursorLocation.lineIndex;\n    // if on last line, down cursor goes to end of line\n    if (\n      lineIndex === this._textLines.length - 1 ||\n      e.metaKey ||\n      e.keyCode === 34\n    ) {\n      // move to the end of a text\n      return this._text.length - selectionProp;\n    }\n    const charIndex = cursorLocation.charIndex,\n      widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n      indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n      textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n    return (\n      textAfterCursor.length +\n      indexOnOtherLine +\n      1 +\n      this.missingNewlineOffset(lineIndex)\n    );\n  }\n\n  /**\n   * private\n   * Helps finding if the offset should be counted from Start or End\n   * @param {KeyboardEvent} e Event object\n   * @param {Boolean} isRight\n   * @return {Number}\n   */\n  _getSelectionForOffset(e: KeyboardEvent, isRight: boolean): number {\n    if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n      return this.selectionEnd;\n    } else {\n      return this.selectionStart;\n    }\n  }\n\n  /**\n   * @param {KeyboardEvent} e Event object\n   * @param {Boolean} isRight\n   * @return {Number}\n   */\n  getUpCursorOffset(e: KeyboardEvent, isRight: boolean): number {\n    const selectionProp = this._getSelectionForOffset(e, isRight),\n      cursorLocation = this.get2DCursorLocation(selectionProp),\n      lineIndex = cursorLocation.lineIndex;\n    if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n      // if on first line, up cursor goes to start of line\n      return -selectionProp;\n    }\n    const charIndex = cursorLocation.charIndex,\n      widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n      indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n      textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n      missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n    // return a negative offset\n    return (\n      -this._textLines[lineIndex - 1].length +\n      indexOnOtherLine -\n      textBeforeCursor.length +\n      (1 - missingNewlineOffset)\n    );\n  }\n\n  /**\n   * for a given width it founds the matching character.\n   * @private\n   */\n  _getIndexOnLine(lineIndex: number, width: number) {\n    const line = this._textLines[lineIndex],\n      lineLeftOffset = this._getLineLeftOffset(lineIndex);\n    let widthOfCharsOnLine = lineLeftOffset,\n      indexOnLine = 0,\n      charWidth,\n      foundMatch;\n\n    for (let j = 0, jlen = line.length; j < jlen; j++) {\n      charWidth = this.__charBounds[lineIndex][j].width;\n      widthOfCharsOnLine += charWidth;\n      if (widthOfCharsOnLine > width) {\n        foundMatch = true;\n        const leftEdge = widthOfCharsOnLine - charWidth,\n          rightEdge = widthOfCharsOnLine,\n          offsetFromLeftEdge = Math.abs(leftEdge - width),\n          offsetFromRightEdge = Math.abs(rightEdge - width);\n\n        indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : j - 1;\n        break;\n      }\n    }\n\n    // reached end\n    if (!foundMatch) {\n      indexOnLine = line.length - 1;\n    }\n\n    return indexOnLine;\n  }\n\n  /**\n   * Moves cursor down\n   * @param {KeyboardEvent} e Event object\n   */\n  moveCursorDown(e: KeyboardEvent) {\n    if (\n      this.selectionStart >= this._text.length &&\n      this.selectionEnd >= this._text.length\n    ) {\n      return;\n    }\n    this._moveCursorUpOrDown('Down', e);\n  }\n\n  /**\n   * Moves cursor up\n   * @param {KeyboardEvent} e Event object\n   */\n  moveCursorUp(e: KeyboardEvent) {\n    if (this.selectionStart === 0 && this.selectionEnd === 0) {\n      return;\n    }\n    this._moveCursorUpOrDown('Up', e);\n  }\n\n  /**\n   * Moves cursor up or down, fires the events\n   * @param {String} direction 'Up' or 'Down'\n   * @param {KeyboardEvent} e Event object\n   */\n  _moveCursorUpOrDown(direction: 'Up' | 'Down', e: KeyboardEvent) {\n    const offset = this[`get${direction}CursorOffset`](\n      e,\n      this._selectionDirection === RIGHT,\n    );\n    if (e.shiftKey) {\n      this.moveCursorWithShift(offset);\n    } else {\n      this.moveCursorWithoutShift(offset);\n    }\n    if (offset !== 0) {\n      const max = this.text.length;\n      this.selectionStart = capValue(0, this.selectionStart, max);\n      this.selectionEnd = capValue(0, this.selectionEnd, max);\n      // TODO fix: abort and init should be an alternative depending\n      // on selectionStart/End being equal or different\n      this.abortCursorAnimation();\n      this.initDelayedCursor();\n      this._fireSelectionChanged();\n      this._updateTextarea();\n    }\n  }\n\n  /**\n   * Moves cursor with shift\n   * @param {Number} offset\n   */\n  moveCursorWithShift(offset: number) {\n    const newSelection =\n      this._selectionDirection === LEFT\n        ? this.selectionStart + offset\n        : this.selectionEnd + offset;\n    this.setSelectionStartEndWithShift(\n      this.selectionStart,\n      this.selectionEnd,\n      newSelection,\n    );\n    return offset !== 0;\n  }\n\n  /**\n   * Moves cursor up without shift\n   * @param {Number} offset\n   */\n  moveCursorWithoutShift(offset: number) {\n    if (offset < 0) {\n      this.selectionStart += offset;\n      this.selectionEnd = this.selectionStart;\n    } else {\n      this.selectionEnd += offset;\n      this.selectionStart = this.selectionEnd;\n    }\n    return offset !== 0;\n  }\n\n  /**\n   * Moves cursor left\n   * @param {KeyboardEvent} e Event object\n   */\n  moveCursorLeft(e: KeyboardEvent) {\n    if (this.selectionStart === 0 && this.selectionEnd === 0) {\n      return;\n    }\n    this._moveCursorLeftOrRight('Left', e);\n  }\n\n  /**\n   * @private\n   * @return {Boolean} true if a change happened\n   *\n   * @todo refactor not to use method name composition\n   */\n  _move(\n    e: KeyboardEvent,\n    prop: 'selectionStart' | 'selectionEnd',\n    direction: 'Left' | 'Right',\n  ): boolean {\n    let newValue: number | undefined;\n    if (e.altKey) {\n      newValue = this[`findWordBoundary${direction}`](this[prop]);\n    } else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36) {\n      newValue = this[`findLineBoundary${direction}`](this[prop]);\n    } else {\n      this[prop] += direction === 'Left' ? -1 : 1;\n      return true;\n    }\n    if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n      this[prop] = newValue;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * @private\n   */\n  _moveLeft(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n    return this._move(e, prop, 'Left');\n  }\n\n  /**\n   * @private\n   */\n  _moveRight(e: KeyboardEvent, prop: 'selectionStart' | 'selectionEnd') {\n    return this._move(e, prop, 'Right');\n  }\n\n  /**\n   * Moves cursor left without keeping selection\n   * @param {KeyboardEvent} e\n   */\n  moveCursorLeftWithoutShift(e: KeyboardEvent) {\n    let change = true;\n    this._selectionDirection = LEFT;\n\n    // only move cursor when there is no selection,\n    // otherwise we discard it, and leave cursor on same place\n    if (\n      this.selectionEnd === this.selectionStart &&\n      this.selectionStart !== 0\n    ) {\n      change = this._moveLeft(e, 'selectionStart');\n    }\n    this.selectionEnd = this.selectionStart;\n    return change;\n  }\n\n  /**\n   * Moves cursor left while keeping selection\n   * @param {KeyboardEvent} e\n   */\n  moveCursorLeftWithShift(e: KeyboardEvent) {\n    if (\n      this._selectionDirection === RIGHT &&\n      this.selectionStart !== this.selectionEnd\n    ) {\n      return this._moveLeft(e, 'selectionEnd');\n    } else if (this.selectionStart !== 0) {\n      this._selectionDirection = LEFT;\n      return this._moveLeft(e, 'selectionStart');\n    }\n  }\n\n  /**\n   * Moves cursor right\n   * @param {KeyboardEvent} e Event object\n   */\n  moveCursorRight(e: KeyboardEvent) {\n    if (\n      this.selectionStart >= this._text.length &&\n      this.selectionEnd >= this._text.length\n    ) {\n      return;\n    }\n    this._moveCursorLeftOrRight('Right', e);\n  }\n\n  /**\n   * Moves cursor right or Left, fires event\n   * @param {String} direction 'Left', 'Right'\n   * @param {KeyboardEvent} e Event object\n   */\n  _moveCursorLeftOrRight(direction: 'Left' | 'Right', e: KeyboardEvent) {\n    const actionName = `moveCursor${direction}${\n      e.shiftKey ? 'WithShift' : 'WithoutShift'\n    }` as const;\n    this._currentCursorOpacity = 1;\n    if (this[actionName](e)) {\n      // TODO fix: abort and init should be an alternative depending\n      // on selectionStart/End being equal or different\n      this.abortCursorAnimation();\n      this.initDelayedCursor();\n      this._fireSelectionChanged();\n      this._updateTextarea();\n    }\n  }\n\n  /**\n   * Moves cursor right while keeping selection\n   * @param {KeyboardEvent} e\n   */\n  moveCursorRightWithShift(e: KeyboardEvent) {\n    if (\n      this._selectionDirection === LEFT &&\n      this.selectionStart !== this.selectionEnd\n    ) {\n      return this._moveRight(e, 'selectionStart');\n    } else if (this.selectionEnd !== this._text.length) {\n      this._selectionDirection = RIGHT;\n      return this._moveRight(e, 'selectionEnd');\n    }\n  }\n\n  /**\n   * Moves cursor right without keeping selection\n   * @param {KeyboardEvent} e Event object\n   */\n  moveCursorRightWithoutShift(e: KeyboardEvent) {\n    let changed = true;\n    this._selectionDirection = RIGHT;\n\n    if (this.selectionStart === this.selectionEnd) {\n      changed = this._moveRight(e, 'selectionStart');\n      this.selectionEnd = this.selectionStart;\n    } else {\n      this.selectionStart = this.selectionEnd;\n    }\n    return changed;\n  }\n}\n"],"names":["ITextKeyBehavior","ITextBehavior","initHiddenTextarea","doc","canvas","getDocumentFromElement","getElement","getFabricDocument","textarea","createElement","Object","entries","autocapitalize","autocorrect","autocomplete","spellcheck","wrap","map","_ref","attribute","value","setAttribute","top","left","fontSize","_calcTextareaPosition","style","cssText","concat","hiddenTextareaContainer","body","appendChild","blur","keydown","keyup","input","copy","cut","paste","compositionstart","compositionupdate","compositionend","_ref2","eventName","handler","addEventListener","bind","hiddenTextarea","abortCursorAnimation","onKeyDown","e","isEditing","keyMap","direction","keysMapRtl","keysMap","keyCode","ctrlKeysMapDown","ctrlKey","metaKey","stopImmediatePropagation","preventDefault","inCompositionMode","clearContextTop","renderCursorOrSelection","requestRenderAll","onKeyUp","_copyDone","ctrlKeysMapUp","onInput","fromPaste","stopPropagation","updateAndFire","updateFromTextArea","fire","CHANGED","target","styles","nextText","_splitTextIntoLines","graphemeText","charCount","_text","length","nextCharCount","selectionStart","selectionEnd","selection","copiedStyle","removedText","charDiff","removeFrom","removeTo","textareaSelection","fromStringToGraphemeSelection","backDelete","slice","insertedText","getSelectionStyles","removeStyleFromTo","copyPasteData","getEnv","join","copiedText","config","disableStyleCopyPaste","copiedTextStyle","insertNewStyleBlock","onCompositionStart","onCompositionEnd","onCompositionUpdate","_ref3","compositionStart","compositionEnd","updateTextareaPosition","getSelectedText","undefined","_getWidthBeforeCursor","lineIndex","charIndex","widthBeforeCursor","_getLineLeftOffset","bound","__charBounds","width","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","cursorLocation","get2DCursorLocation","_textLines","indexOnOtherLine","_getIndexOnLine","textAfterCursor","missingNewlineOffset","shiftKey","getUpCursorOffset","textBeforeCursor","line","lineLeftOffset","widthOfCharsOnLine","indexOnLine","charWidth","foundMatch","j","jlen","leftEdge","rightEdge","offsetFromLeftEdge","Math","abs","offsetFromRightEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","offset","_selectionDirection","RIGHT","moveCursorWithShift","moveCursorWithoutShift","max","text","capValue","initDelayedCursor","_fireSelectionChanged","_updateTextarea","newSelection","LEFT","setSelectionStartEndWithShift","moveCursorLeft","_moveCursorLeftOrRight","_move","prop","newValue","altKey","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","actionName","_currentCursorOpacity","moveCursorRightWithShift","moveCursorRightWithoutShift","changed"],"mappings":"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"}