feat(front): unify all front user pages to DESIGN.md brand #5B5FED; fix decimal-rgba off-brand purples missed by hex normalization (MarketPage focus shadow, LoginPage radial glow)

This commit is contained in:
QihuAI Design committed 2026-07-13 23:07:26 +08:00
1 parent a48873d7ce
commit 9c684076f3
18 files changed
+1720 -1720

No files matched your search

@@ -132,7 +132,7 @@
width: 32px;
height: 32px;
border-radius: var(--radius-full);
background: linear-gradient(135deg, var(--color-accent), #8B8DFF);
background: linear-gradient(135deg, var(--color-accent), #8185F5);
color: white;
display: flex;
align-items: center;
+2 -2
View File
@@ -207,7 +207,7 @@
}
.asset-novel-card:hover {
border-color: #F59E0B;
border-color: #E8922C;
box-shadow: var(--shadow-md);
transform: translateY(-2px);
}
@@ -647,7 +647,7 @@
gap: 4px;
padding: 2px 6px;
background: #EEEDFF;
color: #6C63FF;
color: #5B5FED;
border-radius: var(--radius-xs);
font-size: 11px;
font-weight: 600;
+10 -10
View File
@@ -6,7 +6,7 @@ import './AssetsPage.css';
const fileTypeLabels: Record<string, { label: string; bg: string; color: string }> = {
word: { label: 'Word', bg: '#E8F1FF', color: '#2563EB' },
excel: { label: 'Excel', bg: '#E8F8EE', color: '#059669' },
excel: { label: 'Excel', bg: '#E8F8EE', color: '#219B5E' },
ppt: { label: 'PPT', bg: '#FEF2E2', color: '#D97706' },
pdf: { label: 'PDF', bg: '#FDEBEB', color: '#DC2626' },
txt: { label: 'TXT', bg: '#F1F3F7', color: '#64748B' },
@@ -424,10 +424,10 @@ const AssetsPage: React.FC = () => {
const DEFAULT_CATEGORIES: AssetCategoryDef[] = [
{ id: 'file', name: '文件', type: 'file', color: '#5B5FED', icon: 'file', isDefault: true },
{ id: 'image', name: '图片', type: 'image', color: '#10B981', icon: 'image', isDefault: true },
{ id: 'video', name: '视频', type: 'video', color: '#EF4444', icon: 'video', isDefault: true },
{ id: 'image', name: '图片', type: 'image', color: '#219B5E', icon: 'image', isDefault: true },
{ id: 'video', name: '视频', type: 'video', color: '#D9383A', icon: 'video', isDefault: true },
{ id: 'audio', name: '音频', type: 'audio', color: '#8B5CF6', icon: 'audio', isDefault: true },
{ id: 'novel', name: '小说', type: 'novel', color: '#F59E0B', icon: 'novel', isDefault: true },
{ id: 'novel', name: '小说', type: 'novel', color: '#E8922C', icon: 'novel', isDefault: true },
{ id: 'other', name: '其他', type: 'other', color: '#64748B', icon: 'other', isDefault: true },
{ id: 'custom', name: '自定义', type: 'custom', color: '#EC4899', icon: 'custom', isDefault: true },
];
@@ -521,11 +521,11 @@ const AssetsPage: React.FC = () => {
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>
文件
</button>
<button className={`assets-tab ${activeCategory === 'image' ? 'active' : ''}`} onClick={() => { setActiveCategory('image'); setSubCategory('all'); }} style={activeCategory === 'image' ? { '--tab-color': '#10B981', '--tab-bg': '#10B98118' } as React.CSSProperties : undefined}>
<button className={`assets-tab ${activeCategory === 'image' ? 'active' : ''}`} onClick={() => { setActiveCategory('image'); setSubCategory('all'); }} style={activeCategory === 'image' ? { '--tab-color': '#219B5E', '--tab-bg': '#10B98118' } as React.CSSProperties : undefined}>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>
图片
</button>
<button className={`assets-tab ${activeCategory === 'video' ? 'active' : ''}`} onClick={() => { setActiveCategory('video'); setSubCategory('all'); }} style={activeCategory === 'video' ? { '--tab-color': '#EF4444', '--tab-bg': '#EF444418' } as React.CSSProperties : undefined}>
<button className={`assets-tab ${activeCategory === 'video' ? 'active' : ''}`} onClick={() => { setActiveCategory('video'); setSubCategory('all'); }} style={activeCategory === 'video' ? { '--tab-color': '#D9383A', '--tab-bg': '#EF444418' } as React.CSSProperties : undefined}>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><polygon points="23 7 16 12 7 12 7 19 23 19 23 7"/></svg>
视频
</button>
@@ -533,7 +533,7 @@ const AssetsPage: React.FC = () => {
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/></svg>
音频
</button>
<button className={`assets-tab ${activeCategory === 'novel' ? 'active' : ''}`} onClick={() => { setActiveCategory('novel'); setSubCategory('all'); }} style={activeCategory === 'novel' ? { '--tab-color': '#F59E0B', '--tab-bg': '#F59E0B18' } as React.CSSProperties : undefined}>
<button className={`assets-tab ${activeCategory === 'novel' ? 'active' : ''}`} onClick={() => { setActiveCategory('novel'); setSubCategory('all'); }} style={activeCategory === 'novel' ? { '--tab-color': '#E8922C', '--tab-bg': '#F59E0B18' } as React.CSSProperties : undefined}>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><path d="M4 19.5A2.5 2.5 0 016.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/></svg>
小说
</button>
@@ -576,7 +576,7 @@ const AssetsPage: React.FC = () => {
return (
<div key={asset.id} className="asset-novel-card" onClick={() => setSelectedAsset(asset)}>
<div className="novel-card-cover">
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.2" strokeLinecap="round" strokeLinejoin="round" style={{ color: '#F59E0B', opacity: 0.6 }}><path d="M4 19.5A2.5 2.5 0 016.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/></svg>
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.2" strokeLinecap="round" strokeLinejoin="round" style={{ color: '#E8922C', opacity: 0.6 }}><path d="M4 19.5A2.5 2.5 0 016.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z"/></svg>
<span className="novel-card-badge">小说</span>
</div>
<div className="novel-card-info">
@@ -603,10 +603,10 @@ const AssetsPage: React.FC = () => {
</span>
)}
{asset.category === 'image' && (
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#10B981" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#219B5E" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>
)}
{asset.category === 'video' && (
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#EF4444" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"><polygon points="23 7 16 12 7 12 7 19 23 19 23 7"/></svg>
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#D9383A" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"><polygon points="23 7 16 12 7 12 7 19 23 19 23 7"/></svg>
)}
{asset.category === 'audio' && (
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#8B5CF6" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"><path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/></svg>
+19 -19
View File
@@ -67,9 +67,9 @@
align-items: center;
gap: var(--space-xl);
padding: var(--space-2xl);
background: linear-gradient(135deg, #F5F3FF 0%, #EEF0FF 100%);
background: linear-gradient(135deg, #F6F5FF 0%, #EEEDFF 100%);
border-radius: var(--radius-xl);
border: 1px solid #E3E0FF;
border: 1px solid #EEEDFF;
margin-bottom: var(--space-2xl);
color: var(--color-accent);
}
@@ -688,7 +688,7 @@
.phone-frame {
width: 320px;
background: #FFFFFF;
border: 3px solid #1A1A1A;
border: 3px solid #101214;
border-radius: 28px;
overflow: hidden;
box-shadow: var(--shadow-lg);
@@ -698,18 +698,18 @@
}
.phone-topbar {
background: #F5F5F5;
background: #F1F3F7;
padding: 8px 16px;
display: flex;
flex-direction: column;
align-items: center;
border-bottom: 1px solid #E5E5E5;
border-bottom: 1px solid #E3E6EB;
}
.phone-notch {
width: 60px;
height: 6px;
background: #1A1A1A;
background: #101214;
border-radius: 3px;
margin-bottom: 6px;
}
@@ -728,7 +728,7 @@
display: flex;
flex-direction: column;
gap: 10px;
background: #F8F8F8;
background: #F8F9FB;
}
.phone-msg {
@@ -763,7 +763,7 @@
.phone-msg.bot .phone-bubble {
background: #FFFFFF;
color: var(--color-text-primary);
border: 1px solid #E5E5E5;
border: 1px solid #E3E6EB;
border-bottom-left-radius: 4px;
}
@@ -785,7 +785,7 @@
align-items: center;
gap: 8px;
padding: 8px 12px;
border-top: 1px solid #E5E5E5;
border-top: 1px solid #E3E6EB;
background: #FFFFFF;
}
@@ -1040,7 +1040,7 @@
background: var(--color-error);
}
.bind-confirm-btn.danger:hover {
background: var(--color-error-hover, #d32f2f);
background: var(--color-error-hover, #D9383A);
}
/* ===== Step Indicator ===== */
@@ -1460,19 +1460,19 @@
}
.qr-flow-hint.scan-error {
color: #EF4444;
color: #D9383A;
font-weight: 500;
padding: 6px 12px;
background: #FEF2F2;
background: #FDEBEB;
border-radius: var(--radius-sm);
border: 1px solid #FECACA;
}
.qr-flow-hint.scan-success {
color: #059669;
color: #219B5E;
font-weight: 500;
padding: 6px 12px;
background: #ECFDF5;
background: #E6F7EE;
border-radius: var(--radius-sm);
border: 1px solid #A7F3D0;
}
@@ -1488,8 +1488,8 @@
}
.qr-placeholder-error {
color: #EF4444;
background: #FEF2F2;
color: #D9383A;
background: #FDEBEB;
border: 1px dashed #FECACA;
border-radius: var(--radius-md);
font-weight: 500;
@@ -1584,7 +1584,7 @@
bottom: calc(100% + 8px);
left: 50%;
transform: translateX(-50%);
background: #333;
background: #101214;
color: #fff;
padding: 6px 12px;
border-radius: var(--radius-md);
@@ -1606,7 +1606,7 @@
left: 50%;
transform: translateX(-50%);
border: 5px solid transparent;
border-top-color: #333;
border-top-color: #101214;
}
.qwp-tooltip-wrapper:hover .qwp-tooltip-popup {
@@ -1770,7 +1770,7 @@
bottom: var(--space-sm);
left: 50%;
transform: translateX(-50%);
background: #F59E0B;
background: #E8922C;
color: white;
font-size: 11px;
padding: 2px 8px;
+12 -12
View File
@@ -14,7 +14,7 @@
align-items: center;
justify-content: space-between;
padding: var(--space-xl) var(--space-2xl);
background: linear-gradient(135deg, #1A1A2E 0%, #252547 100%);
background: linear-gradient(135deg, #5B5FED 0%, #4A4ECC 100%);
color: #FFFFFF;
flex-shrink: 0;
gap: var(--space-2xl);
@@ -30,12 +30,12 @@
width: 44px;
height: 44px;
border-radius: var(--radius-lg);
background: rgba(91, 95, 237, 0.3);
border: 1px solid rgba(91, 95, 237, 0.5);
background: rgba(255, 255, 255, 0.16);
border: 1px solid rgba(255, 255, 255, 0.28);
display: flex;
align-items: center;
justify-content: center;
color: #A78BFA;
color: #FFFFFF;
}
.evo-header-title {
@@ -569,7 +569,7 @@
}
.evo-rank-num.top {
background: linear-gradient(135deg, #5B5FED, #A78BFA);
background: linear-gradient(135deg, #5B5FED, #8185F5);
color: #FFFFFF;
}
@@ -901,8 +901,8 @@
.evo-suggestion-item svg {
flex-shrink: 0;
margin-top: 1px;
color: #F59E0B;
fill: #F59E0B;
color: #E8922C;
fill: #E8922C;
}
/* ===== Shared ===== */
@@ -1187,8 +1187,8 @@
width: 56px;
height: 56px;
border-radius: 50%;
background: #FEF2F2;
color: #EF4444;
background: #FDEBEB;
color: #D9383A;
display: flex;
align-items: center;
justify-content: center;
@@ -1592,9 +1592,9 @@
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
.evo-toast-success { background: #10B981; }
.evo-toast-success { background: #219B5E; }
.evo-toast-info { background: #5B5FED; }
.evo-toast-error { background: #EF4444; }
.evo-toast-error { background: #D9383A; }
@keyframes toast-in {
from { opacity: 0; transform: translateX(100px); }
@@ -1669,7 +1669,7 @@
padding: 1px 6px;
border-radius: 10px;
background: #E6F7EE;
color: #10B981;
color: #219B5E;
font-weight: 600;
}
+18 -18
View File
@@ -30,28 +30,28 @@ const panelLabels: Record<string, string> = {
// ==================== Config ====================
const stateConfig: Record<SkillState, { label: string; color: string; bg: string; dot: string }> = {
baby: { label: '萌芽', color: '#E8922C', bg: '#FEF4E8', dot: '#F59E0B' },
main: { label: '成熟', color: '#219B5E', bg: '#E6F7EE', dot: '#10B981' },
baby: { label: '萌芽', color: '#E8922C', bg: '#FEF4E8', dot: '#E8922C' },
main: { label: '成熟', color: '#219B5E', bg: '#E6F7EE', dot: '#219B5E' },
staging: { label: '验证', color: '#8B5CF6', bg: '#F3F0FF', dot: '#8B5CF6' },
frozen: { label: '冻结', color: '#8B919E', bg: '#F1F3F7', dot: '#BFC4CE' },
};
const eventTypeConfig: Record<string, { label: string; color: string; icon: React.ReactNode }> = {
created: { label: '诞生', color: '#F59E0B', icon: <Icon size={12}><path d="M12 2L15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></Icon> },
promoted: { label: '晋升', color: '#10B981', icon: <Icon size={12}><polyline points="20 6 9 17 4 12"/></Icon> },
rejected: { label: '退回', color: '#EF4444', icon: <Icon size={12}><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></Icon> },
created: { label: '诞生', color: '#E8922C', icon: <Icon size={12}><path d="M12 2L15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></Icon> },
promoted: { label: '晋升', color: '#219B5E', icon: <Icon size={12}><polyline points="20 6 9 17 4 12"/></Icon> },
rejected: { label: '退回', color: '#D9383A', icon: <Icon size={12}><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></Icon> },
frozen: { label: '冻结', color: '#8B919E', icon: <Icon size={12}><rect x="3" y="11" width="18" height="11" rx="2"/></Icon> },
unfrozen: { label: '解冻', color: '#3B82F6', icon: <Icon size={12}><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/></Icon> },
edited: { label: '更新', color: '#5B5FED', icon: <Icon size={12}><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/></Icon> },
deleted: { label: '删除', color: '#EF4444', icon: <Icon size={12}><polyline points="3 6 5 6 21 6"/></Icon> },
deleted: { label: '删除', color: '#D9383A', icon: <Icon size={12}><polyline points="3 6 5 6 21 6"/></Icon> },
milestone: { label: '里程碑', color: '#8B5CF6', icon: <Icon size={12}><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></Icon> },
rolled_back: { label: '回滚', color: '#EF4444', icon: <Icon size={12}><polyline points="1 4 1 10 7 10"/><path d="M3.5 17A9 9 0 1 0 2 12"/></Icon> },
rolled_back: { label: '回滚', color: '#D9383A', icon: <Icon size={12}><polyline points="1 4 1 10 7 10"/><path d="M3.5 17A9 9 0 1 0 2 12"/></Icon> },
};
const shareThemes = [
{ id: 'deep', name: '深空蓝', bg: 'linear-gradient(135deg, #1A1A3E 0%, #2D2D6B 50%, #1A1A2E 100%)', accent: '#A78BFA', text: '#E8E6FF' },
{ id: 'aurora', name: '极光绿', bg: 'linear-gradient(135deg, #0A2E1F 0%, #0F4A33 50%, #0A2E1F 100%)', accent: '#10B981', text: '#D1FAE5' },
{ id: 'sunset', name: '暖阳橙', bg: 'linear-gradient(135deg, #3D1F00 0%, #5C2D0E 50%, #3D1F00 100%)', accent: '#F59E0B', text: '#FEF3C7' },
{ id: 'deep', name: '深空蓝', bg: 'linear-gradient(135deg, #1A1A3E 0%, #2D2D6B 50%, #1A1A2E 100%)', accent: '#8185F5', text: '#E8E6FF' },
{ id: 'aurora', name: '极光绿', bg: 'linear-gradient(135deg, #0A2E1F 0%, #0F4A33 50%, #0A2E1F 100%)', accent: '#219B5E', text: '#D1FAE5' },
{ id: 'sunset', name: '暖阳橙', bg: 'linear-gradient(135deg, #3D1F00 0%, #5C2D0E 50%, #3D1F00 100%)', accent: '#E8922C', text: '#FEF3C7' },
];
// ==================== Real API version history ====================
@@ -181,7 +181,7 @@ const SkillTreePanel: React.FC<{
<button className="evo-btn evo-btn-outline evo-btn-sm" onClick={() => { setShowVersionHistory(true); loadVersionHistory(selectedSkill.skill_name); }}>版本历史</button>
<button className="evo-btn evo-btn-outline evo-btn-sm">来源对话</button>
{selectedSkill.state === 'main' && (
<button className="evo-btn evo-btn-outline evo-btn-sm" style={{ color: '#F59E0B', borderColor: '#F59E0B' }} onClick={() => { setPublishDesc(selectedSkill.description); setPublishPrice(0); setShowPublishModal(true); }}>
<button className="evo-btn evo-btn-outline evo-btn-sm" style={{ color: '#E8922C', borderColor: '#E8922C' }} onClick={() => { setPublishDesc(selectedSkill.description); setPublishPrice(0); setShowPublishModal(true); }}>
发布到市场
</button>
)}
@@ -231,7 +231,7 @@ const SkillTreePanel: React.FC<{
{!isCurrent && (
<button
className="evo-btn evo-btn-outline evo-btn-sm"
style={{ color: '#EF4444', borderColor: '#EF4444' }}
style={{ color: '#D9383A', borderColor: '#D9383A' }}
onClick={() => setShowRollbackConfirm({ version: entryVersion })}
>
回滚到此版本
@@ -261,7 +261,7 @@ const SkillTreePanel: React.FC<{
<p>确认回滚到版本 <strong>v{showRollbackConfirm.version}</strong>?当前版本 <strong>v{selectedSkill.version}</strong> 的修改将被撤销。</p>
<div className="evo-confirm-actions">
<button className="evo-btn evo-btn-outline" onClick={() => setShowRollbackConfirm(null)}>取消</button>
<button className="evo-btn evo-btn-primary" style={{ background: '#EF4444' }} onClick={() => handleRollback(showRollbackConfirm.version)}>确认回滚</button>
<button className="evo-btn evo-btn-primary" style={{ background: '#D9383A' }} onClick={() => handleRollback(showRollbackConfirm.version)}>确认回滚</button>
</div>
</div>
</div>
@@ -506,7 +506,7 @@ const StatisticsPanel: React.FC<{ stats: StatisticsData; onViewSkill?: (skillNam
const maxUse = sortedByUse[0]?.use_count || 1;
const totalUse = stats.total_use_count;
const zeroUseSkills = stats.low_use_skills || [];
const catColors = ['#5B5FED', '#F59E0B', '#10B981', '#EF4444', '#8B5CF6'];
const catColors = ['#5B5FED', '#E8922C', '#219B5E', '#D9383A', '#8B5CF6'];
return (
<div className="evo-panel-content">
@@ -772,7 +772,7 @@ const ProfilePanel: React.FC<{ profile: EvolutionProfile; skills: EvolutionSkill
transform="rotate(-90 80 80)" style={{ transition: 'stroke-dashoffset 1s ease' }} />
<defs>
<linearGradient id="levelGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stopColor="#5B5FED" /><stop offset="100%" stopColor="#A78BFA" />
<stop offset="0%" stopColor="#5B5FED" /><stop offset="100%" stopColor="#8185F5" />
</linearGradient>
</defs>
</svg>
@@ -812,7 +812,7 @@ const ProfilePanel: React.FC<{ profile: EvolutionProfile; skills: EvolutionSkill
<div className="evo-tag-cloud">
{profile.tags.map((tag, i) => {
const sizes = ['evo-tag-sm', 'evo-tag-md', 'evo-tag-lg', 'evo-tag-xl'];
const tagColors = ['#5B5FED', '#F59E0B', '#10B981', '#8B5CF6', '#EF4444', '#3B82F6'];
const tagColors = ['#5B5FED', '#E8922C', '#219B5E', '#8B5CF6', '#D9383A', '#3B82F6'];
return <span key={tag} className={`evo-tag ${sizes[Math.min(i, sizes.length - 1)]}`} style={{ color: tagColors[i % 6], borderColor: tagColors[i % 6] }}>{tag}</span>;
})}
</div>
@@ -1026,8 +1026,8 @@ const EvolutionDashboard: React.FC = () => {
</div>
<div className="evo-header-stats">
<div className="evo-header-stat"><span className="evo-hs-num">{totalSkills}</span><span className="evo-hs-label">技能总数</span></div>
<div className="evo-header-stat"><span className="evo-hs-num" style={{ color: '#10B981' }}>{mainCount}</span><span className="evo-hs-label">已成熟</span></div>
<div className="evo-header-stat"><span className="evo-hs-num" style={{ color: '#F59E0B' }}>{babyCount}</span><span className="evo-hs-label">萌芽中</span></div>
<div className="evo-header-stat"><span className="evo-hs-num" style={{ color: '#219B5E' }}>{mainCount}</span><span className="evo-hs-label">已成熟</span></div>
<div className="evo-header-stat"><span className="evo-hs-num" style={{ color: '#E8922C' }}>{babyCount}</span><span className="evo-hs-label">萌芽中</span></div>
</div>
</header>
+1 -1
View File
@@ -444,7 +444,7 @@
.doc-processing-bar-fill {
height: 100%;
background: linear-gradient(90deg, #F59E0B, #FBBF24);
background: linear-gradient(90deg, #E8922C, #F0A94C);
border-radius: 3px;
transition: width 0.8s ease;
}
+1 -1
View File
@@ -17,7 +17,7 @@ const appGradients: Record<string, string> = {
a3: 'linear-gradient(135deg,#5B5FED 0%,#818CF8 100%)',
a4: 'linear-gradient(135deg,#4F8DF9 0%,#38BDF8 100%)',
a5: 'linear-gradient(135deg,#6366F1 0%,#7DD3FC 100%)',
a6: 'linear-gradient(135deg,#5B5FED 0%,#A78BFA 100%)',
a6: 'linear-gradient(135deg,#5B5FED 0%,#8185F5 100%)',
a7: 'linear-gradient(135deg,#4F8DF9 0%,#818CF8 100%)',
a8: 'linear-gradient(135deg,#6366F1 0%,#4F8DF9 100%)',
};
+5 -5
View File
@@ -30,7 +30,7 @@
.bg-circle.c2 {
width: 400px; height: 400px;
background: #8B8DFF;
background: #8185F5;
bottom: -100px; left: -50px;
}
@@ -67,7 +67,7 @@
/* Brand Panel */
.login-brand-panel {
width: 400px;
background: linear-gradient(135deg, #2D2B55 0%, #1A1A2E 50%, #2D2B55 100%);
background: linear-gradient(135deg, #5B5FED 0%, #4A4ECC 50%, #5B5FED 100%);
display: flex;
align-items: center;
justify-content: center;
@@ -89,7 +89,7 @@
position: absolute;
width: 200px; height: 200px;
border-radius: 50%;
background: radial-gradient(circle, rgba(139,141,255,0.2) 0%, transparent 70%);
background: radial-gradient(circle, rgba(129,133,245,0.2) 0%, transparent 70%);
bottom: -30px; left: -30px;
}
@@ -132,7 +132,7 @@
}
.bf-icon {
color: #6C63FF;
color: #FFFFFF;
font-weight: 700;
font-size: var(--text-base);
}
@@ -219,7 +219,7 @@
.login-submit-btn {
height: 46px;
background: linear-gradient(135deg, #5B5FED, #6C63FF);
background: linear-gradient(135deg, #5B5FED, #4A4ECC);
color: white;
border-radius: var(--radius-lg);
font-size: var(--text-base);
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -96,7 +96,7 @@ const ServerIcon = () => (
// ===== Color palette for avatar icons =====
const AVATAR_COLORS = [
{ bg: '#EEEDFF', fg: '#6C63FF' },
{ bg: '#EEEDFF', fg: '#5B5FED' },
{ bg: '#E6F7EE', fg: '#219B5E' },
{ bg: '#FEF4E8', fg: '#E8922C' },
{ bg: '#EBF2FE', fg: '#3B82F6' },
+3 -3
View File
@@ -156,7 +156,7 @@
}
.pricing-plan--popular {
border-color: #F59E0B;
border-color: #E8922C;
}
/* Popular Ribbon */
@@ -164,7 +164,7 @@
position: absolute;
top: 16px;
right: -32px;
background: linear-gradient(135deg, #F59E0B, #EF4444);
background: linear-gradient(135deg, #E8922C, #D9383A);
color: #FFFFFF;
font-size: 11px;
font-weight: 700;
@@ -930,7 +930,7 @@
}
.pricing-modal-form-group label .required {
color: #EF4444;
color: #D9383A;
}
.pricing-modal-form-group input,
+1 -1
View File
@@ -116,7 +116,7 @@ interface CouponItem {
const SERVICE_TYPE_CONFIG: Record<string, { label: string; icon: React.ReactNode; color: string; bg: string }> = {
app_custom: { label: '应用定制', icon: <IconAppCustom />, color: '#4F46E5', bg: '#EEF2FF' },
platform_proxy: { label: '平台代理', icon: <IconPlatform />, color: '#059669', bg: '#ECFDF5' },
platform_proxy: { label: '平台代理', icon: <IconPlatform />, color: '#219B5E', bg: '#ECFDF5' },
data_custom: { label: '数据定制', icon: <IconDataCustom />, color: '#D97706', bg: '#FFFBEB' },
private_project: { label: '私有化项目', icon: <IconPrivateProject />, color: '#7C3AED', bg: '#F5F3FF' },
};
+1 -1
View File
@@ -450,7 +450,7 @@
width: 64px;
height: 64px;
border-radius: var(--radius-lg);
background: linear-gradient(135deg, var(--color-accent), #8B8DFF);
background: linear-gradient(135deg, var(--color-accent), #8185F5);
display: flex;
align-items: center;
justify-content: center;
+2 -2
View File
@@ -244,8 +244,8 @@ const ProfilePage: React.FC = () => {
const getLevelGradient = (level: number) => {
const gradients: Record<number, string> = {
0: 'linear-gradient(135deg, #8B919E, #BFC4CE)',
2: 'linear-gradient(135deg, #5B5FED, #8B8DFF)',
3: 'linear-gradient(135deg, #F59E0B, #FBBF24)',
2: 'linear-gradient(135deg, #5B5FED, #8185F5)',
3: 'linear-gradient(135deg, #E8922C, #F0A94C)',
};
return gradients[level] || gradients[0];
};
@@ -74,7 +74,7 @@
}
.tkd-kpi--blue {
background: linear-gradient(135deg, #5B5FED 0%, #8B8DFF 100%);
background: linear-gradient(135deg, #5B5FED 0%, #8185F5 100%);
}
.tkd-kpi--green {
@@ -242,7 +242,7 @@
}
.tkd-rank-item:nth-child(1) .tkd-rank-item-idx { background: #FEF3C7; color: #D97706; }
.tkd-rank-item:nth-child(2) .tkd-rank-item-idx { background: #E5E7EB; color: #6B7280; }
.tkd-rank-item:nth-child(2) .tkd-rank-item-idx { background: #E3E6EB; color: #545A65; }
.tkd-rank-item:nth-child(3) .tkd-rank-item-idx { background: #FDE8CD; color: #B45309; }
.tkd-rank-item-name {
+2 -2
View File
@@ -164,7 +164,7 @@ const WechatBot: React.FC = () => {
<img src={qrcode.qrcode_img} alt="微信扫码" style={{ width: '220px', height: '220px', background: '#fff', borderRadius: '8px', border: '1px solid #E5E7EB' }} />
) : (
<div style={{ width: '220px', height: '220px', display: 'flex', alignItems: 'center', justifyContent: 'center', background: '#fff', borderRadius: '8px', border: '1px solid #E5E7EB', fontSize: '12px', color: '#9CA3AF', textAlign: 'center', padding: '12px' }}>
二维码图片生成失败,<a href={qrcode.qrcode_img_content} target="_blank" rel="noreferrer" style={{color:'#6C63FF'}}>请点击此处在新标签页打开</a>。
二维码图片生成失败,<a href={qrcode.qrcode_img_content} target="_blank" rel="noreferrer" style={{color:'#5B5FED'}}>请点击此处在新标签页打开</a>。
</div>
)}
<div style={{ fontSize: '13px', color: polling ? '#f59e0b' : '#6B7280' }}>
@@ -216,7 +216,7 @@ const DetailItem: React.FC<{ label: string; value: any }> = ({ label, value }) =
);
const primaryBtnStyle: React.CSSProperties = {
padding: '8px 20px', background: '#6C63FF', border: 'none', borderRadius: '6px',
padding: '8px 20px', background: '#5B5FED', border: 'none', borderRadius: '6px',
color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer',
};
+2 -2
View File
@@ -74,7 +74,7 @@ const WechatHistory: React.FC = () => {
<div style={{
padding: '10px 14px', borderRadius: '12px', fontSize: '14px', lineHeight: '1.6',
whiteSpace: 'pre-wrap', wordBreak: 'break-word',
background: m.role === 'user' ? '#6C63FF' : '#FFFFFF',
background: m.role === 'user' ? '#5B5FED' : '#FFFFFF',
color: m.role === 'user' ? '#fff' : '#1A1F36',
border: m.role === 'user' ? 'none' : '1px solid #E5E7EB',
}}>{m.content}</div>
@@ -90,7 +90,7 @@ const WechatHistory: React.FC = () => {
};
const btnStyle: React.CSSProperties = {
padding: '8px 20px', background: '#6C63FF', border: 'none', borderRadius: '6px',
padding: '8px 20px', background: '#5B5FED', border: 'none', borderRadius: '6px',
color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer',
};