- 移除与深海蓝视觉重复的 4 个开发者暗色主题(One Dark/Dracula/Tokyo Night/Catppuccin) - 仅保留 跟随系统/深海蓝/明亮白;删除 5 段主题 CSS 与下架文案 - 旧主题存量值统一迁移到深海蓝,ThemePicker 改为扁平列表
855 lines
26 KiB
CSS
855 lines
26 KiB
CSS
@tailwind base;
|
||
@tailwind components;
|
||
@tailwind utilities;
|
||
|
||
@layer base {
|
||
/* ===== Theme 1: Ocean Deep (深海蓝) — Default ===== */
|
||
:root,
|
||
[data-theme="ocean-deep"] {
|
||
--background: 220 13% 5%;
|
||
--foreground: 210 40% 98%;
|
||
--card: 220 13% 7%;
|
||
--card-foreground: 210 40% 98%;
|
||
--popover: 220 13% 7%;
|
||
--popover-foreground: 210 40% 98%;
|
||
--primary: 217 91% 60%;
|
||
--primary-foreground: 0 0% 100%;
|
||
--secondary: 220 13% 14%;
|
||
--secondary-foreground: 210 40% 98%;
|
||
--muted: 220 13% 14%;
|
||
--muted-foreground: 215 20% 55%;
|
||
--accent: 220 13% 14%;
|
||
--accent-foreground: 210 40% 98%;
|
||
--destructive: 0 62% 50%;
|
||
--destructive-foreground: 0 0% 100%;
|
||
--border: 220 13% 18%;
|
||
--input: 220 13% 14%;
|
||
--ring: 217 91% 60%;
|
||
--radius: 0.625rem;
|
||
--sidebar-background: 220 13% 7%;
|
||
--sidebar-foreground: 210 40% 90%;
|
||
--sidebar-primary: 217 91% 60%;
|
||
--sidebar-primary-foreground: 0 0% 100%;
|
||
--sidebar-accent: 220 13% 14%;
|
||
--sidebar-accent-foreground: 210 40% 98%;
|
||
--sidebar-border: 220 13% 18%;
|
||
--sidebar-ring: 217 91% 60%;
|
||
--dg-bg-primary: #0d1117;
|
||
--dg-bg-secondary: #161b22;
|
||
--dg-bg-tertiary: #21262d;
|
||
--dg-bg-hover: #30363d;
|
||
--dg-bg-active: #3d444d;
|
||
--dg-border: #30363d;
|
||
--dg-border-light: #21262d;
|
||
--dg-border-hover: #484f58;
|
||
--dg-text-primary: #e6edf3;
|
||
--dg-text-secondary: #9aa4af;
|
||
--dg-text-muted: #768390;
|
||
--dg-blue: #58a6ff;
|
||
--dg-green: #3fb950;
|
||
--dg-red: #f85149;
|
||
--dg-orange: #f0883e;
|
||
--dg-purple: #8957e5;
|
||
--dg-cyan: #39c5cf;
|
||
--dg-yellow: #d29922;
|
||
--dg-card-hover-border: rgba(88, 166, 255, 0.5);
|
||
--dg-gradient-start: #2563eb;
|
||
--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;
|
||
--chart-tooltip-bg: #0f172a;
|
||
--chart-tooltip-border: #1e293b;
|
||
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.02);
|
||
--shadow-card-hover: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(88, 166, 255, 0.15);
|
||
--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: 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% 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: 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% 16%;
|
||
--sidebar-border: 220 13% 91%;
|
||
--sidebar-ring: 217 91% 60%;
|
||
--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;
|
||
--dg-orange: #ea580c;
|
||
--dg-purple: #7c3aed;
|
||
--dg-cyan: #0891b2;
|
||
--dg-yellow: #ca8a04;
|
||
--dg-card-hover-border: rgba(37, 99, 235, 0.3);
|
||
--dg-gradient-start: #2563eb;
|
||
--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;
|
||
--chart-tooltip-bg: #ffffff;
|
||
--chart-tooltip-border: #e2e5eb;
|
||
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.06), 0 0 0 1px rgba(0, 0, 0, 0.04);
|
||
--shadow-card-hover: 0 8px 32px rgba(0, 0, 0, 0.1), 0 0 0 1px rgba(37, 99, 235, 0.1);
|
||
--shadow-dropdown: 0 10px 40px rgba(0, 0, 0, 0.12);
|
||
--skeleton-base: #f0f1f5;
|
||
--skeleton-highlight: #e8eaef;
|
||
}
|
||
/*
|
||
* ===== 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 实际生效主题
|
||
* 仅保留 双主题:ocean-deep(深海蓝暗色) / light-professional(明亮白浅色) + system 跟随系统
|
||
*
|
||
* 布局层级: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;
|
||
}
|
||
}
|
||
|
||
@layer base {
|
||
* {
|
||
@apply border-border;
|
||
}
|
||
|
||
html {
|
||
scroll-behavior: smooth;
|
||
}
|
||
|
||
body {
|
||
@apply bg-[var(--dg-bg-primary)] text-[var(--dg-text-primary)] antialiased;
|
||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
|
||
font-feature-settings: 'rlig' 1, 'calt' 1;
|
||
transition: background-color 0.3s ease, color 0.3s ease;
|
||
}
|
||
|
||
/* Fix: Radix Dialog scroll-lock adds padding-right to body, causing layout shift. */
|
||
body[data-scroll-locked],
|
||
body[data-radix-scroll-locked],
|
||
body[style*='padding-right'] {
|
||
padding-right: 0 !important;
|
||
}
|
||
|
||
code,
|
||
pre,
|
||
.font-mono {
|
||
font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', 'SF Mono', monospace;
|
||
}
|
||
|
||
/* ===== Selection Color (theme-aware) ===== */
|
||
::selection {
|
||
background-color: var(--dg-blue);
|
||
color: white;
|
||
}
|
||
}
|
||
|
||
@layer utilities {
|
||
/* ===== Design System Card / Input ===== */
|
||
.dg-card {
|
||
@apply bg-[var(--dg-bg-secondary)] border border-[var(--dg-border)] rounded-xl;
|
||
box-shadow: var(--shadow-card);
|
||
transition: background-color 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease, transform 0.3s ease;
|
||
}
|
||
.dg-card-hover {
|
||
@apply transition-all duration-300;
|
||
}
|
||
.dg-card-hover:hover {
|
||
border-color: var(--dg-card-hover-border);
|
||
box-shadow: var(--shadow-card-hover);
|
||
transform: translateY(-2px);
|
||
}
|
||
.dg-input {
|
||
@apply bg-[var(--dg-bg-tertiary)] border-[var(--dg-border)] text-[var(--dg-text-primary)] placeholder:text-[var(--dg-text-muted)] focus:border-[var(--dg-blue)] focus:ring-1 rounded-lg;
|
||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||
}
|
||
.dg-input:focus {
|
||
--tw-ring-color: var(--dg-input-focus-ring);
|
||
box-shadow: 0 0 0 3px var(--dg-input-focus-ring);
|
||
}
|
||
.dg-text-muted {
|
||
color: var(--dg-text-muted);
|
||
}
|
||
.dg-text-secondary {
|
||
color: var(--dg-text-secondary);
|
||
}
|
||
.dg-gradient-text {
|
||
background: linear-gradient(to right, var(--dg-gradient-text-start), var(--dg-gradient-text-end));
|
||
-webkit-background-clip: text;
|
||
-webkit-text-fill-color: transparent;
|
||
background-clip: text;
|
||
}
|
||
.dg-gradient-bg {
|
||
background: linear-gradient(to right, var(--dg-gradient-start), var(--dg-gradient-end));
|
||
}
|
||
.dg-gradient-br {
|
||
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;
|
||
}
|
||
|
||
/* ===== 手机端布局:抽屉导航与紧凑内容节奏 // Logan.Li ===== */
|
||
.dg-mobile-nav-backdrop {
|
||
display: none;
|
||
}
|
||
|
||
@media (max-width: 767px) {
|
||
:root,
|
||
[data-theme] {
|
||
--layout-page-padding-x: 1rem;
|
||
--layout-page-padding-y: 1rem;
|
||
--layout-breadcrumb-gap: 0.75rem;
|
||
}
|
||
|
||
.dg-app-shell {
|
||
overflow-x: clip;
|
||
}
|
||
body.dg-mobile-nav-open {
|
||
overflow: hidden;
|
||
}
|
||
.dg-app-workspace,
|
||
.dg-app-header {
|
||
margin-left: 0 !important;
|
||
}
|
||
.dg-sidebar {
|
||
width: min(86vw, 20rem) !important;
|
||
transform: translateX(-100%);
|
||
box-shadow: var(--shadow-dropdown);
|
||
transition: transform 0.25s ease;
|
||
}
|
||
.dg-sidebar[data-mobile-open='true'] {
|
||
transform: translateX(0);
|
||
}
|
||
.dg-mobile-nav-backdrop {
|
||
display: block;
|
||
position: fixed;
|
||
inset: 0;
|
||
z-index: 35;
|
||
border: 0;
|
||
background: var(--dg-overlay);
|
||
opacity: 0;
|
||
pointer-events: none;
|
||
transition: opacity 0.25s ease;
|
||
}
|
||
.dg-sidebar[data-mobile-open='true'] + .dg-mobile-nav-backdrop {
|
||
opacity: 1;
|
||
pointer-events: auto;
|
||
}
|
||
.dg-app-breadcrumb {
|
||
min-width: 0;
|
||
}
|
||
.dg-app-content {
|
||
overflow-x: hidden;
|
||
}
|
||
.dg-app-footer {
|
||
display: none;
|
||
}
|
||
.dg-page {
|
||
gap: 1rem;
|
||
min-width: 0;
|
||
}
|
||
.dg-page-header {
|
||
align-items: flex-start;
|
||
gap: 0.75rem;
|
||
}
|
||
.dg-page-title {
|
||
font-size: 1.5rem;
|
||
line-height: 2rem;
|
||
}
|
||
.dg-page-actions {
|
||
width: 100%;
|
||
}
|
||
.dg-page-toolbar,
|
||
.dg-content-panel-toolbar {
|
||
align-items: stretch;
|
||
gap: 0.75rem;
|
||
}
|
||
.dg-content-panel-toolbar {
|
||
padding: 0.75rem;
|
||
}
|
||
.dg-page-tabs {
|
||
overflow-x: auto;
|
||
scrollbar-width: none;
|
||
}
|
||
.dg-page-tabs::-webkit-scrollbar {
|
||
display: none;
|
||
}
|
||
}
|
||
|
||
/* ===== Page Container ===== */
|
||
.dg-page {
|
||
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;
|
||
}
|
||
.dg-page-title {
|
||
@apply text-2xl font-bold text-[var(--dg-text-primary)] tracking-tight;
|
||
}
|
||
.dg-page-subtitle {
|
||
@apply text-sm text-[var(--dg-text-muted)] mt-1;
|
||
}
|
||
.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 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 {
|
||
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];
|
||
}
|
||
.dg-btn-ghost {
|
||
@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 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;
|
||
}
|
||
.dg-btn-lg {
|
||
@apply px-6 py-3 text-base;
|
||
}
|
||
|
||
/* ===== 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 border;
|
||
}
|
||
.dg-badge-blue {
|
||
@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;
|
||
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;
|
||
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;
|
||
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;
|
||
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;
|
||
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;
|
||
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-[var(--dg-border)];
|
||
}
|
||
|
||
/* ===== Status Badges ===== */
|
||
.dg-status-running {
|
||
@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;
|
||
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;
|
||
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;
|
||
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;
|
||
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 ===== */
|
||
.scrollbar-thin {
|
||
scrollbar-width: thin;
|
||
scrollbar-color: var(--dg-border) transparent;
|
||
}
|
||
.scrollbar-thin::-webkit-scrollbar {
|
||
width: 6px;
|
||
height: 6px;
|
||
}
|
||
.scrollbar-thin::-webkit-scrollbar-track {
|
||
background: transparent;
|
||
}
|
||
.scrollbar-thin::-webkit-scrollbar-thumb {
|
||
background: var(--dg-border);
|
||
border-radius: 3px;
|
||
}
|
||
.scrollbar-thin::-webkit-scrollbar-thumb:hover {
|
||
background: var(--dg-text-muted);
|
||
}
|
||
|
||
/* ===== Animations ===== */
|
||
@keyframes fade-in {
|
||
from { opacity: 0; transform: translateY(8px); }
|
||
to { opacity: 1; transform: translateY(0); }
|
||
}
|
||
.animate-fade-in {
|
||
animation: fade-in 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards;
|
||
}
|
||
.animate-fade-in-delay-1 {
|
||
animation: fade-in 0.35s cubic-bezier(0.16, 1, 0.3, 1) 0.05s both;
|
||
}
|
||
.animate-fade-in-delay-2 {
|
||
animation: fade-in 0.35s cubic-bezier(0.16, 1, 0.3, 1) 0.1s both;
|
||
}
|
||
.animate-fade-in-delay-3 {
|
||
animation: fade-in 0.35s cubic-bezier(0.16, 1, 0.3, 1) 0.15s both;
|
||
}
|
||
.animate-fade-in-delay-4 {
|
||
animation: fade-in 0.35s cubic-bezier(0.16, 1, 0.3, 1) 0.2s both;
|
||
}
|
||
|
||
@keyframes scale-in {
|
||
from { opacity: 0; transform: scale(0.95); }
|
||
to { opacity: 1; transform: scale(1); }
|
||
}
|
||
.animate-scale-in {
|
||
animation: scale-in 0.25s cubic-bezier(0.16, 1, 0.3, 1) forwards;
|
||
}
|
||
|
||
@keyframes slide-in-right {
|
||
from { opacity: 0; transform: translateX(20px); }
|
||
to { opacity: 1; transform: translateX(0); }
|
||
}
|
||
.animate-slide-in-right {
|
||
animation: slide-in-right 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards;
|
||
}
|
||
|
||
@keyframes pulse-ring {
|
||
0% { transform: scale(0.8); opacity: 0.5; }
|
||
100% { transform: scale(1.2); opacity: 0; }
|
||
}
|
||
.animate-pulse-ring {
|
||
animation: pulse-ring 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
||
}
|
||
|
||
/* Skeleton shimmer */
|
||
@keyframes shimmer {
|
||
0% { background-position: -200% 0; }
|
||
100% { background-position: 200% 0; }
|
||
}
|
||
.dg-skeleton {
|
||
background: linear-gradient(90deg, var(--skeleton-base) 25%, var(--skeleton-highlight) 50%, var(--skeleton-base) 75%);
|
||
background-size: 200% 100%;
|
||
animation: shimmer 1.5s ease-in-out infinite;
|
||
border-radius: 0.5rem;
|
||
}
|
||
|
||
/* ===== Glass effect ===== */
|
||
.glass {
|
||
background: color-mix(in srgb, var(--dg-bg-secondary) 75%, transparent);
|
||
backdrop-filter: blur(16px);
|
||
-webkit-backdrop-filter: blur(16px);
|
||
border: 1px solid var(--dg-border);
|
||
}
|
||
|
||
/* ===== Status indicators ===== */
|
||
.status-dot {
|
||
@apply w-2 h-2 rounded-full;
|
||
}
|
||
.status-dot-running {
|
||
background-color: var(--dg-green);
|
||
@apply animate-pulse;
|
||
}
|
||
.status-dot-stopped {
|
||
background-color: var(--dg-text-muted);
|
||
}
|
||
.status-dot-warning {
|
||
background-color: var(--dg-yellow);
|
||
}
|
||
.status-dot-error {
|
||
background-color: var(--dg-red);
|
||
}
|
||
|
||
/* ===== Chart theme-aware utilities ===== */
|
||
.chart-grid-stroke {
|
||
stroke: var(--chart-grid);
|
||
}
|
||
.chart-axis-stroke {
|
||
stroke: var(--chart-axis);
|
||
}
|
||
.chart-tooltip {
|
||
background-color: var(--chart-tooltip-bg) !important;
|
||
border: 1px solid var(--chart-tooltip-border) !important;
|
||
border-radius: 6px !important;
|
||
color: var(--dg-text-primary) !important;
|
||
box-shadow: var(--shadow-dropdown) !important;
|
||
}
|
||
|
||
/* ===== Table improvements ===== */
|
||
.dg-table-row {
|
||
@apply transition-colors duration-150;
|
||
}
|
||
.dg-table-row:hover {
|
||
background-color: color-mix(in srgb, var(--dg-bg-hover) 50%, transparent);
|
||
}
|
||
|
||
/* ===== Focus ring (theme-aware) ===== */
|
||
.dg-focus-ring:focus-visible {
|
||
outline: none;
|
||
box-shadow: 0 0 0 2px var(--dg-bg-primary), 0 0 0 4px var(--dg-blue);
|
||
}
|
||
}
|
||
|
||
/* ===== Global element styling ===== */
|
||
pre {
|
||
@apply rounded-lg p-4 overflow-x-auto;
|
||
background-color: var(--dg-bg-tertiary);
|
||
border: 1px solid var(--dg-border);
|
||
}
|
||
|
||
code {
|
||
@apply font-mono text-sm;
|
||
}
|
||
|
||
table {
|
||
@apply w-full;
|
||
}
|
||
|
||
th {
|
||
@apply text-left font-medium text-xs uppercase tracking-wider;
|
||
color: var(--dg-text-secondary);
|
||
}
|
||
|
||
td {
|
||
@apply text-sm;
|
||
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 {
|
||
outline: none;
|
||
box-shadow: 0 0 0 2px var(--dg-bg-primary), 0 0 0 4px var(--dg-blue);
|
||
border-color: var(--dg-blue);
|
||
}
|
||
|
||
button {
|
||
@apply transition-all duration-200;
|
||
}
|
||
|
||
/* Terminal styling */
|
||
.terminal {
|
||
@apply font-mono text-sm;
|
||
background-color: var(--dg-bg-primary);
|
||
color: var(--dg-text-secondary);
|
||
}
|
||
.terminal .prompt {
|
||
color: var(--dg-green);
|
||
}
|
||
.terminal .command {
|
||
color: var(--dg-text-primary);
|
||
}
|
||
.terminal .output {
|
||
color: var(--dg-text-muted);
|
||
}
|
||
|
||
/* Chart tooltip styling - theme aware override */
|
||
.recharts-tooltip-wrapper {
|
||
@apply z-50;
|
||
}
|
||
.recharts-default-tooltip {
|
||
background-color: var(--chart-tooltip-bg) !important;
|
||
border-color: var(--chart-tooltip-border) !important;
|
||
color: var(--dg-text-primary) !important;
|
||
border-radius: 6px !important;
|
||
box-shadow: var(--shadow-dropdown) !important;
|
||
}
|
||
|
||
/* Dialog overlay — 柔化遮罩,避免纯黑高对比 // Logan.Li */
|
||
[data-state='open'] > [data-radix-dialog-overlay] {
|
||
@apply backdrop-blur-sm;
|
||
background-color: var(--dg-overlay) !important;
|
||
}
|
||
|
||
/* Dropdown menu styling */
|
||
[role='menuitem'] {
|
||
@apply cursor-pointer;
|
||
}
|
||
|
||
/* Progress bar animation */
|
||
@keyframes progress-indeterminate {
|
||
0% { transform: translateX(-100%); }
|
||
100% { transform: translateX(100%); }
|
||
}
|
||
.progress-indeterminate::after {
|
||
content: '';
|
||
@apply absolute inset-0 bg-current;
|
||
animation: progress-indeterminate 1.5s ease-in-out infinite;
|
||
}
|
||
|
||
/* ===== xterm.js 终端铺满容器,避免右侧黑边 // Logan.Li ===== */
|
||
.xterm-terminal-host {
|
||
width: 100%;
|
||
overflow: hidden;
|
||
background: #0a0e14;
|
||
}
|
||
.xterm-terminal-host .xterm {
|
||
height: 100%;
|
||
}
|
||
|
||
/* ===== Reduced motion support ===== */
|
||
@media (prefers-reduced-motion: reduce) {
|
||
*,
|
||
*::before,
|
||
*::after {
|
||
animation-duration: 0.01ms !important;
|
||
animation-iteration-count: 1 !important;
|
||
transition-duration: 0.01ms !important;
|
||
}
|
||
.dg-skeleton {
|
||
animation: none;
|
||
background: var(--skeleton-base);
|
||
}
|
||
}
|