@roomle/embedding-lib 5.32.0 → 5.33.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/docs/md/web/embedding/CHANGELOG.md +10 -62
  2. package/package.json +1 -1
  3. package/packages/embedding-lib/src/embedding-lib.d.ts +1 -0
  4. package/packages/embedding-lib/src/examples/utils/homag-intelligence/create-catalog.d.ts +1 -0
  5. package/packages/embedding-lib/src/examples/utils/homag-intelligence/default-api-options.d.ts +6 -22
  6. package/packages/embedding-lib/src/examples/utils/homag-intelligence/util.d.ts +6 -1
  7. package/packages/web-sdk/packages/common-core/mock/kernel-instances.d.ts +1 -0
  8. package/packages/web-sdk/packages/common-core/mock/mock-image-renderer.d.ts +1 -1
  9. package/packages/web-sdk/packages/common-core/src/configurator-kernel-access.d.ts +2 -2
  10. package/packages/web-sdk/packages/common-core/src/utils/shims.d.ts +0 -6
  11. package/packages/web-sdk/packages/common-core/src/view-model/configurator-view-model.d.ts +2 -1
  12. package/packages/web-sdk/packages/common-core/src/webgl/image-renderer.d.ts +2 -1
  13. package/packages/web-sdk/packages/configurator-core/mock/configurator-mock-data.d.ts +0 -2
  14. package/packages/web-sdk/packages/configurator-core/src/roomle-configurator.d.ts +2 -0
  15. package/packages/web-sdk/packages/configurator-core/src/webgl/configurator-scene-manager.d.ts +2 -0
  16. package/packages/web-sdk/packages/homag-intelligence/__tests__/hi-object-selection-test.d.ts +1 -0
  17. package/packages/web-sdk/packages/homag-intelligence/src/api.d.ts +1 -6
  18. package/packages/web-sdk/packages/homag-intelligence/src/debug-logging.d.ts +5 -10
  19. package/packages/web-sdk/packages/homag-intelligence/src/external-object-api.d.ts +38 -0
  20. package/packages/web-sdk/packages/homag-intelligence/src/glue-logic.d.ts +7 -12
  21. package/packages/web-sdk/packages/homag-intelligence/src/hi-object-selection.d.ts +9 -1
  22. package/packages/web-sdk/packages/homag-intelligence/src/loader.d.ts +4 -20
  23. package/packages/web-sdk/packages/homag-intelligence/src/model/oc-scripts-domain.model.d.ts +11 -8
  24. package/packages/web-sdk/packages/planner-core/src/roomle-planner.d.ts +4 -25
  25. package/packages/web-sdk/packages/planner-core/src/view-model/plan-view-model.d.ts +2 -0
  26. package/packages/web-sdk/packages/planner-core/src/webgl/planner-scene-manager.d.ts +5 -3
  27. package/packages/web-sdk/packages/typings/kernel.d.ts +14 -8
  28. package/packages/web-sdk/packages/typings/planner.d.ts +3 -2
  29. package/packages/web-sdk/packages/typings/rapi-types.d.ts +0 -4
  30. package/roomle-embedding-lib.es.js +22 -21
  31. package/roomle-embedding-lib.es.min.js +1 -1
  32. package/roomle-embedding-lib.umd.js +6 -6
  33. package/roomle-embedding-lib.umd.min.js +1 -1
  34. package/src/common/composables/use-configurator-actions-visibility.d.ts +1 -1
  35. package/src/configurator/business-logic/sdk-connector.d.ts +1 -0
  36. package/src/configurator/embedding/exposed-api.d.ts +5 -0
  37. package/src/planner/business-logic/sdk-connector-planner.d.ts +1 -0
@@ -1,6 +1,6 @@
1
1
  import { Base64Image, CanvasOffset } from '../../../common-core/src/common-interfaces';
2
2
  import { PlannerKernelCallbackI } from '../services/planner-kernel-access';
3
- import { CORE_TYPE_OF_CORE_ID, CancelSelectionReasons, Plan, PlanElement } from '../../../typings/planner';
3
+ import { CancelSelectionReasons, CORE_TYPE_OF_CORE_ID, Plan, PlanElement } from '../../../typings/planner';
4
4
  import { KernelPlanObjectComponent, KernelEnum, KernelPlanObject, KernelVector3, RuntimeId } from '../../../typings/kernel';
5
5
  import { default as PlannerSceneEventHandler } from './planner-scene-event-handler';
6
6
  import { BatchPaintMaterial, InsertItemIdInfo, InsertItemResult, RoomlePlannerCallback, SceneEvents } from '../roomle-planner';
@@ -14,7 +14,7 @@ import { default as PlanViewModel } from '../view-model/plan-view-model';
14
14
  import { default as ConfiguratorSceneManager } from '../../../configurator-core/src/webgl/configurator-scene-manager';
15
15
  import { default as WallPlanElementViewModel } from '../view-model/wall-plan-element-view-model';
16
16
  import { Enumify } from '../../../common-core/src/types';
17
- import { Object3D, Box3 } from 'three';
17
+ import { Box3, Object3D } from 'three';
18
18
  import { CameraTarget, PrepareImageOptions } from '../../../common-core/src/webgl/image-renderer';
19
19
  import { default as Planner2dCameraBehaviour } from '../../../common-core/src/cameracontrol/planner-2d-camera-behaviour';
20
20
  import { default as Planner3dCameraBehaviour } from '../../../common-core/src/cameracontrol/planner-3d-camera-behaviour';
@@ -23,6 +23,7 @@ import { EMSConstant } from '../../../typings/planner-kernel-container';
23
23
  import { default as InitData } from '../../../common-core/src/utils/init-data';
24
24
  import { RoomleLightSource } from '../../../common-core/src/light/light-source';
25
25
  import { HomagIntelligence } from '../../../homag-intelligence/src/homag-intelligence';
26
+ import { PosArticle } from '../../../homag-intelligence/src/model/oc-scripts-domain.model';
26
27
 
27
28
  export declare function isLockedElement(planElementViewModel: PlanElementViewModel, initData: InitData): boolean;
28
29
  declare const SET_WALL_MATERIAL_TYPE: {
@@ -236,7 +237,8 @@ export default class PlannerSceneManager extends ConfiguratorSceneManager implem
236
237
  private _insertRapiItems;
237
238
  insertRapiObjects(rapiIds: InsertItemIdInfo[]): Promise<InsertItemResult[]>;
238
239
  private _saveConfiguration;
239
- externalObjectRequestAddOnContainers(groupId: string, subArticleId: string): void;
240
+ externalObjectRequestAddOnContainers(groupId: string, subArticleId: string): Promise<void>;
240
241
  externalObjectAddSubArticle(subArticleId: string, rootModuleId: string, parentModuleId: string): void;
242
+ getExternalSubArticles(id: number): PosArticle[];
241
243
  }
242
244
  export {};
@@ -54,7 +54,6 @@ export interface ConfigurationObject extends Object {
54
54
  [key: string]: any;
55
55
  }
56
56
  export interface KernelPossibleChild {
57
- externalComponent: boolean;
58
57
  componentId?: RapiId;
59
58
  itemId?: RapiId;
60
59
  isDefault?: boolean;
@@ -72,6 +71,7 @@ export interface KernelPart {
72
71
  count: number;
73
72
  currencySymbol: string;
74
73
  permissionToDelete: KernelPermissionToDelete;
74
+ permissionToDeleteInIsolation: KernelPermissionToDelete;
75
75
  label: string;
76
76
  parameters: KernelPartListParameter[];
77
77
  price: number;
@@ -142,9 +142,14 @@ export interface UiKernelParameter extends KernelParameter {
142
142
  };
143
143
  additionalInfos?: AdditionalInfo[];
144
144
  }
145
- export interface UiPossibleChild extends RapiElement {
145
+ export interface PossibleChildPreviewElement {
146
+ id: string;
147
+ configuration?: ConfigurationString;
148
+ articleId?: string;
146
149
  isItem: boolean;
147
150
  isComponent: boolean;
151
+ }
152
+ export interface UiPossibleChild extends RapiElement, PossibleChildPreviewElement {
148
153
  group: string;
149
154
  possible: boolean;
150
155
  subTags: UiPossibleChild[];
@@ -261,11 +266,12 @@ export declare const CORE_PERMISSION_TO_DELETE: {
261
266
  readonly ALWAYS: 2;
262
267
  };
263
268
  export interface KernelPlanObjectComponent extends KernelPlanObjectBase {
269
+ isExternalObject: boolean;
264
270
  type: KernelComponentType;
271
+ isChildObject: boolean;
265
272
  objectMode: ChildEntityMode;
266
273
  planComponentRuntimeId: number;
267
274
  componentId: string;
268
- permissionToDelete: KernelPermissionToDelete;
269
275
  parentObjectId: number;
270
276
  childObjectIds: ems.EmsArray<number>;
271
277
  externalObjectGroupId: string;
@@ -273,6 +279,9 @@ export interface KernelPlanObjectComponent extends KernelPlanObjectBase {
273
279
  externalSubModuleId: string;
274
280
  isAGeneratedModule: boolean;
275
281
  canBeDeleted: boolean;
282
+ permissionToDelete: KernelPermissionToDelete;
283
+ permissionToDeleteInIsolation: KernelPermissionToDelete;
284
+ isExchangeable: boolean;
276
285
  animations?: KernelAnimation[];
277
286
  }
278
287
  export interface UiPlanObject extends KernelPlanObject {
@@ -308,6 +317,7 @@ export interface KernelComponent {
308
317
  id: number;
309
318
  valid: boolean;
310
319
  permissionToDelete: KernelPermissionToDelete;
320
+ permissionToDeleteInIsolation: KernelPermissionToDelete;
311
321
  objectId: number;
312
322
  rootId: number;
313
323
  rootSiblingIds: number[];
@@ -477,11 +487,6 @@ export interface KernelVariant {
477
487
  currencySymbol: string;
478
488
  parameterValues: KernelParameterValue[];
479
489
  }
480
- export interface KernelExternalObjectDocking {
481
- groupId: string;
482
- parentModuleId: string;
483
- moduleName: string;
484
- }
485
490
  export interface ExternalModuleInformation {
486
491
  groupId: string;
487
492
  rootModuleId: string;
@@ -496,6 +501,7 @@ export interface KernelObjectInformation {
496
501
  source: string;
497
502
  type: KernelComponentType;
498
503
  permissionToDelete: KernelPermissionToDelete;
504
+ permissionToDeleteInIsolation: KernelPermissionToDelete;
499
505
  }
500
506
  export interface ExternalAttributeInformation {
501
507
  groupId: string;
@@ -29,6 +29,7 @@ export interface Plan extends KernelObject {
29
29
  getPlanXML(includeRuntimeId: boolean, xmlVersion: number /** current version is 2 */): string;
30
30
  createPlanXmlWithSingleObject(object: PlanObject, includeRuntimeId: boolean, version: number): string;
31
31
  createPlanXmlWithObjects(objectId: string | string[], includeRuntimeId: boolean, version: number): string;
32
+ getRotationForFrontView(objectIds: number | number[]): number;
32
33
  getWallCount(): number;
33
34
  getId(): number;
34
35
  }
@@ -143,7 +144,7 @@ export interface ContinuousDrawingManager {
143
144
  shouldShowCircle(): boolean;
144
145
  isCorridorValid(): boolean;
145
146
  getCorridor(): any;
146
- getDrawnPoints(): KernelObjectPtrList;
147
+ getDrawnPoints(): PointArray;
147
148
  CIRCLE_RADIUS: number;
148
149
  }
149
150
  interface Anchor {
@@ -179,7 +180,7 @@ export interface ExternalObjectLoadConfiguration {
179
180
  export interface ExternalValidContainerModule {
180
181
  containerModuleId: string;
181
182
  parentModuleId: string;
182
- rootModuleId: string;
183
+ rootId: string;
183
184
  }
184
185
  export interface PlanInteractionHandler {
185
186
  init(reference: PlanInteractionHandler, zoomFactor: number, viewSnapDist: number, wallSnapMode: any, objectSnapMode: any, shouldSnap: boolean, drawingType: any): PlanInteractionHandler;
@@ -320,10 +320,6 @@ export interface RapiPlanSnapshotGetData extends RapiPlanSnapshotPostData {
320
320
  perspectiveImage: string;
321
321
  topImage: string;
322
322
  }
323
- export interface RapiPlanSnapshotGetDataWith3dUrls extends RapiPlanSnapshotGetData {
324
- glb: string;
325
- usdz: string;
326
- }
327
323
  export interface RapiRetailer extends RapiJson {
328
324
  }
329
325
  export interface RapiConfiguration extends RapiJson {
@@ -1,4 +1,4 @@
1
- class H {
1
+ class P {
2
2
  _side;
3
3
  // for better debugging (who handles message? iframe or website?)
4
4
  _incomingMessageBus = null;
@@ -108,11 +108,11 @@ class H {
108
108
  * Copyright 2019 Google LLC
109
109
  * SPDX-License-Identifier: Apache-2.0
110
110
  */
111
- const B = Symbol("Comlink.proxy"), X = Symbol("Comlink.endpoint"), j = Symbol("Comlink.releaseProxy"), T = Symbol("Comlink.finalizer"), w = Symbol("Comlink.thrown"), G = (e) => typeof e == "object" && e !== null || typeof e == "function", Z = {
111
+ const B = Symbol("Comlink.proxy"), X = Symbol("Comlink.endpoint"), j = Symbol("Comlink.releaseProxy"), M = Symbol("Comlink.finalizer"), w = Symbol("Comlink.thrown"), G = (e) => typeof e == "object" && e !== null || typeof e == "function", Z = {
112
112
  canHandle: (e) => G(e) && e[B],
113
113
  serialize(e) {
114
114
  const { port1: t, port2: s } = new MessageChannel();
115
- return P(e, t), [s, [s]];
115
+ return H(e, t), [s, [s]];
116
116
  },
117
117
  deserialize(e) {
118
118
  return e.start(), re(e);
@@ -143,7 +143,7 @@ function te(e, t) {
143
143
  return !0;
144
144
  return !1;
145
145
  }
146
- function P(e, t = globalThis, s = ["*"]) {
146
+ function H(e, t = globalThis, s = ["*"]) {
147
147
  t.addEventListener("message", function r(n) {
148
148
  if (!n || !n.data)
149
149
  return;
@@ -174,7 +174,7 @@ function P(e, t = globalThis, s = ["*"]) {
174
174
  case "ENDPOINT":
175
175
  {
176
176
  const { port1: d, port2: h } = new MessageChannel();
177
- P(e, h), l = ae(d, [d]);
177
+ H(e, h), l = ae(d, [d]);
178
178
  }
179
179
  break;
180
180
  case "RELEASE":
@@ -188,7 +188,7 @@ function P(e, t = globalThis, s = ["*"]) {
188
188
  }
189
189
  Promise.resolve(l).catch((u) => ({ value: u, [w]: 0 })).then((u) => {
190
190
  const [g, d] = S(u);
191
- t.postMessage(Object.assign(Object.assign({}, g), { id: o }), d), a === "RELEASE" && (t.removeEventListener("message", r), V(t), T in e && typeof e[T] == "function" && e[T]());
191
+ t.postMessage(Object.assign(Object.assign({}, g), { id: o }), d), a === "RELEASE" && (t.removeEventListener("message", r), V(t), M in e && typeof e[M] == "function" && e[M]());
192
192
  }).catch((u) => {
193
193
  const [g, d] = S({
194
194
  value: new TypeError("Unserializable return value"),
@@ -350,7 +350,7 @@ function p(e, t, s, r) {
350
350
  function le() {
351
351
  return new Array(4).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join("-");
352
352
  }
353
- const A = ".", M = {
353
+ const T = ".", A = {
354
354
  REQUEST_BOOT: "requestBoot",
355
355
  SETUP: "setup",
356
356
  WEBSITE_READY: "websiteReady"
@@ -458,8 +458,8 @@ const _e = (e) => JSON.parse(JSON.stringify(e)), Ee = {
458
458
  rotationSnapDegrees: 10,
459
459
  interactionsCollapsed: !1
460
460
  }, we = "(idle)", ye = (e) => (I(e), e?.customApiUrl && (e.customApiUrl = decodeURIComponent(e.customApiUrl)), e.shareUrl && (e.deeplink = e.shareUrl.replace(
461
- Te,
462
- Ae
461
+ Me,
462
+ Te
463
463
  )), e), I = (e) => {
464
464
  if (!e)
465
465
  return;
@@ -480,7 +480,7 @@ const _e = (e) => JSON.parse(JSON.stringify(e)), Ee = {
480
480
  e.locale || (e.locale = me()), e.id === we && delete e.id;
481
481
  const t = fe();
482
482
  return t && he(t) && (e.configuratorId = "demoConfigurator"), e.customApiUrl = void 0, e.emails = !1, e;
483
- }, Te = "<CONF_ID>", Ae = "#CONFIGURATIONID#", Me = (e) => {
483
+ }, Me = "<CONF_ID>", Te = "#CONFIGURATIONID#", Ae = (e) => {
484
484
  e.featureFlags || (e.featureFlags = {}), typeof e.featureFlags.realPartList != "boolean" && (e.featureFlags.realPartList = !0), typeof e.featureFlags.globalCallbacks != "boolean" && (e.featureFlags.globalCallbacks = !0), typeof e.featureFlags.mocAr != "boolean" && (e.featureFlags.mocAr = !1);
485
485
  }, D = () => /(android)/i.test(navigator.userAgent);
486
486
  class x {
@@ -513,7 +513,7 @@ class x {
513
513
  handleSetup(t) {
514
514
  const { methods: s, callbacks: r } = t;
515
515
  s.forEach((n) => {
516
- const o = n.split(A), a = o[0], i = o[1];
516
+ const o = n.split(T), a = o[0], i = o[1];
517
517
  this[a] || (this[a] = {}), this[a][i] = (function() {
518
518
  if (!this._messageHandler) {
519
519
  console.error("MessageHandler not set");
@@ -522,13 +522,13 @@ class x {
522
522
  return this._messageHandler.sendMessage(n, [...arguments]);
523
523
  }).bind(this);
524
524
  }), r.forEach((n) => {
525
- const o = n.split(A), a = o[0], i = o[1], c = o[2];
525
+ const o = n.split(T), a = o[0], i = o[1], c = o[2];
526
526
  this[a] || (this[a] = {}), this[a][i] || (this[a][i] = {}), this[a][i][c] = () => {
527
527
  };
528
528
  }), this.isSetupDone = !0;
529
529
  }
530
530
  executeMessage({ message: t, args: s }) {
531
- const r = t.split(A), n = r[0], o = r[1], a = r.length === 3 ? r[2] : null;
531
+ const r = t.split(T), n = r[0], o = r[1], a = r.length === 3 ? r[2] : null;
532
532
  if (a && this[n][o][a]) {
533
533
  const i = this[n][o][a](
534
534
  ...s
@@ -660,7 +660,7 @@ class Ne extends x {
660
660
  if (r.isSetupDone)
661
661
  return r.executeMessage({ message: g, args: d });
662
662
  }
663
- }, l = new H(
663
+ }, l = new P(
664
664
  "custom-view-" + t,
665
665
  window,
666
666
  window.parent,
@@ -720,13 +720,14 @@ class Ne extends x {
720
720
  n
721
721
  );
722
722
  }
723
+ static hiMessageHandler = null;
723
724
  static setupHi(t) {
724
- window.addEventListener("message", (s) => {
725
+ this.hiMessageHandler && window.removeEventListener("message", this.hiMessageHandler), this.hiMessageHandler = (s) => {
725
726
  if (s.data.type === "connect_hi" && s.data.port) {
726
727
  const r = s.data.port;
727
- r.start?.(), P(be(t), r);
728
+ r.start?.(), H(be(t), r);
728
729
  }
729
- });
730
+ }, window.addEventListener("message", this.hiMessageHandler);
730
731
  }
731
732
  static async _create(t, s, r, n) {
732
733
  return new Promise(async (o, a) => {
@@ -735,7 +736,7 @@ class Ne extends x {
735
736
  Se(),
736
737
  ye(r)
737
738
  );
738
- Me(i);
739
+ Ae(i);
739
740
  const c = await ue(
740
741
  t,
741
742
  i
@@ -783,7 +784,7 @@ class Ne extends x {
783
784
  `, document.head.appendChild(u);
784
785
  }
785
786
  this._executeMessage = this._executeMessage.bind(this);
786
- const i = new H(
787
+ const i = new P(
787
788
  "website",
788
789
  window,
789
790
  null,
@@ -814,7 +815,7 @@ class Ne extends x {
814
815
  }
815
816
  _executeMessage({ message: t, args: s }, r) {
816
817
  if (r.source && r.source === this._iframe?.contentWindow)
817
- return t === M.REQUEST_BOOT ? this._messageHandler ? (this._messageHandler.setOutgoingMessageBus(r.source), Promise.resolve({ result: this._initData })) : (console.error("MessageHandler not set"), Promise.resolve({ error: "MessageHandler not set" })) : t === M.SETUP ? (this.handleSetup(s[0]), F(
818
+ return t === A.REQUEST_BOOT ? this._messageHandler ? (this._messageHandler.setOutgoingMessageBus(r.source), Promise.resolve({ result: this._initData })) : (console.error("MessageHandler not set"), Promise.resolve({ error: "MessageHandler not set" })) : t === A.SETUP ? (this.handleSetup(s[0]), F(
818
819
  this.ui.callbacks,
819
820
  "onUseFullPage",
820
821
  this._onUseFullPage
@@ -827,7 +828,7 @@ class Ne extends x {
827
828
  console.error("MessageHandler not set");
828
829
  return;
829
830
  }
830
- this._messageHandler.sendMessage(M.WEBSITE_READY);
831
+ this._messageHandler.sendMessage(A.WEBSITE_READY);
831
832
  }, 0), Promise.resolve({ result: null })) : this.executeMessage({ message: t, args: s });
832
833
  }
833
834
  }
@@ -1 +1 @@
1
- class e{_side;_incomingMessageBus=null;_outgoingMessageBus=null;_execMessage=null;constructor(e,t,s,r){this._side=e,this._incomingMessageBus=t,this._outgoingMessageBus=s,this._execMessage=r,this._incomingMessageBus&&this._incomingMessageBus.addEventListener("message",this._handleMessage.bind(this))}setOutgoingMessageBus(e){this._outgoingMessageBus=e}setMessageExecution(e){this._execMessage=e}sendMessage(e,t=[]){return new Promise((s,r)=>{if(this._incomingMessageBus===this._outgoingMessageBus)return s(void 0);const n=new MessageChannel;n.port1.onmessage=e=>{if(!e||!e.data)return n.port1.close(),n.port2.close(),r(new Error(this._side+" received message but response can not be interpreted"));let t;try{t=JSON.parse(e.data)}catch(e){return n.port1.close(),n.port2.close(),this._prepareError(e),r(e)}t.error?r(t.error):void 0!==t.result?s(t.result):s(void 0),n.port1.close(),n.port2.close()};let a="";try{a=JSON.stringify({message:e,args:t})}catch{return r(new Error(this._side+": can not create command because it is not JSON.stringify able"))}if(!this._outgoingMessageBus)return r(new Error(this._side+": outgoing bus not set yet"));this._outgoingMessageBus.postMessage(a,"*",[n.port2])})}_handleMessage(e){const t=e.ports&&Array.isArray(e.ports)&&e.ports.length>0?e.ports[0]:null;if(e.data&&("string"==typeof e.data||"connect_hi"!==e.data.type)&&t)try{const s=JSON.parse(e.data);if(!this._execMessage)return t.postMessage(JSON.stringify({error:this._side+" is not ready to handle messages"}));Array.isArray(s.args)||(s.args=[s.args]);const r=this._execMessage(s,e);if(void 0===r)return;r.then((e={})=>{let s,r;"object"==typeof e&&null!==e&&(s=e.error,r=e.result),s?t.postMessage(JSON.stringify({error:s})):void 0!==r?t.postMessage(JSON.stringify({result:r})):t.postMessage(JSON.stringify({result:e}))},e=>{t.postMessage(JSON.stringify({error:this._prepareError(e)}))})}catch(e){t.postMessage(JSON.stringify({error:this._prepareError(e)}))}}_prepareError(e){return"string"==typeof e?this._side+": "+e:(e.message=this._side+": "+e.message,e.message)}}const t=Symbol("Comlink.proxy"),s=Symbol("Comlink.endpoint"),r=Symbol("Comlink.releaseProxy"),n=Symbol("Comlink.finalizer"),a=Symbol("Comlink.thrown"),i=e=>"object"==typeof e&&null!==e||"function"==typeof e,o=new Map([["proxy",{canHandle:e=>i(e)&&e[t],serialize(e){const{port1:t,port2:s}=new MessageChannel;return l(e,t),[s,[s]]},deserialize:e=>(e.start(),function(e){const t=new Map;return e.addEventListener("message",function(e){const{data:s}=e;if(!s||!s.id)return;const r=t.get(s.id);if(r)try{r(s)}finally{t.delete(s.id)}}),m(e,t,[],void 0)}(e))}],["throw",{canHandle:e=>i(e)&&a in e,serialize({value:e}){let t;return t=e instanceof Error?{isError:!0,value:{message:e.message,name:e.name,stack:e.stack}}:{isError:!1,value:e},[t,[]]},deserialize(e){throw e.isError?Object.assign(new Error(e.value.message),e.value):e.value}}]]);function l(e,s=globalThis,r=["*"]){s.addEventListener("message",function i(o){if(!o||!o.data)return;if(!function(e,t){for(const s of e)if(t===s||"*"===s||s instanceof RegExp&&s.test(t))return!0;return!1}(r,o.origin))return;const{id:u,type:g,path:d}=Object.assign({path:[]},o.data),h=(o.data.argumentList||[]).map(y);let m;try{const s=d.slice(0,-1).reduce((e,t)=>e[t],e),r=d.reduce((e,t)=>e[t],e);switch(g){case"GET":m=r;break;case"SET":s[d.slice(-1)[0]]=y(o.data.value),m=!0;break;case"APPLY":m=r.apply(s,h);break;case"CONSTRUCT":m=function(e){return Object.assign(e,{[t]:!0})}(new r(...h));break;case"ENDPOINT":{const{port1:t,port2:s}=new MessageChannel;l(e,s),m=function(e,t){return w.set(e,t),e}(t,[t])}break;case"RELEASE":m=void 0;break;default:return}}catch(e){m={value:e,[a]:0}}Promise.resolve(m).catch(e=>({value:e,[a]:0})).then(t=>{const[r,a]=_(t);s.postMessage(Object.assign(Object.assign({},r),{id:u}),a),"RELEASE"===g&&(s.removeEventListener("message",i),c(s),n in e&&"function"==typeof e[n]&&e[n]())}).catch(e=>{const[t,r]=_({value:new TypeError("Unserializable return value"),[a]:0});s.postMessage(Object.assign(Object.assign({},t),{id:u}),r)})}),s.start&&s.start()}function c(e){(function(e){return"MessagePort"===e.constructor.name})(e)&&e.close()}function u(e){if(e)throw new Error("Proxy has been released and is not useable")}function g(e){return b(e,new Map,{type:"RELEASE"}).then(()=>{c(e)})}const d=new WeakMap,h="FinalizationRegistry"in globalThis&&new FinalizationRegistry(e=>{const t=(d.get(e)||0)-1;d.set(e,t),0===t&&g(e)});function m(e,t,n=[],a=function(){}){let i=!1;const o=new Proxy(a,{get(s,a){if(u(i),a===r)return()=>{(function(e){h&&h.unregister(e)})(o),g(e),t.clear(),i=!0};if("then"===a){if(0===n.length)return{then:()=>o};const s=b(e,t,{type:"GET",path:n.map(e=>e.toString())}).then(y);return s.then.bind(s)}return m(e,t,[...n,a])},set(s,r,a){u(i);const[o,l]=_(a);return b(e,t,{type:"SET",path:[...n,r].map(e=>e.toString()),value:o},l).then(y)},apply(r,a,o){u(i);const l=n[n.length-1];if(l===s)return b(e,t,{type:"ENDPOINT"}).then(y);if("bind"===l)return m(e,t,n.slice(0,-1));const[c,g]=f(o);return b(e,t,{type:"APPLY",path:n.map(e=>e.toString()),argumentList:c},g).then(y)},construct(s,r){u(i);const[a,o]=f(r);return b(e,t,{type:"CONSTRUCT",path:n.map(e=>e.toString()),argumentList:a},o).then(y)}});return function(e,t){const s=(d.get(t)||0)+1;d.set(t,s),h&&h.register(e,t,e)}(o,e),o}function p(e){return Array.prototype.concat.apply([],e)}function f(e){const t=e.map(_);return[t.map(e=>e[0]),p(t.map(e=>e[1]))]}const w=new WeakMap;function _(e){for(const[t,s]of o)if(s.canHandle(e)){const[r,n]=s.serialize(e);return[{type:"HANDLER",name:t,value:r},n]}return[{type:"RAW",value:e},w.get(e)||[]]}function y(e){switch(e.type){case"HANDLER":return o.get(e.name).deserialize(e.value);case"RAW":return e.value}}function b(e,t,s,r){return new Promise(n=>{const a=new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");t.set(a,n),e.start&&e.start(),e.postMessage(Object.assign({id:a},s),r)})}const v=["127.0.0.1","localhost","0.0.0.0"],M=["language","browserLanguage","userLanguage","systemLanguage"],E=(e,t)=>{for(const s in t)try{t[s].constructor===Object?e[s]=E(e[s],t[s]):e[s]=t[s]}catch{e[s]=t[s]}return e};var S=(e=>(e.BOTTOM_BAR="bottom_bar",e.PARTLIST_BOUNDS="partlist_bounds",e.INTERACTION_NOTES="interaction_notes",e.PARAMETER_GROUPS="parameter_groups",e))(S||{});const T={mobileLandscape:!0,floorMaterialRootTag:"materials_root",buttons:{renderimage:!0,requestproduct:!0,requestplan:!0,load_product:!0,partlist_print:!0},elements:{[S.INTERACTION_NOTES]:!0},helpcenter:{roomdesigner:!0,configurator:!1,disable:!1},firstPersonView:!0,saveToIdb:!0,featureFlags:{mocAr:!0,wallAutoHeight:!1,openCloseAnimation:!0,enableTwoLevelCatalog:!1,webGpu:!1},rotationSnapDegrees:10,interactionsCollapsed:!1},O=e=>{if(!e)return;const t=Object.keys(e);for(const s of t){const t=e[s];if(!Array.isArray(t)&&"object"==typeof t&&null!==t&&O(t),Array.isArray(t))for(const e of t)O(e);("true"===t||"false"===t)&&(e[s]="true"===t)}},P=()=>/(android)/i.test(navigator.userAgent);class A{_messageHandler=null;isSetupDone=!1;viewName="main";plugins={};pluginsLoaded=[];ui={callbacks:null};extended={callbacks:null};configurator={callbacks:null};analytics={callbacks:{}};rapi={callbacks:{}};global={callbacks:{}};setMessageHandler(e){this._messageHandler=e}handleSetup(e){const{methods:t,callbacks:s}=e;t.forEach(e=>{const t=e.split("."),s=t[0],r=t[1];this[s]||(this[s]={}),this[s][r]=function(){if(this._messageHandler)return this._messageHandler.sendMessage(e,[...arguments])}.bind(this)}),s.forEach(e=>{const t=e.split("."),s=t[0],r=t[1],n=t[2];this[s]||(this[s]={}),this[s][r]||(this[s][r]={}),this[s][r][n]=()=>{}}),this.isSetupDone=!0}executeMessage({message:e,args:t}){const s=e.split("."),r=s[0],n=s[1],a=3===s.length?s[2]:null;if(a&&this[r][n][a]){const e=this[r][n][a](...t);return e instanceof Promise?e.then(e=>({result:e})):void 0!==e?Promise.resolve({result:e}):Promise.resolve({result:null})}return Promise.reject('Message "'+e+'" is unkown')}setupPlugins(e,t,s="website"){for(const r of e)"string"==typeof r&&"dragIn"===r?this.pluginsLoaded.push(new Promise((e,r)=>{try{import("./drag-in-BmoiEqfA.mjs").then(e=>e.l).then(({DragIn:n})=>{const a=new n(this.ui,t,s,this.viewName);a.init().then(()=>{this.plugins.dragIn=a,e()},r)})}catch(e){r(e)}})):r.name&&r.loader&&this.pluginsLoaded.push(new Promise((e,n)=>{try{r.loader().then(a=>{const i=new a(this.ui,t,s,this.viewName);i.init().then(()=>{this.plugins[r.name]=i,e()},n)})}catch(e){n(e)}}))}}const L=()=>{let e,t;return{promise:new Promise((s,r)=>{e=s,t=r}),resolve:e,reject:t}},N=(e,t,s)=>{let r=null;Object.defineProperty(e,t,{get:()=>r||s,set(e){r=e?.mute?e.value:e}})},k=()=>.01*window.innerHeight+"px",R=e=>{e&&setTimeout(()=>e.style.setProperty(C,k()),0)},I="rml-styles",C="--rml-full-height",x="rml-container",H="rml-fill",B="rml-pos",D="rml-android-height",U="rml-overflow-hidden",F=new Map,j={HIDE:"hide",SHOW_ATTRIBUTES:"attributes",SHOW_ARTICLES:"articles"};class z extends A{static createPlanner(e,t,s,r=[]){return this._create(e,t,s,r)}static async connect(t,s=[]){const r=new A;r.viewName=t;const{resolve:n,promise:a}=L(),{resolve:i,promise:o}=L(),l=new e("custom-view-"+t,window,window.parent,({message:e,args:t})=>{switch(e){case"registerCustomViewDone":n();break;case"returnMethods":r.handleSetup(t[0]),i();break;default:if(r.isSetupDone)return r.executeMessage({message:e,args:t})}});r.setMessageHandler(l);const c=[t];return l.sendMessage("registerCustomView",c),await a,l.sendMessage("getMethods",c),await o,r.setupPlugins(s,document.body,"custom-view"),await Promise.allSettled(r.pluginsLoaded),r}static createConfigurator(e,t,s,r=[]){return this._create(e,t,s,r)}static create(e,t,s,r){return this._create(e,t,s,r)}static createViewer(e,t,s,r=[]){return this._create(e,t,s,r)}static setupHi(e){window.addEventListener("message",t=>{if("connect_hi"===t.data.type&&t.data.port){const s=t.data.port;s.start?.(),l(new Proxy(e,{get(e,t,s){const r=Reflect.get(e,t,s);return void 0!==r?r:(...e)=>{}}}),s)}})}static async _create(e,t,s,r){return new Promise(async(n,a)=>{try{const a=E((()=>{const e=(e=>JSON.parse(JSON.stringify(e)))(T);e.locale||(e.locale=((e=null)=>{const t=window.navigator;if(e)return e.substr(0,2);if(Array.isArray(t.languages)&&t.languages.length>0)return t.languages[0].substr(0,2);for(let e=0,s=M.length;e<s;e++){const s=t[M[e]];if(s)return s.substr(0,2)}return"en"})()),"(idle)"===e.id&&delete e.id;const t=(()=>{const e=(()=>{try{return window.self!==window.top}catch{return!0}})();let t=window.location.href;if(e){if(!document.referrer)return null;t=document.referrer}const{hostname:s}=new URL(t);return s})();return t&&(e=>!!(v.includes(e)||e.endsWith("roomle.com")||e.endsWith("gitlab.io")||e.endsWith("gitlab.com")))(t)&&(e.configuratorId="demoConfigurator"),e.customApiUrl=void 0,e.emails=!1,e})(),(O(i=s),i?.customApiUrl&&(i.customApiUrl=decodeURIComponent(i.customApiUrl)),i.shareUrl&&(i.deeplink=i.shareUrl.replace("<CONF_ID>","#CONFIGURATIONID#")),i));(e=>{e.featureFlags||(e.featureFlags={}),"boolean"!=typeof e.featureFlags.realPartList&&(e.featureFlags.realPartList=!0),"boolean"!=typeof e.featureFlags.globalCallbacks&&(e.featureFlags.globalCallbacks=!0),"boolean"!=typeof e.featureFlags.mocAr&&(e.featureFlags.mocAr=!1)})(a);const o=await(async(e,t)=>{if("string"!=typeof e)throw new Error('Configurator ID is not a string type: "'+typeof e+'"');const s=t.customApiUrl?t.customApiUrl:"https://api.roomle.com/v2",r=t.overrideTenant||9,n=s+"/configurators/"+e,a="roomle_portal_v2",i="03-"+window.btoa((new Date).toISOString()+";anonymous;"+a),o=new Request(n,{method:"GET",headers:new Headers({apiKey:a,currentTenant:r,locale:"en",language:"en",device:1,token:i,platform:"web"}),mode:"cors",cache:"default"}),l=await fetch(o),{configurator:c}=await l.json();return c})(e,a);s=((e,t)=>{t.configuratorId=e.id;const s=e.settings||{};return!t.overrideTenant&&e.tenant&&(t.overrideTenant=e.tenant),((e,t)=>{const s=JSON.parse(JSON.stringify(e));return E(s,t)})(s,t)})(o,a);const l=new this(o,t,s,r,n);return await Promise.allSettled(l.pluginsLoaded),l}catch(e){return a(e)}var i})}_waitForIframe;_container;_configuratorSettings;_initData={};_iframe;constructor(t,s,r,n,a){if(super(),!t||"string"!=typeof t.id)throw new Error("Please provide a correct configuratorId, you get the correct ID from your Roomle Contact Person");if(F.has(s))throw new Error("There is already an instance on this DOM element");if(!document.getElementById(I)){const e=r.zIndex||9999999,t=document.createElement("style");t.type="text/css",t.id=I;const s="transition:all ease-in-out 450ms;",n=["-webkit-","-o-"].reduce((e,t)=>e+(t+s),"")+s,a=k();t.innerHTML=`\n .${x}{${C}:${a};}\n .${B}{position:fixed;top:0;left:0;z-index:${e};opacity:0}\n .rml-transition{${n}}\n .${H}{width:100%;height:100%;opacity:1}\n .${D}{height:calc(var(${C},1vh)*100)}\n .${U}{overflow:hidden}\n `,document.head.appendChild(t)}this._executeMessage=this._executeMessage.bind(this);const i=new e("website",window,null,this._executeMessage);this.setMessageHandler(i),this._onResize=this._onResize.bind(this),P()&&window.addEventListener("resize",this._onResize),this._container=s,this._initData=r,this._configuratorSettings=t;const o=this._createIframe();this._onUseFullPage=this._onUseFullPage.bind(this),this._onBackToWebsite=this._onBackToWebsite.bind(this),this._waitForIframe=a,this._container.appendChild(o),this._iframe=o,this.setupPlugins(n,this._iframe),F.set(s,!0)}teardown(){this._container&&F.delete(this._container);const e=this._container.querySelector("iframe");e&&this._container.removeChild(e),window.removeEventListener("resize",this._onResize)}_createIframe(){const e=document.createElement("iframe");let t=this._configuratorSettings?.url||"https://www.roomle.com/t/cp/";return this._initData.useLocalRoomle&&(t=location.href.replace("embedding.html","")),location.href.includes("roomle.gitlab.io")&&(t=location.href.replace("embedding.html","index.html")),this._initData.overrideServerUrl&&(t=this._initData.overrideServerUrl),e.src=t,e.classList.add(x),e.classList.add(H),e}_onResize(){R(this._iframe)}_onUseFullPage(){this._iframe.classList.add(B),document.documentElement.classList.add(U),window.document.body.classList.add(U),P()&&(R(this._iframe),this._iframe.classList.add(D))}_onBackToWebsite(){this._iframe.classList.remove(B),this._iframe.classList.remove(D),document.documentElement.classList.remove(U),window.document.body.classList.remove(U)}_executeMessage({message:e,args:t},s){if(s.source&&s.source===this._iframe?.contentWindow)return"requestBoot"===e?this._messageHandler?(this._messageHandler.setOutgoingMessageBus(s.source),Promise.resolve({result:this._initData})):Promise.resolve({error:"MessageHandler not set"}):"setup"===e?(this.handleSetup(t[0]),N(this.ui.callbacks,"onUseFullPage",this._onUseFullPage),N(this.ui.callbacks,"onBackToWebsite",this._onBackToWebsite),this._waitForIframe(this),setTimeout(()=>{this._messageHandler&&this._messageHandler.sendMessage("websiteReady")},0),Promise.resolve({result:null})):this.executeMessage({message:e,args:t})}}export{j as HI_PANEL_ACTION,z as default};
1
+ class e{_side;_incomingMessageBus=null;_outgoingMessageBus=null;_execMessage=null;constructor(e,t,s,r){this._side=e,this._incomingMessageBus=t,this._outgoingMessageBus=s,this._execMessage=r,this._incomingMessageBus&&this._incomingMessageBus.addEventListener("message",this._handleMessage.bind(this))}setOutgoingMessageBus(e){this._outgoingMessageBus=e}setMessageExecution(e){this._execMessage=e}sendMessage(e,t=[]){return new Promise((s,r)=>{if(this._incomingMessageBus===this._outgoingMessageBus)return s(void 0);const n=new MessageChannel;n.port1.onmessage=e=>{if(!e||!e.data)return n.port1.close(),n.port2.close(),r(new Error(this._side+" received message but response can not be interpreted"));let t;try{t=JSON.parse(e.data)}catch(e){return n.port1.close(),n.port2.close(),this._prepareError(e),r(e)}t.error?r(t.error):void 0!==t.result?s(t.result):s(void 0),n.port1.close(),n.port2.close()};let a="";try{a=JSON.stringify({message:e,args:t})}catch{return r(new Error(this._side+": can not create command because it is not JSON.stringify able"))}if(!this._outgoingMessageBus)return r(new Error(this._side+": outgoing bus not set yet"));this._outgoingMessageBus.postMessage(a,"*",[n.port2])})}_handleMessage(e){const t=e.ports&&Array.isArray(e.ports)&&e.ports.length>0?e.ports[0]:null;if(e.data&&("string"==typeof e.data||"connect_hi"!==e.data.type)&&t)try{const s=JSON.parse(e.data);if(!this._execMessage)return t.postMessage(JSON.stringify({error:this._side+" is not ready to handle messages"}));Array.isArray(s.args)||(s.args=[s.args]);const r=this._execMessage(s,e);if(void 0===r)return;r.then((e={})=>{let s,r;"object"==typeof e&&null!==e&&(s=e.error,r=e.result),s?t.postMessage(JSON.stringify({error:s})):void 0!==r?t.postMessage(JSON.stringify({result:r})):t.postMessage(JSON.stringify({result:e}))},e=>{t.postMessage(JSON.stringify({error:this._prepareError(e)}))})}catch(e){t.postMessage(JSON.stringify({error:this._prepareError(e)}))}}_prepareError(e){return"string"==typeof e?this._side+": "+e:(e.message=this._side+": "+e.message,e.message)}}const t=Symbol("Comlink.proxy"),s=Symbol("Comlink.endpoint"),r=Symbol("Comlink.releaseProxy"),n=Symbol("Comlink.finalizer"),a=Symbol("Comlink.thrown"),i=e=>"object"==typeof e&&null!==e||"function"==typeof e,o=new Map([["proxy",{canHandle:e=>i(e)&&e[t],serialize(e){const{port1:t,port2:s}=new MessageChannel;return l(e,t),[s,[s]]},deserialize:e=>(e.start(),function(e){const t=new Map;return e.addEventListener("message",function(e){const{data:s}=e;if(!s||!s.id)return;const r=t.get(s.id);if(r)try{r(s)}finally{t.delete(s.id)}}),m(e,t,[],void 0)}(e))}],["throw",{canHandle:e=>i(e)&&a in e,serialize({value:e}){let t;return t=e instanceof Error?{isError:!0,value:{message:e.message,name:e.name,stack:e.stack}}:{isError:!1,value:e},[t,[]]},deserialize(e){throw e.isError?Object.assign(new Error(e.value.message),e.value):e.value}}]]);function l(e,s=globalThis,r=["*"]){s.addEventListener("message",function i(o){if(!o||!o.data)return;if(!function(e,t){for(const s of e)if(t===s||"*"===s||s instanceof RegExp&&s.test(t))return!0;return!1}(r,o.origin))return;const{id:u,type:g,path:d}=Object.assign({path:[]},o.data),h=(o.data.argumentList||[]).map(y);let m;try{const s=d.slice(0,-1).reduce((e,t)=>e[t],e),r=d.reduce((e,t)=>e[t],e);switch(g){case"GET":m=r;break;case"SET":s[d.slice(-1)[0]]=y(o.data.value),m=!0;break;case"APPLY":m=r.apply(s,h);break;case"CONSTRUCT":m=function(e){return Object.assign(e,{[t]:!0})}(new r(...h));break;case"ENDPOINT":{const{port1:t,port2:s}=new MessageChannel;l(e,s),m=function(e,t){return w.set(e,t),e}(t,[t])}break;case"RELEASE":m=void 0;break;default:return}}catch(e){m={value:e,[a]:0}}Promise.resolve(m).catch(e=>({value:e,[a]:0})).then(t=>{const[r,a]=_(t);s.postMessage(Object.assign(Object.assign({},r),{id:u}),a),"RELEASE"===g&&(s.removeEventListener("message",i),c(s),n in e&&"function"==typeof e[n]&&e[n]())}).catch(e=>{const[t,r]=_({value:new TypeError("Unserializable return value"),[a]:0});s.postMessage(Object.assign(Object.assign({},t),{id:u}),r)})}),s.start&&s.start()}function c(e){(function(e){return"MessagePort"===e.constructor.name})(e)&&e.close()}function u(e){if(e)throw new Error("Proxy has been released and is not useable")}function g(e){return b(e,new Map,{type:"RELEASE"}).then(()=>{c(e)})}const d=new WeakMap,h="FinalizationRegistry"in globalThis&&new FinalizationRegistry(e=>{const t=(d.get(e)||0)-1;d.set(e,t),0===t&&g(e)});function m(e,t,n=[],a=function(){}){let i=!1;const o=new Proxy(a,{get(s,a){if(u(i),a===r)return()=>{(function(e){h&&h.unregister(e)})(o),g(e),t.clear(),i=!0};if("then"===a){if(0===n.length)return{then:()=>o};const s=b(e,t,{type:"GET",path:n.map(e=>e.toString())}).then(y);return s.then.bind(s)}return m(e,t,[...n,a])},set(s,r,a){u(i);const[o,l]=_(a);return b(e,t,{type:"SET",path:[...n,r].map(e=>e.toString()),value:o},l).then(y)},apply(r,a,o){u(i);const l=n[n.length-1];if(l===s)return b(e,t,{type:"ENDPOINT"}).then(y);if("bind"===l)return m(e,t,n.slice(0,-1));const[c,g]=f(o);return b(e,t,{type:"APPLY",path:n.map(e=>e.toString()),argumentList:c},g).then(y)},construct(s,r){u(i);const[a,o]=f(r);return b(e,t,{type:"CONSTRUCT",path:n.map(e=>e.toString()),argumentList:a},o).then(y)}});return function(e,t){const s=(d.get(t)||0)+1;d.set(t,s),h&&h.register(e,t,e)}(o,e),o}function p(e){return Array.prototype.concat.apply([],e)}function f(e){const t=e.map(_);return[t.map(e=>e[0]),p(t.map(e=>e[1]))]}const w=new WeakMap;function _(e){for(const[t,s]of o)if(s.canHandle(e)){const[r,n]=s.serialize(e);return[{type:"HANDLER",name:t,value:r},n]}return[{type:"RAW",value:e},w.get(e)||[]]}function y(e){switch(e.type){case"HANDLER":return o.get(e.name).deserialize(e.value);case"RAW":return e.value}}function b(e,t,s,r){return new Promise(n=>{const a=new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");t.set(a,n),e.start&&e.start(),e.postMessage(Object.assign({id:a},s),r)})}const v=["127.0.0.1","localhost","0.0.0.0"],M=["language","browserLanguage","userLanguage","systemLanguage"],E=(e,t)=>{for(const s in t)try{t[s].constructor===Object?e[s]=E(e[s],t[s]):e[s]=t[s]}catch{e[s]=t[s]}return e};var S=(e=>(e.BOTTOM_BAR="bottom_bar",e.PARTLIST_BOUNDS="partlist_bounds",e.INTERACTION_NOTES="interaction_notes",e.PARAMETER_GROUPS="parameter_groups",e))(S||{});const T={mobileLandscape:!0,floorMaterialRootTag:"materials_root",buttons:{renderimage:!0,requestproduct:!0,requestplan:!0,load_product:!0,partlist_print:!0},elements:{[S.INTERACTION_NOTES]:!0},helpcenter:{roomdesigner:!0,configurator:!1,disable:!1},firstPersonView:!0,saveToIdb:!0,featureFlags:{mocAr:!0,wallAutoHeight:!1,openCloseAnimation:!0,enableTwoLevelCatalog:!1,webGpu:!1},rotationSnapDegrees:10,interactionsCollapsed:!1},O=e=>{if(!e)return;const t=Object.keys(e);for(const s of t){const t=e[s];if(!Array.isArray(t)&&"object"==typeof t&&null!==t&&O(t),Array.isArray(t))for(const e of t)O(e);("true"===t||"false"===t)&&(e[s]="true"===t)}},P=()=>/(android)/i.test(navigator.userAgent);class A{_messageHandler=null;isSetupDone=!1;viewName="main";plugins={};pluginsLoaded=[];ui={callbacks:null};extended={callbacks:null};configurator={callbacks:null};analytics={callbacks:{}};rapi={callbacks:{}};global={callbacks:{}};setMessageHandler(e){this._messageHandler=e}handleSetup(e){const{methods:t,callbacks:s}=e;t.forEach(e=>{const t=e.split("."),s=t[0],r=t[1];this[s]||(this[s]={}),this[s][r]=function(){if(this._messageHandler)return this._messageHandler.sendMessage(e,[...arguments])}.bind(this)}),s.forEach(e=>{const t=e.split("."),s=t[0],r=t[1],n=t[2];this[s]||(this[s]={}),this[s][r]||(this[s][r]={}),this[s][r][n]=()=>{}}),this.isSetupDone=!0}executeMessage({message:e,args:t}){const s=e.split("."),r=s[0],n=s[1],a=3===s.length?s[2]:null;if(a&&this[r][n][a]){const e=this[r][n][a](...t);return e instanceof Promise?e.then(e=>({result:e})):void 0!==e?Promise.resolve({result:e}):Promise.resolve({result:null})}return Promise.reject('Message "'+e+'" is unkown')}setupPlugins(e,t,s="website"){for(const r of e)"string"==typeof r&&"dragIn"===r?this.pluginsLoaded.push(new Promise((e,r)=>{try{import("./drag-in-BmoiEqfA.mjs").then(e=>e.l).then(({DragIn:n})=>{const a=new n(this.ui,t,s,this.viewName);a.init().then(()=>{this.plugins.dragIn=a,e()},r)})}catch(e){r(e)}})):r.name&&r.loader&&this.pluginsLoaded.push(new Promise((e,n)=>{try{r.loader().then(a=>{const i=new a(this.ui,t,s,this.viewName);i.init().then(()=>{this.plugins[r.name]=i,e()},n)})}catch(e){n(e)}}))}}const L=()=>{let e,t;return{promise:new Promise((s,r)=>{e=s,t=r}),resolve:e,reject:t}},N=(e,t,s)=>{let r=null;Object.defineProperty(e,t,{get:()=>r||s,set(e){r=e?.mute?e.value:e}})},k=()=>.01*window.innerHeight+"px",R=e=>{e&&setTimeout(()=>e.style.setProperty(C,k()),0)},I="rml-styles",C="--rml-full-height",H="rml-container",x="rml-fill",B="rml-pos",D="rml-android-height",U="rml-overflow-hidden",F=new Map,j={HIDE:"hide",SHOW_ATTRIBUTES:"attributes",SHOW_ARTICLES:"articles"};class z extends A{static createPlanner(e,t,s,r=[]){return this._create(e,t,s,r)}static async connect(t,s=[]){const r=new A;r.viewName=t;const{resolve:n,promise:a}=L(),{resolve:i,promise:o}=L(),l=new e("custom-view-"+t,window,window.parent,({message:e,args:t})=>{switch(e){case"registerCustomViewDone":n();break;case"returnMethods":r.handleSetup(t[0]),i();break;default:if(r.isSetupDone)return r.executeMessage({message:e,args:t})}});r.setMessageHandler(l);const c=[t];return l.sendMessage("registerCustomView",c),await a,l.sendMessage("getMethods",c),await o,r.setupPlugins(s,document.body,"custom-view"),await Promise.allSettled(r.pluginsLoaded),r}static createConfigurator(e,t,s,r=[]){return this._create(e,t,s,r)}static create(e,t,s,r){return this._create(e,t,s,r)}static createViewer(e,t,s,r=[]){return this._create(e,t,s,r)}static hiMessageHandler=null;static setupHi(e){this.hiMessageHandler&&window.removeEventListener("message",this.hiMessageHandler),this.hiMessageHandler=t=>{if("connect_hi"===t.data.type&&t.data.port){const s=t.data.port;s.start?.(),l(new Proxy(e,{get(e,t,s){const r=Reflect.get(e,t,s);return void 0!==r?r:(...e)=>{}}}),s)}},window.addEventListener("message",this.hiMessageHandler)}static async _create(e,t,s,r){return new Promise(async(n,a)=>{try{const a=E((()=>{const e=(e=>JSON.parse(JSON.stringify(e)))(T);e.locale||(e.locale=((e=null)=>{const t=window.navigator;if(e)return e.substr(0,2);if(Array.isArray(t.languages)&&t.languages.length>0)return t.languages[0].substr(0,2);for(let e=0,s=M.length;e<s;e++){const s=t[M[e]];if(s)return s.substr(0,2)}return"en"})()),"(idle)"===e.id&&delete e.id;const t=(()=>{const e=(()=>{try{return window.self!==window.top}catch{return!0}})();let t=window.location.href;if(e){if(!document.referrer)return null;t=document.referrer}const{hostname:s}=new URL(t);return s})();return t&&(e=>!!(v.includes(e)||e.endsWith("roomle.com")||e.endsWith("gitlab.io")||e.endsWith("gitlab.com")))(t)&&(e.configuratorId="demoConfigurator"),e.customApiUrl=void 0,e.emails=!1,e})(),(O(i=s),i?.customApiUrl&&(i.customApiUrl=decodeURIComponent(i.customApiUrl)),i.shareUrl&&(i.deeplink=i.shareUrl.replace("<CONF_ID>","#CONFIGURATIONID#")),i));(e=>{e.featureFlags||(e.featureFlags={}),"boolean"!=typeof e.featureFlags.realPartList&&(e.featureFlags.realPartList=!0),"boolean"!=typeof e.featureFlags.globalCallbacks&&(e.featureFlags.globalCallbacks=!0),"boolean"!=typeof e.featureFlags.mocAr&&(e.featureFlags.mocAr=!1)})(a);const o=await(async(e,t)=>{if("string"!=typeof e)throw new Error('Configurator ID is not a string type: "'+typeof e+'"');const s=t.customApiUrl?t.customApiUrl:"https://api.roomle.com/v2",r=t.overrideTenant||9,n=s+"/configurators/"+e,a="roomle_portal_v2",i="03-"+window.btoa((new Date).toISOString()+";anonymous;"+a),o=new Request(n,{method:"GET",headers:new Headers({apiKey:a,currentTenant:r,locale:"en",language:"en",device:1,token:i,platform:"web"}),mode:"cors",cache:"default"}),l=await fetch(o),{configurator:c}=await l.json();return c})(e,a);s=((e,t)=>{t.configuratorId=e.id;const s=e.settings||{};return!t.overrideTenant&&e.tenant&&(t.overrideTenant=e.tenant),((e,t)=>{const s=JSON.parse(JSON.stringify(e));return E(s,t)})(s,t)})(o,a);const l=new this(o,t,s,r,n);return await Promise.allSettled(l.pluginsLoaded),l}catch(e){return a(e)}var i})}_waitForIframe;_container;_configuratorSettings;_initData={};_iframe;constructor(t,s,r,n,a){if(super(),!t||"string"!=typeof t.id)throw new Error("Please provide a correct configuratorId, you get the correct ID from your Roomle Contact Person");if(F.has(s))throw new Error("There is already an instance on this DOM element");if(!document.getElementById(I)){const e=r.zIndex||9999999,t=document.createElement("style");t.type="text/css",t.id=I;const s="transition:all ease-in-out 450ms;",n=["-webkit-","-o-"].reduce((e,t)=>e+(t+s),"")+s,a=k();t.innerHTML=`\n .${H}{${C}:${a};}\n .${B}{position:fixed;top:0;left:0;z-index:${e};opacity:0}\n .rml-transition{${n}}\n .${x}{width:100%;height:100%;opacity:1}\n .${D}{height:calc(var(${C},1vh)*100)}\n .${U}{overflow:hidden}\n `,document.head.appendChild(t)}this._executeMessage=this._executeMessage.bind(this);const i=new e("website",window,null,this._executeMessage);this.setMessageHandler(i),this._onResize=this._onResize.bind(this),P()&&window.addEventListener("resize",this._onResize),this._container=s,this._initData=r,this._configuratorSettings=t;const o=this._createIframe();this._onUseFullPage=this._onUseFullPage.bind(this),this._onBackToWebsite=this._onBackToWebsite.bind(this),this._waitForIframe=a,this._container.appendChild(o),this._iframe=o,this.setupPlugins(n,this._iframe),F.set(s,!0)}teardown(){this._container&&F.delete(this._container);const e=this._container.querySelector("iframe");e&&this._container.removeChild(e),window.removeEventListener("resize",this._onResize)}_createIframe(){const e=document.createElement("iframe");let t=this._configuratorSettings?.url||"https://www.roomle.com/t/cp/";return this._initData.useLocalRoomle&&(t=location.href.replace("embedding.html","")),location.href.includes("roomle.gitlab.io")&&(t=location.href.replace("embedding.html","index.html")),this._initData.overrideServerUrl&&(t=this._initData.overrideServerUrl),e.src=t,e.classList.add(H),e.classList.add(x),e}_onResize(){R(this._iframe)}_onUseFullPage(){this._iframe.classList.add(B),document.documentElement.classList.add(U),window.document.body.classList.add(U),P()&&(R(this._iframe),this._iframe.classList.add(D))}_onBackToWebsite(){this._iframe.classList.remove(B),this._iframe.classList.remove(D),document.documentElement.classList.remove(U),window.document.body.classList.remove(U)}_executeMessage({message:e,args:t},s){if(s.source&&s.source===this._iframe?.contentWindow)return"requestBoot"===e?this._messageHandler?(this._messageHandler.setOutgoingMessageBus(s.source),Promise.resolve({result:this._initData})):Promise.resolve({error:"MessageHandler not set"}):"setup"===e?(this.handleSetup(t[0]),N(this.ui.callbacks,"onUseFullPage",this._onUseFullPage),N(this.ui.callbacks,"onBackToWebsite",this._onBackToWebsite),this._waitForIframe(this),setTimeout(()=>{this._messageHandler&&this._messageHandler.sendMessage("websiteReady")},0),Promise.resolve({result:null})):this.executeMessage({message:e,args:t})}}export{j as HI_PANEL_ACTION,z as default};
@@ -2,20 +2,20 @@
2
2
  * @license
3
3
  * Copyright 2019 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
- */const tt=Symbol("Comlink.proxy"),Nt=Symbol("Comlink.endpoint"),xt=Symbol("Comlink.releaseProxy"),G=Symbol("Comlink.finalizer"),b=Symbol("Comlink.thrown"),et=s=>typeof s=="object"&&s!==null||typeof s=="function",Pt={canHandle:s=>et(s)&&s[tt],serialize(s){const{port1:t,port2:e}=new MessageChannel;return H(s,t),[e,[e]]},deserialize(s){return s.start(),Ut(s)}},Gt={canHandle:s=>et(s)&&b in s,serialize({value:s}){let t;return s instanceof Error?t={isError:!0,value:{message:s.message,name:s.name,stack:s.stack}}:t={isError:!1,value:s},[t,[]]},deserialize(s){throw s.isError?Object.assign(new Error(s.value.message),s.value):s.value}},st=new Map([["proxy",Pt],["throw",Gt]]);function Ht(s,t){for(const e of s)if(t===e||e==="*"||e instanceof RegExp&&e.test(t))return!0;return!1}function H(s,t=globalThis,e=["*"]){t.addEventListener("message",function r(n){if(!n||!n.data)return;if(!Ht(e,n.origin)){console.warn(`Invalid origin '${n.origin}' for comlink proxy`);return}const{id:i,type:o,path:a}=Object.assign({path:[]},n.data),c=(n.data.argumentList||[]).map(p);let l;try{const u=a.slice(0,-1).reduce((h,g)=>h[g],s),d=a.reduce((h,g)=>h[g],s);switch(o){case"GET":l=d;break;case"SET":u[a.slice(-1)[0]]=p(n.data.value),l=!0;break;case"APPLY":l=d.apply(u,c);break;case"CONSTRUCT":{const h=new d(...c);l=Xt(h)}break;case"ENDPOINT":{const{port1:h,port2:g}=new MessageChannel;H(s,g),l=Wt(h,[h])}break;case"RELEASE":l=void 0;break;default:return}}catch(u){l={value:u,[b]:0}}Promise.resolve(l).catch(u=>({value:u,[b]:0})).then(u=>{const[d,h]=M(u);t.postMessage(Object.assign(Object.assign({},d),{id:i}),h),o==="RELEASE"&&(t.removeEventListener("message",r),rt(t),G in s&&typeof s[G]=="function"&&s[G]())}).catch(u=>{const[d,h]=M({value:new TypeError("Unserializable return value"),[b]:0});t.postMessage(Object.assign(Object.assign({},d),{id:i}),h)})}),t.start&&t.start()}function Ft(s){return s.constructor.name==="MessagePort"}function rt(s){Ft(s)&&s.close()}function Ut(s,t){const e=new Map;return s.addEventListener("message",function(n){const{data:i}=n;if(!i||!i.id)return;const o=e.get(i.id);if(o)try{o(i)}finally{e.delete(i.id)}}),F(s,e,[],t)}function I(s){if(s)throw new Error("Proxy has been released and is not useable")}function nt(s){return T(s,new Map,{type:"RELEASE"}).then(()=>{rt(s)})}const A=new WeakMap,O="FinalizationRegistry"in globalThis&&new FinalizationRegistry(s=>{const t=(A.get(s)||0)-1;A.set(s,t),t===0&&nt(s)});function Bt(s,t){const e=(A.get(t)||0)+1;A.set(t,e),O&&O.register(s,t,s)}function Yt(s){O&&O.unregister(s)}function F(s,t,e=[],r=function(){}){let n=!1;const i=new Proxy(r,{get(o,a){if(I(n),a===xt)return()=>{Yt(i),nt(s),t.clear(),n=!0};if(a==="then"){if(e.length===0)return{then:()=>i};const c=T(s,t,{type:"GET",path:e.map(l=>l.toString())}).then(p);return c.then.bind(c)}return F(s,t,[...e,a])},set(o,a,c){I(n);const[l,u]=M(c);return T(s,t,{type:"SET",path:[...e,a].map(d=>d.toString()),value:l},u).then(p)},apply(o,a,c){I(n);const l=e[e.length-1];if(l===Nt)return T(s,t,{type:"ENDPOINT"}).then(p);if(l==="bind")return F(s,t,e.slice(0,-1));const[u,d]=it(c);return T(s,t,{type:"APPLY",path:e.map(h=>h.toString()),argumentList:u},d).then(p)},construct(o,a){I(n);const[c,l]=it(a);return T(s,t,{type:"CONSTRUCT",path:e.map(u=>u.toString()),argumentList:c},l).then(p)}});return Bt(i,s),i}function kt(s){return Array.prototype.concat.apply([],s)}function it(s){const t=s.map(M);return[t.map(e=>e[0]),kt(t.map(e=>e[1]))]}const ot=new WeakMap;function Wt(s,t){return ot.set(s,t),s}function Xt(s){return Object.assign(s,{[tt]:!0})}function M(s){for(const[t,e]of st)if(e.canHandle(s)){const[r,n]=e.serialize(s);return[{type:"HANDLER",name:t,value:r},n]}return[{type:"RAW",value:s},ot.get(s)||[]]}function p(s){switch(s.type){case"HANDLER":return st.get(s.name).deserialize(s.value);case"RAW":return s.value}}function T(s,t,e,r){return new Promise(n=>{const i=zt();t.set(i,n),s.start&&s.start(),s.postMessage(Object.assign({id:i},e),r)})}function zt(){return new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")}const U=".",B={REQUEST_BOOT:"requestBoot",SETUP:"setup",WEBSITE_READY:"websiteReady"},R={GET_METHODS:"getMethods",RETURN_METHODS:"returnMethods",REGISTER_CUSTOM_VIEW:"registerCustomView",REGISTER_CUSTOM_VIEW_DONE:"registerCustomViewDone"},$t=async(s,t)=>{if(typeof s!="string")throw new Error('Configurator ID is not a string type: "'+typeof s+'"');const e=t.customApiUrl?t.customApiUrl:"https://api.roomle.com/v2",r=t.overrideTenant||9,n=e+"/configurators/"+s,i="roomle_portal_v2",o="03-"+window.btoa(new Date().toISOString()+";anonymous;"+i),a=()=>{const d={apiKey:i,currentTenant:r,locale:"en",language:"en",device:1,token:o,platform:"web"};return new Headers(d)},c=new Request(n,{method:"GET",headers:a(),mode:"cors",cache:"default"}),l=await fetch(c),{configurator:u}=await l.json();return u},Vt=()=>{try{return window.self!==window.top}catch{return!0}},jt=["127.0.0.1","localhost","0.0.0.0"],qt=()=>{const s=Vt();let t=window.location.href;if(s){if(!document.referrer)return null;t=document.referrer}const{hostname:e}=new URL(t);return e},Kt=s=>!!(jt.includes(s)||s.endsWith("roomle.com")||s.endsWith("gitlab.io")||s.endsWith("gitlab.com")),at=["language","browserLanguage","userLanguage","systemLanguage"],Jt=(s=null)=>{const t=window.navigator;if(s)return s.substr(0,2);if(Array.isArray(t.languages)&&t.languages.length>0)return t.languages[0].substr(0,2);for(let e=0,r=at.length;e<r;e++){const n=t[at[e]];if(n)return n.substr(0,2)}return"en"},Qt=(s,t)=>{const e=JSON.parse(JSON.stringify(s));return Y(e,t)},Y=(s,t)=>{for(const e in t)try{t[e].constructor===Object?s[e]=Y(s[e],t[e]):s[e]=t[e]}catch{s[e]=t[e]}return s};var ct=(s=>(s.BOTTOM_BAR="bottom_bar",s.PARTLIST_BOUNDS="partlist_bounds",s.INTERACTION_NOTES="interaction_notes",s.PARAMETER_GROUPS="parameter_groups",s))(ct||{});const Zt=s=>JSON.parse(JSON.stringify(s)),te={mobileLandscape:!0,floorMaterialRootTag:"materials_root",buttons:{renderimage:!0,requestproduct:!0,requestplan:!0,load_product:!0,partlist_print:!0},elements:{[ct.INTERACTION_NOTES]:!0},helpcenter:{roomdesigner:!0,configurator:!1,disable:!1},firstPersonView:!0,saveToIdb:!0,featureFlags:{mocAr:!0,wallAutoHeight:!1,openCloseAnimation:!0,enableTwoLevelCatalog:!1,webGpu:!1},rotationSnapDegrees:10,interactionsCollapsed:!1},ee="(idle)",se=s=>(k(s),s?.customApiUrl&&(s.customApiUrl=decodeURIComponent(s.customApiUrl)),s.shareUrl&&(s.deeplink=s.shareUrl.replace(ie,oe)),s),k=s=>{if(!s)return;const t=Object.keys(s);for(const e of t){const r=s[e];if(!Array.isArray(r)&&typeof r=="object"&&r!==null&&k(r),Array.isArray(r))for(const n of r)k(n);(r==="true"||r==="false")&&(s[e]=r==="true")}},re=(s,t)=>{t.configuratorId=s.id;const e=s.settings||{};return!t.overrideTenant&&s.tenant&&(t.overrideTenant=s.tenant),Qt(e,t)},ne=()=>{const s=Zt(te);s.locale||(s.locale=Jt()),s.id===ee&&delete s.id;const t=qt();return t&&Kt(t)&&(s.configuratorId="demoConfigurator"),s.customApiUrl=void 0,s.emails=!1,s},ie="<CONF_ID>",oe="#CONFIGURATIONID#",ae=s=>{s.featureFlags||(s.featureFlags={}),typeof s.featureFlags.realPartList!="boolean"&&(s.featureFlags.realPartList=!0),typeof s.featureFlags.globalCallbacks!="boolean"&&(s.featureFlags.globalCallbacks=!0),typeof s.featureFlags.mocAr!="boolean"&&(s.featureFlags.mocAr=!1)},lt=()=>/(android)/i.test(navigator.userAgent);class ut{_messageHandler=null;isSetupDone=!1;viewName="main";plugins={};pluginsLoaded=[];ui={callbacks:null};extended={callbacks:null};configurator={callbacks:null};analytics={callbacks:{}};rapi={callbacks:{}};global={callbacks:{}};setMessageHandler(t){this._messageHandler=t}handleSetup(t){const{methods:e,callbacks:r}=t;e.forEach(n=>{const i=n.split(U),o=i[0],a=i[1];this[o]||(this[o]={}),this[o][a]=(function(){if(!this._messageHandler){console.error("MessageHandler not set");return}return this._messageHandler.sendMessage(n,[...arguments])}).bind(this)}),r.forEach(n=>{const i=n.split(U),o=i[0],a=i[1],c=i[2];this[o]||(this[o]={}),this[o][a]||(this[o][a]={}),this[o][a][c]=()=>{}}),this.isSetupDone=!0}executeMessage({message:t,args:e}){const r=t.split(U),n=r[0],i=r[1],o=r.length===3?r[2]:null;if(o&&this[n][i][o]){const a=this[n][i][o](...e);return a instanceof Promise?a.then(c=>({result:c})):a!==void 0?Promise.resolve({result:a}):Promise.resolve({result:null})}return Promise.reject('Message "'+t+'" is unkown')}setupPlugins(t,e,r="website"){for(const n of t)typeof n=="string"&&n==="dragIn"?this.pluginsLoaded.push(new Promise((i,o)=>{try{Promise.resolve().then(()=>me).then(({DragIn:a})=>{const c=new a(this.ui,e,r,this.viewName);c.init().then(()=>{this.plugins.dragIn=c,i()},o)})}catch(a){o(a)}})):n.name&&n.loader&&this.pluginsLoaded.push(new Promise((i,o)=>{try{n.loader().then(a=>{const c=new a(this.ui,e,r,this.viewName);c.init().then(()=>{this.plugins[n.name]=c,i()},o)})}catch(a){o(a)}}))}}const ht=()=>{let s,t;return{promise:new Promise((r,n)=>{s=r,t=n}),resolve:s,reject:t}},dt=(s,t,e)=>{let r=null;Object.defineProperty(s,t,{get(){return r||e},set(n){n?.mute?r=n.value:(console.warn("You override Roomle defined behaviour. To disalbe this warning pass in an object with the following properties"),console.warn("{ mute: true, value: () => void }"),r=n)}})},gt=()=>window.innerHeight*.01+"px",mt=s=>{s&&setTimeout(()=>s.style.setProperty(W,gt()),0)},_t="rml-styles",ce=450,W="--rml-full-height",m={CONTAINER:"rml-container",FILL:"rml-fill",POSITION:"rml-pos",TRANSITION:"rml-transition",ANDROID_HEIGHT:"rml-android-height",OVERFLOW_HIDDEN:"rml-overflow-hidden"},X=new Map,le=s=>{const t={get(e,r,n){const i=Reflect.get(e,r,n);return i!==void 0?i:(console.warn(`[Homag Intelligence Callbacks] Method '${String(r)}' is not implemented. Executing a no-op.`),(...o)=>{})}};return new Proxy(s,t)},ue={HIDE:"hide",SHOW_ATTRIBUTES:"attributes",SHOW_ARTICLES:"articles"};class he extends ut{static createPlanner(t,e,r,n=[]){return this._create(t,e,r,n)}static async connect(t,e=[]){const r=new ut;r.viewName=t;const{resolve:n,promise:i}=ht(),{resolve:o,promise:a}=ht(),c=({message:d,args:h})=>{switch(d){case R.REGISTER_CUSTOM_VIEW_DONE:n();break;case R.RETURN_METHODS:r.handleSetup(h[0]),o();break;default:if(r.isSetupDone)return r.executeMessage({message:d,args:h})}},l=new D("custom-view-"+t,window,window.parent,c);r.setMessageHandler(l);const u=[t];return l.sendMessage(R.REGISTER_CUSTOM_VIEW,u),await i,l.sendMessage(R.GET_METHODS,u),await a,r.setupPlugins(e,document.body,"custom-view"),await Promise.allSettled(r.pluginsLoaded),r}static createConfigurator(t,e,r,n=[]){return this._create(t,e,r,n)}static create(t,e,r,n){return this._create(t,e,r,n)}static createViewer(t,e,r,n=[]){return this._create(t,e,r,n)}static setupHi(t){window.addEventListener("message",e=>{if(e.data.type==="connect_hi"&&e.data.port){const r=e.data.port;r.start?.(),H(le(t),r)}})}static async _create(t,e,r,n){return new Promise(async(i,o)=>{try{const a=Y(ne(),se(r));ae(a);const c=await $t(t,a);r=re(c,a);const l=new this(c,e,r,n,i);return await Promise.allSettled(l.pluginsLoaded),l}catch(a){return o(a)}})}_waitForIframe;_container;_configuratorSettings;_initData={};_iframe;constructor(t,e,r,n,i){if(super(),!t||typeof t.id!="string")throw new Error("Please provide a correct configuratorId, you get the correct ID from your Roomle Contact Person");if(X.has(e))throw new Error("There is already an instance on this DOM element");if(!!!document.getElementById(_t)){const l=r.zIndex||9999999,u=document.createElement("style");u.type="text/css",u.id=_t;const d="transition:all ease-in-out "+ce+"ms;",h=["-webkit-","-o-"].reduce((E,f)=>E+=f+d,"")+d,g=gt();u.innerHTML=`
5
+ */const tt=Symbol("Comlink.proxy"),Nt=Symbol("Comlink.endpoint"),xt=Symbol("Comlink.releaseProxy"),G=Symbol("Comlink.finalizer"),b=Symbol("Comlink.thrown"),et=s=>typeof s=="object"&&s!==null||typeof s=="function",Pt={canHandle:s=>et(s)&&s[tt],serialize(s){const{port1:t,port2:e}=new MessageChannel;return H(s,t),[e,[e]]},deserialize(s){return s.start(),Ut(s)}},Gt={canHandle:s=>et(s)&&b in s,serialize({value:s}){let t;return s instanceof Error?t={isError:!0,value:{message:s.message,name:s.name,stack:s.stack}}:t={isError:!1,value:s},[t,[]]},deserialize(s){throw s.isError?Object.assign(new Error(s.value.message),s.value):s.value}},st=new Map([["proxy",Pt],["throw",Gt]]);function Ht(s,t){for(const e of s)if(t===e||e==="*"||e instanceof RegExp&&e.test(t))return!0;return!1}function H(s,t=globalThis,e=["*"]){t.addEventListener("message",function r(n){if(!n||!n.data)return;if(!Ht(e,n.origin)){console.warn(`Invalid origin '${n.origin}' for comlink proxy`);return}const{id:i,type:o,path:a}=Object.assign({path:[]},n.data),c=(n.data.argumentList||[]).map(p);let l;try{const u=a.slice(0,-1).reduce((h,g)=>h[g],s),d=a.reduce((h,g)=>h[g],s);switch(o){case"GET":l=d;break;case"SET":u[a.slice(-1)[0]]=p(n.data.value),l=!0;break;case"APPLY":l=d.apply(u,c);break;case"CONSTRUCT":{const h=new d(...c);l=Xt(h)}break;case"ENDPOINT":{const{port1:h,port2:g}=new MessageChannel;H(s,g),l=Wt(h,[h])}break;case"RELEASE":l=void 0;break;default:return}}catch(u){l={value:u,[b]:0}}Promise.resolve(l).catch(u=>({value:u,[b]:0})).then(u=>{const[d,h]=M(u);t.postMessage(Object.assign(Object.assign({},d),{id:i}),h),o==="RELEASE"&&(t.removeEventListener("message",r),rt(t),G in s&&typeof s[G]=="function"&&s[G]())}).catch(u=>{const[d,h]=M({value:new TypeError("Unserializable return value"),[b]:0});t.postMessage(Object.assign(Object.assign({},d),{id:i}),h)})}),t.start&&t.start()}function Ft(s){return s.constructor.name==="MessagePort"}function rt(s){Ft(s)&&s.close()}function Ut(s,t){const e=new Map;return s.addEventListener("message",function(n){const{data:i}=n;if(!i||!i.id)return;const o=e.get(i.id);if(o)try{o(i)}finally{e.delete(i.id)}}),F(s,e,[],t)}function I(s){if(s)throw new Error("Proxy has been released and is not useable")}function nt(s){return T(s,new Map,{type:"RELEASE"}).then(()=>{rt(s)})}const A=new WeakMap,O="FinalizationRegistry"in globalThis&&new FinalizationRegistry(s=>{const t=(A.get(s)||0)-1;A.set(s,t),t===0&&nt(s)});function Bt(s,t){const e=(A.get(t)||0)+1;A.set(t,e),O&&O.register(s,t,s)}function Yt(s){O&&O.unregister(s)}function F(s,t,e=[],r=function(){}){let n=!1;const i=new Proxy(r,{get(o,a){if(I(n),a===xt)return()=>{Yt(i),nt(s),t.clear(),n=!0};if(a==="then"){if(e.length===0)return{then:()=>i};const c=T(s,t,{type:"GET",path:e.map(l=>l.toString())}).then(p);return c.then.bind(c)}return F(s,t,[...e,a])},set(o,a,c){I(n);const[l,u]=M(c);return T(s,t,{type:"SET",path:[...e,a].map(d=>d.toString()),value:l},u).then(p)},apply(o,a,c){I(n);const l=e[e.length-1];if(l===Nt)return T(s,t,{type:"ENDPOINT"}).then(p);if(l==="bind")return F(s,t,e.slice(0,-1));const[u,d]=it(c);return T(s,t,{type:"APPLY",path:e.map(h=>h.toString()),argumentList:u},d).then(p)},construct(o,a){I(n);const[c,l]=it(a);return T(s,t,{type:"CONSTRUCT",path:e.map(u=>u.toString()),argumentList:c},l).then(p)}});return Bt(i,s),i}function kt(s){return Array.prototype.concat.apply([],s)}function it(s){const t=s.map(M);return[t.map(e=>e[0]),kt(t.map(e=>e[1]))]}const ot=new WeakMap;function Wt(s,t){return ot.set(s,t),s}function Xt(s){return Object.assign(s,{[tt]:!0})}function M(s){for(const[t,e]of st)if(e.canHandle(s)){const[r,n]=e.serialize(s);return[{type:"HANDLER",name:t,value:r},n]}return[{type:"RAW",value:s},ot.get(s)||[]]}function p(s){switch(s.type){case"HANDLER":return st.get(s.name).deserialize(s.value);case"RAW":return s.value}}function T(s,t,e,r){return new Promise(n=>{const i=zt();t.set(i,n),s.start&&s.start(),s.postMessage(Object.assign({id:i},e),r)})}function zt(){return new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")}const U=".",B={REQUEST_BOOT:"requestBoot",SETUP:"setup",WEBSITE_READY:"websiteReady"},R={GET_METHODS:"getMethods",RETURN_METHODS:"returnMethods",REGISTER_CUSTOM_VIEW:"registerCustomView",REGISTER_CUSTOM_VIEW_DONE:"registerCustomViewDone"},$t=async(s,t)=>{if(typeof s!="string")throw new Error('Configurator ID is not a string type: "'+typeof s+'"');const e=t.customApiUrl?t.customApiUrl:"https://api.roomle.com/v2",r=t.overrideTenant||9,n=e+"/configurators/"+s,i="roomle_portal_v2",o="03-"+window.btoa(new Date().toISOString()+";anonymous;"+i),a=()=>{const d={apiKey:i,currentTenant:r,locale:"en",language:"en",device:1,token:o,platform:"web"};return new Headers(d)},c=new Request(n,{method:"GET",headers:a(),mode:"cors",cache:"default"}),l=await fetch(c),{configurator:u}=await l.json();return u},Vt=()=>{try{return window.self!==window.top}catch{return!0}},jt=["127.0.0.1","localhost","0.0.0.0"],qt=()=>{const s=Vt();let t=window.location.href;if(s){if(!document.referrer)return null;t=document.referrer}const{hostname:e}=new URL(t);return e},Kt=s=>!!(jt.includes(s)||s.endsWith("roomle.com")||s.endsWith("gitlab.io")||s.endsWith("gitlab.com")),at=["language","browserLanguage","userLanguage","systemLanguage"],Jt=(s=null)=>{const t=window.navigator;if(s)return s.substr(0,2);if(Array.isArray(t.languages)&&t.languages.length>0)return t.languages[0].substr(0,2);for(let e=0,r=at.length;e<r;e++){const n=t[at[e]];if(n)return n.substr(0,2)}return"en"},Qt=(s,t)=>{const e=JSON.parse(JSON.stringify(s));return Y(e,t)},Y=(s,t)=>{for(const e in t)try{t[e].constructor===Object?s[e]=Y(s[e],t[e]):s[e]=t[e]}catch{s[e]=t[e]}return s};var ct=(s=>(s.BOTTOM_BAR="bottom_bar",s.PARTLIST_BOUNDS="partlist_bounds",s.INTERACTION_NOTES="interaction_notes",s.PARAMETER_GROUPS="parameter_groups",s))(ct||{});const Zt=s=>JSON.parse(JSON.stringify(s)),te={mobileLandscape:!0,floorMaterialRootTag:"materials_root",buttons:{renderimage:!0,requestproduct:!0,requestplan:!0,load_product:!0,partlist_print:!0},elements:{[ct.INTERACTION_NOTES]:!0},helpcenter:{roomdesigner:!0,configurator:!1,disable:!1},firstPersonView:!0,saveToIdb:!0,featureFlags:{mocAr:!0,wallAutoHeight:!1,openCloseAnimation:!0,enableTwoLevelCatalog:!1,webGpu:!1},rotationSnapDegrees:10,interactionsCollapsed:!1},ee="(idle)",se=s=>(k(s),s?.customApiUrl&&(s.customApiUrl=decodeURIComponent(s.customApiUrl)),s.shareUrl&&(s.deeplink=s.shareUrl.replace(ie,oe)),s),k=s=>{if(!s)return;const t=Object.keys(s);for(const e of t){const r=s[e];if(!Array.isArray(r)&&typeof r=="object"&&r!==null&&k(r),Array.isArray(r))for(const n of r)k(n);(r==="true"||r==="false")&&(s[e]=r==="true")}},re=(s,t)=>{t.configuratorId=s.id;const e=s.settings||{};return!t.overrideTenant&&s.tenant&&(t.overrideTenant=s.tenant),Qt(e,t)},ne=()=>{const s=Zt(te);s.locale||(s.locale=Jt()),s.id===ee&&delete s.id;const t=qt();return t&&Kt(t)&&(s.configuratorId="demoConfigurator"),s.customApiUrl=void 0,s.emails=!1,s},ie="<CONF_ID>",oe="#CONFIGURATIONID#",ae=s=>{s.featureFlags||(s.featureFlags={}),typeof s.featureFlags.realPartList!="boolean"&&(s.featureFlags.realPartList=!0),typeof s.featureFlags.globalCallbacks!="boolean"&&(s.featureFlags.globalCallbacks=!0),typeof s.featureFlags.mocAr!="boolean"&&(s.featureFlags.mocAr=!1)},lt=()=>/(android)/i.test(navigator.userAgent);class ut{_messageHandler=null;isSetupDone=!1;viewName="main";plugins={};pluginsLoaded=[];ui={callbacks:null};extended={callbacks:null};configurator={callbacks:null};analytics={callbacks:{}};rapi={callbacks:{}};global={callbacks:{}};setMessageHandler(t){this._messageHandler=t}handleSetup(t){const{methods:e,callbacks:r}=t;e.forEach(n=>{const i=n.split(U),o=i[0],a=i[1];this[o]||(this[o]={}),this[o][a]=(function(){if(!this._messageHandler){console.error("MessageHandler not set");return}return this._messageHandler.sendMessage(n,[...arguments])}).bind(this)}),r.forEach(n=>{const i=n.split(U),o=i[0],a=i[1],c=i[2];this[o]||(this[o]={}),this[o][a]||(this[o][a]={}),this[o][a][c]=()=>{}}),this.isSetupDone=!0}executeMessage({message:t,args:e}){const r=t.split(U),n=r[0],i=r[1],o=r.length===3?r[2]:null;if(o&&this[n][i][o]){const a=this[n][i][o](...e);return a instanceof Promise?a.then(c=>({result:c})):a!==void 0?Promise.resolve({result:a}):Promise.resolve({result:null})}return Promise.reject('Message "'+t+'" is unkown')}setupPlugins(t,e,r="website"){for(const n of t)typeof n=="string"&&n==="dragIn"?this.pluginsLoaded.push(new Promise((i,o)=>{try{Promise.resolve().then(()=>me).then(({DragIn:a})=>{const c=new a(this.ui,e,r,this.viewName);c.init().then(()=>{this.plugins.dragIn=c,i()},o)})}catch(a){o(a)}})):n.name&&n.loader&&this.pluginsLoaded.push(new Promise((i,o)=>{try{n.loader().then(a=>{const c=new a(this.ui,e,r,this.viewName);c.init().then(()=>{this.plugins[n.name]=c,i()},o)})}catch(a){o(a)}}))}}const ht=()=>{let s,t;return{promise:new Promise((r,n)=>{s=r,t=n}),resolve:s,reject:t}},dt=(s,t,e)=>{let r=null;Object.defineProperty(s,t,{get(){return r||e},set(n){n?.mute?r=n.value:(console.warn("You override Roomle defined behaviour. To disalbe this warning pass in an object with the following properties"),console.warn("{ mute: true, value: () => void }"),r=n)}})},gt=()=>window.innerHeight*.01+"px",mt=s=>{s&&setTimeout(()=>s.style.setProperty(W,gt()),0)},_t="rml-styles",ce=450,W="--rml-full-height",m={CONTAINER:"rml-container",FILL:"rml-fill",POSITION:"rml-pos",TRANSITION:"rml-transition",ANDROID_HEIGHT:"rml-android-height",OVERFLOW_HIDDEN:"rml-overflow-hidden"},X=new Map,le=s=>{const t={get(e,r,n){const i=Reflect.get(e,r,n);return i!==void 0?i:(console.warn(`[Homag Intelligence Callbacks] Method '${String(r)}' is not implemented. Executing a no-op.`),(...o)=>{})}};return new Proxy(s,t)},ue={HIDE:"hide",SHOW_ATTRIBUTES:"attributes",SHOW_ARTICLES:"articles"};class he extends ut{static createPlanner(t,e,r,n=[]){return this._create(t,e,r,n)}static async connect(t,e=[]){const r=new ut;r.viewName=t;const{resolve:n,promise:i}=ht(),{resolve:o,promise:a}=ht(),c=({message:d,args:h})=>{switch(d){case R.REGISTER_CUSTOM_VIEW_DONE:n();break;case R.RETURN_METHODS:r.handleSetup(h[0]),o();break;default:if(r.isSetupDone)return r.executeMessage({message:d,args:h})}},l=new D("custom-view-"+t,window,window.parent,c);r.setMessageHandler(l);const u=[t];return l.sendMessage(R.REGISTER_CUSTOM_VIEW,u),await i,l.sendMessage(R.GET_METHODS,u),await a,r.setupPlugins(e,document.body,"custom-view"),await Promise.allSettled(r.pluginsLoaded),r}static createConfigurator(t,e,r,n=[]){return this._create(t,e,r,n)}static create(t,e,r,n){return this._create(t,e,r,n)}static createViewer(t,e,r,n=[]){return this._create(t,e,r,n)}static hiMessageHandler=null;static setupHi(t){this.hiMessageHandler&&window.removeEventListener("message",this.hiMessageHandler),this.hiMessageHandler=e=>{if(e.data.type==="connect_hi"&&e.data.port){const r=e.data.port;r.start?.(),H(le(t),r)}},window.addEventListener("message",this.hiMessageHandler)}static async _create(t,e,r,n){return new Promise(async(i,o)=>{try{const a=Y(ne(),se(r));ae(a);const c=await $t(t,a);r=re(c,a);const l=new this(c,e,r,n,i);return await Promise.allSettled(l.pluginsLoaded),l}catch(a){return o(a)}})}_waitForIframe;_container;_configuratorSettings;_initData={};_iframe;constructor(t,e,r,n,i){if(super(),!t||typeof t.id!="string")throw new Error("Please provide a correct configuratorId, you get the correct ID from your Roomle Contact Person");if(X.has(e))throw new Error("There is already an instance on this DOM element");if(!!!document.getElementById(_t)){const l=r.zIndex||9999999,u=document.createElement("style");u.type="text/css",u.id=_t;const d="transition:all ease-in-out "+ce+"ms;",h=["-webkit-","-o-"].reduce((E,f)=>E+=f+d,"")+d,g=gt();u.innerHTML=`
6
6
  .${m.CONTAINER}{${W}:${g};}
7
7
  .${m.POSITION}{position:fixed;top:0;left:0;z-index:${l};opacity:0}
8
8
  .${m.TRANSITION}{${h}}
9
9
  .${m.FILL}{width:100%;height:100%;opacity:1}
10
10
  .${m.ANDROID_HEIGHT}{height:calc(var(${W},1vh)*100)}
11
11
  .${m.OVERFLOW_HIDDEN}{overflow:hidden}
12
- `,document.head.appendChild(u)}this._executeMessage=this._executeMessage.bind(this);const a=new D("website",window,null,this._executeMessage);this.setMessageHandler(a),this._onResize=this._onResize.bind(this),lt()&&window.addEventListener("resize",this._onResize),this._container=e,this._initData=r,this._configuratorSettings=t;const c=this._createIframe();this._onUseFullPage=this._onUseFullPage.bind(this),this._onBackToWebsite=this._onBackToWebsite.bind(this),this._waitForIframe=i,this._container.appendChild(c),this._iframe=c,this.setupPlugins(n,this._iframe),X.set(e,!0)}teardown(){this._container&&X.delete(this._container);const t=this._container.querySelector("iframe");t&&this._container.removeChild(t),window.removeEventListener("resize",this._onResize)}_createIframe(){const t=document.createElement("iframe");let e=this._configuratorSettings?.url||"https://www.roomle.com/t/cp/";return this._initData.useLocalRoomle&&(e=location.href.replace("embedding.html","")),location.href.includes("roomle.gitlab.io")&&(e=location.href.replace("embedding.html","index.html")),this._initData.overrideServerUrl&&(e=this._initData.overrideServerUrl),t.src=e,t.classList.add(m.CONTAINER),t.classList.add(m.FILL),t}_onResize(){mt(this._iframe)}_onUseFullPage(){this._iframe.classList.add(m.POSITION),document.documentElement.classList.add(m.OVERFLOW_HIDDEN),window.document.body.classList.add(m.OVERFLOW_HIDDEN),lt()&&(mt(this._iframe),this._iframe.classList.add(m.ANDROID_HEIGHT))}_onBackToWebsite(){this._iframe.classList.remove(m.POSITION),this._iframe.classList.remove(m.ANDROID_HEIGHT),document.documentElement.classList.remove(m.OVERFLOW_HIDDEN),window.document.body.classList.remove(m.OVERFLOW_HIDDEN)}_executeMessage({message:t,args:e},r){if(r.source&&r.source===this._iframe?.contentWindow)return t===B.REQUEST_BOOT?this._messageHandler?(this._messageHandler.setOutgoingMessageBus(r.source),Promise.resolve({result:this._initData})):(console.error("MessageHandler not set"),Promise.resolve({error:"MessageHandler not set"})):t===B.SETUP?(this.handleSetup(e[0]),dt(this.ui.callbacks,"onUseFullPage",this._onUseFullPage),dt(this.ui.callbacks,"onBackToWebsite",this._onBackToWebsite),this._waitForIframe(this),setTimeout(()=>{if(!this._messageHandler){console.error("MessageHandler not set");return}this._messageHandler.sendMessage(B.WEBSITE_READY)},0),Promise.resolve({result:null})):this.executeMessage({message:t,args:e})}}class de{_mainDomElement;_instance;_mode="website";_viewName="main";constructor(t,e,r,n){this._instance=t,this._mainDomElement=e,this._mode=r,this._viewName=n}async init(){return Promise.resolve()}}const C="rml-drag-in-styles",v="rml-drag-in-drag-element",L="rml-drag-in-overlay",N="rml-drag-in-drag-ghost",ft="rml-drag-in-fade-in",pt="rml-drag-in-fade-out",z={DISPLAY_NONE:"rml-display-none"},yt=.5,Et="250ms",Dt="forwards",Tt=`@keyframes ${ft} {from{opacity: 0;}to {opacity: ${yt};}}`,St=`@keyframes ${pt} {from{opacity: ${yt};}to {opacity: 0;}}`,wt=`${ft} ${Et} ${Dt}`,bt=`${pt} ${Et} ${Dt}`,x="https://res.cloudinary.com/roomle/image/upload/v1729679975/fallback_afpyqr.jpg",$=112,V=112;class ge extends de{options={};_customDragSignal=new AbortController;_injectStyles(){if(!!!document.getElementById(C)){const e=document.createElement("style");e.type="text/css",e.id=C,e.innerHTML=`
12
+ `,document.head.appendChild(u)}this._executeMessage=this._executeMessage.bind(this);const a=new D("website",window,null,this._executeMessage);this.setMessageHandler(a),this._onResize=this._onResize.bind(this),lt()&&window.addEventListener("resize",this._onResize),this._container=e,this._initData=r,this._configuratorSettings=t;const c=this._createIframe();this._onUseFullPage=this._onUseFullPage.bind(this),this._onBackToWebsite=this._onBackToWebsite.bind(this),this._waitForIframe=i,this._container.appendChild(c),this._iframe=c,this.setupPlugins(n,this._iframe),X.set(e,!0)}teardown(){this._container&&X.delete(this._container);const t=this._container.querySelector("iframe");t&&this._container.removeChild(t),window.removeEventListener("resize",this._onResize)}_createIframe(){const t=document.createElement("iframe");let e=this._configuratorSettings?.url||"https://www.roomle.com/t/cp/";return this._initData.useLocalRoomle&&(e=location.href.replace("embedding.html","")),location.href.includes("roomle.gitlab.io")&&(e=location.href.replace("embedding.html","index.html")),this._initData.overrideServerUrl&&(e=this._initData.overrideServerUrl),t.src=e,t.classList.add(m.CONTAINER),t.classList.add(m.FILL),t}_onResize(){mt(this._iframe)}_onUseFullPage(){this._iframe.classList.add(m.POSITION),document.documentElement.classList.add(m.OVERFLOW_HIDDEN),window.document.body.classList.add(m.OVERFLOW_HIDDEN),lt()&&(mt(this._iframe),this._iframe.classList.add(m.ANDROID_HEIGHT))}_onBackToWebsite(){this._iframe.classList.remove(m.POSITION),this._iframe.classList.remove(m.ANDROID_HEIGHT),document.documentElement.classList.remove(m.OVERFLOW_HIDDEN),window.document.body.classList.remove(m.OVERFLOW_HIDDEN)}_executeMessage({message:t,args:e},r){if(r.source&&r.source===this._iframe?.contentWindow)return t===B.REQUEST_BOOT?this._messageHandler?(this._messageHandler.setOutgoingMessageBus(r.source),Promise.resolve({result:this._initData})):(console.error("MessageHandler not set"),Promise.resolve({error:"MessageHandler not set"})):t===B.SETUP?(this.handleSetup(e[0]),dt(this.ui.callbacks,"onUseFullPage",this._onUseFullPage),dt(this.ui.callbacks,"onBackToWebsite",this._onBackToWebsite),this._waitForIframe(this),setTimeout(()=>{if(!this._messageHandler){console.error("MessageHandler not set");return}this._messageHandler.sendMessage(B.WEBSITE_READY)},0),Promise.resolve({result:null})):this.executeMessage({message:t,args:e})}}class de{_mainDomElement;_instance;_mode="website";_viewName="main";constructor(t,e,r,n){this._instance=t,this._mainDomElement=e,this._mode=r,this._viewName=n}async init(){return Promise.resolve()}}const v="rml-drag-in-styles",C="rml-drag-in-drag-element",L="rml-drag-in-overlay",N="rml-drag-in-drag-ghost",ft="rml-drag-in-fade-in",pt="rml-drag-in-fade-out",z={DISPLAY_NONE:"rml-display-none"},yt=.5,Et="250ms",Dt="forwards",Tt=`@keyframes ${ft} {from{opacity: 0;}to {opacity: ${yt};}}`,wt=`@keyframes ${pt} {from{opacity: ${yt};}to {opacity: 0;}}`,St=`${ft} ${Et} ${Dt}`,bt=`${pt} ${Et} ${Dt}`,x="https://res.cloudinary.com/roomle/image/upload/v1729679975/fallback_afpyqr.jpg",$=112,V=112;class ge extends de{options={};_customDragSignal=new AbortController;_injectStyles(){if(!!!document.getElementById(v)){const e=document.createElement("style");e.type="text/css",e.id=v,e.innerHTML=`
13
13
  .${z.DISPLAY_NONE}{display:none}
14
14
  .${L}{position:absolute;top:0;left:0;width:100%;height:100%;z-index:999;}
15
15
  .${N}{position:absolute;top:0;left:0;width:1px;height:1px;z-index:999;pointer-events:none;background-color:transparent;}
16
16
  ${Tt}
17
- ${St}
18
- `,document.head.appendChild(e)}}_initializeDragGhost(){const t=this._mainDomElement.parentNode;let e=t.querySelector("."+N);e||(e=document.createElement("div"),e.classList.add(N),e.innerText=" ",t.appendChild(e))}constructor(t,e,r,n){super(t,e,r,n),this._mainDomElement=e,this._injectStyles(),this._initializeDragGhost()}async init(){if(await super.init(),this._mode==="website")try{const{DragInFromWebsiteStrategy:t}=await Promise.resolve().then(()=>we);this._strategy=new t(this._instance,this._mainDomElement,{settings:this.options,mode:"website"})}catch(t){throw console.error('Could not load Dragin strategy "FromWebsite"'),t}else if(this._mode==="custom-view")try{const{DragInFromCustomViewStrategy:t}=await Promise.resolve().then(()=>Ce);this._strategy=new t(this._instance,this._mainDomElement,this.options,this._viewName)}catch(t){throw console.error('Could not load Dragin strategy "FromCustomView"'),t}else throw new Error("Unsupported mode")}get isDragging(){return this._strategy.isDragging}dragStart(t,e,r="rml_id"){this._strategy.dragStart(t,e,r)}dragUpdate(t){this._strategy.dragUpdate(t)}dragEnd(){this._strategy.dragEnd()}touchStart(t,e,r="rml_id"){this._strategy.touchStart(t,e,r)}touchMove(t){this._strategy.touchMove(t)}touchEnd(){this._strategy.touchEnd()}dispose(){this._strategy.dispose()}beforeUpdateGhost(t){this._strategy.beforeUpdateGhost(t)}registerCustomDrag({customDragStart:t,customDragEnd:e,customDragUpdate:r,beforeUpdateGhost:n}){n&&this._strategy.beforeUpdateGhost(n);const i=this._customDragSignal.signal,o=l=>{l.target.getAttribute("data-rml-draggable")==="true"&&t(l)},a=l=>{this._strategy.releaseInput(l),this._strategy.isDragging&&e(l)},c=l=>{r(l)};document.querySelectorAll('[data-rml-draggable="true"]').forEach(l=>{l.draggable=!1}),document.addEventListener("mousedown",o,{signal:i}),document.addEventListener("mouseup",a,{signal:i}),document.addEventListener("mousemove",c,{signal:i}),document.addEventListener("mouseleave",a,{signal:i}),document.addEventListener("touchstart",o,{signal:i}),document.addEventListener("touchend",a,{signal:i}),document.addEventListener("touchmove",c,{signal:i})}unregisterCustomDrag(){this._customDragSignal.abort(),this._customDragSignal=new AbortController}releaseInput(t){this._strategy.releaseInput(t)}}const me=Object.freeze(Object.defineProperty({__proto__:null,DragIn:ge},Symbol.toStringTag,{value:"Module"}));class _e{_computedStyleCache=new Map;_maxLifetime=16;_cacheCleanInterval=null;constructor(t=16){this._maxLifetime=t}get(t){const e=this._computedStyleCache.get(t),r=Date.now();if(e&&r-e.updated<this._maxLifetime)return e.style;const n=getComputedStyle(t);return this._computedStyleCache.set(t,{style:n,updated:r}),this._cacheCleanInterval||(this._cacheCleanInterval=setInterval(()=>this._cleanUpCache,Math.max(this._maxLifetime*1e3,5e3))),n}_cleanUpCache(){const t=Date.now();for(const[e,{updated:r}]of this._computedStyleCache.entries())t-r>=this._maxLifetime&&this._computedStyleCache.delete(e);this._computedStyleCache.size===0&&this._cacheCleanInterval&&(clearInterval(this._cacheCleanInterval),this._cacheCleanInterval=null)}}const y=s=>window.TouchEvent&&s instanceof window.TouchEvent;let j;const P=s=>(j||(j=new _e),j.get(s)),It=(s,t,e)=>{const r=parseFloat(s),n=window.devicePixelRatio||1;if(t==="px")return r;if(t==="%"){const o=e===document.documentElement?window.innerWidth:e.offsetWidth;return r/100*o}if(t==="rem"){const o=parseFloat(P(document.documentElement).fontSize);return r*o}if(t==="em"){const o=parseFloat(P(e).fontSize);return r*o}if(t==="vh"||t==="vw"||t==="vmin"||t==="vmax"){const o={vh:window.innerHeight,vw:window.innerWidth,vmin:Math.min(window.innerWidth,window.innerHeight),vmax:Math.max(window.innerWidth,window.innerHeight)};return r/100*o[t]}const i={cm:37.7952755906,mm:3.77952755906,in:96};return t in i?r*i[t]*n:(console.warn("Unable to determine coordinates for drag-in. Therefore drag-in is not possible. Check the CSS that positions the iframe of Roomle"),0)},At=(s,t,e={x:0,y:0})=>{const r=s.getBoundingClientRect(),i=P(s).transform;let o=0,a=0;if(i!=="none"){const h=/translate\(\s*([-+]?\d*\.?\d+|\d+)(px|%)?,?\s*([-+]?\d*\.?\d+|\d+)?(px|%)?\s*\)/,g=i.match(h);g&&(o=It(g[1],g[2],s),a=It(g[3],g[4],s))}const{clientX:c,clientY:l}=S(t,e),u=c-r.left-o+s.scrollLeft,d=l-r.top-a+s.scrollTop;return{x:u,y:d}},S=(s,t=null)=>{const{clientX:e,clientY:r}=y(s)?fe(s):s,n=e>0?e:t?t.x:e,i=r>0?r:t?t.y:r;return{clientX:n,clientY:i}},fe=s=>{if(s.touches.length){let{clientX:e,clientY:r}=s.touches[0];if(s.touches.length>1){const n=s.touches[1],i=n.clientX,o=n.clientY;e=(e+i)/2,r=(r+o)/2}return{clientX:e,clientY:r}}const t=s.changedTouches[0];return{clientX:t.clientX,clientY:t.clientY}},q=500,K=10,pe=100,Ot=15,J=(s,t=0)=>y(s)?{clientX:s.touches[t].clientX,clientY:s.touches[t].clientY}:{clientX:s.clientX,clientY:s.clientY},Mt=s=>s&&y(s)?s.touches.length>0:!0;class Rt{_touchDragTimeOut;_onTouchDragStart;_payload=null;_delay=q;_firstTouch=null;_lastTouch=null;_epsilon=K;constructor(t,{onTouchDragStart:e},r={}){this._payload=t,this._onTouchDragStart=e,this._delay=typeof r.delay=="number"?r.delay:q,this._epsilon=typeof r.epsilon=="number"?r.epsilon:K}onStart(t){Mt(t)&&(this._touchDragTimeOut||(this._firstTouch=J(t,y(t)?t.touches.length-1:0),this._touchDragTimeOut=setTimeout(()=>{this._clearTimeout(),this._lastTouch||(this._lastTouch=J(t)),this._checkXDistance(t)()},this._delay)))}onEnd(){this._resetTouches()}onMove(t){Mt(t)&&(this._lastTouch=J(t))}_clearTimeout(){this._touchDragTimeOut&&(clearTimeout(this._touchDragTimeOut),this._touchDragTimeOut=null)}_resetTouches(){this._clearTimeout(),this._lastTouch=null,this._firstTouch=null,this._payload=null}_checkXDistance(t){return()=>{if(!this._firstTouch||!this._lastTouch)return;let e=!1;e=Math.abs(this._firstTouch.clientX-this._lastTouch.clientX)<this._epsilon,e&&(this._onTouchDragStart(this._payload,t),this._resetTouches())}}}const Ct=(s,t,e=0,r=0)=>{const n=t.x+t.width+e,i=t.x-e,o=t.y+t.height+r,a=t.y-r,{x:c,y:l}=s;return c>=i&&c<=n&&l>=a&&l<=o},vt=(s,t,e,r=0,n=0)=>{if(!(!e||!e.hiddenIn&&!e.visibleIn))return e.visibleIn?Ct({x:s,y:t},e.visibleIn,r,n):e.hiddenIn?!Ct({x:s,y:t},e.hiddenIn,-r,-n):!1},ye=()=>{if(!!!document.getElementById(C)){const t=document.createElement("style");t.type="text/css",t.id=C,t.innerHTML=`
17
+ ${wt}
18
+ `,document.head.appendChild(e)}}_initializeDragGhost(){const t=this._mainDomElement.parentNode;let e=t.querySelector("."+N);e||(e=document.createElement("div"),e.classList.add(N),e.innerText=" ",t.appendChild(e))}constructor(t,e,r,n){super(t,e,r,n),this._mainDomElement=e,this._injectStyles(),this._initializeDragGhost()}async init(){if(await super.init(),this._mode==="website")try{const{DragInFromWebsiteStrategy:t}=await Promise.resolve().then(()=>Se);this._strategy=new t(this._instance,this._mainDomElement,{settings:this.options,mode:"website"})}catch(t){throw console.error('Could not load Dragin strategy "FromWebsite"'),t}else if(this._mode==="custom-view")try{const{DragInFromCustomViewStrategy:t}=await Promise.resolve().then(()=>ve);this._strategy=new t(this._instance,this._mainDomElement,this.options,this._viewName)}catch(t){throw console.error('Could not load Dragin strategy "FromCustomView"'),t}else throw new Error("Unsupported mode")}get isDragging(){return this._strategy.isDragging}dragStart(t,e,r="rml_id"){this._strategy.dragStart(t,e,r)}dragUpdate(t){this._strategy.dragUpdate(t)}dragEnd(){this._strategy.dragEnd()}touchStart(t,e,r="rml_id"){this._strategy.touchStart(t,e,r)}touchMove(t){this._strategy.touchMove(t)}touchEnd(){this._strategy.touchEnd()}dispose(){this._strategy.dispose()}beforeUpdateGhost(t){this._strategy.beforeUpdateGhost(t)}registerCustomDrag({customDragStart:t,customDragEnd:e,customDragUpdate:r,beforeUpdateGhost:n}){n&&this._strategy.beforeUpdateGhost(n);const i=this._customDragSignal.signal,o=l=>{l.target.getAttribute("data-rml-draggable")==="true"&&t(l)},a=l=>{this._strategy.releaseInput(l),this._strategy.isDragging&&e(l)},c=l=>{r(l)};document.querySelectorAll('[data-rml-draggable="true"]').forEach(l=>{l.draggable=!1}),document.addEventListener("mousedown",o,{signal:i}),document.addEventListener("mouseup",a,{signal:i}),document.addEventListener("mousemove",c,{signal:i}),document.addEventListener("mouseleave",a,{signal:i}),document.addEventListener("touchstart",o,{signal:i}),document.addEventListener("touchend",a,{signal:i}),document.addEventListener("touchmove",c,{signal:i})}unregisterCustomDrag(){this._customDragSignal.abort(),this._customDragSignal=new AbortController}releaseInput(t){this._strategy.releaseInput(t)}}const me=Object.freeze(Object.defineProperty({__proto__:null,DragIn:ge},Symbol.toStringTag,{value:"Module"}));class _e{_computedStyleCache=new Map;_maxLifetime=16;_cacheCleanInterval=null;constructor(t=16){this._maxLifetime=t}get(t){const e=this._computedStyleCache.get(t),r=Date.now();if(e&&r-e.updated<this._maxLifetime)return e.style;const n=getComputedStyle(t);return this._computedStyleCache.set(t,{style:n,updated:r}),this._cacheCleanInterval||(this._cacheCleanInterval=setInterval(()=>this._cleanUpCache,Math.max(this._maxLifetime*1e3,5e3))),n}_cleanUpCache(){const t=Date.now();for(const[e,{updated:r}]of this._computedStyleCache.entries())t-r>=this._maxLifetime&&this._computedStyleCache.delete(e);this._computedStyleCache.size===0&&this._cacheCleanInterval&&(clearInterval(this._cacheCleanInterval),this._cacheCleanInterval=null)}}const y=s=>window.TouchEvent&&s instanceof window.TouchEvent;let j;const P=s=>(j||(j=new _e),j.get(s)),It=(s,t,e)=>{const r=parseFloat(s),n=window.devicePixelRatio||1;if(t==="px")return r;if(t==="%"){const o=e===document.documentElement?window.innerWidth:e.offsetWidth;return r/100*o}if(t==="rem"){const o=parseFloat(P(document.documentElement).fontSize);return r*o}if(t==="em"){const o=parseFloat(P(e).fontSize);return r*o}if(t==="vh"||t==="vw"||t==="vmin"||t==="vmax"){const o={vh:window.innerHeight,vw:window.innerWidth,vmin:Math.min(window.innerWidth,window.innerHeight),vmax:Math.max(window.innerWidth,window.innerHeight)};return r/100*o[t]}const i={cm:37.7952755906,mm:3.77952755906,in:96};return t in i?r*i[t]*n:(console.warn("Unable to determine coordinates for drag-in. Therefore drag-in is not possible. Check the CSS that positions the iframe of Roomle"),0)},At=(s,t,e={x:0,y:0})=>{const r=s.getBoundingClientRect(),i=P(s).transform;let o=0,a=0;if(i!=="none"){const h=/translate\(\s*([-+]?\d*\.?\d+|\d+)(px|%)?,?\s*([-+]?\d*\.?\d+|\d+)?(px|%)?\s*\)/,g=i.match(h);g&&(o=It(g[1],g[2],s),a=It(g[3],g[4],s))}const{clientX:c,clientY:l}=w(t,e),u=c-r.left-o+s.scrollLeft,d=l-r.top-a+s.scrollTop;return{x:u,y:d}},w=(s,t=null)=>{const{clientX:e,clientY:r}=y(s)?fe(s):s,n=e>0?e:t?t.x:e,i=r>0?r:t?t.y:r;return{clientX:n,clientY:i}},fe=s=>{if(s.touches.length){let{clientX:e,clientY:r}=s.touches[0];if(s.touches.length>1){const n=s.touches[1],i=n.clientX,o=n.clientY;e=(e+i)/2,r=(r+o)/2}return{clientX:e,clientY:r}}const t=s.changedTouches[0];return{clientX:t.clientX,clientY:t.clientY}},q=500,K=10,pe=100,Ot=15,J=(s,t=0)=>y(s)?{clientX:s.touches[t].clientX,clientY:s.touches[t].clientY}:{clientX:s.clientX,clientY:s.clientY},Mt=s=>s&&y(s)?s.touches.length>0:!0;class Rt{_touchDragTimeOut;_onTouchDragStart;_payload=null;_delay=q;_firstTouch=null;_lastTouch=null;_epsilon=K;constructor(t,{onTouchDragStart:e},r={}){this._payload=t,this._onTouchDragStart=e,this._delay=typeof r.delay=="number"?r.delay:q,this._epsilon=typeof r.epsilon=="number"?r.epsilon:K}onStart(t){Mt(t)&&(this._touchDragTimeOut||(this._firstTouch=J(t,y(t)?t.touches.length-1:0),this._touchDragTimeOut=setTimeout(()=>{this._clearTimeout(),this._lastTouch||(this._lastTouch=J(t)),this._checkXDistance(t)()},this._delay)))}onEnd(){this._resetTouches()}onMove(t){Mt(t)&&(this._lastTouch=J(t))}_clearTimeout(){this._touchDragTimeOut&&(clearTimeout(this._touchDragTimeOut),this._touchDragTimeOut=null)}_resetTouches(){this._clearTimeout(),this._lastTouch=null,this._firstTouch=null,this._payload=null}_checkXDistance(t){return()=>{if(!this._firstTouch||!this._lastTouch)return;let e=!1;e=Math.abs(this._firstTouch.clientX-this._lastTouch.clientX)<this._epsilon,e&&(this._onTouchDragStart(this._payload,t),this._resetTouches())}}}const vt=(s,t,e=0,r=0)=>{const n=t.x+t.width+e,i=t.x-e,o=t.y+t.height+r,a=t.y-r,{x:c,y:l}=s;return c>=i&&c<=n&&l>=a&&l<=o},Ct=(s,t,e,r=0,n=0)=>{if(!(!e||!e.hiddenIn&&!e.visibleIn))return e.visibleIn?vt({x:s,y:t},e.visibleIn,r,n):e.hiddenIn?!vt({x:s,y:t},e.hiddenIn,-r,-n):!1},ye=()=>{if(!!!document.getElementById(v)){const t=document.createElement("style");t.type="text/css",t.id=v,t.innerHTML=`
19
19
  ${Tt}
20
- ${St}
21
- `,document.head.appendChild(t)}},Ee=({x:s,y:t},e)=>{let r=document.getElementById(v);if(!r){if(r=document.createElement("div"),e.ghost?.element)r.appendChild(e.ghost.element);else{const n=document.createElement("img");n.src=e.ghost?.url||x,n.width=e.ghost?.width||$,n.height=e.ghost?.height||V,r.appendChild(n)}r.id=v,r.style.position="fixed",r.style.top="0",r.style.left="0",r.style.willChange="transform",r.style.transform="translate3d(0, 0, 0)",r.style.zIndex="9999",r.style.opacity="0.5",vt(s,t,e.ghost||{},e.settings?.dragInOverlapX,e.settings?.dragInOverlapY)||(r.style.display="none"),r.style.pointerEvents="none",document.body.appendChild(r)}},De=({x:s,y:t},e)=>{const r=document.getElementById(v);if(!r)return;let n=e.ghost?.width,i=e.ghost?.height;typeof n>"u"&&(n=r.getBoundingClientRect().width||$),typeof i>"u"&&(i=r.getBoundingClientRect().height||V);const o=s-n/2,a=t-i/2;r.style.transform=`translate3d(${o}px, ${a}px, 0)`,e.ghost&&(vt(s,t,e.ghost,e.settings?.dragInOverlapX,e.settings?.dragInOverlapY)?r.style.animation!=wt&&(r.style.animation=wt):r.style.animation!=bt&&(r.style.animation=bt))};class Te{_dragGhostAnimationFrameId=null;_dragGhostRemoveAnimationFrameId=null;_dragGhostElement=null;constructor(t=null){this._dragGhostElement=t}updateDragGhost(t,e,r){this._dragGhostRemoveAnimationFrameId&&(cancelAnimationFrame(this._dragGhostRemoveAnimationFrameId),this._dragGhostRemoveAnimationFrameId=null),!r.ghost?.external&&r.ghost&&(this._dragGhostAnimationFrameId||(this._dragGhostAnimationFrameId=requestAnimationFrame(()=>{ye();const n={x:t,y:e};!r.ghost&&this._dragGhostElement&&(r.ghost={}),r.ghost&&!r.ghost.element&&this._dragGhostElement&&(r.ghost.element=this._dragGhostElement),Ee(n,r),De(n,r),this._dragGhostAnimationFrameId=null})))}removeDragGhost(){this._dragGhostAnimationFrameId&&(cancelAnimationFrame(this._dragGhostAnimationFrameId),this._dragGhostAnimationFrameId=null),this._dragGhostRemoveAnimationFrameId||(this._dragGhostRemoveAnimationFrameId=requestAnimationFrame(()=>{const t=document.getElementById(v);t&&document.body.removeChild(t),this._dragGhostRemoveAnimationFrameId=null}))}}class Se{_options={};_instance;_mainDomElement;_currentDrag={};_currentTouch=null;_firefoxDragPosition={x:0,y:0};_onBeforeUpdateDrag=()=>({});isDragging=!1;_firefoxFallback=t=>{if(!this._currentDrag.event)return;t.preventDefault();const e=t||window.event;this._firefoxDragPosition.x=e.pageX||0,this._firefoxDragPosition.y=e.pageY||0};constructor(t,e,r){this._instance=t,this._mainDomElement=e,this._options=r||{},this._firefoxFallback=this._firefoxFallback.bind(this),document.addEventListener("dragover",this._firefoxFallback),this._mainDomElement.parentElement?.addEventListener("dragleave",()=>{this._instance.cancelDragIn()})}beforeUpdateGhost(t){this._onBeforeUpdateDrag=t}dragStart(t,e,r="rml_id"){const n=this._mainDomElement.parentNode;if(P(n).position!=="relative"){console.warn("Parent of iframe should have position relative, otherwise drag-in can not detect the x/y coordinates correctly");return}this._mainDomElement.style.pointerEvents="none";let o=n.querySelector("."+L);o||(o=document.createElement("div"),o.classList.add(L),n.appendChild(o)),o.classList.remove(z.DISPLAY_NONE),e.target.getAttribute("draggable")||console.warn(`Draggable not detected correctly! Did you add draggable="true" to the element? In Sarafi only 'draggable' is too less`);const c=n.querySelector("."+N);this._currentDrag.event=e;const l=e.target,u=l.cloneNode(!0),d=l.getBoundingClientRect();u.style.width=`${d.width}px`,u.style.height=`${d.height}px`,this._currentDrag.ghost=new Te(u),this._currentDrag.offset||(this._currentDrag.offset={x:0,y:0});const{clientX:h,clientY:g}=S(e,this._firefoxDragPosition);this._currentDrag.offset.x=h-d.left,this._currentDrag.offset.y=g-d.top,e instanceof DragEvent&&e.dataTransfer&&e.dataTransfer.setDragImage&&e.dataTransfer.setDragImage(c,0,0);const{x:E,y:f}=At(n,this._currentDrag.event||e,this._firefoxDragPosition),w=Math.max(1,E),ve=Math.max(1,f);this.isDragging=!0,this._instance.dragInObject(t,w,ve,r)}dragUpdate(t){const e=this._mainDomElement.parentNode,{x:r,y:n}=At(e,t,this._firefoxDragPosition);if(r===0&&n===0)return;const i=Math.max(1,r),o=Math.max(1,n);if(i===1&&o===1)return;let a=i,c=o;if(y(t)){const f=this._options.settings?.fingerSize||0;a=Math.max(2,i+f),c=Math.max(2,o-f)}const{x:l,y:u,options:d}=this._onBeforeUpdateDrag(a,c,{}),h=d||{settings:{},ghost:{}};h.ghost||(h.ghost={}),h.ghost.visibleIn&&h.ghost.hiddenIn||(h.ghost.hiddenIn=this._mainDomElement.getBoundingClientRect());const g=typeof l=="number"?l:a,E=typeof u=="number"?u:c;if(this._currentDrag.ghost){const{clientX:f,clientY:w}=S(t,this._firefoxDragPosition);this._currentDrag.ghost.updateDragGhost(f,w,h)}this._instance.updateDrag(g,E,{})}dragEnd(){this._mainDomElement.style.pointerEvents="all";const t=this._mainDomElement.parentNode;this.isDragging=!1,this._instance.dragInObjectEnd(),this._currentDrag.ghost&&(this._currentDrag.ghost.removeDragGhost(),this._currentDrag.ghost=null),this._currentDrag={},this._firefoxDragPosition={x:0,y:0};const e=t.querySelector("."+L);e&&e.classList.add(z.DISPLAY_NONE)}touchStart(t,e,r="rml_id"){e.preventDefault();const n=(o,a)=>{this.dragStart(t,a,r)},i={};typeof this._options?.settings?.touchDragDelay=="number"&&(i.delay=this._options.settings.touchDragDelay),this._options?.settings?.touchDragEpsilon&&(i.epsilon=this._options.settings.touchDragEpsilon),this._currentTouch=new Rt(void 0,{onTouchDragStart:n},i),this._currentTouch.onStart(e)}touchMove(t){this._currentTouch&&this._currentTouch.onMove(t),this._currentDrag.event&&this.dragUpdate(t)}touchEnd(){this._currentTouch&&this._currentTouch.onEnd(),this._currentTouch=null,this.dragEnd()}dispose(){document.removeEventListener("dragover",this._firefoxFallback)}releaseInput(t){}}const we=Object.freeze(Object.defineProperty({__proto__:null,DragInFromWebsiteStrategy:Se},Symbol.toStringTag,{value:"Module"})),be=s=>`[data-rml-custom-view="${s}"]`,Q=s=>{s.preventDefault(),s.stopPropagation()},Ie=(s,t,e,r)=>{const n=e-s,i=r-t;return Math.sqrt(n*n+i*i)};class Ae{_startX=0;_startY=0;_lastX=0;_lastY=0;_epsilon;_isWaiting=!1;_onCustomDragStart;constructor({onCustomDragStart:t},e={}){this._epsilon=typeof e.epsilon=="number"?e.epsilon:Ot,this._onCustomDragStart=t}onMove(t){this._lastX=t.clientX,this._lastY=t.clientY,this._isWaiting&&Ie(this._startX,this._startY,this._lastX,this._lastY)>this._epsilon&&(this._onCustomDragStart(t),this._isWaiting=!1)}onStart(t){this._startX=t.clientX,this._startY=t.clientY,this.onMove(t),this._isWaiting=!0}onEnd(){this._reset()}_reset(){this._startX=0,this._startY=0,this._lastX=0,this._lastY=0,this._isWaiting=!1}}const Z="data-rml-old-draggable",Oe=void 0,Lt=(s,t)=>{const e=y(s),r={delay:e?q:pe,epsilon:e?K:Ot};if(!t)return r;if(!e&&!(s instanceof MouseEvent))return console.warn("Unsupported event! It is not TouchEvent and also not MouseEvent"),r;const{delayKey:n,epsilonKey:i}=e?{delayKey:"touchDragDelay",epsilonKey:"touchDragEpsilon"}:{delayKey:"customDragDelay",epsilonKey:"customDragEpsilon"};return typeof t[n]=="number"&&(r.delay=t.touchDragDelay),typeof t[i]=="number"&&(r.epsilon=t.touchDragEpsilon),r},Me=s=>{let t="",e=$,r=V;if(!s)return{url:x,width:e,height:r};const n=s;if(n instanceof HTMLElement){const i=n.getBoundingClientRect(),o=n.getAttribute("data-rml-ghost-url"),a=n.getAttribute("data-rml-ghost-width"),c=n.getAttribute("data-rml-ghost-height");o?t=o:!o&&n instanceof HTMLImageElement&&n.src&&(t=n.src),t?(e=i.width,r=i.height):t=x,e=a?parseInt(a,10):e,r=c?parseInt(c,10):r}return{url:t||x,width:e,height:r}};class Re{_options={};_instance;_mainDomElement;_viewName;_currentCustomDrag=null;_currentBb=null;_startTarget=null;_onBeforeUpdateDrag=()=>({});isDragging=!1;constructor(t,e,r,n){this._instance=t,this._options=r||{},this._viewName=n,this._mainDomElement=e,this._mainDomElement.parentElement?.addEventListener("dragleave",()=>{this._instance.cancelDragIn()})}beforeUpdateGhost(t){this._onBeforeUpdateDrag=t}async _dragStart(t,e,r="rml_id"){this._startTarget&&(this._startTarget.style.pointerEvents="none",this._startTarget.style.userSelect="none",this._startTarget.setAttribute(Z,this._startTarget.draggable.toString()),this._startTarget.draggable=!1,this._startTarget.removeEventListener("dragstart",Q),this._startTarget.addEventListener("dragstart",Q)),this._currentBb=await this._instance.getBoundingClientRect(be(this._viewName));const{clientX:n,clientY:i}=S(e),o=this._currentBb.x+n,a=this._currentBb.y+i;this.isDragging=!0,this._instance.dragInObject(t,o,a,r)}_dragUpdate(t){if(document.body.focus(),this._currentCustomDrag&&this._currentCustomDrag.onMove(t),!this._currentBb||!this.isDragging)return;const{clientX:e,clientY:r}=S(t),{url:n,width:i,height:o}=Me(this._startTarget),a=this._currentBb.x+e,c=this._currentBb.y+r,l=this._options||{},u={ghost:{visibleIn:{x:this._currentBb.x-(l.dragInOverlapX||0),y:this._currentBb.y+(l.dragInOverlapY||0),width:this._currentBb.width+(l.dragInOverlapX||0),height:this._currentBb.height+(l.dragInOverlapY||0)},url:n,width:i,height:o},mode:"custom-view"},{x:d,y:h,options:g}=this._onBeforeUpdateDrag(a,c,u),E=typeof d=="number"?d:a,f=typeof h=="number"?h:c,w=g||u;this._instance.updateDrag(E,f,w)}_dragEnd(){this._currentCustomDrag&&this._currentCustomDrag.onEnd(),this._currentCustomDrag=null,this.isDragging=!1,this._currentBb=null,this._resetStartTarget(),this._instance.enableEvents(),this._instance.dragInObjectEnd()}dragStart(t,e,r){this._instance.disableEvents(),this._startTarget=e.target;const n=(i,o)=>{this._dragStart(t,o,r)};this._currentCustomDrag=y(e)?new Rt(Oe,{onTouchDragStart:n},Lt(e,this._options)):new Ae({onCustomDragStart:i=>this._dragStart(t,i,r)},Lt(e,this._options)),this._currentCustomDrag.onStart(e)}dragEnd(){this._dragEnd()}dragUpdate(t){this._dragUpdate(t)}touchStart(t,e,r="rml_id"){this.dragStart(t,e,r)}touchMove(t){this.dragUpdate(t)}touchEnd(){this.dragEnd()}dispose(){}_resetStartTarget(){this._startTarget&&(this._startTarget.style.pointerEvents="",this._startTarget.style.userSelect="",this._startTarget.draggable=this._startTarget.getAttribute(Z)==="true",this._startTarget.removeAttribute(Z),this._startTarget.removeEventListener("dragstart",Q))}releaseInput(t){this._currentCustomDrag&&this._currentCustomDrag.onEnd(),this._resetStartTarget()}}const Ce=Object.freeze(Object.defineProperty({__proto__:null,DragInFromCustomViewStrategy:Re},Symbol.toStringTag,{value:"Module"}));_.HI_PANEL_ACTION=ue,_.default=he,Object.defineProperties(_,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
20
+ ${wt}
21
+ `,document.head.appendChild(t)}},Ee=({x:s,y:t},e)=>{let r=document.getElementById(C);if(!r){if(r=document.createElement("div"),e.ghost?.element)r.appendChild(e.ghost.element);else{const n=document.createElement("img");n.src=e.ghost?.url||x,n.width=e.ghost?.width||$,n.height=e.ghost?.height||V,r.appendChild(n)}r.id=C,r.style.position="fixed",r.style.top="0",r.style.left="0",r.style.willChange="transform",r.style.transform="translate3d(0, 0, 0)",r.style.zIndex="9999",r.style.opacity="0.5",Ct(s,t,e.ghost||{},e.settings?.dragInOverlapX,e.settings?.dragInOverlapY)||(r.style.display="none"),r.style.pointerEvents="none",document.body.appendChild(r)}},De=({x:s,y:t},e)=>{const r=document.getElementById(C);if(!r)return;let n=e.ghost?.width,i=e.ghost?.height;typeof n>"u"&&(n=r.getBoundingClientRect().width||$),typeof i>"u"&&(i=r.getBoundingClientRect().height||V);const o=s-n/2,a=t-i/2;r.style.transform=`translate3d(${o}px, ${a}px, 0)`,e.ghost&&(Ct(s,t,e.ghost,e.settings?.dragInOverlapX,e.settings?.dragInOverlapY)?r.style.animation!=St&&(r.style.animation=St):r.style.animation!=bt&&(r.style.animation=bt))};class Te{_dragGhostAnimationFrameId=null;_dragGhostRemoveAnimationFrameId=null;_dragGhostElement=null;constructor(t=null){this._dragGhostElement=t}updateDragGhost(t,e,r){this._dragGhostRemoveAnimationFrameId&&(cancelAnimationFrame(this._dragGhostRemoveAnimationFrameId),this._dragGhostRemoveAnimationFrameId=null),!r.ghost?.external&&r.ghost&&(this._dragGhostAnimationFrameId||(this._dragGhostAnimationFrameId=requestAnimationFrame(()=>{ye();const n={x:t,y:e};!r.ghost&&this._dragGhostElement&&(r.ghost={}),r.ghost&&!r.ghost.element&&this._dragGhostElement&&(r.ghost.element=this._dragGhostElement),Ee(n,r),De(n,r),this._dragGhostAnimationFrameId=null})))}removeDragGhost(){this._dragGhostAnimationFrameId&&(cancelAnimationFrame(this._dragGhostAnimationFrameId),this._dragGhostAnimationFrameId=null),this._dragGhostRemoveAnimationFrameId||(this._dragGhostRemoveAnimationFrameId=requestAnimationFrame(()=>{const t=document.getElementById(C);t&&document.body.removeChild(t),this._dragGhostRemoveAnimationFrameId=null}))}}class we{_options={};_instance;_mainDomElement;_currentDrag={};_currentTouch=null;_firefoxDragPosition={x:0,y:0};_onBeforeUpdateDrag=()=>({});isDragging=!1;_firefoxFallback=t=>{if(!this._currentDrag.event)return;t.preventDefault();const e=t||window.event;this._firefoxDragPosition.x=e.pageX||0,this._firefoxDragPosition.y=e.pageY||0};constructor(t,e,r){this._instance=t,this._mainDomElement=e,this._options=r||{},this._firefoxFallback=this._firefoxFallback.bind(this),document.addEventListener("dragover",this._firefoxFallback),this._mainDomElement.parentElement?.addEventListener("dragleave",()=>{this._instance.cancelDragIn()})}beforeUpdateGhost(t){this._onBeforeUpdateDrag=t}dragStart(t,e,r="rml_id"){const n=this._mainDomElement.parentNode;if(P(n).position!=="relative"){console.warn("Parent of iframe should have position relative, otherwise drag-in can not detect the x/y coordinates correctly");return}this._mainDomElement.style.pointerEvents="none";let o=n.querySelector("."+L);o||(o=document.createElement("div"),o.classList.add(L),n.appendChild(o)),o.classList.remove(z.DISPLAY_NONE),e.target.getAttribute("draggable")||console.warn(`Draggable not detected correctly! Did you add draggable="true" to the element? In Sarafi only 'draggable' is too less`);const c=n.querySelector("."+N);this._currentDrag.event=e;const l=e.target,u=l.cloneNode(!0),d=l.getBoundingClientRect();u.style.width=`${d.width}px`,u.style.height=`${d.height}px`,this._currentDrag.ghost=new Te(u),this._currentDrag.offset||(this._currentDrag.offset={x:0,y:0});const{clientX:h,clientY:g}=w(e,this._firefoxDragPosition);this._currentDrag.offset.x=h-d.left,this._currentDrag.offset.y=g-d.top,e instanceof DragEvent&&e.dataTransfer&&e.dataTransfer.setDragImage&&e.dataTransfer.setDragImage(c,0,0);const{x:E,y:f}=At(n,this._currentDrag.event||e,this._firefoxDragPosition),S=Math.max(1,E),Ce=Math.max(1,f);this.isDragging=!0,this._instance.dragInObject(t,S,Ce,r)}dragUpdate(t){const e=this._mainDomElement.parentNode,{x:r,y:n}=At(e,t,this._firefoxDragPosition);if(r===0&&n===0)return;const i=Math.max(1,r),o=Math.max(1,n);if(i===1&&o===1)return;let a=i,c=o;if(y(t)){const f=this._options.settings?.fingerSize||0;a=Math.max(2,i+f),c=Math.max(2,o-f)}const{x:l,y:u,options:d}=this._onBeforeUpdateDrag(a,c,{}),h=d||{settings:{},ghost:{}};h.ghost||(h.ghost={}),h.ghost.visibleIn&&h.ghost.hiddenIn||(h.ghost.hiddenIn=this._mainDomElement.getBoundingClientRect());const g=typeof l=="number"?l:a,E=typeof u=="number"?u:c;if(this._currentDrag.ghost){const{clientX:f,clientY:S}=w(t,this._firefoxDragPosition);this._currentDrag.ghost.updateDragGhost(f,S,h)}this._instance.updateDrag(g,E,{})}dragEnd(){this._mainDomElement.style.pointerEvents="all";const t=this._mainDomElement.parentNode;this.isDragging=!1,this._instance.dragInObjectEnd(),this._currentDrag.ghost&&(this._currentDrag.ghost.removeDragGhost(),this._currentDrag.ghost=null),this._currentDrag={},this._firefoxDragPosition={x:0,y:0};const e=t.querySelector("."+L);e&&e.classList.add(z.DISPLAY_NONE)}touchStart(t,e,r="rml_id"){e.preventDefault();const n=(o,a)=>{this.dragStart(t,a,r)},i={};typeof this._options?.settings?.touchDragDelay=="number"&&(i.delay=this._options.settings.touchDragDelay),this._options?.settings?.touchDragEpsilon&&(i.epsilon=this._options.settings.touchDragEpsilon),this._currentTouch=new Rt(void 0,{onTouchDragStart:n},i),this._currentTouch.onStart(e)}touchMove(t){this._currentTouch&&this._currentTouch.onMove(t),this._currentDrag.event&&this.dragUpdate(t)}touchEnd(){this._currentTouch&&this._currentTouch.onEnd(),this._currentTouch=null,this.dragEnd()}dispose(){document.removeEventListener("dragover",this._firefoxFallback)}releaseInput(t){}}const Se=Object.freeze(Object.defineProperty({__proto__:null,DragInFromWebsiteStrategy:we},Symbol.toStringTag,{value:"Module"})),be=s=>`[data-rml-custom-view="${s}"]`,Q=s=>{s.preventDefault(),s.stopPropagation()},Ie=(s,t,e,r)=>{const n=e-s,i=r-t;return Math.sqrt(n*n+i*i)};class Ae{_startX=0;_startY=0;_lastX=0;_lastY=0;_epsilon;_isWaiting=!1;_onCustomDragStart;constructor({onCustomDragStart:t},e={}){this._epsilon=typeof e.epsilon=="number"?e.epsilon:Ot,this._onCustomDragStart=t}onMove(t){this._lastX=t.clientX,this._lastY=t.clientY,this._isWaiting&&Ie(this._startX,this._startY,this._lastX,this._lastY)>this._epsilon&&(this._onCustomDragStart(t),this._isWaiting=!1)}onStart(t){this._startX=t.clientX,this._startY=t.clientY,this.onMove(t),this._isWaiting=!0}onEnd(){this._reset()}_reset(){this._startX=0,this._startY=0,this._lastX=0,this._lastY=0,this._isWaiting=!1}}const Z="data-rml-old-draggable",Oe=void 0,Lt=(s,t)=>{const e=y(s),r={delay:e?q:pe,epsilon:e?K:Ot};if(!t)return r;if(!e&&!(s instanceof MouseEvent))return console.warn("Unsupported event! It is not TouchEvent and also not MouseEvent"),r;const{delayKey:n,epsilonKey:i}=e?{delayKey:"touchDragDelay",epsilonKey:"touchDragEpsilon"}:{delayKey:"customDragDelay",epsilonKey:"customDragEpsilon"};return typeof t[n]=="number"&&(r.delay=t.touchDragDelay),typeof t[i]=="number"&&(r.epsilon=t.touchDragEpsilon),r},Me=s=>{let t="",e=$,r=V;if(!s)return{url:x,width:e,height:r};const n=s;if(n instanceof HTMLElement){const i=n.getBoundingClientRect(),o=n.getAttribute("data-rml-ghost-url"),a=n.getAttribute("data-rml-ghost-width"),c=n.getAttribute("data-rml-ghost-height");o?t=o:!o&&n instanceof HTMLImageElement&&n.src&&(t=n.src),t?(e=i.width,r=i.height):t=x,e=a?parseInt(a,10):e,r=c?parseInt(c,10):r}return{url:t||x,width:e,height:r}};class Re{_options={};_instance;_mainDomElement;_viewName;_currentCustomDrag=null;_currentBb=null;_startTarget=null;_onBeforeUpdateDrag=()=>({});isDragging=!1;constructor(t,e,r,n){this._instance=t,this._options=r||{},this._viewName=n,this._mainDomElement=e,this._mainDomElement.parentElement?.addEventListener("dragleave",()=>{this._instance.cancelDragIn()})}beforeUpdateGhost(t){this._onBeforeUpdateDrag=t}async _dragStart(t,e,r="rml_id"){this._startTarget&&(this._startTarget.style.pointerEvents="none",this._startTarget.style.userSelect="none",this._startTarget.setAttribute(Z,this._startTarget.draggable.toString()),this._startTarget.draggable=!1,this._startTarget.removeEventListener("dragstart",Q),this._startTarget.addEventListener("dragstart",Q)),this._currentBb=await this._instance.getBoundingClientRect(be(this._viewName));const{clientX:n,clientY:i}=w(e),o=this._currentBb.x+n,a=this._currentBb.y+i;this.isDragging=!0,this._instance.dragInObject(t,o,a,r)}_dragUpdate(t){if(document.body.focus(),this._currentCustomDrag&&this._currentCustomDrag.onMove(t),!this._currentBb||!this.isDragging)return;const{clientX:e,clientY:r}=w(t),{url:n,width:i,height:o}=Me(this._startTarget),a=this._currentBb.x+e,c=this._currentBb.y+r,l=this._options||{},u={ghost:{visibleIn:{x:this._currentBb.x-(l.dragInOverlapX||0),y:this._currentBb.y+(l.dragInOverlapY||0),width:this._currentBb.width+(l.dragInOverlapX||0),height:this._currentBb.height+(l.dragInOverlapY||0)},url:n,width:i,height:o},mode:"custom-view"},{x:d,y:h,options:g}=this._onBeforeUpdateDrag(a,c,u),E=typeof d=="number"?d:a,f=typeof h=="number"?h:c,S=g||u;this._instance.updateDrag(E,f,S)}_dragEnd(){this._currentCustomDrag&&this._currentCustomDrag.onEnd(),this._currentCustomDrag=null,this.isDragging=!1,this._currentBb=null,this._resetStartTarget(),this._instance.enableEvents(),this._instance.dragInObjectEnd()}dragStart(t,e,r){this._instance.disableEvents(),this._startTarget=e.target;const n=(i,o)=>{this._dragStart(t,o,r)};this._currentCustomDrag=y(e)?new Rt(Oe,{onTouchDragStart:n},Lt(e,this._options)):new Ae({onCustomDragStart:i=>this._dragStart(t,i,r)},Lt(e,this._options)),this._currentCustomDrag.onStart(e)}dragEnd(){this._dragEnd()}dragUpdate(t){this._dragUpdate(t)}touchStart(t,e,r="rml_id"){this.dragStart(t,e,r)}touchMove(t){this.dragUpdate(t)}touchEnd(){this.dragEnd()}dispose(){}_resetStartTarget(){this._startTarget&&(this._startTarget.style.pointerEvents="",this._startTarget.style.userSelect="",this._startTarget.draggable=this._startTarget.getAttribute(Z)==="true",this._startTarget.removeAttribute(Z),this._startTarget.removeEventListener("dragstart",Q))}releaseInput(t){this._currentCustomDrag&&this._currentCustomDrag.onEnd(),this._resetStartTarget()}}const ve=Object.freeze(Object.defineProperty({__proto__:null,DragInFromCustomViewStrategy:Re},Symbol.toStringTag,{value:"Module"}));_.HI_PANEL_ACTION=ue,_.default=he,Object.defineProperties(_,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));