update 13/01

This commit is contained in:
2026-01-13 17:22:12 +07:00
parent da37dc67e7
commit 229bdbde54
23 changed files with 7751 additions and 6309 deletions

403
package-lock.json generated
View File

@@ -8,6 +8,7 @@
"name": "hoanghapc", "name": "hoanghapc",
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@fancyapps/ui": "5.0",
"next": "16.1.0", "next": "16.1.0",
"react": "19.2.3", "react": "19.2.3",
"react-dom": "19.2.3", "react-dom": "19.2.3",
@@ -39,12 +40,12 @@
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
"version": "7.27.1", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-validator-identifier": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5",
"js-tokens": "^4.0.0", "js-tokens": "^4.0.0",
"picocolors": "^1.1.1" "picocolors": "^1.1.1"
}, },
@@ -53,29 +54,29 @@
} }
}, },
"node_modules/@babel/compat-data": { "node_modules/@babel/compat-data": {
"version": "7.28.5", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz",
"integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/core": { "node_modules/@babel/core": {
"version": "7.28.5", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz",
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.27.1", "@babel/code-frame": "^7.28.6",
"@babel/generator": "^7.28.5", "@babel/generator": "^7.28.6",
"@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-compilation-targets": "^7.28.6",
"@babel/helper-module-transforms": "^7.28.3", "@babel/helper-module-transforms": "^7.28.6",
"@babel/helpers": "^7.28.4", "@babel/helpers": "^7.28.6",
"@babel/parser": "^7.28.5", "@babel/parser": "^7.28.6",
"@babel/template": "^7.27.2", "@babel/template": "^7.28.6",
"@babel/traverse": "^7.28.5", "@babel/traverse": "^7.28.6",
"@babel/types": "^7.28.5", "@babel/types": "^7.28.6",
"@jridgewell/remapping": "^2.3.5", "@jridgewell/remapping": "^2.3.5",
"convert-source-map": "^2.0.0", "convert-source-map": "^2.0.0",
"debug": "^4.1.0", "debug": "^4.1.0",
@@ -92,13 +93,13 @@
} }
}, },
"node_modules/@babel/generator": { "node_modules/@babel/generator": {
"version": "7.28.5", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz",
"integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/parser": "^7.28.5", "@babel/parser": "^7.28.6",
"@babel/types": "^7.28.5", "@babel/types": "^7.28.6",
"@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28", "@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2" "jsesc": "^3.0.2"
@@ -108,12 +109,12 @@
} }
}, },
"node_modules/@babel/helper-compilation-targets": { "node_modules/@babel/helper-compilation-targets": {
"version": "7.27.2", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/compat-data": "^7.27.2", "@babel/compat-data": "^7.28.6",
"@babel/helper-validator-option": "^7.27.1", "@babel/helper-validator-option": "^7.27.1",
"browserslist": "^4.24.0", "browserslist": "^4.24.0",
"lru-cache": "^5.1.1", "lru-cache": "^5.1.1",
@@ -133,27 +134,27 @@
} }
}, },
"node_modules/@babel/helper-module-imports": { "node_modules/@babel/helper-module-imports": {
"version": "7.27.1", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
"integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/traverse": "^7.27.1", "@babel/traverse": "^7.28.6",
"@babel/types": "^7.27.1" "@babel/types": "^7.28.6"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helper-module-transforms": { "node_modules/@babel/helper-module-transforms": {
"version": "7.28.3", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
"integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-module-imports": "^7.27.1", "@babel/helper-module-imports": "^7.28.6",
"@babel/helper-validator-identifier": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5",
"@babel/traverse": "^7.28.3" "@babel/traverse": "^7.28.6"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@@ -190,25 +191,25 @@
} }
}, },
"node_modules/@babel/helpers": { "node_modules/@babel/helpers": {
"version": "7.28.4", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
"integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/template": "^7.27.2", "@babel/template": "^7.28.6",
"@babel/types": "^7.28.4" "@babel/types": "^7.28.6"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.28.5", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz",
"integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/types": "^7.28.5" "@babel/types": "^7.28.6"
}, },
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
@@ -218,31 +219,31 @@
} }
}, },
"node_modules/@babel/template": { "node_modules/@babel/template": {
"version": "7.27.2", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.27.1", "@babel/code-frame": "^7.28.6",
"@babel/parser": "^7.27.2", "@babel/parser": "^7.28.6",
"@babel/types": "^7.27.1" "@babel/types": "^7.28.6"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/traverse": { "node_modules/@babel/traverse": {
"version": "7.28.5", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz",
"integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.27.1", "@babel/code-frame": "^7.28.6",
"@babel/generator": "^7.28.5", "@babel/generator": "^7.28.6",
"@babel/helper-globals": "^7.28.0", "@babel/helper-globals": "^7.28.0",
"@babel/parser": "^7.28.5", "@babel/parser": "^7.28.6",
"@babel/template": "^7.27.2", "@babel/template": "^7.28.6",
"@babel/types": "^7.28.5", "@babel/types": "^7.28.6",
"debug": "^4.3.1" "debug": "^4.3.1"
}, },
"engines": { "engines": {
@@ -250,9 +251,9 @@
} }
}, },
"node_modules/@babel/types": { "node_modules/@babel/types": {
"version": "7.28.5", "version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
"integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-string-parser": "^7.27.1", "@babel/helper-string-parser": "^7.27.1",
@@ -263,9 +264,9 @@
} }
}, },
"node_modules/@emnapi/core": { "node_modules/@emnapi/core": {
"version": "1.7.1", "version": "1.8.1",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz",
"integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==",
"dev": true, "dev": true,
"optional": true, "optional": true,
"dependencies": { "dependencies": {
@@ -274,9 +275,9 @@
} }
}, },
"node_modules/@emnapi/runtime": { "node_modules/@emnapi/runtime": {
"version": "1.7.1", "version": "1.8.1",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz",
"integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"tslib": "^2.4.0" "tslib": "^2.4.0"
@@ -293,9 +294,9 @@
} }
}, },
"node_modules/@eslint-community/eslint-utils": { "node_modules/@eslint-community/eslint-utils": {
"version": "4.9.0", "version": "4.9.1",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
"integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"eslint-visitor-keys": "^3.4.3" "eslint-visitor-keys": "^3.4.3"
@@ -426,6 +427,11 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
} }
}, },
"node_modules/@fancyapps/ui": {
"version": "5.0.36",
"resolved": "https://registry.npmjs.org/@fancyapps/ui/-/ui-5.0.36.tgz",
"integrity": "sha512-GMygQzp1MBTFNTT6AzpbL6pXTD6bTxwjmmpI1fe8Ozmmiseu8/g82Sudl1YhcbZmS4bJgaBOF5THDFGpXQ1fDw=="
},
"node_modules/@humanfs/core": { "node_modules/@humanfs/core": {
"version": "0.19.1", "version": "0.19.1",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@@ -1091,21 +1097,6 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@next/swc-win32-x64-msvc": {
"version": "16.1.0",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.0.tgz",
"integrity": "sha512-Tr0j94MphimCCks+1rtYPzQFK+faJuhHWCegU9S9gDlgyOk8Y3kPmO64UcjyzZAlligeBtYZ/2bEyrKq0d2wqQ==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@nodelib/fs.scandir": { "node_modules/@nodelib/fs.scandir": {
"version": "2.1.5", "version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -1391,7 +1382,7 @@
"node": ">= 10" "node": ">= 10"
} }
}, },
"node_modules/@tailwindcss/oxide-win32-x64-msvc": { "node_modules/@tailwindcss/oxide/node_modules/@tailwindcss/oxide-win32-x64-msvc": {
"version": "4.1.18", "version": "4.1.18",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz",
"integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==",
@@ -1449,18 +1440,18 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.19.27", "version": "20.19.28",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.28.tgz",
"integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", "integrity": "sha512-VyKBr25BuFDzBFCK5sUM6ZXiWfqgCTwTAOK8qzGV/m9FCirXYDlmczJ+d5dXBAQALGCdRRdbteKYfJ84NGEusw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"undici-types": "~6.21.0" "undici-types": "~6.21.0"
} }
}, },
"node_modules/@types/react": { "node_modules/@types/react": {
"version": "19.2.7", "version": "19.2.8",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz",
"integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"csstype": "^3.2.2" "csstype": "^3.2.2"
@@ -1476,19 +1467,19 @@
} }
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.50.0", "version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz",
"integrity": "sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==", "integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.12.2",
"@typescript-eslint/scope-manager": "8.50.0", "@typescript-eslint/scope-manager": "8.53.0",
"@typescript-eslint/type-utils": "8.50.0", "@typescript-eslint/type-utils": "8.53.0",
"@typescript-eslint/utils": "8.50.0", "@typescript-eslint/utils": "8.53.0",
"@typescript-eslint/visitor-keys": "8.50.0", "@typescript-eslint/visitor-keys": "8.53.0",
"ignore": "^7.0.0", "ignore": "^7.0.5",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
"ts-api-utils": "^2.1.0" "ts-api-utils": "^2.4.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1498,7 +1489,7 @@
"url": "https://opencollective.com/typescript-eslint" "url": "https://opencollective.com/typescript-eslint"
}, },
"peerDependencies": { "peerDependencies": {
"@typescript-eslint/parser": "^8.50.0", "@typescript-eslint/parser": "^8.53.0",
"eslint": "^8.57.0 || ^9.0.0", "eslint": "^8.57.0 || ^9.0.0",
"typescript": ">=4.8.4 <6.0.0" "typescript": ">=4.8.4 <6.0.0"
} }
@@ -1513,16 +1504,16 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "8.50.0", "version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.0.tgz",
"integrity": "sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==", "integrity": "sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.50.0", "@typescript-eslint/scope-manager": "8.53.0",
"@typescript-eslint/types": "8.50.0", "@typescript-eslint/types": "8.53.0",
"@typescript-eslint/typescript-estree": "8.50.0", "@typescript-eslint/typescript-estree": "8.53.0",
"@typescript-eslint/visitor-keys": "8.50.0", "@typescript-eslint/visitor-keys": "8.53.0",
"debug": "^4.3.4" "debug": "^4.4.3"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1537,14 +1528,14 @@
} }
}, },
"node_modules/@typescript-eslint/project-service": { "node_modules/@typescript-eslint/project-service": {
"version": "8.50.0", "version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz",
"integrity": "sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==", "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/tsconfig-utils": "^8.50.0", "@typescript-eslint/tsconfig-utils": "^8.53.0",
"@typescript-eslint/types": "^8.50.0", "@typescript-eslint/types": "^8.53.0",
"debug": "^4.3.4" "debug": "^4.4.3"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1558,13 +1549,13 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "8.50.0", "version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz",
"integrity": "sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==", "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.50.0", "@typescript-eslint/types": "8.53.0",
"@typescript-eslint/visitor-keys": "8.50.0" "@typescript-eslint/visitor-keys": "8.53.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1575,9 +1566,9 @@
} }
}, },
"node_modules/@typescript-eslint/tsconfig-utils": { "node_modules/@typescript-eslint/tsconfig-utils": {
"version": "8.50.0", "version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz",
"integrity": "sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==", "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1591,16 +1582,16 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "8.50.0", "version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz",
"integrity": "sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==", "integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.50.0", "@typescript-eslint/types": "8.53.0",
"@typescript-eslint/typescript-estree": "8.50.0", "@typescript-eslint/typescript-estree": "8.53.0",
"@typescript-eslint/utils": "8.50.0", "@typescript-eslint/utils": "8.53.0",
"debug": "^4.3.4", "debug": "^4.4.3",
"ts-api-utils": "^2.1.0" "ts-api-utils": "^2.4.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1615,9 +1606,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "8.50.0", "version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.0.tgz",
"integrity": "sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==", "integrity": "sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1628,20 +1619,20 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "8.50.0", "version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz",
"integrity": "sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==", "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/project-service": "8.50.0", "@typescript-eslint/project-service": "8.53.0",
"@typescript-eslint/tsconfig-utils": "8.50.0", "@typescript-eslint/tsconfig-utils": "8.53.0",
"@typescript-eslint/types": "8.50.0", "@typescript-eslint/types": "8.53.0",
"@typescript-eslint/visitor-keys": "8.50.0", "@typescript-eslint/visitor-keys": "8.53.0",
"debug": "^4.3.4", "debug": "^4.4.3",
"minimatch": "^9.0.4", "minimatch": "^9.0.5",
"semver": "^7.6.0", "semver": "^7.7.3",
"tinyglobby": "^0.2.15", "tinyglobby": "^0.2.15",
"ts-api-utils": "^2.1.0" "ts-api-utils": "^2.4.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1691,15 +1682,15 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "8.50.0", "version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.0.tgz",
"integrity": "sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==", "integrity": "sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.7.0", "@eslint-community/eslint-utils": "^4.9.1",
"@typescript-eslint/scope-manager": "8.50.0", "@typescript-eslint/scope-manager": "8.53.0",
"@typescript-eslint/types": "8.50.0", "@typescript-eslint/types": "8.53.0",
"@typescript-eslint/typescript-estree": "8.50.0" "@typescript-eslint/typescript-estree": "8.53.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1714,12 +1705,12 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "8.50.0", "version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz",
"integrity": "sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==", "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.50.0", "@typescript-eslint/types": "8.53.0",
"eslint-visitor-keys": "^4.2.1" "eslint-visitor-keys": "^4.2.1"
}, },
"engines": { "engines": {
@@ -2266,9 +2257,9 @@
} }
}, },
"node_modules/axe-core": { "node_modules/axe-core": {
"version": "4.11.0", "version": "4.11.1",
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz",
"integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=4" "node": ">=4"
@@ -2290,9 +2281,9 @@
"dev": true "dev": true
}, },
"node_modules/baseline-browser-mapping": { "node_modules/baseline-browser-mapping": {
"version": "2.9.11", "version": "2.9.14",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz",
"integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==",
"bin": { "bin": {
"baseline-browser-mapping": "dist/cli.js" "baseline-browser-mapping": "dist/cli.js"
} }
@@ -2409,9 +2400,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001761", "version": "1.0.30001764",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz",
"integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -3224,9 +3215,9 @@
} }
}, },
"node_modules/esquery": { "node_modules/esquery": {
"version": "1.6.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"estraverse": "^5.1.0" "estraverse": "^5.1.0"
@@ -3312,9 +3303,9 @@
"dev": true "dev": true
}, },
"node_modules/fastq": { "node_modules/fastq": {
"version": "1.19.1", "version": "1.20.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
"integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"reusify": "^1.0.4" "reusify": "^1.0.4"
@@ -4507,7 +4498,7 @@
"url": "https://opencollective.com/parcel" "url": "https://opencollective.com/parcel"
} }
}, },
"node_modules/lightningcss-win32-x64-msvc": { "node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": {
"version": "1.30.2", "version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz",
"integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==",
@@ -4726,6 +4717,21 @@
} }
} }
}, },
"node_modules/next/node_modules/@next/swc-win32-x64-msvc": {
"version": "16.1.0",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.0.tgz",
"integrity": "sha512-Tr0j94MphimCCks+1rtYPzQFK+faJuhHWCegU9S9gDlgyOk8Y3kPmO64UcjyzZAlligeBtYZ/2bEyrKq0d2wqQ==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/next/node_modules/postcss": { "node_modules/next/node_modules/postcss": {
"version": "8.4.31", "version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
@@ -5778,9 +5784,9 @@
} }
}, },
"node_modules/ts-api-utils": { "node_modules/ts-api-utils": {
"version": "2.1.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=18.12" "node": ">=18.12"
@@ -5918,15 +5924,15 @@
} }
}, },
"node_modules/typescript-eslint": { "node_modules/typescript-eslint": {
"version": "8.50.0", "version": "8.53.0",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.0.tgz", "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.0.tgz",
"integrity": "sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==", "integrity": "sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/eslint-plugin": "8.50.0", "@typescript-eslint/eslint-plugin": "8.53.0",
"@typescript-eslint/parser": "8.50.0", "@typescript-eslint/parser": "8.53.0",
"@typescript-eslint/typescript-estree": "8.50.0", "@typescript-eslint/typescript-estree": "8.53.0",
"@typescript-eslint/utils": "8.50.0" "@typescript-eslint/utils": "8.53.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -6165,9 +6171,9 @@
} }
}, },
"node_modules/zod": { "node_modules/zod": {
"version": "4.2.1", "version": "4.3.5",
"resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz",
"integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==",
"dev": true, "dev": true,
"funding": { "funding": {
"url": "https://github.com/sponsors/colinhacks" "url": "https://github.com/sponsors/colinhacks"
@@ -6184,6 +6190,21 @@
"peerDependencies": { "peerDependencies": {
"zod": "^3.25.0 || ^4.0.0" "zod": "^3.25.0 || ^4.0.0"
} }
},
"node_modules/@next/swc-win32-x64-msvc": {
"version": "16.1.0",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.0.tgz",
"integrity": "sha512-Tr0j94MphimCCks+1rtYPzQFK+faJuhHWCegU9S9gDlgyOk8Y3kPmO64UcjyzZAlligeBtYZ/2bEyrKq0d2wqQ==",
"cpu": [
"x64"
],
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
} }
} }
} }

View File

@@ -9,6 +9,7 @@
"lint": "eslint" "lint": "eslint"
}, },
"dependencies": { "dependencies": {
"@fancyapps/ui": "5.0",
"next": "16.1.0", "next": "16.1.0",
"react": "19.2.3", "react": "19.2.3",
"react-dom": "19.2.3", "react-dom": "19.2.3",

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
// src/app/[slug]/page.tsx // src/app/[slug]/page.tsx
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import { findBySlug } from "@/lib/slugMap"; import { findBySlug } from "@/lib/slug/slugMap";
import ProductCategory from "@/components/product/Category"; import ProductCategory from "@/components/product/Category";
import ProductDetail from "@/components/product/ProductDetail"; import ProductDetail from "@/components/product/ProductDetail";
@@ -21,16 +21,16 @@ export default async function SlugPage({
switch (result.type) { switch (result.type) {
case "product_category": case "product_category":
return <ProductCategory data={result.data} />; return <ProductCategory slug={result.data} />;
case "product_detail": case "product_detail":
return <ProductDetail data={result.data} />; return <ProductDetail slug={result.data} />;
case "article_home": case "article_home":
return <ArticleHome slug={slug} />; return <ArticleHome slug={slug} />;
case "article_category": case "article_category":
return <ArticleCategory data={result.data} />; return <ArticleCategory slug={result.data} />;
case "article_detail": case "article_detail":
return <ArticleDetail slug={result.data.slug} />; return <ArticleDetail slug={result.data.slug} />;

View File

@@ -1,9 +1,9 @@
import Showroom from './Showroom'; import Showroom from './Showroom';
import PageInfo from './Info'; import PageInfo from './Info';
import Newsletter from './Newsletter'; import Newsletter from './Newsletter';
import Hotline from '../Global/Hotline'; import FixedButtons from '../../shared/FixedButtons';
import FeedBack from '../Global/Feedback'; import Hotline from '../../shared/Hotline';
import FixedButtons from '../Global/FixedButtons'; import FeedBack from '../../shared/Feedback';
export default function Footer() { export default function Footer() {

View File

@@ -1,3 +1,5 @@
import Link from 'next/link';
export default function Account(){ export default function Account(){
return ( return (
<div className="header-account bg-[#003ED0] rounded-[30px] group"> <div className="header-account bg-[#003ED0] rounded-[30px] group">
@@ -7,40 +9,40 @@ export default function Account(){
</button> </button>
<div className="bg-white text-[#000] text-16 leading-6 absolute top-[150%] right-0 whitespace-nowrap min-w-[220px] overflow-hidden rounded-md shadow-[0px_4px_10px_0px_#0000001a] transition-all duration-200 z-[-1] invisible opacity-0 group-hover:opacity-100 group-hover:visible group-hover:z-[9] group-hover:top-[100%] group-hover:visible"> <div className="bg-white text-[#000] text-16 leading-6 absolute top-[150%] right-0 whitespace-nowrap min-w-[220px] overflow-hidden rounded-md shadow-[0px_4px_10px_0px_#0000001a] transition-all duration-200 z-[-1] invisible opacity-0 group-hover:opacity-100 group-hover:visible group-hover:z-[9] group-hover:top-[100%] group-hover:visible">
<a href="javascript:void(0)" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white"> <Link href="/dang-ky" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white w-full text-left">
<i className="bx bx-user w-5 h-5 text-center mr-2 text-20"></i> <i className="bx bx-user w-5 h-5 text-center mr-2 text-20"></i>
<span>Đăng </span> <span>Đăng </span>
</a> </Link>
<a href="javascript:void(0)" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white"> <Link href="/dang-nhap" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white w-full text-left">
<i className="bx bx-user w-5 h-5 text-center mr-2 text-20"></i> <i className="bx bx-user w-5 h-5 text-center mr-2 text-20"></i>
<span>Đăng nhập</span> <span>Đăng nhập</span>
</a> </Link>
<a href="/taikhoan?view=change-info" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white"> <Link href="/taikhoan?view=change-info" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white">
<i className="bx bx-user w-5 h-5 text-center mr-2 text-20"></i> <i className="bx bx-user w-5 h-5 text-center mr-2 text-20"></i>
<span>Thông tin tài khoản</span> <span>Thông tin tài khoản</span>
</a> </Link>
<a href="/taikhoan?view=order" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white"> <Link href="/taikhoan?view=order" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white">
<i className="bx bx-list-ul-square w-5 h-5 text-center mr-2 text-20"></i> <i className="bx bx-list-ul-square w-5 h-5 text-center mr-2 text-20"></i>
<span>Danh sách đơn hàng</span> <span>Danh sách đơn hàng</span>
</a> </Link>
<a href="/san-pham-da-xem" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white"> <Link href="/san-pham-da-xem" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white">
<i className="bx bx-eye w-5 h-5 text-center mr-2 text-20"></i> <i className="bx bx-eye w-5 h-5 text-center mr-2 text-20"></i>
<span>Sản phẩm đã xem</span> <span>Sản phẩm đã xem</span>
</a> </Link>
<a href="/taikhoan?view=change-pass" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white"> <Link href="/taikhoan?view=change-pass" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white">
<i className="bx bx-lock w-5 h-5 text-center mr-2 text-20"></i> <i className="bx bx-lock w-5 h-5 text-center mr-2 text-20"></i>
<span>Thay đi mật khẩu</span> <span>Thay đi mật khẩu</span>
</a> </Link>
<a href="/logout.php" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white"> <Link href="/logout.php" className="flex items-center px-3 py-3 transition-all duration-100 hover:bg-[#0676DA] hover:text-white">
<i className="bx bx-arrow-out-right-square-half w-5 h-5 text-center mr-2 text-20"></i> <i className="bx bx-arrow-out-right-square-half w-5 h-5 text-center mr-2 text-20"></i>
<span>Thoát tài khoản</span> <span>Thoát tài khoản</span>
</a> </Link>
</div> </div>
</div> </div>
) )

View File

@@ -1,13 +1,15 @@
import Link from "next/link";
export default function Cart(){ export default function Cart(){
return( return(
<> <>
<div className="header-cart-item" id="js-header-cart"> <div className="header-cart-item" id="js-header-cart">
<a href="/cart" rel="nofollow" className="flex items-center"> <Link href="/cart" rel="nofollow" className="flex items-center">
<i className="icon-cart relative mr-[10px]"> <i className="icon-cart relative mr-[10px]">
<b className="js-cart-count cart-count">0</b> <b className="js-cart-count cart-count">0</b>
</i> </i>
<span className="text"> Giỏ <br/>Hàng </span> <span className="text"> Giỏ <br/>Hàng </span>
</a> </Link>
<div className="header-cart-hover" id="js-header-cart-holder"> <div className="header-cart-hover" id="js-header-cart-holder">
<div className="cart-items-holder"><div className="cart-item"><a href="/o-cung-di-dong-ssd-transcend-esd310-1tb" className="cart-img"><img src="https://mygear.io.vn/media/product/75-6728-transcend-esd310-theme.jpg"/></a><div className="cart-text"><a href="/o-cung-di-dong-ssd-transcend-esd310-1tb" className="d-block font-700" style={{ marginBottom: '5px' }}> Cứng Di Đng SSD Transcend ESD310 1TB</a><p className="font-300" style={{ margin: '5px 0' }}> Màu sắc : <b>Màu Đen</b></p><p className="m-0 d-flex justify-content-between"><b>x2</b><b className="red">4.580.000 đ</b></p></div></div><div className="cart-item"><a href="/msi-pro-b860-p-wifi" className="cart-img"><img src="https://mygear.io.vn/media/product/75-7042-pro-b860-p-wifi-1.jpg"/></a><div className="cart-text"><a href="/msi-pro-b860-p-wifi" className="d-block font-700" style={{ marginBottom: '5px' }}>Mainboard MSI PRO B860-P WIFI DDR5</a><p className="m-0 d-flex justify-content-between"><b>x1</b><b className="red">6.190.000 đ</b></p></div></div></div><div className="cart-price-hover"><p className="grey m-0 text-right"> Tổng tiền hàng (<span className="red"><span className="js-cart-count">3</span> sản phẩm</span>): <span className="red text-18 font-600" style={{ verticalAlign: 'top' }}> 10.770.000đ </span></p><a href="/cart" className="d-block text-center text-white btn-goCart"> THANH TOÁN NGAY </a></div> <div className="cart-items-holder"><div className="cart-item"><a href="/o-cung-di-dong-ssd-transcend-esd310-1tb" className="cart-img"><img src="https://mygear.io.vn/media/product/75-6728-transcend-esd310-theme.jpg"/></a><div className="cart-text"><a href="/o-cung-di-dong-ssd-transcend-esd310-1tb" className="d-block font-700" style={{ marginBottom: '5px' }}> Cứng Di Đng SSD Transcend ESD310 1TB</a><p className="font-300" style={{ margin: '5px 0' }}> Màu sắc : <b>Màu Đen</b></p><p className="m-0 d-flex justify-content-between"><b>x2</b><b className="red">4.580.000 đ</b></p></div></div><div className="cart-item"><a href="/msi-pro-b860-p-wifi" className="cart-img"><img src="https://mygear.io.vn/media/product/75-7042-pro-b860-p-wifi-1.jpg"/></a><div className="cart-text"><a href="/msi-pro-b860-p-wifi" className="d-block font-700" style={{ marginBottom: '5px' }}>Mainboard MSI PRO B860-P WIFI DDR5</a><p className="m-0 d-flex justify-content-between"><b>x1</b><b className="red">6.190.000 đ</b></p></div></div></div><div className="cart-price-hover"><p className="grey m-0 text-right"> Tổng tiền hàng (<span className="red"><span className="js-cart-count">3</span> sản phẩm</span>): <span className="red text-18 font-600" style={{ verticalAlign: 'top' }}> 10.770.000đ </span></p><a href="/cart" className="d-block text-center text-white btn-goCart"> THANH TOÁN NGAY </a></div>

View File

@@ -1,7 +1,9 @@
import Link from "next/link";
export default function Logo(){ export default function Logo(){
return( return(
<a href="/"> <Link href="/">
<img src="/images/logo.png" alt="logo" width={1} height={1} className="block w-auto max-h-[56px]" /> <img src="/images/logo.png" alt="logo" width={1} height={1} className="block w-auto max-h-[56px]" />
</a> </Link>
) )
} }

File diff suppressed because one or more lines are too long

View File

@@ -1,30 +1,38 @@
'use client'; 'use client';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { usePathname } from 'next/navigation'
import useFancybox from '@/lib/useFancyBox';
import Link from 'next/link';
import Logo from "./Logo"; import Logo from "./Logo";
import Menu from "./Menu"; import Menu from "./Menu";
import Search from "./Search"; import Search from "./Search";
import Cart from "./Cart"; import Cart from "./Cart";
import Account from "./Account"; import Account from "./Account";
import { usePathname } from 'next/navigation'
export default function Header() { export default function Header() {
const pathname = usePathname() const pathname = usePathname()
const isHome = pathname === '/'; const isHome = pathname === '/';
const [isSticky, setIsSticky] = useState(false); const [isSticky, setIsSticky] = useState(false);
const [fancyboxRef] = useFancybox({});
useEffect(() => { useEffect(() => {
const scrollTop = isHome ? 800 : 400; const scrollTop = isHome ? 800 : 400;
const onScroll = () => { const onScroll = () => {
setIsSticky(window.scrollY > scrollTop); setIsSticky(window.scrollY > scrollTop);
}; };
window.addEventListener('scroll', onScroll); window.addEventListener('scroll', onScroll);
return () => window.removeEventListener('scroll', onScroll);
}, []); return () => {
window.removeEventListener('scroll', onScroll);
};
}, [isHome]);
return ( return (
<> <>
<div ref={fancyboxRef}>
<div className={`global-header-container py-5 ${isSticky ? 'is-fixed' : ''} ${isHome && !isSticky ? 'header-homepage' : ''}`}> <div className={`global-header-container py-5 ${isSticky ? 'is-fixed' : ''} ${isHome && !isSticky ? 'header-homepage' : ''}`}>
<div className="container flex items-center justify-between gap-5 relative"> <div className="container flex items-center justify-between gap-5 relative">
<div className="header-left-group w-[205px]"> <div className="header-left-group w-[205px]">
@@ -33,20 +41,22 @@ export default function Header() {
<div className="header-middle-group w-[583px] flex items-center justify-between gap-2"> <div className="header-middle-group w-[583px] flex items-center justify-between gap-2">
<Menu /> <Menu />
<Search /> <Search />
</div> </div>
<div className="header-right-group relative flex items-center justify-between gap-4 w-[420px] text-white leading-[18px] font-500"> <div className="header-right-group relative flex items-center justify-between gap-4 w-[420px] text-white leading-[18px] font-500">
<a href="#fancybox-headphone" className="flex items-center gap-2" data-fancybox> <a href="#fancybox-headphone"
data-fancybox="fancybox-hotline"
className="flex items-center gap-2"
>
<i className="icons icon-headphone"></i> <i className="icons icon-headphone"></i>
<span className="text"> Hotline<br/> Mua Hàng </span> <span className="text"> Hotline<br/> Mua Hàng </span>
</a> </a>
<a href="/he-thong-cua-hang" className="flex items-center gap-2"> <Link href="/he-thong-cua-hang" className="flex items-center gap-2">
<i className="icons icon-showroom"></i> <i className="icons icon-showroom"></i>
<span className="text"> Hệ thống<br/> Showroom </span> <span className="text"> Hệ thống<br/> Showroom </span>
</a> </Link>
<Cart /> <Cart />
@@ -57,37 +67,42 @@ export default function Header() {
<div className="bg-white shadow-[0px_4px_20px_0px_#004AA11A] text-16 font-500 mb-5"> <div className="bg-white shadow-[0px_4px_20px_0px_#004AA11A] text-16 font-500 mb-5">
<div className="container flex items-center justify-between leading-[20px] py-[17px]"> <div className="container flex items-center justify-between leading-[20px] py-[17px]">
<a href="/buildpc" className="flex items-center gap-2 hover:text-[#0678DB]"> <Link href="/buildpc" className="flex items-center gap-2 hover:text-[#0678DB]">
<i className="icons icon-buildpc"></i> <i className="icons icon-buildpc"></i>
<span> Xây Dựng Cấu Hình </span> <span> Xây Dựng Cấu Hình </span>
</a> </Link>
<a href="/designer-tool" className="flex items-center gap-2 hover:text-[#0678DB]"> <Link href="/designer-tool" className="flex items-center gap-2 hover:text-[#0678DB]">
<i className="icons icon-tool"></i> <i className="icons icon-tool"></i>
<span> PC Đ Họa Tool </span> <span> PC Đ Họa Tool </span>
</a> </Link>
<a href="/tin-khuyen-mai" className="flex items-center gap-2 hover:text-[#0678DB]"> <Link href="/tin-khuyen-mai" className="flex items-center gap-2 hover:text-[#0678DB]">
<i className="icons icon-promotion"></i> <i className="icons icon-promotion"></i>
<span> Chương Trình Khuyến Mãi </span> <span> Chương Trình Khuyến Mãi </span>
</a> </Link>
<a href="/tin-tuc" className="flex items-center gap-2 hover:text-[#0678DB]"> <Link href="/tin-tuc" className="flex items-center gap-2 hover:text-[#0678DB]">
<i className="icons icon-news"></i> <i className="icons icon-news"></i>
<span> Tin Tức Công Nghệ </span> <span> Tin Tức Công Nghệ </span>
</a> </Link>
<a href="/chinh-sach-bao-hanh" className="flex items-center gap-2 hover:text-[#0678DB]"> <Link href="/chinh-sach-bao-hanh" className="flex items-center gap-2 hover:text-[#0678DB]">
<i className="icons icon-warranty"></i> <i className="icons icon-warranty"></i>
<span> Bảo Hành Tận Nhà </span> <span> Bảo Hành Tận Nhà </span>
</a> </Link>
<a href="#fancybox-feedback" data-fancybox="" className="flex items-center gap-2 hover:text-[#0678DB]"> <a
href="#fancybox-feedback"
data-fancybox="fancybox-feedback"
className="flex items-center gap-2 hover:text-[#0678DB]"
>
<i className="icons icon-feedback"></i> <i className="icons icon-feedback"></i>
<span> Feedback </span> <span> Feedback </span>
</a> </a>
</div> </div>
</div> </div>
</div>
</> </>
) )
} }

View File

@@ -0,0 +1,27 @@
'use client';
import React from 'react';
type Props = {
target: string;
group?: string;
children: React.ReactNode;
className?: string;
};
export default function FancyboxTrigger({
target,
group = 'default',
children,
className
}: Props) {
return (
<a
href={target}
data-fancybox={group}
className={className}
>
{children}
</a>
);
}

View File

@@ -1,6 +1,7 @@
export default function FeedBack(){ export default function FeedBack(){
return( return(
<div id="fancybox-feedback" className="fancybox-content-container max-w-[800px] w-full text-16 leading-6 hidden !p-0 !bg-transparent"> <div id="fancybox-feedback" style={{ display: 'none' }}
className="fancybox-content-container max-w-[800px] text-[#000] w-full text-16 leading-6 !p-0 !bg-transparent">
<div className="bg-white overflow-hidden rounded-[12px]"> <div className="bg-white overflow-hidden rounded-[12px]">
<div className="text-center bg-[#0676DA] uppercase font-500 text-20 p-5 relative text-white"> <div className="text-center bg-[#0676DA] uppercase font-500 text-20 p-5 relative text-white">
<p className="m-0"> Chúng tôi luôn lắng nghe mọi ý kiến đóng góp từ Quý khách </p> <p className="m-0"> Chúng tôi luôn lắng nghe mọi ý kiến đóng góp từ Quý khách </p>

View File

@@ -1,6 +1,7 @@
export default function Hotline() { export default function Hotline() {
return ( return (
<div id="fancybox-headphone" className="fancybox-content-container max-w-[720px] w-full text-16 leading-6 hidden !p-0 !bg-transparent"> <div id="fancybox-headphone" style={{ display: 'none' }}
className="fancybox-content-container max-w-[720px] text-[#000] w-full text-16 leading-6 !p-0 !bg-transparent">
<div className="bg-white overflow-hidden rounded-[12px]"> <div className="bg-white overflow-hidden rounded-[12px]">
<div className="text-center bg-[#0676DA] uppercase font-500 text-20 p-5 relative text-white"> <div className="text-center bg-[#0676DA] uppercase font-500 text-20 p-5 relative text-white">
<p className="m-0"> Liên hệ hotline đ nhận đưc vấn tốt nhất </p> <p className="m-0"> Liên hệ hotline đ nhận đưc vấn tốt nhất </p>

View File

@@ -0,0 +1,41 @@
import Link from "next/link"
export default function MenuItem({item}:any) {
const hasChildren = item.children.length > 0
return (
<li className="item" data-id={item.id}>
<Link href={item.url}
className={`cat-1 ${hasChildren ? 'has-children' : ''}`}
>
<i className="lazy cat-thumb"
style={{ backgroundImage: `url(${item.thumnail})` }}
></i>
<span className="cat-title"> {item.title} </span>
</Link>
{ hasChildren &&
<ul className="submenu">
{
item.children.map( (item_2:any) => (
<li key={item_2.id}>
<Link href={item_2.url} className="blue">
<span className="font-600"> {item_2.title} </span>
</Link>
{item_2.children.length > 0 &&
item_2.children?.map( (item_3:any) => (
<Link href={item_3.url} key={item_3.id}>
<span> {item_3.title} </span>
</Link>
))
}
</li>
))
}
</ul>
}
</li>
)
}

1233
src/data/banner.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
// src/lib/articlePage.ts // src/lib/articlePage.ts
import { categories } from "../data/categories"; import { categories } from "../../data/categories";
export type ArticleResult = export type ArticleResult =
| { type: "article_home"; data: any } | { type: "article_home"; data: any }

View File

@@ -1,6 +1,6 @@
// hoanghapc/src/lib/productPage.ts // hoanghapc/src/lib/productPage.ts
import { categories } from "../data/categories"; import { categories } from "../../data/categories";
import { productList } from "../data/product-list"; import { productList } from "../../data/product-list";
export type ProductResult = export type ProductResult =
| { type: "product_category"; data: any } | { type: "product_category"; data: any }

15
src/lib/useFancyBox.ts Normal file
View File

@@ -0,0 +1,15 @@
import { useState, useEffect } from "react";
import { type FancyboxOptions, Fancybox } from "@fancyapps/ui/dist/fancybox/";
export default function useFancybox(options: Partial<FancyboxOptions> = {}) {
const [root, setRoot] = useState<HTMLElement | null>(null);
useEffect(() => {
if (root) {
Fancybox.bind(root, "[data-fancybox]", options);
return () => Fancybox.unbind(root);
}
}, [root, options]);
return [setRoot];
}

View File

@@ -1,10 +1,15 @@
@import url('https://cdn.boxicons.com/fonts/basic/boxicons.min.css'); @import url('https://cdn.boxicons.com/fonts/basic/boxicons.min.css');
@import url('https://fonts.cdnfonts.com/css/sf-pro-display'); @import url('https://fonts.cdnfonts.com/css/sf-pro-display');
@import "@fancyapps/ui/dist/fancybox/fancybox.css";
@import "tailwindcss"; @import "tailwindcss";
@import 'swiper/css'; @import 'swiper/css';
@import 'swiper/css/navigation'; @import 'swiper/css/navigation';
@import 'swiper/css/pagination'; @import 'swiper/css/pagination';
@import "../../public/styles/library.css"; @import "../../public/styles/library.css";
@import "../../public/styles/tailwind.css"; @import "../../public/styles/tailwind.css";
@import './pc_style.css'; @import './pc_style.css';
.fancybox__dialog .fancybox__container.is-ready {opacity: 1;}

View File

@@ -132,8 +132,9 @@ body{min-width:1248px;background:#E8ECF6}
.header-cart-hover .cart-price-hover .btn-goCart{border-radius:5px;margin-top:10px;background:#0676DA;font-weight:700;line-height:42px} .header-cart-hover .cart-price-hover .btn-goCart{border-radius:5px;margin-top:10px;background:#0676DA;font-weight:700;line-height:42px}
.header-cart-item:hover .header-cart-hover{transition:.2s all;top:101%;opacity:1;visibility:visible} .header-cart-item:hover .header-cart-hover{transition:.2s all;top:101%;opacity:1;visibility:visible}
.header-cart-hover .cart-price-hover p{margin:10px 0 15px!important} .header-cart-hover .cart-price-hover p{margin:10px 0 15px!important}
.fancybox-content-container .f-button.is-close-btn{top:15px!important;opacity:1!important;background:transparent} .fancybox-content-container{position: relative;}
.fancybox-content-container svg{color:#Fff} .fancybox-content-container .f-button.is-close-btn, .fancybox-content-container .f-button.is-close-button{position: absolute;top:15px!important;opacity:1!important;background:transparent;right: 0; z-index: 1;}
.fancybox-content-container svg{color:#Fff;width: 22px;height: 22px;stroke-width: 2px;}
.fancybox-content-container .hotline-list p{margin:0 0 16px;font-size:16px;line-height:23px;position:relative;padding:0 0 0 28px;display:flex;align-items:center} .fancybox-content-container .hotline-list p{margin:0 0 16px;font-size:16px;line-height:23px;position:relative;padding:0 0 0 28px;display:flex;align-items:center}
.fancybox-content-container .hotline-list p:last-child{margin:0} .fancybox-content-container .hotline-list p:last-child{margin:0}
.fancybox-content-container .hotline-list p::before{content:"";position:absolute;left:0;background-position:-4px -83px} .fancybox-content-container .hotline-list p::before{content:"";position:absolute;left:0;background-position:-4px -83px}