+
{tabs.map((tab) => (
))}
diff --git a/frontend/src/i18n/locales/en.json b/frontend/src/i18n/locales/en.json
index 498ba45..186a7e0 100644
--- a/frontend/src/i18n/locales/en.json
+++ b/frontend/src/i18n/locales/en.json
@@ -88,7 +88,9 @@
"running": "Running",
"completed": "Completed",
"failed": "Failed"
- }
+ },
+ "total": "Total",
+ "queued": "Queued"
},
"settings": {
"settings": "Settings",
diff --git a/frontend/src/i18n/locales/zh.json b/frontend/src/i18n/locales/zh.json
index 1c34de4..369bb98 100644
--- a/frontend/src/i18n/locales/zh.json
+++ b/frontend/src/i18n/locales/zh.json
@@ -88,7 +88,9 @@
"running": "运行中",
"completed": "已完成",
"failed": "失败"
- }
+ },
+ "total": "总数",
+ "queued": "排队中"
},
"settings": {
"settings": "设置",
diff --git a/frontend/src/index.css b/frontend/src/index.css
index 1fb24c5..b841d31 100644
--- a/frontend/src/index.css
+++ b/frontend/src/index.css
@@ -38,72 +38,83 @@
--color-warning-bg: var(--warning-bg);
--color-glow-purple: var(--glow-purple);
--color-glow-cyan: var(--glow-cyan);
+ --color-clay: var(--clay);
+ --color-slate: var(--slate);
+ --color-terracotta: var(--terracotta);
--font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
--font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
}
+/* ===== Morandi Light ===== */
:root {
- --bg-primary: #fafafa;
- --bg-secondary: #f4f4f5;
- --bg-tertiary: #e4e4e7;
- --bg-card: #ffffff;
- --bg-sidebar: #f4f4f5;
- --bg-topbar: rgba(255, 255, 255, 0.72);
- --bg-input: #f4f4f5;
- --bg-hover: #f4f4f5;
- --bg-active: #eff6ff;
- --bg-glass: rgba(255, 255, 255, 0.6);
- --border-primary: #e4e4e7;
- --border-secondary: #f4f4f5;
- --text-primary: #18181b;
- --text-secondary: #3f3f46;
- --text-tertiary: #52525b;
- --text-muted: #a1a1aa;
- --accent: #4f46e5;
- --accent-hover: #4338ca;
- --accent-light: #e0e7ff;
- --accent-text: #3730a3;
- --accent-glow: rgba(79, 70, 229, 0.15);
- --danger: #dc2626;
- --danger-bg: #fef2f2;
- --success: #16a34a;
- --success-bg: #f0fdf4;
- --warning: #d97706;
- --warning-bg: #fffbeb;
- --glow-purple: #a855f7;
- --glow-cyan: #06b6d4;
+ --bg-primary: #f2f0ed;
+ --bg-secondary: #eae8e4;
+ --bg-tertiary: #e0ddd8;
+ --bg-card: #faf9f7;
+ --bg-sidebar: #eae8e4;
+ --bg-topbar: rgba(250, 249, 247, 0.85);
+ --bg-input: #f2f0ed;
+ --bg-hover: rgba(255, 255, 255, 0.4);
+ --bg-active: rgba(156, 175, 136, 0.08);
+ --bg-glass: rgba(250, 249, 247, 0.72);
+ --border-primary: #e0ddd8;
+ --border-secondary: #eae8e4;
+ --text-primary: #3d3d3d;
+ --text-secondary: #5a5a5a;
+ --text-tertiary: #8c8680;
+ --text-muted: #b5afa8;
+ --accent: #9caf88;
+ --accent-hover: #8a9e78;
+ --accent-light: rgba(156, 175, 136, 0.12);
+ --accent-text: #7a8e6a;
+ --accent-glow: rgba(156, 175, 136, 0.2);
+ --danger: #c4917a;
+ --danger-bg: rgba(196, 145, 122, 0.08);
+ --success: #7a8e6a;
+ --success-bg: rgba(122, 142, 106, 0.08);
+ --warning: #c4a882;
+ --warning-bg: rgba(196, 168, 130, 0.08);
+ --glow-purple: #8a9aaa;
+ --glow-cyan: #c4a882;
+ --clay: #c4a882;
+ --slate: #8a9aaa;
+ --terracotta: #c4917a;
}
+/* ===== Morandi Dark ===== */
.dark {
- --bg-primary: #09090b;
- --bg-secondary: #0f0f11;
- --bg-tertiary: #18181b;
- --bg-card: #131316;
- --bg-sidebar: #0c0c0e;
- --bg-topbar: rgba(9, 9, 11, 0.72);
- --bg-input: #18181b;
- --bg-hover: #1c1c1f;
- --bg-active: rgba(79, 70, 229, 0.12);
- --bg-glass: rgba(19, 19, 22, 0.6);
- --border-primary: rgba(255, 255, 255, 0.08);
- --border-secondary: rgba(255, 255, 255, 0.04);
- --text-primary: #fafafa;
- --text-secondary: #e4e4e7;
- --text-tertiary: #a1a1aa;
- --text-muted: #71717a;
- --accent: #6366f1;
- --accent-hover: #818cf8;
- --accent-light: rgba(99, 102, 241, 0.15);
- --accent-text: #a5b4fc;
- --accent-glow: rgba(99, 102, 241, 0.25);
- --danger: #f87171;
- --danger-bg: rgba(248, 113, 113, 0.1);
- --success: #4ade80;
- --success-bg: rgba(74, 222, 128, 0.1);
- --warning: #fbbf24;
- --warning-bg: rgba(251, 191, 36, 0.1);
- --glow-purple: #c084fc;
- --glow-cyan: #67e8f9;
+ --bg-primary: #1c1b19;
+ --bg-secondary: #232220;
+ --bg-tertiary: #2d2b28;
+ --bg-card: #252421;
+ --bg-sidebar: #1e1d1b;
+ --bg-topbar: rgba(28, 27, 25, 0.85);
+ --bg-input: #2d2b28;
+ --bg-hover: rgba(255, 255, 255, 0.04);
+ --bg-active: rgba(156, 175, 136, 0.1);
+ --bg-glass: rgba(37, 36, 33, 0.72);
+ --border-primary: rgba(255, 255, 255, 0.06);
+ --border-secondary: rgba(255, 255, 255, 0.03);
+ --text-primary: #e8e6e3;
+ --text-secondary: #c8c5c0;
+ --text-tertiary: #a09c96;
+ --text-muted: #7a7772;
+ --accent: #a8bc94;
+ --accent-hover: #b8caa6;
+ --accent-light: rgba(156, 175, 136, 0.15);
+ --accent-text: #c4d4b4;
+ --accent-glow: rgba(156, 175, 136, 0.2);
+ --danger: #d4a894;
+ --danger-bg: rgba(196, 145, 122, 0.1);
+ --success: #9caf88;
+ --success-bg: rgba(156, 175, 136, 0.1);
+ --warning: #c4a882;
+ --warning-bg: rgba(196, 168, 130, 0.1);
+ --glow-purple: #a0aab8;
+ --glow-cyan: #c4b89e;
+ --clay: #c4a882;
+ --slate: #8a9aaa;
+ --terracotta: #c4917a;
}
html {
@@ -118,16 +129,19 @@ body {
-moz-osx-font-smoothing: grayscale;
}
-/* Dot pattern background for dark mode */
-.dark body::before {
+/* Dot pattern background */
+body::before {
content: "";
position: fixed;
inset: 0;
- background-image: radial-gradient(circle at 1px 1px, rgba(255,255,255,0.04) 1px, transparent 0);
+ background-image: radial-gradient(circle at 1px 1px, rgba(0, 0, 0, 0.012) 1px, transparent 0);
background-size: 24px 24px;
pointer-events: none;
z-index: 0;
}
+.dark body::before {
+ background-image: radial-gradient(circle at 1px 1px, rgba(255, 255, 255, 0.015) 1px, transparent 0);
+}
/* Custom scrollbar */
::-webkit-scrollbar {
@@ -139,7 +153,7 @@ body {
}
::-webkit-scrollbar-thumb {
background: var(--border-primary);
- border-radius: 10px;
+ border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--text-muted);
@@ -209,21 +223,23 @@ body {
/* Glass effect */
.glass {
background: var(--bg-glass);
- backdrop-filter: blur(16px) saturate(180%);
- -webkit-backdrop-filter: blur(16px) saturate(180%);
+ backdrop-filter: blur(16px) saturate(140%);
+ -webkit-backdrop-filter: blur(16px) saturate(140%);
border-bottom: 1px solid var(--border-primary);
}
-/* Modern card hover */
+/* Card hover */
.card-hover {
- transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.2s ease, border-color 0.2s ease;
+ transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.25s ease, border-color 0.25s ease;
}
.card-hover:hover {
transform: translateY(-2px);
- box-shadow: 0 8px 30px -8px rgba(0, 0, 0, 0.12);
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.05);
+ border-color: #d5d0ca;
}
.dark .card-hover:hover {
- box-shadow: 0 8px 30px -8px rgba(0, 0, 0, 0.4);
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
+ border-color: rgba(255, 255, 255, 0.1);
}
/* Glow effects */
@@ -231,7 +247,7 @@ body {
box-shadow: 0 0 20px -4px var(--accent-glow);
}
.glow-purple {
- box-shadow: 0 0 30px -6px rgba(168, 85, 247, 0.3);
+ box-shadow: 0 0 30px -6px rgba(138, 154, 170, 0.2);
}
/* Status indicator pulse */