@clikvn/showroom-visualizer 0.2.2-dev-08 → 0.2.2-dev-09

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.
@@ -0,0 +1,19 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(find:*)",
5
+ "Bash(npm run build:*)",
6
+ "Bash(grep:*)",
7
+ "Bash(rm:*)",
8
+ "Bash(ls:*)",
9
+ "Bash(sed:*)",
10
+ "Bash(yarn build)",
11
+ "Bash(yalc push:*)",
12
+ "Bash(yarn dev)",
13
+ "Bash(yarn list:*)",
14
+ "Bash(mv:*)",
15
+ "Bash(rg:*)"
16
+ ],
17
+ "deny": []
18
+ }
19
+ }
@@ -0,0 +1,8 @@
1
+ import { FC } from 'react';
2
+ import { ToolType } from '../../../types/SkinLayer/tool.type';
3
+ type Props = {
4
+ onToolLoaded?: (tool: ToolType) => void;
5
+ };
6
+ declare const Layout: FC<Props>;
7
+ export default Layout;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/SkinLayer/DefaultLayout/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAiB,EAAE,EAAuB,MAAM,OAAO,CAAC;AAc/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAiC9D,KAAK,KAAK,GAAG;IACX,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CACzC,CAAC;AAEF,QAAA,MAAM,MAAM,EAAE,EAAE,CAAC,KAAK,CA0UrB,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,21 @@
1
+ import React, { ReactNode, ComponentType } from 'react';
2
+ import { SwizzleConfig, SwizzlePath } from '../types/swizzle';
3
+ type SwizzleContextType = {
4
+ swizzle: SwizzleConfig;
5
+ getSwizzledComponent: <T = unknown>(path: SwizzlePath, defaultComponent: ComponentType<T>) => ComponentType<T>;
6
+ };
7
+ /**
8
+ * Hook để access swizzle configuration
9
+ */
10
+ export declare const useSwizzle: () => SwizzleContextType;
11
+ type Props = {
12
+ swizzle?: SwizzleConfig;
13
+ children: ReactNode;
14
+ };
15
+ /**
16
+ * SwizzleProvider - Wrap app với provider này để enable component swizzling
17
+ * Giống như Docusaurus swizzle pattern
18
+ */
19
+ export declare const SwizzleProvider: React.FC<Props>;
20
+ export {};
21
+ //# sourceMappingURL=SwizzleContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SwizzleContext.d.ts","sourceRoot":"","sources":["../../src/context/SwizzleContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAGZ,SAAS,EACT,aAAa,EAGd,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAQ9D,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,oBAAoB,EAAE,CAAC,CAAC,GAAG,OAAO,EAChC,IAAI,EAAE,WAAW,EACjB,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAC,KAC/B,aAAa,CAAC,CAAC,CAAC,CAAC;CACvB,CAAC;AAOF;;GAEG;AACH,eAAO,MAAM,UAAU,0BAAmC,CAAC;AAE3D,KAAK,KAAK,GAAG;IACX,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAkG3C,CAAC"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Headless Hooks - Main Export
3
+ *
4
+ * Cung cấp API để control Showroom Visualizer mà không cần dùng default UI
5
+ * Người dùng có thể build custom UI hoàn toàn từ các hooks này
6
+ */
7
+ import { useTourCore } from './useTourCore';
8
+ import { useFloorplanControl } from './useFloorplanControl';
9
+ import { useSceneNavigation } from './useSceneNavigation';
10
+ import { useScenarioControl } from './useScenarioControl';
11
+ import { usePOIInteraction } from './usePOIInteraction';
12
+ import { useViewportControl } from './useViewportControl';
13
+ /**
14
+ * Main Hook: useShowroomControls
15
+ *
16
+ * Tổng hợp tất cả các hooks nhỏ thành 1 hook duy nhất
17
+ * Sử dụng khi muốn access tất cả controls
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * const MyCustomUI = () => {
22
+ * const controls = useShowroomControls();
23
+ *
24
+ * return (
25
+ * <div>
26
+ * <button onClick={controls.floorplan.toggleFloorplan}>
27
+ * Toggle Minimap
28
+ * </button>
29
+ * <button onClick={controls.navigation.goToNextScene}>
30
+ * Next Scene
31
+ * </button>
32
+ * <p>Active Scene: {controls.tour.activeScene?.name}</p>
33
+ * </div>
34
+ * );
35
+ * };
36
+ * ```
37
+ */
38
+ export declare const useShowroomControls: () => {
39
+ tour: {
40
+ tourReady: boolean;
41
+ tourLoaded: boolean;
42
+ soundReady: boolean;
43
+ canInitVisualizer: boolean;
44
+ tourData: import("../../types/Visualizer").TourType | null;
45
+ activeScene: import("../../models/Visualizer/Scene").default | null;
46
+ scenes: import("../../types/Visualizer").SceneType[];
47
+ floorplans: import("../../types/Visualizer").FloorplanType[];
48
+ loadingScene: boolean;
49
+ tour: import("../../models/Visualizer/Tour").default | undefined;
50
+ isLoading: boolean;
51
+ hasScenes: boolean;
52
+ hasFloorplans: boolean;
53
+ totalScenes: number;
54
+ };
55
+ floorplan: {
56
+ showFloorplan: boolean;
57
+ activeFloorplan: import("../../types/Visualizer").FloorplanType | null;
58
+ floorplans: import("../../types/Visualizer").FloorplanType[];
59
+ toggleFloorplan: () => void;
60
+ openFloorplan: () => void;
61
+ closeFloorplan: () => void;
62
+ switchFloorplan: (floorplanId: string) => void;
63
+ hasFloorplans: boolean;
64
+ canShowFloorplan: boolean;
65
+ };
66
+ navigation: {
67
+ activeScene: import("../../models/Visualizer/Scene").default | null;
68
+ scenes: import("../../types/Visualizer").SceneType[];
69
+ sceneGroups: import("../../types/Visualizer").SceneGroupType[];
70
+ showSceneCategories: boolean;
71
+ currentSceneGroup: import("../../types/Visualizer").SceneGroupType | null;
72
+ scenesByGroup: {
73
+ [groupId: string]: import("../../models/Visualizer/Scene").default[];
74
+ };
75
+ goToScene: (code: string) => Promise<boolean>;
76
+ goToNextScene: () => Promise<boolean>;
77
+ goToPreviousScene: () => Promise<boolean>;
78
+ toggleSceneCategories: () => void;
79
+ switchSceneGroup: (groupCode: string) => Promise<boolean>;
80
+ hasNextScene: boolean;
81
+ hasPreviousScene: boolean;
82
+ totalScenes: number;
83
+ };
84
+ scenario: {
85
+ activeScenario: import("../../types/Visualizer").TourScenarioType | null;
86
+ autoPlaying: boolean;
87
+ scenarioCurrentStep: import("../../types/Visualizer").ScenarioCurrentStepType | null;
88
+ showScenarioList: boolean;
89
+ scenarios: import("../../types/Visualizer").TourScenarioType[];
90
+ playScenario: (scenarioCode: string) => Promise<boolean>;
91
+ pauseScenario: () => void;
92
+ resumeScenario: () => void;
93
+ stopScenario: () => void;
94
+ toggleScenarioList: () => void;
95
+ hasScenarios: boolean;
96
+ isPlaying: boolean;
97
+ totalScenarios: number;
98
+ };
99
+ poi: {
100
+ activePoi: any;
101
+ activePoiCode: string | undefined;
102
+ selectedPoi: any;
103
+ isViewPoiDetail: boolean;
104
+ labelVisible: boolean;
105
+ selectPoi: (poiCode: string) => void;
106
+ clearPoiSelection: () => void;
107
+ toggleLabels: () => void;
108
+ showLabels: () => void;
109
+ hideLabels: () => void;
110
+ openPoiDetail: (poiCode: string) => void;
111
+ closePoiDetail: () => void;
112
+ hasActivePoi: boolean;
113
+ hasSelectedPoi: boolean;
114
+ };
115
+ viewport: {
116
+ isFullscreen: boolean;
117
+ isGyroscope: boolean;
118
+ tourSoundPlaying: boolean;
119
+ navigationArrowsVisible: boolean;
120
+ toggleFullscreen: () => void;
121
+ enterFullscreen: () => void;
122
+ exitFullscreen: () => void;
123
+ toggleGyroscope: () => void;
124
+ toggleSound: () => void;
125
+ muteSound: () => void;
126
+ unmuteSound: () => void;
127
+ toggleNavigationArrows: () => void;
128
+ takeScreenshot: () => void;
129
+ };
130
+ tourReady: boolean;
131
+ isLoading: boolean;
132
+ activeScene: import("../../models/Visualizer/Scene").default | null;
133
+ goToScene: (code: string) => Promise<boolean>;
134
+ goToNextScene: () => Promise<boolean>;
135
+ goToPreviousScene: () => Promise<boolean>;
136
+ showFloorplan: boolean;
137
+ toggleFloorplan: () => void;
138
+ playScenario: (scenarioCode: string) => Promise<boolean>;
139
+ stopScenario: () => void;
140
+ isPlaying: boolean;
141
+ toggleFullscreen: () => void;
142
+ toggleSound: () => void;
143
+ };
144
+ /**
145
+ * Tour Core Hook
146
+ * @see useTourCore
147
+ */
148
+ export { useTourCore } from './useTourCore';
149
+ /**
150
+ * Floorplan Control Hook
151
+ * @see useFloorplanControl
152
+ */
153
+ export { useFloorplanControl } from './useFloorplanControl';
154
+ /**
155
+ * Scene Navigation Hook
156
+ * @see useSceneNavigation
157
+ */
158
+ export { useSceneNavigation } from './useSceneNavigation';
159
+ /**
160
+ * Scenario Control Hook
161
+ * @see useScenarioControl
162
+ */
163
+ export { useScenarioControl } from './useScenarioControl';
164
+ /**
165
+ * POI Interaction Hook
166
+ * @see usePOIInteraction
167
+ */
168
+ export { usePOIInteraction } from './usePOIInteraction';
169
+ /**
170
+ * Viewport Control Hook
171
+ * @see useViewportControl
172
+ */
173
+ export { useViewportControl } from './useViewportControl';
174
+ export type ShowroomControls = ReturnType<typeof useShowroomControls>;
175
+ export type TourCoreControls = ReturnType<typeof useTourCore>;
176
+ export type FloorplanControls = ReturnType<typeof useFloorplanControl>;
177
+ export type SceneNavigationControls = ReturnType<typeof useSceneNavigation>;
178
+ export type ScenarioControls = ReturnType<typeof useScenarioControl>;
179
+ export type POIControls = ReturnType<typeof usePOIInteraction>;
180
+ export type ViewportControls = ReturnType<typeof useViewportControl>;
181
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/headless/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyC/B,CAAC;AAKF;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;GAGG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;GAGG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;GAGG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;GAGG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAC9D,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACvE,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC5E,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACrE,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC/D,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * useFloorplanControl Hook
3
+ *
4
+ * Mục đích: Quản lý floorplan/minimap
5
+ * Cho phép người dùng control floorplan từ custom UI
6
+ */
7
+ export declare const useFloorplanControl: () => {
8
+ showFloorplan: boolean;
9
+ activeFloorplan: import("../../types/Visualizer").FloorplanType | null;
10
+ floorplans: import("../../types/Visualizer").FloorplanType[];
11
+ toggleFloorplan: () => void;
12
+ openFloorplan: () => void;
13
+ closeFloorplan: () => void;
14
+ switchFloorplan: (floorplanId: string) => void;
15
+ hasFloorplans: boolean;
16
+ canShowFloorplan: boolean;
17
+ };
18
+ //# sourceMappingURL=useFloorplanControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFloorplanControl.d.ts","sourceRoot":"","sources":["../../../src/hooks/headless/useFloorplanControl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,mBAAmB;;;;;;;mCAqBQ,MAAM;;;CAkC7C,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * usePOIInteraction Hook
3
+ *
4
+ * Mục đích: Quản lý tương tác với POI
5
+ * Handle POI click, hover, selection, detail view
6
+ */
7
+ export declare const usePOIInteraction: () => {
8
+ activePoi: any;
9
+ activePoiCode: string | undefined;
10
+ selectedPoi: any;
11
+ isViewPoiDetail: boolean;
12
+ labelVisible: boolean;
13
+ selectPoi: (poiCode: string) => void;
14
+ clearPoiSelection: () => void;
15
+ toggleLabels: () => void;
16
+ showLabels: () => void;
17
+ hideLabels: () => void;
18
+ openPoiDetail: (poiCode: string) => void;
19
+ closePoiDetail: () => void;
20
+ hasActivePoi: boolean;
21
+ hasSelectedPoi: boolean;
22
+ };
23
+ //# sourceMappingURL=usePOIInteraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePOIInteraction.d.ts","sourceRoot":"","sources":["../../../src/hooks/headless/usePOIInteraction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,iBAAiB;;;;;;yBAyBhB,MAAM;;;;;6BA2CN,MAAM;;;;CAmCnB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * useScenarioControl Hook
3
+ *
4
+ * Mục đích: Quản lý auto-play scenarios
5
+ * Control playback, pause, resume scenarios
6
+ */
7
+ export declare const useScenarioControl: () => {
8
+ activeScenario: import("../../types/Visualizer").TourScenarioType | null;
9
+ autoPlaying: boolean;
10
+ scenarioCurrentStep: import("../../types/Visualizer").ScenarioCurrentStepType | null;
11
+ showScenarioList: boolean;
12
+ scenarios: import("../../types/Visualizer").TourScenarioType[];
13
+ playScenario: (scenarioCode: string) => Promise<boolean>;
14
+ pauseScenario: () => void;
15
+ resumeScenario: () => void;
16
+ stopScenario: () => void;
17
+ toggleScenarioList: () => void;
18
+ hasScenarios: boolean;
19
+ isPlaying: boolean;
20
+ totalScenarios: number;
21
+ };
22
+ //# sourceMappingURL=useScenarioControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScenarioControl.d.ts","sourceRoot":"","sources":["../../../src/hooks/headless/useScenarioControl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,eAAO,MAAM,kBAAkB;;;;;;iCA8BN,MAAM;;;;;;;;CA2E9B,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * useSceneNavigation Hook
3
+ *
4
+ * Mục đích: Điều hướng giữa các scene
5
+ * Bao gồm scene groups, categories, navigation
6
+ */
7
+ import Scene from '../../models/Visualizer/Scene';
8
+ export declare const useSceneNavigation: () => {
9
+ activeScene: Scene | null;
10
+ scenes: import("../../types/Visualizer").SceneType[];
11
+ sceneGroups: import("../../types/Visualizer").SceneGroupType[];
12
+ showSceneCategories: boolean;
13
+ currentSceneGroup: import("../../types/Visualizer").SceneGroupType | null;
14
+ scenesByGroup: {
15
+ [groupId: string]: Scene[];
16
+ };
17
+ goToScene: (code: string) => Promise<boolean>;
18
+ goToNextScene: () => Promise<boolean>;
19
+ goToPreviousScene: () => Promise<boolean>;
20
+ toggleSceneCategories: () => void;
21
+ switchSceneGroup: (groupCode: string) => Promise<boolean>;
22
+ hasNextScene: boolean;
23
+ hasPreviousScene: boolean;
24
+ totalScenes: number;
25
+ };
26
+ //# sourceMappingURL=useSceneNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSceneNavigation.d.ts","sourceRoot":"","sources":["../../../src/hooks/headless/useSceneNavigation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,MAAM,+BAA+B,CAAC;AAElD,eAAO,MAAM,kBAAkB;;;;;;;;;sBAwCd,MAAM;;;;kCA4ED,MAAM;;;;CAqD3B,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * useTourCore Hook
3
+ *
4
+ * Mục đích: Expose tour engine core state (read-only)
5
+ * Cung cấp thông tin cơ bản về tour mà người dùng có thể query
6
+ */
7
+ export declare const useTourCore: () => {
8
+ tourReady: boolean;
9
+ tourLoaded: boolean;
10
+ soundReady: boolean;
11
+ canInitVisualizer: boolean;
12
+ tourData: import("../../types/Visualizer").TourType | null;
13
+ activeScene: import("../../models/Visualizer/Scene").default | null;
14
+ scenes: import("../../types/Visualizer").SceneType[];
15
+ floorplans: import("../../types/Visualizer").FloorplanType[];
16
+ loadingScene: boolean;
17
+ tour: import("../../models/Visualizer/Tour").default | undefined;
18
+ isLoading: boolean;
19
+ hasScenes: boolean;
20
+ hasFloorplans: boolean;
21
+ totalScenes: number;
22
+ };
23
+ //# sourceMappingURL=useTourCore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTourCore.d.ts","sourceRoot":"","sources":["../../../src/hooks/headless/useTourCore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;CA8CvB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * useViewportControl Hook
3
+ *
4
+ * Mục đích: Quản lý viewport/camera control
5
+ * Fullscreen, gyroscope, sound, navigation arrows
6
+ */
7
+ export declare const useViewportControl: () => {
8
+ isFullscreen: boolean;
9
+ isGyroscope: boolean;
10
+ tourSoundPlaying: boolean;
11
+ navigationArrowsVisible: boolean;
12
+ toggleFullscreen: () => void;
13
+ enterFullscreen: () => void;
14
+ exitFullscreen: () => void;
15
+ toggleGyroscope: () => void;
16
+ toggleSound: () => void;
17
+ muteSound: () => void;
18
+ unmuteSound: () => void;
19
+ toggleNavigationArrows: () => void;
20
+ takeScreenshot: () => void;
21
+ };
22
+ //# sourceMappingURL=useViewportControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useViewportControl.d.ts","sourceRoot":"","sources":["../../../src/hooks/headless/useViewportControl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;CAwG9B,CAAC"}
package/dist/index.html CHANGED
@@ -1,112 +1,107 @@
1
- <!DOCTYPE html>
1
+ <!doctype html>
2
2
  <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
5
  <meta
6
- name="viewport"
7
- content="width=device-width, height=device-height, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"
6
+ name="viewport"
7
+ content="width=device-width, height=device-height, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"
8
8
  />
9
9
  <title>Title</title>
10
- </head>
11
- <body>
12
- <div class="flex h-screen w-screen">
13
- <!-- <div class="h-full" style="width: 72px"></div>-->
14
- <div class="h-full" style="width: /*calc(100% - 462px);*/ 100%;">
10
+ </head>
11
+ <body>
12
+ <div class="flex h-screen w-screen">
13
+ <!-- <div class="h-full" style="width: 72px"></div>-->
14
+ <div class="h-full" style="width: /*calc(100% - 462px);*/ 100%">
15
15
  <div class="h-full w-full relative">
16
- <showroom-visualizer></showroom-visualizer>
16
+ <showroom-visualizer></showroom-visualizer>
17
17
  </div>
18
+ </div>
19
+ <!-- <div class="h-full" style="width: 390px"></div>-->
18
20
  </div>
19
- <!-- <div class="h-full" style="width: 390px"></div>-->
20
- </div>
21
- <script type="module">
22
- // import ShowroomVisualizer from 'https://85f81d7dc992.ngrok-free.app/web.js';
23
- import ShowroomVisualizer from 'http://localhost:3000/web.js';
21
+ <script type="module">
22
+ // import ShowroomVisualizer from 'https://85f81d7dc992.ngrok-free.app/web.js';
23
+ import ShowroomVisualizer from 'http://localhost:3000/web.js';
24
24
 
25
- ShowroomVisualizer.initVisualizer({
26
- apiHost: 'https://ci-api.clik.vn/vt360',
27
- webRotateApiHost: 'https://ci-api.clik.vn/cms',
28
- webRotateClientHost: 'https://ci-webrotate360-client.clik.vn',
29
- config: {
30
- language: 'VI',
31
- // tourCode: 'TOUR_FXYCEN7ZZVW6',
25
+ ShowroomVisualizer.initVisualizer({
26
+ apiHost: 'https://ci-api.clik.vn/vt360',
27
+ webRotateApiHost: 'https://ci-api.clik.vn/cms',
28
+ webRotateClientHost: 'https://ci-webrotate360-client.clik.vn',
29
+ config: {
30
+ language: 'VI',
31
+ // tourCode: 'TOUR_FXYCEN7ZZVW6',
32
32
 
33
- // startScene: 'scene_kr3rgeezzvw6',
34
- // hLookAt: -254,
35
- // vLookAt: 1
36
- // tourCode: 'TOUR_GEVEXLWNPT74',
37
- // tourCode: 'TOUR_7YUL2ALGFL94',
38
- tourCode: 'TOUR_FXYCEN7ZZVW6',
39
- // hLookAt: 10,
40
- // vLookAt: 28,
41
- // startScene: 'SCENE_KNLRAKUHFL94',
42
- // hLookAt: -54.11884505373274,
43
- // vLookAt: -9.111287009391969
33
+ // startScene: 'scene_kr3rgeezzvw6',
34
+ // hLookAt: -254,
35
+ // vLookAt: 1
36
+ // tourCode: 'TOUR_GEVEXLWNPT74',
37
+ // tourCode: 'TOUR_7YUL2ALGFL94',
38
+ tourCode: 'TOUR_KUFGDEPDTJA4',
39
+ hLookAt: 10,
40
+ vLookAt: 28,
41
+ // startScene: 'SCENE_KNLRAKUHFL94',
42
+ // hLookAt: -54.11884505373274,
43
+ // vLookAt: -9.111287009391969
44
44
 
45
- // tourCode: 'tour_7a6hchjljga4'.toUpperCase(),
45
+ // tourCode: 'tour_7a6hchjljga4'.toUpperCase(),
46
46
 
47
- // tourCode: 'TOUR_ZJMHKMJEACAH',
48
- // startScene: 'SCENE_LVN4DLUFACAH',
49
- // hLookAt: -179.145,
50
- // vLookAt: 11.597,
47
+ // tourCode: 'TOUR_ZJMHKMJEACAH',
48
+ // startScene: 'SCENE_LVN4DLUFACAH',
49
+ // hLookAt: -179.145,
50
+ // vLookAt: 11.597,
51
51
 
52
- // tourCode: 'tour_7yul2algfl94'.toUpperCase(),
53
- // startScene: 'scene_vrz9v2uhfl94'.toUpperCase(),
54
- // hLookAt: -87,
55
- // vLookAt: 9,
56
- // hotspot: 'item27getn2d2m94'.toUpperCase(),
57
- },
58
- listeners: {
59
- onTourSwitchLoaded: (tool) => {
60
- window.switchTour = tool.switchTour;
61
- },
62
- onSceneCompleted: (...args) => {
63
- // console.log('onSceneCompleted', args);
64
- },
65
- onLoaded: tool => {
66
- console.log('TOOL_LOADED', tool);
67
- window.tool = tool;
68
- window.tool?.playScenes('SCENE_FK4PJDEZZVW6-SCENE_KR3RGEEZZVW6-SCENE_HXX7YJEZZVW6');
69
- },
70
- onPoiClicked: (poi) => {
71
- console.log('onPoiClicked', poi);
72
- },
73
- onPoiOut: () => {
74
- // console.log('onPoiOut');
75
- },
76
- onPoiOver: (poi) => {
77
- console.log('onPoiOver', poi);
78
- },
79
- onPoiInCenter: (poi) => {
80
- // console.log('onPoiInCenter', poi);
81
- },
82
- onStartScenario: (code) => {
83
- // console.log('onStartScenario', code);
84
- },
85
- onScenarioPaused: (code) => {
86
- // console.log('onScenarioPaused', code);
87
- },
88
- onScenarioEnded: (code) => {
89
- // console.log('onScenarioEnded', code);
90
- },
91
- onChanged: (args) => {
92
- console.log('onChanged', args);
93
- },
94
- onStartLoadingTour: (code) => {
95
- // console.log('onStartLoadingTour', code);
96
- },
97
- onFinishedLoadingTour: (code) => {
98
- // console.log('onFinishedLoadingTour', code);
99
- },
100
- onStateChanged: (changes) => {
101
- // console.log('changes', changes);
102
- },
103
- onToolLoaded: (tool) => {
104
- console.log('onToolLoaded', tool);
105
- tool?.playScenes('SCENE_FK4PJDEZZVW6-SCENE_KR3RGEEZZVW6-SCENE_HXX7YJEZZVW6');
106
- }
107
- },
108
- mobile: false
109
- });
110
- </script>
111
- </body>
112
- </html>
52
+ // tourCode: 'tour_7yul2algfl94'.toUpperCase(),
53
+ // startScene: 'scene_vrz9v2uhfl94'.toUpperCase(),
54
+ // hLookAt: -87,
55
+ // vLookAt: 9,
56
+ // hotspot: 'item27getn2d2m94'.toUpperCase(),
57
+ },
58
+ listeners: {
59
+ onTourSwitchLoaded: (tool) => {
60
+ window.switchTour = tool.switchTour;
61
+ },
62
+ onSceneCompleted: (...args) => {
63
+ // console.log('onSceneCompleted', args);
64
+ },
65
+ onLoaded: (tool) => {
66
+ // console.log('TOOL_LOADED')
67
+ window.tool = tool;
68
+ },
69
+ onPoiClicked: (poi) => {
70
+ console.log('onPoiClicked', poi);
71
+ },
72
+ onPoiOut: () => {
73
+ // console.log('onPoiOut');
74
+ },
75
+ onPoiOver: (poi) => {
76
+ console.log('onPoiOver', poi);
77
+ },
78
+ onPoiInCenter: (poi) => {
79
+ // console.log('onPoiInCenter', poi);
80
+ },
81
+ onStartScenario: (code) => {
82
+ // console.log('onStartScenario', code);
83
+ },
84
+ onScenarioPaused: (code) => {
85
+ // console.log('onScenarioPaused', code);
86
+ },
87
+ onScenarioEnded: (code) => {
88
+ // console.log('onScenarioEnded', code);
89
+ },
90
+ onChanged: (args) => {
91
+ console.log('onChanged', args);
92
+ },
93
+ onStartLoadingTour: (code) => {
94
+ // console.log('onStartLoadingTour', code);
95
+ },
96
+ onFinishedLoadingTour: (code) => {
97
+ // console.log('onFinishedLoadingTour', code);
98
+ },
99
+ onStateChanged: (changes) => {
100
+ // console.log('changes', changes);
101
+ },
102
+ },
103
+ mobile: false,
104
+ });
105
+ </script>
106
+ </body>
107
+ </html>