@clikvn/showroom-visualizer 0.2.2-dev-07 → 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.
Files changed (81) hide show
  1. package/.claude/settings.local.json +19 -0
  2. package/dist/components/SkinLayer/DefaultLayout/index.d.ts +8 -0
  3. package/dist/components/SkinLayer/DefaultLayout/index.d.ts.map +1 -0
  4. package/dist/components/SkinLayer/PinActionButtons/index.d.ts.map +1 -1
  5. package/dist/components/SkinLayer/ScenarioList/index.d.ts.map +1 -1
  6. package/dist/components/SkinLayer/SearchAndDiscoverySlideIn/TourInfoActionPart.d.ts.map +1 -1
  7. package/dist/context/SwizzleContext.d.ts +21 -0
  8. package/dist/context/SwizzleContext.d.ts.map +1 -0
  9. package/dist/hooks/headless/index.d.ts +181 -0
  10. package/dist/hooks/headless/index.d.ts.map +1 -0
  11. package/dist/hooks/headless/useFloorplanControl.d.ts +18 -0
  12. package/dist/hooks/headless/useFloorplanControl.d.ts.map +1 -0
  13. package/dist/hooks/headless/usePOIInteraction.d.ts +23 -0
  14. package/dist/hooks/headless/usePOIInteraction.d.ts.map +1 -0
  15. package/dist/hooks/headless/useScenarioControl.d.ts +22 -0
  16. package/dist/hooks/headless/useScenarioControl.d.ts.map +1 -0
  17. package/dist/hooks/headless/useSceneNavigation.d.ts +26 -0
  18. package/dist/hooks/headless/useSceneNavigation.d.ts.map +1 -0
  19. package/dist/hooks/headless/useTourCore.d.ts +23 -0
  20. package/dist/hooks/headless/useTourCore.d.ts.map +1 -0
  21. package/dist/hooks/headless/useViewportControl.d.ts +22 -0
  22. package/dist/hooks/headless/useViewportControl.d.ts.map +1 -0
  23. package/dist/hooks/useStore.d.ts.map +1 -1
  24. package/dist/index.html +77 -46
  25. package/dist/index.js +1 -0
  26. package/dist/types/SkinLayer/store.type.d.ts +1 -0
  27. package/dist/types/SkinLayer/store.type.d.ts.map +1 -1
  28. package/dist/types/Visualizer/tourScenario/tourScenario.type.d.ts +3 -0
  29. package/dist/types/Visualizer/tourScenario/tourScenario.type.d.ts.map +1 -1
  30. package/dist/types/swizzle.d.ts +59 -0
  31. package/dist/types/swizzle.d.ts.map +1 -0
  32. package/dist/web.js +1 -1
  33. package/package.json +1 -1
  34. package/dist/components/SkinLayer/Drawer/PoiHeader/index.d.ts +0 -16
  35. package/dist/components/SkinLayer/Drawer/PoiHeader/index.d.ts.map +0 -1
  36. package/dist/components/SkinLayer/Drawer/index.d.ts +0 -29
  37. package/dist/components/SkinLayer/Drawer/index.d.ts.map +0 -1
  38. package/dist/components/SkinLayer/PlayAll/index.d.ts +0 -0
  39. package/dist/components/SkinLayer/PlayAll/index.d.ts.map +0 -0
  40. package/dist/components/SkinLayer/PoiDetailSlideIn/GalleryProduct.d.ts +0 -9
  41. package/dist/components/SkinLayer/PoiDetailSlideIn/GalleryProduct.d.ts.map +0 -1
  42. package/dist/components/SkinLayer/PoiDetailSlideIn/Tabs.d.ts +0 -28
  43. package/dist/components/SkinLayer/PoiDetailSlideIn/Tabs.d.ts.map +0 -1
  44. package/dist/components/SkinLayer/PoiDetailSlideIn/TabsContent/GalleryProduct.d.ts +0 -9
  45. package/dist/components/SkinLayer/PoiDetailSlideIn/TabsContent/GalleryProduct.d.ts.map +0 -1
  46. package/dist/components/SkinLayer/PoiDetailSlideIn/TabsContent/TabsContent.d.ts +0 -9
  47. package/dist/components/SkinLayer/PoiDetailSlideIn/TabsContent/TabsContent.d.ts.map +0 -1
  48. package/dist/components/SkinLayer/PoiDetailSlideIn/TabsContent.d.ts +0 -9
  49. package/dist/components/SkinLayer/PoiDetailSlideIn/TabsContent.d.ts.map +0 -1
  50. package/dist/components/SkinLayer/PoiDetailSlideIn/gallery.d.ts +0 -9
  51. package/dist/components/SkinLayer/PoiDetailSlideIn/gallery.d.ts.map +0 -1
  52. package/dist/components/SkinLayer/PoiDetailSlideIn/group-action-button.d.ts +0 -14
  53. package/dist/components/SkinLayer/PoiDetailSlideIn/group-action-button.d.ts.map +0 -1
  54. package/dist/components/SkinLayer/PoiDetailSlideIn/header.d.ts +0 -12
  55. package/dist/components/SkinLayer/PoiDetailSlideIn/header.d.ts.map +0 -1
  56. package/dist/components/SkinLayer/PoiDetailSlideIn/rating.d.ts +0 -7
  57. package/dist/components/SkinLayer/PoiDetailSlideIn/rating.d.ts.map +0 -1
  58. package/dist/components/SkinLayer/RightPanel/index.d.ts +0 -2
  59. package/dist/components/SkinLayer/RightPanel/index.d.ts.map +0 -1
  60. package/dist/constants/Visualizer/fallback-images.d.ts +0 -27
  61. package/dist/constants/Visualizer/fallback-images.d.ts.map +0 -1
  62. package/dist/features/VirtualTourVisualizer/index.d.ts +0 -20
  63. package/dist/features/VirtualTourVisualizer/index.d.ts.map +0 -1
  64. package/dist/features/VirtualTourVisualizerUI/index.d.ts +0 -17
  65. package/dist/features/VirtualTourVisualizerUI/index.d.ts.map +0 -1
  66. package/dist/utils/Visualizer/asset.utils.d.ts +0 -19
  67. package/dist/utils/Visualizer/asset.utils.d.ts.map +0 -1
  68. package/dist/utils/Visualizer/cors-bypass.utils.d.ts +0 -16
  69. package/dist/utils/Visualizer/cors-bypass.utils.d.ts.map +0 -1
  70. package/dist/utils/Visualizer/cors-proxy.d.ts +0 -8
  71. package/dist/utils/Visualizer/cors-proxy.d.ts.map +0 -1
  72. package/dist/utils/Visualizer/cors-test.d.ts +0 -12
  73. package/dist/utils/Visualizer/cors-test.d.ts.map +0 -1
  74. package/dist/utils/Visualizer/global-cors-handler.d.ts +0 -13
  75. package/dist/utils/Visualizer/global-cors-handler.d.ts.map +0 -1
  76. package/dist/utils/Visualizer/no-cors-fetch.d.ts +0 -20
  77. package/dist/utils/Visualizer/no-cors-fetch.d.ts.map +0 -1
  78. package/dist/utils/Visualizer/simple-cors-handler.d.ts +0 -9
  79. package/dist/utils/Visualizer/simple-cors-handler.d.ts.map +0 -1
  80. /package/dist/features/ShowroomVisualizer/{cssStyles.d.ts → CssStyles.d.ts} +0 -0
  81. /package/dist/features/ShowroomVisualizer/{cssStyles.d.ts.map → CssStyles.d.ts.map} +0 -0
@@ -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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/SkinLayer/PinActionButtons/index.tsx"],"names":[],"mappings":"AAwBA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAU5D,KAAK,mBAAmB,GAAG;IACzB,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,KAAK,IAAI,CAAC;CAChE,CAAC;;AAmgBF,wBAAgC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/SkinLayer/PinActionButtons/index.tsx"],"names":[],"mappings":"AAwBA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAU5D,KAAK,mBAAmB,GAAG;IACzB,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,KAAK,IAAI,CAAC;CAChE,CAAC;;AAkgBF,wBAAgC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/SkinLayer/ScenarioList/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,EAAE,EAOH,MAAM,OAAO,CAAC;AAkCf,QAAA,MAAM,YAAY,EAAE,EAiInB,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/SkinLayer/ScenarioList/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,EAAE,EAOH,MAAM,OAAO,CAAC;AAyCf,QAAA,MAAM,YAAY,EAAE,EAiInB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TourInfoActionPart.d.ts","sourceRoot":"","sources":["../../../../src/components/SkinLayer/SearchAndDiscoverySlideIn/TourInfoActionPart.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAC;AAS3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AAIjF,KAAK,uBAAuB,GAAG;IAC7B,WAAW,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IACtD,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAS,CAAC;CAC1D,CAAC;AAEF,QAAA,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAqEnD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"TourInfoActionPart.d.ts","sourceRoot":"","sources":["../../../../src/components/SkinLayer/SearchAndDiscoverySlideIn/TourInfoActionPart.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAC;AAU3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AAIjF,KAAK,uBAAuB,GAAG;IAC7B,WAAW,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IACtD,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAS,CAAC;CAC1D,CAAC;AAEF,QAAA,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CA8EnD,CAAC;AAEF,eAAe,kBAAkB,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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useStore.d.ts","sourceRoot":"","sources":["../../src/hooks/useStore.tsx"],"names":[],"mappings":"AACA,OAAO,KAQN,MAAM,OAAO,CAAC;AAsBf,OAAO,EAML,SAAS,EAGV,MAAM,oBAAoB,CAAC;AAsB5B,eAAO,MAAM,aAAa,GAAI,uBAG3B;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C,4CA23CA,CAAC;AAEF,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,KAAK,EAAE,SAAS,CAAC;KAClB;CACF;AAED,eAAO,MAAM,QAAQ,iBAMpB,CAAC"}
1
+ {"version":3,"file":"useStore.d.ts","sourceRoot":"","sources":["../../src/hooks/useStore.tsx"],"names":[],"mappings":"AACA,OAAO,KAQN,MAAM,OAAO,CAAC;AAsBf,OAAO,EAML,SAAS,EAGV,MAAM,oBAAoB,CAAC;AAsB5B,eAAO,MAAM,aAAa,GAAI,uBAG3B;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C,4CAk4CA,CAAC;AAEF,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,KAAK,EAAE,SAAS,CAAC;KAClB;CACF;AAED,eAAO,MAAM,QAAQ,iBAMpB,CAAC"}
package/dist/index.html CHANGED
@@ -7,70 +7,101 @@
7
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%">
15
+ <div class="h-full w-full relative">
16
+ <showroom-visualizer></showroom-visualizer>
17
+ </div>
18
+ </div>
19
+ <!-- <div class="h-full" style="width: 390px"></div>-->
20
+ </div>
10
21
  <script type="module">
22
+ // import ShowroomVisualizer from 'https://85f81d7dc992.ngrok-free.app/web.js';
11
23
  import ShowroomVisualizer from 'http://localhost:3000/web.js';
12
24
 
13
25
  ShowroomVisualizer.initVisualizer({
14
26
  apiHost: 'https://ci-api.clik.vn/vt360',
27
+ webRotateApiHost: 'https://ci-api.clik.vn/cms',
15
28
  webRotateClientHost: 'https://ci-webrotate360-client.clik.vn',
16
29
  config: {
17
- tourCode: 'TOUR_GEVEXLWNPT74',
18
30
  language: 'VI',
31
+ // tourCode: 'TOUR_FXYCEN7ZZVW6',
32
+
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
+
45
+ // tourCode: 'tour_7a6hchjljga4'.toUpperCase(),
46
+
47
+ // tourCode: 'TOUR_ZJMHKMJEACAH',
48
+ // startScene: 'SCENE_LVN4DLUFACAH',
49
+ // hLookAt: -179.145,
50
+ // vLookAt: 11.597,
51
+
52
+ // tourCode: 'tour_7yul2algfl94'.toUpperCase(),
53
+ // startScene: 'scene_vrz9v2uhfl94'.toUpperCase(),
54
+ // hLookAt: -87,
55
+ // vLookAt: 9,
56
+ // hotspot: 'item27getn2d2m94'.toUpperCase(),
19
57
  },
20
58
  listeners: {
59
+ onTourSwitchLoaded: (tool) => {
60
+ window.switchTour = tool.switchTour;
61
+ },
62
+ onSceneCompleted: (...args) => {
63
+ // console.log('onSceneCompleted', args);
64
+ },
21
65
  onLoaded: (tool) => {
66
+ // console.log('TOOL_LOADED')
22
67
  window.tool = tool;
23
68
  },
24
- onPinActionClicked: (key) => {
25
- console.log('onPinActionClicked', key);
26
- },
27
- onAIProductClicked: (poi) => {
69
+ onPoiClicked: (poi) => {
28
70
  console.log('onPoiClicked', poi);
29
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
+ },
30
102
  },
31
103
  mobile: false,
32
104
  });
33
105
  </script>
34
- <style>
35
- .toggle-btn {
36
- position: fixed;
37
- top: 20px;
38
- right: 20px;
39
- z-index: 9999;
40
- padding: 10px 15px;
41
- background: #3585f7;
42
- color: white;
43
- border: none;
44
- border-radius: 5px;
45
- cursor: pointer;
46
- font-family: 'Be Vietnam Pro', sans-serif;
47
- font-size: 14px;
48
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
49
- transition: background 0.3s ease;
50
- }
51
- .toggle-btn:hover {
52
- background: #2574e6;
53
- }
54
- </style>
55
- </head>
56
- <body>
57
- <!-- <button class="toggle-btn" onclick="toggleWidth()">Toggle Width</button> -->
58
- <div id="container" style="width: 100vw; height: 100vh; overflow: hidden">
59
- <div style="width: 80vw; height: 100vh">
60
- <showroom-visualizer></showroom-visualizer>
61
- </div>
62
- </div>
63
- <script>
64
- function toggleWidth() {
65
- const container = document.getElementById('container');
66
- const currentWidth = container.style.width;
67
-
68
- if (currentWidth === '80vw') {
69
- container.style.width = '100vw';
70
- } else {
71
- container.style.width = '80vw';
72
- }
73
- }
74
- </script>
75
106
  </body>
76
107
  </html>