@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); } }