fix: hot video page restructure + responsive layout for all quick pages

This commit is contained in:
Codex
2026-06-11 23:29:16 +08:00
parent 5ddfd37f4d
commit 70a4bbed29
2 changed files with 184 additions and 218 deletions
+175 -191
View File
@@ -367,310 +367,310 @@ const platformSpecOptions: Array<{
}> = [
{
label: "淘宝/天猫",
ratios: ["淘宝主图 / SKU 鍥?800800px", "详情页宽 750px", "详情页宽 790px"],
defaultRatio: "淘宝主图 / SKU 鍥?800800px",
ratios: ["淘宝主图 / SKU 800×800px", "详情页宽 750px", "详情页宽 790px"],
defaultRatio: "淘宝主图 / SKU 800×800px",
ratioGroups: {
set: {
ratios: ["10001000px\u00a0\u00a0\u00a01锛?", "800800px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "10001000px\u00a0\u00a0\u00a01锛?",
ratios: ["1000×1000px\u00a0\u00a0\u00a01:1", "800×800px\u00a0\u00a0\u00a01:1"],
defaultRatio: "1000×1000px\u00a0\u00a0\u00a01:1",
},
detail: {
ratios: [
"7501000px\u00a0\u00a0\u00a03锛?",
"7901053px\u00a0\u00a0\u00a03锛?",
"7501125px\u00a0\u00a0\u00a02锛?",
"7901185px\u00a0\u00a0\u00a02锛?",
"750×1000px\u00a0\u00a0\u00a03:4",
"790×1053px\u00a0\u00a0\u00a03:4",
"750×1125px\u00a0\u00a0\u00a02:3",
"790×1185px\u00a0\u00a0\u00a02:3",
],
defaultRatio: "7501000px\u00a0\u00a0\u00a03锛?",
defaultRatio: "750×1000px\u00a0\u00a0\u00a03:4",
},
model: {
ratios: ["7501000px\u00a0\u00a0\u00a03锛?"],
defaultRatio: "7501000px\u00a0\u00a0\u00a03锛?",
ratios: ["750×1000px\u00a0\u00a0\u00a03:4"],
defaultRatio: "750×1000px\u00a0\u00a0\u00a03:4",
},
video: {
ratios: ["10801920px\u00a0\u00a0\u00a09锛?6", "10801440px\u00a0\u00a0\u00a03锛?", "10801080px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "10801920px\u00a0\u00a0\u00a09锛?6",
ratios: ["1080×1920px\u00a0\u00a0\u00a09:16", "1080×1440px\u00a0\u00a0\u00a03:4", "1080×1080px\u00a0\u00a0\u00a01:1"],
defaultRatio: "1080×1920px\u00a0\u00a0\u00a09:16",
},
hot: {
ratios: ["800800px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "800800px\u00a0\u00a0\u00a01锛?",
ratios: ["800×800px\u00a0\u00a0\u00a01:1"],
defaultRatio: "800×800px\u00a0\u00a0\u00a01:1",
},
},
specs: ["主图 / SKU 鍥?800800px锛屸墹3MB", "详情页宽 750px 或?790px锛屽崟寮犻珮鈮?546px"],
tip: "建议主图 200-400KB JPG锛岃秴杩?500KB 浼氬奖鍝嶅姞杞介€熷害銆?",
specs: ["主图 / SKU 800×800px,≤3MB", "详情页宽 750px 或 790px,单张高度≤1546px"],
tip: "建议主图 200-400KB JPG,超过 500KB 会影响加载速度。",
},
{
label: "京东",
ratios: ["京东主图 / SKU 鍥?800800px", "详情页宽 750px", "首图主体占比 鈮?0%"],
defaultRatio: "京东主图 / SKU 鍥?800800px",
ratios: ["京东主图 / SKU 800×800px", "详情页宽 750px", "首图主体占比 ≥80%"],
defaultRatio: "京东主图 / SKU 800×800px",
ratioGroups: {
set: {
ratios: ["10001000px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "10001000px\u00a0\u00a0\u00a01锛?",
ratios: ["1000×1000px\u00a0\u00a0\u00a01:1"],
defaultRatio: "1000×1000px\u00a0\u00a0\u00a01:1",
},
detail: {
ratios: [
"7501000px\u00a0\u00a0\u00a03锛?",
"9901320px\u00a0\u00a0\u00a03锛?",
"7501125px\u00a0\u00a0\u00a02锛?",
"9901485px\u00a0\u00a0\u00a02锛?",
"750×1000px\u00a0\u00a0\u00a03:4",
"990×1320px\u00a0\u00a0\u00a03:4",
"750×1125px\u00a0\u00a0\u00a02:3",
"990×1485px\u00a0\u00a0\u00a02:3",
],
defaultRatio: "7501000px\u00a0\u00a0\u00a03锛?",
defaultRatio: "750×1000px\u00a0\u00a0\u00a03:4",
},
model: {
ratios: ["7501125px\u00a0\u00a0\u00a02锛?", "9901485px\u00a0\u00a0\u00a02锛?"],
defaultRatio: "7501125px\u00a0\u00a0\u00a02锛?",
ratios: ["750×1125px\u00a0\u00a0\u00a02:3", "990×1485px\u00a0\u00a0\u00a02:3"],
defaultRatio: "750×1125px\u00a0\u00a0\u00a02:3",
},
video: {
ratios: ["10801920px\u00a0\u00a0\u00a09锛?6", "19201080px\u00a0\u00a0\u00a016锛?"],
defaultRatio: "10801920px\u00a0\u00a0\u00a09锛?6",
ratios: ["1080×1920px\u00a0\u00a0\u00a09:16", "1920×1080px\u00a0\u00a0\u00a016:9"],
defaultRatio: "1080×1920px\u00a0\u00a0\u00a09:16",
},
hot: {
ratios: ["800800px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "800800px\u00a0\u00a0\u00a01锛?",
ratios: ["800×800px\u00a0\u00a0\u00a01:1"],
defaultRatio: "800×800px\u00a0\u00a0\u00a01:1",
},
},
specs: ["主图 / SKU 鍥?800800px锛岀櫧搴曪紝鈮?MB", "详情页宽 750px锛岄鍥句富浣撳崰姣?鈮?0%"],
specs: ["主图 / SKU 800×800px,白底,≤3MB", "详情页宽 750px,首图主体占比 ≥80%"],
},
{
label: "拼多多",
ratios: ["主图 750352px", "主图 800800px", "详情页宽 750px"],
defaultRatio: "主图 750352px",
ratios: ["主图 750×352px", "主图 800×800px", "详情页宽 750px"],
defaultRatio: "主图 750×352px",
ratioGroups: {
set: {
ratios: ["800800px\u00a0\u00a0\u00a01锛?", "7501000px\u00a0\u00a0\u00a03锛?"],
defaultRatio: "800800px\u00a0\u00a0\u00a01锛?",
ratios: ["800×800px\u00a0\u00a0\u00a01:1", "750×1000px\u00a0\u00a0\u00a03:4"],
defaultRatio: "800×800px\u00a0\u00a0\u00a01:1",
},
detail: {
ratios: ["7501000px\u00a0\u00a0\u00a03锛?", "7501125px\u00a0\u00a0\u00a02锛?"],
defaultRatio: "7501000px\u00a0\u00a0\u00a03锛?",
ratios: ["750×1000px\u00a0\u00a0\u00a03:4", "750×1125px\u00a0\u00a0\u00a02:3"],
defaultRatio: "750×1000px\u00a0\u00a0\u00a03:4",
},
model: {
ratios: ["7501000px\u00a0\u00a0\u00a03锛?"],
defaultRatio: "7501000px\u00a0\u00a0\u00a03锛?",
ratios: ["750×1000px\u00a0\u00a0\u00a03:4"],
defaultRatio: "750×1000px\u00a0\u00a0\u00a03:4",
},
video: {
ratios: ["10801920px\u00a0\u00a0\u00a09锛?6"],
defaultRatio: "10801920px\u00a0\u00a0\u00a09锛?6",
ratios: ["1080×1920px\u00a0\u00a0\u00a09:16"],
defaultRatio: "1080×1920px\u00a0\u00a0\u00a09:16",
},
hot: {
ratios: ["800800px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "800800px\u00a0\u00a0\u00a01锛?",
ratios: ["800×800px\u00a0\u00a0\u00a01:1"],
defaultRatio: "800×800px\u00a0\u00a0\u00a01:1",
},
},
specs: ["主图 750352px 或?800800px锛屸墹1MB", "详情页宽 750px,要求纯白底、无水印、无拼接"],
specs: ["主图 750×352px 或 800×800px,≤1MB", "详情页宽 750px,要求纯白底、无水印、无拼接"],
},
{
label: "抖音电商",
ratios: ["鐭棰?10801920px"],
defaultRatio: "鐭棰?10801920px",
ratios: ["短视频1080×1920px"],
defaultRatio: "短视频1080×1920px",
ratioGroups: {
video: {
ratios: ["10801920px\u00a0\u00a0\u00a09锛?6"],
defaultRatio: "10801920px\u00a0\u00a0\u00a09锛?6",
ratios: ["1080×1920px\u00a0\u00a0\u00a09:16"],
defaultRatio: "1080×1920px\u00a0\u00a0\u00a09:16",
},
hot: {
ratios: ["800800px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "800800px\u00a0\u00a0\u00a01锛?",
ratios: ["800×800px\u00a0\u00a0\u00a01:1"],
defaultRatio: "800×800px\u00a0\u00a0\u00a01:1",
},
},
specs: ["鐭棰?10801920px锛?:16", "30s 图呮渶浣?"],
specs: ["短视频 1080×1920px9:16", "30s 内最佳"],
},
{
label: "亚马逊 Amazon",
ratios: ["主图 鈮?6001600px", "建议 20002000px+", "鏈€灏?500500px"],
defaultRatio: "主图 鈮?6001600px",
ratios: ["主图 ≥1600×1600px", "建议 2000×2000px+", "最小 500×500px"],
defaultRatio: "主图 ≥1600×1600px",
ratioGroups: {
set: {
ratios: ["16001600px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "16001600px\u00a0\u00a0\u00a01锛?",
ratios: ["1600×1600px\u00a0\u00a0\u00a01:1"],
defaultRatio: "1600×1600px\u00a0\u00a0\u00a01:1",
},
detail: {
ratios: ["16001600px\u00a0\u00a0\u00a01锛?", "12001800px\u00a0\u00a0\u00a02锛?", "12001600px\u00a0\u00a0\u00a03锛?"],
defaultRatio: "12001800px\u00a0\u00a0\u00a02锛?",
ratios: ["1600×1600px\u00a0\u00a0\u00a01:1", "1200×1800px\u00a0\u00a0\u00a02:3", "1200×1600px\u00a0\u00a0\u00a03:4"],
defaultRatio: "1200×1800px\u00a0\u00a0\u00a02:3",
},
model: {
ratios: ["12001800px\u00a0\u00a0\u00a02锛?"],
defaultRatio: "12001800px\u00a0\u00a0\u00a02锛?",
ratios: ["1200×1800px\u00a0\u00a0\u00a02:3"],
defaultRatio: "1200×1800px\u00a0\u00a0\u00a02:3",
},
video: {
ratios: ["19201080px\u00a0\u00a0\u00a016锛?"],
defaultRatio: "19201080px\u00a0\u00a0\u00a016锛?",
ratios: ["1920×1080px\u00a0\u00a0\u00a016:9"],
defaultRatio: "1920×1080px\u00a0\u00a0\u00a016:9",
},
hot: {
ratios: ["16001600px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "16001600px\u00a0\u00a0\u00a01锛?",
ratios: ["1600×1600px\u00a0\u00a0\u00a01:1"],
defaultRatio: "1600×1600px\u00a0\u00a0\u00a01:1",
},
},
specs: ["主图 16001600px+,纯白底,≤10MB", "鏈€灏?500500px锛屽缓璁?2000px+ 浠ユ敮鎸佺缉鏀?"],
aliases: ["浜氶┈閫?"],
specs: ["主图 1600×1600px+,纯白底,≤10MB", "最小 500×500px,建议 2000px+ 以支持缩放"],
aliases: ["亚马逊"],
},
{
label: "Shopee",
ratios: ["商品主图 10241024px", "基础主图 800800px"],
defaultRatio: "商品主图 10241024px",
ratios: ["商品主图 1024×1024px", "基础主图 800×800px"],
defaultRatio: "商品主图 1024×1024px",
ratioGroups: {
set: {
ratios: ["800800px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "800800px\u00a0\u00a0\u00a01锛?",
ratios: ["800×800px\u00a0\u00a0\u00a01:1"],
defaultRatio: "800×800px\u00a0\u00a0\u00a01:1",
},
detail: {
ratios: ["7501000px\u00a0\u00a0\u00a03锛?", "7501125px\u00a0\u00a0\u00a02锛?"],
defaultRatio: "7501000px\u00a0\u00a0\u00a03锛?",
ratios: ["750×1000px\u00a0\u00a0\u00a03:4", "750×1125px\u00a0\u00a0\u00a02:3"],
defaultRatio: "750×1000px\u00a0\u00a0\u00a03:4",
},
model: {
ratios: ["7501000px\u00a0\u00a0\u00a03锛?"],
defaultRatio: "7501000px\u00a0\u00a0\u00a03锛?",
ratios: ["750×1000px\u00a0\u00a0\u00a03:4"],
defaultRatio: "750×1000px\u00a0\u00a0\u00a03:4",
},
video: {
ratios: ["10801920px\u00a0\u00a0\u00a09锛?6"],
defaultRatio: "10801920px\u00a0\u00a0\u00a09锛?6",
ratios: ["1080×1920px\u00a0\u00a0\u00a09:16"],
defaultRatio: "1080×1920px\u00a0\u00a0\u00a09:16",
},
hot: {
ratios: ["800800px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "800800px\u00a0\u00a0\u00a01锛?",
ratios: ["800×800px\u00a0\u00a0\u00a01:1"],
defaultRatio: "800×800px\u00a0\u00a0\u00a01:1",
},
},
specs: ["商品主图推荐 10241024px,基础 800800px", "鈮?MB锛岀櫧搴曟垨娴呰壊搴?"],
specs: ["商品主图推荐 1024×1024px,基础 800×800px", "≤2MB,白底或浅色底"],
aliases: ["虾皮 Shopee/Lazada", "虾皮"],
},
{
label: "Lazada",
ratios: ["商品主图 800800px"],
defaultRatio: "商品主图 800800px",
ratios: ["商品主图 800×800px"],
defaultRatio: "商品主图 800×800px",
ratioGroups: {
set: {
ratios: ["800800px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "800800px\u00a0\u00a0\u00a01锛?",
ratios: ["800×800px\u00a0\u00a0\u00a01:1"],
defaultRatio: "800×800px\u00a0\u00a0\u00a01:1",
},
detail: {
ratios: ["7501000px\u00a0\u00a0\u00a03锛?", "7501125px\u00a0\u00a0\u00a02锛?"],
defaultRatio: "7501000px\u00a0\u00a0\u00a03锛?",
ratios: ["750×1000px\u00a0\u00a0\u00a03:4", "750×1125px\u00a0\u00a0\u00a02:3"],
defaultRatio: "750×1000px\u00a0\u00a0\u00a03:4",
},
model: {
ratios: ["7501000px\u00a0\u00a0\u00a03锛?"],
defaultRatio: "7501000px\u00a0\u00a0\u00a03锛?",
ratios: ["750×1000px\u00a0\u00a0\u00a03:4"],
defaultRatio: "750×1000px\u00a0\u00a0\u00a03:4",
},
video: {
ratios: ["10801920px\u00a0\u00a0\u00a09锛?6"],
defaultRatio: "10801920px\u00a0\u00a0\u00a09锛?6",
ratios: ["1080×1920px\u00a0\u00a0\u00a09:16"],
defaultRatio: "1080×1920px\u00a0\u00a0\u00a09:16",
},
hot: {
ratios: ["800800px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "800800px\u00a0\u00a0\u00a01锛?",
ratios: ["800×800px\u00a0\u00a0\u00a01:1"],
defaultRatio: "800×800px\u00a0\u00a0\u00a01:1",
},
},
specs: ["商品主图 800800px锛?:1"],
specs: ["商品主图 800×800px1:1"],
},
{
label: "Instagram",
ratios: ["帖子 10801350px", "帖子 10801080px", "Stories / Reels 10801920px", "头像 320320px"],
defaultRatio: "帖子 10801350px",
ratios: ["帖子 1080×1350px", "帖子 1080×1080px", "Stories / Reels 1080×1920px", "头像 320×320px"],
defaultRatio: "帖子 1080×1350px",
ratioGroups: {
set: {
ratios: ["10801080px\u00a0\u00a0\u00a01锛?", "10801350px\u00a0\u00a0\u00a04锛?"],
defaultRatio: "10801080px\u00a0\u00a0\u00a01锛?",
ratios: ["1080×1080px\u00a0\u00a0\u00a01:1", "1080×1350px\u00a0\u00a0\u00a04:5"],
defaultRatio: "1080×1080px\u00a0\u00a0\u00a01:1",
},
detail: {
ratios: ["10801350px\u00a0\u00a0\u00a04锛?"],
defaultRatio: "10801350px\u00a0\u00a0\u00a04锛?",
ratios: ["1080×1350px\u00a0\u00a0\u00a04:5"],
defaultRatio: "1080×1350px\u00a0\u00a0\u00a04:5",
},
model: {
ratios: ["10801350px\u00a0\u00a0\u00a04锛?"],
defaultRatio: "10801350px\u00a0\u00a0\u00a04锛?",
ratios: ["1080×1350px\u00a0\u00a0\u00a04:5"],
defaultRatio: "1080×1350px\u00a0\u00a0\u00a04:5",
},
video: {
ratios: ["10801920px\u00a0\u00a0\u00a09锛?6", "10801350px\u00a0\u00a0\u00a04锛?"],
defaultRatio: "10801920px\u00a0\u00a0\u00a09锛?6",
ratios: ["1080×1920px\u00a0\u00a0\u00a09:16", "1080×1350px\u00a0\u00a0\u00a04:5"],
defaultRatio: "1080×1920px\u00a0\u00a0\u00a09:16",
},
},
specs: ["帖子 10801350px 或?10801080px", "Stories / Reels 封面 10801920px锛屽ご鍍?320320px"],
tip: "建议 鈮?MB JPG銆?",
specs: ["帖子 1080×1350px 或 1080×1080px", "Stories / Reels 封面 1080×1920px,头像 320×320px"],
tip: "建议 ≤8MB JPG",
aliases: ["Instagram Reels"],
},
{
label: "速卖通",
ratios: ["主图 800800px", "主图 10001000px+"],
defaultRatio: "主图 800800px",
ratios: ["主图 800×800px", "主图 1000×1000px+"],
defaultRatio: "主图 800×800px",
ratioGroups: {
set: {
ratios: ["10001000px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "10001000px\u00a0\u00a0\u00a01锛?",
ratios: ["1000×1000px\u00a0\u00a0\u00a01:1"],
defaultRatio: "1000×1000px\u00a0\u00a0\u00a01:1",
},
detail: {
ratios: ["7501125px\u00a0\u00a0\u00a02锛?", "7501000px\u00a0\u00a0\u00a03锛?"],
defaultRatio: "7501125px\u00a0\u00a0\u00a02锛?",
ratios: ["750×1125px\u00a0\u00a0\u00a02:3", "750×1000px\u00a0\u00a0\u00a03:4"],
defaultRatio: "750×1125px\u00a0\u00a0\u00a02:3",
},
model: {
ratios: ["7501125px\u00a0\u00a0\u00a02锛?"],
defaultRatio: "7501125px\u00a0\u00a0\u00a02锛?",
ratios: ["750×1125px\u00a0\u00a0\u00a02:3"],
defaultRatio: "750×1125px\u00a0\u00a0\u00a02:3",
},
video: {
ratios: ["10801920px\u00a0\u00a0\u00a09锛?6", "19201080px\u00a0\u00a0\u00a016锛?"],
defaultRatio: "10801920px\u00a0\u00a0\u00a09锛?6",
ratios: ["1080×1920px\u00a0\u00a0\u00a09:16", "1920×1080px\u00a0\u00a0\u00a016:9"],
defaultRatio: "1080×1920px\u00a0\u00a0\u00a09:16",
},
hot: {
ratios: ["800800px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "800800px\u00a0\u00a0\u00a01锛?",
ratios: ["800×800px\u00a0\u00a0\u00a01:1"],
defaultRatio: "800×800px\u00a0\u00a0\u00a01:1",
},
},
specs: ["主图建议 800800px 或更高,1:1", "适合跨境电商主图、SKU 鍥惧拰鍦烘櫙鍥?"],
specs: ["主图建议 800×800px 或更高,1:1", "适合跨境电商主图、SKU 图和场景图"],
},
{
label: "eBay",
ratios: ["鍟嗗搧鍥?1:1", "白底多角度展示图 1:1"],
defaultRatio: "鍟嗗搧鍥?1:1",
ratios: ["商品图1:1", "白底多角度展示图 1:1"],
defaultRatio: "商品图1:1",
ratioGroups: {
set: {
ratios: ["16001600px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "16001600px\u00a0\u00a0\u00a01锛?",
ratios: ["1600×1600px\u00a0\u00a0\u00a01:1"],
defaultRatio: "1600×1600px\u00a0\u00a0\u00a01:1",
},
detail: {
ratios: ["10001500px\u00a0\u00a0\u00a02锛?", "12001600px\u00a0\u00a0\u00a03锛?"],
defaultRatio: "10001500px\u00a0\u00a0\u00a02锛?",
ratios: ["1000×1500px\u00a0\u00a0\u00a02:3", "1200×1600px\u00a0\u00a0\u00a03:4"],
defaultRatio: "1000×1500px\u00a0\u00a0\u00a02:3",
},
model: {
ratios: ["10001500px\u00a0\u00a0\u00a02锛?"],
defaultRatio: "10001500px\u00a0\u00a0\u00a02锛?",
ratios: ["1000×1500px\u00a0\u00a0\u00a02:3"],
defaultRatio: "1000×1500px\u00a0\u00a0\u00a02:3",
},
video: {
ratios: ["19201080px\u00a0\u00a0\u00a016锛?", "10801920px\u00a0\u00a0\u00a09锛?6"],
defaultRatio: "19201080px\u00a0\u00a0\u00a016锛?",
ratios: ["1920×1080px\u00a0\u00a0\u00a016:9", "1080×1920px\u00a0\u00a0\u00a09:16"],
defaultRatio: "1920×1080px\u00a0\u00a0\u00a016:9",
},
hot: {
ratios: ["16001600px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "16001600px\u00a0\u00a0\u00a01锛?",
ratios: ["1600×1600px\u00a0\u00a0\u00a01:1"],
defaultRatio: "1600×1600px\u00a0\u00a0\u00a01:1",
},
},
specs: ["鍟嗗搧鍥惧缓璁?1:1锛屼富浣撴竻鏅板眳涓?", "閫傚悎白底主图鍜屽瑙掑害灞曠ず鍥?"],
specs: ["商品图建议 1:1,主体清晰居中", "适合白底主图和多角度展示图"],
},
{
label: "TikTok Shop",
ratios: ["商品主图 1:1", "鐭棰?/ 竖版封面 9:16"],
ratios: ["商品主图 1:1", "短视频/ 竖版封面 9:16"],
defaultRatio: "商品主图 1:1",
ratioGroups: {
set: {
ratios: ["12801280px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "12801280px\u00a0\u00a0\u00a01锛?",
ratios: ["1280×1280px\u00a0\u00a0\u00a01:1"],
defaultRatio: "1280×1280px\u00a0\u00a0\u00a01:1",
},
detail: {
ratios: ["10801350px\u00a0\u00a0\u00a04锛?"],
defaultRatio: "10801350px\u00a0\u00a0\u00a04锛?",
ratios: ["1080×1350px\u00a0\u00a0\u00a04:5"],
defaultRatio: "1080×1350px\u00a0\u00a0\u00a04:5",
},
model: {
ratios: ["10801350px\u00a0\u00a0\u00a04锛?"],
defaultRatio: "10801350px\u00a0\u00a0\u00a04锛?",
ratios: ["1080×1350px\u00a0\u00a0\u00a04:5"],
defaultRatio: "1080×1350px\u00a0\u00a0\u00a04:5",
},
video: {
ratios: ["10801920px\u00a0\u00a0\u00a09锛?6"],
defaultRatio: "10801920px\u00a0\u00a0\u00a09锛?6",
ratios: ["1080×1920px\u00a0\u00a0\u00a09:16"],
defaultRatio: "1080×1920px\u00a0\u00a0\u00a09:16",
},
hot: {
ratios: ["800800px\u00a0\u00a0\u00a01锛?"],
defaultRatio: "800800px\u00a0\u00a0\u00a01锛?",
ratios: ["800×800px\u00a0\u00a0\u00a01:1"],
defaultRatio: "800×800px\u00a0\u00a0\u00a01:1",
},
},
specs: ["商品主图建议 1:1", "鐭棰?竖版封面建议 9:16"],
specs: ["商品主图建议 1:1", "短视频竖版封面建议 9:16"],
},
];
const platformOptions = platformSpecOptions.map((option) => option.label);
@@ -684,7 +684,7 @@ const getPlatformLogoSources = (value: string) => {
if (normalized.includes("shopee")) return [shopeeLogo];
if (normalized.includes("lazada")) return [lazadaLogo];
if (normalized.includes("instagram")) return [instagramLogo];
if (value.includes("速卖通") || value.includes("閫熷崠閫")) return [aliexpressLogo];
if (value.includes("速卖通")) return [aliexpressLogo];
if (normalized.includes("ebay")) return [ebayLogo];
if (normalized.includes("tiktok")) return [tiktokShopLogo];
return [];
@@ -744,7 +744,7 @@ const languageAliases: Record<string, string> = {
"西班牙语": "西班牙语",
"葡文": "葡萄牙语",
"葡萄牙语": "葡萄牙语",
"鍗板凹璇?": "印度尼西亚语",
"印尼语": "印度尼西亚语",
"印度尼西亚语": "印度尼西亚语",
"菲律宾语": "菲律宾语(他加禄语)",
"菲律宾语(他加禄语)": "菲律宾语(他加禄语)",
@@ -755,10 +755,10 @@ const getPlatformSpec = (value: string) =>
const legacyPlatformAliases: Record<string, string> = {
"淘宝/天猫": "淘宝/天猫",
"京东": "京东",
"鎷煎澶?": "拼多多",
"拼多多": "拼多多",
"抖音电商": "抖音电商",
"浜氶┈閫?Amazon": "亚马逊 Amazon",
"閫熷崠閫?": "速卖通",
"亚马逊Amazon": "亚马逊 Amazon",
"速卖通": "速卖通",
};
const normalizePlatform = (value: string) => getPlatformSpec(legacyPlatformAliases[value] ?? value).label;
const domesticPlatformLabels = new Set(["淘宝/天猫", "京东", "拼多多", "抖音电商"]);
@@ -811,13 +811,13 @@ const formatRatioDisplayValue = (value: string) => {
return `${width}×${height}px\u00a0\u00a0\u00a0${formatAspectRatio(width, height)}`;
}
return normalizedValue
.replace("淘宝主图 / SKU 鍥?", "淘宝主图 / SKU 图 ")
.replace("京东主图 / SKU 鍥?", "京东主图 / SKU 图 ")
.replace("淘宝主图 / SKU ", "淘宝主图 / SKU 图 ")
.replace("京东主图 / SKU ", "京东主图 / SKU 图 ")
.replace("详情页宽", "详情页宽")
.replace("鐭棰?", "短视频")
.replace("短视频", "短视频")
.replace("主图", "主图")
.replace("商品主图", "商品主图")
.replace("鍟嗗搧鍥?", "商品图");
.replace("商品图", "商品图");
};
/** Extract CSS aspect-ratio from a ratio string like "1000x1000px 1:1" -> "1 / 1" */
const parseRatioToAspectCss = (ratioStr: string): string => {
@@ -825,7 +825,7 @@ const parseRatioToAspectCss = (ratioStr: string): string => {
if (!match) return "1 / 1";
return `${match[1]} / ${match[2]}`;
};
/** Normalize ratio display string ("10001000px 1锛?") to API format ("1:1") */
/** Normalize ratio display string ("1000×1000px 1:1") to API format ("1:1") */
const normalizeRatioForApi = (ratioStr: string): string => {
const match = ratioStr.match(/(\d+)\D+(\d+)/u);
if (!match) return "1:1";
@@ -938,7 +938,7 @@ const productSetAssets = ossAssets.ecommerce.productSet;
const productSetPreviewCards = [
{ id: "main", label: "01 主图 (白底/合规)", src: productSetAssets.main },
{ id: "scene", label: "02 场景展示", src: productSetAssets.scene },
{ id: "model", label: "03 妯$壒鍦烘櫙鍥?", src: productSetAssets.model },
{ id: "model", label: "03 模特场景图", src: productSetAssets.model },
{ id: "detail", label: "04 细节说明", src: productSetAssets.detail },
{ id: "selling", label: "05 卖点详解", src: productSetAssets.selling },
];
@@ -1698,7 +1698,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
});
setProductSetStatus("ready");
} catch (err) {
toast.error(err instanceof Error ? err.message : "鍟嗗搧鍥句笂浼犲け璐?");
toast.error(err instanceof Error ? err.message : "商品图上传失败");
}
};
@@ -2444,7 +2444,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
setStatus("ready");
setResults([]);
} catch (err) {
toast.error(err instanceof Error ? err.message : "鍟嗗搧鍥句笂浼犲け璐?");
toast.error(err instanceof Error ? err.message : "商品图上传失败");
}
};
@@ -2961,7 +2961,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
setGarmentImages((current) => [...current, ...nextImages].slice(0, 5));
setTryOnStatus("ready");
} catch (err) {
toast.error(err instanceof Error ? err.message : "鏈嶉グ鍥句笂浼犲け璐?");
toast.error(err instanceof Error ? err.message : "服饰图上传失败");
}
})();
event.target.value = "";
@@ -3011,7 +3011,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
setDetailStatus("ready");
setDetailResultUrl(null);
} catch (err) {
toast.error(err instanceof Error ? err.message : "璇︽儏鍥句笂浼犲け璐?");
toast.error(err instanceof Error ? err.message : "详情图上传失败");
}
};
@@ -3040,9 +3040,9 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
const IMAGE_MODEL = "gpt-image-2";
const setCountLabels: Record<CloneSetCountKey, { label: string; promptDesc: string }> = {
selling: { label: "鍗栫偣鍥?", promptDesc: "selling-point infographic image highlighting core product advantages and detail close-ups" },
white: { label: "白底鍥?", promptDesc: "clean white-background product photo showing the item from its best angle, studio lighting, no props" },
scene: { label: "鍦烘櫙鍥?", promptDesc: "lifestyle scene image showing the product in a realistic usage environment with natural surroundings" },
selling: { label: "卖点图", promptDesc: "selling-point infographic image highlighting core product advantages and detail close-ups" },
white: { label: "白底", promptDesc: "clean white-background product photo showing the item from its best angle, studio lighting, no props" },
scene: { label: "场景图", promptDesc: "lifestyle scene image showing the product in a realistic usage environment with natural surroundings" },
};
const buildDetailModulePrompt = (moduleIds: string[]): string => {
@@ -3182,7 +3182,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
imageGen.updateTask(storeId, { status: "completed", progress: 100, resultUrl: persistedUrl });
} else {
generatedUrls.push("");
imageGen.updateTask(storeId, { status: "failed", error: "生成鏈繑鍥炵粨鏋?" });
imageGen.updateTask(storeId, { status: "failed", error: "生成未返回结果" });
}
}
}
@@ -3270,7 +3270,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
imageGen.updateTask(storeId, { status: "completed", progress: 100, resultUrl: persistedUrl });
} else {
statusFn?.("idle");
imageGen.updateTask(storeId, { status: "failed", error: "生成鏈繑鍥炵粨鏋?" });
imageGen.updateTask(storeId, { status: "failed", error: "生成未返回结果" });
}
} catch (err) {
if (imageAbortRef.current.current) {
@@ -3467,7 +3467,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
const handleDetailAiWrite = () => {
setDetailRequirement(
"1.产品名称:无线降噪蓝牙耳机\n2.鏍稿績鍗栫偣锛氫富鍔ㄩ檷鍣€?4H续航、低延迟连接、舒适佩戴\n3.适用人群:通勤、办公、运动和旅行用户\n4.期望场景:地铁通勤、居家办公、户外运动\n5.鍏蜂綋参数锛氳摑鐗?.3銆両PX4闃叉按銆佸揩鍏?0分钟使用2小时",
"1.产品名称:无线降噪蓝牙耳机\n2.核心卖点:主动降噪、24H续航、低延迟连接、舒适佩戴\n3.适用人群:通勤、办公、运动和旅行用户\n4.期望场景:地铁通勤、居家办公、户外运动\n5.具体参数:蓝牙5.3、IPX4防水、快充10分钟使用2小时",
);
};
@@ -3547,19 +3547,19 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
const isWatermarkTool = isCloneTool && activeQuickTool === "watermark";
const isImageEditTool = isCloneTool && activeQuickTool === "image-edit";
const isHotVideoTool = isCloneTool && activeQuickTool === "hot-video";
const pageLabel = isSetTool ? "商品套图" : isDetail ? "A+/璇︽儏椤?" : isTryOn ? "AI服饰穿戴" : activeToolMeta?.label || "商品工具";
const pageLabel = isSetTool ? "商品套图" : isDetail ? "A+/详情页" : isTryOn ? "AI服饰穿戴" : activeToolMeta?.label || "商品工具";
const setPrimaryLabel =
setImages.length === 0
? "请先上传商品原图"
: productSetStatus === "generating"
? "生成涓?.."
? "生成中..."
: "生成" + selectedProductSetOutput.label;
const tryOnPrimaryLabel =
garmentImages.length === 0 ? "请先上传服装图片" : tryOnStatus === "generating" ? "生成涓?.." : "生成服饰穿戴鍥?";
garmentImages.length === 0 ? "请先上传服装图片" : tryOnStatus === "generating" ? "生成中..." : "生成服饰穿戴";
const detailPrimaryLabel =
detailProductImages.length === 0 ? "请上传产品图" : detailStatus === "generating" ? "生成涓?.." : "生成A+璇︽儏椤?";
detailProductImages.length === 0 ? "请上传产品图" : detailStatus === "generating" ? "生成中..." : "生成A+详情页";
const clonePrimaryLabel =
productImages.length === 0 ? "请先上传商品原图" : status === "generating" ? "生成涓?.." : "生成" + selectedCloneOutput.label;
productImages.length === 0 ? "请先上传商品原图" : status === "generating" ? "生成中..." : "生成" + selectedCloneOutput.label;
const setPreviewCards: CloneResult[] = [];
let setIndex = 0;
for (const countKey of cloneSetCountKeys) {
@@ -3693,7 +3693,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
if (historyRefreshLockRef.current) return;
historyRefreshLockRef.current = true;
setIsHistoryRefreshing(true);
setHistoryRefreshMessage("鍒锋柊涓?..");
setHistoryRefreshMessage("刷新中...");
setHistoryRefreshStamp(Date.now());
window.setTimeout(() => {
@@ -4023,7 +4023,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
value={productSetRequirement}
onChange={(event) => setProductSetRequirement(event.target.value)}
maxLength={500}
placeholder="建议鍖呭惈浠ヤ笅淇℃伅锛氫骇鍝佸悕绉般€佹牳蹇冨崠鐐广€佹湡鏈涘満鏅€佸叿浣撳弬鏁?"
placeholder="建议包含以下信息:产品名称、核心卖点、期望场景、具体参数"
/>
<button type="button" className="product-set-floating-submit" disabled={!canGenerateSet} onClick={handleSetGenerate}>
{productSetStatus === "generating" ? <LoadingOutlined /> : null}
@@ -4290,7 +4290,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
<span className="clone-ai-flow-node__label"></span>
</div>
{/* Connector —鍒嗘敮杩炴帴绾?*/}
{/* Connector - branch lines */}
<div className="clone-ai-flow-connector" aria-hidden="true">
<div className="clone-ai-flow-connector__trunk" />
<div className="clone-ai-flow-connector__branches">
@@ -4503,7 +4503,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
<strong></strong>
</button>
{productImages.length || videoOutfitVideoFile ? (
<div className="ecom-command-asset-popover" aria-label="宸蹭笂浼犵礌鏉?">
<div className="ecom-command-asset-popover" aria-label="已上传素材">
{productImages.map((image) => (
<figure key={image.id} className="ecom-command-asset-thumb">
<img src={image.src} alt={image.name || "上传图片"} />
@@ -5165,7 +5165,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
/>
<aside className="ecom-watermark-side">
<header className="ecom-quick-set-panel-head ecom-watermark-panel-head">
<strong className="ecom-quick-set-page-title">/</strong>
<strong className="ecom-quick-set-page-title"></strong>
<button type="button" className="ecom-quick-set-back" onClick={closeWatermarkRemovalPage}></button>
<button type="button" className="ecom-quick-set-back" onClick={closeWatermarkRemovalPage}></button>
</header>
@@ -5621,14 +5621,6 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
</section>
</section>
</div>
<button
type="button"
className="ecom-quick-set-collapse"
aria-label={isQuickPanelCollapsed ? "展开设置" : "收起设置"}
onClick={() => setIsQuickPanelCollapsed((value) => !value)}
>
{isQuickPanelCollapsed ? "" : ""}
</button>
<button type="button" className="ecom-quick-set-help" aria-label="帮助" onClick={() => toast.info("上传商品原图后,可选择平台、语言、比例并开始生成。")}>?</button>
</main>
);
@@ -5794,14 +5786,6 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
</section>
</section>
</div>
<button
type="button"
className="ecom-quick-set-collapse"
aria-label={isQuickPanelCollapsed ? "展开设置" : "收起设置"}
onClick={() => setIsQuickPanelCollapsed((value) => !value)}
>
{isQuickPanelCollapsed ? "" : ""}
</button>
<button type="button" className="ecom-quick-set-help" aria-label="帮助" onClick={() => toast.info("上传商品图后,选择平台和详情模块即可生成 A+ 详情页。")}>?</button>
</main>
);
@@ -5994,7 +5978,7 @@ function ProductClonePage(_props: ProductClonePageProps = {}) {
productImageFiles={ecommerceVideoImageFiles}
requirement={requirement}
platform={platform}
aspectRatio={ratio.includes("9锛?6") || ratio.includes("9:16") ? "9:16" : ratio.includes("16锛?") || ratio.includes("16:9") ? "16:9" : ratio.includes("3锛?") || ratio.includes("3:4") ? "3:4" : "9:16"}
aspectRatio={ratio.includes("9:16") || ratio.includes("9:16") ? "9:16" : ratio.includes("16:9") || ratio.includes("16:9") ? "16:9" : ratio.includes("3:4") || ratio.includes("3:4") ? "3:4" : "9:16"}
durationSeconds={cloneVideoDuration}
resolution={cloneVideoQuality === "standard" ? "720P" : "1080P"}
onRequestLogin={() => (isAuthenticated ? undefined : requestLogin())}
+9 -27
View File
@@ -4028,6 +4028,10 @@
/* Smart cutout quick tool: standalone upload and editor flow. */
.ecommerce-standalone .product-clone-page[data-tool="clone"].is-smart-cutout-page {
display: block !important;
width: 100% !important;
min-width: 100% !important;
height: 100% !important;
min-height: calc(100vh - 58px) !important;
overflow: hidden !important;
background: #feffff !important;
}
@@ -4035,7 +4039,9 @@
.ecommerce-standalone .product-clone-page[data-tool="clone"].is-smart-cutout-page .product-clone-shell {
display: block !important;
width: 100% !important;
min-width: 100% !important;
height: 100% !important;
min-height: calc(100vh - 58px) !important;
padding: 0 !important;
}
@@ -7649,33 +7655,7 @@
}
.ecommerce-standalone .ecom-quick-set-collapse {
position: absolute !important;
left: 428px !important;
top: 50% !important;
z-index: 30 !important;
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
width: 42px !important;
height: 42px !important;
min-height: 42px !important;
border: 1px solid rgba(30, 189, 219, 0.22) !important;
border-radius: 15px !important;
color: #1073cc !important;
background: #feffff !important;
box-shadow: 0 16px 34px rgba(16, 115, 204, 0.14) !important;
font-size: 25px !important;
font-weight: 800 !important;
line-height: 1 !important;
cursor: pointer !important;
transform: translateY(-50%) !important;
transition:
left 680ms cubic-bezier(0.22, 1, 0.36, 1),
transform 220ms ease,
border-color 260ms ease,
background 260ms ease,
color 260ms ease,
box-shadow 460ms ease !important;
display: none !important;
}
.ecommerce-standalone .ecom-quick-set-collapse:hover {
@@ -7692,7 +7672,9 @@
.ecommerce-standalone .ecom-smart-cutout-page {
position: relative !important;
width: 100% !important;
min-width: 100% !important;
height: 100% !important;
min-height: calc(100vh - 58px) !important;
overflow: auto !important;
color: #111820 !important;
background: #feffff !important;