diff --git a/apps/web/src/components/business/business.css b/apps/web/src/components/business/business.css index 43ae2d92b..8c3239583 100644 --- a/apps/web/src/components/business/business.css +++ b/apps/web/src/components/business/business.css @@ -2,52 +2,52 @@ /* ==================== 按钮 ==================== */ .xx-primary-btn { - background: linear-gradient(135deg, #6366f1, #4f46e5) !important; - color: white !important; + background: var(--gradient-primary) !important; + color: var(--text-inverse) !important; border: none !important; - border-radius: 14px !important; + border-radius: var(--radius-md) !important; padding: 10px 20px !important; - font-weight: 600 !important; - box-shadow: 0 14px 26px rgba(79, 70, 229, 0.22) !important; - transition: all 0.2s !important; + font-weight: var(--font-weight-bold) !important; + box-shadow: var(--shadow-primary) !important; + transition: var(--transition-all) !important; cursor: pointer; height: auto !important; } .xx-primary-btn:hover { - box-shadow: 0 18px 34px rgba(79, 70, 229, 0.28) !important; + box-shadow: var(--shadow-hover) !important; transform: translateY(-1px); } .xx-ghost-btn { background: transparent !important; - color: #4f46e5 !important; - border: 2px solid #4f46e5 !important; - border-radius: 14px !important; - padding: 8px 18px !important; - font-weight: 600 !important; - transition: all 0.2s !important; + color: var(--primary-color) !important; + border: 2px solid var(--primary-color) !important; + border-radius: var(--radius-md) !important; + padding: var(--space-sm) 18px !important; + font-weight: var(--font-weight-bold) !important; + transition: var(--transition-all) !important; cursor: pointer; height: auto !important; } .xx-ghost-btn:hover { - background: #eef2ff !important; + background: var(--primary-soft) !important; } /* ==================== 卡片 ==================== */ .xx-card { - background: rgba(255, 255, 255, 0.94); - border: 1px solid rgba(226, 232, 240, 0.95); - border-radius: 22px; - box-shadow: 0 24px 70px rgba(15, 23, 42, 0.09); - padding: 24px; + background: var(--bg-elevated); + border: 1px solid var(--border-color); + border-radius: var(--radius-xl); + box-shadow: var(--shadow-card); + padding: var(--space-lg); margin-bottom: 20px; - transition: all 0.25s; + transition: all var(--transition-slow); } .xx-card:hover { - box-shadow: 0 26px 64px rgba(15, 23, 42, 0.14); + box-shadow: var(--shadow-md); transform: translateY(-2px); } @@ -55,7 +55,7 @@ .xx-page { max-width: 1200px; margin: 0 auto; - padding: 24px; + padding: var(--space-lg); } .xx-page-head { @@ -68,63 +68,63 @@ .xx-page-head h2 { font-size: 26px; - font-weight: 850; - color: #0f172a; - margin: 0 0 8px; + font-weight: var(--font-weight-extrabold); + color: var(--text-primary); + margin: 0 0 var(--space-sm); } .xx-page-head p { - font-size: 14px; - color: #64748b; + font-size: var(--font-size-base); + color: var(--text-secondary); margin: 0; } /* ==================== 表格样式 ==================== */ .xx-table-card { - background: rgba(255, 255, 255, 0.94); - border: 1px solid rgba(226, 232, 240, 0.95); - border-radius: 22px; - box-shadow: 0 24px 70px rgba(15, 23, 42, 0.09); + background: var(--bg-elevated); + border: 1px solid var(--border-color); + border-radius: var(--radius-xl); + box-shadow: var(--shadow-card); padding: 20px; overflow: hidden; } /* 表格包装器 */ .xx-table-wrapper { - border-radius: 16px; + border-radius: var(--radius-lg); overflow: hidden; } /* ==================== 标签/Tag ==================== */ .xx-tag { - padding: 4px 12px; - border-radius: 10px; + padding: var(--space-xs) 12px; + border-radius: var(--radius-xs); font-size: 13px; - font-weight: 500; + font-weight: var(--font-weight-medium); } .xx-tag-indigo { - background: #eef2ff; - color: #4f46e5; - border: 1px solid #c7d2fe; + background: var(--primary-soft); + color: var(--primary-color); + border: 1px solid var(--color-primary-200); } .xx-tag-success { - background: #f0fdf4; - color: #16a34a; - border: 1px solid #bbf7d0; + background: var(--success-soft); + color: var(--color-secondary-500); + border: 1px solid var(--success-border); } .xx-tag-warning { - background: #fffbeb; - color: #d97706; - border: 1px solid #fde68a; + background: var(--warning-soft); + color: var(--accent-dark); + border: 1px solid var(--color-accent-200); } .xx-tag-error { - background: #fef2f2; - color: #dc2626; - border: 1px solid #fecaca; + background: var(--error-soft); + color: var(--error-color); + border: 1px solid var(--error-border); } /* ==================== 搜索栏 ==================== */ @@ -135,52 +135,52 @@ .xx-search-input { width: 100%; padding: 12px 18px; - border: 2px solid #e2e8f0; - border-radius: 14px; - font-size: 14px; - background: white; - transition: all 0.2s; + border: 2px solid var(--border-color); + border-radius: var(--radius-md); + font-size: var(--font-size-base); + background: var(--bg-primary); + transition: var(--transition-all); outline: none; } .xx-search-input:focus { - border-color: #4f46e5; - box-shadow: 0 0 0 4px rgba(79, 70, 229, 0.1); + border-color: var(--primary-color); + box-shadow: 0 0 0 4px color-mix(in srgb, var(--primary-color) 10%, transparent); } /* ==================== Modal ==================== */ .xx-modal .ant-modal-content { - border-radius: 22px; - padding: 24px; + border-radius: var(--radius-xl); + padding: var(--space-lg); } .xx-modal .ant-modal-header { - border-radius: 22px 22px 0 0; - padding: 20px 24px; - border-bottom: 1px solid #e2e8f0; + border-radius: var(--radius-xl) var(--radius-xl) 0 0; + padding: 20px var(--space-lg); + border-bottom: 1px solid var(--border-color); } .xx-modal .ant-modal-title { - font-size: 18px; - font-weight: 700; - color: #0f172a; + font-size: var(--font-size-lg); + font-weight: var(--font-weight-bold); + color: var(--text-primary); } .xx-modal .ant-modal-footer { - border-top: 1px solid #e2e8f0; - padding: 16px 24px; + border-top: 1px solid var(--border-color); + padding: var(--space-md) var(--space-lg); } /* ==================== 空状态 ==================== */ .xx-empty-state { text-align: center; - padding: 48px 24px; - color: #64748b; + padding: var(--space-3xl) var(--space-lg); + color: var(--text-secondary); } .xx-empty-state-icon { font-size: 48px; - margin-bottom: 16px; + margin-bottom: var(--space-md); } /* ==================== 网格布局 ==================== */ @@ -213,15 +213,15 @@ /* ==================== 配额展示 ==================== */ .xx-quota-item { padding: 20px; - background: white; - border: 1px solid #e2e8f0; - border-radius: 16px; - transition: all 0.2s; + background: var(--bg-primary); + border: 1px solid var(--border-color); + border-radius: var(--radius-lg); + transition: var(--transition-all); } .xx-quota-item:hover { - border-color: #4f46e5; - box-shadow: 0 8px 24px rgba(79, 70, 229, 0.1); + border-color: var(--primary-color); + box-shadow: 0 8px 24px color-mix(in srgb, var(--primary-color) 10%, transparent); } /* ==================== 进度条 ==================== */ @@ -232,130 +232,130 @@ /* ==================== Ant Design 覆盖样式 ==================== */ /* Table overrides */ .ant-table-wrapper .ant-table-thead > tr > th { - background: #f8fafc !important; - font-weight: 700 !important; - color: #0f172a !important; - border-bottom: 2px solid #e2e8f0 !important; - padding: 14px 16px !important; + background: var(--bg-secondary) !important; + font-weight: var(--font-weight-bold) !important; + color: var(--text-primary) !important; + border-bottom: 2px solid var(--border-color) !important; + padding: 14px var(--space-md) !important; } .ant-table-wrapper .ant-table-tbody > tr > td { - padding: 14px 16px !important; - border-bottom: 1px solid #f1f5f9 !important; + padding: 14px var(--space-md) !important; + border-bottom: 1px solid var(--color-gray-100) !important; } .ant-table-wrapper .ant-table-tbody > tr:hover > td { - background: #fafbfc !important; + background: var(--color-gray-50) !important; } /* Card overrides */ .ant-card { - border-radius: 22px !important; - border: 1px solid rgba(226, 232, 240, 0.95) !important; + border-radius: var(--radius-xl) !important; + border: 1px solid var(--border-color) !important; } .ant-card-head { - border-bottom: 1px solid #e2e8f0 !important; + border-bottom: 1px solid var(--border-color) !important; min-height: 52px !important; - padding: 0 24px !important; + padding: 0 var(--space-lg) !important; } .ant-card-head-title { - font-weight: 700 !important; - font-size: 16px !important; - color: #0f172a !important; + font-weight: var(--font-weight-bold) !important; + font-size: var(--font-size-md) !important; + color: var(--text-primary) !important; } .ant-card-body { - padding: 20px 24px !important; + padding: 20px var(--space-lg) !important; } /* Modal overrides */ .ant-modal-content { - border-radius: 22px !important; + border-radius: var(--radius-xl) !important; overflow: hidden; } .ant-modal-header { - padding: 20px 24px !important; - background: white !important; + padding: 20px var(--space-lg) !important; + background: var(--bg-primary) !important; } .ant-modal-title { - font-weight: 700 !important; - font-size: 18px !important; - color: #0f172a !important; + font-weight: var(--font-weight-bold) !important; + font-size: var(--font-size-lg) !important; + color: var(--text-primary) !important; } .ant-modal-body { - padding: 24px !important; + padding: var(--space-lg) !important; } .ant-modal-footer { - padding: 16px 24px !important; + padding: var(--space-md) var(--space-lg) !important; } /* Button overrides */ .ant-btn-primary { - background: linear-gradient(135deg, #6366f1, #4f46e5) !important; + background: var(--gradient-primary) !important; border: none !important; - border-radius: 14px !important; - box-shadow: 0 14px 26px rgba(79, 70, 229, 0.22) !important; + border-radius: var(--radius-md) !important; + box-shadow: var(--shadow-primary) !important; height: auto !important; padding: 10px 20px !important; - font-weight: 600 !important; + font-weight: var(--font-weight-bold) !important; } .ant-btn-primary:hover { - background: linear-gradient(135deg, #6366f1, #4f46e5) !important; - box-shadow: 0 18px 34px rgba(79, 70, 229, 0.28) !important; + background: var(--gradient-primary) !important; + box-shadow: var(--shadow-hover) !important; transform: translateY(-1px); } /* Tag overrides */ .ant-tag { - border-radius: 10px !important; - padding: 4px 12px !important; - font-weight: 500 !important; + border-radius: var(--radius-xs) !important; + padding: var(--space-xs) 12px !important; + font-weight: var(--font-weight-medium) !important; } /* Select overrides */ .ant-select-selector { - border-radius: 14px !important; - border-color: #e2e8f0 !important; + border-radius: var(--radius-md) !important; + border-color: var(--border-color) !important; } .ant-select:not(.ant-select-disabled):hover .ant-select-selector { - border-color: #4f46e5 !important; + border-color: var(--primary-color) !important; } .ant-select-focused .ant-select-selector { - border-color: #4f46e5 !important; - box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1) !important; + border-color: var(--primary-color) !important; + box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary-color) 10%, transparent) !important; } /* Input overrides */ .ant-input { - border-radius: 14px !important; - border-color: #e2e8f0 !important; + border-radius: var(--radius-md) !important; + border-color: var(--border-color) !important; padding: 10px 14px !important; } .ant-input:hover { - border-color: #4f46e5 !important; + border-color: var(--primary-color) !important; } .ant-input:focus { - border-color: #4f46e5 !important; - box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1) !important; + border-color: var(--primary-color) !important; + box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary-color) 10%, transparent) !important; } /* Progress overrides */ .ant-progress-inner { - background: #f1f5f9 !important; - border-radius: 10px !important; + background: var(--color-gray-100) !important; + border-radius: var(--radius-xs) !important; } .ant-progress-bg { - border-radius: 10px !important; + border-radius: var(--radius-xs) !important; } diff --git a/apps/web/src/components/layout/Header.css b/apps/web/src/components/layout/Header.css index f6dbaed88..e74730978 100644 --- a/apps/web/src/components/layout/Header.css +++ b/apps/web/src/components/layout/Header.css @@ -3,17 +3,17 @@ height: 68px; position: sticky; top: 0; - z-index: 30; - background: rgba(255, 255, 255, 0.86); + z-index: var(--z-fixed); + background: var(--bg-glass); backdrop-filter: blur(16px); - border-bottom: 1px solid rgba(226, 232, 240, 0.92); + border-bottom: 1px solid var(--border-color); } .xx-top-nav-inner { max-width: 1440px; margin: 0 auto; height: 100%; - padding: 0 24px; + padding: 0 var(--space-lg); display: flex; align-items: center; justify-content: space-between; @@ -23,12 +23,12 @@ display: flex; gap: 10px; align-items: center; - font-size: 20px; - font-weight: 900; + font-size: var(--font-size-xl); + font-weight: var(--font-weight-extrabold); border: none; background: none; cursor: pointer; - color: #0f172a; + color: var(--text-primary); padding: 0; flex-shrink: 0; } @@ -36,41 +36,41 @@ .xx-logo { width: 38px; height: 38px; - border-radius: 14px; - background: linear-gradient(135deg, #818cf8, #4f46e5); + border-radius: var(--radius-md); + background: var(--gradient-primary); display: grid; place-items: center; - color: #fff; - box-shadow: 0 12px 26px rgba(79, 70, 229, 0.24); - font-size: 20px; + color: var(--text-inverse); + box-shadow: var(--shadow-primary); + font-size: var(--font-size-xl); } /* 桌面端导航链接 */ .xx-nav-links { display: flex; - gap: 16px; - color: #64748b; - font-weight: 750; + gap: var(--space-md); + color: var(--text-secondary); + font-weight: var(--font-weight-bold); } .xx-nav-links button { border: none; background: none; cursor: pointer; - color: #64748b; + color: var(--text-secondary); padding: 6px 4px; - font-size: 14px; - font-weight: 750; - transition: color 0.2s; + font-size: var(--font-size-base); + font-weight: var(--font-weight-bold); + transition: color var(--transition-fast); white-space: nowrap; } .xx-nav-links button:hover { - color: #4f46e5; + color: var(--primary-color); } .xx-nav-links button.active { - color: #4f46e5; + color: var(--primary-color); } /* 右侧区域 */ @@ -84,17 +84,17 @@ .xx-user-menu { display: flex; align-items: center; - gap: 8px; + gap: var(--space-sm); cursor: pointer; - color: #0f172a; - font-size: 14px; + color: var(--text-primary); + font-size: var(--font-size-base); } .xx-avatar { width: 34px; height: 34px; - background: #eef2ff; - color: #4338ca; + background: var(--primary-soft); + color: var(--primary-dark); } /* 汉堡菜单按钮(默认隐藏) */ @@ -103,42 +103,42 @@ border: none; background: none; cursor: pointer; - font-size: 20px; - color: #64748b; - padding: 8px; + font-size: var(--font-size-xl); + color: var(--text-secondary); + padding: var(--space-sm); } /* 手机端导航抽屉内容 */ .xx-mobile-nav { display: flex; flex-direction: column; - gap: 4px; + gap: var(--space-xs); } .xx-mobile-nav-item { display: flex; align-items: center; gap: 12px; - padding: 12px 16px; + padding: 12px var(--space-md); border: none; background: none; cursor: pointer; - font-size: 16px; - color: #334155; - border-radius: 8px; - transition: background 0.2s; + font-size: var(--font-size-md); + color: var(--color-gray-700); + border-radius: var(--radius-sm); + transition: background var(--transition-fast); width: 100%; text-align: left; } .xx-mobile-nav-item:hover { - background: #f1f5f9; + background: var(--bg-tertiary); } .xx-mobile-nav-item.active { - background: #eef2ff; - color: #4f46e5; - font-weight: 600; + background: var(--primary-soft); + color: var(--primary-color); + font-weight: var(--font-weight-semibold); } .xx-mobile-nav-icon { @@ -182,7 +182,7 @@ /* 小屏幕平板:导航文字缩小 */ @media (min-width: 769px) and (max-width: 1024px) { .xx-nav-links { - gap: 8px; + gap: var(--space-sm); } .xx-nav-links button { diff --git a/apps/web/src/pages/assets/AssetLibrary.tsx b/apps/web/src/pages/assets/AssetLibrary.tsx index 3c242fcc5..ed9104287 100644 --- a/apps/web/src/pages/assets/AssetLibrary.tsx +++ b/apps/web/src/pages/assets/AssetLibrary.tsx @@ -24,6 +24,7 @@ import { } from "@ant-design/icons"; import { Button, Input, Select } from "@/components/ui"; import "./assets.css"; +import PageHead from "@/components/layout/PageHead"; /* ============================================================ * 类型 diff --git a/apps/web/src/pages/duplication/DuplicationDetail.tsx b/apps/web/src/pages/duplication/DuplicationDetail.tsx index e179f27e6..656f7cc8b 100644 --- a/apps/web/src/pages/duplication/DuplicationDetail.tsx +++ b/apps/web/src/pages/duplication/DuplicationDetail.tsx @@ -13,6 +13,7 @@ import { type DuplicateSegment, } from "@/api/duplication"; import "./duplication.css"; +import PageHead from "@/components/layout/PageHead"; /** 格式化时间(秒 → mm:ss) */ const formatTime = (seconds: number) => { @@ -191,51 +192,41 @@ const DuplicationDetail: React.FC = () => { )} - {/* 返回按钮 */} - - - {/* 页头 */} -
- 上传视频文件,系统将自动检测与已有素材的重复片段,帮助您避免重复内容。 -
-当前仅展示登录用户信息,资料修改接口接入后再开放保存。
+当前套餐:{PLANS_META[currentPlan]?.name ?? "体验版"}
-