@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.
- package/docs/md/web/embedding/CHANGELOG.md +31 -2
- package/package.json +1 -1
- package/packages/embedding-lib/src/embedding-lib.d.ts +14 -0
- package/packages/embedding-lib/src/examples/homag-intelligence-catalog-load-async.d.ts +14 -0
- package/packages/embedding-lib/src/examples/utils/homag-intelligence/util.d.ts +1 -0
- package/packages/web-sdk/packages/homag-intelligence/src/api.d.ts +4 -1
- package/packages/web-sdk/packages/homag-intelligence/src/debug-logging.d.ts +54 -0
- package/packages/web-sdk/packages/homag-intelligence/src/emulator.d.ts +10 -6
- package/packages/web-sdk/packages/homag-intelligence/src/hi-tag-catalog-callbacks.d.ts +3 -3
- package/packages/web-sdk/packages/homag-intelligence/src/homag-intelligence.d.ts +5 -6
- package/packages/web-sdk/packages/homag-intelligence/src/loader.d.ts +16 -4
- package/packages/web-sdk/packages/homag-intelligence/src/orders.d.ts +3 -7
- package/packages/web-sdk/packages/planner-core/src/external-object-api.d.ts +1 -1
- package/packages/web-sdk/packages/planner-core/src/roomle-planner.d.ts +9 -1
- package/packages/web-sdk/packages/planner-core/src/utils/planner-selection-handler.d.ts +1 -1
- package/packages/web-sdk/packages/planner-core/src/webgl/planner-scene-manager.d.ts +2 -2
- package/packages/web-sdk/packages/typings/kernel.d.ts +3 -0
- package/packages/web-sdk/packages/typings/planner.d.ts +15 -0
- package/roomle-embedding-lib.es.js +45 -26
- package/roomle-embedding-lib.es.min.js +1 -1
- package/roomle-embedding-lib.umd.js +4 -4
- package/roomle-embedding-lib.umd.min.js +1 -1
- package/src/common/composables/use-planner-actions-visibility.d.ts +4 -0
- package/src/common/store/common-ui-store.d.ts +4 -1
- package/src/common/utils/root-tags.d.ts +6 -0
- package/src/configurator/business-logic/sdk-connector.d.ts +1 -0
- package/src/configurator/embedding/exposed-api.d.ts +5 -0
- package/src/planner/components/overlays/product-settings/ProductRangeControl.vue.d.ts +4 -1
|
@@ -1,6 +1,35 @@
|
|
|
1
|
-
## [5.
|
|
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
|
-
*
|
|
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
|
@@ -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<
|
|
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<
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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(
|
|
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 {
|
|
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
|
|
26
|
+
private _glueLogic;
|
|
28
27
|
private _articles;
|
|
29
28
|
private _scriptLoaded;
|
|
30
29
|
private _hiLibraryLoaded;
|
|
31
30
|
private _orders;
|
|
32
31
|
constructor();
|
|
33
|
-
loadHiLibrary(
|
|
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,
|
|
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
|
-
|
|
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
|
|
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: (
|
|
21
|
-
export declare const loadMasterData: (
|
|
22
|
-
export declare const loadCalcScript: (
|
|
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
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
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 = ".",
|
|
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
|
|
421
|
-
},
|
|
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] =
|
|
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#",
|
|
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
|
-
},
|
|
485
|
-
class
|
|
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",
|
|
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
|
-
},
|
|
612
|
-
|
|
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
|
|
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?.(),
|
|
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 =
|
|
729
|
+
const i = L(
|
|
711
730
|
Se(),
|
|
712
731
|
ye(r)
|
|
713
732
|
);
|
|
714
|
-
|
|
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 (
|
|
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 " +
|
|
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),
|
|
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),
|
|
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 &&
|
|
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),
|
|
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 ===
|
|
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(
|
|
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
|
-
|
|
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
|
|
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(()=>
|
|
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>;
|