@clikvn/showroom-visualizer 0.2.3-dev-03 → 0.2.3-dev-05

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 (53) hide show
  1. package/README.md +26 -133
  2. package/dist/commons/SkinLayer/components/Button/index.d.ts +4 -4
  3. package/dist/commons/SkinLayer/components/Button/index.d.ts.map +1 -1
  4. package/dist/components/SkinLayer/Floorplan/Map.d.ts.map +1 -1
  5. package/dist/components/SkinLayer/Floorplan/Minimap/MiniMapMarker.d.ts.map +1 -1
  6. package/dist/components/SkinLayer/Floorplan/Minimap/index.d.ts.map +1 -1
  7. package/dist/components/SkinLayer/HotspotCategorySlideIn/index.d.ts.map +1 -1
  8. package/dist/components/SkinLayer/HotspotOverview/index.d.ts +0 -1
  9. package/dist/components/SkinLayer/HotspotOverview/index.d.ts.map +1 -1
  10. package/dist/components/SkinLayer/Layout/index.d.ts.map +1 -1
  11. package/dist/components/SkinLayer/PinActionButtons/ButtonWithTooltip.d.ts +1 -0
  12. package/dist/components/SkinLayer/PinActionButtons/ButtonWithTooltip.d.ts.map +1 -1
  13. package/dist/components/SkinLayer/PinActionButtons/index.d.ts.map +1 -1
  14. package/dist/components/SkinLayer/SearchAndDiscoverySlideIn/DisplayActionPart/index.d.ts.map +1 -1
  15. package/dist/components/SkinLayer/SearchAndDiscoverySlideIn/HelpActionPart.d.ts.map +1 -1
  16. package/dist/components/SkinLayer/SearchAndDiscoverySlideIn/PoiInfoActionPart/index.d.ts.map +1 -1
  17. package/dist/components/SkinLayer/SearchAndDiscoverySlideIn/PromotionPart/index.d.ts.map +1 -1
  18. package/dist/components/SkinLayer/SearchAndDiscoverySlideIn/ScenariosPart/index.d.ts.map +1 -1
  19. package/dist/components/SkinLayer/SearchAndDiscoverySlideIn/TourInfoActionPart.d.ts.map +1 -1
  20. package/dist/components/SkinLayer/SearchAndDiscoverySlideIn/index.d.ts.map +1 -1
  21. package/dist/components/SkinLayer/index.d.ts +0 -47
  22. package/dist/components/SkinLayer/index.d.ts.map +1 -1
  23. package/dist/features/ShowroomVisualizer/VirtualTour.d.ts +0 -5
  24. package/dist/features/ShowroomVisualizer/VirtualTour.d.ts.map +1 -1
  25. package/dist/features/ShowroomVisualizer/VirtualTourContainer.d.ts +3 -4
  26. package/dist/features/ShowroomVisualizer/VirtualTourContainer.d.ts.map +1 -1
  27. package/dist/features/ShowroomVisualizer/index.d.ts +3 -24
  28. package/dist/features/ShowroomVisualizer/index.d.ts.map +1 -1
  29. package/dist/hooks/useToolConfig.d.ts.map +1 -1
  30. package/dist/index.d.ts +0 -11
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/register.d.ts +0 -3
  33. package/dist/register.d.ts.map +1 -1
  34. package/dist/types/SkinLayer/tool.type.d.ts +0 -6
  35. package/dist/types/SkinLayer/tool.type.d.ts.map +1 -1
  36. package/dist/types/SkinLayer/visualizer.type.d.ts +0 -3
  37. package/dist/types/SkinLayer/visualizer.type.d.ts.map +1 -1
  38. package/dist/web.js +1 -1
  39. package/package.json +1 -9
  40. package/rollup.config.js +4 -334
  41. package/DEVELOPMENT.md +0 -120
  42. package/EXAMPLES.md +0 -967
  43. package/SETUP_COMPLETE.md +0 -149
  44. package/example/CSS_HANDLING.md +0 -141
  45. package/example/FIXES_SUMMARY.md +0 -121
  46. package/example/PATH_ALIASES.md +0 -103
  47. package/example/README.md +0 -64
  48. package/example/index.html +0 -13
  49. package/example/package.json +0 -25
  50. package/example/postcss.config.cjs +0 -6
  51. package/example/tailwind.config.cjs +0 -12
  52. package/example/tsconfig.node.json +0 -12
  53. package/example/vite.config.ts +0 -126
package/package.json CHANGED
@@ -1,20 +1,12 @@
1
1
  {
2
2
  "name": "@clikvn/showroom-visualizer",
3
3
  "description": "Showroom Visualizer",
4
- "version": "0.2.3-dev-03",
4
+ "version": "0.2.3-dev-05",
5
5
  "author": "Clik JSC",
6
6
  "license": "ISC",
7
7
  "type": "module",
8
8
  "main": "dist/index.js",
9
9
  "types": "dist/index.d.ts",
10
- "exports": {
11
- ".": {
12
- "types": "./dist/index.d.ts",
13
- "import": "./dist/index.js"
14
- },
15
- "./dist/web": "./dist/web.js",
16
- "./dist/web.js": "./dist/web.js"
17
- },
18
10
  "scripts": {
19
11
  "dev": "rollup --watch --config rollup.config.js",
20
12
  "build": "rollup --config rollup.config.js",
package/rollup.config.js CHANGED
@@ -1,38 +1,3 @@
1
- /**
2
- * ============================================================================
3
- * SHOWROOM VISUALIZER - ROLLUP BUILD CONFIGURATION
4
- * ============================================================================
5
- *
6
- * 🎯 MỤC TIÊU:
7
- * Tạo ra 2 build outputs phục vụ 2 use cases khác nhau:
8
- *
9
- * 1️⃣ NPM Package (dist/index.js) - EXTERNAL REACT
10
- * - Dùng React từ host app (Next.js, React apps)
11
- * - ✅ Hỗ trợ Custom Layout overrides
12
- * - File nhỏ hơn (~1.8MB)
13
- * - Use: import { ShowroomVisualizer } from '@clikvn/showroom-visualizer'
14
- *
15
- * 2️⃣ Web Component (dist/web.js) - BUNDLED REACT
16
- * - Bundle React 19 vào file
17
- * - ❌ KHÔNG hỗ trợ custom layout overrides
18
- * - File lớn hơn (~2.0MB)
19
- * - Use: <script type="module" src="web.js"></script>
20
- *
21
- * ────────────────────────────────────────────────────────────────────────────
22
- *
23
- * 📊 SO SÁNH:
24
- *
25
- * | Feature | NPM Package | Web Component |
26
- * |----------------------|-------------|---------------|
27
- * | React Source | Host app | Bundled |
28
- * | Custom Layout | ✅ Yes | ❌ No |
29
- * | File Size | ~1.8MB | ~2.0MB |
30
- * | Dependencies | Need React | Standalone |
31
- * | Use Case | React apps | Vanilla JS |
32
- *
33
- * ────────────────────────────────────────────────────────────────────────────
34
- */
35
-
36
1
  import resolve from '@rollup/plugin-node-resolve';
37
2
  import commonjs from '@rollup/plugin-commonjs';
38
3
  import typescript from '@rollup/plugin-typescript';
@@ -51,163 +16,8 @@ const extensions = ['.ts', '.tsx', '.js'];
51
16
  const isDev =
52
17
  process.env.NODE_ENV === 'development' || process.env.ROLLUP_WATCH === 'true';
53
18
 
54
- // ============================================================================
55
- // CUSTOM PLUGIN: Fix React-DOM Imports
56
- // ============================================================================
57
- // React 18's ESM build không export findDOMNode, nhưng CommonJS build có.
58
- // Plugin này rewrite code để chỉ dùng default import và access properties,
59
- // tránh Rollup extract named imports.
60
- const fixReactDomImports = () => ({
61
- name: 'fix-react-dom-imports',
62
- renderChunk(code) {
63
- let fixed = code;
64
-
65
- // Fix invalid variable declarations with dots in the name
66
- // This pattern appears in minified code from third-party libraries
67
- fixed = fixed.replace(
68
- /var\s+_ReactDOM\$ReactDOM__default\.findDOMNode;/g,
69
- 'var _ReactDOM$findDOMNode;'
70
- );
71
-
72
- // Fix all occurrences of the invalid variable name
73
- fixed = fixed.replace(
74
- /_ReactDOM\$ReactDOM__default\.findDOMNode/g,
75
- '_ReactDOM$findDOMNode'
76
- );
77
-
78
- // Fix double ReactDOM__default references
79
- fixed = fixed.replace(
80
- /ReactDOM__default\.ReactDOM__default\./g,
81
- 'ReactDOM__default.'
82
- );
83
-
84
- // Additional fix for similar patterns with other methods
85
- fixed = fixed.replace(
86
- /var\s+_ReactDOM\$ReactDOM__default\.(\w+);/g,
87
- 'var _ReactDOM$$1;'
88
- );
89
-
90
- // Fix minified code that creates invalid variable names
91
- fixed = fixed.replace(
92
- /var\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\$([a-zA-Z_$][a-zA-Z0-9_$]*)\.[a-zA-Z_$][a-zA-Z0-9_$]*;/g,
93
- function (match, prefix, suffix) {
94
- return `var ${prefix}$${suffix}_temp;`;
95
- }
96
- );
97
-
98
- // First, remove any findDOMNode from named imports
99
- fixed = fixed.replace(
100
- /import\s*\{([^}]*)\}\s*from\s*['"]react-dom['"]/g,
101
- (match, imports) => {
102
- if (imports.includes('findDOMNode')) {
103
- const cleanedImports = imports
104
- .split(',')
105
- .map((imp) => imp.trim())
106
- .filter((imp) => !imp.includes('findDOMNode'))
107
- .join(', ');
108
-
109
- if (cleanedImports.trim()) {
110
- return `import { ${cleanedImports} } from 'react-dom'`;
111
- }
112
- return '';
113
- }
114
- return match;
115
- }
116
- );
117
-
118
- // Handle combined default and named imports
119
- fixed = fixed.replace(
120
- /import\s+(\w+),\s*\{\s*([^}]+)\s*\}\s*from\s*['"]react-dom['"]/g,
121
- (match, defaultImport, namedImports) => {
122
- // Check if named imports contains invalid syntax like "ReactDOM__default.createPortal"
123
- if (
124
- namedImports.includes('ReactDOM__default.') ||
125
- namedImports.includes('findDOMNode')
126
- ) {
127
- // Extract valid imports only
128
- const validImports = namedImports
129
- .split(',')
130
- .map((imp) => imp.trim())
131
- .filter((imp) => {
132
- // Remove any import that has dots or includes findDOMNode
133
- return !imp.includes('.') && !imp.includes('findDOMNode');
134
- })
135
- .map((imp) => {
136
- // Clean up "as" aliases
137
- const parts = imp.split(/\s+as\s+/);
138
- if (parts.length === 2 && !parts[0].includes('.')) {
139
- return imp;
140
- }
141
- return '';
142
- })
143
- .filter(Boolean)
144
- .join(', ');
145
-
146
- if (validImports) {
147
- return `import ${defaultImport}, { ${validImports} } from 'react-dom'`;
148
- }
149
- return `import ${defaultImport} from 'react-dom'`;
150
- }
151
- return match;
152
- }
153
- );
154
-
155
- // Replace all variations of findDOMNode (but not in function declarations)
156
- fixed = fixed.replace(/\bfindDOMNode\$?\d*\b/g, (match, offset) => {
157
- // Check if this is a function declaration
158
- const beforeMatch = fixed.substring(Math.max(0, offset - 20), offset);
159
- if (beforeMatch.trim().endsWith('function')) {
160
- return match; // Don't replace in function declarations
161
- }
162
- return 'ReactDOM__default.findDOMNode';
163
- });
164
-
165
- // Fix property access patterns
166
- fixed = fixed.replace(/(\w+)\.findDOMNode\b/g, (match, obj) => {
167
- if (obj === 'ReactDOM__default') return match;
168
- return 'ReactDOM__default.findDOMNode';
169
- });
170
-
171
- // Replace other methods - but NOT when they're being used in import statements
172
- const methodsToReplace = [
173
- 'createPortal',
174
- 'unstable_batchedUpdates',
175
- 'flushSync',
176
- ];
177
-
178
- methodsToReplace.forEach((method) => {
179
- // Only replace when not in import context
180
- const regex = new RegExp(
181
- `\\b${method}\\$?\\d*\\b(?![:\\.]|\\s*as\\s*\\w+)`,
182
- 'g'
183
- );
184
- fixed = fixed.replace(regex, (match, offset) => {
185
- // Check if this is within an import statement
186
- const beforeMatch = fixed.substring(Math.max(0, offset - 100), offset);
187
- if (beforeMatch.includes('import') && beforeMatch.includes('{')) {
188
- return match;
189
- }
190
- return `ReactDOM__default.${method}`;
191
- });
192
- });
193
-
194
- return { code: fixed, map: null };
195
- },
196
- });
197
-
198
- // ============================================================================
199
- // CONFIG CHO NPM PACKAGE - External React
200
- // ============================================================================
201
- // Dùng khi: import { ShowroomVisualizer } from '@clikvn/showroom-visualizer'
202
- // - React được external → Dùng React version của host app (Next.js, React app)
203
- // - Cho phép custom layout overrides vì share cùng React instance
204
- // - File nhỏ hơn vì không bundle React
205
19
  const indexConfig = {
206
20
  context: 'this',
207
-
208
- // ✅ External React - Library sẽ dùng React từ host app
209
- external: ['react', 'react-dom', 'react/jsx-runtime', 'react-dom/client'],
210
-
211
21
  onwarn(warning, warn) {
212
22
  // Bỏ qua warning về "use client" directive
213
23
  if (
@@ -223,24 +33,11 @@ const indexConfig = {
223
33
  resolve({
224
34
  extensions,
225
35
  browser: true,
226
- preferBuiltins: false,
227
- dedupe: [
228
- 'react',
229
- 'react-dom',
230
- 'useTranslation',
231
- 'i18n',
232
- 'I18nextProvider',
233
- ],
234
- }),
235
- commonjs({
236
- esmExternals: true,
237
- requireReturnsDefault: 'auto',
238
- // Không extract named imports từ external modules
239
- ignoreDynamicRequires: false,
36
+ dedupe: ['useTranslation', 'i18n', 'I18nextProvider'],
240
37
  }),
38
+ commonjs(),
241
39
  // Skip uglify in dev mode - tốn thời gian
242
- // uglify does not support ES2015+ properly — and React’s ESM builds rely heavily on ES2015+ semantics
243
- // !isDev && uglify(),
40
+ !isDev && uglify(),
244
41
  json(),
245
42
  // Skip babel in dev mode - giảm thời gian compile
246
43
  !isDev &&
@@ -282,137 +79,10 @@ const indexConfig = {
282
79
  typescriptPaths({ preserveExtensions: true }),
283
80
  // Skip terser trong dev - tốn rất nhiều thời gian
284
81
  !isDev && terser({ output: { comments: false } }),
285
- // ⚠️ QUAN TRỌNG: Fix react-dom imports sau khi bundle
286
- // Phải đặt ở cuối để chạy sau tất cả transformations
287
- fixReactDomImports(),
288
82
  ].filter(Boolean), // Remove false values
289
83
  };
290
84
 
291
- // ============================================================================
292
- // CONFIG CHO WEB COMPONENT - Bundled React
293
- // ============================================================================
294
- // Dùng khi: <script src="web.js"> hoặc dynamic import('web.js')
295
- // - React được BUNDLE vào → Standalone, không cần dependencies
296
- // - KHÔNG hỗ trợ custom layout overrides (vì khác React instance với host app)
297
- // - File lớn hơn vì bundle React (~200KB extra)
298
- // - Phù hợp cho vanilla JS/HTML projects
299
- const browserConfig = {
300
- context: 'this',
301
- // ❌ KHÔNG external React - Bundle React version 19 vào file
302
- // external: [], // Không khai báo external = bundle tất cả
303
- onwarn: indexConfig.onwarn,
304
- plugins: [
305
- resolve({
306
- browser: true,
307
- extensions: ['.ts', '.tsx', '.js'],
308
- dedupe: ['react', 'react-dom'],
309
- preferBuiltins: false,
310
- }),
311
-
312
- commonjs({
313
- esmExternals: true,
314
- requireReturnsDefault: 'auto',
315
- }),
316
-
317
- json(),
318
- !isDev &&
319
- babel({
320
- babelHelpers: 'bundled',
321
- extensions: ['.ts', '.tsx', '.js'],
322
- exclude: 'node_modules/**',
323
- }),
324
-
325
- replace({
326
- 'process.env.NODE_ENV': JSON.stringify(
327
- isDev ? 'development' : 'production'
328
- ),
329
- preventAssignment: true,
330
- }),
331
-
332
- postcss({
333
- plugins: [autoprefixer(), tailwindcss()],
334
- extract: false,
335
- modules: false,
336
- autoModules: false,
337
- minimize: !isDev,
338
- inject: false,
339
- }),
340
-
341
- typescript({
342
- sourceMap: isDev,
343
- inlineSources: isDev,
344
- }),
345
-
346
- typescriptPaths({ preserveExtensions: true }),
347
- !isDev &&
348
- terser({
349
- format: { comments: false },
350
- }),
351
-
352
- copy({
353
- targets: [
354
- {
355
- src: [
356
- 'src/assets/fonts/icomoon.woff',
357
- 'src/assets/fonts/icomoon.ttf',
358
- 'src/assets/fonts/icomoon.svg',
359
- 'src/assets/fonts/icomoon.eot',
360
- ],
361
- dest: 'fonts',
362
- },
363
- ],
364
- }),
365
- ].filter(Boolean),
366
- };
367
-
368
- // ============================================================================
369
- // DUAL BUILD STRATEGY
370
- // ============================================================================
371
85
  const configs = [
372
- // ────────────────────────────────────────────────────────────────────────
373
- // BUILD 1: NPM Package (dist/index.js)
374
- // ────────────────────────────────────────────────────────────────────────
375
- // 📦 Sử dụng: import { ShowroomVisualizer } from '@clikvn/showroom-visualizer'
376
- //
377
- // ✅ Ưu điểm:
378
- // - Dùng React version của host app (Next.js, React app)
379
- // - Cho phép SWIZZLE components (share React instance)
380
- // - File nhỏ (~1.8MB) vì không bundle React
381
- //
382
- // 📝 Use cases:
383
- // - React/Next.js applications
384
- // - Cần customize components qua custom layout overrides
385
- // - Muốn kiểm soát React version
386
- {
387
- input: './src/index.ts', // ⭐ IMPORTANT: Do NOT bundle react / react-dom
388
- external: ['react', 'react-dom', 'react/jsx-runtime'],
389
- output: {
390
- file: 'dist/index.js',
391
- format: 'esm',
392
- inlineDynamicImports: true,
393
- },
394
- ...indexConfig, // ✅ External React dependencies
395
- },
396
-
397
- // ────────────────────────────────────────────────────────────────────────
398
- // BUILD 2: Web Component (dist/web.js)
399
- // ────────────────────────────────────────────────────────────────────────
400
- // 🌐 Sử dụng: <script type="module" src="web.js"></script>
401
- // hoặc: await import('web.js')
402
- //
403
- // ✅ Ưu điểm:
404
- // - Standalone, không cần install dependencies
405
- // - Hoạt động trong vanilla JS/HTML
406
- // - Không cần build tools
407
- //
408
- // ❌ Hạn chế:
409
- // - KHÔNG hỗ trợ custom layout overrides (khác React instance)
410
- // - File lớn hơn (~2.0MB) vì bundle React
411
- //
412
- // 📝 Use cases:
413
- // - Vanilla JS/HTML projects
414
- // - Không cần customize UI
415
- // - Quick integration
416
86
  {
417
87
  input: './src/web.ts',
418
88
  output: {
@@ -420,7 +90,7 @@ const configs = [
420
90
  format: 'esm',
421
91
  inlineDynamicImports: true,
422
92
  },
423
- ...browserConfig, // ✅ Bundle React version 19
93
+ ...indexConfig,
424
94
  },
425
95
  ];
426
96
 
package/DEVELOPMENT.md DELETED
@@ -1,120 +0,0 @@
1
- # 🛠️ Development Guide
2
-
3
- Hướng dẫn phát triển thư viện `@clikvn/showroom-visualizer`.
4
-
5
- ## 📦 Cấu trúc Project
6
-
7
- ```
8
- showroom-visualizer/
9
- ├── src/ # Source code của thư viện
10
- ├── dist/ # Build output (NPM package & Web Component)
11
- ├── example/ # Example app để test local (Vite + React)
12
- ├── rollup.config.js # Build configuration
13
- └── package.json
14
- ```
15
-
16
- ## 🚀 Development Workflows
17
-
18
- ### Workflow 1: Test trong Example App (Khuyến nghị ⭐)
19
-
20
- **Ưu điểm:**
21
- - ✅ Import trực tiếp từ source (`src/`) - không cần build
22
- - ✅ Hot reload cực nhanh
23
- - ✅ Debug dễ dàng với source maps
24
- - ✅ Test custom layout overrides và tất cả features
25
- - ✅ Không cần publish hoặc yalc
26
-
27
- **Cách dùng:**
28
-
29
- ```bash
30
- # Bước 1: Cài đặt dependencies cho example (chỉ lần đầu)
31
- cd example
32
- yarn install
33
-
34
- # Bước 2: Chạy example app
35
- yarn dev
36
- # hoặc từ root: yarn dev:demo
37
-
38
- # App sẽ chạy tại: http://localhost:3001
39
- ```
40
-
41
- **Modify và test:**
42
- - Thay đổi code trong `src/` → Auto reload
43
- - Thay đổi code trong `example/src/App.tsx` → Auto reload
44
- - Test custom layout bằng checkbox trong UI
45
-
46
- ### Workflow 2: Build và Test Web Component
47
-
48
- **Test Web Component:**
49
-
50
- ```bash
51
- # Build
52
- yarn build
53
-
54
- # Serve dist folder
55
- cd dist
56
- npx serve
57
- # hoặc: python3 -m http.server 8080
58
-
59
- # Mở browser: http://localhost:8080
60
- ```
61
-
62
- Xem file `dist/index.html` để biết cách dùng Web Component.
63
-
64
- ---
65
-
66
- ## 🏗️ Build Strategy
67
-
68
- Thư viện này có **2 build outputs**:
69
-
70
- ### 1. NPM Package (`dist/index.js`)
71
- - **Dùng cho:** React/Next.js apps
72
- - **React:** External (dùng React của project)
73
- - **Hỗ trợ:** Custom layout overrides, custom components
74
- - **Import:**
75
- ```tsx
76
- import { ShowroomVisualizer } from '@clikvn/showroom-visualizer';
77
- ```
78
-
79
- ### 2. Web Component (`dist/web.js`)
80
- - **Dùng cho:** Vanilla HTML/JS
81
- - **React:** Bundled (React 18 đã được bundle sẵn)
82
- - **Không hỗ trợ:** Custom layout overrides
83
- - **Import:**
84
- ```html
85
- <script type="module" src="web.js"></script>
86
- <showroom-visualizer api-url="..." showroom-id="..."></showroom-visualizer>
87
- ```
88
-
89
- ---
90
-
91
- ## 📝 Common Tasks
92
-
93
- ### Thêm feature mới
94
-
95
- 1. Code trong `src/`
96
- 2. Test trong `example/` app
97
- 3. Build: `yarn build`
98
-
99
-
100
- ## 🐛 Troubleshooting
101
-
102
- ### Build errors
103
-
104
- ```bash
105
- # Clean và rebuild
106
- rm -rf dist
107
- yarn build
108
- ```
109
- ---
110
-
111
- ## ✨ Tips
112
-
113
- 1. **Luôn dùng Example app khi develop** - Nhanh và tiện nhất
114
- 2. **Commit example app vào git** để team members cùng dùng
115
- 3. **Không commit `dist/` vào git** - Chỉ build khi deploy
116
-
117
- ---
118
-
119
- Happy coding! 🚀
120
-