{"version":3,"file":"MaxObjectLayout.min.mjs","sources":["../../../../src/LayoutManager/LayoutStrategies/MaxObjectLayout.ts"],"sourcesContent":["import { Point } from '../../Point';\nimport type { FabricObject } from '../../shapes/Object/FabricObject';\nimport type {\n  LayoutStrategyResult,\n  StrictLayoutContext,\n} from '../types';\nimport { LayoutStrategy } from './LayoutStrategy';\nimport { classRegistry } from '../../ClassRegistry';\nimport {\n  LAYOUT_TYPE_INITIALIZATION,\n  LAYOUT_TYPE_IMPERATIVE,\n} from '../constants';\nimport { getObjectBounds } from './utils';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\n\n\n/**\n * Layout will keep target's initial size.\n */\nexport class MaxObjectLayout extends LayoutStrategy {\n  static readonly type = 'max-object';\n\n  /**\n   * @override layout on all triggers\n   * Override at will\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  shouldPerformLayout(context: StrictLayoutContext) {\n    return true;\n  }\n\n  /**\n   * Override this method to customize layout.\n   */\n  calcBoundingBox(\n    objects: FabricObject[],\n    context: StrictLayoutContext,\n  ): LayoutStrategyResult | undefined {\n    const { type, target } = context;\n    if (type === LAYOUT_TYPE_IMPERATIVE && context.overrides) {\n      return context.overrides;\n    }\n    if (objects.length === 0) {\n      return;\n    }\n\n    let maxHeightObject = objects[0];\n    for (const object of objects){\n      if(object.height > maxHeightObject.height){\n        maxHeightObject = object;\n      }\n    }\n\n    const { left, top, width, height } = makeBoundingBoxFromPoints(\n      [maxHeightObject]\n        .map((object) => getObjectBounds(target, object))\n        .reduce<Point[]>((coords, curr) => coords.concat(curr), []),\n    );\n    const bboxSize = new Point(width, height);\n    const bboxLeftTop = new Point(left, top);\n    const bboxCenter = bboxLeftTop.add(bboxSize.scalarDivide(2));\n\n    if (type === LAYOUT_TYPE_INITIALIZATION) {\n      const actualSize = this.getInitialSize(context, {\n        size: bboxSize,\n        center: bboxCenter,\n      });\n      return {\n        // in `initialization` we do not account for target's transformation matrix\n        center: bboxCenter,\n        // TODO: investigate if this is still necessary\n        relativeCorrection: new Point(0, 0),\n        size: actualSize,\n      };\n    } else {\n      //  we send `relativeCenter` up to group's containing plane\n      const center = bboxCenter.transform(target.calcOwnMatrix());\n      return {\n        center,\n        size: bboxSize,\n      };\n    }\n  }\n}\n\nclassRegistry.setClass(MaxObjectLayout);\n"],"names":["MaxObjectLayout","LayoutStrategy","shouldPerformLayout","context","calcBoundingBox","objects","type","target","LAYOUT_TYPE_IMPERATIVE","overrides","length","maxHeightObject","object","height","left","top","width","makeBoundingBoxFromPoints","map","getObjectBounds","reduce","coords","curr","concat","bboxSize","Point","bboxCenter","add","scalarDivide","LAYOUT_TYPE_INITIALIZATION","actualSize","this","getInitialSize","size","center","relativeCorrection","transform","calcOwnMatrix","_defineProperty","classRegistry","setClass"],"mappings":"ieAmBO,MAAMA,UAAwBC,EAQnCC,mBAAAA,CAAoBC,GAClB,OAAO,CACT,CAKAC,eAAAA,CACEC,EACAF,GAEA,MAAMG,KAAEA,EAAIC,OAAEA,GAAWJ,EACzB,GAAIG,IAASE,GAA0BL,EAAQM,UAC7C,OAAON,EAAQM,UAEjB,GAAuB,IAAnBJ,EAAQK,OACV,OAGF,IAAIC,EAAkBN,EAAQ,GAC9B,IAAK,MAAMO,KAAUP,EAChBO,EAAOC,OAASF,EAAgBE,SACjCF,EAAkBC,GAItB,MAAME,KAAEA,EAAIC,IAAEA,EAAGC,MAAEA,EAAKH,OAAEA,GAAWI,EACnC,CAACN,GACEO,KAAKN,GAAWO,EAAgBZ,EAAQK,KACxCQ,QAAgB,CAACC,EAAQC,IAASD,EAAOE,OAAOD,IAAO,KAEtDE,EAAW,IAAIC,EAAMT,EAAOH,GAE5Ba,EADc,IAAID,EAAMX,EAAMC,GACLY,IAAIH,EAASI,aAAa,IAEzD,GAAItB,IAASuB,EAA4B,CACvC,MAAMC,EAAaC,KAAKC,eAAe7B,EAAS,CAC9C8B,KAAMT,EACNU,OAAQR,IAEV,MAAO,CAELQ,OAAQR,EAERS,mBAAoB,IAAIV,EAAM,EAAG,GACjCQ,KAAMH,EAEV,CAGE,MAAO,CACLI,OAFaR,EAAWU,UAAU7B,EAAO8B,iBAGzCJ,KAAMT,EAGZ,EACDc,EAhEYtC,EAAe,OACH,cAiEzBuC,EAAcC,SAASxC"}