UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 46.2 kB
{"version":3,"file":"IText.mjs","sources":["../../../../src/shapes/IText/IText.ts"],"sourcesContent":["import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\nimport type { FabricObject } from '../Object/FabricObject';\nimport { createCanvasElementFor } from '../../util/misc/dom';\nimport { applyCanvasTransform } from '../../util/internals/applyCanvasTransform';\n\nexport type CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\nexport type CursorRenderingData = {\n color: string;\n opacity: number;\n left: number;\n top: number;\n width: number;\n height: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial<TClassProperties<IText>> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions<ITextProps> = Partial<ITextProps>,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents,\n >\n extends ITextClickBehavior<Props, SProps, EventSpec>\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n * @default\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n * @default\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n * @default\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n * @default\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n * @default\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n * @default\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n * @default\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n * @default\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n * @default\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n * @default\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n * @default\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number,\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean,\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean,\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing || !this.canvas) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n\n const ancestors = this.findAncestorsWithClipPath();\n const hasAncestorsWithClipping = ancestors.length > 0;\n let drawingCtx: CanvasRenderingContext2D = ctx;\n let drawingCanvas: HTMLCanvasElement | undefined = undefined;\n if (hasAncestorsWithClipping) {\n // we have some clipPath, we need to draw the selection on an intermediate layer.\n drawingCanvas = createCanvasElementFor(ctx.canvas);\n drawingCtx = drawingCanvas.getContext('2d')!;\n applyCanvasTransform(drawingCtx, this.canvas);\n const m = this.calcTransformMatrix();\n drawingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n\n if (this.selectionStart === this.selectionEnd && !this.inCompositionMode) {\n this.renderCursor(drawingCtx, boundaries);\n } else {\n this.renderSelection(drawingCtx, boundaries);\n }\n\n if (hasAncestorsWithClipping) {\n // we need a neutral context.\n // this won't work for nested clippaths in which a clippath\n // has its own clippath\n for (const ancestor of ancestors) {\n const clipPath = ancestor.clipPath!;\n const clippingCanvas = createCanvasElementFor(ctx.canvas);\n const clippingCtx = clippingCanvas.getContext('2d')!;\n applyCanvasTransform(clippingCtx, this.canvas);\n // position the ctx in the center of the outer ancestor\n if (!clipPath.absolutePositioned) {\n const m = ancestor.calcTransformMatrix();\n clippingCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(clippingCtx);\n // we assign an empty drawing context, we don't plan to have this working for nested clippaths for now\n clipPath.drawObject(clippingCtx, true, {});\n this.drawClipPathOnCache(drawingCtx, clipPath, clippingCanvas);\n }\n }\n\n if (hasAncestorsWithClipping) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(drawingCanvas!, 0, 0);\n }\n\n this.canvas.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Finds and returns an array of clip paths that are applied to the parent\n * group(s) of the current FabricObject instance. The object's hierarchy is\n * traversed upwards (from the current object towards the root of the canvas),\n * checking each parent object for the presence of a `clipPath` that is not\n * absolutely positioned.\n */\n findAncestorsWithClipPath(): FabricObject[] {\n const clipPathAncestors: FabricObject[] = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let obj: FabricObject | undefined = this;\n while (obj) {\n if (obj.clipPath) {\n clipPathAncestors.push(obj);\n }\n obj = obj.parent;\n }\n\n return clipPathAncestors;\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean,\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean,\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n const boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n boundaries.left *= -1;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return boundaries;\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n this._renderCursor(\n this.canvas!.contextTop,\n this._getCursorBoundaries(selectionStart, true),\n selectionStart,\n );\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n /**\n * Return the data needed to render the cursor for given selection start\n * The left,top are relative to the object, while width and height are prescaled\n * to look think with canvas zoom and object scaling,\n * so they depend on canvas and object scaling\n */\n getCursorRenderingData(\n selectionStart: number = this.selectionStart,\n boundaries: CursorBoundaries = this._getCursorBoundaries(selectionStart),\n ): CursorRenderingData {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n return {\n color:\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string),\n opacity: this._currentCursorOpacity,\n left: boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n top: topOffset + boundaries.top + dy,\n width: cursorWidth,\n height: charHeight,\n };\n }\n\n /**\n * Render the cursor at the given selectionStart.\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number,\n ) {\n const { color, opacity, left, top, width, height } =\n this.getCursorRenderingData(selectionStart, boundaries);\n ctx.fillStyle = color;\n ctx.globalAlpha = opacity;\n ctx.fillRect(left, top, width, height);\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true),\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries,\n ) {\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = this.textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight,\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this.exitEditingImpl();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n"],"names":["protectedDefaultValues","_selectionDirection","_reSpace","inCompositionMode","iTextDefaultValues","_objectSpread","selectionStart","selectionEnd","selectionColor","isEditing","editable","editingBorderColor","cursorWidth","cursorColor","cursorDelay","cursorDuration","caching","hiddenTextareaContainer","keysMap","keysMapRtl","ctrlKeysMapDown","ctrlKeysMapUp","IText","ITextClickBehavior","getDefaults","ownDefaults","type","constructor","text","options","initBehavior","_set","key","value","_savedProps","canvas","Canvas","textEditingManager","remove","add","setSelectionStart","index","Math","max","_updateAndFire","setSelectionEnd","min","length","property","_fireSelectionChanged","_updateTextarea","fire","target","initDimensions","initDelayedCursor","getSelectionStyles","startIndex","arguments","undefined","endIndex","complete","setSelectionStyles","styles","get2DCursorLocation","skipWrapping","render","ctx","cursorOffsetCache","renderCursorOrSelection","toCanvasElement","clearContextTop","boundaries","_getCursorBoundaries","ancestors","findAncestorsWithClipPath","hasAncestorsWithClipping","drawingCtx","drawingCanvas","createCanvasElementFor","getContext","applyCanvasTransform","m","calcTransformMatrix","transform","renderCursor","renderSelection","ancestor","clipPath","clippingCanvas","clippingCtx","absolutePositioned","drawObject","drawClipPathOnCache","setTransform","drawImage","contextTopDirty","restore","clipPathAncestors","obj","push","parent","skipCaching","left","_getLeftOffset","top","_getTopOffset","offsets","_getCursorBoundariesOffsets","leftOffset","topOffset","__getCursorBoundariesOffsets","charIndex","lineIndex","i","getHeightOfLine","lineLeftOffset","_getLineLeftOffset","bound","__charBounds","charSpacing","_textLines","_getWidthOfCharSpacing","direction","textAlign","RIGHT","JUSTIFY","JUSTIFY_RIGHT","LEFT","JUSTIFY_LEFT","CENTER","JUSTIFY_CENTER","renderCursorAt","_renderCursor","contextTop","getCursorRenderingData","cursorLocation","charHeight","getValueOfPropertyAt","multiplier","getObjectScaling","x","getZoom","dy","_fontSizeFraction","lineHeight","color","opacity","_currentCursorOpacity","width","height","fillStyle","globalAlpha","fillRect","selection","hiddenTextarea","_renderSelection","renderDragSourceEffect","dragStartSelection","draggableTextDelegate","getDragStartSelection","renderDropTargetEffect","e","dragSelection","getSelectionStartFromPointer","isJustify","includes","start","end","startLine","endLine","startChar","endChar","lineOffset","realLineHeight","boxStart","boxEnd","isEndOfWrapping","getLineWidth","drawStart","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","l","c","getCurrentCharColor","FILL","cursorPosition","dispose","exitEditingImpl","_defineProperty","classRegistry","setClass"],"mappings":"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"}