@roomle/embedding-lib 5.29.0-alpha.4 → 5.30.0-alpha.1

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 (28) hide show
  1. package/docs/md/web/embedding/CHANGELOG.md +31 -2
  2. package/package.json +1 -1
  3. package/packages/embedding-lib/src/embedding-lib.d.ts +14 -0
  4. package/packages/embedding-lib/src/examples/homag-intelligence-catalog-load-async.d.ts +14 -0
  5. package/packages/embedding-lib/src/examples/utils/homag-intelligence/util.d.ts +1 -0
  6. package/packages/web-sdk/packages/homag-intelligence/src/api.d.ts +4 -1
  7. package/packages/web-sdk/packages/homag-intelligence/src/debug-logging.d.ts +54 -0
  8. package/packages/web-sdk/packages/homag-intelligence/src/emulator.d.ts +10 -6
  9. package/packages/web-sdk/packages/homag-intelligence/src/hi-tag-catalog-callbacks.d.ts +3 -3
  10. package/packages/web-sdk/packages/homag-intelligence/src/homag-intelligence.d.ts +5 -6
  11. package/packages/web-sdk/packages/homag-intelligence/src/loader.d.ts +16 -4
  12. package/packages/web-sdk/packages/homag-intelligence/src/orders.d.ts +3 -7
  13. package/packages/web-sdk/packages/planner-core/src/external-object-api.d.ts +1 -1
  14. package/packages/web-sdk/packages/planner-core/src/roomle-planner.d.ts +9 -1
  15. package/packages/web-sdk/packages/planner-core/src/utils/planner-selection-handler.d.ts +1 -1
  16. package/packages/web-sdk/packages/planner-core/src/webgl/planner-scene-manager.d.ts +2 -2
  17. package/packages/web-sdk/packages/typings/kernel.d.ts +3 -0
  18. package/packages/web-sdk/packages/typings/planner.d.ts +15 -0
  19. package/roomle-embedding-lib.es.js +45 -26
  20. package/roomle-embedding-lib.es.min.js +1 -1
  21. package/roomle-embedding-lib.umd.js +4 -4
  22. package/roomle-embedding-lib.umd.min.js +1 -1
  23. package/src/common/composables/use-planner-actions-visibility.d.ts +4 -0
  24. package/src/common/store/common-ui-store.d.ts +4 -1
  25. package/src/common/utils/root-tags.d.ts +6 -0
  26. package/src/configurator/business-logic/sdk-connector.d.ts +1 -0
  27. package/src/configurator/embedding/exposed-api.d.ts +5 -0
  28. package/src/planner/components/overlays/product-settings/ProductRangeControl.vue.d.ts +4 -1
@@ -1,6 +1,35 @@
1
- ## [5.29.0-alpha.4](https://github.com/roomle-dev/roomle-ui/compare/embedding-lib-v5.29.0-alpha.3...embedding-lib-v5.29.0-alpha.4) (2025-10-02)
1
+ ## [5.30.0-alpha.1](https://github.com/roomle-dev/roomle-ui/compare/embedding-lib-v5.29.0...embedding-lib-v5.30.0-alpha.1) (2025-10-08)
2
2
 
3
3
 
4
4
  ### Features
5
5
 
6
- * **core:** upgrade to version 2.61.0-alpha.8 ([03f3711](https://github.com/roomle-dev/roomle-ui/commit/03f37119298db55275bdd69e0e22534e6f7cfbbb))
6
+ * core api - PlanModelViewHelper.getObjectGeometryHelpLines ([d50c692](https://github.com/roomle-dev/roomle-ui/commit/d50c69250c139dcfb1d9d469109b02ae6f359183))
7
+ * core api - PlanObjectComponent properties ([4936555](https://github.com/roomle-dev/roomle-ui/commit/493655574ef91136049daa9b5db960018ac89663))
8
+ * created onPlaceOrder and onFetchPrice HI callbacks ([4b48864](https://github.com/roomle-dev/roomle-ui/commit/4b48864a4dc71bb9ce14254857caace4a87ebf33))
9
+ * hi core api 'providePossibleChildren' ([a1d96c6](https://github.com/roomle-dev/roomle-ui/commit/a1d96c673b1ec7204cab88eb55e3fc4d16f92f13))
10
+ * HI example debug logging ([605e63b](https://github.com/roomle-dev/roomle-ui/commit/605e63b344f34d7f35d67cca357b2e1511e61a45))
11
+ * initial working implementation ([07ba92c](https://github.com/roomle-dev/roomle-ui/commit/07ba92c20a3a0886afb5abaafdcd24b954e0fd5d))
12
+ * reselect object if object mode changes when clicking on the object ([03b1ea4](https://github.com/roomle-dev/roomle-ui/commit/03b1ea4eb6c7f0f2a1a0eb2c6d1bd85230820a01))
13
+ * **core:** upgrade to version 2.61.0 ([8468dff](https://github.com/roomle-dev/roomle-ui/commit/8468dff9ae43a224dd563bc53e36543b79211391))
14
+ * **core:** upgrade to version 2.62.0-alpha.1 ([e62b7f2](https://github.com/roomle-dev/roomle-ui/commit/e62b7f278ba0cd72e97b3a0de8ad47ac04fa860a))
15
+ * **core:** upgrade to version 2.62.0-alpha.2 ([e679883](https://github.com/roomle-dev/roomle-ui/commit/e6798835befcce2e9f8b1749275d1b62aff5d621))
16
+ * **core:** upgrade to version 2.62.0-alpha.4 ([788fc83](https://github.com/roomle-dev/roomle-ui/commit/788fc831445b3050b5188f8fa0100d36e377b30d))
17
+ * **core:** upgrade to version 2.62.0-alpha.5 ([c2ee7d8](https://github.com/roomle-dev/roomle-ui/commit/c2ee7d8b48e9ecfa7074d4ec88aa4678da209b51))
18
+ * upgrade to version 2.62.0-alpha.6 ([5383e89](https://github.com/roomle-dev/roomle-ui/commit/5383e89a1382f8e9599afc920914124d6a85fead))
19
+
20
+
21
+ ### Bug Fixes
22
+
23
+ * add library id back to HI callbacks ([ea30779](https://github.com/roomle-dev/roomle-ui/commit/ea3077936ef79ee737b551842441358e0365db6d))
24
+ * article ID is the fallback label for catalog item ([a5449f0](https://github.com/roomle-dev/roomle-ui/commit/a5449f069485cfb29c07231b11a868cf2c14c9cd))
25
+ * catch hi callback exceptions ([f650511](https://github.com/roomle-dev/roomle-ui/commit/f650511d2c8fb82a545ccfa6fb5800b03b843516))
26
+ * consider that root module is moved to a new group on undock ([c293ba8](https://github.com/roomle-dev/roomle-ui/commit/c293ba87b9652ee363d98b772fe8640a5cd6f175))
27
+ * consider that the object may be merged on drag-end ([b033cbd](https://github.com/roomle-dev/roomle-ui/commit/b033cbd977513cca7d918e5a98d417770e01a484))
28
+ * drag-in hi objects by id instead of serialize json ([60df0bd](https://github.com/roomle-dev/roomle-ui/commit/60df0bd3e3fc07c14f9a5aebed4f06895cc6f93e))
29
+ * only unmerge objects if advanced docking is enabled ([2679668](https://github.com/roomle-dev/roomle-ui/commit/2679668d803351a04281ac1d7860864e9d950ae4))
30
+ * planner external object selection callback ([e631da9](https://github.com/roomle-dev/roomle-ui/commit/e631da99153e1bba809376989af7ea73970956a2))
31
+ * remove unused imports ([da6645c](https://github.com/roomle-dev/roomle-ui/commit/da6645c6c1a305341d1d875debbf135f62bd7134))
32
+ * remove unused params ([e22e84e](https://github.com/roomle-dev/roomle-ui/commit/e22e84e54861ca9bc37645db09a9f80aeb63859d))
33
+ * reset scroll on select catalog item and remove wrong icon and unneeded dark mode ([7e2339d](https://github.com/roomle-dev/roomle-ui/commit/7e2339d58d6d4c8487cec03ac1beeddbe681b433))
34
+ * type errors ([a64197f](https://github.com/roomle-dev/roomle-ui/commit/a64197f8a1f7af9003e5b9124ba0467355b6a9a1))
35
+ * update outdated version for playwright docker image since we update our playwright version ([58eafba](https://github.com/roomle-dev/roomle-ui/commit/58eafba6d6ae8f294288fd8175a3bf47ba672c2a))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roomle/embedding-lib",
3
- "version": "5.29.0-alpha.4",
3
+ "version": "5.30.0-alpha.1",
4
4
  "description": "This is a small library which can be used to communicate with the Roomle Configurator",
5
5
  "type": "module",
6
6
  "main": "./roomle-embedding-lib.umd.js",
@@ -36,6 +36,20 @@ export interface HiCallbacks {
36
36
  * @param groupData The ID of the group which was deleted.
37
37
  */
38
38
  onPosGroupDeleted?: (posGroupIds: string[]) => Promise<void>;
39
+ /**
40
+ * "onLogMessage" is invoked when the Homag Intelligence library wants to log a message.
41
+ * You can use this to log messages in your own UI.
42
+ * @param area
43
+ * @param message
44
+ */
45
+ onLogMessage?: (area: string, message: string) => void;
46
+ onFetchPrice?: (orderData: any) => Promise<any>;
47
+ /**
48
+ * "onPlaceOrder" is invoked when the user wants to place an order.
49
+ * You can use this to send the order data to Order Manager or to a 3rd party service.
50
+ * @param orderData
51
+ */
52
+ onPlaceOrder?: (orderData: any) => Promise<void>;
39
53
  }
40
54
  export type AvailablePlugins = {
41
55
  [K in keyof PluginMap]?: InstanceType<PluginMap[K]>;
@@ -0,0 +1,14 @@
1
+ import { Example } from '../example';
2
+ import { RoomDesignerApiType } from './utils/homag-intelligence/overlay';
3
+
4
+ export default class DragInExample implements Example {
5
+ private _abortController;
6
+ private _roomDesignerApi;
7
+ setupHtml(parent: HTMLElement): Promise<void>;
8
+ closeExample(): Promise<void>;
9
+ private start;
10
+ loadHiCatalogAsync(roomDesignerApi: RoomDesignerApiType): Promise<void>;
11
+ onRequestPlan(roomDesignerApi: RoomDesignerApiType): Promise<void>;
12
+ doPriceCalculation(roomDesignerApi: RoomDesignerApiType): Promise<void>;
13
+ runExample(): Promise<void>;
14
+ }
@@ -1,5 +1,6 @@
1
1
  export declare const fetchJSONData: (url: string) => Promise<any>;
2
2
  export declare const fetchDataWithAuthorization: (url: string, type: string, property: string) => Promise<Response>;
3
+ export declare const logInUi: (area: string, message: string, args?: (string | null)[]) => void;
3
4
  export declare const logMessage: (message: string, ...args: (string | null)[]) => void;
4
5
  export declare const logApiCall: (message: string) => void;
5
6
  export declare const logApiCallback: (message: string, ...args: (string | null)[]) => void;
@@ -19,7 +19,10 @@ export declare class RoomDesignerApi implements RoomDesignerRequests {
19
19
  deleteRootModule(rootModuleId: string): void;
20
20
  getPosDataOfAllGroups(): Promise<PosGroup[]>;
21
21
  getRoomInformation(): Promise<import('../../planner-core/src/external-object-api').ExternalRoomInformation>;
22
- generatePlanSnapshot(): Promise<void>;
22
+ generatePlanSnapshot(): Promise<{
23
+ objectId: string;
24
+ planId: string;
25
+ }>;
23
26
  saveExternalObjectSnapshot(): Promise<import('../../typings/rapi-types').RapiPlanSnapshotGetDataWith3dUrls>;
24
27
  saveCurrentPlanSnapshot(): Promise<import('../../typings/rapi-types').RapiPlanSnapshotGetData>;
25
28
  renderPosDataImage(posDataJson: object): Promise<void>;
@@ -0,0 +1,54 @@
1
+ import { HiCallbacks } from '../../../../embedding-lib/src/embedding-lib';
2
+ import { GlueLogic, RoomDesignerRequests } from './emulator';
3
+ import { ExternalObjectGroup } from 'roomle-core-hsc/src/embind/plannerCoreInterface';
4
+ import { ExternalModuleInformation } from '../../typings/kernel';
5
+ import { PosGroup } from './model/oc-scripts-domain.model';
6
+ import { ExternalObjectModuleIdMap } from './api';
7
+
8
+ export declare class GlueLayerRequestDebugLogging implements GlueLogic {
9
+ private _glueLogic;
10
+ private _hiCallbacks;
11
+ constructor(glueLogic: GlueLogic, hiCallbacks: HiCallbacks);
12
+ get hiCallbacks(): HiCallbacks | null;
13
+ private _logRequest;
14
+ loadPosData(articleCatalogJson: any, libraryId: string): void;
15
+ mergeGroups(targetGroup: ExternalObjectGroup, idsOfGroupsMerged: string | string[], idOfTargetRootModule: string): void;
16
+ deleteRootModule(remainingGroup: ExternalObjectGroup, rootModuleIdToDelete: string, splitOffGroups: ExternalObjectGroup[]): void;
17
+ splitRootModuleFromGroup(splitGroup: ExternalObjectGroup, newGroupedRootModules: ExternalObjectGroup[]): void;
18
+ duplicateGroup(sourceGroupId: string, duplicatedGroup: ExternalObjectGroup): void;
19
+ modifyAttribute(groupId: string, moduleIdObjects: ExternalModuleInformation[], attributeName: string, value: string): void;
20
+ updateAttribute(rootModuleId: string, moduleId: string, attributeId: string, attributeValue: string | boolean): void;
21
+ swapRootModule(groupId: string, rootModuleId: string, articleId: string): void;
22
+ arrangeRootModulesOfGroup(changedGroup: ExternalObjectGroup): void;
23
+ changedGroupPlanningSituation(changedGroup: ExternalObjectGroup): void;
24
+ deleteGroup(groupId: string): Promise<void>;
25
+ changedGroup(posDataJson: PosGroup): void;
26
+ loadedGroup(posDataJson: PosGroup): void;
27
+ removedGroup(groupId: string): void;
28
+ openCloseGroup(groupId: string): void;
29
+ newPosDataFromId(id: string): PosGroup | undefined;
30
+ getGroupDataForOrder(roomlePlannerId?: string): Promise<any>;
31
+ savePlanSnapshot(): Promise<any>;
32
+ }
33
+ export declare class GlueLayerResponseDebugLogging implements RoomDesignerRequests {
34
+ private _roomDesignerRequests;
35
+ private _hiCallbacks;
36
+ constructor(roomDesignerRequests: RoomDesignerRequests, hiCallbacks: HiCallbacks);
37
+ private _logResponse;
38
+ loadMasterData(masterData: any): void;
39
+ loadPosGroups(posDataJson: PosGroup | PosGroup[], findFreeSpaceInPlan: boolean, verifyArrangement: boolean, mergedGroups?: string[], respondWithPositionInPlan?: boolean, moduleIdMap?: ExternalObjectModuleIdMap[]): Promise<void>;
40
+ selectGroup(groupId: string): Promise<void>;
41
+ selectRoot(rootModuleId: string): Promise<void>;
42
+ selectModule(rootModuleId: string, subModuleId: string): Promise<void>;
43
+ openCloseGroup(groupOrRootModuleId: string, subModuleId: string | null, open: boolean, animate: boolean): Promise<void>;
44
+ deleteGroup(groupId: string, wasMerged?: boolean): void;
45
+ deleteRootModule(rootModuleId: string): void;
46
+ getPosDataOfAllGroups(): Promise<PosGroup[]>;
47
+ getRoomInformation(): Promise<any>;
48
+ generatePlanSnapshot(): Promise<{
49
+ objectId: string;
50
+ planId: string;
51
+ }>;
52
+ saveExternalObjectSnapshot(): Promise<any>;
53
+ saveCurrentPlanSnapshot(): Promise<any>;
54
+ }
@@ -1,6 +1,6 @@
1
+ import { HiCallbacks } from '../../../../embedding-lib/src/embedding-lib';
1
2
  import { ExternalModuleInformation, ExternalObjectGroup } from './callbacks';
2
3
  import { MasterData, PosModuleAttribute, PosGroup, PosModuleData, PosModuleRootData } from './model/oc-scripts-domain.model';
3
- import { HiCallbacks } from '../../../../embedding-lib/src/embedding-lib';
4
4
  import { ExternalObjectModuleIdMap } from './api';
5
5
 
6
6
  export interface LibraryData {
@@ -23,12 +23,16 @@ export interface RoomDesignerRequests {
23
23
  deleteRootModule(rootModuleId: string): void;
24
24
  getPosDataOfAllGroups(): Promise<PosGroup[]>;
25
25
  getRoomInformation(): Promise<any>;
26
- generatePlanSnapshot(): Promise<void>;
26
+ generatePlanSnapshot(): Promise<{
27
+ objectId: string;
28
+ planId: string;
29
+ }>;
27
30
  saveExternalObjectSnapshot(): Promise<any>;
28
31
  saveCurrentPlanSnapshot(): Promise<any>;
29
32
  }
30
33
  export interface GlueLogic {
31
- hiCallbacks?: HiCallbacks;
34
+ hiCallbacks: HiCallbacks | null;
35
+ loadPosData(articleCatalogJson: any, libraryId: string): void;
32
36
  mergeGroups(targetGroup: ExternalObjectGroup, idsOfGroupsMerged: string | string[], idOfTargetRootModule: string): void;
33
37
  deleteRootModule(remainingGroup: ExternalObjectGroup, rootModuleIdToDelete: string, splitOffGroups: ExternalObjectGroup[]): void;
34
38
  splitRootModuleFromGroup(splitGroup: ExternalObjectGroup, newGroupedRootModules: ExternalObjectGroup[]): void;
@@ -47,7 +51,7 @@ export interface GlueLogic {
47
51
  getGroupDataForOrder(roomlePlannerId?: string): Promise<any>;
48
52
  savePlanSnapshot(): Promise<PlanSnapshot>;
49
53
  }
50
- interface PlanSnapshot {
54
+ export interface PlanSnapshot {
51
55
  id: string;
52
56
  perspectiveImageLink: string;
53
57
  topImageLink: string;
@@ -65,8 +69,8 @@ export declare class Emulator implements GlueLogic {
65
69
  private _groupMap;
66
70
  private _nextPosDataId;
67
71
  private _hiCallbacks;
68
- constructor(designerRequests: RoomDesignerRequests, libraryData: LibraryData);
69
- set hiCallbacks(value: HiCallbacks | null);
72
+ constructor(designerRequests: RoomDesignerRequests, libraryData: LibraryData, hiCallbacks?: HiCallbacks | null);
73
+ get hiCallbacks(): HiCallbacks | null;
70
74
  getLibraryData(libraryId: string): LibraryData | null;
71
75
  addLibrary(libraryData: LibraryData): void;
72
76
  loadPosData(articleCatalogJson: any, libraryId: string): void;
@@ -1,10 +1,10 @@
1
- import { Emulator } from './emulator';
1
+ import { GlueLogic } from './emulator';
2
2
  import { Context } from '../../common-core/src/di/context';
3
3
 
4
4
  export declare const FAKE_ROOT_TAG = "external:root-tag";
5
5
  export declare class HiTagCatalogCallbacks implements Context {
6
6
  _creator_: string;
7
- private _emulator;
7
+ private _glueLogic;
8
8
  private _articlesPromise;
9
9
  private _externalItems;
10
10
  private _externalConfigurations;
@@ -12,7 +12,7 @@ export declare class HiTagCatalogCallbacks implements Context {
12
12
  private _globalCallback;
13
13
  private _configuratorViewModel;
14
14
  constructor(creator: string, articles: Promise<any>);
15
- setEmulator(emulator: Emulator): void;
15
+ setEmulator(glueLogic: GlueLogic): void;
16
16
  private _init;
17
17
  private _onCheckExternalCache;
18
18
  private _onFetchExternalData;
@@ -1,6 +1,6 @@
1
1
  import { RmlPlugin } from './rml-plugin';
2
2
  import { GlueLogic } from './emulator';
3
- import { ApiOptions } from './loader';
3
+ import { HomagIntelligenceInitData } from './loader';
4
4
  import { MasterData } from './model/oc-scripts-domain.model';
5
5
  import { default as RoomlePlanner } from '../../planner-core/src/roomle-planner';
6
6
  import { ExternalConfiguration, ExternalItem } from '../../typings/external-objects';
@@ -12,7 +12,6 @@ declare global {
12
12
  uuidv4: () => string;
13
13
  }
14
14
  }
15
- export declare const HOMAG_INTELLIGENCE_ENDPOINT = "https://europe-west3-rml-showcases.cloudfunctions.net/proxy_request?url=";
16
15
  export type ExternalObjects = Map<string, {
17
16
  id: string;
18
17
  label: string;
@@ -24,21 +23,21 @@ export declare class HomagIntelligence extends RmlPlugin {
24
23
  private _roomlePlanner;
25
24
  private _api;
26
25
  private _masterData;
27
- private _emulator;
26
+ private _glueLogic;
28
27
  private _articles;
29
28
  private _scriptLoaded;
30
29
  private _hiLibraryLoaded;
31
30
  private _orders;
32
31
  constructor();
33
- loadHiLibrary(hiCallbacks: HiCallbacks, libraryId: string): Promise<{
32
+ loadHiLibrary(libraryId: string, hiCallbacks: HiCallbacks): Promise<{
34
33
  articles: any;
35
34
  masterData: MasterData;
36
35
  calcScriptLoaded: boolean;
37
36
  }>;
38
- init(articles: any, catalogCallbacks: HiTagCatalogCallbacks, roomlePlanner: RoomlePlanner, libraryId: string, apiOptions: ApiOptions, hiCallbacks: HiCallbacks): Promise<this>;
37
+ init(articles: any, catalogCallbacks: HiTagCatalogCallbacks, roomlePlanner: RoomlePlanner, hiOptions: HomagIntelligenceInitData, hiCallbacks: HiCallbacks): Promise<this>;
39
38
  private _loadMasterData;
40
39
  private _initCalcScript;
41
40
  getGlueLogic(): GlueLogic;
42
- sendToOM(withPrice?: boolean): Promise<void>;
41
+ placeOrder(): Promise<void>;
43
42
  fetchPrice(planId?: string): Promise<any>;
44
43
  }
@@ -2,7 +2,8 @@ import { MasterData } from './model/oc-scripts-domain.model';
2
2
 
3
3
  export interface HomagIntelligenceInitData {
4
4
  libraryId: string;
5
- serverOptions: ApiOptions;
5
+ serverOptions?: ApiOptions;
6
+ debugLogging?: boolean;
6
7
  }
7
8
  export interface OrderManagerOptions {
8
9
  key?: string;
@@ -17,6 +18,17 @@ export interface ApiOptions {
17
18
  export declare const fetchDataWithAuthorization: (url: string, type: 'json' | 'text', apiOptions: ApiOptions, debug?: {
18
19
  property: string;
19
20
  }) => Promise<Response>;
20
- export declare const loadArticleCatalog: (libraryId: string, apiOptions: ApiOptions) => Promise<any>;
21
- export declare const loadMasterData: (libraryId: string, apiOptions: ApiOptions) => Promise<MasterData>;
22
- export declare const loadCalcScript: (libraryId: string, apiOptions: ApiOptions) => Promise<string>;
21
+ export declare const loadArticleCatalog: (apiOptions: HomagIntelligenceInitData) => Promise<any>;
22
+ export declare const loadMasterData: (apiOptions: HomagIntelligenceInitData) => Promise<MasterData>;
23
+ export declare const loadCalcScript: (apiOptions: HomagIntelligenceInitData) => Promise<string>;
24
+ export declare const getRequestSettings: (apiOptions: ApiOptions) => {
25
+ subscriptionId: string;
26
+ headers: {
27
+ headers: {
28
+ 'Content-Type': string;
29
+ };
30
+ };
31
+ key: string;
32
+ importBaseUrl: string;
33
+ };
34
+ export declare const omRequest: (apiOptions: ApiOptions, body: any, url: string, debugStr?: string, extraHeaders?: {}) => Promise<any>;
@@ -1,6 +1,5 @@
1
1
  import { default as RoomlePlanner } from '../../planner-core/src/roomle-planner';
2
2
  import { GlueLogic } from './emulator';
3
- import { ApiOptions } from './loader';
4
3
 
5
4
  export declare const createEmptyOrder: () => {
6
5
  id: any;
@@ -27,13 +26,10 @@ export declare const createEmptyOrder: () => {
27
26
  changedBy: string;
28
27
  items: any[];
29
28
  };
30
- export declare const sendToOM: (apiOptions: ApiOptions, roomlePlanner: RoomlePlanner, gluLogic: GlueLogic, withPrice?: boolean) => Promise<void>;
31
- export declare const fetchPrice: (apiOptions: ApiOptions, gluLogic: GlueLogic, planId?: string, useExtraHeaders?: boolean) => Promise<any>;
32
29
  export default class Orders {
33
30
  private _roomlePlanner;
34
- private _gluLogic;
35
- private _apiOptions;
36
- constructor(roomlePlanner: RoomlePlanner, gluLogic: GlueLogic, apiOptions: ApiOptions);
37
- sendToOM(withPrice?: boolean): Promise<void>;
31
+ private _glueLogic;
32
+ constructor(roomlePlanner: RoomlePlanner, glueLogic: GlueLogic);
33
+ placeOrder(): Promise<void>;
38
34
  fetchPrice(planId?: string): Promise<any>;
39
35
  }
@@ -25,9 +25,9 @@ export interface ExternalObjectDebugConfiguration {
25
25
  createDebugGeometry?: boolean;
26
26
  }
27
27
  export interface ExternalObjectApiConfiguration {
28
- legacyApi?: boolean;
29
28
  loadExternalObjectsFromPlan?: boolean;
30
29
  enableArrangementCorrection?: boolean;
30
+ providePossibleChildren?: boolean;
31
31
  uiConfiguration?: ExternalObjectUiConfiguration;
32
32
  materialConfiguration?: ExternalObjectMaterialConfiguration;
33
33
  debugConfiguration?: ExternalObjectDebugConfiguration;
@@ -29,6 +29,7 @@ import { Nullable } from '../../typings/helper';
29
29
  import { MaybePromise } from '../../common-core/src/utils/common-utils';
30
30
  import { HomagIntelligence } from '../../homag-intelligence/src/homag-intelligence';
31
31
  import { RoomleLightSource } from '../../common-core/src/light/light-source';
32
+ import { HomagIntelligenceInitData } from '../../homag-intelligence/src/loader';
32
33
 
33
34
  export type ID_TYPE = 'rml_id' | 'tc_id' | 'rml_serialized' | 'tc_serialized';
34
35
  export declare const EXT_OBJ_EXCEPTION = "Could not retrieve configuration for external object! Did you implement onGetConfigurationForExternalObject?";
@@ -437,6 +438,7 @@ export default class RoomlePlanner<P extends readonly PluginName[] = readonly []
437
438
  private _loadExternalObjectGroup;
438
439
  private _loadExternalObjectGroupInConfigurator;
439
440
  private _loadExternalObjectGroupInPlanner;
441
+ private _updateExternalObjectRootModuleSelection;
440
442
  private _loadOrUpdateExternalObjectGroup;
441
443
  updateExternalObjectGroupAttribute(rootModuleId: string, moduleId: string, attributeId: string, attributeValue: string | boolean): void;
442
444
  private _createSerializedGroupCollection;
@@ -549,8 +551,14 @@ export default class RoomlePlanner<P extends readonly PluginName[] = readonly []
549
551
  redo(): Promise<void>;
550
552
  setHomagIntelligence(homagIntelligence: HomagIntelligence): void;
551
553
  newPosDataFromId(id: string): import('../../homag-intelligence/src/model/oc-scripts-domain.model').PosGroup;
552
- sendToOM(withPrice?: boolean): Promise<void>;
554
+ /**
555
+ * deprecated, use placeOrder() instead
556
+ */
557
+ sendToOM(): Promise<void>;
558
+ placeOrder(): Promise<void>;
553
559
  fetchPrice(planId?: string): Promise<any>;
554
560
  getOrderManagerGroupData(planId?: string): Promise<any>;
555
561
  getRapiAccess(): RapiAccess;
562
+ canElementBeDeleted(planElement: PlanElementViewModel): boolean;
563
+ setupHomagIntelligence(hi: HomagIntelligenceInitData): Promise<void>;
556
564
  }
@@ -25,7 +25,7 @@ export declare class PlannerSelectionHandlerEvent {
25
25
  export default class PlannerSelectionHandler extends EventDispatcher<PlannerSelectionHandlerEvent> {
26
26
  private _selectionMode;
27
27
  protected _selectedPlanElementViewModels: Map<number, PlanElementViewModel>;
28
- check(planElementViewModel: PlanElementViewModel): void;
28
+ check(planElementViewModel: PlanElementViewModel, objectModeChanged?: boolean): void;
29
29
  removeSelection(): void;
30
30
  cancelSelection(reason: CancelSelectionReasons): void;
31
31
  private _checkStandard;
@@ -216,11 +216,11 @@ export default class PlannerSceneManager extends ConfiguratorSceneManager implem
216
216
  protected setEventHandlerObject(object: Object3D): void;
217
217
  protected _readyForRender(): void;
218
218
  protected notifyPlannerOnComponentSelectionCancel(isExtObj: boolean, reason: CancelSelectionReasons): void;
219
- private _planObjectSelectionChanged;
219
+ private _externalPlanObjectSelectionChanged;
220
220
  highlightExternalObject(planObjectComponent: KernelPlanObjectComponent): void;
221
221
  private _selectExternalObjectModule;
222
222
  getObjectComponent(id: number, typeOfId: Enumify<typeof CORE_TYPE_OF_CORE_ID>): KernelPlanObjectComponent;
223
- getExternalObjectComponent(groupId: string, moduleId: string): KernelPlanObjectComponent;
223
+ getExternalObjectComponent(groupOrRootModuleId: string, subModuleId: string): KernelPlanObjectComponent;
224
224
  getCameraParameters3d(): NonNullable<CameraParameter>;
225
225
  private _createCeilingLightGroup;
226
226
  toggleInteriorLightsSceneSettings(on: boolean): void;
@@ -264,6 +264,9 @@ export interface KernelPlanObjectComponent extends KernelPlanObjectBase {
264
264
  externalObjectGroupId: string;
265
265
  externalRootModuleId: string;
266
266
  externalSubModuleId: string;
267
+ isAGeneratedModule: boolean;
268
+ canBeDeleted: boolean;
269
+ animations?: KernelAnimation[];
267
270
  }
268
271
  export interface UiPlanObject extends KernelPlanObject {
269
272
  data: RapiItem | RapiConfiguration | null;
@@ -319,6 +319,20 @@ declare class RoomGeometryArray extends EmsArray<PosContour> {
319
319
  export interface RoomInformation {
320
320
  rooms: RoomGeometryArray;
321
321
  }
322
+ export declare const CORE_HELP_LINE_TYPE: {
323
+ readonly WALL_SNAP_LEVEL: 0;
324
+ readonly WALL_SNAP_LEVEL_SNAPPED: 1;
325
+ };
326
+ export interface HelpLineType {
327
+ value: Enumify<typeof CORE_HELP_LINE_TYPE>;
328
+ }
329
+ export interface GeometryHelpLine {
330
+ end: KernelVector3f;
331
+ start: KernelVector3f;
332
+ type: HelpLineType;
333
+ }
334
+ declare class GeometryHelpLineArray extends EmsArray<GeometryHelpLine> {
335
+ }
322
336
  export interface PlanModelViewHelper {
323
337
  getPlanOverview(planObject: KernelObject): PlanOverview;
324
338
  getPlanObject(plan: Plan, aRuntimeId: number): KernelPlanObject;
@@ -330,6 +344,7 @@ export interface PlanModelViewHelper {
330
344
  getExternalObjectGroups(plan: Plan): KernelObjectConfigurationArray;
331
345
  getExternalRoomInformation(plan: Plan): RoomInformation;
332
346
  calculateLightSourceDistribution(plan: Plan, lightSourceConfiguration: LightSourceConfiguration): RoomLightSourceDistributionArray;
347
+ getObjectGeometryHelpLines(anObject: PlanObject): GeometryHelpLineArray;
333
348
  }
334
349
  export interface PlanNode extends KernelObject {
335
350
  getMaxWallHeight(): number;
@@ -112,7 +112,7 @@ const W = Symbol("Comlink.proxy"), X = Symbol("Comlink.endpoint"), j = Symbol("C
112
112
  canHandle: (e) => G(e) && e[W],
113
113
  serialize(e) {
114
114
  const { port1: t, port2: s } = new MessageChannel();
115
- return L(e, t), [s, [s]];
115
+ return P(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 L(e, t = globalThis, s = ["*"]) {
146
+ function P(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 L(e, t = globalThis, s = ["*"]) {
174
174
  case "ENDPOINT":
175
175
  {
176
176
  const { port1: d, port2: h } = new MessageChannel();
177
- L(e, h), l = ae(d, [d]);
177
+ P(e, h), l = ae(d, [d]);
178
178
  }
179
179
  break;
180
180
  case "RELEASE":
@@ -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 T = ".", A = {
353
+ const T = ".", R = {
354
354
  REQUEST_BOOT: "requestBoot",
355
355
  SETUP: "setup",
356
356
  WEBSITE_READY: "websiteReady"
@@ -417,11 +417,11 @@ const T = ".", A = {
417
417
  return "en";
418
418
  }, pe = (e, t) => {
419
419
  const s = JSON.parse(JSON.stringify(e));
420
- return P(s, t);
421
- }, P = (e, t) => {
420
+ return L(s, t);
421
+ }, L = (e, t) => {
422
422
  for (const s in t)
423
423
  try {
424
- t[s].constructor === Object ? e[s] = P(e[s], t[s]) : e[s] = t[s];
424
+ t[s].constructor === Object ? e[s] = L(e[s], t[s]) : e[s] = t[s];
425
425
  } catch {
426
426
  e[s] = t[s];
427
427
  }
@@ -479,10 +479,10 @@ const _e = (e) => JSON.parse(JSON.stringify(e)), Ee = {
479
479
  e.locale || (e.locale = me()), e.id === we && delete e.id;
480
480
  const t = fe();
481
481
  return t && he(t) && (e.configuratorId = "demoConfigurator"), e.customApiUrl = void 0, e.emails = !1, e;
482
- }, Me = "<CONF_ID>", Te = "#CONFIGURATIONID#", Ae = (e) => {
482
+ }, Me = "<CONF_ID>", Te = "#CONFIGURATIONID#", Re = (e) => {
483
483
  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);
484
- }, D = () => /(android)/i.test(navigator.userAgent);
485
- class x {
484
+ }, x = () => /(android)/i.test(navigator.userAgent);
485
+ class D {
486
486
  _messageHandler = null;
487
487
  isSetupDone = !1;
488
488
  viewName = "main";
@@ -601,15 +601,34 @@ const k = () => {
601
601
  () => e.style.setProperty(N, q()),
602
602
  0
603
603
  );
604
- }, B = "rml-styles", Re = 450, N = "--rml-full-height", f = {
604
+ }, B = "rml-styles", Ae = 450, N = "--rml-full-height", f = {
605
605
  CONTAINER: "rml-container",
606
606
  FILL: "rml-fill",
607
607
  POSITION: "rml-pos",
608
608
  TRANSITION: "rml-transition",
609
609
  ANDROID_HEIGHT: "rml-android-height",
610
610
  OVERFLOW_HIDDEN: "rml-overflow-hidden"
611
- }, R = /* @__PURE__ */ new Map();
612
- class be extends x {
611
+ }, A = /* @__PURE__ */ new Map(), be = (e) => {
612
+ const t = {
613
+ /**
614
+ * The 'get' trap is fired when a property is accessed on the proxy.
615
+ * @param target The original object.
616
+ * @param prop The name of the property being accessed.
617
+ * @param receiver The proxy or an object that inherits from it.
618
+ */
619
+ get(s, r, n) {
620
+ const o = Reflect.get(s, r, n);
621
+ return o !== void 0 ? o : (console.warn(
622
+ `[Homag Intelligence Callbacks] Method '${String(
623
+ r
624
+ )}' is not implemented. Executing a no-op.`
625
+ ), (...a) => {
626
+ });
627
+ }
628
+ };
629
+ return new Proxy(e, t);
630
+ };
631
+ class Ie extends D {
613
632
  static createPlanner(t, s, r, n = []) {
614
633
  return this._create(
615
634
  t,
@@ -619,7 +638,7 @@ class be extends x {
619
638
  );
620
639
  }
621
640
  static async connect(t, s = []) {
622
- const r = new x();
641
+ const r = new D();
623
642
  r.viewName = t;
624
643
  const { resolve: n, promise: o } = k(), { resolve: a, promise: i } = k(), c = ({
625
644
  message: g,
@@ -700,18 +719,18 @@ class be extends x {
700
719
  window.addEventListener("message", (s) => {
701
720
  if (s.data.type === "connect_hi" && s.data.port) {
702
721
  const r = s.data.port;
703
- r.start?.(), L(t, r);
722
+ r.start?.(), P(be(t), r);
704
723
  }
705
724
  });
706
725
  }
707
726
  static async _create(t, s, r, n) {
708
727
  return new Promise(async (o, a) => {
709
728
  try {
710
- const i = P(
729
+ const i = L(
711
730
  Se(),
712
731
  ye(r)
713
732
  );
714
- Ae(i);
733
+ Re(i);
715
734
  const c = await ue(
716
735
  t,
717
736
  i
@@ -740,12 +759,12 @@ class be extends x {
740
759
  throw new Error(
741
760
  "Please provide a correct configuratorId, you get the correct ID from your Roomle Contact Person"
742
761
  );
743
- if (R.has(s))
762
+ if (A.has(s))
744
763
  throw new Error("There is already an instance on this DOM element");
745
764
  if (!!!document.getElementById(B)) {
746
765
  const l = r.zIndex || 9999999, u = document.createElement("style");
747
766
  u.type = "text/css", u.id = B;
748
- const g = "transition:all ease-in-out " + Re + "ms;", d = ["-webkit-", "-o-"].reduce(
767
+ const g = "transition:all ease-in-out " + Ae + "ms;", d = ["-webkit-", "-o-"].reduce(
749
768
  (K, Q) => K += Q + g,
750
769
  ""
751
770
  ) + g, h = q();
@@ -765,12 +784,12 @@ class be extends x {
765
784
  null,
766
785
  this._executeMessage
767
786
  );
768
- this.setMessageHandler(i), this._onResize = this._onResize.bind(this), D() && window.addEventListener("resize", this._onResize), this._container = s, this._initData = r, this._configuratorSettings = t;
787
+ this.setMessageHandler(i), this._onResize = this._onResize.bind(this), x() && window.addEventListener("resize", this._onResize), this._container = s, this._initData = r, this._configuratorSettings = t;
769
788
  const c = this._createIframe();
770
- this._onUseFullPage = this._onUseFullPage.bind(this), this._onBackToWebsite = this._onBackToWebsite.bind(this), this._waitForIframe = o, this._container.appendChild(c), this._iframe = c, this.setupPlugins(n, this._iframe), R.set(s, !0);
789
+ this._onUseFullPage = this._onUseFullPage.bind(this), this._onBackToWebsite = this._onBackToWebsite.bind(this), this._waitForIframe = o, this._container.appendChild(c), this._iframe = c, this.setupPlugins(n, this._iframe), A.set(s, !0);
771
790
  }
772
791
  teardown() {
773
- this._container && R.delete(this._container);
792
+ this._container && A.delete(this._container);
774
793
  const t = this._container.querySelector("iframe");
775
794
  t && this._container.removeChild(t), window.removeEventListener("resize", this._onResize);
776
795
  }
@@ -783,14 +802,14 @@ class be extends x {
783
802
  U(this._iframe);
784
803
  }
785
804
  _onUseFullPage() {
786
- this._iframe.classList.add(f.POSITION), document.documentElement.classList.add(f.OVERFLOW_HIDDEN), window.document.body.classList.add(f.OVERFLOW_HIDDEN), D() && (U(this._iframe), this._iframe.classList.add(f.ANDROID_HEIGHT));
805
+ this._iframe.classList.add(f.POSITION), document.documentElement.classList.add(f.OVERFLOW_HIDDEN), window.document.body.classList.add(f.OVERFLOW_HIDDEN), x() && (U(this._iframe), this._iframe.classList.add(f.ANDROID_HEIGHT));
787
806
  }
788
807
  _onBackToWebsite() {
789
808
  this._iframe.classList.remove(f.POSITION), this._iframe.classList.remove(f.ANDROID_HEIGHT), document.documentElement.classList.remove(f.OVERFLOW_HIDDEN), window.document.body.classList.remove(f.OVERFLOW_HIDDEN);
790
809
  }
791
810
  _executeMessage({ message: t, args: s }, r) {
792
811
  if (r.source && r.source === this._iframe?.contentWindow)
793
- 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(
812
+ return t === R.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 === R.SETUP ? (this.handleSetup(s[0]), F(
794
813
  this.ui.callbacks,
795
814
  "onUseFullPage",
796
815
  this._onUseFullPage
@@ -803,10 +822,10 @@ class be extends x {
803
822
  console.error("MessageHandler not set");
804
823
  return;
805
824
  }
806
- this._messageHandler.sendMessage(A.WEBSITE_READY);
825
+ this._messageHandler.sendMessage(R.WEBSITE_READY);
807
826
  }, 0), Promise.resolve({ result: null })) : this.executeMessage({ message: t, args: s });
808
827
  }
809
828
  }
810
829
  export {
811
- be as default
830
+ Ie as default
812
831
  };
@@ -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 P={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},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)}},L=()=>/(android)/i.test(navigator.userAgent);class T{_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 A=()=>{let e,t;return{promise:new Promise((s,r)=>{e=s,t=r}),resolve:e,reject:t}},k=(e,t,s)=>{let r=null;Object.defineProperty(e,t,{get:()=>r||s,set(e){r=e?.mute?e.value:e}})},N=()=>.01*window.innerHeight+"px",R=e=>{e&&setTimeout(()=>e.style.setProperty(I,N()),0)},C="rml-styles",I="--rml-full-height",x="rml-container",B="rml-fill",D="rml-pos",U="rml-android-height",F="rml-overflow-hidden",H=new Map;class j extends T{static createPlanner(e,t,s,r=[]){return this._create(e,t,s,r)}static async connect(t,s=[]){const r=new T;r.viewName=t;const{resolve:n,promise:a}=A(),{resolve:i,promise:o}=A(),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(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)))(P);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(H.has(s))throw new Error("There is already an instance on this DOM element");if(!document.getElementById(C)){const e=r.zIndex||9999999,t=document.createElement("style");t.type="text/css",t.id=C;const s="transition:all ease-in-out 450ms;",n=["-webkit-","-o-"].reduce((e,t)=>e+(t+s),"")+s,a=N();t.innerHTML=`\n .${x}{${I}:${a};}\n .${D}{position:fixed;top:0;left:0;z-index:${e};opacity:0}\n .rml-transition{${n}}\n .${B}{width:100%;height:100%;opacity:1}\n .${U}{height:calc(var(${I},1vh)*100)}\n .${F}{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),L()&&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),H.set(s,!0)}teardown(){this._container&&H.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(B),e}_onResize(){R(this._iframe)}_onUseFullPage(){this._iframe.classList.add(D),document.documentElement.classList.add(F),window.document.body.classList.add(F),L()&&(R(this._iframe),this._iframe.classList.add(U))}_onBackToWebsite(){this._iframe.classList.remove(D),this._iframe.classList.remove(U),document.documentElement.classList.remove(F),window.document.body.classList.remove(F)}_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]),k(this.ui.callbacks,"onUseFullPage",this._onUseFullPage),k(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 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 P={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},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)}},L=()=>/(android)/i.test(navigator.userAgent);class T{_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 A=()=>{let e,t;return{promise:new Promise((s,r)=>{e=s,t=r}),resolve:e,reject:t}},k=(e,t,s)=>{let r=null;Object.defineProperty(e,t,{get:()=>r||s,set(e){r=e?.mute?e.value:e}})},N=()=>.01*window.innerHeight+"px",R=e=>{e&&setTimeout(()=>e.style.setProperty(I,N()),0)},C="rml-styles",I="--rml-full-height",x="rml-container",B="rml-fill",D="rml-pos",U="rml-android-height",F="rml-overflow-hidden",H=new Map;class j extends T{static createPlanner(e,t,s,r=[]){return this._create(e,t,s,r)}static async connect(t,s=[]){const r=new T;r.viewName=t;const{resolve:n,promise:a}=A(),{resolve:i,promise:o}=A(),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)))(P);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(H.has(s))throw new Error("There is already an instance on this DOM element");if(!document.getElementById(C)){const e=r.zIndex||9999999,t=document.createElement("style");t.type="text/css",t.id=C;const s="transition:all ease-in-out 450ms;",n=["-webkit-","-o-"].reduce((e,t)=>e+(t+s),"")+s,a=N();t.innerHTML=`\n .${x}{${I}:${a};}\n .${D}{position:fixed;top:0;left:0;z-index:${e};opacity:0}\n .rml-transition{${n}}\n .${B}{width:100%;height:100%;opacity:1}\n .${U}{height:calc(var(${I},1vh)*100)}\n .${F}{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),L()&&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),H.set(s,!0)}teardown(){this._container&&H.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(B),e}_onResize(){R(this._iframe)}_onUseFullPage(){this._iframe.classList.add(D),document.documentElement.classList.add(F),window.document.body.classList.add(F),L()&&(R(this._iframe),this._iframe.classList.add(U))}_onBackToWebsite(){this._iframe.classList.remove(D),this._iframe.classList.remove(U),document.documentElement.classList.remove(F),window.document.body.classList.remove(F)}_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]),k(this.ui.callbacks,"onUseFullPage",this._onUseFullPage),k(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 default};
@@ -2,20 +2,20 @@
2
2
  * @license
3
3
  * Copyright 2019 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
- */const D=Symbol("Comlink.proxy"),Lt=Symbol("Comlink.endpoint"),Nt=Symbol("Comlink.releaseProxy"),G=Symbol("Comlink.finalizer"),b=Symbol("Comlink.thrown"),tt=s=>typeof s=="object"&&s!==null||typeof s=="function",xt={canHandle:s=>tt(s)&&s[D],serialize(s){const{port1:t,port2:e}=new MessageChannel;return F(s,t),[e,[e]]},deserialize(s){return s.start(),Ht(s)}},Pt={canHandle:s=>tt(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}},et=new Map([["proxy",xt],["throw",Pt]]);function Gt(s,t){for(const e of s)if(t===e||e==="*"||e instanceof RegExp&&e.test(t))return!0;return!1}function F(s,t=globalThis,e=["*"]){t.addEventListener("message",function r(n){if(!n||!n.data)return;if(!Gt(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=Wt(h)}break;case"ENDPOINT":{const{port1:h,port2:g}=new MessageChannel;F(s,g),l=kt(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),st(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 st(s){Ft(s)&&s.close()}function Ht(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)}}),H(s,e,[],t)}function I(s){if(s)throw new Error("Proxy has been released and is not useable")}function rt(s){return T(s,new Map,{type:"RELEASE"}).then(()=>{st(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&&rt(s)});function Ut(s,t){const e=(A.get(t)||0)+1;A.set(t,e),O&&O.register(s,t,s)}function Bt(s){O&&O.unregister(s)}function H(s,t,e=[],r=function(){}){let n=!1;const i=new Proxy(r,{get(o,a){if(I(n),a===Nt)return()=>{Bt(i),rt(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 H(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===Lt)return T(s,t,{type:"ENDPOINT"}).then(p);if(l==="bind")return H(s,t,e.slice(0,-1));const[u,d]=nt(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]=nt(a);return T(s,t,{type:"CONSTRUCT",path:e.map(u=>u.toString()),argumentList:c},l).then(p)}});return Ut(i,s),i}function Yt(s){return Array.prototype.concat.apply([],s)}function nt(s){const t=s.map(M);return[t.map(e=>e[0]),Yt(t.map(e=>e[1]))]}const it=new WeakMap;function kt(s,t){return it.set(s,t),s}function Wt(s){return Object.assign(s,{[D]:!0})}function M(s){for(const[t,e]of et)if(e.canHandle(s)){const[r,n]=e.serialize(s);return[{type:"HANDLER",name:t,value:r},n]}return[{type:"RAW",value:s},it.get(s)||[]]}function p(s){switch(s.type){case"HANDLER":return et.get(s.name).deserialize(s.value);case"RAW":return s.value}}function T(s,t,e,r){return new Promise(n=>{const i=Xt();t.set(i,n),s.start&&s.start(),s.postMessage(Object.assign({id:i},e),r)})}function Xt(){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"},zt=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},$t=()=>{try{return window.self!==window.top}catch{return!0}},Vt=["127.0.0.1","localhost","0.0.0.0"],jt=()=>{const s=$t();let t=window.location.href;if(s){if(!document.referrer)return null;t=document.referrer}const{hostname:e}=new URL(t);return e},qt=s=>!!(Vt.includes(s)||s.endsWith("roomle.com")||s.endsWith("gitlab.io")||s.endsWith("gitlab.com")),ot=["language","browserLanguage","userLanguage","systemLanguage"],Kt=(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=ot.length;e<r;e++){const n=t[ot[e]];if(n)return n.substr(0,2)}return"en"},Jt=(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 at=(s=>(s.BOTTOM_BAR="bottom_bar",s.PARTLIST_BOUNDS="partlist_bounds",s.INTERACTION_NOTES="interaction_notes",s.PARAMETER_GROUPS="parameter_groups",s))(at||{});const Qt=s=>JSON.parse(JSON.stringify(s)),Zt={mobileLandscape:!0,floorMaterialRootTag:"materials_root",buttons:{renderimage:!0,requestproduct:!0,requestplan:!0,load_product:!0,partlist_print:!0},elements:{[at.INTERACTION_NOTES]:!0},helpcenter:{roomdesigner:!0,configurator:!1,disable:!1},firstPersonView:!0,saveToIdb:!0,featureFlags:{mocAr:!0,wallAutoHeight:!1,openCloseAnimation:!0,enableTwoLevelCatalog:!1},rotationSnapDegrees:10,interactionsCollapsed:!1},te="(idle)",ee=s=>(k(s),s?.customApiUrl&&(s.customApiUrl=decodeURIComponent(s.customApiUrl)),s.shareUrl&&(s.deeplink=s.shareUrl.replace(ne,ie)),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")}},se=(s,t)=>{t.configuratorId=s.id;const e=s.settings||{};return!t.overrideTenant&&s.tenant&&(t.overrideTenant=s.tenant),Jt(e,t)},re=()=>{const s=Qt(Zt);s.locale||(s.locale=Kt()),s.id===te&&delete s.id;const t=jt();return t&&qt(t)&&(s.configuratorId="demoConfigurator"),s.customApiUrl=void 0,s.emails=!1,s},ne="<CONF_ID>",ie="#CONFIGURATIONID#",oe=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)},ct=()=>/(android)/i.test(navigator.userAgent);class lt{_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(()=>he).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 ut=()=>{let s,t;return{promise:new Promise((r,n)=>{s=r,t=n}),resolve:s,reject:t}},ht=(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)}})},dt=()=>window.innerHeight*.01+"px",gt=s=>{s&&setTimeout(()=>s.style.setProperty(W,dt()),0)},mt="rml-styles",ae=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;class ce extends lt{static createPlanner(t,e,r,n=[]){return this._create(t,e,r,n)}static async connect(t,e=[]){const r=new lt;r.viewName=t;const{resolve:n,promise:i}=ut(),{resolve:o,promise:a}=ut(),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 _("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?.(),F(t,r)}})}static async _create(t,e,r,n){return new Promise(async(i,o)=>{try{const a=Y(re(),ee(r));oe(a);const c=await zt(t,a);r=se(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(mt)){const l=r.zIndex||9999999,u=document.createElement("style");u.type="text/css",u.id=mt;const d="transition:all ease-in-out "+ae+"ms;",h=["-webkit-","-o-"].reduce((E,f)=>E+=f+d,"")+d,g=dt();u.innerHTML=`
5
+ */const D=Symbol("Comlink.proxy"),Lt=Symbol("Comlink.endpoint"),Nt=Symbol("Comlink.releaseProxy"),G=Symbol("Comlink.finalizer"),b=Symbol("Comlink.thrown"),tt=s=>typeof s=="object"&&s!==null||typeof s=="function",xt={canHandle:s=>tt(s)&&s[D],serialize(s){const{port1:t,port2:e}=new MessageChannel;return F(s,t),[e,[e]]},deserialize(s){return s.start(),Ht(s)}},Pt={canHandle:s=>tt(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}},et=new Map([["proxy",xt],["throw",Pt]]);function Gt(s,t){for(const e of s)if(t===e||e==="*"||e instanceof RegExp&&e.test(t))return!0;return!1}function F(s,t=globalThis,e=["*"]){t.addEventListener("message",function r(n){if(!n||!n.data)return;if(!Gt(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=Wt(h)}break;case"ENDPOINT":{const{port1:h,port2:g}=new MessageChannel;F(s,g),l=kt(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),st(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 st(s){Ft(s)&&s.close()}function Ht(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)}}),H(s,e,[],t)}function I(s){if(s)throw new Error("Proxy has been released and is not useable")}function rt(s){return T(s,new Map,{type:"RELEASE"}).then(()=>{st(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&&rt(s)});function Ut(s,t){const e=(A.get(t)||0)+1;A.set(t,e),O&&O.register(s,t,s)}function Bt(s){O&&O.unregister(s)}function H(s,t,e=[],r=function(){}){let n=!1;const i=new Proxy(r,{get(o,a){if(I(n),a===Nt)return()=>{Bt(i),rt(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 H(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===Lt)return T(s,t,{type:"ENDPOINT"}).then(p);if(l==="bind")return H(s,t,e.slice(0,-1));const[u,d]=nt(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]=nt(a);return T(s,t,{type:"CONSTRUCT",path:e.map(u=>u.toString()),argumentList:c},l).then(p)}});return Ut(i,s),i}function Yt(s){return Array.prototype.concat.apply([],s)}function nt(s){const t=s.map(M);return[t.map(e=>e[0]),Yt(t.map(e=>e[1]))]}const it=new WeakMap;function kt(s,t){return it.set(s,t),s}function Wt(s){return Object.assign(s,{[D]:!0})}function M(s){for(const[t,e]of et)if(e.canHandle(s)){const[r,n]=e.serialize(s);return[{type:"HANDLER",name:t,value:r},n]}return[{type:"RAW",value:s},it.get(s)||[]]}function p(s){switch(s.type){case"HANDLER":return et.get(s.name).deserialize(s.value);case"RAW":return s.value}}function T(s,t,e,r){return new Promise(n=>{const i=Xt();t.set(i,n),s.start&&s.start(),s.postMessage(Object.assign({id:i},e),r)})}function Xt(){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"},zt=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},$t=()=>{try{return window.self!==window.top}catch{return!0}},Vt=["127.0.0.1","localhost","0.0.0.0"],jt=()=>{const s=$t();let t=window.location.href;if(s){if(!document.referrer)return null;t=document.referrer}const{hostname:e}=new URL(t);return e},qt=s=>!!(Vt.includes(s)||s.endsWith("roomle.com")||s.endsWith("gitlab.io")||s.endsWith("gitlab.com")),ot=["language","browserLanguage","userLanguage","systemLanguage"],Kt=(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=ot.length;e<r;e++){const n=t[ot[e]];if(n)return n.substr(0,2)}return"en"},Jt=(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 at=(s=>(s.BOTTOM_BAR="bottom_bar",s.PARTLIST_BOUNDS="partlist_bounds",s.INTERACTION_NOTES="interaction_notes",s.PARAMETER_GROUPS="parameter_groups",s))(at||{});const Qt=s=>JSON.parse(JSON.stringify(s)),Zt={mobileLandscape:!0,floorMaterialRootTag:"materials_root",buttons:{renderimage:!0,requestproduct:!0,requestplan:!0,load_product:!0,partlist_print:!0},elements:{[at.INTERACTION_NOTES]:!0},helpcenter:{roomdesigner:!0,configurator:!1,disable:!1},firstPersonView:!0,saveToIdb:!0,featureFlags:{mocAr:!0,wallAutoHeight:!1,openCloseAnimation:!0,enableTwoLevelCatalog:!1},rotationSnapDegrees:10,interactionsCollapsed:!1},te="(idle)",ee=s=>(k(s),s?.customApiUrl&&(s.customApiUrl=decodeURIComponent(s.customApiUrl)),s.shareUrl&&(s.deeplink=s.shareUrl.replace(ne,ie)),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")}},se=(s,t)=>{t.configuratorId=s.id;const e=s.settings||{};return!t.overrideTenant&&s.tenant&&(t.overrideTenant=s.tenant),Jt(e,t)},re=()=>{const s=Qt(Zt);s.locale||(s.locale=Kt()),s.id===te&&delete s.id;const t=jt();return t&&qt(t)&&(s.configuratorId="demoConfigurator"),s.customApiUrl=void 0,s.emails=!1,s},ne="<CONF_ID>",ie="#CONFIGURATIONID#",oe=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)},ct=()=>/(android)/i.test(navigator.userAgent);class lt{_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(()=>de).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 ut=()=>{let s,t;return{promise:new Promise((r,n)=>{s=r,t=n}),resolve:s,reject:t}},ht=(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)}})},dt=()=>window.innerHeight*.01+"px",gt=s=>{s&&setTimeout(()=>s.style.setProperty(W,dt()),0)},mt="rml-styles",ae=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,ce=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)};class le extends lt{static createPlanner(t,e,r,n=[]){return this._create(t,e,r,n)}static async connect(t,e=[]){const r=new lt;r.viewName=t;const{resolve:n,promise:i}=ut(),{resolve:o,promise:a}=ut(),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 _("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?.(),F(ce(t),r)}})}static async _create(t,e,r,n){return new Promise(async(i,o)=>{try{const a=Y(re(),ee(r));oe(a);const c=await zt(t,a);r=se(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(mt)){const l=r.zIndex||9999999,u=document.createElement("style");u.type="text/css",u.id=mt;const d="transition:all ease-in-out "+ae+"ms;",h=["-webkit-","-o-"].reduce((E,f)=>E+=f+d,"")+d,g=dt();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 _("website",window,null,this._executeMessage);this.setMessageHandler(a),this._onResize=this._onResize.bind(this),ct()&&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(){gt(this._iframe)}_onUseFullPage(){this._iframe.classList.add(m.POSITION),document.documentElement.classList.add(m.OVERFLOW_HIDDEN),window.document.body.classList.add(m.OVERFLOW_HIDDEN),ct()&&(gt(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]),ht(this.ui.callbacks,"onUseFullPage",this._onUseFullPage),ht(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 le{_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",_t="rml-drag-in-fade-in",ft="rml-drag-in-fade-out",z={DISPLAY_NONE:"rml-display-none"},pt=.5,yt="250ms",Et="forwards",Dt=`@keyframes ${_t} {from{opacity: 0;}to {opacity: ${pt};}}`,Tt=`@keyframes ${ft} {from{opacity: ${pt};}to {opacity: 0;}}`,wt=`${_t} ${yt} ${Et}`,St=`${ft} ${yt} ${Et}`,x="https://res.cloudinary.com/roomle/image/upload/v1729679975/fallback_afpyqr.jpg",$=112,V=112;class ue extends le{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 _("website",window,null,this._executeMessage);this.setMessageHandler(a),this._onResize=this._onResize.bind(this),ct()&&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(){gt(this._iframe)}_onUseFullPage(){this._iframe.classList.add(m.POSITION),document.documentElement.classList.add(m.OVERFLOW_HIDDEN),window.document.body.classList.add(m.OVERFLOW_HIDDEN),ct()&&(gt(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]),ht(this.ui.callbacks,"onUseFullPage",this._onUseFullPage),ht(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 ue{_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",_t="rml-drag-in-fade-in",ft="rml-drag-in-fade-out",z={DISPLAY_NONE:"rml-display-none"},pt=.5,yt="250ms",Et="forwards",Dt=`@keyframes ${_t} {from{opacity: 0;}to {opacity: ${pt};}}`,Tt=`@keyframes ${ft} {from{opacity: ${pt};}to {opacity: 0;}}`,wt=`${_t} ${yt} ${Et}`,St=`${ft} ${yt} ${Et}`,x="https://res.cloudinary.com/roomle/image/upload/v1729679975/fallback_afpyqr.jpg",$=112,V=112;class he extends ue{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
  ${Dt}
17
17
  ${Tt}
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(()=>De);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(()=>Oe);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 he=Object.freeze(Object.defineProperty({__proto__:null,DragIn:ue},Symbol.toStringTag,{value:"Module"}));class de{_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 de),j.get(s)),bt=(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)},It=(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=bt(g[1],g[2],s),a=bt(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)?ge(s):s,n=e>0?e:t?t.x:e,i=r>0?r:t?t.y:r;return{clientX:n,clientY:i}},ge=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,me=100,At=15,J=(s,t=0)=>y(s)?{clientX:s.touches[t].clientX,clientY:s.touches[t].clientY}:{clientX:s.clientX,clientY:s.clientY},Ot=s=>s&&y(s)?s.touches.length>0:!0;class Mt{_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){Ot(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){Ot(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 Rt=(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?Rt({x:s,y:t},e.visibleIn,r,n):e.hiddenIn?!Rt({x:s,y:t},e.hiddenIn,-r,-n):!1},_e=()=>{if(!!!document.getElementById(C)){const t=document.createElement("style");t.type="text/css",t.id=C,t.innerHTML=`
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(()=>Te);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(()=>Me);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 de=Object.freeze(Object.defineProperty({__proto__:null,DragIn:he},Symbol.toStringTag,{value:"Module"}));class ge{_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 ge),j.get(s)),bt=(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)},It=(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=bt(g[1],g[2],s),a=bt(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)?me(s):s,n=e>0?e:t?t.x:e,i=r>0?r:t?t.y:r;return{clientX:n,clientY:i}},me=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,_e=100,At=15,J=(s,t=0)=>y(s)?{clientX:s.touches[t].clientX,clientY:s.touches[t].clientY}:{clientX:s.clientX,clientY:s.clientY},Ot=s=>s&&y(s)?s.touches.length>0:!0;class Mt{_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){Ot(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){Ot(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 Rt=(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?Rt({x:s,y:t},e.visibleIn,r,n):e.hiddenIn?!Rt({x:s,y:t},e.hiddenIn,-r,-n):!1},fe=()=>{if(!!!document.getElementById(v)){const t=document.createElement("style");t.type="text/css",t.id=v,t.innerHTML=`
19
19
  ${Dt}
20
20
  ${Tt}
21
- `,document.head.appendChild(t)}},fe=({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",Ct(s,t,e.ghost||{},e.settings?.dragInOverlapX,e.settings?.dragInOverlapY)||(r.style.display="none"),r.style.pointerEvents="none",document.body.appendChild(r)}},pe=({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&&(Ct(s,t,e.ghost,e.settings?.dragInOverlapX,e.settings?.dragInOverlapY)?r.style.animation!=wt&&(r.style.animation=wt):r.style.animation!=St&&(r.style.animation=St))};class ye{_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(()=>{_e();const n={x:t,y:e};!r.ghost&&this._dragGhostElement&&(r.ghost={}),r.ghost&&!r.ghost.element&&this._dragGhostElement&&(r.ghost.element=this._dragGhostElement),fe(n,r),pe(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 Ee{_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 ye(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}=It(n,this._currentDrag.event||e,this._firefoxDragPosition),S=Math.max(1,E),Me=Math.max(1,f);this.isDragging=!0,this._instance.dragInObject(t,S,Me,r)}dragUpdate(t){const e=this._mainDomElement.parentNode,{x:r,y:n}=It(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 Mt(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 De=Object.freeze(Object.defineProperty({__proto__:null,DragInFromWebsiteStrategy:Ee},Symbol.toStringTag,{value:"Module"})),Te=s=>`[data-rml-custom-view="${s}"]`,Q=s=>{s.preventDefault(),s.stopPropagation()},we=(s,t,e,r)=>{const n=e-s,i=r-t;return Math.sqrt(n*n+i*i)};class Se{_startX=0;_startY=0;_lastX=0;_lastY=0;_epsilon;_isWaiting=!1;_onCustomDragStart;constructor({onCustomDragStart:t},e={}){this._epsilon=typeof e.epsilon=="number"?e.epsilon:At,this._onCustomDragStart=t}onMove(t){this._lastX=t.clientX,this._lastY=t.clientY,this._isWaiting&&we(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",be=void 0,vt=(s,t)=>{const e=y(s),r={delay:e?q:me,epsilon:e?K:At};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},Ie=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 Ae{_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(Te(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}=Ie(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 Mt(be,{onTouchDragStart:n},vt(e,this._options)):new Se({onCustomDragStart:i=>this._dragStart(t,i,r)},vt(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 Oe=Object.freeze(Object.defineProperty({__proto__:null,DragInFromCustomViewStrategy:Ae},Symbol.toStringTag,{value:"Module"}));return ce});
21
+ `,document.head.appendChild(t)}},pe=({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",vt(s,t,e.ghost||{},e.settings?.dragInOverlapX,e.settings?.dragInOverlapY)||(r.style.display="none"),r.style.pointerEvents="none",document.body.appendChild(r)}},ye=({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&&(vt(s,t,e.ghost,e.settings?.dragInOverlapX,e.settings?.dragInOverlapY)?r.style.animation!=wt&&(r.style.animation=wt):r.style.animation!=St&&(r.style.animation=St))};class Ee{_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(()=>{fe();const n={x:t,y:e};!r.ghost&&this._dragGhostElement&&(r.ghost={}),r.ghost&&!r.ghost.element&&this._dragGhostElement&&(r.ghost.element=this._dragGhostElement),pe(n,r),ye(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 De{_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 Ee(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}=It(n,this._currentDrag.event||e,this._firefoxDragPosition),S=Math.max(1,E),Re=Math.max(1,f);this.isDragging=!0,this._instance.dragInObject(t,S,Re,r)}dragUpdate(t){const e=this._mainDomElement.parentNode,{x:r,y:n}=It(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 Mt(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 Te=Object.freeze(Object.defineProperty({__proto__:null,DragInFromWebsiteStrategy:De},Symbol.toStringTag,{value:"Module"})),we=s=>`[data-rml-custom-view="${s}"]`,Q=s=>{s.preventDefault(),s.stopPropagation()},Se=(s,t,e,r)=>{const n=e-s,i=r-t;return Math.sqrt(n*n+i*i)};class be{_startX=0;_startY=0;_lastX=0;_lastY=0;_epsilon;_isWaiting=!1;_onCustomDragStart;constructor({onCustomDragStart:t},e={}){this._epsilon=typeof e.epsilon=="number"?e.epsilon:At,this._onCustomDragStart=t}onMove(t){this._lastX=t.clientX,this._lastY=t.clientY,this._isWaiting&&Se(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",Ie=void 0,Ct=(s,t)=>{const e=y(s),r={delay:e?q:_e,epsilon:e?K:At};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},Ae=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 Oe{_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(we(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}=Ae(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 Mt(Ie,{onTouchDragStart:n},Ct(e,this._options)):new be({onCustomDragStart:i=>this._dragStart(t,i,r)},Ct(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 Me=Object.freeze(Object.defineProperty({__proto__:null,DragInFromCustomViewStrategy:Oe},Symbol.toStringTag,{value:"Module"}));return le});
@@ -1 +1 @@
1
- var t,e;t=this,e=function(){"use strict";class t{_side;_incomingMessageBus=null;_outgoingMessageBus=null;_execMessage=null;constructor(t,e,s,n){this._side=t,this._incomingMessageBus=e,this._outgoingMessageBus=s,this._execMessage=n,this._incomingMessageBus&&this._incomingMessageBus.addEventListener("message",this._handleMessage.bind(this))}setOutgoingMessageBus(t){this._outgoingMessageBus=t}setMessageExecution(t){this._execMessage=t}sendMessage(t,e=[]){return new Promise((s,n)=>{if(this._incomingMessageBus===this._outgoingMessageBus)return s(void 0);const r=new MessageChannel;r.port1.onmessage=t=>{if(!t||!t.data)return r.port1.close(),r.port2.close(),n(new Error(this._side+" received message but response can not be interpreted"));let e;try{e=JSON.parse(t.data)}catch(t){return r.port1.close(),r.port2.close(),this._prepareError(t),n(t)}e.error?n(e.error):void 0!==e.result?s(e.result):s(void 0),r.port1.close(),r.port2.close()};let i="";try{i=JSON.stringify({message:t,args:e})}catch{return n(new Error(this._side+": can not create command because it is not JSON.stringify able"))}if(!this._outgoingMessageBus)return n(new Error(this._side+": outgoing bus not set yet"));this._outgoingMessageBus.postMessage(i,"*",[r.port2])})}_handleMessage(t){const e=t.ports&&Array.isArray(t.ports)&&t.ports.length>0?t.ports[0]:null;if(t.data&&("string"==typeof t.data||"connect_hi"!==t.data.type)&&e)try{const s=JSON.parse(t.data);if(!this._execMessage)return e.postMessage(JSON.stringify({error:this._side+" is not ready to handle messages"}));Array.isArray(s.args)||(s.args=[s.args]);const n=this._execMessage(s,t);if(void 0===n)return;n.then((t={})=>{let s,n;"object"==typeof t&&null!==t&&(s=t.error,n=t.result),s?e.postMessage(JSON.stringify({error:s})):void 0!==n?e.postMessage(JSON.stringify({result:n})):e.postMessage(JSON.stringify({result:t}))},t=>{e.postMessage(JSON.stringify({error:this._prepareError(t)}))})}catch(t){e.postMessage(JSON.stringify({error:this._prepareError(t)}))}}_prepareError(t){return"string"==typeof t?this._side+": "+t:(t.message=this._side+": "+t.message,t.message)}}const e=Symbol("Comlink.proxy"),s=Symbol("Comlink.endpoint"),n=Symbol("Comlink.releaseProxy"),r=Symbol("Comlink.finalizer"),i=Symbol("Comlink.thrown"),a=t=>"object"==typeof t&&null!==t||"function"==typeof t,o={canHandle:t=>a(t)&&t[e],serialize(t){const{port1:e,port2:s}=new MessageChannel;return h(t,e),[s,[s]]},deserialize:t=>(t.start(),function(t){const e=new Map;return t.addEventListener("message",function(t){const{data:s}=t;if(!s||!s.id)return;const n=e.get(s.id);if(n)try{n(s)}finally{e.delete(s.id)}}),p(t,e,[],void 0)}(t))},l={canHandle:t=>a(t)&&i in t,serialize({value:t}){let e;return e=t instanceof Error?{isError:!0,value:{message:t.message,name:t.name,stack:t.stack}}:{isError:!1,value:t},[e,[]]},deserialize(t){throw t.isError?Object.assign(new Error(t.value.message),t.value):t.value}},c=new Map([["proxy",o],["throw",l]]);function h(t,s=globalThis,n=["*"]){s.addEventListener("message",function a(o){if(!o||!o.data)return;if(!function(t,e){for(const s of t)if(e===s||"*"===s||s instanceof RegExp&&s.test(e))return!0;return!1}(n,o.origin))return;const{id:l,type:c,path:g}=Object.assign({path:[]},o.data),d=(o.data.argumentList||[]).map(w);let m;try{const s=g.slice(0,-1).reduce((t,e)=>t[e],t),n=g.reduce((t,e)=>t[e],t);switch(c){case"GET":m=n;break;case"SET":s[g.slice(-1)[0]]=w(o.data.value),m=!0;break;case"APPLY":m=n.apply(s,d);break;case"CONSTRUCT":m=function(t){return Object.assign(t,{[e]:!0})}(new n(...d));break;case"ENDPOINT":{const{port1:e,port2:s}=new MessageChannel;h(t,s),m=function(t,e){return b.set(t,e),t}(e,[e])}break;case"RELEASE":m=void 0;break;default:return}}catch(t){m={value:t,[i]:0}}Promise.resolve(m).catch(t=>({value:t,[i]:0})).then(e=>{const[n,i]=v(e);s.postMessage(Object.assign(Object.assign({},n),{id:l}),i),"RELEASE"===c&&(s.removeEventListener("message",a),u(s),r in t&&"function"==typeof t[r]&&t[r]())}).catch(t=>{const[e,n]=v({value:new TypeError("Unserializable return value"),[i]:0});s.postMessage(Object.assign(Object.assign({},e),{id:l}),n)})}),s.start&&s.start()}function u(t){(function(t){return"MessagePort"===t.constructor.name})(t)&&t.close()}function g(t){if(t)throw new Error("Proxy has been released and is not useable")}function d(t){return D(t,new Map,{type:"RELEASE"}).then(()=>{u(t)})}const m=new WeakMap,_="FinalizationRegistry"in globalThis&&new FinalizationRegistry(t=>{const e=(m.get(t)||0)-1;m.set(t,e),0===e&&d(t)});function p(t,e,r=[],i=function(){}){let a=!1;const o=new Proxy(i,{get(s,i){if(g(a),i===n)return()=>{(function(t){_&&_.unregister(t)})(o),d(t),e.clear(),a=!0};if("then"===i){if(0===r.length)return{then:()=>o};const s=D(t,e,{type:"GET",path:r.map(t=>t.toString())}).then(w);return s.then.bind(s)}return p(t,e,[...r,i])},set(s,n,i){g(a);const[o,l]=v(i);return D(t,e,{type:"SET",path:[...r,n].map(t=>t.toString()),value:o},l).then(w)},apply(n,i,o){g(a);const l=r[r.length-1];if(l===s)return D(t,e,{type:"ENDPOINT"}).then(w);if("bind"===l)return p(t,e,r.slice(0,-1));const[c,h]=y(o);return D(t,e,{type:"APPLY",path:r.map(t=>t.toString()),argumentList:c},h).then(w)},construct(s,n){g(a);const[i,o]=y(n);return D(t,e,{type:"CONSTRUCT",path:r.map(t=>t.toString()),argumentList:i},o).then(w)}});return function(t,e){const s=(m.get(e)||0)+1;m.set(e,s),_&&_.register(t,e,t)}(o,t),o}function f(t){return Array.prototype.concat.apply([],t)}function y(t){const e=t.map(v);return[e.map(t=>t[0]),f(e.map(t=>t[1]))]}const b=new WeakMap;function v(t){for(const[e,s]of c)if(s.canHandle(t)){const[n,r]=s.serialize(t);return[{type:"HANDLER",name:e,value:n},r]}return[{type:"RAW",value:t},b.get(t)||[]]}function w(t){switch(t.type){case"HANDLER":return c.get(t.name).deserialize(t.value);case"RAW":return t.value}}function D(t,e,s,n){return new Promise(r=>{const i=new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");e.set(i,r),t.start&&t.start(),t.postMessage(Object.assign({id:i},s),n)})}const E=["127.0.0.1","localhost","0.0.0.0"],T=["language","browserLanguage","userLanguage","systemLanguage"],S=(t,e)=>{for(const s in e)try{e[s].constructor===Object?t[s]=S(t[s],e[s]):t[s]=e[s]}catch{t[s]=e[s]}return t};var x,I=((x=I||{}).BOTTOM_BAR="bottom_bar",x.PARTLIST_BOUNDS="partlist_bounds",x.INTERACTION_NOTES="interaction_notes",x.PARAMETER_GROUPS="parameter_groups",x);const M={mobileLandscape:!0,floorMaterialRootTag:"materials_root",buttons:{renderimage:!0,requestproduct:!0,requestplan:!0,load_product:!0,partlist_print:!0},elements:{[I.INTERACTION_NOTES]:!0},helpcenter:{roomdesigner:!0,configurator:!1,disable:!1},firstPersonView:!0,saveToIdb:!0,featureFlags:{mocAr:!0,wallAutoHeight:!1,openCloseAnimation:!0,enableTwoLevelCatalog:!1},rotationSnapDegrees:10,interactionsCollapsed:!1},C=t=>{if(!t)return;const e=Object.keys(t);for(const s of e){const e=t[s];if(!Array.isArray(e)&&"object"==typeof e&&null!==e&&C(e),Array.isArray(e))for(const t of e)C(t);("true"===e||"false"===e)&&(t[s]="true"===e)}},A=()=>/(android)/i.test(navigator.userAgent);class L{_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:s}=t;e.forEach(t=>{const e=t.split("."),s=e[0],n=e[1];this[s]||(this[s]={}),this[s][n]=function(){if(this._messageHandler)return this._messageHandler.sendMessage(t,[...arguments])}.bind(this)}),s.forEach(t=>{const e=t.split("."),s=e[0],n=e[1],r=e[2];this[s]||(this[s]={}),this[s][n]||(this[s][n]={}),this[s][n][r]=()=>{}}),this.isSetupDone=!0}executeMessage({message:t,args:e}){const s=t.split("."),n=s[0],r=s[1],i=3===s.length?s[2]:null;if(i&&this[n][r][i]){const t=this[n][r][i](...e);return t instanceof Promise?t.then(t=>({result:t})):void 0!==t?Promise.resolve({result:t}):Promise.resolve({result:null})}return Promise.reject('Message "'+t+'" is unkown')}setupPlugins(t,e,s="website"){for(const n of t)"string"==typeof n&&"dragIn"===n?this.pluginsLoaded.push(new Promise((t,n)=>{try{Promise.resolve().then(()=>it).then(({DragIn:r})=>{const i=new r(this.ui,e,s,this.viewName);i.init().then(()=>{this.plugins.dragIn=i,t()},n)})}catch(t){n(t)}})):n.name&&n.loader&&this.pluginsLoaded.push(new Promise((t,r)=>{try{n.loader().then(i=>{const a=new i(this.ui,e,s,this.viewName);a.init().then(()=>{this.plugins[n.name]=a,t()},r)})}catch(t){r(t)}}))}}const O=()=>{let t,e;return{promise:new Promise((s,n)=>{t=s,e=n}),resolve:t,reject:e}},P=(t,e,s)=>{let n=null;Object.defineProperty(t,e,{get:()=>n||s,set(t){n=t?.mute?t.value:t}})},B=()=>.01*window.innerHeight+"px",F=t=>{t&&setTimeout(()=>t.style.setProperty(N,B()),0)},k="rml-styles",N="--rml-full-height",R="rml-container",U="rml-fill",G="rml-pos",X="rml-android-height",j="rml-overflow-hidden",Y=new Map;class z{_mainDomElement;_instance;_mode="website";_viewName="main";constructor(t,e,s,n){this._instance=t,this._mainDomElement=e,this._mode=s,this._viewName=n}async init(){return Promise.resolve()}}const $="rml-drag-in-styles",H="rml-drag-in-drag-element",W="rml-drag-in-overlay",q="rml-drag-in-drag-ghost",J="rml-drag-in-fade-in",K="rml-drag-in-fade-out",V="rml-display-none",Q="250ms",Z="forwards",tt=`@keyframes ${J} {from{opacity: 0;}to {opacity: 0.5;}}`,et=`@keyframes ${K} {from{opacity: 0.5;}to {opacity: 0;}}`,st=`${J} ${Q} ${Z}`,nt=`${K} ${Q} ${Z}`,rt="https://res.cloudinary.com/roomle/image/upload/v1729679975/fallback_afpyqr.jpg",it=Object.freeze(Object.defineProperty({__proto__:null,DragIn:class extends z{options={};_customDragSignal=new AbortController;_injectStyles(){if(!document.getElementById($)){const t=document.createElement("style");t.type="text/css",t.id=$,t.innerHTML=`\n .${V}{display:none}\n .${W}{position:absolute;top:0;left:0;width:100%;height:100%;z-index:999;}\n .${q}{position:absolute;top:0;left:0;width:1px;height:1px;z-index:999;pointer-events:none;background-color:transparent;}\n ${tt}\n ${et}\n `,document.head.appendChild(t)}}_initializeDragGhost(){const t=this._mainDomElement.parentNode;let e=t.querySelector("."+q);e||(e=document.createElement("div"),e.classList.add(q),e.innerText=" ",t.appendChild(e))}constructor(t,e,s,n){super(t,e,s,n),this._mainDomElement=e,this._injectStyles(),this._initializeDragGhost()}async init(){if(await super.init(),"website"===this._mode)try{const{DragInFromWebsiteStrategy:t}=await Promise.resolve().then(()=>vt);this._strategy=new t(this._instance,this._mainDomElement,{settings:this.options,mode:"website"})}catch(t){throw t}else{if("custom-view"!==this._mode)throw new Error("Unsupported mode");try{const{DragInFromCustomViewStrategy:t}=await Promise.resolve().then(()=>St);this._strategy=new t(this._instance,this._mainDomElement,this.options,this._viewName)}catch(t){throw t}}}get isDragging(){return this._strategy.isDragging}dragStart(t,e,s="rml_id"){this._strategy.dragStart(t,e,s)}dragUpdate(t){this._strategy.dragUpdate(t)}dragEnd(){this._strategy.dragEnd()}touchStart(t,e,s="rml_id"){this._strategy.touchStart(t,e,s)}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:s,beforeUpdateGhost:n}){n&&this._strategy.beforeUpdateGhost(n);const r=this._customDragSignal.signal,i=e=>{"true"===e.target.getAttribute("data-rml-draggable")&&t(e)},a=t=>{this._strategy.releaseInput(t),this._strategy.isDragging&&e(t)},o=t=>{s(t)};document.querySelectorAll('[data-rml-draggable="true"]').forEach(t=>{t.draggable=!1}),document.addEventListener("mousedown",i,{signal:r}),document.addEventListener("mouseup",a,{signal:r}),document.addEventListener("mousemove",o,{signal:r}),document.addEventListener("mouseleave",a,{signal:r}),document.addEventListener("touchstart",i,{signal:r}),document.addEventListener("touchend",a,{signal:r}),document.addEventListener("touchmove",o,{signal:r})}unregisterCustomDrag(){this._customDragSignal.abort(),this._customDragSignal=new AbortController}releaseInput(t){this._strategy.releaseInput(t)}}},Symbol.toStringTag,{value:"Module"}));class at{_computedStyleCache=new Map;_maxLifetime=16;_cacheCleanInterval=null;constructor(t=16){this._maxLifetime=t}get(t){const e=this._computedStyleCache.get(t),s=Date.now();if(e&&s-e.updated<this._maxLifetime)return e.style;const n=getComputedStyle(t);return this._computedStyleCache.set(t,{style:n,updated:s}),this._cacheCleanInterval||(this._cacheCleanInterval=setInterval(()=>this._cleanUpCache,Math.max(1e3*this._maxLifetime,5e3))),n}_cleanUpCache(){const t=Date.now();for(const[e,{updated:s}]of this._computedStyleCache.entries())t-s>=this._maxLifetime&&this._computedStyleCache.delete(e);0===this._computedStyleCache.size&&this._cacheCleanInterval&&(clearInterval(this._cacheCleanInterval),this._cacheCleanInterval=null)}}const ot=t=>window.TouchEvent&&t instanceof window.TouchEvent;let lt;const ct=t=>(lt||(lt=new at),lt.get(t)),ht=(t,e,s)=>{const n=parseFloat(t),r=window.devicePixelRatio||1;if("px"===e)return n;if("%"===e)return n/100*(s===document.documentElement?window.innerWidth:s.offsetWidth);if("rem"===e)return n*parseFloat(ct(document.documentElement).fontSize);if("em"===e)return n*parseFloat(ct(s).fontSize);if("vh"===e||"vw"===e||"vmin"===e||"vmax"===e)return n/100*{vh:window.innerHeight,vw:window.innerWidth,vmin:Math.min(window.innerWidth,window.innerHeight),vmax:Math.max(window.innerWidth,window.innerHeight)}[e];const i={cm:37.7952755906,mm:3.77952755906,in:96};return e in i?n*i[e]*r:0},ut=(t,e,s={x:0,y:0})=>{const n=t.getBoundingClientRect(),r=ct(t).transform;let i=0,a=0;if("none"!==r){const e=/translate\(\s*([-+]?\d*\.?\d+|\d+)(px|%)?,?\s*([-+]?\d*\.?\d+|\d+)?(px|%)?\s*\)/,s=r.match(e);s&&(i=ht(s[1],s[2],t),a=ht(s[3],s[4],t))}const{clientX:o,clientY:l}=gt(e,s);return{x:o-n.left-i+t.scrollLeft,y:l-n.top-a+t.scrollTop}},gt=(t,e=null)=>{const{clientX:s,clientY:n}=ot(t)?dt(t):t;return{clientX:s>0?s:e?e.x:s,clientY:n>0?n:e?e.y:n}},dt=t=>{if(t.touches.length){let{clientX:e,clientY:s}=t.touches[0];if(t.touches.length>1){const n=t.touches[1];e=(e+n.clientX)/2,s=(s+n.clientY)/2}return{clientX:e,clientY:s}}const e=t.changedTouches[0];return{clientX:e.clientX,clientY:e.clientY}},mt=(t,e=0)=>ot(t)?{clientX:t.touches[e].clientX,clientY:t.touches[e].clientY}:{clientX:t.clientX,clientY:t.clientY},_t=t=>!t||!ot(t)||t.touches.length>0;class pt{_touchDragTimeOut;_onTouchDragStart;_payload=null;_delay=500;_firstTouch=null;_lastTouch=null;_epsilon=10;constructor(t,{onTouchDragStart:e},s={}){this._payload=t,this._onTouchDragStart=e,this._delay="number"==typeof s.delay?s.delay:500,this._epsilon="number"==typeof s.epsilon?s.epsilon:10}onStart(t){_t(t)&&(this._touchDragTimeOut||(this._firstTouch=mt(t,ot(t)?t.touches.length-1:0),this._touchDragTimeOut=setTimeout(()=>{this._clearTimeout(),this._lastTouch||(this._lastTouch=mt(t)),this._checkXDistance(t)()},this._delay)))}onEnd(){this._resetTouches()}onMove(t){_t(t)&&(this._lastTouch=mt(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 ft=(t,e,s=0,n=0)=>{const r=e.x+e.width+s,i=e.x-s,a=e.y+e.height+n,o=e.y-n,{x:l,y:c}=t;return l>=i&&l<=r&&c>=o&&c<=a},yt=(t,e,s,n=0,r=0)=>{if(s&&(s.hiddenIn||s.visibleIn))return s.visibleIn?ft({x:t,y:e},s.visibleIn,n,r):!!s.hiddenIn&&!ft({x:t,y:e},s.hiddenIn,-n,-r)};class bt{_dragGhostAnimationFrameId=null;_dragGhostRemoveAnimationFrameId=null;_dragGhostElement=null;constructor(t=null){this._dragGhostElement=t}updateDragGhost(t,e,s){this._dragGhostRemoveAnimationFrameId&&(cancelAnimationFrame(this._dragGhostRemoveAnimationFrameId),this._dragGhostRemoveAnimationFrameId=null),!s.ghost?.external&&s.ghost&&(this._dragGhostAnimationFrameId||(this._dragGhostAnimationFrameId=requestAnimationFrame(()=>{(()=>{if(!document.getElementById($)){const t=document.createElement("style");t.type="text/css",t.id=$,t.innerHTML=`\n ${tt}\n ${et}\n `,document.head.appendChild(t)}})();const n={x:t,y:e};!s.ghost&&this._dragGhostElement&&(s.ghost={}),s.ghost&&!s.ghost.element&&this._dragGhostElement&&(s.ghost.element=this._dragGhostElement),(({x:t,y:e},s)=>{let n=document.getElementById(H);if(!n){if(n=document.createElement("div"),s.ghost?.element)n.appendChild(s.ghost.element);else{const t=document.createElement("img");t.src=s.ghost?.url||rt,t.width=s.ghost?.width||112,t.height=s.ghost?.height||112,n.appendChild(t)}n.id=H,n.style.position="fixed",n.style.top="0",n.style.left="0",n.style.willChange="transform",n.style.transform="translate3d(0, 0, 0)",n.style.zIndex="9999",n.style.opacity="0.5",yt(t,e,s.ghost||{},s.settings?.dragInOverlapX,s.settings?.dragInOverlapY)||(n.style.display="none"),n.style.pointerEvents="none",document.body.appendChild(n)}})(n,s),(({x:t,y:e},s)=>{const n=document.getElementById(H);if(!n)return;let r=s.ghost?.width,i=s.ghost?.height;typeof r>"u"&&(r=n.getBoundingClientRect().width||112),typeof i>"u"&&(i=n.getBoundingClientRect().height||112);const a=t-r/2,o=e-i/2;n.style.transform=`translate3d(${a}px, ${o}px, 0)`,s.ghost&&(yt(t,e,s.ghost,s.settings?.dragInOverlapX,s.settings?.dragInOverlapY)?n.style.animation!=st&&(n.style.animation=st):n.style.animation!=nt&&(n.style.animation=nt))})(n,s),this._dragGhostAnimationFrameId=null})))}removeDragGhost(){this._dragGhostAnimationFrameId&&(cancelAnimationFrame(this._dragGhostAnimationFrameId),this._dragGhostAnimationFrameId=null),this._dragGhostRemoveAnimationFrameId||(this._dragGhostRemoveAnimationFrameId=requestAnimationFrame(()=>{const t=document.getElementById(H);t&&document.body.removeChild(t),this._dragGhostRemoveAnimationFrameId=null}))}}const vt=Object.freeze(Object.defineProperty({__proto__:null,DragInFromWebsiteStrategy:class{_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,s){this._instance=t,this._mainDomElement=e,this._options=s||{},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,s="rml_id"){const n=this._mainDomElement.parentNode;if("relative"!==ct(n).position)return;this._mainDomElement.style.pointerEvents="none";let r=n.querySelector("."+W);r||(r=document.createElement("div"),r.classList.add(W),n.appendChild(r)),r.classList.remove(V),e.target.getAttribute("draggable");const i=n.querySelector("."+q);this._currentDrag.event=e;const a=e.target,o=a.cloneNode(!0),l=a.getBoundingClientRect();o.style.width=`${l.width}px`,o.style.height=`${l.height}px`,this._currentDrag.ghost=new bt(o),this._currentDrag.offset||(this._currentDrag.offset={x:0,y:0});const{clientX:c,clientY:h}=gt(e,this._firefoxDragPosition);this._currentDrag.offset.x=c-l.left,this._currentDrag.offset.y=h-l.top,e instanceof DragEvent&&e.dataTransfer&&e.dataTransfer.setDragImage&&e.dataTransfer.setDragImage(i,0,0);const{x:u,y:g}=ut(n,this._currentDrag.event||e,this._firefoxDragPosition),d=Math.max(1,u),m=Math.max(1,g);this.isDragging=!0,this._instance.dragInObject(t,d,m,s)}dragUpdate(t){const e=this._mainDomElement.parentNode,{x:s,y:n}=ut(e,t,this._firefoxDragPosition);if(0===s&&0===n)return;const r=Math.max(1,s),i=Math.max(1,n);if(1===r&&1===i)return;let a=r,o=i;if(ot(t)){const t=this._options.settings?.fingerSize||0;a=Math.max(2,r+t),o=Math.max(2,i-t)}const{x:l,y:c,options:h}=this._onBeforeUpdateDrag(a,o,{}),u=h||{settings:{},ghost:{}};u.ghost||(u.ghost={}),u.ghost.visibleIn&&u.ghost.hiddenIn||(u.ghost.hiddenIn=this._mainDomElement.getBoundingClientRect());const g="number"==typeof l?l:a,d="number"==typeof c?c:o;if(this._currentDrag.ghost){const{clientX:e,clientY:s}=gt(t,this._firefoxDragPosition);this._currentDrag.ghost.updateDragGhost(e,s,u)}this._instance.updateDrag(g,d,{})}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("."+W);e&&e.classList.add(V)}touchStart(t,e,s="rml_id"){e.preventDefault();const n={};"number"==typeof this._options?.settings?.touchDragDelay&&(n.delay=this._options.settings.touchDragDelay),this._options?.settings?.touchDragEpsilon&&(n.epsilon=this._options.settings.touchDragEpsilon),this._currentTouch=new pt(void 0,{onTouchDragStart:(e,n)=>{this.dragStart(t,n,s)}},n),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){}}},Symbol.toStringTag,{value:"Module"})),wt=t=>{t.preventDefault(),t.stopPropagation()};class Dt{_startX=0;_startY=0;_lastX=0;_lastY=0;_epsilon;_isWaiting=!1;_onCustomDragStart;constructor({onCustomDragStart:t},e={}){this._epsilon="number"==typeof e.epsilon?e.epsilon:15,this._onCustomDragStart=t}onMove(t){this._lastX=t.clientX,this._lastY=t.clientY,this._isWaiting&&((t,e)=>{const s=this._lastX-t,n=this._lastY-e;return Math.sqrt(s*s+n*n)})(this._startX,this._startY)>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 Et="data-rml-old-draggable",Tt=(t,e)=>{const s=ot(t),n={delay:s?500:100,epsilon:s?10:15};if(!e)return n;if(!(s||t instanceof MouseEvent))return n;const{delayKey:r,epsilonKey:i}=s?{delayKey:"touchDragDelay",epsilonKey:"touchDragEpsilon"}:{delayKey:"customDragDelay",epsilonKey:"customDragEpsilon"};return"number"==typeof e[r]&&(n.delay=e.touchDragDelay),"number"==typeof e[i]&&(n.epsilon=e.touchDragEpsilon),n},St=Object.freeze(Object.defineProperty({__proto__:null,DragInFromCustomViewStrategy:class{_options={};_instance;_mainDomElement;_viewName;_currentCustomDrag=null;_currentBb=null;_startTarget=null;_onBeforeUpdateDrag=()=>({});isDragging=!1;constructor(t,e,s,n){this._instance=t,this._options=s||{},this._viewName=n,this._mainDomElement=e,this._mainDomElement.parentElement?.addEventListener("dragleave",()=>{this._instance.cancelDragIn()})}beforeUpdateGhost(t){this._onBeforeUpdateDrag=t}async _dragStart(t,e,s="rml_id"){this._startTarget&&(this._startTarget.style.pointerEvents="none",this._startTarget.style.userSelect="none",this._startTarget.setAttribute(Et,this._startTarget.draggable.toString()),this._startTarget.draggable=!1,this._startTarget.removeEventListener("dragstart",wt),this._startTarget.addEventListener("dragstart",wt)),this._currentBb=await this._instance.getBoundingClientRect((()=>`[data-rml-custom-view="${this._viewName}"]`)());const{clientX:n,clientY:r}=gt(e),i=this._currentBb.x+n,a=this._currentBb.y+r;this.isDragging=!0,this._instance.dragInObject(t,i,a,s)}_dragUpdate(t){if(document.body.focus(),this._currentCustomDrag&&this._currentCustomDrag.onMove(t),!this._currentBb||!this.isDragging)return;const{clientX:e,clientY:s}=gt(t),{url:n,width:r,height:i}=(t=>{let e="",s=112,n=112;if(!t)return{url:rt,width:s,height:n};const r=t;if(r instanceof HTMLElement){const t=r.getBoundingClientRect(),i=r.getAttribute("data-rml-ghost-url"),a=r.getAttribute("data-rml-ghost-width"),o=r.getAttribute("data-rml-ghost-height");i?e=i:!i&&r instanceof HTMLImageElement&&r.src&&(e=r.src),e?(s=t.width,n=t.height):e=rt,s=a?parseInt(a,10):s,n=o?parseInt(o,10):n}return{url:e||rt,width:s,height:n}})(this._startTarget),a=this._currentBb.x+e,o=this._currentBb.y+s,l=this._options||{},c={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:r,height:i},mode:"custom-view"},{x:h,y:u,options:g}=this._onBeforeUpdateDrag(a,o,c),d="number"==typeof h?h:a,m="number"==typeof u?u:o,_=g||c;this._instance.updateDrag(d,m,_)}_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,s){this._instance.disableEvents(),this._startTarget=e.target,this._currentCustomDrag=ot(e)?new pt(void 0,{onTouchDragStart:(e,n)=>{this._dragStart(t,n,s)}},Tt(e,this._options)):new Dt({onCustomDragStart:e=>this._dragStart(t,e,s)},Tt(e,this._options)),this._currentCustomDrag.onStart(e)}dragEnd(){this._dragEnd()}dragUpdate(t){this._dragUpdate(t)}touchStart(t,e,s="rml_id"){this.dragStart(t,e,s)}touchMove(t){this.dragUpdate(t)}touchEnd(){this.dragEnd()}dispose(){}_resetStartTarget(){this._startTarget&&(this._startTarget.style.pointerEvents="",this._startTarget.style.userSelect="",this._startTarget.draggable="true"===this._startTarget.getAttribute(Et),this._startTarget.removeAttribute(Et),this._startTarget.removeEventListener("dragstart",wt))}releaseInput(t){this._currentCustomDrag&&this._currentCustomDrag.onEnd(),this._resetStartTarget()}}},Symbol.toStringTag,{value:"Module"}));return class extends L{static createPlanner(t,e,s,n=[]){return this._create(t,e,s,n)}static async connect(e,s=[]){const n=new L;n.viewName=e;const{resolve:r,promise:i}=O(),{resolve:a,promise:o}=O(),l=new t("custom-view-"+e,window,window.parent,({message:t,args:e})=>{switch(t){case"registerCustomViewDone":r();break;case"returnMethods":n.handleSetup(e[0]),a();break;default:if(n.isSetupDone)return n.executeMessage({message:t,args:e})}});n.setMessageHandler(l);const c=[e];return l.sendMessage("registerCustomView",c),await i,l.sendMessage("getMethods",c),await o,n.setupPlugins(s,document.body,"custom-view"),await Promise.allSettled(n.pluginsLoaded),n}static createConfigurator(t,e,s,n=[]){return this._create(t,e,s,n)}static create(t,e,s,n){return this._create(t,e,s,n)}static createViewer(t,e,s,n=[]){return this._create(t,e,s,n)}static setupHi(t){window.addEventListener("message",e=>{if("connect_hi"===e.data.type&&e.data.port){const s=e.data.port;s.start?.(),h(t,s)}})}static async _create(t,e,s,n){return new Promise(async(r,i)=>{try{const i=S((()=>{const t=(t=>JSON.parse(JSON.stringify(t)))(M);t.locale||(t.locale=((t=null)=>{const e=window.navigator;if(t)return t.substr(0,2);if(Array.isArray(e.languages)&&e.languages.length>0)return e.languages[0].substr(0,2);for(let t=0,s=T.length;t<s;t++){const s=e[T[t]];if(s)return s.substr(0,2)}return"en"})()),"(idle)"===t.id&&delete t.id;const e=(()=>{const t=(()=>{try{return window.self!==window.top}catch{return!0}})();let e=window.location.href;if(t){if(!document.referrer)return null;e=document.referrer}const{hostname:s}=new URL(e);return s})();return e&&(t=>!!(E.includes(t)||t.endsWith("roomle.com")||t.endsWith("gitlab.io")||t.endsWith("gitlab.com")))(e)&&(t.configuratorId="demoConfigurator"),t.customApiUrl=void 0,t.emails=!1,t})(),(t=>(C(t),t?.customApiUrl&&(t.customApiUrl=decodeURIComponent(t.customApiUrl)),t.shareUrl&&(t.deeplink=t.shareUrl.replace("<CONF_ID>","#CONFIGURATIONID#")),t))(s));(t=>{t.featureFlags||(t.featureFlags={}),"boolean"!=typeof t.featureFlags.realPartList&&(t.featureFlags.realPartList=!0),"boolean"!=typeof t.featureFlags.globalCallbacks&&(t.featureFlags.globalCallbacks=!0),"boolean"!=typeof t.featureFlags.mocAr&&(t.featureFlags.mocAr=!1)})(i);const a=await(async(t,e)=>{if("string"!=typeof t)throw new Error('Configurator ID is not a string type: "'+typeof t+'"');const s=e.customApiUrl?e.customApiUrl:"https://api.roomle.com/v2",n=e.overrideTenant||9,r=s+"/configurators/"+t,i="roomle_portal_v2",a="03-"+window.btoa((new Date).toISOString()+";anonymous;"+i),o=new Request(r,{method:"GET",headers:new Headers({apiKey:i,currentTenant:n,locale:"en",language:"en",device:1,token:a,platform:"web"}),mode:"cors",cache:"default"}),l=await fetch(o),{configurator:c}=await l.json();return c})(t,i);s=((t,e)=>{e.configuratorId=t.id;const s=t.settings||{};return!e.overrideTenant&&t.tenant&&(e.overrideTenant=t.tenant),((t,e)=>{const s=JSON.parse(JSON.stringify(t));return S(s,e)})(s,e)})(a,i);const o=new this(a,e,s,n,r);return await Promise.allSettled(o.pluginsLoaded),o}catch(t){return i(t)}})}_waitForIframe;_container;_configuratorSettings;_initData={};_iframe;constructor(e,s,n,r,i){if(super(),!e||"string"!=typeof e.id)throw new Error("Please provide a correct configuratorId, you get the correct ID from your Roomle Contact Person");if(Y.has(s))throw new Error("There is already an instance on this DOM element");if(!document.getElementById(k)){const t=n.zIndex||9999999,e=document.createElement("style");e.type="text/css",e.id=k;const s="transition:all ease-in-out 450ms;",r=["-webkit-","-o-"].reduce((t,e)=>t+(e+s),"")+s,i=B();e.innerHTML=`\n .${R}{${N}:${i};}\n .${G}{position:fixed;top:0;left:0;z-index:${t};opacity:0}\n .rml-transition{${r}}\n .${U}{width:100%;height:100%;opacity:1}\n .${X}{height:calc(var(${N},1vh)*100)}\n .${j}{overflow:hidden}\n `,document.head.appendChild(e)}this._executeMessage=this._executeMessage.bind(this);const a=new t("website",window,null,this._executeMessage);this.setMessageHandler(a),this._onResize=this._onResize.bind(this),A()&&window.addEventListener("resize",this._onResize),this._container=s,this._initData=n,this._configuratorSettings=e;const o=this._createIframe();this._onUseFullPage=this._onUseFullPage.bind(this),this._onBackToWebsite=this._onBackToWebsite.bind(this),this._waitForIframe=i,this._container.appendChild(o),this._iframe=o,this.setupPlugins(r,this._iframe),Y.set(s,!0)}teardown(){this._container&&Y.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(R),t.classList.add(U),t}_onResize(){F(this._iframe)}_onUseFullPage(){this._iframe.classList.add(G),document.documentElement.classList.add(j),window.document.body.classList.add(j),A()&&(F(this._iframe),this._iframe.classList.add(X))}_onBackToWebsite(){this._iframe.classList.remove(G),this._iframe.classList.remove(X),document.documentElement.classList.remove(j),window.document.body.classList.remove(j)}_executeMessage({message:t,args:e},s){if(s.source&&s.source===this._iframe?.contentWindow)return"requestBoot"===t?this._messageHandler?(this._messageHandler.setOutgoingMessageBus(s.source),Promise.resolve({result:this._initData})):Promise.resolve({error:"MessageHandler not set"}):"setup"===t?(this.handleSetup(e[0]),P(this.ui.callbacks,"onUseFullPage",this._onUseFullPage),P(this.ui.callbacks,"onBackToWebsite",this._onBackToWebsite),this._waitForIframe(this),setTimeout(()=>{this._messageHandler&&this._messageHandler.sendMessage("websiteReady")},0),Promise.resolve({result:null})):this.executeMessage({message:t,args:e})}}},"object"==typeof exports&&typeof module<"u"?module.exports=e():"function"==typeof define&&define.amd?define(e):((t=typeof globalThis<"u"?globalThis:t||self)["roomle-embedding-lib"]=t["roomle-embedding-lib"]||{},t["roomle-embedding-lib"].umd=t["roomle-embedding-lib"].umd||{},t["roomle-embedding-lib"].umd.min=t["roomle-embedding-lib"].umd.min||{},t["roomle-embedding-lib"].umd.min.js=e());
1
+ var t,e;t=this,e=function(){"use strict";class t{_side;_incomingMessageBus=null;_outgoingMessageBus=null;_execMessage=null;constructor(t,e,s,n){this._side=t,this._incomingMessageBus=e,this._outgoingMessageBus=s,this._execMessage=n,this._incomingMessageBus&&this._incomingMessageBus.addEventListener("message",this._handleMessage.bind(this))}setOutgoingMessageBus(t){this._outgoingMessageBus=t}setMessageExecution(t){this._execMessage=t}sendMessage(t,e=[]){return new Promise((s,n)=>{if(this._incomingMessageBus===this._outgoingMessageBus)return s(void 0);const r=new MessageChannel;r.port1.onmessage=t=>{if(!t||!t.data)return r.port1.close(),r.port2.close(),n(new Error(this._side+" received message but response can not be interpreted"));let e;try{e=JSON.parse(t.data)}catch(t){return r.port1.close(),r.port2.close(),this._prepareError(t),n(t)}e.error?n(e.error):void 0!==e.result?s(e.result):s(void 0),r.port1.close(),r.port2.close()};let i="";try{i=JSON.stringify({message:t,args:e})}catch{return n(new Error(this._side+": can not create command because it is not JSON.stringify able"))}if(!this._outgoingMessageBus)return n(new Error(this._side+": outgoing bus not set yet"));this._outgoingMessageBus.postMessage(i,"*",[r.port2])})}_handleMessage(t){const e=t.ports&&Array.isArray(t.ports)&&t.ports.length>0?t.ports[0]:null;if(t.data&&("string"==typeof t.data||"connect_hi"!==t.data.type)&&e)try{const s=JSON.parse(t.data);if(!this._execMessage)return e.postMessage(JSON.stringify({error:this._side+" is not ready to handle messages"}));Array.isArray(s.args)||(s.args=[s.args]);const n=this._execMessage(s,t);if(void 0===n)return;n.then((t={})=>{let s,n;"object"==typeof t&&null!==t&&(s=t.error,n=t.result),s?e.postMessage(JSON.stringify({error:s})):void 0!==n?e.postMessage(JSON.stringify({result:n})):e.postMessage(JSON.stringify({result:t}))},t=>{e.postMessage(JSON.stringify({error:this._prepareError(t)}))})}catch(t){e.postMessage(JSON.stringify({error:this._prepareError(t)}))}}_prepareError(t){return"string"==typeof t?this._side+": "+t:(t.message=this._side+": "+t.message,t.message)}}const e=Symbol("Comlink.proxy"),s=Symbol("Comlink.endpoint"),n=Symbol("Comlink.releaseProxy"),r=Symbol("Comlink.finalizer"),i=Symbol("Comlink.thrown"),a=t=>"object"==typeof t&&null!==t||"function"==typeof t,o={canHandle:t=>a(t)&&t[e],serialize(t){const{port1:e,port2:s}=new MessageChannel;return h(t,e),[s,[s]]},deserialize:t=>(t.start(),function(t){const e=new Map;return t.addEventListener("message",function(t){const{data:s}=t;if(!s||!s.id)return;const n=e.get(s.id);if(n)try{n(s)}finally{e.delete(s.id)}}),p(t,e,[],void 0)}(t))},l={canHandle:t=>a(t)&&i in t,serialize({value:t}){let e;return e=t instanceof Error?{isError:!0,value:{message:t.message,name:t.name,stack:t.stack}}:{isError:!1,value:t},[e,[]]},deserialize(t){throw t.isError?Object.assign(new Error(t.value.message),t.value):t.value}},c=new Map([["proxy",o],["throw",l]]);function h(t,s=globalThis,n=["*"]){s.addEventListener("message",function a(o){if(!o||!o.data)return;if(!function(t,e){for(const s of t)if(e===s||"*"===s||s instanceof RegExp&&s.test(e))return!0;return!1}(n,o.origin))return;const{id:l,type:c,path:g}=Object.assign({path:[]},o.data),d=(o.data.argumentList||[]).map(w);let m;try{const s=g.slice(0,-1).reduce((t,e)=>t[e],t),n=g.reduce((t,e)=>t[e],t);switch(c){case"GET":m=n;break;case"SET":s[g.slice(-1)[0]]=w(o.data.value),m=!0;break;case"APPLY":m=n.apply(s,d);break;case"CONSTRUCT":m=function(t){return Object.assign(t,{[e]:!0})}(new n(...d));break;case"ENDPOINT":{const{port1:e,port2:s}=new MessageChannel;h(t,s),m=function(t,e){return b.set(t,e),t}(e,[e])}break;case"RELEASE":m=void 0;break;default:return}}catch(t){m={value:t,[i]:0}}Promise.resolve(m).catch(t=>({value:t,[i]:0})).then(e=>{const[n,i]=v(e);s.postMessage(Object.assign(Object.assign({},n),{id:l}),i),"RELEASE"===c&&(s.removeEventListener("message",a),u(s),r in t&&"function"==typeof t[r]&&t[r]())}).catch(t=>{const[e,n]=v({value:new TypeError("Unserializable return value"),[i]:0});s.postMessage(Object.assign(Object.assign({},e),{id:l}),n)})}),s.start&&s.start()}function u(t){(function(t){return"MessagePort"===t.constructor.name})(t)&&t.close()}function g(t){if(t)throw new Error("Proxy has been released and is not useable")}function d(t){return D(t,new Map,{type:"RELEASE"}).then(()=>{u(t)})}const m=new WeakMap,_="FinalizationRegistry"in globalThis&&new FinalizationRegistry(t=>{const e=(m.get(t)||0)-1;m.set(t,e),0===e&&d(t)});function p(t,e,r=[],i=function(){}){let a=!1;const o=new Proxy(i,{get(s,i){if(g(a),i===n)return()=>{(function(t){_&&_.unregister(t)})(o),d(t),e.clear(),a=!0};if("then"===i){if(0===r.length)return{then:()=>o};const s=D(t,e,{type:"GET",path:r.map(t=>t.toString())}).then(w);return s.then.bind(s)}return p(t,e,[...r,i])},set(s,n,i){g(a);const[o,l]=v(i);return D(t,e,{type:"SET",path:[...r,n].map(t=>t.toString()),value:o},l).then(w)},apply(n,i,o){g(a);const l=r[r.length-1];if(l===s)return D(t,e,{type:"ENDPOINT"}).then(w);if("bind"===l)return p(t,e,r.slice(0,-1));const[c,h]=y(o);return D(t,e,{type:"APPLY",path:r.map(t=>t.toString()),argumentList:c},h).then(w)},construct(s,n){g(a);const[i,o]=y(n);return D(t,e,{type:"CONSTRUCT",path:r.map(t=>t.toString()),argumentList:i},o).then(w)}});return function(t,e){const s=(m.get(e)||0)+1;m.set(e,s),_&&_.register(t,e,t)}(o,t),o}function f(t){return Array.prototype.concat.apply([],t)}function y(t){const e=t.map(v);return[e.map(t=>t[0]),f(e.map(t=>t[1]))]}const b=new WeakMap;function v(t){for(const[e,s]of c)if(s.canHandle(t)){const[n,r]=s.serialize(t);return[{type:"HANDLER",name:e,value:n},r]}return[{type:"RAW",value:t},b.get(t)||[]]}function w(t){switch(t.type){case"HANDLER":return c.get(t.name).deserialize(t.value);case"RAW":return t.value}}function D(t,e,s,n){return new Promise(r=>{const i=new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");e.set(i,r),t.start&&t.start(),t.postMessage(Object.assign({id:i},s),n)})}const E=["127.0.0.1","localhost","0.0.0.0"],T=["language","browserLanguage","userLanguage","systemLanguage"],S=(t,e)=>{for(const s in e)try{e[s].constructor===Object?t[s]=S(t[s],e[s]):t[s]=e[s]}catch{t[s]=e[s]}return t};var x,I=((x=I||{}).BOTTOM_BAR="bottom_bar",x.PARTLIST_BOUNDS="partlist_bounds",x.INTERACTION_NOTES="interaction_notes",x.PARAMETER_GROUPS="parameter_groups",x);const M={mobileLandscape:!0,floorMaterialRootTag:"materials_root",buttons:{renderimage:!0,requestproduct:!0,requestplan:!0,load_product:!0,partlist_print:!0},elements:{[I.INTERACTION_NOTES]:!0},helpcenter:{roomdesigner:!0,configurator:!1,disable:!1},firstPersonView:!0,saveToIdb:!0,featureFlags:{mocAr:!0,wallAutoHeight:!1,openCloseAnimation:!0,enableTwoLevelCatalog:!1},rotationSnapDegrees:10,interactionsCollapsed:!1},C=t=>{if(!t)return;const e=Object.keys(t);for(const s of e){const e=t[s];if(!Array.isArray(e)&&"object"==typeof e&&null!==e&&C(e),Array.isArray(e))for(const t of e)C(t);("true"===e||"false"===e)&&(t[s]="true"===e)}},A=()=>/(android)/i.test(navigator.userAgent);class L{_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:s}=t;e.forEach(t=>{const e=t.split("."),s=e[0],n=e[1];this[s]||(this[s]={}),this[s][n]=function(){if(this._messageHandler)return this._messageHandler.sendMessage(t,[...arguments])}.bind(this)}),s.forEach(t=>{const e=t.split("."),s=e[0],n=e[1],r=e[2];this[s]||(this[s]={}),this[s][n]||(this[s][n]={}),this[s][n][r]=()=>{}}),this.isSetupDone=!0}executeMessage({message:t,args:e}){const s=t.split("."),n=s[0],r=s[1],i=3===s.length?s[2]:null;if(i&&this[n][r][i]){const t=this[n][r][i](...e);return t instanceof Promise?t.then(t=>({result:t})):void 0!==t?Promise.resolve({result:t}):Promise.resolve({result:null})}return Promise.reject('Message "'+t+'" is unkown')}setupPlugins(t,e,s="website"){for(const n of t)"string"==typeof n&&"dragIn"===n?this.pluginsLoaded.push(new Promise((t,n)=>{try{Promise.resolve().then(()=>it).then(({DragIn:r})=>{const i=new r(this.ui,e,s,this.viewName);i.init().then(()=>{this.plugins.dragIn=i,t()},n)})}catch(t){n(t)}})):n.name&&n.loader&&this.pluginsLoaded.push(new Promise((t,r)=>{try{n.loader().then(i=>{const a=new i(this.ui,e,s,this.viewName);a.init().then(()=>{this.plugins[n.name]=a,t()},r)})}catch(t){r(t)}}))}}const O=()=>{let t,e;return{promise:new Promise((s,n)=>{t=s,e=n}),resolve:t,reject:e}},P=(t,e,s)=>{let n=null;Object.defineProperty(t,e,{get:()=>n||s,set(t){n=t?.mute?t.value:t}})},B=()=>.01*window.innerHeight+"px",F=t=>{t&&setTimeout(()=>t.style.setProperty(N,B()),0)},k="rml-styles",N="--rml-full-height",R="rml-container",U="rml-fill",G="rml-pos",X="rml-android-height",j="rml-overflow-hidden",Y=new Map;class z{_mainDomElement;_instance;_mode="website";_viewName="main";constructor(t,e,s,n){this._instance=t,this._mainDomElement=e,this._mode=s,this._viewName=n}async init(){return Promise.resolve()}}const $="rml-drag-in-styles",H="rml-drag-in-drag-element",W="rml-drag-in-overlay",q="rml-drag-in-drag-ghost",J="rml-drag-in-fade-in",K="rml-drag-in-fade-out",V="rml-display-none",Q="250ms",Z="forwards",tt=`@keyframes ${J} {from{opacity: 0;}to {opacity: 0.5;}}`,et=`@keyframes ${K} {from{opacity: 0.5;}to {opacity: 0;}}`,st=`${J} ${Q} ${Z}`,nt=`${K} ${Q} ${Z}`,rt="https://res.cloudinary.com/roomle/image/upload/v1729679975/fallback_afpyqr.jpg",it=Object.freeze(Object.defineProperty({__proto__:null,DragIn:class extends z{options={};_customDragSignal=new AbortController;_injectStyles(){if(!document.getElementById($)){const t=document.createElement("style");t.type="text/css",t.id=$,t.innerHTML=`\n .${V}{display:none}\n .${W}{position:absolute;top:0;left:0;width:100%;height:100%;z-index:999;}\n .${q}{position:absolute;top:0;left:0;width:1px;height:1px;z-index:999;pointer-events:none;background-color:transparent;}\n ${tt}\n ${et}\n `,document.head.appendChild(t)}}_initializeDragGhost(){const t=this._mainDomElement.parentNode;let e=t.querySelector("."+q);e||(e=document.createElement("div"),e.classList.add(q),e.innerText=" ",t.appendChild(e))}constructor(t,e,s,n){super(t,e,s,n),this._mainDomElement=e,this._injectStyles(),this._initializeDragGhost()}async init(){if(await super.init(),"website"===this._mode)try{const{DragInFromWebsiteStrategy:t}=await Promise.resolve().then(()=>vt);this._strategy=new t(this._instance,this._mainDomElement,{settings:this.options,mode:"website"})}catch(t){throw t}else{if("custom-view"!==this._mode)throw new Error("Unsupported mode");try{const{DragInFromCustomViewStrategy:t}=await Promise.resolve().then(()=>St);this._strategy=new t(this._instance,this._mainDomElement,this.options,this._viewName)}catch(t){throw t}}}get isDragging(){return this._strategy.isDragging}dragStart(t,e,s="rml_id"){this._strategy.dragStart(t,e,s)}dragUpdate(t){this._strategy.dragUpdate(t)}dragEnd(){this._strategy.dragEnd()}touchStart(t,e,s="rml_id"){this._strategy.touchStart(t,e,s)}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:s,beforeUpdateGhost:n}){n&&this._strategy.beforeUpdateGhost(n);const r=this._customDragSignal.signal,i=e=>{"true"===e.target.getAttribute("data-rml-draggable")&&t(e)},a=t=>{this._strategy.releaseInput(t),this._strategy.isDragging&&e(t)},o=t=>{s(t)};document.querySelectorAll('[data-rml-draggable="true"]').forEach(t=>{t.draggable=!1}),document.addEventListener("mousedown",i,{signal:r}),document.addEventListener("mouseup",a,{signal:r}),document.addEventListener("mousemove",o,{signal:r}),document.addEventListener("mouseleave",a,{signal:r}),document.addEventListener("touchstart",i,{signal:r}),document.addEventListener("touchend",a,{signal:r}),document.addEventListener("touchmove",o,{signal:r})}unregisterCustomDrag(){this._customDragSignal.abort(),this._customDragSignal=new AbortController}releaseInput(t){this._strategy.releaseInput(t)}}},Symbol.toStringTag,{value:"Module"}));class at{_computedStyleCache=new Map;_maxLifetime=16;_cacheCleanInterval=null;constructor(t=16){this._maxLifetime=t}get(t){const e=this._computedStyleCache.get(t),s=Date.now();if(e&&s-e.updated<this._maxLifetime)return e.style;const n=getComputedStyle(t);return this._computedStyleCache.set(t,{style:n,updated:s}),this._cacheCleanInterval||(this._cacheCleanInterval=setInterval(()=>this._cleanUpCache,Math.max(1e3*this._maxLifetime,5e3))),n}_cleanUpCache(){const t=Date.now();for(const[e,{updated:s}]of this._computedStyleCache.entries())t-s>=this._maxLifetime&&this._computedStyleCache.delete(e);0===this._computedStyleCache.size&&this._cacheCleanInterval&&(clearInterval(this._cacheCleanInterval),this._cacheCleanInterval=null)}}const ot=t=>window.TouchEvent&&t instanceof window.TouchEvent;let lt;const ct=t=>(lt||(lt=new at),lt.get(t)),ht=(t,e,s)=>{const n=parseFloat(t),r=window.devicePixelRatio||1;if("px"===e)return n;if("%"===e)return n/100*(s===document.documentElement?window.innerWidth:s.offsetWidth);if("rem"===e)return n*parseFloat(ct(document.documentElement).fontSize);if("em"===e)return n*parseFloat(ct(s).fontSize);if("vh"===e||"vw"===e||"vmin"===e||"vmax"===e)return n/100*{vh:window.innerHeight,vw:window.innerWidth,vmin:Math.min(window.innerWidth,window.innerHeight),vmax:Math.max(window.innerWidth,window.innerHeight)}[e];const i={cm:37.7952755906,mm:3.77952755906,in:96};return e in i?n*i[e]*r:0},ut=(t,e,s={x:0,y:0})=>{const n=t.getBoundingClientRect(),r=ct(t).transform;let i=0,a=0;if("none"!==r){const e=/translate\(\s*([-+]?\d*\.?\d+|\d+)(px|%)?,?\s*([-+]?\d*\.?\d+|\d+)?(px|%)?\s*\)/,s=r.match(e);s&&(i=ht(s[1],s[2],t),a=ht(s[3],s[4],t))}const{clientX:o,clientY:l}=gt(e,s);return{x:o-n.left-i+t.scrollLeft,y:l-n.top-a+t.scrollTop}},gt=(t,e=null)=>{const{clientX:s,clientY:n}=ot(t)?dt(t):t;return{clientX:s>0?s:e?e.x:s,clientY:n>0?n:e?e.y:n}},dt=t=>{if(t.touches.length){let{clientX:e,clientY:s}=t.touches[0];if(t.touches.length>1){const n=t.touches[1];e=(e+n.clientX)/2,s=(s+n.clientY)/2}return{clientX:e,clientY:s}}const e=t.changedTouches[0];return{clientX:e.clientX,clientY:e.clientY}},mt=(t,e=0)=>ot(t)?{clientX:t.touches[e].clientX,clientY:t.touches[e].clientY}:{clientX:t.clientX,clientY:t.clientY},_t=t=>!t||!ot(t)||t.touches.length>0;class pt{_touchDragTimeOut;_onTouchDragStart;_payload=null;_delay=500;_firstTouch=null;_lastTouch=null;_epsilon=10;constructor(t,{onTouchDragStart:e},s={}){this._payload=t,this._onTouchDragStart=e,this._delay="number"==typeof s.delay?s.delay:500,this._epsilon="number"==typeof s.epsilon?s.epsilon:10}onStart(t){_t(t)&&(this._touchDragTimeOut||(this._firstTouch=mt(t,ot(t)?t.touches.length-1:0),this._touchDragTimeOut=setTimeout(()=>{this._clearTimeout(),this._lastTouch||(this._lastTouch=mt(t)),this._checkXDistance(t)()},this._delay)))}onEnd(){this._resetTouches()}onMove(t){_t(t)&&(this._lastTouch=mt(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 ft=(t,e,s=0,n=0)=>{const r=e.x+e.width+s,i=e.x-s,a=e.y+e.height+n,o=e.y-n,{x:l,y:c}=t;return l>=i&&l<=r&&c>=o&&c<=a},yt=(t,e,s,n=0,r=0)=>{if(s&&(s.hiddenIn||s.visibleIn))return s.visibleIn?ft({x:t,y:e},s.visibleIn,n,r):!!s.hiddenIn&&!ft({x:t,y:e},s.hiddenIn,-n,-r)};class bt{_dragGhostAnimationFrameId=null;_dragGhostRemoveAnimationFrameId=null;_dragGhostElement=null;constructor(t=null){this._dragGhostElement=t}updateDragGhost(t,e,s){this._dragGhostRemoveAnimationFrameId&&(cancelAnimationFrame(this._dragGhostRemoveAnimationFrameId),this._dragGhostRemoveAnimationFrameId=null),!s.ghost?.external&&s.ghost&&(this._dragGhostAnimationFrameId||(this._dragGhostAnimationFrameId=requestAnimationFrame(()=>{(()=>{if(!document.getElementById($)){const t=document.createElement("style");t.type="text/css",t.id=$,t.innerHTML=`\n ${tt}\n ${et}\n `,document.head.appendChild(t)}})();const n={x:t,y:e};!s.ghost&&this._dragGhostElement&&(s.ghost={}),s.ghost&&!s.ghost.element&&this._dragGhostElement&&(s.ghost.element=this._dragGhostElement),(({x:t,y:e},s)=>{let n=document.getElementById(H);if(!n){if(n=document.createElement("div"),s.ghost?.element)n.appendChild(s.ghost.element);else{const t=document.createElement("img");t.src=s.ghost?.url||rt,t.width=s.ghost?.width||112,t.height=s.ghost?.height||112,n.appendChild(t)}n.id=H,n.style.position="fixed",n.style.top="0",n.style.left="0",n.style.willChange="transform",n.style.transform="translate3d(0, 0, 0)",n.style.zIndex="9999",n.style.opacity="0.5",yt(t,e,s.ghost||{},s.settings?.dragInOverlapX,s.settings?.dragInOverlapY)||(n.style.display="none"),n.style.pointerEvents="none",document.body.appendChild(n)}})(n,s),(({x:t,y:e},s)=>{const n=document.getElementById(H);if(!n)return;let r=s.ghost?.width,i=s.ghost?.height;typeof r>"u"&&(r=n.getBoundingClientRect().width||112),typeof i>"u"&&(i=n.getBoundingClientRect().height||112);const a=t-r/2,o=e-i/2;n.style.transform=`translate3d(${a}px, ${o}px, 0)`,s.ghost&&(yt(t,e,s.ghost,s.settings?.dragInOverlapX,s.settings?.dragInOverlapY)?n.style.animation!=st&&(n.style.animation=st):n.style.animation!=nt&&(n.style.animation=nt))})(n,s),this._dragGhostAnimationFrameId=null})))}removeDragGhost(){this._dragGhostAnimationFrameId&&(cancelAnimationFrame(this._dragGhostAnimationFrameId),this._dragGhostAnimationFrameId=null),this._dragGhostRemoveAnimationFrameId||(this._dragGhostRemoveAnimationFrameId=requestAnimationFrame(()=>{const t=document.getElementById(H);t&&document.body.removeChild(t),this._dragGhostRemoveAnimationFrameId=null}))}}const vt=Object.freeze(Object.defineProperty({__proto__:null,DragInFromWebsiteStrategy:class{_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,s){this._instance=t,this._mainDomElement=e,this._options=s||{},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,s="rml_id"){const n=this._mainDomElement.parentNode;if("relative"!==ct(n).position)return;this._mainDomElement.style.pointerEvents="none";let r=n.querySelector("."+W);r||(r=document.createElement("div"),r.classList.add(W),n.appendChild(r)),r.classList.remove(V),e.target.getAttribute("draggable");const i=n.querySelector("."+q);this._currentDrag.event=e;const a=e.target,o=a.cloneNode(!0),l=a.getBoundingClientRect();o.style.width=`${l.width}px`,o.style.height=`${l.height}px`,this._currentDrag.ghost=new bt(o),this._currentDrag.offset||(this._currentDrag.offset={x:0,y:0});const{clientX:c,clientY:h}=gt(e,this._firefoxDragPosition);this._currentDrag.offset.x=c-l.left,this._currentDrag.offset.y=h-l.top,e instanceof DragEvent&&e.dataTransfer&&e.dataTransfer.setDragImage&&e.dataTransfer.setDragImage(i,0,0);const{x:u,y:g}=ut(n,this._currentDrag.event||e,this._firefoxDragPosition),d=Math.max(1,u),m=Math.max(1,g);this.isDragging=!0,this._instance.dragInObject(t,d,m,s)}dragUpdate(t){const e=this._mainDomElement.parentNode,{x:s,y:n}=ut(e,t,this._firefoxDragPosition);if(0===s&&0===n)return;const r=Math.max(1,s),i=Math.max(1,n);if(1===r&&1===i)return;let a=r,o=i;if(ot(t)){const t=this._options.settings?.fingerSize||0;a=Math.max(2,r+t),o=Math.max(2,i-t)}const{x:l,y:c,options:h}=this._onBeforeUpdateDrag(a,o,{}),u=h||{settings:{},ghost:{}};u.ghost||(u.ghost={}),u.ghost.visibleIn&&u.ghost.hiddenIn||(u.ghost.hiddenIn=this._mainDomElement.getBoundingClientRect());const g="number"==typeof l?l:a,d="number"==typeof c?c:o;if(this._currentDrag.ghost){const{clientX:e,clientY:s}=gt(t,this._firefoxDragPosition);this._currentDrag.ghost.updateDragGhost(e,s,u)}this._instance.updateDrag(g,d,{})}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("."+W);e&&e.classList.add(V)}touchStart(t,e,s="rml_id"){e.preventDefault();const n={};"number"==typeof this._options?.settings?.touchDragDelay&&(n.delay=this._options.settings.touchDragDelay),this._options?.settings?.touchDragEpsilon&&(n.epsilon=this._options.settings.touchDragEpsilon),this._currentTouch=new pt(void 0,{onTouchDragStart:(e,n)=>{this.dragStart(t,n,s)}},n),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){}}},Symbol.toStringTag,{value:"Module"})),wt=t=>{t.preventDefault(),t.stopPropagation()};class Dt{_startX=0;_startY=0;_lastX=0;_lastY=0;_epsilon;_isWaiting=!1;_onCustomDragStart;constructor({onCustomDragStart:t},e={}){this._epsilon="number"==typeof e.epsilon?e.epsilon:15,this._onCustomDragStart=t}onMove(t){this._lastX=t.clientX,this._lastY=t.clientY,this._isWaiting&&((t,e)=>{const s=this._lastX-t,n=this._lastY-e;return Math.sqrt(s*s+n*n)})(this._startX,this._startY)>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 Et="data-rml-old-draggable",Tt=(t,e)=>{const s=ot(t),n={delay:s?500:100,epsilon:s?10:15};if(!e)return n;if(!(s||t instanceof MouseEvent))return n;const{delayKey:r,epsilonKey:i}=s?{delayKey:"touchDragDelay",epsilonKey:"touchDragEpsilon"}:{delayKey:"customDragDelay",epsilonKey:"customDragEpsilon"};return"number"==typeof e[r]&&(n.delay=e.touchDragDelay),"number"==typeof e[i]&&(n.epsilon=e.touchDragEpsilon),n},St=Object.freeze(Object.defineProperty({__proto__:null,DragInFromCustomViewStrategy:class{_options={};_instance;_mainDomElement;_viewName;_currentCustomDrag=null;_currentBb=null;_startTarget=null;_onBeforeUpdateDrag=()=>({});isDragging=!1;constructor(t,e,s,n){this._instance=t,this._options=s||{},this._viewName=n,this._mainDomElement=e,this._mainDomElement.parentElement?.addEventListener("dragleave",()=>{this._instance.cancelDragIn()})}beforeUpdateGhost(t){this._onBeforeUpdateDrag=t}async _dragStart(t,e,s="rml_id"){this._startTarget&&(this._startTarget.style.pointerEvents="none",this._startTarget.style.userSelect="none",this._startTarget.setAttribute(Et,this._startTarget.draggable.toString()),this._startTarget.draggable=!1,this._startTarget.removeEventListener("dragstart",wt),this._startTarget.addEventListener("dragstart",wt)),this._currentBb=await this._instance.getBoundingClientRect((()=>`[data-rml-custom-view="${this._viewName}"]`)());const{clientX:n,clientY:r}=gt(e),i=this._currentBb.x+n,a=this._currentBb.y+r;this.isDragging=!0,this._instance.dragInObject(t,i,a,s)}_dragUpdate(t){if(document.body.focus(),this._currentCustomDrag&&this._currentCustomDrag.onMove(t),!this._currentBb||!this.isDragging)return;const{clientX:e,clientY:s}=gt(t),{url:n,width:r,height:i}=(t=>{let e="",s=112,n=112;if(!t)return{url:rt,width:s,height:n};const r=t;if(r instanceof HTMLElement){const t=r.getBoundingClientRect(),i=r.getAttribute("data-rml-ghost-url"),a=r.getAttribute("data-rml-ghost-width"),o=r.getAttribute("data-rml-ghost-height");i?e=i:!i&&r instanceof HTMLImageElement&&r.src&&(e=r.src),e?(s=t.width,n=t.height):e=rt,s=a?parseInt(a,10):s,n=o?parseInt(o,10):n}return{url:e||rt,width:s,height:n}})(this._startTarget),a=this._currentBb.x+e,o=this._currentBb.y+s,l=this._options||{},c={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:r,height:i},mode:"custom-view"},{x:h,y:u,options:g}=this._onBeforeUpdateDrag(a,o,c),d="number"==typeof h?h:a,m="number"==typeof u?u:o,_=g||c;this._instance.updateDrag(d,m,_)}_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,s){this._instance.disableEvents(),this._startTarget=e.target,this._currentCustomDrag=ot(e)?new pt(void 0,{onTouchDragStart:(e,n)=>{this._dragStart(t,n,s)}},Tt(e,this._options)):new Dt({onCustomDragStart:e=>this._dragStart(t,e,s)},Tt(e,this._options)),this._currentCustomDrag.onStart(e)}dragEnd(){this._dragEnd()}dragUpdate(t){this._dragUpdate(t)}touchStart(t,e,s="rml_id"){this.dragStart(t,e,s)}touchMove(t){this.dragUpdate(t)}touchEnd(){this.dragEnd()}dispose(){}_resetStartTarget(){this._startTarget&&(this._startTarget.style.pointerEvents="",this._startTarget.style.userSelect="",this._startTarget.draggable="true"===this._startTarget.getAttribute(Et),this._startTarget.removeAttribute(Et),this._startTarget.removeEventListener("dragstart",wt))}releaseInput(t){this._currentCustomDrag&&this._currentCustomDrag.onEnd(),this._resetStartTarget()}}},Symbol.toStringTag,{value:"Module"}));return class extends L{static createPlanner(t,e,s,n=[]){return this._create(t,e,s,n)}static async connect(e,s=[]){const n=new L;n.viewName=e;const{resolve:r,promise:i}=O(),{resolve:a,promise:o}=O(),l=new t("custom-view-"+e,window,window.parent,({message:t,args:e})=>{switch(t){case"registerCustomViewDone":r();break;case"returnMethods":n.handleSetup(e[0]),a();break;default:if(n.isSetupDone)return n.executeMessage({message:t,args:e})}});n.setMessageHandler(l);const c=[e];return l.sendMessage("registerCustomView",c),await i,l.sendMessage("getMethods",c),await o,n.setupPlugins(s,document.body,"custom-view"),await Promise.allSettled(n.pluginsLoaded),n}static createConfigurator(t,e,s,n=[]){return this._create(t,e,s,n)}static create(t,e,s,n){return this._create(t,e,s,n)}static createViewer(t,e,s,n=[]){return this._create(t,e,s,n)}static setupHi(t){window.addEventListener("message",e=>{if("connect_hi"===e.data.type&&e.data.port){const s=e.data.port;s.start?.(),h((t=>new Proxy(t,{get(t,e,s){const n=Reflect.get(t,e,s);return void 0!==n?n:(...t)=>{}}}))(t),s)}})}static async _create(t,e,s,n){return new Promise(async(r,i)=>{try{const i=S((()=>{const t=(t=>JSON.parse(JSON.stringify(t)))(M);t.locale||(t.locale=((t=null)=>{const e=window.navigator;if(t)return t.substr(0,2);if(Array.isArray(e.languages)&&e.languages.length>0)return e.languages[0].substr(0,2);for(let t=0,s=T.length;t<s;t++){const s=e[T[t]];if(s)return s.substr(0,2)}return"en"})()),"(idle)"===t.id&&delete t.id;const e=(()=>{const t=(()=>{try{return window.self!==window.top}catch{return!0}})();let e=window.location.href;if(t){if(!document.referrer)return null;e=document.referrer}const{hostname:s}=new URL(e);return s})();return e&&(t=>!!(E.includes(t)||t.endsWith("roomle.com")||t.endsWith("gitlab.io")||t.endsWith("gitlab.com")))(e)&&(t.configuratorId="demoConfigurator"),t.customApiUrl=void 0,t.emails=!1,t})(),(t=>(C(t),t?.customApiUrl&&(t.customApiUrl=decodeURIComponent(t.customApiUrl)),t.shareUrl&&(t.deeplink=t.shareUrl.replace("<CONF_ID>","#CONFIGURATIONID#")),t))(s));(t=>{t.featureFlags||(t.featureFlags={}),"boolean"!=typeof t.featureFlags.realPartList&&(t.featureFlags.realPartList=!0),"boolean"!=typeof t.featureFlags.globalCallbacks&&(t.featureFlags.globalCallbacks=!0),"boolean"!=typeof t.featureFlags.mocAr&&(t.featureFlags.mocAr=!1)})(i);const a=await(async(t,e)=>{if("string"!=typeof t)throw new Error('Configurator ID is not a string type: "'+typeof t+'"');const s=e.customApiUrl?e.customApiUrl:"https://api.roomle.com/v2",n=e.overrideTenant||9,r=s+"/configurators/"+t,i="roomle_portal_v2",a="03-"+window.btoa((new Date).toISOString()+";anonymous;"+i),o=new Request(r,{method:"GET",headers:new Headers({apiKey:i,currentTenant:n,locale:"en",language:"en",device:1,token:a,platform:"web"}),mode:"cors",cache:"default"}),l=await fetch(o),{configurator:c}=await l.json();return c})(t,i);s=((t,e)=>{e.configuratorId=t.id;const s=t.settings||{};return!e.overrideTenant&&t.tenant&&(e.overrideTenant=t.tenant),((t,e)=>{const s=JSON.parse(JSON.stringify(t));return S(s,e)})(s,e)})(a,i);const o=new this(a,e,s,n,r);return await Promise.allSettled(o.pluginsLoaded),o}catch(t){return i(t)}})}_waitForIframe;_container;_configuratorSettings;_initData={};_iframe;constructor(e,s,n,r,i){if(super(),!e||"string"!=typeof e.id)throw new Error("Please provide a correct configuratorId, you get the correct ID from your Roomle Contact Person");if(Y.has(s))throw new Error("There is already an instance on this DOM element");if(!document.getElementById(k)){const t=n.zIndex||9999999,e=document.createElement("style");e.type="text/css",e.id=k;const s="transition:all ease-in-out 450ms;",r=["-webkit-","-o-"].reduce((t,e)=>t+(e+s),"")+s,i=B();e.innerHTML=`\n .${R}{${N}:${i};}\n .${G}{position:fixed;top:0;left:0;z-index:${t};opacity:0}\n .rml-transition{${r}}\n .${U}{width:100%;height:100%;opacity:1}\n .${X}{height:calc(var(${N},1vh)*100)}\n .${j}{overflow:hidden}\n `,document.head.appendChild(e)}this._executeMessage=this._executeMessage.bind(this);const a=new t("website",window,null,this._executeMessage);this.setMessageHandler(a),this._onResize=this._onResize.bind(this),A()&&window.addEventListener("resize",this._onResize),this._container=s,this._initData=n,this._configuratorSettings=e;const o=this._createIframe();this._onUseFullPage=this._onUseFullPage.bind(this),this._onBackToWebsite=this._onBackToWebsite.bind(this),this._waitForIframe=i,this._container.appendChild(o),this._iframe=o,this.setupPlugins(r,this._iframe),Y.set(s,!0)}teardown(){this._container&&Y.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(R),t.classList.add(U),t}_onResize(){F(this._iframe)}_onUseFullPage(){this._iframe.classList.add(G),document.documentElement.classList.add(j),window.document.body.classList.add(j),A()&&(F(this._iframe),this._iframe.classList.add(X))}_onBackToWebsite(){this._iframe.classList.remove(G),this._iframe.classList.remove(X),document.documentElement.classList.remove(j),window.document.body.classList.remove(j)}_executeMessage({message:t,args:e},s){if(s.source&&s.source===this._iframe?.contentWindow)return"requestBoot"===t?this._messageHandler?(this._messageHandler.setOutgoingMessageBus(s.source),Promise.resolve({result:this._initData})):Promise.resolve({error:"MessageHandler not set"}):"setup"===t?(this.handleSetup(e[0]),P(this.ui.callbacks,"onUseFullPage",this._onUseFullPage),P(this.ui.callbacks,"onBackToWebsite",this._onBackToWebsite),this._waitForIframe(this),setTimeout(()=>{this._messageHandler&&this._messageHandler.sendMessage("websiteReady")},0),Promise.resolve({result:null})):this.executeMessage({message:t,args:e})}}},"object"==typeof exports&&typeof module<"u"?module.exports=e():"function"==typeof define&&define.amd?define(e):((t=typeof globalThis<"u"?globalThis:t||self)["roomle-embedding-lib"]=t["roomle-embedding-lib"]||{},t["roomle-embedding-lib"].umd=t["roomle-embedding-lib"].umd||{},t["roomle-embedding-lib"].umd.min=t["roomle-embedding-lib"].umd.min||{},t["roomle-embedding-lib"].umd.min.js=e());
@@ -1,3 +1,7 @@
1
+ import { PlannerUiState } from '../../planner/store/planner-ui-state';
2
+ import { SdkConnector } from '../../configurator/business-logic/sdk-connector';
3
+
4
+ export declare const isDeleteElementPossible: (sdkConnector: SdkConnector, plannerUiState: PlannerUiState) => Promise<any>;
1
5
  export declare const usePlannerActionsVisibility: () => {
2
6
  showStartConfiguring: import('vue').ComputedRef<boolean>;
3
7
  showActionButtons: import('vue').ComputedRef<boolean>;
@@ -8,6 +8,7 @@ export declare const VIEW_MODES: {
8
8
  };
9
9
  export declare const useCommonUiStore: import('pinia').StoreDefinition<"commonUiStore", Pick<{
10
10
  showFlyingMenu: import('vue').Ref<boolean, boolean>;
11
+ isLoadingCatalog: import('vue').Ref<boolean, boolean>;
11
12
  flyingMenuTriggeredByClick: import('vue').Ref<boolean, boolean>;
12
13
  isInIframe: import('vue').Ref<boolean, boolean>;
13
14
  isViewOnly: import('vue').Ref<boolean, boolean>;
@@ -65,8 +66,9 @@ export declare const useCommonUiStore: import('pinia').StoreDefinition<"commonUi
65
66
  setDraggingElementStatus: (isDragging: boolean) => void;
66
67
  setMeasurementUnit: (unit: Enumify<typeof MEASUREMENT_UNIT>) => void;
67
68
  setMeasurementSystem: (system: Enumify<typeof MEASUREMENT_SYSTEM>) => void;
68
- }, "showFlyingMenu" | "flyingMenuTriggeredByClick" | "isInIframe" | "isViewOnly" | "lastRequestedId" | "currentViewMode" | "isShadowOnStage" | "measurementUnit" | "measurementSystem" | "isTextInputFocused" | "isCameraIdle" | "currentEmbeddedInfos" | "isDraggingElement" | "loadedConfigFromIdb" | "notificationVisible" | "configuratorHintClosed" | "selectedElementLightsAreOn">, Pick<{
69
+ }, "showFlyingMenu" | "isLoadingCatalog" | "flyingMenuTriggeredByClick" | "isInIframe" | "isViewOnly" | "lastRequestedId" | "currentViewMode" | "isShadowOnStage" | "measurementUnit" | "measurementSystem" | "isTextInputFocused" | "isCameraIdle" | "currentEmbeddedInfos" | "isDraggingElement" | "loadedConfigFromIdb" | "notificationVisible" | "configuratorHintClosed" | "selectedElementLightsAreOn">, Pick<{
69
70
  showFlyingMenu: import('vue').Ref<boolean, boolean>;
71
+ isLoadingCatalog: import('vue').Ref<boolean, boolean>;
70
72
  flyingMenuTriggeredByClick: import('vue').Ref<boolean, boolean>;
71
73
  isInIframe: import('vue').Ref<boolean, boolean>;
72
74
  isViewOnly: import('vue').Ref<boolean, boolean>;
@@ -126,6 +128,7 @@ export declare const useCommonUiStore: import('pinia').StoreDefinition<"commonUi
126
128
  setMeasurementSystem: (system: Enumify<typeof MEASUREMENT_SYSTEM>) => void;
127
129
  }, "is2d" | "is3d" | "isFp">, Pick<{
128
130
  showFlyingMenu: import('vue').Ref<boolean, boolean>;
131
+ isLoadingCatalog: import('vue').Ref<boolean, boolean>;
129
132
  flyingMenuTriggeredByClick: import('vue').Ref<boolean, boolean>;
130
133
  isInIframe: import('vue').Ref<boolean, boolean>;
131
134
  isViewOnly: import('vue').Ref<boolean, boolean>;
@@ -1,4 +1,10 @@
1
+ import { default as RapiAccess } from '@roomle/web-sdk/common-core/src/rapi-access';
1
2
  import { RapiId, RapiTag } from '@roomle/web-sdk/typings/rapi-types';
3
+ import { UiPossibleChildTag } from '@roomle/web-sdk/typings/kernel';
2
4
 
3
5
  export declare const getAllRootTags: (possibleRootTagId: RapiId | RapiId[], rapiAccess: RapiAccess) => Promise<RapiTag[]>;
4
6
  export declare const generateRootTagCacheId: (tagId: RapiId | RapiId[]) => any;
7
+ export declare function buildSingleLevelCatalog(tags: UiPossibleChildTag[], rapiAccess: RapiAccess): Promise<any[]>;
8
+ export declare function buildTwoLevelCatalog(firstLevelTags: any, rapiAccess: RapiAccess): Promise<any[]>;
9
+ export declare function buildSecondLevelTags(secondLevelTags: any, parentId: any, rapiAccess: RapiAccess): Promise<any[]>;
10
+ export declare function buildSingleLevelTag(tag: UiPossibleChildTag, rapiAccess: RapiAccess): Promise<any>;
@@ -73,6 +73,7 @@ export declare class SdkConnector {
73
73
  createExposedApi(module: SDK_MODULES, mainMessageHandler: MessageHandler, eventEmitter: EventEmitter): Promise<void>;
74
74
  initialized(): void;
75
75
  getRapiAccess(): Promise<RapiAccess>;
76
+ loadCatalog(catalogRootTag?: Nullable<string>): Promise<void>;
76
77
  waitForLoad(): Promise<Nullable<LoadResponse>>;
77
78
  goBack(): Promise<void>;
78
79
  /**
@@ -48,6 +48,11 @@ export declare class ExposedApi {
48
48
  * will cancel the drag-in and remove the item from the scene.
49
49
  */
50
50
  cancelDragIn(): void;
51
+ /**
52
+ * call this method to load the desired catalog to show in the UI
53
+ * @param catalogId root catalog id
54
+ */
55
+ loadCatalog(catalogId: string): Promise<Nullable<LoadResponse>>;
51
56
  /**
52
57
  * call this method to load the configuration string you want into the 3d Scene
53
58
  * @param configurationString string of the configuration, starts with `{` and ends with `}`
@@ -16,6 +16,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
16
16
  store: any;
17
17
  commonUiStore: import('pinia').Store<"commonUiStore", Pick<{
18
18
  showFlyingMenu: import('vue').Ref<boolean, boolean>;
19
+ isLoadingCatalog: import('vue').Ref<boolean, boolean>;
19
20
  flyingMenuTriggeredByClick: import('vue').Ref<boolean, boolean>;
20
21
  isInIframe: import('vue').Ref<boolean, boolean>;
21
22
  isViewOnly: import('vue').Ref<boolean, boolean>;
@@ -82,8 +83,9 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
82
83
  readonly IMPERIAL: "imperial";
83
84
  readonly METRIC: "metric";
84
85
  }>) => void;
85
- }, "showFlyingMenu" | "flyingMenuTriggeredByClick" | "isInIframe" | "isViewOnly" | "lastRequestedId" | "currentViewMode" | "isShadowOnStage" | "measurementUnit" | "measurementSystem" | "isTextInputFocused" | "isCameraIdle" | "currentEmbeddedInfos" | "isDraggingElement" | "loadedConfigFromIdb" | "notificationVisible" | "configuratorHintClosed" | "selectedElementLightsAreOn">, Pick<{
86
+ }, "showFlyingMenu" | "isLoadingCatalog" | "flyingMenuTriggeredByClick" | "isInIframe" | "isViewOnly" | "lastRequestedId" | "currentViewMode" | "isShadowOnStage" | "measurementUnit" | "measurementSystem" | "isTextInputFocused" | "isCameraIdle" | "currentEmbeddedInfos" | "isDraggingElement" | "loadedConfigFromIdb" | "notificationVisible" | "configuratorHintClosed" | "selectedElementLightsAreOn">, Pick<{
86
87
  showFlyingMenu: import('vue').Ref<boolean, boolean>;
88
+ isLoadingCatalog: import('vue').Ref<boolean, boolean>;
87
89
  flyingMenuTriggeredByClick: import('vue').Ref<boolean, boolean>;
88
90
  isInIframe: import('vue').Ref<boolean, boolean>;
89
91
  isViewOnly: import('vue').Ref<boolean, boolean>;
@@ -152,6 +154,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
152
154
  }>) => void;
153
155
  }, "is2d" | "is3d" | "isFp">, Pick<{
154
156
  showFlyingMenu: import('vue').Ref<boolean, boolean>;
157
+ isLoadingCatalog: import('vue').Ref<boolean, boolean>;
155
158
  flyingMenuTriggeredByClick: import('vue').Ref<boolean, boolean>;
156
159
  isInIframe: import('vue').Ref<boolean, boolean>;
157
160
  isViewOnly: import('vue').Ref<boolean, boolean>;