@clikvn/showroom-visualizer 0.4.1-dev-13 → 0.4.1-dev-14

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 (39) hide show
  1. package/CLAUDE.md +145 -145
  2. package/DEVELOPMENT.md +120 -120
  3. package/EXAMPLES.md +967 -967
  4. package/README.md +489 -489
  5. package/SETUP_COMPLETE.md +149 -149
  6. package/base.json +21 -21
  7. package/dist/components/SkinLayer/Drawer/PoiHeader/index.d.ts +16 -0
  8. package/dist/components/SkinLayer/Drawer/PoiHeader/index.d.ts.map +1 -0
  9. package/dist/components/SkinLayer/Drawer/index.d.ts +29 -0
  10. package/dist/components/SkinLayer/Drawer/index.d.ts.map +1 -0
  11. package/dist/components/SkinLayer/PlayAll/index.d.ts +8 -0
  12. package/dist/components/SkinLayer/PlayAll/index.d.ts.map +1 -0
  13. package/dist/features/VirtualTourVisualizer/index.d.ts +20 -0
  14. package/dist/features/VirtualTourVisualizer/index.d.ts.map +1 -0
  15. package/dist/features/VirtualTourVisualizerUI/index.d.ts +17 -0
  16. package/dist/features/VirtualTourVisualizerUI/index.d.ts.map +1 -0
  17. package/dist/fonts/icomoon.svg +633 -633
  18. package/dist/index.html +36 -0
  19. package/dist/index.js +1 -1
  20. package/dist/web.d.ts.map +1 -1
  21. package/dist/web.js +1 -1
  22. package/example/CSS_HANDLING.md +141 -141
  23. package/example/FIXES_SUMMARY.md +121 -131
  24. package/example/PATH_ALIASES.md +103 -102
  25. package/example/README.md +64 -63
  26. package/example/index.html +13 -12
  27. package/example/package.json +25 -25
  28. package/example/postcss.config.cjs +6 -6
  29. package/example/tailwind.config.cjs +12 -12
  30. package/example/tsconfig.node.json +12 -11
  31. package/example/vite.config.ts +142 -142
  32. package/package.json +133 -133
  33. package/rollup.config.js +400 -400
  34. package/tailwind.config.cjs +151 -151
  35. package/.claude/settings.local.json +0 -19
  36. package/dist/components/SkinLayer/Floorplan/Minimap/test01.d.ts +0 -15
  37. package/dist/components/SkinLayer/Floorplan/Minimap/test01.d.ts.map +0 -1
  38. /package/dist/features/ShowroomVisualizer/{CssStyles.d.ts → cssStyles.d.ts} +0 -0
  39. /package/dist/features/ShowroomVisualizer/{CssStyles.d.ts.map → cssStyles.d.ts.map} +0 -0
@@ -1,142 +1,142 @@
1
- import { defineConfig, Plugin } from 'vite';
2
- import react from '@vitejs/plugin-react';
3
- import path from 'path';
4
- import fs from 'fs';
5
- import postcss from 'postcss';
6
- import tailwindcss from 'tailwindcss';
7
- import autoprefixer from 'autoprefixer';
8
-
9
- // Custom plugin to handle CSS imports as strings (matching Rollup's postcss behavior)
10
- const cssAsStringPlugin = (): Plugin => {
11
- let postcssProcessor: any;
12
-
13
- return {
14
- name: 'css-as-string',
15
- enforce: 'pre',
16
-
17
- async configResolved(config) {
18
- // Initialize PostCSS processor with Tailwind
19
- postcssProcessor = postcss([
20
- tailwindcss({
21
- config: path.resolve(__dirname, 'tailwind.config.cjs'),
22
- }),
23
- autoprefixer(),
24
- ]);
25
- },
26
-
27
- async resolveId(source, importer) {
28
- // Handle CSS imports from the library
29
- if (source.endsWith('.css') && importer) {
30
- // Check if this is from our library (any src folder) or @clikvn packages
31
- const isLibraryCSS =
32
- importer.includes('/showroom-visualizer/src/') ||
33
- source.includes('@clikvn/');
34
-
35
- if (isLibraryCSS) {
36
- // Resolve the full path
37
- let resolvedPath: string;
38
-
39
- if (source.startsWith('.') || source.startsWith('/')) {
40
- resolvedPath = path.resolve(path.dirname(importer), source);
41
- } else if (source.startsWith('@clikvn/')) {
42
- // Handle @clikvn packages - look in parent node_modules
43
- const packagePath = source.replace(
44
- '@clikvn/',
45
- '../node_modules/@clikvn/'
46
- );
47
- resolvedPath = path.resolve(__dirname, packagePath);
48
- } else {
49
- return null;
50
- }
51
-
52
- // Add a virtual marker to bypass Vite's CSS processing
53
- return '\0' + resolvedPath + '.string';
54
- }
55
- }
56
- return null;
57
- },
58
-
59
- async load(id) {
60
- // Handle our virtual CSS string modules
61
- if (id.startsWith('\0') && id.endsWith('.css.string')) {
62
- const realPath = id.slice(1, -7); // Remove \0 prefix and .string suffix
63
-
64
- try {
65
- const content = await fs.promises.readFile(realPath, 'utf-8');
66
-
67
- // Process all CSS through PostCSS/Tailwind to ensure Tailwind utilities work
68
- let processedContent = content;
69
- try {
70
- const result = await postcssProcessor.process(content, {
71
- from: realPath,
72
- });
73
- processedContent = result.css;
74
- } catch (error) {
75
- console.warn(`PostCSS processing failed for ${realPath}:`, error);
76
- // Fall back to original content if processing fails
77
- processedContent = content;
78
- }
79
-
80
- return {
81
- code: `export default ${JSON.stringify(processedContent)};`,
82
- map: null,
83
- };
84
- } catch (error) {
85
- console.error(`Failed to load CSS file: ${realPath}`, error);
86
- return {
87
- code: `export default "";`,
88
- map: null,
89
- };
90
- }
91
- }
92
- return null;
93
- },
94
- };
95
- };
96
-
97
- // https://vitejs.dev/config/
98
- export default defineConfig({
99
- plugins: [cssAsStringPlugin(), react()],
100
- resolve: {
101
- alias: {
102
- // Force use of example's React to avoid duplicate instances
103
- react: path.resolve(__dirname, 'node_modules/react'),
104
- 'react-dom': path.resolve(__dirname, 'node_modules/react-dom'),
105
- 'react/jsx-runtime': path.resolve(
106
- __dirname,
107
- 'node_modules/react/jsx-runtime'
108
- ),
109
- // Alias để import trực tiếp từ source code thay vì build
110
- '@clikvn/showroom-visualizer': path.resolve(__dirname, '../src'),
111
- // Thư viện sử dụng baseUrl: "./src" nên tất cả imports cần aliases
112
- commons: path.resolve(__dirname, '../src/commons'),
113
- components: path.resolve(__dirname, '../src/components'),
114
- constants: path.resolve(__dirname, '../src/constants'),
115
- context: path.resolve(__dirname, '../src/context'),
116
- features: path.resolve(__dirname, '../src/features'),
117
- hooks: path.resolve(__dirname, '../src/hooks'),
118
- models: path.resolve(__dirname, '../src/models'),
119
- services: path.resolve(__dirname, '../src/services'),
120
- types: path.resolve(__dirname, '../src/types'),
121
- utils: path.resolve(__dirname, '../src/utils'),
122
- },
123
- },
124
- server: {
125
- port: 3001,
126
- open: true,
127
- host: true,
128
- allowedHosts: [
129
- 'localhost',
130
- '.localhost',
131
- // Cho phép tất cả ngrok-free.app và ngrok.io hosts
132
- '.ngrok-free.app',
133
- '.ngrok.io',
134
- ],
135
- },
136
- optimizeDeps: {
137
- // Force prebundle để tránh conflict React versions
138
- include: ['react', 'react-dom'],
139
- // Ensure all React references use the same instance
140
- dedupe: ['react', 'react-dom'],
141
- },
142
- });
1
+ import { defineConfig, Plugin } from 'vite';
2
+ import react from '@vitejs/plugin-react';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import postcss from 'postcss';
6
+ import tailwindcss from 'tailwindcss';
7
+ import autoprefixer from 'autoprefixer';
8
+
9
+ // Custom plugin to handle CSS imports as strings (matching Rollup's postcss behavior)
10
+ const cssAsStringPlugin = (): Plugin => {
11
+ let postcssProcessor: any;
12
+
13
+ return {
14
+ name: 'css-as-string',
15
+ enforce: 'pre',
16
+
17
+ async configResolved(config) {
18
+ // Initialize PostCSS processor with Tailwind
19
+ postcssProcessor = postcss([
20
+ tailwindcss({
21
+ config: path.resolve(__dirname, 'tailwind.config.cjs'),
22
+ }),
23
+ autoprefixer(),
24
+ ]);
25
+ },
26
+
27
+ async resolveId(source, importer) {
28
+ // Handle CSS imports from the library
29
+ if (source.endsWith('.css') && importer) {
30
+ // Check if this is from our library (any src folder) or @clikvn packages
31
+ const isLibraryCSS =
32
+ importer.includes('/showroom-visualizer/src/') ||
33
+ source.includes('@clikvn/');
34
+
35
+ if (isLibraryCSS) {
36
+ // Resolve the full path
37
+ let resolvedPath: string;
38
+
39
+ if (source.startsWith('.') || source.startsWith('/')) {
40
+ resolvedPath = path.resolve(path.dirname(importer), source);
41
+ } else if (source.startsWith('@clikvn/')) {
42
+ // Handle @clikvn packages - look in parent node_modules
43
+ const packagePath = source.replace(
44
+ '@clikvn/',
45
+ '../node_modules/@clikvn/'
46
+ );
47
+ resolvedPath = path.resolve(__dirname, packagePath);
48
+ } else {
49
+ return null;
50
+ }
51
+
52
+ // Add a virtual marker to bypass Vite's CSS processing
53
+ return '\0' + resolvedPath + '.string';
54
+ }
55
+ }
56
+ return null;
57
+ },
58
+
59
+ async load(id) {
60
+ // Handle our virtual CSS string modules
61
+ if (id.startsWith('\0') && id.endsWith('.css.string')) {
62
+ const realPath = id.slice(1, -7); // Remove \0 prefix and .string suffix
63
+
64
+ try {
65
+ const content = await fs.promises.readFile(realPath, 'utf-8');
66
+
67
+ // Process all CSS through PostCSS/Tailwind to ensure Tailwind utilities work
68
+ let processedContent = content;
69
+ try {
70
+ const result = await postcssProcessor.process(content, {
71
+ from: realPath,
72
+ });
73
+ processedContent = result.css;
74
+ } catch (error) {
75
+ console.warn(`PostCSS processing failed for ${realPath}:`, error);
76
+ // Fall back to original content if processing fails
77
+ processedContent = content;
78
+ }
79
+
80
+ return {
81
+ code: `export default ${JSON.stringify(processedContent)};`,
82
+ map: null,
83
+ };
84
+ } catch (error) {
85
+ console.error(`Failed to load CSS file: ${realPath}`, error);
86
+ return {
87
+ code: `export default "";`,
88
+ map: null,
89
+ };
90
+ }
91
+ }
92
+ return null;
93
+ },
94
+ };
95
+ };
96
+
97
+ // https://vitejs.dev/config/
98
+ export default defineConfig({
99
+ plugins: [cssAsStringPlugin(), react()],
100
+ resolve: {
101
+ alias: {
102
+ // Force use of example's React to avoid duplicate instances
103
+ react: path.resolve(__dirname, 'node_modules/react'),
104
+ 'react-dom': path.resolve(__dirname, 'node_modules/react-dom'),
105
+ 'react/jsx-runtime': path.resolve(
106
+ __dirname,
107
+ 'node_modules/react/jsx-runtime'
108
+ ),
109
+ // Alias để import trực tiếp từ source code thay vì build
110
+ '@clikvn/showroom-visualizer': path.resolve(__dirname, '../src'),
111
+ // Thư viện sử dụng baseUrl: "./src" nên tất cả imports cần aliases
112
+ commons: path.resolve(__dirname, '../src/commons'),
113
+ components: path.resolve(__dirname, '../src/components'),
114
+ constants: path.resolve(__dirname, '../src/constants'),
115
+ context: path.resolve(__dirname, '../src/context'),
116
+ features: path.resolve(__dirname, '../src/features'),
117
+ hooks: path.resolve(__dirname, '../src/hooks'),
118
+ models: path.resolve(__dirname, '../src/models'),
119
+ services: path.resolve(__dirname, '../src/services'),
120
+ types: path.resolve(__dirname, '../src/types'),
121
+ utils: path.resolve(__dirname, '../src/utils'),
122
+ },
123
+ },
124
+ server: {
125
+ port: 3001,
126
+ open: true,
127
+ host: true,
128
+ allowedHosts: [
129
+ 'localhost',
130
+ '.localhost',
131
+ // Cho phép tất cả ngrok-free.app và ngrok.io hosts
132
+ '.ngrok-free.app',
133
+ '.ngrok.io',
134
+ ],
135
+ },
136
+ optimizeDeps: {
137
+ // Force prebundle để tránh conflict React versions
138
+ include: ['react', 'react-dom'],
139
+ // Ensure all React references use the same instance
140
+ dedupe: ['react', 'react-dom'],
141
+ },
142
+ });
package/package.json CHANGED
@@ -1,133 +1,133 @@
1
- {
2
- "name": "@clikvn/showroom-visualizer",
3
- "description": "Showroom Visualizer",
4
- "version": "0.4.1-dev-13",
5
- "author": "Clik JSC",
6
- "license": "ISC",
7
- "type": "module",
8
- "main": "dist/index.js",
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
- "scripts": {
19
- "dev": "rollup --watch --config rollup.config.js",
20
- "build": "rollup --config rollup.config.js",
21
- "lint": "eslint src --format=compact",
22
- "lint:fix": "eslint --fix src --format=compact",
23
- "prettier": "prettier --write .",
24
- "pub": "npm publish --access public",
25
- "deploy": "npm login && yarn build && npm publish --access public"
26
- },
27
- "dependencies": {
28
- "@clikvn/react-bottom-sheet": "^1.0.3",
29
- "@clikvn/react-gallery-viewer": "^1.2.3-dev",
30
- "@fortawesome/fontawesome-svg-core": "^6.6.0",
31
- "@fortawesome/free-brands-svg-icons": "^6.6.0",
32
- "@fortawesome/free-regular-svg-icons": "^6.6.0",
33
- "@fortawesome/free-solid-svg-icons": "^6.6.0",
34
- "@fortawesome/react-fontawesome": "^0.2.2",
35
- "@radix-ui/react-slot": "^1.1.1",
36
- "@react-spring/web": "^10.0.3",
37
- "@ts-stack/markdown": "1.4.0",
38
- "@types/moment": "^2.13.0",
39
- "antd": "^5.27.2",
40
- "axios": "^1.11.0",
41
- "class-variance-authority": "^0.7.1",
42
- "classnames": "^2.5.1",
43
- "clsx": "^2.1.1",
44
- "date-fns": "^4.1.0",
45
- "device-detector-js": "^3.0.3",
46
- "embla-carousel-react": "^8.6.0",
47
- "framer-motion": "^12.23.12",
48
- "howler": "^2.2.4",
49
- "i18next": "^25.5.1",
50
- "lodash": "^4.17.21",
51
- "lucide-react": "^0.544.0",
52
- "moment": "^2.30.1",
53
- "node-fetch": "^3.3.2",
54
- "qrcode.react": "^4.2.0",
55
- "rc-progress": "^4.0.0",
56
- "react": "^18.3.1",
57
- "react-dom": "^18.3.1",
58
- "react-i18next": "^15.7.3",
59
- "react-intersection-image": "^2.1.2",
60
- "react-markdown": "^9.0.3",
61
- "react-planet": "^1.0.1-ie11",
62
- "react-slick": "^0.31.0",
63
- "react-truncate-markup": "^5.1.2",
64
- "react-zoom-pan-pinch": "^3.7.0",
65
- "remark-gfm": "^4.0.0",
66
- "signals": "^1.0.0",
67
- "sonner": "^2.0.7",
68
- "swr": "^2.3.0",
69
- "usehooks-ts": "^3.1.0",
70
- "vtt.js": "^0.13.0",
71
- "web-vitals": "^2.1.0"
72
- },
73
- "eslintConfig": {
74
- "extends": [
75
- "react-app",
76
- "react-app/jest"
77
- ]
78
- },
79
- "browserslist": {
80
- "production": [
81
- ">0.2%",
82
- "not dead",
83
- "not op_mini all"
84
- ],
85
- "development": [
86
- "last 1 chrome version",
87
- "last 1 firefox version",
88
- "last 1 safari version"
89
- ]
90
- },
91
- "devDependencies": {
92
- "@rollup-extras/plugin-copy": "^1.11.1",
93
- "@rollup/plugin-babel": "^6.0.4",
94
- "@rollup/plugin-commonjs": "^28.0.1",
95
- "@rollup/plugin-json": "^6.1.0",
96
- "@rollup/plugin-node-resolve": "^15.3.0",
97
- "@rollup/plugin-typescript": "^12.1.1",
98
- "@tailwindcss/typography": "^0.5.15",
99
- "@testing-library/jest-dom": "^5.14.1",
100
- "@testing-library/react": "^13.0.0",
101
- "@testing-library/user-event": "^13.2.1",
102
- "@types/howler": "^2.2.12",
103
- "@types/jest": "^29.5.14",
104
- "@types/lodash": "^4.17.20",
105
- "@types/node": "^22.9.0",
106
- "@types/node-fetch": "^2.6.13",
107
- "@types/react": "^18.3.12",
108
- "@types/react-dom": "^18.3.1",
109
- "@types/signals": "^1.0.4",
110
- "@typescript-eslint/eslint-plugin": "^8.20.0",
111
- "@typescript-eslint/parser": "^8.20.0",
112
- "autoprefixer": "^10.4.20",
113
- "eslint": "^8.57.0",
114
- "eslint-config-prettier": "^10.0.1",
115
- "eslint-plugin-prettier": "^5.2.2",
116
- "prettier": "^3.4.2",
117
- "react-scripts": "5.0.1",
118
- "rollup": "^4.26.0",
119
- "rollup-plugin-peer-deps-external": "^2.2.4",
120
- "rollup-plugin-postcss": "^4.0.2",
121
- "rollup-plugin-replace": "^2.2.0",
122
- "rollup-plugin-terser": "^7.0.2",
123
- "rollup-plugin-typescript-paths": "^1.5.0",
124
- "rollup-plugin-uglify": "^6.0.4",
125
- "tailwind-merge": "^2.6.0",
126
- "tailwindcss": "^3.4.15",
127
- "tailwindcss-animate": "^1.0.7",
128
- "typescript": "^5.6.3"
129
- },
130
- "engines": {
131
- "node": ">=18.18.0"
132
- }
133
- }
1
+ {
2
+ "name": "@clikvn/showroom-visualizer",
3
+ "description": "Showroom Visualizer",
4
+ "version": "0.4.1-dev-14",
5
+ "author": "Clik JSC",
6
+ "license": "ISC",
7
+ "type": "module",
8
+ "main": "dist/index.js",
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
+ "scripts": {
19
+ "dev": "rollup --watch --config rollup.config.js",
20
+ "build": "rollup --config rollup.config.js",
21
+ "lint": "eslint src --format=compact",
22
+ "lint:fix": "eslint --fix src --format=compact",
23
+ "prettier": "prettier --write .",
24
+ "pub": "npm publish --access public",
25
+ "deploy": "npm login && yarn build && npm publish --access public"
26
+ },
27
+ "dependencies": {
28
+ "@clikvn/react-bottom-sheet": "^1.0.3",
29
+ "@clikvn/react-gallery-viewer": "^1.2.3-dev",
30
+ "@fortawesome/fontawesome-svg-core": "^6.6.0",
31
+ "@fortawesome/free-brands-svg-icons": "^6.6.0",
32
+ "@fortawesome/free-regular-svg-icons": "^6.6.0",
33
+ "@fortawesome/free-solid-svg-icons": "^6.6.0",
34
+ "@fortawesome/react-fontawesome": "^0.2.2",
35
+ "@radix-ui/react-slot": "^1.1.1",
36
+ "@react-spring/web": "^10.0.3",
37
+ "@ts-stack/markdown": "1.4.0",
38
+ "@types/moment": "^2.13.0",
39
+ "antd": "^5.27.2",
40
+ "axios": "^1.11.0",
41
+ "class-variance-authority": "^0.7.1",
42
+ "classnames": "^2.5.1",
43
+ "clsx": "^2.1.1",
44
+ "date-fns": "^4.1.0",
45
+ "device-detector-js": "^3.0.3",
46
+ "embla-carousel-react": "^8.6.0",
47
+ "framer-motion": "^12.23.12",
48
+ "howler": "^2.2.4",
49
+ "i18next": "^25.5.1",
50
+ "lodash": "^4.17.21",
51
+ "lucide-react": "^0.544.0",
52
+ "moment": "^2.30.1",
53
+ "node-fetch": "^3.3.2",
54
+ "qrcode.react": "^4.2.0",
55
+ "rc-progress": "^4.0.0",
56
+ "react": "^18.3.1",
57
+ "react-dom": "^18.3.1",
58
+ "react-i18next": "^15.7.3",
59
+ "react-intersection-image": "^2.1.2",
60
+ "react-markdown": "^9.0.3",
61
+ "react-planet": "^1.0.1-ie11",
62
+ "react-slick": "^0.31.0",
63
+ "react-truncate-markup": "^5.1.2",
64
+ "react-zoom-pan-pinch": "^3.7.0",
65
+ "remark-gfm": "^4.0.0",
66
+ "signals": "^1.0.0",
67
+ "sonner": "^2.0.7",
68
+ "swr": "^2.3.0",
69
+ "usehooks-ts": "^3.1.0",
70
+ "vtt.js": "^0.13.0",
71
+ "web-vitals": "^2.1.0"
72
+ },
73
+ "eslintConfig": {
74
+ "extends": [
75
+ "react-app",
76
+ "react-app/jest"
77
+ ]
78
+ },
79
+ "browserslist": {
80
+ "production": [
81
+ ">0.2%",
82
+ "not dead",
83
+ "not op_mini all"
84
+ ],
85
+ "development": [
86
+ "last 1 chrome version",
87
+ "last 1 firefox version",
88
+ "last 1 safari version"
89
+ ]
90
+ },
91
+ "devDependencies": {
92
+ "@rollup-extras/plugin-copy": "^1.11.1",
93
+ "@rollup/plugin-babel": "^6.0.4",
94
+ "@rollup/plugin-commonjs": "^28.0.1",
95
+ "@rollup/plugin-json": "^6.1.0",
96
+ "@rollup/plugin-node-resolve": "^15.3.0",
97
+ "@rollup/plugin-typescript": "^12.1.1",
98
+ "@tailwindcss/typography": "^0.5.15",
99
+ "@testing-library/jest-dom": "^5.14.1",
100
+ "@testing-library/react": "^13.0.0",
101
+ "@testing-library/user-event": "^13.2.1",
102
+ "@types/howler": "^2.2.12",
103
+ "@types/jest": "^29.5.14",
104
+ "@types/lodash": "^4.17.20",
105
+ "@types/node": "^22.9.0",
106
+ "@types/node-fetch": "^2.6.13",
107
+ "@types/react": "^18.3.12",
108
+ "@types/react-dom": "^18.3.1",
109
+ "@types/signals": "^1.0.4",
110
+ "@typescript-eslint/eslint-plugin": "^8.20.0",
111
+ "@typescript-eslint/parser": "^8.20.0",
112
+ "autoprefixer": "^10.4.20",
113
+ "eslint": "^8.57.0",
114
+ "eslint-config-prettier": "^10.0.1",
115
+ "eslint-plugin-prettier": "^5.2.2",
116
+ "prettier": "^3.4.2",
117
+ "react-scripts": "5.0.1",
118
+ "rollup": "^4.26.0",
119
+ "rollup-plugin-peer-deps-external": "^2.2.4",
120
+ "rollup-plugin-postcss": "^4.0.2",
121
+ "rollup-plugin-replace": "^2.2.0",
122
+ "rollup-plugin-terser": "^7.0.2",
123
+ "rollup-plugin-typescript-paths": "^1.5.0",
124
+ "rollup-plugin-uglify": "^6.0.4",
125
+ "tailwind-merge": "^2.6.0",
126
+ "tailwindcss": "^3.4.15",
127
+ "tailwindcss-animate": "^1.0.7",
128
+ "typescript": "^5.6.3"
129
+ },
130
+ "engines": {
131
+ "node": ">=18.18.0"
132
+ }
133
+ }