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:
1 parent
a48873d7ce
commit
9c684076f3
18 files changed
+98
-98
No files matched your search
@@ -132,7 +132,7 @@
|
|||||||
width: 32px;
|
width: 32px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
border-radius: var(--radius-full);
|
border-radius: var(--radius-full);
|
||||||
background: linear-gradient(135deg, var(--color-accent), #8B8DFF);
|
background: linear-gradient(135deg, var(--color-accent), #8185F5);
|
||||||
color: white;
|
color: white;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|||||||
@@ -207,7 +207,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.asset-novel-card:hover {
|
.asset-novel-card:hover {
|
||||||
border-color: #F59E0B;
|
border-color: #E8922C;
|
||||||
box-shadow: var(--shadow-md);
|
box-shadow: var(--shadow-md);
|
||||||
transform: translateY(-2px);
|
transform: translateY(-2px);
|
||||||
}
|
}
|
||||||
@@ -647,7 +647,7 @@
|
|||||||
gap: 4px;
|
gap: 4px;
|
||||||
padding: 2px 6px;
|
padding: 2px 6px;
|
||||||
background: #EEEDFF;
|
background: #EEEDFF;
|
||||||
color: #6C63FF;
|
color: #5B5FED;
|
||||||
border-radius: var(--radius-xs);
|
border-radius: var(--radius-xs);
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import './AssetsPage.css';
|
|||||||
|
|
||||||
const fileTypeLabels: Record<string, { label: string; bg: string; color: string }> = {
|
const fileTypeLabels: Record<string, { label: string; bg: string; color: string }> = {
|
||||||
word: { label: 'Word', bg: '#E8F1FF', color: '#2563EB' },
|
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' },
|
ppt: { label: 'PPT', bg: '#FEF2E2', color: '#D97706' },
|
||||||
pdf: { label: 'PDF', bg: '#FDEBEB', color: '#DC2626' },
|
pdf: { label: 'PDF', bg: '#FDEBEB', color: '#DC2626' },
|
||||||
txt: { label: 'TXT', bg: '#F1F3F7', color: '#64748B' },
|
txt: { label: 'TXT', bg: '#F1F3F7', color: '#64748B' },
|
||||||
@@ -424,10 +424,10 @@ const AssetsPage: React.FC = () => {
|
|||||||
|
|
||||||
const DEFAULT_CATEGORIES: AssetCategoryDef[] = [
|
const DEFAULT_CATEGORIES: AssetCategoryDef[] = [
|
||||||
{ id: 'file', name: '文件', type: 'file', color: '#5B5FED', icon: 'file', isDefault: true },
|
{ id: 'file', name: '文件', type: 'file', color: '#5B5FED', icon: 'file', isDefault: true },
|
||||||
{ id: 'image', name: '图片', type: 'image', color: '#10B981', icon: 'image', isDefault: true },
|
{ id: 'image', name: '图片', type: 'image', color: '#219B5E', icon: 'image', isDefault: true },
|
||||||
{ id: 'video', name: '视频', type: 'video', color: '#EF4444', icon: 'video', 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: '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: 'other', name: '其他', type: 'other', color: '#64748B', icon: 'other', isDefault: true },
|
||||||
{ id: 'custom', name: '自定义', type: 'custom', color: '#EC4899', icon: 'custom', 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>
|
<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>
|
||||||
<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>
|
<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>
|
||||||
<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>
|
<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>
|
</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>
|
<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>
|
||||||
<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>
|
<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>
|
</button>
|
||||||
@@ -576,7 +576,7 @@ const AssetsPage: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<div key={asset.id} className="asset-novel-card" onClick={() => setSelectedAsset(asset)}>
|
<div key={asset.id} className="asset-novel-card" onClick={() => setSelectedAsset(asset)}>
|
||||||
<div className="novel-card-cover">
|
<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>
|
<span className="novel-card-badge">小说</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="novel-card-info">
|
<div className="novel-card-info">
|
||||||
@@ -603,10 +603,10 @@ const AssetsPage: React.FC = () => {
|
|||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
{asset.category === 'image' && (
|
{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' && (
|
{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' && (
|
{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>
|
<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>
|
||||||
|
|||||||
@@ -67,9 +67,9 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
gap: var(--space-xl);
|
gap: var(--space-xl);
|
||||||
padding: var(--space-2xl);
|
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-radius: var(--radius-xl);
|
||||||
border: 1px solid #E3E0FF;
|
border: 1px solid #EEEDFF;
|
||||||
margin-bottom: var(--space-2xl);
|
margin-bottom: var(--space-2xl);
|
||||||
color: var(--color-accent);
|
color: var(--color-accent);
|
||||||
}
|
}
|
||||||
@@ -688,7 +688,7 @@
|
|||||||
.phone-frame {
|
.phone-frame {
|
||||||
width: 320px;
|
width: 320px;
|
||||||
background: #FFFFFF;
|
background: #FFFFFF;
|
||||||
border: 3px solid #1A1A1A;
|
border: 3px solid #101214;
|
||||||
border-radius: 28px;
|
border-radius: 28px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
box-shadow: var(--shadow-lg);
|
box-shadow: var(--shadow-lg);
|
||||||
@@ -698,18 +698,18 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.phone-topbar {
|
.phone-topbar {
|
||||||
background: #F5F5F5;
|
background: #F1F3F7;
|
||||||
padding: 8px 16px;
|
padding: 8px 16px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
border-bottom: 1px solid #E5E5E5;
|
border-bottom: 1px solid #E3E6EB;
|
||||||
}
|
}
|
||||||
|
|
||||||
.phone-notch {
|
.phone-notch {
|
||||||
width: 60px;
|
width: 60px;
|
||||||
height: 6px;
|
height: 6px;
|
||||||
background: #1A1A1A;
|
background: #101214;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
margin-bottom: 6px;
|
margin-bottom: 6px;
|
||||||
}
|
}
|
||||||
@@ -728,7 +728,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
background: #F8F8F8;
|
background: #F8F9FB;
|
||||||
}
|
}
|
||||||
|
|
||||||
.phone-msg {
|
.phone-msg {
|
||||||
@@ -763,7 +763,7 @@
|
|||||||
.phone-msg.bot .phone-bubble {
|
.phone-msg.bot .phone-bubble {
|
||||||
background: #FFFFFF;
|
background: #FFFFFF;
|
||||||
color: var(--color-text-primary);
|
color: var(--color-text-primary);
|
||||||
border: 1px solid #E5E5E5;
|
border: 1px solid #E3E6EB;
|
||||||
border-bottom-left-radius: 4px;
|
border-bottom-left-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -785,7 +785,7 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
padding: 8px 12px;
|
padding: 8px 12px;
|
||||||
border-top: 1px solid #E5E5E5;
|
border-top: 1px solid #E3E6EB;
|
||||||
background: #FFFFFF;
|
background: #FFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1040,7 +1040,7 @@
|
|||||||
background: var(--color-error);
|
background: var(--color-error);
|
||||||
}
|
}
|
||||||
.bind-confirm-btn.danger:hover {
|
.bind-confirm-btn.danger:hover {
|
||||||
background: var(--color-error-hover, #d32f2f);
|
background: var(--color-error-hover, #D9383A);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===== Step Indicator ===== */
|
/* ===== Step Indicator ===== */
|
||||||
@@ -1460,19 +1460,19 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.qr-flow-hint.scan-error {
|
.qr-flow-hint.scan-error {
|
||||||
color: #EF4444;
|
color: #D9383A;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
background: #FEF2F2;
|
background: #FDEBEB;
|
||||||
border-radius: var(--radius-sm);
|
border-radius: var(--radius-sm);
|
||||||
border: 1px solid #FECACA;
|
border: 1px solid #FECACA;
|
||||||
}
|
}
|
||||||
|
|
||||||
.qr-flow-hint.scan-success {
|
.qr-flow-hint.scan-success {
|
||||||
color: #059669;
|
color: #219B5E;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
background: #ECFDF5;
|
background: #E6F7EE;
|
||||||
border-radius: var(--radius-sm);
|
border-radius: var(--radius-sm);
|
||||||
border: 1px solid #A7F3D0;
|
border: 1px solid #A7F3D0;
|
||||||
}
|
}
|
||||||
@@ -1488,8 +1488,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.qr-placeholder-error {
|
.qr-placeholder-error {
|
||||||
color: #EF4444;
|
color: #D9383A;
|
||||||
background: #FEF2F2;
|
background: #FDEBEB;
|
||||||
border: 1px dashed #FECACA;
|
border: 1px dashed #FECACA;
|
||||||
border-radius: var(--radius-md);
|
border-radius: var(--radius-md);
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
@@ -1584,7 +1584,7 @@
|
|||||||
bottom: calc(100% + 8px);
|
bottom: calc(100% + 8px);
|
||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
background: #333;
|
background: #101214;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
border-radius: var(--radius-md);
|
border-radius: var(--radius-md);
|
||||||
@@ -1606,7 +1606,7 @@
|
|||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
border: 5px solid transparent;
|
border: 5px solid transparent;
|
||||||
border-top-color: #333;
|
border-top-color: #101214;
|
||||||
}
|
}
|
||||||
|
|
||||||
.qwp-tooltip-wrapper:hover .qwp-tooltip-popup {
|
.qwp-tooltip-wrapper:hover .qwp-tooltip-popup {
|
||||||
@@ -1770,7 +1770,7 @@
|
|||||||
bottom: var(--space-sm);
|
bottom: var(--space-sm);
|
||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
background: #F59E0B;
|
background: #E8922C;
|
||||||
color: white;
|
color: white;
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
padding: 2px 8px;
|
padding: 2px 8px;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: var(--space-xl) var(--space-2xl);
|
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;
|
color: #FFFFFF;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
gap: var(--space-2xl);
|
gap: var(--space-2xl);
|
||||||
@@ -30,12 +30,12 @@
|
|||||||
width: 44px;
|
width: 44px;
|
||||||
height: 44px;
|
height: 44px;
|
||||||
border-radius: var(--radius-lg);
|
border-radius: var(--radius-lg);
|
||||||
background: rgba(91, 95, 237, 0.3);
|
background: rgba(255, 255, 255, 0.16);
|
||||||
border: 1px solid rgba(91, 95, 237, 0.5);
|
border: 1px solid rgba(255, 255, 255, 0.28);
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
color: #A78BFA;
|
color: #FFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
.evo-header-title {
|
.evo-header-title {
|
||||||
@@ -569,7 +569,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.evo-rank-num.top {
|
.evo-rank-num.top {
|
||||||
background: linear-gradient(135deg, #5B5FED, #A78BFA);
|
background: linear-gradient(135deg, #5B5FED, #8185F5);
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -901,8 +901,8 @@
|
|||||||
.evo-suggestion-item svg {
|
.evo-suggestion-item svg {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
margin-top: 1px;
|
margin-top: 1px;
|
||||||
color: #F59E0B;
|
color: #E8922C;
|
||||||
fill: #F59E0B;
|
fill: #E8922C;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===== Shared ===== */
|
/* ===== Shared ===== */
|
||||||
@@ -1187,8 +1187,8 @@
|
|||||||
width: 56px;
|
width: 56px;
|
||||||
height: 56px;
|
height: 56px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: #FEF2F2;
|
background: #FDEBEB;
|
||||||
color: #EF4444;
|
color: #D9383A;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@@ -1592,9 +1592,9 @@
|
|||||||
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
|
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-info { background: #5B5FED; }
|
||||||
.evo-toast-error { background: #EF4444; }
|
.evo-toast-error { background: #D9383A; }
|
||||||
|
|
||||||
@keyframes toast-in {
|
@keyframes toast-in {
|
||||||
from { opacity: 0; transform: translateX(100px); }
|
from { opacity: 0; transform: translateX(100px); }
|
||||||
@@ -1669,7 +1669,7 @@
|
|||||||
padding: 1px 6px;
|
padding: 1px 6px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: #E6F7EE;
|
background: #E6F7EE;
|
||||||
color: #10B981;
|
color: #219B5E;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,28 +30,28 @@ const panelLabels: Record<string, string> = {
|
|||||||
|
|
||||||
// ==================== Config ====================
|
// ==================== Config ====================
|
||||||
const stateConfig: Record<SkillState, { label: string; color: string; bg: string; dot: string }> = {
|
const stateConfig: Record<SkillState, { label: string; color: string; bg: string; dot: string }> = {
|
||||||
baby: { label: '萌芽', color: '#E8922C', bg: '#FEF4E8', dot: '#F59E0B' },
|
baby: { label: '萌芽', color: '#E8922C', bg: '#FEF4E8', dot: '#E8922C' },
|
||||||
main: { label: '成熟', color: '#219B5E', bg: '#E6F7EE', dot: '#10B981' },
|
main: { label: '成熟', color: '#219B5E', bg: '#E6F7EE', dot: '#219B5E' },
|
||||||
staging: { label: '验证', color: '#8B5CF6', bg: '#F3F0FF', dot: '#8B5CF6' },
|
staging: { label: '验证', color: '#8B5CF6', bg: '#F3F0FF', dot: '#8B5CF6' },
|
||||||
frozen: { label: '冻结', color: '#8B919E', bg: '#F1F3F7', dot: '#BFC4CE' },
|
frozen: { label: '冻结', color: '#8B919E', bg: '#F1F3F7', dot: '#BFC4CE' },
|
||||||
};
|
};
|
||||||
|
|
||||||
const eventTypeConfig: Record<string, { label: string; color: string; icon: React.ReactNode }> = {
|
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> },
|
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: '#10B981', icon: <Icon size={12}><polyline points="20 6 9 17 4 12"/></Icon> },
|
promoted: { label: '晋升', color: '#219B5E', 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> },
|
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> },
|
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> },
|
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> },
|
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> },
|
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 = [
|
const shareThemes = [
|
||||||
{ id: 'deep', name: '深空蓝', bg: 'linear-gradient(135deg, #1A1A3E 0%, #2D2D6B 50%, #1A1A2E 100%)', accent: '#A78BFA', text: '#E8E6FF' },
|
{ 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: '#10B981', text: '#D1FAE5' },
|
{ 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: '#F59E0B', text: '#FEF3C7' },
|
{ id: 'sunset', name: '暖阳橙', bg: 'linear-gradient(135deg, #3D1F00 0%, #5C2D0E 50%, #3D1F00 100%)', accent: '#E8922C', text: '#FEF3C7' },
|
||||||
];
|
];
|
||||||
|
|
||||||
// ==================== Real API version history ====================
|
// ==================== 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" onClick={() => { setShowVersionHistory(true); loadVersionHistory(selectedSkill.skill_name); }}>版本历史</button>
|
||||||
<button className="evo-btn evo-btn-outline evo-btn-sm">来源对话</button>
|
<button className="evo-btn evo-btn-outline evo-btn-sm">来源对话</button>
|
||||||
{selectedSkill.state === 'main' && (
|
{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>
|
</button>
|
||||||
)}
|
)}
|
||||||
@@ -231,7 +231,7 @@ const SkillTreePanel: React.FC<{
|
|||||||
{!isCurrent && (
|
{!isCurrent && (
|
||||||
<button
|
<button
|
||||||
className="evo-btn evo-btn-outline evo-btn-sm"
|
className="evo-btn evo-btn-outline evo-btn-sm"
|
||||||
style={{ color: '#EF4444', borderColor: '#EF4444' }}
|
style={{ color: '#D9383A', borderColor: '#D9383A' }}
|
||||||
onClick={() => setShowRollbackConfirm({ version: entryVersion })}
|
onClick={() => setShowRollbackConfirm({ version: entryVersion })}
|
||||||
>
|
>
|
||||||
回滚到此版本
|
回滚到此版本
|
||||||
@@ -261,7 +261,7 @@ const SkillTreePanel: React.FC<{
|
|||||||
<p>确认回滚到版本 <strong>v{showRollbackConfirm.version}</strong>?当前版本 <strong>v{selectedSkill.version}</strong> 的修改将被撤销。</p>
|
<p>确认回滚到版本 <strong>v{showRollbackConfirm.version}</strong>?当前版本 <strong>v{selectedSkill.version}</strong> 的修改将被撤销。</p>
|
||||||
<div className="evo-confirm-actions">
|
<div className="evo-confirm-actions">
|
||||||
<button className="evo-btn evo-btn-outline" onClick={() => setShowRollbackConfirm(null)}>取消</button>
|
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -506,7 +506,7 @@ const StatisticsPanel: React.FC<{ stats: StatisticsData; onViewSkill?: (skillNam
|
|||||||
const maxUse = sortedByUse[0]?.use_count || 1;
|
const maxUse = sortedByUse[0]?.use_count || 1;
|
||||||
const totalUse = stats.total_use_count;
|
const totalUse = stats.total_use_count;
|
||||||
const zeroUseSkills = stats.low_use_skills || [];
|
const zeroUseSkills = stats.low_use_skills || [];
|
||||||
const catColors = ['#5B5FED', '#F59E0B', '#10B981', '#EF4444', '#8B5CF6'];
|
const catColors = ['#5B5FED', '#E8922C', '#219B5E', '#D9383A', '#8B5CF6'];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="evo-panel-content">
|
<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' }} />
|
transform="rotate(-90 80 80)" style={{ transition: 'stroke-dashoffset 1s ease' }} />
|
||||||
<defs>
|
<defs>
|
||||||
<linearGradient id="levelGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
<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>
|
</linearGradient>
|
||||||
</defs>
|
</defs>
|
||||||
</svg>
|
</svg>
|
||||||
@@ -812,7 +812,7 @@ const ProfilePanel: React.FC<{ profile: EvolutionProfile; skills: EvolutionSkill
|
|||||||
<div className="evo-tag-cloud">
|
<div className="evo-tag-cloud">
|
||||||
{profile.tags.map((tag, i) => {
|
{profile.tags.map((tag, i) => {
|
||||||
const sizes = ['evo-tag-sm', 'evo-tag-md', 'evo-tag-lg', 'evo-tag-xl'];
|
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>;
|
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>
|
</div>
|
||||||
@@ -1026,8 +1026,8 @@ const EvolutionDashboard: React.FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="evo-header-stats">
|
<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">{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: '#219B5E' }}>{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: '#E8922C' }}>{babyCount}</span><span className="evo-hs-label">萌芽中</span></div>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|||||||
@@ -444,7 +444,7 @@
|
|||||||
|
|
||||||
.doc-processing-bar-fill {
|
.doc-processing-bar-fill {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: linear-gradient(90deg, #F59E0B, #FBBF24);
|
background: linear-gradient(90deg, #E8922C, #F0A94C);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
transition: width 0.8s ease;
|
transition: width 0.8s ease;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ const appGradients: Record<string, string> = {
|
|||||||
a3: 'linear-gradient(135deg,#5B5FED 0%,#818CF8 100%)',
|
a3: 'linear-gradient(135deg,#5B5FED 0%,#818CF8 100%)',
|
||||||
a4: 'linear-gradient(135deg,#4F8DF9 0%,#38BDF8 100%)',
|
a4: 'linear-gradient(135deg,#4F8DF9 0%,#38BDF8 100%)',
|
||||||
a5: 'linear-gradient(135deg,#6366F1 0%,#7DD3FC 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%)',
|
a7: 'linear-gradient(135deg,#4F8DF9 0%,#818CF8 100%)',
|
||||||
a8: 'linear-gradient(135deg,#6366F1 0%,#4F8DF9 100%)',
|
a8: 'linear-gradient(135deg,#6366F1 0%,#4F8DF9 100%)',
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
.bg-circle.c2 {
|
.bg-circle.c2 {
|
||||||
width: 400px; height: 400px;
|
width: 400px; height: 400px;
|
||||||
background: #8B8DFF;
|
background: #8185F5;
|
||||||
bottom: -100px; left: -50px;
|
bottom: -100px; left: -50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
/* Brand Panel */
|
/* Brand Panel */
|
||||||
.login-brand-panel {
|
.login-brand-panel {
|
||||||
width: 400px;
|
width: 400px;
|
||||||
background: linear-gradient(135deg, #2D2B55 0%, #1A1A2E 50%, #2D2B55 100%);
|
background: linear-gradient(135deg, #5B5FED 0%, #4A4ECC 50%, #5B5FED 100%);
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
width: 200px; height: 200px;
|
width: 200px; height: 200px;
|
||||||
border-radius: 50%;
|
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;
|
bottom: -30px; left: -30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.bf-icon {
|
.bf-icon {
|
||||||
color: #6C63FF;
|
color: #FFFFFF;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-size: var(--text-base);
|
font-size: var(--text-base);
|
||||||
}
|
}
|
||||||
@@ -219,7 +219,7 @@
|
|||||||
|
|
||||||
.login-submit-btn {
|
.login-submit-btn {
|
||||||
height: 46px;
|
height: 46px;
|
||||||
background: linear-gradient(135deg, #5B5FED, #6C63FF);
|
background: linear-gradient(135deg, #5B5FED, #4A4ECC);
|
||||||
color: white;
|
color: white;
|
||||||
border-radius: var(--radius-lg);
|
border-radius: var(--radius-lg);
|
||||||
font-size: var(--text-base);
|
font-size: var(--text-base);
|
||||||
|
|||||||
@@ -185,9 +185,9 @@
|
|||||||
padding: 2px 10px;
|
padding: 2px 10px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: var(--color-danger, #ef4444);
|
color: var(--color-danger, #D9383A);
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: 1px solid var(--color-danger, #ef4444);
|
border: 1px solid var(--color-danger, #D9383A);
|
||||||
border-radius: var(--radius-sm, 4px);
|
border-radius: var(--radius-sm, 4px);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.15s ease;
|
transition: all 0.15s ease;
|
||||||
@@ -195,7 +195,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.market-card-uninstall-btn:hover {
|
.market-card-uninstall-btn:hover {
|
||||||
background: var(--color-danger, #ef4444);
|
background: var(--color-danger, #D9383A);
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,9 +203,9 @@
|
|||||||
padding: 2px 10px;
|
padding: 2px 10px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: var(--color-accent, #6C63FF);
|
color: var(--color-accent);
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: 1px solid var(--color-accent, #6C63FF);
|
border: 1px solid var(--color-accent);
|
||||||
border-radius: var(--radius-sm, 4px);
|
border-radius: var(--radius-sm, 4px);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.15s ease;
|
transition: all 0.15s ease;
|
||||||
@@ -213,7 +213,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.market-card-install-btn:hover {
|
.market-card-install-btn:hover {
|
||||||
background: var(--color-accent, #6C63FF);
|
background: var(--color-accent);
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,7 +241,7 @@
|
|||||||
.star-icons {
|
.star-icons {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 1px;
|
gap: 1px;
|
||||||
color: #F59E0B;
|
color: #E8922C;
|
||||||
}
|
}
|
||||||
|
|
||||||
.star-count {
|
.star-count {
|
||||||
@@ -485,13 +485,13 @@
|
|||||||
|
|
||||||
.modal-install-btn.uninstall {
|
.modal-install-btn.uninstall {
|
||||||
background: white;
|
background: white;
|
||||||
color: var(--color-danger, #ef4444);
|
color: var(--color-danger, #D9383A);
|
||||||
border: 1px solid var(--color-danger, #ef4444);
|
border: 1px solid var(--color-danger, #D9383A);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal-install-btn.uninstall:hover:not(:disabled) {
|
.modal-install-btn.uninstall:hover:not(:disabled) {
|
||||||
background: var(--color-danger, #ef4444);
|
background: var(--color-danger, #D9383A);
|
||||||
color: white;
|
color: white;
|
||||||
transform: translateY(-1px);
|
transform: translateY(-1px);
|
||||||
box-shadow: var(--shadow-md);
|
box-shadow: var(--shadow-md);
|
||||||
@@ -539,7 +539,7 @@
|
|||||||
width: 28px;
|
width: 28px;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
border-radius: var(--radius-full);
|
border-radius: var(--radius-full);
|
||||||
background: linear-gradient(135deg, var(--color-accent), #8B8DFF);
|
background: linear-gradient(135deg, var(--color-accent), #8185F5);
|
||||||
color: white;
|
color: white;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -991,7 +991,7 @@
|
|||||||
margin: var(--space-md) 0;
|
margin: var(--space-md) 0;
|
||||||
padding: var(--space-md);
|
padding: var(--space-md);
|
||||||
background: var(--color-bg-subtle, #F8F9FC);
|
background: var(--color-bg-subtle, #F8F9FC);
|
||||||
border: 1px solid var(--color-border, #E5E7EB);
|
border: 1px solid var(--color-border, #E3E6EB);
|
||||||
border-radius: var(--radius-sm);
|
border-radius: var(--radius-sm);
|
||||||
}
|
}
|
||||||
.hub-price-input {
|
.hub-price-input {
|
||||||
@@ -1005,12 +1005,12 @@
|
|||||||
}
|
}
|
||||||
.hub-price-input:focus {
|
.hub-price-input:focus {
|
||||||
outline: none;
|
outline: none;
|
||||||
border-color: var(--color-primary, #6C63FF);
|
border-color: var(--color-accent);
|
||||||
box-shadow: 0 0 0 2px rgba(108, 99, 255, 0.15);
|
box-shadow: 0 0 0 2px rgba(91, 95, 237, 0.15);
|
||||||
}
|
}
|
||||||
.hub-price-hint {
|
.hub-price-hint {
|
||||||
font-size: var(--text-xs);
|
font-size: var(--text-xs);
|
||||||
color: var(--color-text-muted, #6B7280);
|
color: var(--color-text-muted, #545A65);
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ const ServerIcon = () => (
|
|||||||
|
|
||||||
// ===== Color palette for avatar icons =====
|
// ===== Color palette for avatar icons =====
|
||||||
const AVATAR_COLORS = [
|
const AVATAR_COLORS = [
|
||||||
{ bg: '#EEEDFF', fg: '#6C63FF' },
|
{ bg: '#EEEDFF', fg: '#5B5FED' },
|
||||||
{ bg: '#E6F7EE', fg: '#219B5E' },
|
{ bg: '#E6F7EE', fg: '#219B5E' },
|
||||||
{ bg: '#FEF4E8', fg: '#E8922C' },
|
{ bg: '#FEF4E8', fg: '#E8922C' },
|
||||||
{ bg: '#EBF2FE', fg: '#3B82F6' },
|
{ bg: '#EBF2FE', fg: '#3B82F6' },
|
||||||
|
|||||||
@@ -156,7 +156,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.pricing-plan--popular {
|
.pricing-plan--popular {
|
||||||
border-color: #F59E0B;
|
border-color: #E8922C;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Popular Ribbon */
|
/* Popular Ribbon */
|
||||||
@@ -164,7 +164,7 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
top: 16px;
|
top: 16px;
|
||||||
right: -32px;
|
right: -32px;
|
||||||
background: linear-gradient(135deg, #F59E0B, #EF4444);
|
background: linear-gradient(135deg, #E8922C, #D9383A);
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
@@ -930,7 +930,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.pricing-modal-form-group label .required {
|
.pricing-modal-form-group label .required {
|
||||||
color: #EF4444;
|
color: #D9383A;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pricing-modal-form-group input,
|
.pricing-modal-form-group input,
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ interface CouponItem {
|
|||||||
|
|
||||||
const SERVICE_TYPE_CONFIG: Record<string, { label: string; icon: React.ReactNode; color: string; bg: string }> = {
|
const SERVICE_TYPE_CONFIG: Record<string, { label: string; icon: React.ReactNode; color: string; bg: string }> = {
|
||||||
app_custom: { label: '应用定制', icon: <IconAppCustom />, color: '#4F46E5', bg: '#EEF2FF' },
|
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' },
|
data_custom: { label: '数据定制', icon: <IconDataCustom />, color: '#D97706', bg: '#FFFBEB' },
|
||||||
private_project: { label: '私有化项目', icon: <IconPrivateProject />, color: '#7C3AED', bg: '#F5F3FF' },
|
private_project: { label: '私有化项目', icon: <IconPrivateProject />, color: '#7C3AED', bg: '#F5F3FF' },
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -450,7 +450,7 @@
|
|||||||
width: 64px;
|
width: 64px;
|
||||||
height: 64px;
|
height: 64px;
|
||||||
border-radius: var(--radius-lg);
|
border-radius: var(--radius-lg);
|
||||||
background: linear-gradient(135deg, var(--color-accent), #8B8DFF);
|
background: linear-gradient(135deg, var(--color-accent), #8185F5);
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|||||||
@@ -244,8 +244,8 @@ const ProfilePage: React.FC = () => {
|
|||||||
const getLevelGradient = (level: number) => {
|
const getLevelGradient = (level: number) => {
|
||||||
const gradients: Record<number, string> = {
|
const gradients: Record<number, string> = {
|
||||||
0: 'linear-gradient(135deg, #8B919E, #BFC4CE)',
|
0: 'linear-gradient(135deg, #8B919E, #BFC4CE)',
|
||||||
2: 'linear-gradient(135deg, #5B5FED, #8B8DFF)',
|
2: 'linear-gradient(135deg, #5B5FED, #8185F5)',
|
||||||
3: 'linear-gradient(135deg, #F59E0B, #FBBF24)',
|
3: 'linear-gradient(135deg, #E8922C, #F0A94C)',
|
||||||
};
|
};
|
||||||
return gradients[level] || gradients[0];
|
return gradients[level] || gradients[0];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tkd-kpi--blue {
|
.tkd-kpi--blue {
|
||||||
background: linear-gradient(135deg, #5B5FED 0%, #8B8DFF 100%);
|
background: linear-gradient(135deg, #5B5FED 0%, #8185F5 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.tkd-kpi--green {
|
.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(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:nth-child(3) .tkd-rank-item-idx { background: #FDE8CD; color: #B45309; }
|
||||||
|
|
||||||
.tkd-rank-item-name {
|
.tkd-rank-item-name {
|
||||||
|
|||||||
@@ -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' }} />
|
<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' }}>
|
<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>
|
||||||
)}
|
)}
|
||||||
<div style={{ fontSize: '13px', color: polling ? '#f59e0b' : '#6B7280' }}>
|
<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 = {
|
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',
|
color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ const WechatHistory: React.FC = () => {
|
|||||||
<div style={{
|
<div style={{
|
||||||
padding: '10px 14px', borderRadius: '12px', fontSize: '14px', lineHeight: '1.6',
|
padding: '10px 14px', borderRadius: '12px', fontSize: '14px', lineHeight: '1.6',
|
||||||
whiteSpace: 'pre-wrap', wordBreak: 'break-word',
|
whiteSpace: 'pre-wrap', wordBreak: 'break-word',
|
||||||
background: m.role === 'user' ? '#6C63FF' : '#FFFFFF',
|
background: m.role === 'user' ? '#5B5FED' : '#FFFFFF',
|
||||||
color: m.role === 'user' ? '#fff' : '#1A1F36',
|
color: m.role === 'user' ? '#fff' : '#1A1F36',
|
||||||
border: m.role === 'user' ? 'none' : '1px solid #E5E7EB',
|
border: m.role === 'user' ? 'none' : '1px solid #E5E7EB',
|
||||||
}}>{m.content}</div>
|
}}>{m.content}</div>
|
||||||
@@ -90,7 +90,7 @@ const WechatHistory: React.FC = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const btnStyle: React.CSSProperties = {
|
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',
|
color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user