Compare commits

..

39 Commits
style ... main

Author SHA1 Message Date
guofei 58c817e5b2 fix: change style 2024-11-12 10:56:06 +08:00
guofei 7e5c800e35 change style 2024-11-06 13:29:37 +08:00
guofei a286e07272 feat: add wechat logo 2024-11-06 13:11:56 +08:00
guofei cb2bed34d2 fix: add marquee 2024-11-05 21:36:01 +08:00
guofei 832e286aee add amimation swiper 2024-11-05 19:50:02 +08:00
guofei 31a19f11fa feat: change seo tdk 2024-10-29 14:06:05 +08:00
guofei c37b24dc07 faet: remove some keywords 2024-10-28 15:05:44 +08:00
guofei 0b01705a86 feat: add google tag 2024-10-28 13:34:48 +08:00
guofei 46e7042ad6 feat: add google gtag 2024-10-28 12:09:04 +08:00
guofei 06c0ed4848 feat: add shenma meta 2024-10-28 10:43:53 +08:00
guofei a57fe0a648 feat: add toutiao script 2024-10-28 10:39:43 +08:00
guofei d0d8ef4854 feat: add toutiao meta 2024-10-28 10:32:21 +08:00
guofei 14907143a0 feat: add 360 meta 2024-10-25 18:59:05 +08:00
guofei dfe29b2b39 feat: add sougou meta 2024-10-25 18:23:05 +08:00
guofei 80c376162d style: repaire style 2024-10-25 17:47:56 +08:00
guofei 41b3a4ac27 feat: add baidu meta 2024-10-25 16:07:51 +08:00
guofei d73e09f58d feat: add seo tdk 2024-10-25 14:20:01 +08:00
guofei 83cac58f29 1 2024-10-25 13:55:46 +08:00
guofei 5fb2918af2 feat: dynamic price example 2024-10-25 11:25:21 +08:00
guofei 3a7541ca76 1 2024-10-25 10:44:04 +08:00
guofei c650c1fc8e fix: change style 2024-10-24 19:07:14 +08:00
guofei 322b6130bc style: repaire style 2024-10-24 16:50:25 +08:00
guofei 4c494168ac fix: change origin 2024-10-24 16:41:37 +08:00
guofei 4c2bafb6f3 1 2024-10-24 16:26:49 +08:00
guofei 6335c1b60f fix: add price href 2024-10-24 16:22:06 +08:00
guofei 21789ff44d faet: add price page 2024-10-24 16:17:57 +08:00
guofei 98936a89ee Merge branch 'style' 2024-10-24 11:17:06 +08:00
guofei 64e9644e8c fix 2024-10-23 17:42:51 +08:00
guofei 43ac7d2f48 fix: change click area 2024-10-23 16:10:30 +08:00
guofei e9ccfa005c fix: change img oss 2024-10-23 15:51:46 +08:00
guofei a33dc8df28 1 2024-10-23 15:33:11 +08:00
guofei aaffbc2373 1 2024-10-23 15:25:46 +08:00
guofei 19e391c2c2 1 2024-10-23 15:25:40 +08:00
guofei ba61cd083f 1 2024-10-23 15:23:45 +08:00
guofei 413a063668 1 2024-10-23 15:20:32 +08:00
guofei e9f8f4f167 fix: rename sh 2024-10-22 15:37:43 +08:00
guofei 1111e09c6d feat: add start sh 2024-10-22 15:36:41 +08:00
guofei aa92e4c4a4 Merge remote-tracking branch 'origin/style' 2024-10-22 15:34:09 +08:00
icefire 2d3e8fffc7 update: 调整样式 2024-10-20 22:44:08 +08:00
34 changed files with 1678 additions and 627 deletions

View File

@ -1,6 +1,10 @@
{
"extends": ["next/core-web-vitals", "next/typescript"],
"extends": [
"next/core-web-vitals",
"next/typescript"
],
"rules": {
"@next/next/no-img-element": "off" // "error"
"@next/next/no-img-element": "off", // "error"
"react-hooks/rules-of-hooks": "off"
}
}
}

42
example.json 100644
View File

@ -0,0 +1,42 @@
[
{
"exampleName": "测试",
"icon": "https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/exampleIcon/20241023-13_02_05.jpg",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"exampleName": "测试",
"icon": "https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/exampleIcon/20241023-13_02_05.jpg",
"url": "https://preview.soyootech.com/temp/B.html"
},
{
"exampleName": "测试",
"icon": "https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/exampleIcon/20241023-13_02_05.jpg",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"exampleName": "测试",
"icon": "https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/exampleIcon/20241023-13_02_05.jpg",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"exampleName": "测试",
"icon": "https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/exampleIcon/20241023-13_02_05.jpg",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"exampleName": "测试",
"icon": "https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/exampleIcon/20241023-13_02_05.jpg",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"exampleName": "测试",
"icon": "https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/exampleIcon/20241023-13_02_05.jpg",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"exampleName": "测试",
"icon": "https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/exampleIcon/20241023-13_02_05.jpg",
"url": "https://preview.soyootech.com/temp/A.html"
}
]

228
package-lock.json generated
View File

@ -10,13 +10,14 @@
"dependencies": {
"@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0",
"@formatjs/intl-localematcher": "^0.5.5",
"@mui/material": "^6.1.3",
"i18next": "^23.15.2",
"negotiator": "^0.6.3",
"next": "14.2.15",
"next-i18next": "^15.3.1",
"next-intl": "^3.21.1",
"postcss-pxtorem": "^6.1.0",
"react": "^18",
"react-dom": "^18",
"react-i18next": "^15.0.3"
"react-dom": "^18"
},
"devDependencies": {
"@types/node": "^20",
@ -475,6 +476,56 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@formatjs/ecma402-abstract": {
"version": "2.2.0",
"resolved": "https://registry.npmmirror.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.0.tgz",
"integrity": "sha512-IpM+ev1E4QLtstniOE29W1rqH9eTdx5hQdNL8pzrflMj/gogfaoONZqL83LUeQScHAvyMbpqP5C9MzNf+fFwhQ==",
"license": "MIT",
"dependencies": {
"@formatjs/fast-memoize": "2.2.1",
"@formatjs/intl-localematcher": "0.5.5",
"tslib": "^2.7.0"
}
},
"node_modules/@formatjs/fast-memoize": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/@formatjs/fast-memoize/-/fast-memoize-2.2.1.tgz",
"integrity": "sha512-XS2RcOSyWxmUB7BUjj3mlPH0exsUzlf6QfhhijgI941WaJhVxXQ6mEWkdUFIdnKi3TuTYxRdelsgv3mjieIGIA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.7.0"
}
},
"node_modules/@formatjs/icu-messageformat-parser": {
"version": "2.7.10",
"resolved": "https://registry.npmmirror.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.10.tgz",
"integrity": "sha512-wlQfqCZ7PURkUNL2+8VTEFavPovtADU/isSKLFvDbdFmV7QPZIYqFMkhklaDYgMyLSBJa/h2MVQ2aFvoEJhxgg==",
"license": "MIT",
"dependencies": {
"@formatjs/ecma402-abstract": "2.2.0",
"@formatjs/icu-skeleton-parser": "1.8.4",
"tslib": "^2.7.0"
}
},
"node_modules/@formatjs/icu-skeleton-parser": {
"version": "1.8.4",
"resolved": "https://registry.npmmirror.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.4.tgz",
"integrity": "sha512-LMQ1+Wk1QSzU4zpd5aSu7+w5oeYhupRwZnMQckLPRYhSjf2/8JWQ882BauY9NyHxs5igpuQIXZDgfkaH3PoATg==",
"license": "MIT",
"dependencies": {
"@formatjs/ecma402-abstract": "2.2.0",
"tslib": "^2.7.0"
}
},
"node_modules/@formatjs/intl-localematcher": {
"version": "0.5.5",
"resolved": "https://registry.npmmirror.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.5.tgz",
"integrity": "sha512-t5tOGMgZ/i5+ALl2/offNqAQq/lfUnKLEw0mXQI4N4bqpedhrSE+fyKLpwnd22sK0dif6AV+ufQcTsKShB9J1g==",
"license": "MIT",
"dependencies": {
"tslib": "^2.7.0"
}
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.13.0",
"resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
@ -1083,16 +1134,6 @@
"tslib": "^2.4.0"
}
},
"node_modules/@types/hoist-non-react-statics": {
"version": "3.3.5",
"resolved": "https://registry.npmmirror.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
"integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
"license": "MIT",
"dependencies": {
"@types/react": "*",
"hoist-non-react-statics": "^3.3.0"
}
},
"node_modules/@types/json5": {
"version": "0.0.29",
"resolved": "https://registry.npmmirror.com/@types/json5/-/json5-0.0.29.tgz",
@ -1928,17 +1969,6 @@
"integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
"license": "MIT"
},
"node_modules/core-js": {
"version": "3.38.1",
"resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.38.1.tgz",
"integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==",
"hasInstallScript": true,
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
}
},
"node_modules/cosmiconfig": {
"version": "7.1.0",
"resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
@ -3362,44 +3392,6 @@
"react-is": "^16.7.0"
}
},
"node_modules/html-parse-stringify": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
"integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
"license": "MIT",
"dependencies": {
"void-elements": "3.1.0"
}
},
"node_modules/i18next": {
"version": "23.15.2",
"resolved": "https://registry.npmmirror.com/i18next/-/i18next-23.15.2.tgz",
"integrity": "sha512-zcPSWzCvw6uKnuYHIqs4W7hTuB9e3AFcSdZgvCWoPXIZsBjBd4djN2/2uOHIB+1DFFkQnMBXvhNg7J3WyCuywQ==",
"funding": [
{
"type": "individual",
"url": "https://locize.com"
},
{
"type": "individual",
"url": "https://locize.com/i18next.html"
},
{
"type": "individual",
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
}
],
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.2"
}
},
"node_modules/i18next-fs-backend": {
"version": "2.3.2",
"resolved": "https://registry.npmmirror.com/i18next-fs-backend/-/i18next-fs-backend-2.3.2.tgz",
"integrity": "sha512-LIwUlkqDZnUI8lnUxBnEj8K/FrHQTT/Sc+1rvDm9E8YvvY5YxzoEAASNx+W5M9DfD5s77lI5vSAFWeTp26B/3Q==",
"license": "MIT"
},
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz",
@ -3470,6 +3462,18 @@
"node": ">= 0.4"
}
},
"node_modules/intl-messageformat": {
"version": "10.7.0",
"resolved": "https://registry.npmmirror.com/intl-messageformat/-/intl-messageformat-10.7.0.tgz",
"integrity": "sha512-2P06M9jFTqJnEQzE072VGPjbAx6ZG1YysgopAwc8ui0ajSjtwX1MeQ6bXFXIzKcNENJTizKkcJIcZ0zlpl1zSg==",
"license": "BSD-3-Clause",
"dependencies": {
"@formatjs/ecma402-abstract": "2.2.0",
"@formatjs/fast-memoize": "2.2.1",
"@formatjs/icu-messageformat-parser": "2.7.10",
"tslib": "^2.7.0"
}
},
"node_modules/is-arguments": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz",
@ -4249,6 +4253,15 @@
"dev": true,
"license": "MIT"
},
"node_modules/negotiator": {
"version": "0.6.4",
"resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz",
"integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/next": {
"version": "14.2.15",
"resolved": "https://registry.npmmirror.com/next/-/next-14.2.15.tgz",
@ -4299,40 +4312,25 @@
}
}
},
"node_modules/next-i18next": {
"version": "15.3.1",
"resolved": "https://registry.npmmirror.com/next-i18next/-/next-i18next-15.3.1.tgz",
"integrity": "sha512-+pa2pZJb7B6k5PKW3TLVMmAodqkNaOBWVYlpWX56mgcEJz0UMW+MKSdKM9Z72CHp6Bp48g7OWwDnLqxXNp/84w==",
"node_modules/next-intl": {
"version": "3.21.1",
"resolved": "https://registry.npmmirror.com/next-intl/-/next-intl-3.21.1.tgz",
"integrity": "sha512-hQm4Wgq5i1lfOHAWmXBVl5d2/XAeddcjsrUmjotXEESzPSvW5j2t0Pr8AV8WorTILgqU748aXuenBhz5P78tdw==",
"funding": [
{
"type": "individual",
"url": "https://locize.com/i18next.html"
},
{
"type": "individual",
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
},
{
"type": "individual",
"url": "https://locize.com"
"url": "https://github.com/sponsors/amannn"
}
],
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.2",
"@types/hoist-non-react-statics": "^3.3.4",
"core-js": "^3",
"hoist-non-react-statics": "^3.3.2",
"i18next-fs-backend": "^2.3.2"
},
"engines": {
"node": ">=14"
"@formatjs/intl-localematcher": "^0.5.4",
"negotiator": "^0.6.3",
"use-intl": "^3.21.1"
},
"peerDependencies": {
"i18next": ">= 23.7.13",
"next": ">= 12.0.0",
"react": ">= 17.0.2",
"react-i18next": ">= 13.5.0"
"next": "^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/next/node_modules/postcss": {
@ -4723,7 +4721,6 @@
"version": "8.4.47",
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.47.tgz",
"integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
"dev": true,
"funding": [
{
"type": "opencollective",
@ -4861,6 +4858,15 @@
"postcss": "^8.2.14"
}
},
"node_modules/postcss-pxtorem": {
"version": "6.1.0",
"resolved": "https://registry.npmmirror.com/postcss-pxtorem/-/postcss-pxtorem-6.1.0.tgz",
"integrity": "sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==",
"license": "MIT",
"peerDependencies": {
"postcss": "^8.0.0"
}
},
"node_modules/postcss-selector-parser": {
"version": "6.1.2",
"resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
@ -4959,28 +4965,6 @@
"react": "^18.3.1"
}
},
"node_modules/react-i18next": {
"version": "15.0.3",
"resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-15.0.3.tgz",
"integrity": "sha512-BlO1P+oLKjjIxDBQ0GkAIMacgjfMbnvops+3Y5nZXF7UJ99v4KCWr0Na1azJXC8AMiNWp4kgUcFCJM7U9ZsUDg==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.25.0",
"html-parse-stringify": "^3.0.1"
},
"peerDependencies": {
"i18next": ">= 23.2.3",
"react": ">= 16.8.0"
},
"peerDependenciesMeta": {
"react-dom": {
"optional": true
},
"react-native": {
"optional": true
}
}
},
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz",
@ -5957,6 +5941,19 @@
"punycode": "^2.1.0"
}
},
"node_modules/use-intl": {
"version": "3.21.1",
"resolved": "https://registry.npmmirror.com/use-intl/-/use-intl-3.21.1.tgz",
"integrity": "sha512-52kYgcydYkG9SX0ZZGt7W6WD2Va01hwe15bDgkXuaTdSxrF9fDu6hHTV5DxIuSmSSf/FEcBo/nodpw3ZhY31Lw==",
"license": "MIT",
"dependencies": {
"@formatjs/fast-memoize": "^2.2.0",
"intl-messageformat": "^10.5.14"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
@ -5964,15 +5961,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/void-elements/-/void-elements-3.1.0.tgz",
"integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",

View File

@ -19,7 +19,8 @@
"next-intl": "^3.21.1",
"postcss-pxtorem": "^6.1.0",
"react": "^18",
"react-dom": "^18"
"react-dom": "^18",
"react-fast-marquee": "^1.6.5"
},
"devDependencies": {
"@types/node": "^20",
@ -31,4 +32,4 @@
"tailwindcss": "^3.4.1",
"typescript": "^5"
}
}
}

View File

@ -41,6 +41,9 @@ importers:
react-dom:
specifier: ^18
version: 18.3.1(react@18.3.1)
react-fast-marquee:
specifier: ^1.6.5
version: 1.6.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
devDependencies:
'@types/node':
specifier: ^20
@ -1558,6 +1561,12 @@ packages:
peerDependencies:
react: ^18.3.1
react-fast-marquee@1.6.5:
resolution: {integrity: sha512-swDnPqrT2XISAih0o74zQVE2wQJFMvkx+9VZXYYNSLb/CUcAzU9pNj637Ar2+hyRw6b4tP6xh4GQZip2ZCpQpg==}
peerDependencies:
react: '>= 16.8.0 || ^18.0.0'
react-dom: '>= 16.8.0 || ^18.0.0'
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
@ -3625,6 +3634,11 @@ snapshots:
react: 18.3.1
scheduler: 0.23.2
react-fast-marquee@1.6.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-is@16.13.1: {}
react-is@18.3.1: {}

38
price.json 100644
View File

@ -0,0 +1,38 @@
[
{
"desc": "初级3k",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"desc": "初级5k",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"desc": "初级1w",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"desc": "中级3k",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"desc": "中级1w",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"desc": "中级1.5w",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"desc": "高级3k",
"url": "https://preview.soyootech.com/temp/A.html"
},
{
"desc": "高级2w",
"url": "https://static.soyootech.com/case/bubble/bubble.html"
},
{
"desc": "高级2w",
"url": "https://preview.soyootech.com/temp/A.html"
}
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
User-agent: *
Allow: /

30
public/sitemap.xml 100644
View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
>
<url>
<loc>https://www.soyootech.com/en</loc>
<priority>0.3</priority>
<lastmod>2024-10-25</lastmod>
<changefreq>weekly</changefreq>
</url>
<url>
<loc>https://www.soyootech.com/price</loc>
<priority>0.3</priority>
<lastmod>2024-10-25</lastmod>
<changefreq>weekly</changefreq>
</url>
<url>
<loc>https://www.soyootech.com/</loc>
<priority>0.3</priority>
<lastmod>2024-10-25</lastmod>
<changefreq>weekly</changefreq>
</url>
</urlset>

View File

@ -27,7 +27,7 @@ export default function Form() {
<div className="text-[#fff] text-[24px] font-semibold"></div>
<img
className="w-[26px] h-[22px]"
src="/home/submit_icon.png"
src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/home/submit_icon.png"
alt=""
/>

View File

@ -1,17 +0,0 @@
import Link from "next/link"
export default function More(props: {dict: Record<string, string>, lang: string[]}) {
const { dict } = props
return <>
<Link href="#contact">
<div className="flex flex-col justify-center items-center
text-[30px] text-[#3d3d3d] cursor-pointer rounded-[60px] w-[280px] h-[280px]"
style={{background: 'radial-gradient(61% 61% at 50% 50%, #FFFFFF 46%, #E1E1E1 100%)' }}>
<div>{ dict.seeMore }</div>
<div>{ dict.contactUs1 }</div>
</div>
</Link>
</>
}

View File

@ -1,218 +1,129 @@
import { getDictionary } from '@/dictionaries';
import { getDictionary } from "@/dictionaries";
import Form from "./components/form";
import Header from "@/app/components/header";
import Footer from "@/app/components/footer";
import More from './components/more';
type CaseType = {
img: string
}
export type PropsType = {
params: {
lang: string[];
};
}
import Examples from "../components/Examples";
import ChannelSwiper from "../components/ChannelSwiper";
export default async function Home(props: { params: { lang: string[] } }) {
const lang = props.params.lang || ["zh"];
const dict = await getDictionary(lang[0]);
export default async function Home (props: PropsType) {
const lang = props.params.lang || ['zh'];
const dict = await getDictionary(lang[0]);
const caseList: CaseType[] = [
{ img: '/home/case_1.png' },
{ img: '/home/case_2.png' },
{ img: '/home/case_3.png' },
{ img: '/home/case_3.png' },
{ img: '/home/case_1.png' },
{ img: '/home/case_2.png' },
{ img: '/home/case_3.png' },
{ img: '/home/case_3.png' },
{ img: '/home/case_1.png' },
{ img: '/home/case_2.png' },
{ img: '/home/case_3.png' },
{ img: '/home/case_3.png' },
{ img: '/home/case_1.png' },
{ img: '/home/case_2.png' },
{ img: '/home/case_3.png' },
]
return <>
<div className='w-full flex flex-col items-center'>
<Header dict={dict} lang={lang} />
<div className="w-[1440px] relative pt-[80px]"
>
<div className='main'>
<div className="w-full h-[770px] pl-[72px] relative" id="home">
<img
className="absolute right-[-40px] w-[1520px] h-[770px]"
src="/home/img_header.png"
alt=""
/>
<div
className="text-[46px] leading-[62px] w-[639px] text-center pt-[279px]"
>
<div
className="font-black"
style={{
'background': 'linear-gradient(106deg, #8EC2EA 0%, #4174ED 93%)',
'backgroundClip': 'text',
'WebkitTextFillColor': 'transparent'
}}>
{dict.FocusingOnPlayableAds}
</div>
<div
className="font-black"
style={{
'background': 'linear-gradient(106deg, #8EC2EA 0%, #4174ED 93%)',
'backgroundClip': 'text',
'WebkitTextFillColor': 'transparent'
}}>
{dict.goOverseas}
</div>
</div>
</div>
<div className="w-full h-[428px] relative" id="service">
<img
className="absolute left-[-214px] w-[969px] h-[428px]"
src="/home/img_bg2.png"
alt=""
/>
<div className="absolute w-[770px] text-[32px] top-[184px] right-[95px] text-[#333333] text-right font-semibold">
{ dict.customized }
</div>
</div>
<div className="w-full h-[403px] relative">
<img
className="absolute right-[-100px] w-[888px] h-[403px]"
src="/home/img_AB.png"
alt=""
/>
<div className="absolute w-[662px] text-[32px] top-[160px] left-[105px] text-[#333333] text-left font-semibold">
{ dict.ABTesting}
</div>
<div className="absolute w-[680px] text-[32px] top-[204px] left-[105px] text-[#333333] text-left font-semibold">
{ dict.iterateGameplay }
</div>
</div>
<div className="w-full h-[392px] relative">
<img
className="absolute w-[731px] h-[392px] left-[-33px]"
src="/home/img_mutilan.png"
alt=""
/>
<div className="absolute w-[520px] text-[32px] top-[197px] right-[95px] text-[#333333] text-right font-semibold">
{ dict.multiLanguage }
</div>
<div className="absolute w-[520px] text-[32px] top-[242px] right-[95px] text-[#333333] text-right font-semibold">
{ dict.breakingGeographical }
</div>
</div>
<div className="w-full h-[317px] relative mt-[83px]">
<img
className="absolute right-0 w-[742px] h-[317px]"
src="/home/img_Omnichannel.png"
alt=""
/>
<div className="absolute w-[680px] text-[32px] top-[124px] left-[105px] text-[#333333] text-left font-semibold">
{ dict.allChannel }
</div>
<div className="absolute w-[680px] text-[32px] top-[169px] left-[105px] text-[#333333] text-left font-semibold">
{ dict.expandInfluence }
</div>
</div>
<div className="w-full h-[317px] relative mt-[83px]">
<img
className="absolute left-[-329px] w-[1250px] h-[357px]"
src="/home/img_3.png"
alt=""
/>
<div className="absolute w-[691px] text-[32px] top-[100px] right-[95px] text-[#333333] text-right font-semibold">
{ dict.lightweightDeployment }
</div>
<div className="absolute w-[712px] text-[32px] top-[145px] right-[95px] text-[#333333] text-right font-semibold">
{ dict.simplifyProcess }
</div>
</div>
<div className="w-full flex flex-col justify-center items-center mt-[98px]" id="case">
<div
className="leading-[42px] text-[36px] font-black w-[300px] mb-[11px] text-center"
style={{
background: 'linear-gradient(90deg, #93BBE6 0%, #4C76E4 100%)',
backgroundClip: 'text',
WebkitTextFillColor: 'transparent'
}}
>{ dict.caseGallery }</div>
{/* <div className="text-[19px] text-[#59676C]">{ dict.clickNow }</div> */}
</div>
<div className="w-full px-[40px] flex flex-wrap justify-between mt-[34px] mb-[83px]">
{
caseList.map((item: CaseType, index: number) => {
return <div key={'key'+index} className="cursor-pointer relative group mb-[60px]">
<div className='hover:scale-[1.25] hover:shadow-[0px_0px_20px_8px_#0988FF] rounded-[60px] w-[280px] h-[280px]'>
<img
className="rounded-[60px] w-full
transition ease-in-out duration-300 w-[280px] h-[280px]"
src={item.img}
alt=""
/>
<div className='absolute bottom-0 w-full h-[81px] bg-[#002653] text-center
text-white text-[30px] hidden group-hover:block '
style={{borderRadius: '0px 0px 60px 60px', lineHeight: '81px'}}
>
{dict.clickToPlay}
</div>
</div>
</div>
})
}
<div className="flex flex-col justify-center items-center
text-[30px] text-[#3d3d3d] cursor-pointer rounded-[60px] mb-[50px] w-[280px] h-[280px]"
style={{background: 'radial-gradient(61% 61% at 50% 50%, #FFFFFF 46%, #E1E1E1 100%)' }}>
<More dict={dict} lang={lang} />
</div>
</div>
<div className="w-full flex flex-col justify-center items-center mt-[98px] mb-[59px]" id="contact">
<div
className="leading-[34px] text-[36px] font-black w-[300px] mb-[11px] text-center"
style={{
background: 'linear-gradient(90deg, #93BBE6 0%, #4C76E4 100%)',
backgroundClip: 'text',
WebkitTextFillColor: 'transparent'
}}
>{ dict.contactUs }</div>
</div>
<div className="w-full mb-[60px]">
<Form />
</div>
<div className="w-full flex justify-center text-[19px] text-[#59676C] pb-[52px] mb-[47px] border-b-1 border-solid border-[#D8D8D8]"
style={{ borderBottom: '1px solid #D8D8D8' }}
>
{ dict.businessCooperation }info@soyootech.com
</div>
<div>
<Footer dict={dict} />
return (
<>
<div className="w-full flex flex-col items-center">
<Header dict={dict} lang={lang} />
<div className="w-[1440px] relative pt-[80px]">
<div className="main">
<div className="w-full h-[740px] pl-[72px] relative" id="home">
<img className="absolute right-[-40px] w-[1520px] " src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/home/img_header.png" alt="" />
<div className="text-[46px] leading-[62px] w-[639px] text-center pt-[279px] absolute">
<div
className="font-black"
style={{
background: "linear-gradient(106deg, #8EC2EA 0%, #4174ED 93%)",
backgroundClip: "text",
WebkitTextFillColor: "transparent",
backgroundSize: "contain",
}}
>
{dict.FocusingOnPlayableAds}
</div>
<div
className="font-black"
style={{
background: "linear-gradient(106deg, #8EC2EA 0%, #4174ED 93%)",
backgroundClip: "text",
WebkitTextFillColor: "transparent",
}}
>
{dict.goOverseas}
</div>
</div>
</div>
<div className="w-full h-[428px] relative" id="service">
<img className="absolute left-[-214px] w-[969px] h-[428px]" src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/home/img_bg2.png" alt="" />
<div className="absolute w-[770px] text-[32px] top-[184px] right-[95px] text-[#333333] text-right font-semibold">{dict.customized}</div>
</div>
<div className="w-full h-[403px] relative ">
<img className="absolute right-[-100px] w-[888px]" src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/home/img_AB.png" alt="" />
<div className="absolute w-[662px] text-[32px] top-[160px] left-[105px] text-[#333333] text-left font-semibold">{dict.ABTesting}</div>
<div className="absolute w-[680px] text-[32px] top-[204px] left-[105px] text-[#333333] text-left font-semibold">{dict.iterateGameplay}</div>
</div>
<div className="w-full h-[392px] relative">
<img className="absolute w-[731px] left-[-33px] top-[-20px]" src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/home/img_mutilan.png" alt="" />
<div className="absolute w-[520px] text-[32px] top-[197px] right-[95px] text-[#333333] text-right font-semibold">{dict.multiLanguage}</div>
<div className="absolute w-[520px] text-[32px] top-[242px] right-[95px] text-[#333333] text-right font-semibold">{dict.breakingGeographical}</div>
</div>
<div className="w-full h-[317px] relative mt-[83px]">
<img className="absolute right-0 w-[742px] h-[317px]" src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/home/img_Omnichannel.png" alt="" />
<div className="absolute w-[680px] text-[32px] top-[124px] left-[105px] text-[#333333] text-left font-semibold">{dict.allChannel}</div>
<div className="absolute w-[680px] text-[32px] top-[169px] left-[105px] text-[#333333] text-left font-semibold">{dict.expandInfluence}</div>
</div>
<div className="w-full h-[317px] relative mt-[120px]">
<img className="absolute w-[908px] h-[356px] left-[-40px] top-[-30px]" src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/home/img_3.png" alt="" />
<div className="absolute w-[691px] text-[32px] top-[100px] right-[95px] text-[#333333] text-right font-semibold">{dict.lightweightDeployment}</div>
<div className="absolute w-[712px] text-[32px] top-[145px] right-[95px] text-[#333333] text-right font-semibold">{dict.simplifyProcess}</div>
</div>
<div className="w-full flex flex-col justify-center items-center mt-[98px] mb-[50px]">
<div
className="leading-[42px] text-[36px] font-black w-[350px] mb-[11px] text-center"
style={{
background: "linear-gradient(90deg, #93BBE6 0%, #4C76E4 100%)",
backgroundClip: "text",
WebkitTextFillColor: "transparent",
}}
>
{dict.channel}
</div>
</div>
<ChannelSwiper />
<div className="w-full flex flex-col justify-center items-center mt-[98px]" id="case">
<div
className="leading-[42px] text-[36px] font-black w-[300px] mb-[11px] text-center"
style={{
background: "linear-gradient(90deg, #93BBE6 0%, #4C76E4 100%)",
backgroundClip: "text",
WebkitTextFillColor: "transparent",
}}
>
{dict.caseGallery}
</div>
{/* <div className="text-[19px] text-[#59676C]">{ dict.clickNow }</div> */}
</div>
<Examples dict={dict} lang={lang} />
<div className="w-full flex flex-col justify-center items-center mt-[98px] mb-[59px]" id="contact">
<div
className="leading-[34px] text-[36px] font-black w-[300px] mb-[11px] text-center"
style={{
background: "linear-gradient(90deg, #93BBE6 0%, #4C76E4 100%)",
backgroundClip: "text",
WebkitTextFillColor: "transparent",
}}
>
{dict.contactUs}
</div>
</div>
<div className="w-full mb-[60px]">
<Form />
</div>
<div className="w-full flex justify-center text-[19px] text-[#59676C] pb-[52px] mb-[47px] border-b-1 border-solid border-[#D8D8D8]" style={{ borderBottom: "1px solid #D8D8D8" }}>
{dict.businessCooperation}info@soyootech.com
</div>
<div>
<Footer dict={dict} />
</div>
</div>
</div>
</div>
</>
}
);
}

View File

@ -0,0 +1,41 @@
"use client";
import Marquee from "react-fast-marquee";
const data = [
{ url: "logo-yandex.png" },
{ url: "logo-weixin.png" },
{ url: "logo-vungle.png" },
{ url: "logo-unity.png" },
{ url: "logo-tiktok.png" },
{ url: "logo-tapjoy.png" },
{ url: "logo-pangle.png" },
{ url: "logo-moloco.png" },
{ url: "logo-mintegral.png" },
{ url: "logo-liftoff.png" },
{ url: "logo-kwai.png" },
{ url: "logo-google.png" },
{ url: "logo-facebook.png" },
{ url: "logo-chartboost.png" },
{ url: "logo-bigoads.png" },
{ url: "logo-applovin.png" },
];
export default function ChannelSwiper() {
const isMobile = /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent);
return (
<>
<div className="overflow-hidden flex items-center">
<Marquee speed={isMobile ? 15 : 50}>
{data.map((item, index) => {
return (
<div key={index} className="mx-8 max-w-[100px] w-auto h-[80px] flex items-center ">
<img src={`https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/channel/${item.url}`} className={` ${item.url.includes("chartboost") ? "translate-y-[-16px]" : ""}`} alt="" />
</div>
);
})}
</Marquee>
</div>
</>
);
}

View File

@ -0,0 +1,87 @@
"use client";
import { useEffect, useState } from "react";
import More from "./more";
export default function Examples(props: { dict: Record<string, string>; lang: string[] }) {
const [previewInfo, setPreviewInfo] = useState({
url: "",
preview: false,
});
const [examples, setExamples] = useState([]);
useEffect(() => {
if (window.location.hash == "#/price") {
window.location.replace(`${window.location.origin}/price`);
return;
}
const fetchData = async () => {
const res = await fetch(`https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/example.json`);
const dataSource = await res.json();
setExamples(dataSource);
};
fetchData();
}, []);
return (
<>
<div className="w-[89%] flex flex-wrap mt-[34px] mb-[83px] mx-auto">
{examples.map((item: { icon: string | undefined; url: string }, index: number) => {
return (
<div key={"key" + index} className="cursor-pointer relative group mb-[60px] w-1/4 flex justify-center">
<div
className="hover:scale-[1.15] transition ease-in-out duration-300 hover:shadow-[0px_0px_20px_8px_#0988FF] rounded-[60px] w-[280px] h-[280px] relative"
onClick={() => {
document.body.style.overflow = "hidden";
setPreviewInfo({
preview: true,
url: item.url,
});
}}
>
<img className="rounded-[60px] w-[280px] h-[280px]" src={item.icon} alt="" />
<div
className="absolute bottom-0 w-full h-[81px] bg-[#002653] text-center text-white text-[30px] hidden group-hover:block "
style={{ borderRadius: "0px 0px 60px 60px", lineHeight: "81px" }}
>
{props.dict.clickToPlay}
</div>
</div>
</div>
);
})}
<div className="w-1/4">
<div
className="flex flex-col justify-center items-center text-[30px] text-[#3d3d3d] cursor-pointer rounded-[60px] mb-[50px] w-[280px] h-[280px] mx-auto"
style={{ background: "radial-gradient(61% 61% at 50% 50%, #FFFFFF 46%, #E1E1E1 100%)" }}
>
<More dict={props.dict} lang={props.lang} />
</div>
</div>
</div>
{previewInfo.preview && (
<div
className="fixed left-0 right-0 top-0 bottom-0 bg-black/60 z-[2000]"
onClick={() => {
document.body.style.overflow = "auto";
setPreviewInfo({
preview: false,
url: "",
});
}}
>
<div
className="flex justify-center w-[370px] h-[610px] items-center fixed top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%] mx-auto border rounded-lg p-4 bg-white"
onClick={(e) => {
e.stopPropagation();
}}
>
<iframe src={previewInfo.url} className="w-full h-full" />
</div>
</div>
)}
</>
);
}

View File

@ -1,40 +1,29 @@
export default function Footer(props: {dict: Record<string, string>}) {
const { dict } = props
export default function Footer(props: { dict: Record<string, string> }) {
const { dict } = props;
return (
<footer>
<div className="flex items-start justify-between w-full px-[304px]">
<div className=" w-[166px] flex flex-col items-center mb-[15px]">
<img
className="mb-[16px]"
src="/home/qrcode.png"
width={151}
height={151}
alt=""
/>
<div className="text-[#888888] text-[15px] text-center">{ dict.addWeChat }</div>
</div>
<div >
<div className="text-[#AFB2B9] text-[17px] font-medium mb-[45px]">{ dict.emailContact }</div>
<div className="text-[#333333] text-[15px] ">info@soyootech.com</div>
</div>
<div>
<div className="text-[#AFB2B9] text-[17px] font-medium mb-[45px]">{ dict.helpSupport }</div>
<div className="text-[#333333] text-[15px] mb-[23px]">{ dict.productCenter }</div>
<div className="text-[#333333] text-[15px] ">{ dict.productPricing }</div>
</div>
<div>
<div className="text-[#AFB2B9] text-[17px] font-medium mb-[45px]">{ dict.legalAgreements }</div>
<div className="text-[#333333] text-[15px] mb-[23px]">{ dict.privacyPolicy }</div>
<div className="text-[#333333] text-[15px] ">{ dict.userAgreement }</div>
</div>
<div className="flex items-start justify-between w-full px-[304px]">
<div className=" w-[166px] flex flex-col items-center mb-[15px]">
<img className="mb-[16px]" src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/home/qrcode.png" width={151} height={151} alt="" />
<div className="text-[#888888] text-[15px] text-center">{dict.addWeChat}</div>
</div>
<div className="text-[15px] text-[#888888] text-center">
Copyright © 2020-2024 All Rights Reserved.
<div>
<div className="text-[#AFB2B9] text-[17px] font-medium mb-[45px]">{dict.emailContact}</div>
<div className="text-[#333333] text-[15px] ">info@soyootech.com</div>
</div>
<div className="text-[15px] text-[#888888] text-center mb-[20px]">
ICP20028159
<div>
<div className="text-[#AFB2B9] text-[17px] font-medium mb-[45px]">{dict.helpSupport}</div>
<div className="text-[#333333] text-[15px] mb-[23px]">{dict.productCenter}</div>
<div className="text-[#333333] text-[15px] ">{dict.productPricing}</div>
</div>
<div>
<div className="text-[#AFB2B9] text-[17px] font-medium mb-[45px]">{dict.legalAgreements}</div>
<div className="text-[#333333] text-[15px] mb-[23px]">{dict.privacyPolicy}</div>
<div className="text-[#333333] text-[15px] ">{dict.userAgreement}</div>
</div>
</div>
<div className="text-[15px] text-[#888888] text-center">Copyright © 2020-2024 All Rights Reserved.</div>
<div className="text-[15px] text-[#888888] text-center mb-[20px]">ICP20028159 </div>
</footer>
)
}
);
}

View File

@ -1,144 +1,138 @@
'use client'
"use client";
import Link from "next/link";
import { useEffect, useState } from "react";
type NavType = {
name: string;
href: string;
}
};
export default function Header(props: { dict: Record<string, string>; lang: string[] }) {
const { dict, lang } = props;
const [activeTab, setActiveTab] = useState(dict.home);
const [show, setShow] = useState(false);
const [hash, setHash] = useState("#home");
export default function Header(props: { dict: Record<string, string>, lang: string[] }) {
const { dict, lang } = props
const [activeTab, setActiveTab] = useState(dict.home)
const [show, setShow] = useState(false)
const [hash, setHash] = useState('#home')
useEffect(() => {
// const designWidth = 1440;
// const deviceWidth = document.documentElement.clientWidth
// let scale = 1
// const deviceWidth = document.documentElement.clientWidth;
// let scale = 1;
// console.log("designWidth", deviceWidth);
// if (deviceWidth <= 1440) {
// scale = deviceWidth / designWidth;
// }
// console.log("scale", scale);
// document.documentElement.style.fontSize = `${scale * 14.4}px`;
}, [hash]);
const handleJumpTo = (hash: string) => {
switch (hash) {
case '#home':
const home = document.getElementById('home')
case "#home":
const home = document.getElementById("home");
document.documentElement.scrollTo({
top: home!.offsetTop - 80,
behavior: 'smooth'
behavior: "smooth",
});
break;
case '#service':
const service = document.getElementById('service')
case "#service":
const service = document.getElementById("service");
document.documentElement.scrollTo({
top: service!.offsetTop - 80,
behavior: 'smooth'
behavior: "smooth",
});
break;
case '#case':
const caseDom = document.getElementById('case')
case "#case":
const caseDom = document.getElementById("case");
document.documentElement.scrollTo({
top: caseDom!.offsetTop - 110,
behavior: 'smooth'
behavior: "smooth",
});
break;
case '#contact':
const contact = document.getElementById('contact')
document.documentElement.scrollTo({
top: contact!.offsetTop - 80,
behavior: 'smooth'
});
case "#contact":
const contact = document.getElementById("contact");
document.documentElement.scrollTo({
top: contact!.offsetTop - 80,
behavior: "smooth",
});
break;
}
}, [hash])
};
const navList: NavType[] = [
{
name: dict.home,
href: "#home"
href: "#home",
},
{
name: dict.services,
href: "#service"
href: "#service",
},
{
name: dict.caseGallery,
href: "#case"
href: "#case",
},
{
name: dict.contactUs,
href: "#contact"
href: "#contact",
},
]
return (<>
<div className={`flex items-center px-[40px] h-[80px] border-b-1 border-solid
border-[#D8D8D8] fixed bg-white z-[900] w-[1440px] justify-between`}
style={{ borderBottom: '1px solid #D8D8D8' }}
>
<div className="cursor-pointer">
<img
className="w-[180px] h-[47px]"
src="/common/logo.png"
alt="logo"
onClick={() => setHash('#home')}
/>
</div>
<div className={"flex flex-1 items-end h-[80px] mx-[13px]"}
];
return (
<>
<div
className={`flex items-center px-[40px] h-[80px] border-b-1 border-solid
border-[#D8D8D8] fixed bg-white z-[100] w-[1440px] justify-between]`}
style={{ borderBottom: "1px solid #D8D8D8" }}
>
{
navList.map((item: NavType) => (
<div onClick={() => setHash(item.href)} key={item.name} className="menu-item">
<div className="text-center cursor-pointer" onClick={() => setActiveTab(item.name)}>
<div className="cursor-pointer">
<img className="w-[180px] h-[47px]" src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/common/logo.png" alt="logo" onClick={() => setHash("#home")} />
</div>
<div className={"flex flex-1 items-end h-[80px] mx-[13px]"}>
{navList.map((item: NavType) => (
<div onClick={() => handleJumpTo(item.href)} key={item.name}>
<div
className="text-center cursor-pointer"
onClick={() => {
setActiveTab(item.name);
}}
>
<div className="my-[10px] w-[144px] text-[18px]">{item.name}</div>
{
activeTab === item.name ?
<img src="/common/tab_checked.png" className="w-[144px] h-[8px]" alt="" /> :
<div className="h-[8px]"></div>
}
{activeTab === item.name ? (
<img src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/common/tab_checked.png" className="w-[144px] h-[8px]" alt="" />
) : (
<div className="h-[8px]"></div>
)}
</div>
</div>
))
}
</div>
<div className="w-[129px]">
<div className="flex items-center w-[129px] h-[28px] bg-[#EEF1F6]
))}
</div>
<div className="w-[129px]">
<div
className="flex items-center w-[129px] h-[28px] bg-[#EEF1F6]
border-[1px] border-[#eeeeee] rounded-[3px] px-[10px] mt-[18px] cursor-pointer"
onClick={() => setShow(!show)}>
<img
src="/common/earth.png"
className="w-[16.5px] h-[16.5px]"
alt="logo"
/>
onClick={() => setShow(!show)}
>
<img src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/common/earth.png" className="w-[16.5px] h-[16.5px]" alt="logo" />
<div className="flex-1 text-[14px] text-[#333333] mx-[9px]">{dict?.lang}</div>
<img
className={`transition-transform duration-300 transform rotate-0 ${show && 'rotate-180'} w-[10px] h-[5px]`}
src="/common/arrow.png"
className={`transition-transform duration-300 transform rotate-0 ${show && "rotate-180"} w-[10px] h-[5px]`}
src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/common/arrow.png"
alt="logo"
/>
</div>
{
<div className={`absolute ${!show && 'hidden'} left-0 right-0 top-0 bottom-0 left-0 top-0 z-[10000]`} onClick={() => setShow(false)}>
<Link href={lang[0] === 'zh' ? '/en' : '/'}>
<div className={`absolute right-[40px] top-[68px] w-[129px] h-[28px] leading-[28px]
bg-[#EEF1F6] text-center transition-all duration-300 origin-top group-hover:block`}>
<div className={`absolute ${!show && "hidden"} right-0 bottom-0 left-0 top-0 z-[10000]`} onClick={() => setShow(false)}>
<Link href={lang[0] === "zh" ? "/en" : "/"}>
<div
className={`absolute right-[40px] top-[68px] w-[129px] h-[28px] leading-[28px]
bg-[#EEF1F6] text-center transition-all duration-300 origin-top group-hover:block`}
>
<div className="text-[14px] text-[#333333]">{dict?.lang1}</div>
</div>
</Link>
</div>
}
</div>
</div>
</div>
<div className={`${!show && 'hidden'} fixed bg-[#000000] opacity-[0] left-0 top-0 bottom-0 right-0 z-[899]`} onClick={() => setShow(false)}></div>
{/* <div className="h-[80px] container"></div> */}
</>
)
}
</>
);
}

View File

@ -0,0 +1,19 @@
import Link from "next/link";
export default function More(props: { dict: Record<string, string>; lang: string[] }) {
const { dict } = props;
return (
<>
<Link href="#contact">
<div
className="flex flex-col justify-center items-center
text-[30px] text-[#3d3d3d] cursor-pointer rounded-[60px] w-[280px] h-[280px]"
style={{ background: "radial-gradient(61% 61% at 50% 50%, #FFFFFF 46%, #E1E1E1 100%)" }}
>
<div>{dict.seeMore}</div>
<div>{dict.contactUs1}</div>
</div>
</Link>
</>
);
}

View File

@ -2,143 +2,170 @@
@tailwind components;
@tailwind utilities;
::-webkit-scrollbar {
display: none;
}
.main {
-ms-overflow-style: none;
scrollbar-width: none;
}
html {
font-size: 14.4px;
}
.menu-item {
display: block;
}
@media (min-width: 300px) and (max-width: 350px) {
html {
font-size: 3px;
}
}
@media (min-width: 350px) and (max-width: 400px) {
html {
font-size: 3.5px;
}
}
@media (min-width: 400px) and (max-width: 450px) {
html {
font-size: 4px;
}
}
@media (min-width: 450px) and (max-width: 500px) {
html {
font-size: 4.5px;
}
}
@media (min-width: 500px) and (max-width: 550px) {
html {
font-size: 5px;
}
}
@media (min-width: 550px) and (max-width: 600px) {
html {
font-size: 5.5px;
}
}
@media (min-width: 600px) and (max-width: 650px) {
html {
font-size: 6px;
}
}
@media (min-width: 650px) and (max-width: 700px) {
html {
font-size: 6.5px;
}
}
@media (min-width: 700px) and (max-width: 750px) {
html {
font-size: 7px;
}
}
@media (min-width: 750px) and (max-width: 800px) {
html {
font-size: 7.6px;
}
}
@media (min-width: 800px) and (max-width: 850px) {
html {
font-size: 8px;
}
}
@media (min-width: 850px) and (max-width: 900px) {
html {
font-size: 8.5px;
}
}
@media (min-width: 900px) and (max-width: 950px) {
html {
font-size: 9px;
}
}
@media (min-width: 1000px) and (max-width: 1050px) {
html {
font-size: 10px;
}
}
@media (min-width: 1050px) and (max-width: 1100px) {
html {
font-size: 10.5px;
}
}
@media (min-width: 1100px) and (max-width: 1150px) {
html {
font-size: 11px;
}
}
@media (min-width: 1150px) and (max-width: 1200px) {
html {
font-size: 11.5px;
}
}
@media (min-width: 1200px) and (max-width: 1250px) {
html {
font-size: 12px;
}
}
@media (min-width: 1250px) and (max-width: 1300px) {
html {
font-size: 12.5px;
}
}
@media (min-width: 1300px) and (max-width: 1350px) {
html {
font-size: 13px;
}
}
@media (min-width: 1350px) and (max-width: 1400px) {
html {
font-size: 13.5px;
}
}
@media (min-width: 1400px) and (max-width: 1450px) {
html {
font-size: 14px;
}
}
@media (min-width: 1440px) {
html {
font-size: 14.4px;
}
}
@media (max-width: 1440px) {
.menu-item {
display: none;
}
}
@media (min-width: 1440px) {
.menu-item {
display: block;
}
}
html::-webkit-scrollbar {
width: 8px;
}
html::-webkit-scrollbar-thumb {
background-color: rgba(169, 169, 169, 0.729);
border-radius: 10px;
}
html::-webkit-scrollbar-track {
background: #fff;
}
html {
font-size: 14.4px;
}
.menu-item {
display: block;
}
@media (min-width: 300px) and (max-width: 350px) {
html {
font-size: 3px;
}
}
@media (min-width: 350px) and (max-width: 400px) {
html {
font-size: 3.5px;
}
}
@media (min-width: 400px) and (max-width: 450px) {
html {
font-size: 4px;
}
}
@media (min-width: 450px) and (max-width: 500px) {
html {
font-size: 4.5px;
}
}
@media (min-width: 500px) and (max-width: 550px) {
html {
font-size: 5px;
}
}
@media (min-width: 550px) and (max-width: 600px) {
html {
font-size: 5.5px;
}
}
@media (min-width: 600px) and (max-width: 650px) {
html {
font-size: 6px;
}
}
@media (min-width: 650px) and (max-width: 700px) {
html {
font-size: 6.5px;
}
}
@media (min-width: 700px) and (max-width: 750px) {
html {
font-size: 7px;
}
}
@media (min-width: 750px) and (max-width: 800px) {
html {
font-size: 7.6px;
}
}
@media (min-width: 800px) and (max-width: 850px) {
html {
font-size: 8px;
}
}
@media (min-width: 850px) and (max-width: 900px) {
html {
font-size: 8.5px;
}
}
@media (min-width: 900px) and (max-width: 950px) {
html {
font-size: 9px;
}
}
@media (min-width: 1000px) and (max-width: 1050px) {
html {
font-size: 10px;
}
}
@media (min-width: 1050px) and (max-width: 1100px) {
html {
font-size: 10.5px;
}
}
@media (min-width: 1100px) and (max-width: 1150px) {
html {
font-size: 11px;
}
}
@media (min-width: 1150px) and (max-width: 1200px) {
html {
font-size: 11.5px;
}
}
@media (min-width: 1200px) and (max-width: 1250px) {
html {
font-size: 12px;
}
}
@media (min-width: 1250px) and (max-width: 1300px) {
html {
font-size: 12.5px;
}
}
@media (min-width: 1300px) and (max-width: 1350px) {
html {
font-size: 13px;
}
}
@media (min-width: 1350px) and (max-width: 1400px) {
html {
font-size: 13.5px;
}
}
@media (min-width: 1400px) and (max-width: 1450px) {
html {
font-size: 14px;
}
}
@media (min-width: 1440px) {
html {
font-size: 14.4px;
}
}
@media (max-width: 1440px) {
.menu-item {
display: none;
}
}
@media (min-width: 1440px) {
.menu-item {
display: block;
}
}
.wrap {
overflow: hidden;
}
.wrap .list {
position: relative;
top: 0px;
left: 0px;
height: 100%;
display: flex;
}
.wrap .list:hover {
animation-play-state: paused !important;
}
@media (max-width: 768px) {
.wrap .list > div {
width: 150px !important;
display: flex;
justify-content: center;
}
}

View File

@ -2,20 +2,70 @@ import type { Metadata } from "next";
import "./globals.css";
import { ReactElement, ReactNode } from "react";
export const metadata: Metadata = {
title: "北京索游科技",
description: "Generated by create next app",
title: "试玩广告定制服务 | 北京索游科技",
keywords: "试玩广告、互动广告、游戏推广、playable",
description: "我们专注于试玩广告领域,以创新和专业提供高品质定制服务,打造独特方案,提升游戏曝光,吸引玩家。",
creator: "Playable Ads 定制服务团队",
};
function RootLayout({ children }:{ children: ReactNode } ): ReactElement {
function RootLayout({ children }: { children: ReactNode }): ReactElement {
return (
<html lang="en">
<body
>
<head>
<meta name="baidu-site-verification" content="codeva-ET8AOZwhkG" />
<meta name="sogou_site_verification" content="5WfNfjHc6j" />
<meta name="360-site-verification" content="c2f6de2ca12d108936ee7a52fcbf72dc" />
<meta name="bytedance-verification-code" content="uSu4KfluDS94lnP5ePYw" />
<meta name="shenma-site-verification" content="0061e0d75bde85c15d49d5d8bc05ffee_1730083409" />
</head>
<body>
{children}
{/* 头条自动提交 */}
<script
dangerouslySetInnerHTML={{
__html: `
(function(){
var el = document.createElement("script");
el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?654a750e379cda94a5b533d2242efbff0f6a099f15f24cc656d5ce882f5359fe65e0a2ada1d5e86b11e7de7c1a83287d04743a02fd1ee8dd8558a8cad50e91cb354f8c6f3f78e5fd97613c481f678e6d";
el.id = "ttzz";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(el, s);
})(window)
`,
}}
/>
{/* google Analytics */}
<script async src="https://www.googletagmanager.com/gtag/js?id=G-3VNFGQNP7Z"></script>
<script
dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-3VNFGQNP7Z');
`,
}}
/>
{/* google tag */}
<script
dangerouslySetInnerHTML={{
__html: `
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-M6PF7XLN');
`,
}}
/>
{/* Google Tag Manager (noscript) */}
<noscript>
<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-M6PF7XLN" height="0" width="0" style={{ display: "none", visibility: "hidden" }}></iframe>
</noscript>
{/* End Google Tag Manager (noscript) */}
</body>
</html>
);
}
export default RootLayout
export default RootLayout;

View File

@ -0,0 +1,235 @@
"use client";
import { useState, useEffect } from "react";
import "./price.css";
const Page = () => {
const [tip, setTip] = useState("");
const [prices, setPrices] = useState<{ desc: ""; url: "" }[]>([]);
useEffect(() => {
const fetchData = async () => {
const res = await fetch(`https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/price.json`);
const dataSource = await res.json();
setPrices(dataSource);
};
fetchData();
}, []);
const [previewInfo, setPreviewInfo] = useState({
url: "",
preview: false,
});
return (
<>
<div className="max-w-[1400px] mx-auto mt-4 priceBox">
<img
className="w-[180px]"
src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/common/logo.png"
alt="logo"
onClick={() => {
window.location.href = window.location.origin;
}}
/>
<div className=" absolute left-[50%] top-[50%] translate-x-[-50%] translate-y-[-50%]">
<h2 className="text-gradient"></h2>
<div className="formmenu">
<div className="formmenus">
<ul>
<li className="header">/</li>
<li className="header"></li>
<li className="header"></li>
<li className="header"></li>
</ul>
<div className="bbbbbb">
<dl className="Rowheaders">
<dd className="Rowheader down"></dd>
<dd className="Rowheader down">2D</dd>
<dd className="Rowheader">3D</dd>
</dl>
<div className=" pricechoose">
<dl>
<dd className="price-item down">
3000{" "}
<img
src="/home/send.png"
className="Sendicon"
alt=""
onClick={() => {
setTip("用户需要提供视频原素材");
setPreviewInfo({
url: prices[0].url,
preview: true,
});
}}
/>
</dd>
<dd className="price-item down">
5000{" "}
<img
src="/home/send.png"
className="Sendicon"
alt=""
onClick={() => {
setTip("用户需要提供所有美术资源");
setPreviewInfo({
url: prices[1].url,
preview: true,
});
}}
/>
</dd>
<dd className="price-item">
10000{" "}
<img
src="/home/send.png"
className="Sendicon"
alt=""
onClick={() => {
setTip("用户需要提供所有美术资源");
setPreviewInfo({
url: prices[2].url,
preview: true,
});
}}
/>
</dd>
</dl>
<dl>
<dd className="price-item down">
3000{" "}
<img
src="/home/send.png"
className="Sendicon"
alt=""
onClick={() => {
setTip("用户需要提供视频原素材");
setPreviewInfo({
url: prices[3].url,
preview: true,
});
}}
/>
</dd>
<dd className="price-item down">
10000{" "}
<img
src="/home/send.png"
className="Sendicon"
alt=""
onClick={() => {
setTip("用户只需要提供游戏特征资源即可(如人物,logo等)");
setPreviewInfo({
url: prices[4].url,
preview: true,
});
}}
/>
</dd>
<dd className="price-item">
15000{" "}
<img
src="/home/send.png"
className="Sendicon"
alt=""
onClick={() => {
setTip("用户只需要提供游戏特征资源即可(如人物,logo等)");
setPreviewInfo({
url: prices[5].url,
preview: true,
});
}}
/>
</dd>
</dl>
<dl>
<dd className="price-item down">
3000{" "}
<img
src="/home/send.png"
className="Sendicon"
alt=""
onClick={() => {
setTip("用户需要提供视频原素材");
setPreviewInfo({
url: prices[6].url,
preview: true,
});
}}
/>
</dd>
<dd className="price-item down">
20000{" "}
<img
src="/home/send.png"
className="Sendicon"
alt=""
onClick={() => {
setTip("适用于定制化程度高的playable项目,用户只需要提供游戏特征资源即可(如logo,人物等)");
setPreviewInfo({
url: prices[7].url,
preview: true,
});
}}
/>
</dd>
<dd className="price-item">
20000{" "}
<img
src="/home/send.png"
className="Sendicon"
alt=""
onClick={() => {
setTip("适用于定制化程度高的playable项目,用户只需要提供游戏特征资源即可(如logo,人物等)");
setPreviewInfo({
url: prices[8].url,
preview: true,
});
}}
/>
</dd>
</dl>
</div>
</div>
</div>
<p className="annotation"></p>
</div>
</div>
</div>
{previewInfo.preview && (
<div
className="fixed left-0 right-0 top-0 bottom-0 bg-black/60 z-[2000]"
onClick={() => {
document.body.style.overflow = "auto";
setPreviewInfo({
preview: false,
url: "",
});
}}
>
<div
className="flex flex-col justify-center w-[370px] h-[680px] items-center fixed top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%] mx-auto border rounded-lg p-4 bg-white"
onClick={(e) => {
e.stopPropagation();
}}
>
<div className="text-left w-full mb-2 text-xl flex space-x-2">
<img className="w-8 h-8" src="https://www-soyootech.oss-cn-hangzhou.aliyuncs.com/public/home/tip.png" alt="" />
{tip}
</div>
<iframe src={previewInfo.url} className="flex-1 w-full overflow-hidden" scrolling="no" />
</div>
</div>
)}
</>
);
};
export default Page;

View File

@ -0,0 +1,149 @@
.priceBox {
width: 100%;
min-width: 500px;
max-width: 1440px;
margin: 0 auto;
background: hwb(0 100% 0%);
margin-top: 50px;
}
.priceBox .pricelogo {
margin: 26px 0px 40px 42px;
}
.priceBox .pricelogo img {
width: 238px;
height: 74px;
}
.priceBox h2 {
font-weight: 700;
font-size: 36px;
line-height: 37px;
text-align: center;
margin: 0 auto;
margin-bottom: 40px;
-webkit-background-clip: text;
background-clip: text;
background-image: linear-gradient(to right, #ecf5ff, #0838b1);
-webkit-text-fill-color: transparent;
}
.priceBox .formmenu {
width: 900px;
border-radius: 30px;
background: #f1f6ff;
margin: 0 auto;
padding-top: 48px;
padding-bottom: 13px;
/* 标价为人民币 */
}
.priceBox .formmenu .formmenus {
width: 100%;
}
.priceBox .formmenu .formmenus ul {
display: flex;
justify-content: space-around;
margin-bottom: 24px;
}
.priceBox .formmenu .formmenus ul .header {
font-size: 20px;
font-weight: bold;
line-height: 34px;
color: #526ba8;
}
.priceBox .formmenu .formmenus .bbbbbb {
display: flex;
}
.priceBox .formmenu .formmenus .bbbbbb .Rowheaders {
width: 25%;
padding-top: 22px;
}
.priceBox .formmenu .formmenus .bbbbbb .Rowheaders .Rowheader {
font-size: 20px;
font-weight: bold;
line-height: 34px;
letter-spacing: 0em;
color: #3d3d3d;
text-align: center;
box-sizing: border-box;
}
.priceBox .formmenu .formmenus .bbbbbb .Rowheaders .down {
margin-bottom: 40px;
}
.priceBox .formmenu .formmenus .bbbbbb .pricechoose {
width: 72%;
display: flex;
background: #fff;
border-radius: 16px;
box-sizing: border-box;
overflow: hidden;
text-align: center;
padding-top: 22px;
}
.priceBox .formmenu .formmenus .bbbbbb .pricechoose dl {
width: 33.3%;
box-sizing: border-box;
}
.priceBox .formmenu .formmenus .bbbbbb .pricechoose dl dd:last-child {
margin: 28px;
}
.priceBox .formmenu .formmenus .bbbbbb .pricechoose .price-item {
font-size: 24px;
font-weight: normal;
line-height: 34px;
letter-spacing: 0em;
color: #3d3d3d;
background: #fff;
padding-left: 20%;
display: flex;
justify-content: center;
align-items: center;
}
.priceBox .formmenu .formmenus .bbbbbb .pricechoose .price-item .Sendicon {
color: #839cd8;
vertical-align: revert;
box-sizing: border-box;
padding-top: 1px;
width: 20px;
height: 20px;
margin-left: 10px;
cursor: pointer;
}
.priceBox .formmenu .formmenus .bbbbbb .pricechoose .price-item .Sendicon:hover {
color: #2169ff;
}
.priceBox .formmenu .formmenus .bbbbbb .pricechoose .down {
margin-bottom: 40px;
}
.priceBox .formmenu .annotation {
text-align: right;
font-size: 18px;
font-weight: normal;
line-height: 34px;
letter-spacing: 0em;
color: #999999;
width: 97%;
}
.priceBox .gameDialog {
border-radius: 20px;
}
.priceBox .gameDialog .gameDialogImgp {
display: flex;
margin-bottom: 8px;
}
.priceBox .gameDialog img {
width: 18.33px;
height: 18.33px;
vertical-align: middle;
}
.priceBox .gameDialog p {
font-size: 18px;
font-weight: normal;
line-height: 23px;
letter-spacing: 0em;
color: #3d3d3d;
vertical-align: middle;
}
.priceBox .iframesone {
height: 658px;
}
.priceBox .el-dialog__header {
padding: 0;
}

View File

@ -0,0 +1,176 @@
.priceBox {
width: 100%;
margin: 0 auto;
min-width: 500px;
max-width: 1440px;
margin: 0 auto;
background: hwb(0 100% 0%);
margin-top: 50px;
.pricelogo {
margin: 26px 0px 40px 42px;
img {
width: 238px;
height: 74px;
}
}
h2 {
font-weight: 700;
font-size: 36px;
line-height: 37px;
text-align: center;
margin: 0 auto;
margin-bottom: 40px;
-webkit-background-clip: text;
background-clip: text;
background-image: linear-gradient(to right, #ecf5ff, #0838b1);
-webkit-text-fill-color: transparent;
}
.formmenu {
width: 900px;
border-radius: 30px;
background: #f1f6ff;
margin: 0 auto;
padding-top: 48px;
padding-bottom: 13px;
.formmenus {
width: 100%;
ul {
display: flex;
justify-content: space-around;
margin-bottom: 24px;
.header {
font-size: 20px;
font-weight: bold;
line-height: 34px;
color: #526ba8;
}
}
.bbbbbb {
display: flex;
.Rowheaders {
width: 25%;
padding-top: 22px;
.Rowheader {
font-size: 20px;
font-weight: bold;
line-height: 34px;
letter-spacing: 0em;
color: #3d3d3d;
text-align: center;
box-sizing: border-box;
}
.down {
margin-bottom: 40px;
}
}
.pricechoose {
width: 72%;
display: flex;
background: #fff;
border-radius: 16px;
box-sizing: border-box;
overflow: hidden;
text-align: center;
padding-top: 22px;
dl {
width: 33.3%;
box-sizing: border-box;
dd:last-child {
margin: 28px;
}
}
.price-item {
font-size: 24px;
font-weight: normal;
line-height: 34px;
letter-spacing: 0em;
color: #3d3d3d;
background: #fff;
padding-left: 20%;
display: flex;
justify-content: center;
align-items: center;
.Sendicon {
color: #839cd8;
vertical-align: revert;
box-sizing: border-box;
padding-top: 1px;
width: 20px;
height: 20px;
margin-left: 10px;
cursor: pointer;
}
.Sendicon:hover {
color: #2169ff;
}
}
.down {
margin-bottom: 40px;
}
}
}
}
/* 标价为人民币 */
.annotation {
text-align: right;
font-size: 18px;
font-weight: normal;
line-height: 34px;
letter-spacing: 0em;
color: #999999;
width: 97%;
}
}
.gameDialog {
border-radius: 20px;
// height: 698px;
.gameDialogImgp {
display: flex;
margin-bottom: 8px;
}
img {
width: 18.33px;
height: 18.33px;
vertical-align: middle;
}
p {
font-size: 18px;
font-weight: normal;
line-height: 23px;
letter-spacing: 0em;
color: #3d3d3d;
vertical-align: middle;
}
}
.iframesone {
height: 658px;
}
.el-dialog__header {
padding: 0;
}
}

View File

@ -28,6 +28,6 @@
"privacyPolicy": "Privacy Policy",
"userAgreement": "User Agreement",
"productPricing": "Product Pricing",
"clickToPlay": "Click to play"
"clickToPlay": "Click to play",
"channel": "Channel Support"
}

View File

@ -1,6 +1,8 @@
const dictionaries = {
en: () => import('./en.json').then((module) => module.default),
zh: () => import('./zh.json').then((module) => module.default),
} as Record<string, () => Promise<Record<string, string>>>;
export const getDictionary = async (locale: string) => dictionaries[locale]();
en: () => import('./en.json').then((module) => module.default),
zh: () => import('./zh.json').then((module) => module.default),
} as Record<string, () => Promise<Record<string, string>>>;
export const getDictionary = async (locale: string) => {
return dictionaries[locale]()
};

View File

@ -28,5 +28,6 @@
"privacyPolicy": "隐私条款",
"userAgreement": "用户协议",
"productPricing": "产品定价",
"clickToPlay": "点击试玩"
"clickToPlay": "点击试玩",
"channel": "渠道支持"
}

15
start.sh 100644
View File

@ -0,0 +1,15 @@
#!/bin/bash
# 确保脚本以root权限运行
if [ "$(id -u)" != "0" ]; then
echo "该脚本必须以root权限运行" 1>&2
exit 1
fi
pm2 startup
pm2 save
pm2 start --name addseed-web npm -- run start
pm2 set your-app-name autorestart true
pm2 save
echo "PM2启动脚本执行完毕。"

View File

@ -1,6 +1,10 @@
{
"compilerOptions": {
"lib": ["dom", "dom.iterable", "esnext"],
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
@ -11,16 +15,27 @@
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"baseUrl": "./",
"incremental": true,
"noImplicitAny": false,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./src/*"]
"@/*": [
"./src/*"
]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
],
"exclude": [
"node_modules"
]
}