Files
aiops/frontend/src/index.css
T
Logan.Li 6c82ca9031 refactor(frontend): 主题精简为双主题
- 移除与深海蓝视觉重复的 4 个开发者暗色主题(One Dark/Dracula/Tokyo Night/Catppuccin)
- 仅保留 跟随系统/深海蓝/明亮白;删除 5 段主题 CSS 与下架文案
- 旧主题存量值统一迁移到深海蓝,ThemePicker 改为扁平列表
2026-09-14 15:28:15 +08:00

855 lines
26 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@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);
}
}