feat: 全站 PageShell 设计系统与专业 UI 统一

- 新增 PageShell/PageTabs/ContentPanel/PageLoading/PageEmpty 页面骨架
- index.css 设计令牌文档化,布局令牌与纯色主按钮(去除渐变粉彩)
- 全站路由页接入 PageShell,云账单三 Tab 为标杆
- 主题体系:跟随系统 + 主流/开发者分组,新增 Dracula/Tokyo Night,One Dark 暖灰差异化
- 登录页/侧栏/顶栏去渐变光球,企业克制风
- 修复 AIAlertAnalyzer JSX 与构建依赖导入问题
This commit is contained in:
Logan committed 2026-07-01 12:45:38 +08:00
1 parent 1acb0c49af
commit e363ded445
213 files changed
+7148 -6818

No files matched your search

+600 -244
View File
@@ -42,9 +42,9 @@
--dg-border: #30363d;
--dg-border-light: #21262d;
--dg-border-hover: #484f58;
--dg-text-primary: #f0f6fc;
--dg-text-secondary: #8b949e;
--dg-text-muted: #6e7681;
--dg-text-primary: #e6edf3;
--dg-text-secondary: #9aa4af;
--dg-text-muted: #768390;
--dg-blue: #58a6ff;
--dg-green: #3fb950;
--dg-red: #f85149;
@@ -54,9 +54,9 @@
--dg-yellow: #d29922;
--dg-card-hover-border: rgba(88, 166, 255, 0.5);
--dg-gradient-start: #2563eb;
--dg-gradient-end: #9333ea;
--dg-gradient-text-start: #60a5fa;
--dg-gradient-text-end: #c084fc;
--dg-gradient-end: #1d4ed8;
--dg-gradient-text-start: #3b82f6;
--dg-gradient-text-end: #2563eb;
--dg-input-focus-ring: rgba(96, 165, 250, 0.2);
--chart-grid: #1e293b;
--chart-axis: #475569;
@@ -67,50 +67,52 @@
--shadow-dropdown: 0 10px 40px rgba(0, 0, 0, 0.5);
--skeleton-base: #21262d;
--skeleton-highlight: #30363d;
--dg-overlay: color-mix(in srgb, #010409 55%, transparent);
}
/* ===== Theme 2: Light Professional (明亮白) ===== */
[data-theme="light-professional"],
[data-theme="light"] {
--background: 0 0% 100%;
--foreground: 220 14% 10%;
--card: 0 0% 100%;
--card-foreground: 220 14% 10%;
--popover: 0 0% 100%;
--popover-foreground: 220 14% 10%;
--background: 220 14% 96%;
--foreground: 220 14% 16%;
--card: 220 14% 99%;
--card-foreground: 220 14% 16%;
--popover: 220 14% 99%;
--popover-foreground: 220 14% 16%;
--primary: 217 91% 60%;
--primary-foreground: 0 0% 100%;
--secondary: 220 14% 96%;
--secondary-foreground: 220 14% 10%;
--muted: 220 14% 96%;
--muted-foreground: 220 10% 46%;
--accent: 220 14% 96%;
--accent-foreground: 220 14% 10%;
--secondary-foreground: 220 14% 16%;
--muted: 220 14% 94%;
--muted-foreground: 220 10% 42%;
--accent: 220 14% 94%;
--accent-foreground: 220 14% 16%;
--destructive: 0 72% 51%;
--destructive-foreground: 0 0% 100%;
--border: 220 13% 91%;
--input: 220 13% 91%;
--ring: 217 91% 60%;
--radius: 0.625rem;
--sidebar-background: 0 0% 98%;
--sidebar-foreground: 220 14% 20%;
--sidebar-background: 220 14% 97%;
--sidebar-foreground: 220 14% 22%;
--sidebar-primary: 217 91% 60%;
--sidebar-primary-foreground: 0 0% 100%;
--sidebar-accent: 220 14% 94%;
--sidebar-accent-foreground: 220 14% 10%;
--sidebar-accent-foreground: 220 14% 16%;
--sidebar-border: 220 13% 91%;
--sidebar-ring: 217 91% 60%;
--dg-bg-primary: #ffffff;
--dg-bg-secondary: #f8f9fb;
--dg-bg-tertiary: #f0f1f5;
--dg-bg-hover: #e8eaef;
--dg-bg-active: #dfe1e8;
--dg-border: #e2e5eb;
--dg-border-light: #eaecf0;
--dg-border-hover: #d0d5dd;
--dg-text-primary: #1a1d23;
--dg-text-secondary: #5c6370;
--dg-text-muted: #9ca3af;
--dg-bg-primary: #f4f5f7;
--dg-bg-secondary: #fafbfc;
--dg-bg-tertiary: #eef0f4;
--dg-bg-hover: #e4e7ec;
--dg-bg-active: #d8dce3;
--dg-border: #d8dce3;
--dg-border-light: #e4e7ec;
--dg-border-hover: #c4c9d2;
--dg-text-primary: #2c313a;
--dg-text-secondary: #525964;
--dg-text-muted: #6b7280;
--dg-overlay: color-mix(in srgb, #2c313a 38%, transparent);
--dg-blue: #2563eb;
--dg-green: #16a34a;
--dg-red: #dc2626;
@@ -120,9 +122,9 @@
--dg-yellow: #ca8a04;
--dg-card-hover-border: rgba(37, 99, 235, 0.3);
--dg-gradient-start: #2563eb;
--dg-gradient-end: #7c3aed;
--dg-gradient-text-start: #1d4ed8;
--dg-gradient-text-end: #6d28d9;
--dg-gradient-end: #1d4ed8;
--dg-gradient-text-start: #2563eb;
--dg-gradient-text-end: #1e40af;
--dg-input-focus-ring: rgba(37, 99, 235, 0.15);
--chart-grid: #e2e5eb;
--chart-axis: #9ca3af;
@@ -135,199 +137,404 @@
--skeleton-highlight: #e8eaef;
}
/* ===== Theme 3: Midnight Purple (午夜紫) ===== */
[data-theme="midnight-purple"] {
--background: 264 56% 4%;
--foreground: 280 100% 98%;
--card: 264 48% 8%;
--card-foreground: 280 100% 98%;
--popover: 264 48% 8%;
--popover-foreground: 280 100% 98%;
--primary: 270 91% 65%;
--primary-foreground: 0 0% 100%;
--secondary: 264 40% 20%;
--secondary-foreground: 280 100% 98%;
--muted: 264 40% 20%;
--muted-foreground: 280 30% 60%;
--accent: 264 40% 20%;
--accent-foreground: 280 100% 98%;
--destructive: 348 100% 72%;
--destructive-foreground: 264 56% 4%;
--border: 264 40% 20%;
--input: 264 40% 20%;
--ring: 270 91% 65%;
/* ===== Theme 3: One Dark — Atom 暖灰 IDE(刻意与深海蓝蓝黑区分) // Logan.Li ===== */
[data-theme="one-dark"] {
--background: 220 9% 22%;
--foreground: 220 8% 82%;
--card: 220 8% 26%;
--card-foreground: 220 8% 82%;
--popover: 220 8% 24%;
--popover-foreground: 220 8% 82%;
--primary: 207 82% 66%;
--primary-foreground: 220 9% 18%;
--secondary: 220 8% 30%;
--secondary-foreground: 220 8% 82%;
--muted: 220 8% 30%;
--muted-foreground: 220 6% 52%;
--accent: 220 8% 30%;
--accent-foreground: 220 8% 82%;
--destructive: 355 65% 65%;
--destructive-foreground: 220 9% 18%;
--border: 220 7% 34%;
--input: 220 8% 28%;
--ring: 286 60% 67%;
--radius: 0.625rem;
--sidebar-background: 264 48% 6%;
--sidebar-foreground: 280 100% 92%;
--sidebar-primary: 270 91% 65%;
--sidebar-primary-foreground: 0 0% 100%;
--sidebar-accent: 264 40% 20%;
--sidebar-accent-foreground: 280 100% 98%;
--sidebar-border: 264 40% 20%;
--sidebar-ring: 270 91% 65%;
--dg-bg-primary: #0a0612;
--dg-bg-secondary: #130c21;
--dg-bg-tertiary: #1c1330;
--dg-bg-hover: #2d1f4a;
--dg-bg-active: #3d2a5e;
--dg-border: #2d1f4a;
--dg-border-light: #1c1330;
--dg-border-hover: #3d2a5e;
--dg-text-primary: #faf5ff;
--dg-text-secondary: #b794c7;
--dg-text-muted: #7c5a8a;
--dg-blue: #818cf8;
--dg-green: #34d399;
--dg-red: #fb7185;
--dg-orange: #fb923c;
--dg-purple: #c084fc;
--dg-cyan: #22d3ee;
--dg-yellow: #facc15;
--dg-card-hover-border: rgba(192, 132, 252, 0.5);
--dg-gradient-start: #9333ea;
--dg-gradient-end: #c084fc;
--dg-gradient-text-start: #a855f7;
--dg-gradient-text-end: #c084fc;
--dg-input-focus-ring: rgba(192, 132, 252, 0.2);
--chart-grid: #2d1f4a;
--chart-axis: #7c5a8a;
--chart-tooltip-bg: #130c21;
--chart-tooltip-border: #2d1f4a;
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(192, 132, 252, 0.05);
--shadow-card-hover: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(192, 132, 252, 0.2);
--shadow-dropdown: 0 10px 40px rgba(0, 0, 0, 0.5);
--skeleton-base: #1c1330;
--skeleton-highlight: #2d1f4a;
--sidebar-background: 220 9% 17%;
--sidebar-foreground: 220 8% 78%;
--sidebar-primary: 207 82% 66%;
--sidebar-primary-foreground: 220 9% 18%;
--sidebar-accent: 220 8% 26%;
--sidebar-accent-foreground: 220 8% 82%;
--sidebar-border: 220 7% 28%;
--sidebar-ring: 286 60% 67%;
/* 更亮暖灰底 + 侧栏压暗,贴近 Atom 编辑器层次 */
--dg-bg-primary: #282c34;
--dg-bg-secondary: #2f343e;
--dg-bg-tertiary: #383e4a;
--dg-bg-hover: #3e4451;
--dg-bg-active: #4b5263;
--dg-border: #4b5263;
--dg-border-light: #353b45;
--dg-border-hover: #5c6370;
--dg-text-primary: #d7dae0;
--dg-text-secondary: #9da5b4;
--dg-text-muted: #6b7285;
/* Atom 语法高亮色 — 品牌渐变用紫→绿,非深海蓝 */
--dg-blue: #61afef;
--dg-green: #98c379;
--dg-red: #e06c75;
--dg-orange: #d19a66;
--dg-purple: #c678dd;
--dg-cyan: #56b6c2;
--dg-yellow: #e5c07b;
--dg-card-hover-border: rgba(198, 120, 221, 0.42);
--dg-gradient-start: #c678dd;
--dg-gradient-end: #98c379;
--dg-gradient-text-start: #c678dd;
--dg-gradient-text-end: #61afef;
--dg-input-focus-ring: rgba(198, 120, 221, 0.22);
--chart-grid: #4b5263;
--chart-axis: #6b7285;
--chart-tooltip-bg: #2f343e;
--chart-tooltip-border: #4b5263;
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.22), 0 0 0 1px rgba(198, 120, 221, 0.06);
--shadow-card-hover: 0 8px 28px rgba(0, 0, 0, 0.32), 0 0 0 1px rgba(152, 195, 121, 0.18);
--shadow-dropdown: 0 10px 36px rgba(0, 0, 0, 0.45);
--skeleton-base: #383e4a;
--skeleton-highlight: #4b5263;
--dg-overlay: color-mix(in srgb, #21252b 52%, transparent);
}
/* ===== Theme 4: Pine Green (松林绿) ===== */
[data-theme="pine-green"] {
--background: 150 25% 5%;
--foreground: 140 60% 97%;
--card: 150 25% 9%;
--card-foreground: 140 60% 97%;
--popover: 150 25% 9%;
--popover-foreground: 140 60% 97%;
--primary: 142 71% 45%;
--primary-foreground: 150 25% 5%;
--secondary: 150 20% 18%;
--secondary-foreground: 140 60% 97%;
--muted: 150 20% 18%;
--muted-foreground: 150 20% 55%;
--accent: 150 20% 18%;
--accent-foreground: 140 60% 97%;
--destructive: 0 90% 72%;
--destructive-foreground: 150 25% 5%;
--border: 150 20% 18%;
--input: 150 20% 18%;
--ring: 142 71% 45%;
/* ===== Theme 4: Catppuccin Mocha ===== */
[data-theme="catppuccin"] {
--background: 240 21% 15%;
--foreground: 226 64% 88%;
--card: 240 21% 12%;
--card-foreground: 226 64% 88%;
--popover: 240 21% 12%;
--popover-foreground: 226 64% 88%;
--primary: 217 92% 76%;
--primary-foreground: 240 21% 15%;
--secondary: 237 16% 23%;
--secondary-foreground: 226 64% 88%;
--muted: 237 16% 23%;
--muted-foreground: 228 24% 72%;
--accent: 237 16% 23%;
--accent-foreground: 226 64% 88%;
--destructive: 343 81% 75%;
--destructive-foreground: 240 21% 15%;
--border: 237 16% 23%;
--input: 237 16% 23%;
--ring: 217 92% 76%;
--radius: 0.625rem;
--sidebar-background: 150 25% 7%;
--sidebar-foreground: 140 40% 88%;
--sidebar-primary: 142 71% 45%;
--sidebar-primary-foreground: 150 25% 5%;
--sidebar-accent: 150 20% 18%;
--sidebar-accent-foreground: 140 60% 97%;
--sidebar-border: 150 20% 18%;
--sidebar-ring: 142 71% 45%;
--dg-bg-primary: #0a1210;
--dg-bg-secondary: #111f1a;
--dg-bg-tertiary: #192c24;
--dg-bg-hover: #253d32;
--dg-bg-active: #2f4f3e;
--dg-border: #253d32;
--dg-border-light: #192c24;
--dg-border-hover: #2f4f3e;
--dg-text-primary: #f0fdf4;
--dg-text-secondary: #86b8a0;
--dg-text-muted: #5a7c6b;
--dg-blue: #38bdf8;
--dg-green: #4ade80;
--dg-red: #f87171;
--dg-orange: #fb923c;
--dg-purple: #c084fc;
--dg-cyan: #2dd4bf;
--dg-yellow: #facc15;
--dg-card-hover-border: rgba(74, 222, 128, 0.5);
--dg-gradient-start: #059669;
--dg-gradient-end: #10b981;
--dg-gradient-text-start: #059669;
--dg-gradient-text-end: #34d399;
--dg-input-focus-ring: rgba(74, 222, 128, 0.2);
--chart-grid: #253d32;
--chart-axis: #5a7c6b;
--chart-tooltip-bg: #111f1a;
--chart-tooltip-border: #253d32;
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(74, 222, 128, 0.05);
--shadow-card-hover: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(74, 222, 128, 0.2);
--sidebar-background: 240 23% 9%;
--sidebar-foreground: 226 64% 85%;
--sidebar-primary: 217 92% 76%;
--sidebar-primary-foreground: 240 21% 15%;
--sidebar-accent: 237 16% 23%;
--sidebar-accent-foreground: 226 64% 88%;
--sidebar-border: 237 16% 23%;
--sidebar-ring: 217 92% 76%;
--dg-bg-primary: #1e1e2e;
--dg-bg-secondary: #181825;
--dg-bg-tertiary: #313244;
--dg-bg-hover: #45475a;
--dg-bg-active: #585b70;
--dg-border: #45475a;
--dg-border-light: #313244;
--dg-border-hover: #585b70;
--dg-text-primary: #cdd6f4;
--dg-text-secondary: #a6adc8;
--dg-text-muted: #7f849c;
--dg-blue: #89b4fa;
--dg-green: #a6e3a1;
--dg-red: #f38ba8;
--dg-orange: #fab387;
--dg-purple: #cba6f7;
--dg-cyan: #89dceb;
--dg-yellow: #f9e2af;
--dg-card-hover-border: rgba(137, 180, 250, 0.45);
--dg-gradient-start: #74c7ec;
--dg-gradient-end: #cba6f7;
--dg-gradient-text-start: #89b4fa;
--dg-gradient-text-end: #cba6f7;
--dg-input-focus-ring: rgba(137, 180, 250, 0.2);
--chart-grid: #45475a;
--chart-axis: #7f849c;
--chart-tooltip-bg: #181825;
--chart-tooltip-border: #45475a;
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(137, 180, 250, 0.05);
--shadow-card-hover: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(137, 180, 250, 0.15);
--shadow-dropdown: 0 10px 40px rgba(0, 0, 0, 0.5);
--skeleton-base: #192c24;
--skeleton-highlight: #253d32;
--skeleton-base: #313244;
--skeleton-highlight: #45475a;
--dg-overlay: color-mix(in srgb, #11111b 55%, transparent);
}
/* ===== Theme 5: Orange Vitality (活力橙) ===== */
[data-theme="orange-vitality"] {
--background: 30 35% 5%;
--foreground: 30 100% 97%;
--card: 30 30% 9%;
--card-foreground: 30 100% 97%;
--popover: 30 30% 9%;
--popover-foreground: 30 100% 97%;
--primary: 25 95% 53%;
--primary-foreground: 0 0% 100%;
--secondary: 30 25% 18%;
--secondary-foreground: 30 100% 97%;
--muted: 30 25% 18%;
--muted-foreground: 30 25% 55%;
--accent: 30 25% 18%;
--accent-foreground: 30 100% 97%;
--destructive: 0 80% 70%;
--destructive-foreground: 30 35% 5%;
--border: 30 25% 18%;
--input: 30 25% 18%;
--ring: 25 95% 53%;
/* ===== Theme 5: Dracula — 紫粉经典(高辨识度) // Logan.Li ===== */
[data-theme="dracula"] {
--background: 231 15% 18%;
--foreground: 60 30% 96%;
--card: 231 15% 20%;
--card-foreground: 60 30% 96%;
--popover: 231 15% 20%;
--popover-foreground: 60 30% 96%;
--primary: 265 89% 78%;
--primary-foreground: 231 15% 18%;
--secondary: 232 14% 31%;
--secondary-foreground: 60 30% 96%;
--muted: 232 14% 31%;
--muted-foreground: 231 8% 68%;
--accent: 232 14% 31%;
--accent-foreground: 60 30% 96%;
--destructive: 0 100% 67%;
--destructive-foreground: 231 15% 18%;
--border: 232 14% 31%;
--input: 232 14% 31%;
--ring: 265 89% 78%;
--radius: 0.625rem;
--sidebar-background: 30 30% 7%;
--sidebar-foreground: 30 80% 88%;
--sidebar-primary: 25 95% 53%;
--sidebar-primary-foreground: 0 0% 100%;
--sidebar-accent: 30 25% 18%;
--sidebar-accent-foreground: 30 100% 97%;
--sidebar-border: 30 25% 18%;
--sidebar-ring: 25 95% 53%;
--dg-bg-primary: #110d08;
--dg-bg-secondary: #1d1610;
--dg-bg-tertiary: #2b1f16;
--dg-bg-hover: #3d2d20;
--dg-bg-active: #4d3928;
--dg-border: #3d2d20;
--dg-border-light: #2b1f16;
--dg-border-hover: #4d3928;
--dg-text-primary: #fef7ed;
--dg-text-secondary: #d4a574;
--dg-text-muted: #9c7a54;
--dg-blue: #60a5fa;
--dg-green: #4ade80;
--dg-red: #f87171;
--dg-orange: #fb923c;
--dg-purple: #a78bfa;
--dg-cyan: #2dd4bf;
--dg-yellow: #fcd34d;
--dg-card-hover-border: rgba(251, 146, 60, 0.5);
--dg-gradient-start: #ea580c;
--dg-gradient-end: #f59e0b;
--dg-gradient-text-start: #f97316;
--dg-gradient-text-end: #fbbf24;
--dg-input-focus-ring: rgba(251, 146, 60, 0.2);
--chart-grid: #3d2d20;
--chart-axis: #9c7a54;
--chart-tooltip-bg: #1d1610;
--chart-tooltip-border: #3d2d20;
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(251, 146, 60, 0.05);
--shadow-card-hover: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(251, 146, 60, 0.2);
--sidebar-background: 231 16% 16%;
--sidebar-foreground: 60 25% 92%;
--sidebar-primary: 265 89% 78%;
--sidebar-primary-foreground: 231 15% 18%;
--sidebar-accent: 232 14% 28%;
--sidebar-accent-foreground: 60 30% 96%;
--sidebar-border: 232 14% 28%;
--sidebar-ring: 265 89% 78%;
--dg-bg-primary: #282a36;
--dg-bg-secondary: #313341;
--dg-bg-tertiary: #44475a;
--dg-bg-hover: #4d5066;
--dg-bg-active: #5a5d78;
--dg-border: #44475a;
--dg-border-light: #383a4a;
--dg-border-hover: #6272a4;
--dg-text-primary: #f8f8f2;
--dg-text-secondary: #bfbfb5;
--dg-text-muted: #8b8b80;
--dg-blue: #8be9fd;
--dg-green: #50fa7b;
--dg-red: #ff5555;
--dg-orange: #ffb86c;
--dg-purple: #bd93f9;
--dg-cyan: #8be9fd;
--dg-yellow: #f1fa8c;
--dg-card-hover-border: rgba(189, 147, 249, 0.5);
--dg-gradient-start: #bd93f9;
--dg-gradient-end: #ff79c6;
--dg-gradient-text-start: #bd93f9;
--dg-gradient-text-end: #ff79c6;
--dg-input-focus-ring: rgba(189, 147, 249, 0.25);
--chart-grid: #44475a;
--chart-axis: #8b8b80;
--chart-tooltip-bg: #313341;
--chart-tooltip-border: #44475a;
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.35), 0 0 0 1px rgba(189, 147, 249, 0.08);
--shadow-card-hover: 0 8px 32px rgba(0, 0, 0, 0.45), 0 0 0 1px rgba(255, 121, 198, 0.2);
--shadow-dropdown: 0 10px 40px rgba(0, 0, 0, 0.55);
--skeleton-base: #44475a;
--skeleton-highlight: #4d5066;
--dg-overlay: color-mix(in srgb, #191a21 58%, transparent);
}
/* ===== Theme 6: Tokyo Night — 深蓝紫霓虹 // Logan.Li ===== */
[data-theme="tokyo-night"] {
--background: 235 25% 12%;
--foreground: 226 48% 86%;
--card: 234 26% 16%;
--card-foreground: 226 48% 86%;
--popover: 234 26% 16%;
--popover-foreground: 226 48% 86%;
--primary: 221 70% 72%;
--primary-foreground: 235 25% 12%;
--secondary: 233 23% 22%;
--secondary-foreground: 226 48% 86%;
--muted: 233 23% 22%;
--muted-foreground: 225 15% 58%;
--accent: 233 23% 22%;
--accent-foreground: 226 48% 86%;
--destructive: 350 65% 72%;
--destructive-foreground: 235 25% 12%;
--border: 233 20% 26%;
--input: 233 23% 22%;
--ring: 221 70% 72%;
--radius: 0.625rem;
--sidebar-background: 235 28% 10%;
--sidebar-foreground: 226 45% 84%;
--sidebar-primary: 221 70% 72%;
--sidebar-primary-foreground: 235 25% 12%;
--sidebar-accent: 233 23% 20%;
--sidebar-accent-foreground: 226 48% 86%;
--sidebar-border: 233 20% 24%;
--sidebar-ring: 221 70% 72%;
--dg-bg-primary: #1a1b26;
--dg-bg-secondary: #24283b;
--dg-bg-tertiary: #2f3549;
--dg-bg-hover: #3b4261;
--dg-bg-active: #414868;
--dg-border: #3b4261;
--dg-border-light: #292e42;
--dg-border-hover: #565f89;
--dg-text-primary: #c0caf5;
--dg-text-secondary: #9aa5ce;
--dg-text-muted: #737aa2;
--dg-blue: #7aa2f7;
--dg-green: #9ece6a;
--dg-red: #f7768e;
--dg-orange: #ff9e64;
--dg-purple: #bb9af7;
--dg-cyan: #7dcfff;
--dg-yellow: #e0af68;
--dg-card-hover-border: rgba(122, 162, 247, 0.45);
--dg-gradient-start: #7aa2f7;
--dg-gradient-end: #bb9af7;
--dg-gradient-text-start: #7aa2f7;
--dg-gradient-text-end: #7dcfff;
--dg-input-focus-ring: rgba(122, 162, 247, 0.22);
--chart-grid: #3b4261;
--chart-axis: #737aa2;
--chart-tooltip-bg: #24283b;
--chart-tooltip-border: #3b4261;
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.35), 0 0 0 1px rgba(122, 162, 247, 0.06);
--shadow-card-hover: 0 8px 32px rgba(0, 0, 0, 0.45), 0 0 0 1px rgba(187, 154, 247, 0.18);
--shadow-dropdown: 0 10px 40px rgba(0, 0, 0, 0.55);
--skeleton-base: #2f3549;
--skeleton-highlight: #3b4261;
--dg-overlay: color-mix(in srgb, #15161e 58%, transparent);
}
/* ===== Theme 7: Nord(保留兼容,已从选择器下架) // Logan.Li ===== */
[data-theme="nord"] {
--background: 220 16% 22%;
--foreground: 218 27% 92%;
--card: 220 16% 19%;
--card-foreground: 218 27% 92%;
--popover: 220 16% 19%;
--popover-foreground: 218 27% 92%;
--primary: 193 43% 67%;
--primary-foreground: 220 16% 22%;
--secondary: 220 16% 28%;
--secondary-foreground: 218 27% 92%;
--muted: 220 16% 28%;
--muted-foreground: 220 16% 56%;
--accent: 220 16% 28%;
--accent-foreground: 218 27% 92%;
--destructive: 354 42% 56%;
--destructive-foreground: 218 27% 92%;
--border: 220 16% 28%;
--input: 220 16% 28%;
--ring: 193 43% 67%;
--radius: 0.625rem;
--sidebar-background: 220 16% 18%;
--sidebar-foreground: 218 27% 88%;
--sidebar-primary: 193 43% 67%;
--sidebar-primary-foreground: 220 16% 22%;
--sidebar-accent: 220 16% 28%;
--sidebar-accent-foreground: 218 27% 92%;
--sidebar-border: 220 16% 28%;
--sidebar-ring: 193 43% 67%;
--dg-bg-primary: #2e3440;
--dg-bg-secondary: #3b4252;
--dg-bg-tertiary: #434c5e;
--dg-bg-hover: #4c566a;
--dg-bg-active: #5e6a7e;
--dg-border: #4c566a;
--dg-border-light: #434c5e;
--dg-border-hover: #5e6a7e;
--dg-text-primary: #eceff4;
--dg-text-secondary: #d8dee9;
--dg-text-muted: #a0a8b8;
--dg-blue: #81a1c1;
--dg-green: #a3be8c;
--dg-red: #bf616a;
--dg-orange: #d08770;
--dg-purple: #b48ead;
--dg-cyan: #88c0d0;
--dg-yellow: #ebcb8b;
--dg-card-hover-border: rgba(136, 192, 208, 0.45);
--dg-gradient-start: #5e81ac;
--dg-gradient-end: #88c0d0;
--dg-gradient-text-start: #88c0d0;
--dg-gradient-text-end: #81a1c1;
--dg-input-focus-ring: rgba(136, 192, 208, 0.2);
--chart-grid: #4c566a;
--chart-axis: #a0a8b8;
--chart-tooltip-bg: #3b4252;
--chart-tooltip-border: #4c566a;
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(136, 192, 208, 0.05);
--shadow-card-hover: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(136, 192, 208, 0.15);
--shadow-dropdown: 0 10px 40px rgba(0, 0, 0, 0.5);
--skeleton-base: #2b1f16;
--skeleton-highlight: #3d2d20;
--skeleton-base: #434c5e;
--skeleton-highlight: #4c566a;
--dg-overlay: color-mix(in srgb, #2e3440 55%, transparent);
}
/*
* ===== AIOps 设计令牌(Design Tokens)// Logan.Li =====
*
* 层级:--dg-* 主题原色 → --surface-* / --text-* 语义别名 → .dg-* 工具类
*
* 表面:--surface-canvas 页面底 | --surface-raised 卡片 | --surface-inset 输入/嵌套
* 文字:--text-primary 标题正文 | --text-secondary 次要 | --text-tertiary 辅助
* 边框:--border-default 常规 | --border-subtle 弱分割 | --border-strong 强调
* 品牌:--brand 主色 | --brand-muted 浅色底
* 图表:--chart-1 … --chart-7 与语义色一一对应
* 布局:--space-page 页面区块 | --layout-* 应用壳(侧栏/顶栏/内边距)
* 告警:--alert-warning-* / --alert-error-* 横幅语义色
* 主题:data-theme-preference 用户选择 | data-theme 实际生效主题
* 主流:system / ocean-deep(蓝黑) / light-professional
* 开发者:one-dark(暖灰) / dracula(紫粉) / tokyo-night(霓虹) / catppuccin
*
* 布局层级:dg-app-shell → dg-app-content → PageShell(.dg-page) → ContentPanel
*/
:root,
[data-theme] {
--surface-canvas: var(--dg-bg-primary);
--surface-raised: var(--dg-bg-secondary);
--surface-inset: var(--dg-bg-tertiary);
--surface-hover: var(--dg-bg-hover);
--surface-active: var(--dg-bg-active);
--text-primary: var(--dg-text-primary);
--text-secondary: var(--dg-text-secondary);
--text-tertiary: var(--dg-text-muted);
--border-default: var(--dg-border);
--border-subtle: var(--dg-border-light);
--border-strong: var(--dg-border-hover);
--brand: var(--dg-blue);
--brand-muted: color-mix(in srgb, var(--dg-blue) 14%, transparent);
/* 主按钮 — 纯色品牌,禁止渐变(企业严肃风) // Logan.Li */
--btn-primary-bg: var(--brand);
--btn-primary-hover: color-mix(in srgb, var(--brand) 86%, #000);
--btn-primary-fg: #ffffff;
--btn-primary-border: color-mix(in srgb, var(--brand) 75%, transparent);
--btn-primary-shadow: color-mix(in srgb, var(--brand) 18%, transparent);
--chart-1: var(--dg-blue);
--chart-2: var(--dg-green);
--chart-3: var(--dg-purple);
--chart-4: var(--dg-orange);
--chart-5: var(--dg-cyan);
--chart-6: var(--dg-yellow);
--chart-7: var(--dg-red);
--space-page: 1.5rem;
--space-section: 1rem;
--space-inline: 0.75rem;
--radius-card: 0.75rem;
--radius-control: 0.5rem;
--alert-warning-bg: color-mix(in srgb, var(--dg-yellow) 8%, transparent);
--alert-warning-border: color-mix(in srgb, var(--dg-yellow) 30%, transparent);
--alert-warning-text: var(--dg-yellow);
--alert-error-bg: color-mix(in srgb, var(--dg-red) 8%, transparent);
--alert-error-border: color-mix(in srgb, var(--dg-red) 30%, transparent);
--alert-error-text: var(--dg-red);
/* 全局布局节奏 — MainLayout / PageShell 单源 // Logan.Li */
--layout-sidebar-expanded: 16rem;
--layout-sidebar-collapsed: 4rem;
--layout-header-height: 3.5rem;
--layout-page-padding-x: 1.5rem;
--layout-page-padding-y: 1.5rem;
--layout-breadcrumb-gap: 1rem;
--layout-content-max: 100%;
--layout-footer-height: 3rem;
}
}
@@ -409,9 +616,62 @@
background: linear-gradient(to bottom right, var(--dg-gradient-start), var(--dg-gradient-end));
}
/* ===== 页面标题图标槽(单色图标 + 嵌套表面,避免渐变底) // Logan.Li ===== */
.dg-icon-box {
@apply shrink-0 w-10 h-10 rounded-lg flex items-center justify-center;
background: var(--surface-inset);
border: 1px solid var(--border-subtle);
color: var(--brand);
}
/* ===== 区块标题 / 告警横幅 ===== */
.dg-section-title {
@apply text-sm font-medium mb-4;
color: var(--text-primary);
}
.dg-alert-banner {
@apply rounded-lg border p-4;
background: var(--alert-warning-bg);
border-color: var(--alert-warning-border);
}
.dg-alert-banner-title {
@apply text-sm font-medium;
color: var(--alert-warning-text);
}
/* ===== 应用级布局壳(MainLayout 单源) // Logan.Li ===== */
.dg-app-shell {
min-height: 100vh;
background-color: var(--surface-canvas);
transition: background-color 0.3s ease, color 0.3s ease;
}
.dg-app-main {
display: flex;
flex-direction: column;
flex: 1;
min-height: 100vh;
padding-top: var(--layout-header-height);
}
.dg-app-breadcrumb {
padding: var(--layout-breadcrumb-gap) var(--layout-page-padding-x) 0;
}
.dg-app-content {
flex: 1;
padding: var(--layout-page-padding-y) var(--layout-page-padding-x);
min-height: 0;
max-width: var(--layout-content-max);
width: 100%;
}
.dg-app-footer {
padding: 0.75rem var(--layout-page-padding-x);
border-top: 1px solid var(--border-default);
margin-top: auto;
}
/* ===== Page Container ===== */
.dg-page {
@apply space-y-6 animate-fade-in;
gap: var(--space-page);
@apply flex flex-col animate-fade-in w-full;
}
.dg-page-header {
@apply flex items-center justify-between flex-wrap gap-4;
@@ -425,17 +685,51 @@
.dg-page-actions {
@apply flex items-center gap-2 flex-wrap;
}
.dg-page-toolbar {
@apply flex items-center gap-3 flex-wrap py-1;
}
.dg-page-tabs {
@apply w-full;
}
.dg-page-tab {
@apply outline-none focus-visible:ring-2 focus-visible:ring-[var(--brand)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--surface-canvas)] rounded-t-md;
}
/* ===== 内容面板(列表页表格容器) // Logan.Li ===== */
.dg-content-panel {
@apply bg-[var(--surface-raised)] border border-[var(--border-default)] rounded-xl overflow-hidden;
box-shadow: var(--shadow-card);
}
.dg-content-panel-toolbar {
@apply flex items-center justify-between flex-wrap gap-3 p-4 border-b border-[var(--border-default)];
}
.dg-content-panel-body {
@apply p-0;
}
/* ===== 表面层级快捷类 ===== */
.dg-surface-canvas { background-color: var(--surface-canvas); }
.dg-surface-raised { background-color: var(--surface-raised); }
.dg-surface-inset { background-color: var(--surface-inset); }
/* ===== Buttons ===== */
.dg-btn {
@apply inline-flex items-center justify-center gap-2 px-4 py-2 rounded-lg text-sm font-medium transition-all duration-200;
}
.dg-btn-primary {
@apply dg-btn dg-gradient-bg text-white hover:opacity-90 active:scale-[0.98];
box-shadow: 0 4px 16px color-mix(in srgb, var(--dg-gradient-start) 25%, transparent);
@apply dg-btn active:scale-[0.98];
background: var(--btn-primary-bg);
color: var(--btn-primary-fg);
border: 1px solid var(--btn-primary-border);
box-shadow: 0 1px 2px var(--btn-primary-shadow);
}
.dg-btn-primary:hover {
box-shadow: 0 6px 24px color-mix(in srgb, var(--dg-gradient-start) 35%, transparent);
background: var(--btn-primary-hover);
box-shadow: 0 2px 6px var(--btn-primary-shadow);
}
.dg-btn-primary:disabled {
opacity: 0.55;
box-shadow: none;
}
.dg-btn-secondary {
@apply dg-btn bg-[var(--dg-bg-tertiary)] text-[var(--dg-text-primary)] border border-[var(--dg-border)] hover:bg-[var(--dg-bg-hover)] hover:border-[var(--dg-border-hover)] active:scale-[0.98];
@@ -444,7 +738,13 @@
@apply dg-btn text-[var(--dg-text-secondary)] hover:bg-[var(--dg-bg-hover)] hover:text-[var(--dg-text-primary)];
}
.dg-btn-danger {
@apply dg-btn bg-red-500/10 text-red-400 border border-red-500/20 hover:bg-red-500/20 active:scale-[0.98];
@apply dg-btn active:scale-[0.98];
background: color-mix(in srgb, var(--dg-red) 12%, transparent);
color: var(--dg-red);
border: 1px solid color-mix(in srgb, var(--dg-red) 28%, transparent);
}
.dg-btn-danger:hover {
background: color-mix(in srgb, var(--dg-red) 20%, transparent);
}
.dg-btn-sm {
@apply px-3 py-1.5 text-xs;
@@ -453,50 +753,95 @@
@apply px-6 py-3 text-base;
}
/* ===== Badges ===== */
/* ===== Semantic accent text(各主题 --dg-* 驱动) // Logan.Li ===== */
.dg-text-blue { color: var(--dg-blue); }
.dg-text-green { color: var(--dg-green); }
.dg-text-red { color: var(--dg-red); }
.dg-text-orange { color: var(--dg-orange); }
.dg-text-yellow { color: var(--dg-yellow); }
.dg-text-purple { color: var(--dg-purple); }
.dg-text-cyan { color: var(--dg-cyan); }
/* ===== Badges(color-mix 柔化背景,避免高对比硬色) // Logan.Li ===== */
.dg-badge {
@apply inline-flex items-center px-2 py-0.5 rounded-md text-xs font-medium;
@apply inline-flex items-center px-2 py-0.5 rounded-md text-xs font-medium border;
}
.dg-badge-blue {
@apply dg-badge bg-blue-500/10 text-blue-400;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-blue) 14%, transparent);
color: var(--dg-blue);
border-color: color-mix(in srgb, var(--dg-blue) 28%, transparent);
}
.dg-badge-green {
@apply dg-badge bg-green-500/10 text-green-400;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-green) 14%, transparent);
color: var(--dg-green);
border-color: color-mix(in srgb, var(--dg-green) 28%, transparent);
}
.dg-badge-red {
@apply dg-badge bg-red-500/10 text-red-400;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-red) 14%, transparent);
color: var(--dg-red);
border-color: color-mix(in srgb, var(--dg-red) 28%, transparent);
}
.dg-badge-yellow {
@apply dg-badge bg-yellow-500/10 text-yellow-400;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-yellow) 14%, transparent);
color: var(--dg-yellow);
border-color: color-mix(in srgb, var(--dg-yellow) 28%, transparent);
}
.dg-badge-purple {
@apply dg-badge bg-purple-500/10 text-purple-400;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-purple) 14%, transparent);
color: var(--dg-purple);
border-color: color-mix(in srgb, var(--dg-purple) 28%, transparent);
}
.dg-badge-orange {
@apply dg-badge bg-orange-500/10 text-orange-400;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-orange) 14%, transparent);
color: var(--dg-orange);
border-color: color-mix(in srgb, var(--dg-orange) 28%, transparent);
}
.dg-badge-cyan {
@apply dg-badge bg-cyan-500/10 text-cyan-400;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-cyan) 14%, transparent);
color: var(--dg-cyan);
border-color: color-mix(in srgb, var(--dg-cyan) 28%, transparent);
}
.dg-badge-muted {
@apply dg-badge bg-[var(--dg-bg-tertiary)] text-[var(--dg-text-secondary)] border border-[var(--dg-border)];
@apply dg-badge bg-[var(--dg-bg-tertiary)] text-[var(--dg-text-secondary)] border-[var(--dg-border)];
}
/* ===== Status Badges ===== */
.dg-status-running {
@apply dg-badge bg-green-500/10 text-green-400 border border-green-500/20;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-green) 14%, transparent);
color: var(--dg-green);
border-color: color-mix(in srgb, var(--dg-green) 28%, transparent);
}
.dg-status-stopped {
@apply dg-badge bg-gray-500/10 text-gray-400 border border-gray-500/20;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-text-muted) 14%, transparent);
color: var(--dg-text-secondary);
border-color: color-mix(in srgb, var(--dg-text-muted) 28%, transparent);
}
.dg-status-warning {
@apply dg-badge bg-yellow-500/10 text-yellow-400 border border-yellow-500/20;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-yellow) 14%, transparent);
color: var(--dg-yellow);
border-color: color-mix(in srgb, var(--dg-yellow) 28%, transparent);
}
.dg-status-error {
@apply dg-badge bg-red-500/10 text-red-400 border border-red-500/20;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-red) 14%, transparent);
color: var(--dg-red);
border-color: color-mix(in srgb, var(--dg-red) 28%, transparent);
}
.dg-status-info {
@apply dg-badge bg-blue-500/10 text-blue-400 border border-blue-500/20;
@apply dg-badge;
background: color-mix(in srgb, var(--dg-blue) 14%, transparent);
color: var(--dg-blue);
border-color: color-mix(in srgb, var(--dg-blue) 28%, transparent);
}
/* ===== Scrollbar ===== */
@@ -589,16 +934,17 @@
@apply w-2 h-2 rounded-full;
}
.status-dot-running {
@apply bg-emerald-400 animate-pulse;
background-color: var(--dg-green);
@apply animate-pulse;
}
.status-dot-stopped {
@apply bg-slate-400;
background-color: var(--dg-text-muted);
}
.status-dot-warning {
@apply bg-amber-400;
background-color: var(--dg-yellow);
}
.status-dot-error {
@apply bg-red-400;
background-color: var(--dg-red);
}
/* ===== Chart theme-aware utilities ===== */
@@ -656,6 +1002,16 @@ td {
color: var(--dg-text-primary);
}
select {
background-color: var(--dg-bg-tertiary);
border: 1px solid var(--dg-border);
color: var(--dg-text-primary);
}
select option {
background-color: var(--dg-bg-secondary);
color: var(--dg-text-primary);
}
input:focus,
textarea:focus,
select:focus {
@@ -696,10 +1052,10 @@ button {
box-shadow: var(--shadow-dropdown) !important;
}
/* Dialog overlay */
/* Dialog overlay — 柔化遮罩,避免纯黑高对比 // Logan.Li */
[data-state='open'] > [data-radix-dialog-overlay] {
@apply backdrop-blur-sm;
background-color: color-mix(in srgb, var(--dg-bg-primary) 80%, transparent);
background-color: var(--dg-overlay) !important;
}
/* Dropdown menu styling */