{"version":3,"file":"Rect.min.mjs","sources":["../../../src/shapes/Rect.ts"],"sourcesContent":["import { kRect } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const rectDefaultValues: Partial<TClassProperties<Rect>> = {\n  rx: 0,\n  ry: 0,\n};\n\ninterface UniqueRectProps {\n  rx: number;\n  ry: number;\n}\n\nexport interface SerializedRectProps\n  extends SerializedObjectProps,\n    UniqueRectProps {}\n\nexport interface RectProps extends FabricObjectProps, UniqueRectProps {}\n\nconst RECT_PROPS = ['rx', 'ry'] as const;\n\nexport class Rect<\n    Props extends TOptions<RectProps> = Partial<RectProps>,\n    SProps extends SerializedRectProps = SerializedRectProps,\n    EventSpec extends ObjectEvents = ObjectEvents\n  >\n  extends FabricObject<Props, SProps, EventSpec>\n  implements RectProps\n{\n  /**\n   * Horizontal border radius\n   * @type Number\n   * @default\n   */\n  declare rx: number;\n\n  /**\n   * Vertical border radius\n   * @type Number\n   * @default\n   */\n  declare ry: number;\n\n  static type = 'Rect';\n\n  static cacheProperties = [...cacheProperties, ...RECT_PROPS];\n\n  static ownDefaults = rectDefaultValues;\n\n  static getDefaults(): Record<string, any> {\n    return {\n      ...super.getDefaults(),\n      ...Rect.ownDefaults,\n    };\n  }\n\n  /**\n   * Constructor\n   * @param {Object} [options] Options object\n   * @return {Object} thisArg\n   */\n  constructor(options: Props) {\n    super(options);\n    this._initRxRy();\n  }\n\n  /**\n   * Initializes rx/ry attributes\n   * @private\n   */\n  _initRxRy() {\n    const { rx, ry } = this;\n    if (rx && !ry) {\n      this.ry = rx;\n    } else if (ry && !rx) {\n      this.rx = ry;\n    }\n  }\n\n  /**\n   * @private\n   * @param {CanvasRenderingContext2D} ctx Context to render on\n   */\n  _render(ctx: CanvasRenderingContext2D) {\n    const { width: w, height: h } = this;\n    const x = -w / 2;\n    const y = -h / 2;\n    const rx = this.rx ? Math.min(this.rx, w / 2) : 0;\n    const ry = this.ry ? Math.min(this.ry, h / 2) : 0;\n    const isRounded = rx !== 0 || ry !== 0;\n\n    ctx.beginPath();\n\n    ctx.moveTo(x + rx, y);\n\n    ctx.lineTo(x + w - rx, y);\n    isRounded &&\n      ctx.bezierCurveTo(\n        x + w - kRect * rx,\n        y,\n        x + w,\n        y + kRect * ry,\n        x + w,\n        y + ry\n      );\n\n    ctx.lineTo(x + w, y + h - ry);\n    isRounded &&\n      ctx.bezierCurveTo(\n        x + w,\n        y + h - kRect * ry,\n        x + w - kRect * rx,\n        y + h,\n        x + w - rx,\n        y + h\n      );\n\n    ctx.lineTo(x + rx, y + h);\n    isRounded &&\n      ctx.bezierCurveTo(\n        x + kRect * rx,\n        y + h,\n        x,\n        y + h - kRect * ry,\n        x,\n        y + h - ry\n      );\n\n    ctx.lineTo(x, y + ry);\n    isRounded &&\n      ctx.bezierCurveTo(x, y + kRect * ry, x + kRect * rx, y, x + rx, y);\n\n    ctx.closePath();\n\n    this._renderPaintInOrder(ctx);\n  }\n\n  /**\n   * Returns object representation of an instance\n   * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n   * @return {Object} object representation of an instance\n   */\n  toObject<\n    T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n    K extends keyof T = never\n  >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n    return super.toObject([...RECT_PROPS, ...propertiesToInclude]);\n  }\n\n  /**\n   * Returns svg representation of an instance\n   * @return {Array} an array of strings with the specific svg representation\n   * of the instance\n   */\n  _toSVG() {\n    const { width, height, rx, ry } = this;\n    return [\n      '<rect ',\n      'COMMON_PARTS',\n      `x=\"${-width / 2}\" y=\"${\n        -height / 2\n      }\" rx=\"${rx}\" ry=\"${ry}\" width=\"${width}\" height=\"${height}\" />\\n`,\n    ];\n  }\n\n  /**\n   * List of attribute names to account for when parsing SVG element (used by `Rect.fromElement`)\n   * @static\n   * @memberOf Rect\n   * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n   */\n  static ATTRIBUTE_NAMES = [\n    ...SHARED_ATTRIBUTES,\n    'x',\n    'y',\n    'rx',\n    'ry',\n    'width',\n    'height',\n  ];\n\n  /* _FROM_SVG_START_ */\n\n  /**\n   * Returns {@link Rect} instance from an SVG element\n   * @static\n   * @memberOf Rect\n   * @param {HTMLElement} element Element to parse\n   * @param {Object} [options] Options object\n   */\n  static async fromElement(\n    element: HTMLElement,\n    options: Abortable,\n    cssRules?: CSSRules\n  ) {\n    const {\n      left = 0,\n      top = 0,\n      width = 0,\n      height = 0,\n      visible = true,\n      ...restOfparsedAttributes\n    } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n\n    return new this({\n      ...options,\n      ...restOfparsedAttributes,\n      left,\n      top,\n      width,\n      height,\n      visible: Boolean(visible && width && height),\n    });\n  }\n\n  /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Rect);\nclassRegistry.setSVGClass(Rect);\n"],"names":["rectDefaultValues","rx","ry","RECT_PROPS","Rect","FabricObject","getDefaults","_objectSpread","super","ownDefaults","constructor","options","this","_initRxRy","_render","ctx","width","w","height","h","x","y","Math","min","isRounded","beginPath","moveTo","lineTo","bezierCurveTo","kRect","closePath","_renderPaintInOrder","toObject","propertiesToInclude","arguments","length","undefined","_toSVG","concat","fromElement","element","cssRules","_parseAttributes","parseAttributes","ATTRIBUTE_NAMES","left","top","visible","restOfparsedAttributes","_objectWithoutProperties","_excluded","Boolean","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}