{"version":3,"file":"XShapeNotes.min.mjs","sources":["../../../../../src/shapes/canvasx/XShapeNotes/XShapeNotes.ts"],"sourcesContent":["import { classRegistry } from '../../../ClassRegistry';\nimport { getFabricDocument } from '../../../env';\nimport { TClassProperties, TFiller } from '../../../typedefs';\nimport { XTextbase } from '../XTextbase';\n\nimport { shapeList } from './types';\nimport { shapeType } from './types';\n\nimport { WidgetShapeNotesInterface, EntityKeys } from '../type/widget.entity.shapenote';\nimport { createShapeNotesDefaultControls } from '../../../controls/X_commonControls';\nimport { WidgetType } from '../type/widget.type';\n\n\n\nexport type shapeInfo = {\n  name: shapeType;\n  path: string;\n  offsetX: number;\n  offsetY: number;\n  verticalAlign: 'middle' | 'top' | 'bottom';\n  textAlign: 'center' | 'left' | 'right';\n  textMaxHeight?: number;\n  textMaxWidth?: number;\n};\n\nfunction getShapeInfo(shape: string): shapeInfo | null {\n  const shapeObj = shapeList.find((item) => item.name === shape);\n\n  if (!shapeObj) {\n    return shapeList[0] as shapeInfo;\n  } else {\n    return shapeObj as shapeInfo; // Update the type of shapeObj to shapeInfo\n  }\n}\n\nexport const XShapeNotesDefaultValues: Partial<TClassProperties<XShapeNotes>> =\n{\n\n};\n\n\nexport class XShapeNotes extends XTextbase implements WidgetShapeNotesInterface {\n  static type: WidgetType = 'XShapeNotes';\n  static objType: WidgetType = 'XShapeNotes';\n\n  bgShape: shapeInfo | null;\n  verticalAlign: string;\n\n  minHeight: number;\n  shapeName: shapeType;\n\n\n  constructor(text: string, options: Partial<WidgetShapeNotesInterface> & { type: string }) {\n\n\n    super(text, options);\n    this.bgShape = options.shapeName ? getShapeInfo(options.shapeName) : null;\n    // this.width = (options.width || 200) * (options.scaleX || 1);\n    // this.height = (options.height || 200) * (options.scaleY || 1);\n    this.scaleX = 1;\n    this.scaleY = 1;\n    this.id = options.id || '';\n    this.verticalAlign = this.bgShape?.verticalAlign || 'middle';\n    this.textAlign = this.bgShape?.textAlign || 'center';\n    this.shapeName = options.shapeName || 'rect';\n    this.fontSize = options.fontSize || 14;\n    this.fontFamily = options.fontFamily || 'Inter';\n    this.fontWeight = options.fontWeight || 'normal';\n    this.lineHeight = 1.2;\n    this.text = text;\n    this.minWidth = 20;\n    this.minHeight = 20;\n    this.dynamicMinWidth = 2;\n    this.lockScalingFlip = true;\n    this.noScaleCache = false;\n    this._wordJoiners = /[ \\t\\r]/;\n    this.splitByGrapheme = true;\n    this.objType = 'XShapeNotes';\n    this.textAlign = 'center';\n    this.centeredScaling = false;\n    this.cornerColor = 'white';\n    this.cornerStrokeColor = 'gray';\n    this.cornerSize = 10;\n    this.cornerStyle = 'circle';\n    this.transparentCorners = false;\n    this.verticalAlign = 'middle';\n\n\n\n    this.resetSplitByGrapheme();\n    Object.assign(this, {\n      controls: { ...createShapeNotesDefaultControls(this) },\n    });\n\n    this.on('scaling', this.handleScaling);\n    this.on('modified', this.handleModified);\n    this.on('changed', this.handleModified);\n  }\n\n\n\n  getObject() {\n    const entityKeys: string[] = EntityKeys;\n    const result: Record<string, any> = {};\n\n    entityKeys.forEach((key) => {\n      if (key in this) {\n        result[key] = (this as any)[key];\n      }\n    });\n\n    return result;\n  }\n\n\n  handleModified() {\n    this.canvas!.uniformScaling = false;\n    this.resetSplitByGrapheme();\n    this.canvas!.renderAll();\n  }\n\n  resetSplitByGrapheme() {\n    const chineseRegex = /[\\u4e00-\\u9fa5]/; // Regex to match Chinese characters\n    const text = this.text;\n    const includesChinese = chineseRegex.test(text);\n    this.splitByGrapheme = includesChinese;\n  }\n\n  static ownDefaults: Record<string, any> = XShapeNotesDefaultValues;\n\n  static getDefaults() {\n    return {\n      ...super.getDefaults(),\n      ...XShapeNotes.ownDefaults,\n    };\n  }\n\n  handleScaling(event: any) {\n    this.canvas!.uniformScaling = false;\n\n    const newScaleX = this.get('scaleX');\n    const newScaleY = this.get('scaleY');\n\n    this.width *= newScaleX;\n    this.height *= newScaleY;\n\n    if (this.width < this.minWidth) {\n      this.width = this.minWidth;\n    }\n    if (this.height < this.minHeight) {\n      this.height = this.minHeight;\n    }\n\n    this.set({\n      scaleX: 1,\n      scaleY: 1,\n    });\n\n    this.initDimensions();\n    this.setCoords();\n    this.dirty = true;\n    this.canvas?.renderAll();\n  }\n\n  _renderBackground(ctx: any) {\n    if (!this.backgroundColor) {\n      return;\n    }\n    const dim = this._getNonTransformedDimensions();\n    ctx.fillStyle = this.backgroundColor;\n\n    ctx.save();\n\n    const svgPath = new Path2D(this.bgShape?.path || '');\n    const m = getFabricDocument()\n      .createElementNS('http://www.w3.org/2000/svg', 'svg')\n      .createSVGMatrix();\n    m.a = this.width / 100;\n    m.b = 0;\n    m.c = 0;\n    m.d = this.height / 100;\n    m.e = 0;\n    m.f = 0;\n    const path = new Path2D();\n    path.addPath(svgPath, m);\n    ctx.strokeStyle = this.stroke;\n    ctx.stroke(path);\n    ctx.fillStyle = this.backgroundColor;\n    ctx.fill(path);\n    ctx.restore();\n  }\n\n  _getTopOffset() {\n    switch (this.verticalAlign) {\n      case 'middle':\n        return -this._getTotalLineHeight() / 2;\n      case 'bottom':\n        return this.height / 2 - this._getTotalLineHeight();\n      default:\n        return -this.height / 2;\n    }\n  }\n\n  _getTotalLineHeight() {\n    return this._textLines.reduce(\n      (total, _line, index) => total + this.getHeightOfLine(index),\n      0\n    );\n  }\n\n  _renderTextCommon(ctx: any, method: any) {\n    ctx.save();\n    let lineHeights = 0;\n    const left = this._getLeftOffset() + this.bgShape?.offsetX!;\n    const top = this._getTopOffset() + this.bgShape?.offsetY!;\n    const offsets = this._applyPatternGradientTransform(\n      ctx,\n      ((method === 'fillText' ? this.fill : this.stroke) as TFiller) ||\n      this.fill!\n    );\n\n    for (let i = 0, len = this._textLines.length; i < len; i++) {\n      const heightOfLine = this.getHeightOfLine(i);\n      const maxHeight = heightOfLine / this.lineHeight;\n      const leftOffset = this._getLineLeftOffset(i);\n      this._renderTextLine(\n        method,\n        ctx,\n        this._textLines[i],\n        left + leftOffset - offsets.offsetX,\n        top + lineHeights + maxHeight - offsets.offsetY,\n        i\n      );\n      lineHeights += heightOfLine;\n    }\n    ctx.restore();\n  }\n\n  initDimensions() {\n    if (!this.initialized) {\n      return;\n    }\n    this.isEditing && this.initDelayedCursor();\n    this._clearCache();\n    this.dynamicMinWidth = 0;\n    this._styleMap = this._generateStyleMap(this._splitText());\n    if (this.dynamicMinWidth > this.width) {\n      this.set('fontSize', this.fontSize - 2);\n      this._splitTextIntoLines(this.text);\n      return;\n    }\n    if (this.textAlign.indexOf('justify') !== -1) {\n      this.enlargeSpaces();\n    }\n    const height = this.calcTextHeight();\n    if (height > this.height && this.fontSize > 6) {\n      this.set('fontSize', this.fontSize - 2);\n      this._splitTextIntoLines(this.text);\n      return;\n    }\n\n    return this.height;\n  }\n\n  _getTotalLineHeights() {\n    return this._textLines.reduce(\n      (total, _line, index) => total + this.getHeightOfLine(index),\n      0\n    );\n  }\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      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\nclassRegistry.setClass(XShapeNotes);\n"],"names":["XShapeNotesDefaultValues","XShapeNotes","XTextbase","constructor","text","options","_this$bgShape","_this$bgShape2","shape","super","_defineProperty","this","bgShape","shapeName","shapeList","find","item","name","scaleX","scaleY","id","verticalAlign","textAlign","fontSize","fontFamily","fontWeight","lineHeight","minWidth","minHeight","dynamicMinWidth","lockScalingFlip","noScaleCache","_wordJoiners","splitByGrapheme","objType","centeredScaling","cornerColor","cornerStrokeColor","cornerSize","cornerStyle","transparentCorners","resetSplitByGrapheme","Object","assign","controls","_objectSpread","createShapeNotesDefaultControls","on","handleScaling","handleModified","getObject","result","EntityKeys","forEach","key","canvas","uniformScaling","renderAll","includesChinese","test","getDefaults","ownDefaults","event","_this$canvas","newScaleX","get","newScaleY","width","height","set","initDimensions","setCoords","dirty","_renderBackground","ctx","_this$bgShape3","backgroundColor","_getNonTransformedDimensions","fillStyle","save","svgPath","Path2D","path","m","getFabricDocument","createElementNS","createSVGMatrix","a","b","c","d","e","f","addPath","strokeStyle","stroke","fill","restore","_getTopOffset","_getTotalLineHeight","_textLines","reduce","total","_line","index","getHeightOfLine","_renderTextCommon","method","_this$bgShape4","_this$bgShape5","lineHeights","left","_getLeftOffset","offsetX","top","offsetY","offsets","_applyPatternGradientTransform","i","len","length","heightOfLine","maxHeight","leftOffset","_getLineLeftOffset","_renderTextLine","initialized","isEditing","initDelayedCursor","_clearCache","_styleMap","_generateStyleMap","_splitText","_splitTextIntoLines","indexOf","enlargeSpaces","calcTextHeight","_getTotalLineHeights","graphemeSplitForRectNotes","textstring","graphemes","words","split","push","j","classRegistry","setClass"],"mappings":"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"}