754 lines
28 KiB
CSS
754 lines
28 KiB
CSS
/* static/css/input.css */
|
||
@import "tailwindcss";
|
||
|
||
/* =================================================================== */
|
||
/* [核心] 定义 shadcn/ui 的设计系统变量 */
|
||
/* =================================================================== */
|
||
@layer base {
|
||
/* 亮色模式 */
|
||
:root {
|
||
--background: theme(colors.white);
|
||
--foreground: theme(colors.zinc.900);
|
||
|
||
--muted: theme(colors.zinc.100);
|
||
--muted-foreground: theme(colors.zinc.500);
|
||
|
||
--primary: theme(colors.blue.600);
|
||
--primary-foreground: theme(colors.white);
|
||
|
||
--secondary: theme(colors.zinc.200);
|
||
--secondary-foreground: theme(colors.zinc.900);
|
||
|
||
--destructive: theme(colors.red.600);
|
||
--destructive-foreground: theme(colors.white);
|
||
--accent: theme(colors.zinc.100);
|
||
--accent-foreground: theme(colors.zinc.900);
|
||
|
||
--border: theme(colors.zinc.300); /* 统一使用 zinc 以保持一致性 */
|
||
--input: theme(colors.zinc.300);
|
||
--ring: theme(colors.blue.500);
|
||
--radius: 0.5rem;
|
||
}
|
||
|
||
/* 暗色模式 */
|
||
.dark {
|
||
--background: theme(colors.zinc.900);
|
||
--foreground: theme(colors.zinc.100);
|
||
|
||
--muted: theme(colors.zinc.900 / 0.5);
|
||
--muted-foreground: theme(colors.zinc.400);
|
||
|
||
--primary: theme(colors.blue.600); /* 亮色和暗色模式下的主色通常保持一致 */
|
||
--primary-foreground: theme(colors.white);
|
||
|
||
--secondary: theme(colors.zinc.900);
|
||
--secondary-foreground: theme(colors.zinc.100);
|
||
|
||
--destructive: theme(colors.red.700); /* 暗色模式下可以稍暗一些以保持对比度 */
|
||
--destructive-foreground: theme(colors.white);
|
||
|
||
--accent: theme(colors.zinc.700 / 0.6); /* 示例: dark:border-zinc-700/60 */
|
||
--accent-foreground: theme(colors.zinc.100);
|
||
--border: theme(colors.zinc.900);
|
||
--input: theme(colors.zinc.700);
|
||
--ring: theme(colors.blue.500);
|
||
}
|
||
}
|
||
|
||
/* =================================================================== */
|
||
/* [核心] shadcn/ui 组件层定义 */
|
||
/* =================================================================== */
|
||
@layer components {
|
||
/* --- 按钮 (Button) --- */
|
||
.btn {
|
||
@apply inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors
|
||
focus-visible:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[(var(--ring))]
|
||
disabled:pointer-events-none disabled:opacity-50;
|
||
}
|
||
.btn-primary {
|
||
@apply bg-primary text-primary-foreground hover:bg-primary/90;
|
||
}
|
||
.btn-secondary {
|
||
@apply bg-secondary text-secondary-foreground hover:bg-secondary/80;
|
||
}
|
||
.btn-destructive {
|
||
@apply bg-destructive text-destructive-foreground hover:bg-destructive/90;
|
||
}
|
||
.btn-outline {
|
||
@apply border border-input bg-background hover:bg-accent hover:text-accent-foreground;
|
||
}
|
||
.btn-ghost {
|
||
@apply hover:bg-accent hover:text-accent-foreground;
|
||
}
|
||
.btn-link {
|
||
@apply text-primary underline-offset-4 hover:underline;
|
||
}
|
||
|
||
/* 按钮尺寸变体 */
|
||
.btn-lg { @apply h-11 rounded-md px-8; }
|
||
.btn-md { @apply h-10 px-4 py-2; }
|
||
.btn-sm { @apply h-9 rounded-md px-3; }
|
||
.btn-icon { @apply h-10 w-10; }
|
||
/* --- 输入框 (Input) --- */
|
||
.input {
|
||
@apply flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm
|
||
file:border-0 file:bg-transparent file:text-sm file:font-medium
|
||
placeholder:text-muted-foreground
|
||
focus-visible:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[(var(--ring))]
|
||
disabled:cursor-not-allowed disabled:opacity-50;
|
||
}
|
||
}
|
||
|
||
@custom-variant dark (&:where(.dark, .dark *));
|
||
|
||
/* =================================================================== */
|
||
/* [核心] 主题定义层 (Theming Layer for Tailwind JIT) */
|
||
/* =================================================================== */
|
||
@theme {
|
||
/* 颜色: --color-KEY 会自动生成 bg-KEY, text-KEY, border-KEY 等 */
|
||
--color-background: var(--background);
|
||
--color-foreground: var(--foreground);
|
||
--color-muted: var(--muted);
|
||
--color-muted-foreground: var(--muted-foreground);
|
||
--color-primary: var(--primary);
|
||
--color-primary-foreground: var(--primary-foreground);
|
||
--color-secondary: var(--secondary);
|
||
--color-secondary-foreground: var(--secondary-foreground);
|
||
--color-destructive: var(--destructive);
|
||
--color-destructive-foreground: var(--destructive-foreground);
|
||
--color-accent: var(--accent);
|
||
--color-accent-foreground: var(--accent-foreground);
|
||
--color-border: var(--border);
|
||
--color-input: var(--input);
|
||
--color-ring: var(--ring);
|
||
/* 圆角: --radius-KEY 会生成 rounded-KEY */
|
||
--radius-sm: calc(var(--radius) - 4px);
|
||
--radius-md: calc(var(--radius) - 2px);
|
||
--radius-lg: var(--radius);
|
||
/* 动画 Keyframes */
|
||
@keyframes toast-in { from { opacity: 0; transform: translateY(20px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } }
|
||
@keyframes toast-out { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(20px); } }
|
||
@keyframes panel-in { from { opacity: 0; transform: translateY(-10px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } }
|
||
@keyframes panel-out { from { opacity: 1; transform: translateY(0) scale(1); } to { opacity: 0; transform: translateY(-10px) scale(0.95); } }
|
||
/* 动画工具类: --animation-KEY 生成 animate-KEY */
|
||
--animation-toast-in: toast-in 0.4s cubic-bezier(0.21, 1.02, 0.73, 1) forwards;
|
||
--animation-toast-out: toast-out 0.3s ease-out forwards;
|
||
--animation-panel-in: panel-in 0.2s ease-out;
|
||
--animation-panel-out: panel-out 0.2s ease-out forwards;
|
||
}
|
||
|
||
/* v4引擎已经为你生成了 animate-panel-in 等类,所以@apply可以找到它们 */
|
||
|
||
/* -------------------------*/
|
||
/* ------ base.html ------- */
|
||
/* ------------------------ */
|
||
|
||
/* [最终悬浮版] 细线轨道 + 宽滑块 */
|
||
.main-content-scroll::-webkit-scrollbar {
|
||
width: 16px; /* 为轨道和滑块的交互留出足够的空间 */
|
||
}
|
||
/* [核心] 使用渐变“画”出一条1px的细线作为轨道 */
|
||
.main-content-scroll::-webkit-scrollbar-track {
|
||
background: transparent; /* 轨道区域完全透明 */
|
||
background-image: linear-gradient(
|
||
to right,
|
||
transparent 7px, /* 7px 的透明空间 */
|
||
rgba(108, 108, 108, 0.1) 7px, /* 线的开始 */
|
||
rgba(100, 100, 100, 0.1) 8px, /* 线的结束 (1px宽) */
|
||
transparent 8px /* 剩余的透明空间 */
|
||
);
|
||
}
|
||
.dark .main-content-scroll::-webkit-scrollbar-track {
|
||
background-image: linear-gradient(
|
||
to right,
|
||
transparent 7px,
|
||
rgba(0, 0, 0, 0.2) 7px, /* 暗色模式的细线 */
|
||
rgba(0, 0, 0, 0.2) 8px,
|
||
transparent 8px
|
||
);
|
||
}
|
||
/* 滑块比轨道线更宽,并带有光晕效果 */
|
||
.main-content-scroll::-webkit-scrollbar-thumb {
|
||
height: 50px; /* 给滑块一个最小高度 */
|
||
background-color: rgb(222, 222, 222); /* 浅色模式 slate-500 @ 40% */
|
||
border-radius: 9999px;
|
||
|
||
/* [核心] 使用透明边框让滑块宽度只有 8px (16px - 4px*2) */
|
||
border: 5px solid transparent;
|
||
lg:border: 4px solid transparent;
|
||
background-clip: content-box;
|
||
/* 光晕效果 */
|
||
box-shadow: inset 0 0 0 1px rgba(150, 150, 150, 0.1);
|
||
transition: all 0.2s ease-in-out;
|
||
}
|
||
.dark .main-content-scroll::-webkit-scrollbar-thumb {
|
||
background-color: #181818; /* 暗色模式 zinc-900 */
|
||
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15);
|
||
}
|
||
/* 悬停时,滑块“变实”,颜色加深 */
|
||
.main-content-scroll::-webkit-scrollbar-thumb:hover {
|
||
background-color: rgb(202, 202, 202);
|
||
border-width: 4px; /* [核心交互] 透明边框消失,滑块宽度变为完整的16px,产生吸附放大的效果 */
|
||
}
|
||
.dark .main-content-scroll::-webkit-scrollbar-thumb:hover {
|
||
background-color: #151515;
|
||
}
|
||
|
||
.shadow-main { box-shadow: 0 0 25px rgba(0, 0, 0, 0.08); }
|
||
|
||
|
||
@layer components {
|
||
/* 1. 父容器: group 统一写入html */
|
||
.nav-item-wrapper {
|
||
@apply relative mx-4; /* 原始 margin: 0 1rem; -> mx-4 */
|
||
}
|
||
/* 2. 链接本身 */
|
||
.nav-link {
|
||
@apply flex items-baseline p-3 rounded-l-lg text-[#f4f4f5] justify-center lg:justify-start;
|
||
@apply transition-colors duration-200 ease-in-out;
|
||
/* 悬停状态 */
|
||
@apply group-hover:bg-[rgba(63,63,70,0.8)] dark:group-hover:bg-white/10;
|
||
}
|
||
/* 3. 图标 */
|
||
.nav-icon {
|
||
@apply w-[1.2rem] text-center;
|
||
@apply transition-all duration-300 ease-in-out;
|
||
/* 悬停和激活状态 */
|
||
@apply group-hover:text-[#60a5fa] group-hover:[filter:drop-shadow(0_0_5px_rgba(59,130,246,0.5))];
|
||
@apply group-data-[active='true']:text-[#60a5fa] group-data-[active='true']:[filter:drop-shadow(0_0_5px_rgba(59,130,246,0.7))];
|
||
}
|
||
/* 4. 指示器 */
|
||
.nav-indicator {
|
||
@apply absolute -left-4 top-0 h-full w-1 bg-[#f4f4f5] rounded-r-full pointer-events-none;
|
||
@apply opacity-0 transition-opacity duration-300 ease-in-out;
|
||
/* 激活状态 */
|
||
@apply group-data-[active='true']:opacity-100;
|
||
}
|
||
/* 5. 像素装饰文本 */
|
||
.pixel-decoration {
|
||
@apply font-['Pixelify_Sans'] text-[0.6rem] text-[#3ac06b] ml-2 relative top-px tracking-[0.5px];
|
||
@apply opacity-0 [text-shadow:0_0_5px_rgba(74,222,128,0.5)];
|
||
@apply transition-opacity duration-200 ease-in-out;
|
||
/* 悬停状态 */
|
||
@apply group-data-[active='true']:opacity-100 group-hover:opacity-100;
|
||
}
|
||
|
||
|
||
/* =================================================================== */
|
||
/* [融合版] 全局异步任务中心样式 */
|
||
/* =================================================================== */
|
||
|
||
/* --- 组件 A: Toast 通知样式 (保持不变) --- */
|
||
.toast-item {
|
||
@apply flex items-start p-3 w-full rounded-lg shadow-lg ring-1 ring-black/5 dark:ring-white/10 bg-white/80 dark:bg-zinc-800/80 backdrop-blur-md pointer-events-auto;
|
||
}
|
||
.toast-icon {
|
||
@apply flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center text-white mr-3;
|
||
}
|
||
.toast-icon-loading {@apply bg-blue-500;}
|
||
.toast-icon-success {@apply bg-green-500;}
|
||
.toast-icon-error {@apply bg-red-500;}
|
||
.toast-content {
|
||
@apply flex-grow;
|
||
}
|
||
.toast-title {
|
||
@apply font-semibold text-sm text-zinc-800 dark:text-zinc-100;
|
||
}
|
||
.toast-message {
|
||
@apply text-xs text-zinc-600 dark:text-zinc-400 mt-0.5;
|
||
}
|
||
.toast-close-btn {
|
||
@apply ml-4 text-zinc-400 hover:text-zinc-800 dark:hover:text-white transition-colors;
|
||
}
|
||
|
||
/* --- [升级] 组件 B: 多阶段任务项样式 --- */
|
||
|
||
/* 1. 任务项主容器: 移除了 flex 布局,采用块级布局容纳复杂内容 */
|
||
.task-list-item {
|
||
@apply flex justify-between items-start px-3 py-2 rounded-lg transition-colors duration-200 overflow-hidden border;
|
||
@apply hover:bg-black/5 dark:hover:bg-white/5;
|
||
@apply border-transparent dark:border-transparent;
|
||
@apply bg-zinc-50 dark:bg-zinc-800/50;
|
||
}
|
||
|
||
/* --- 任务项主内容区 (左栏) --- */
|
||
.task-item-main {
|
||
@apply flex items-center justify-between flex-grow gap-1; /* flex-grow 使其占据所有可用空间 */
|
||
}
|
||
/* 2. 任务项头部: 包含标题和时间戳 */
|
||
.task-item-header {
|
||
@apply flex justify-between items-center mb-2;
|
||
}
|
||
.task-item-title {
|
||
/* 融合了您原有的字体样式 */
|
||
@apply font-medium text-sm text-zinc-700 dark:text-zinc-200;
|
||
}
|
||
.task-item-timestamp {
|
||
/* 融合了您原有的字体样式 */
|
||
@apply text-xs self-start pt-1.5 pl-2 text-zinc-400 dark:text-zinc-500 flex-shrink-0;
|
||
}
|
||
|
||
/* 3. [新增] 阶段动画的核心容器 */
|
||
.task-stages-container {
|
||
@apply flex flex-col gap-1.5 overflow-hidden;
|
||
}
|
||
|
||
/* 4. [新增] 单个阶段的样式 */
|
||
.task-stage {
|
||
@apply flex items-center gap-2 p-1.5 rounded-md transition-all duration-300 ease-in-out relative;
|
||
}
|
||
.task-stage-icon {
|
||
@apply w-4 h-4 relative flex-shrink-0 text-zinc-400;
|
||
}
|
||
.task-stage-icon i {
|
||
@apply absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 opacity-0 transition-opacity duration-200;
|
||
}
|
||
.task-stage-content {
|
||
@apply flex-grow flex justify-between items-baseline text-xs;
|
||
}
|
||
.task-stage-name {
|
||
@apply text-zinc-600 dark:text-zinc-400;
|
||
}
|
||
.task-stage-progress-text {
|
||
@apply font-mono text-zinc-500 dark:text-zinc-500;
|
||
}
|
||
.task-stage-progress-bg {
|
||
@apply absolute bottom-0 left-0 right-0 h-0.5 bg-black/10 dark:bg-white/10 rounded-full overflow-hidden;
|
||
}
|
||
.task-stage-progress-bar {
|
||
@apply h-full w-0 rounded-full;
|
||
}
|
||
|
||
/* 5. [新增] 各阶段的状态视觉 */
|
||
/* Pending: 待处理 */
|
||
.task-stage.stage-pending { @apply opacity-40; }
|
||
.task-stage.stage-pending .fa-circle { @apply opacity-100; }
|
||
|
||
/* Active: 当前活动 */
|
||
.task-stage.stage-active {
|
||
@apply opacity-100 bg-blue-500/10;
|
||
}
|
||
.task-stage.stage-active .fa-spinner { @apply opacity-100 text-blue-500; }
|
||
.task-stage.stage-active .task-stage-name { @apply font-semibold text-zinc-800 dark:text-zinc-100; }
|
||
.task-stage.stage-active .task-stage-progress-bar { @apply bg-blue-500; }
|
||
|
||
/* Completed: 已完成 */
|
||
.task-stage.stage-completed { @apply opacity-60; }
|
||
.task-stage.stage-completed .fa-check { @apply opacity-100 text-green-500; }
|
||
.task-stage.stage-completed .task-stage-name { @apply line-through text-zinc-500 dark:text-zinc-500; }
|
||
.task-stage.stage-completed .task-stage-progress-bar { @apply bg-green-500; }
|
||
|
||
/* Error / Skipped: 错误或跳过 */
|
||
.task-stage.stage-error, .task-stage.stage-skipped { @apply opacity-50 bg-red-500/5; }
|
||
.task-stage.stage-error .fa-times, .task-stage.stage-skipped .fa-times { @apply opacity-100 text-red-500; }
|
||
.task-stage.stage-error .task-stage-name, .task-stage.stage-skipped .task-stage-name { @apply line-through; }
|
||
|
||
/* 6. [新增] 任务最终状态的容器 */
|
||
.task-final-status {
|
||
@apply overflow-hidden text-sm;
|
||
}
|
||
.task-final-status i {
|
||
@apply text-lg;
|
||
}
|
||
|
||
/* =================================================================== */
|
||
/* 任务中心智能摘要卡片样式 (Tailwind @apply 统一版) */
|
||
/* =================================================================== */
|
||
/* --- 1. 摘要行的行内图标 --- */
|
||
.task-item-icon-summary {
|
||
@apply text-lg mr-3; /* text-lg=18px, mr-3=12px, mt-px=1px */
|
||
}
|
||
/* --- 2. 可折叠内容区 --- */
|
||
.task-details-content {
|
||
@apply transition-all duration-300 ease-in-out overflow-hidden;
|
||
}
|
||
.task-details-content.collapsed {
|
||
@apply max-h-0 opacity-0 mt-0 pt-0 pb-0 border-t-0;
|
||
}
|
||
/* --- 3. 折叠区内的详情列表 --- */
|
||
/* 注意: space-y-1 现在被移到HTML中,由父元素直接控制,更符合Tailwind用法 */
|
||
.task-details-body {
|
||
@apply pt-2 mt-2 border-t border-black/5 text-xs text-zinc-600;
|
||
@apply dark:border-white/[.07] dark:text-zinc-400;
|
||
}
|
||
/* --- 4. 折叠/展开的雪佛兰图标 --- */
|
||
.task-toggle-icon {
|
||
@apply transition-transform duration-300 ease-in-out text-zinc-400 flex-shrink-0 ml-2;
|
||
}
|
||
/* --- 5. 展开状态下的图标旋转 --- */
|
||
/*
|
||
使用 .expanded 类来控制旋转。
|
||
这个 .expanded 类由我们的JS代码在点击时添加到 [data-task-toggle] 元素上。
|
||
*/
|
||
[data-task-toggle].expanded .task-toggle-icon {
|
||
@apply rotate-180;
|
||
}
|
||
|
||
/* -------------------------*/
|
||
/* ------ dashboard ------- */
|
||
/* ------------------------ */
|
||
|
||
/* [核心] dashboard tab 组件重构 */
|
||
|
||
/* 基础的标签项样式 (现在背景透明) */
|
||
.tab-item {
|
||
/* [核心变化] 移除背景,添加 z-index 使其位于指示器之上 */
|
||
@apply relative z-10 inline-flex items-center justify-center whitespace-nowrap rounded-md px-2 sm:px-5 py-1.5 text-sm font-medium transition-colors duration-200;
|
||
|
||
/* 默认/非激活状态的文字颜色 */
|
||
@apply text-zinc-200 dark:text-zinc-400;
|
||
|
||
/* 悬停时的文字颜色 */
|
||
@apply hover:text-zinc-900 hover:font-medium dark:hover:text-zinc-200 dark:hover:font-medium;
|
||
|
||
/* 焦点样式 (无需改动) */
|
||
@apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500;
|
||
}
|
||
|
||
/* 激活状态的标签 (只改变文字颜色) */
|
||
.tab-active {
|
||
/* [核心变化] 激活状态只改变文字颜色,使其在白色指示器上可见 */
|
||
@apply text-zinc-900 dark:text-zinc-50;
|
||
}
|
||
|
||
|
||
/* 自定义下拉选项的样式 */
|
||
.custom-select-option {
|
||
@apply cursor-pointer select-none rounded-md px-3 py-1.5 text-sm text-zinc-800 dark:text-zinc-200;
|
||
@apply transition-colors duration-150;
|
||
}
|
||
|
||
/* 选项的悬停和高亮状态 */
|
||
.custom-select-option:hover, .custom-select-option.is-highlighted {
|
||
@apply bg-zinc-200 dark:bg-zinc-700 outline-none;
|
||
}
|
||
/* 定义下拉菜单面板的基础样式 */
|
||
.dropdown-panel {
|
||
@apply absolute right-0 z-10 mt-1 w-32 rounded-md border border-zinc-200 bg-white shadow-lg dark:border-zinc-600 dark:bg-zinc-700;
|
||
}
|
||
/* 定义菜单项(按钮)的基础样式 */
|
||
.menu-item {
|
||
@apply w-full text-left flex items-center gap-x-3 px-4 py-2 text-sm text-zinc-700 hover:bg-zinc-100 dark:text-zinc-200 dark:hover:bg-zinc-600 transition-colors;
|
||
}
|
||
/* 可选:为危险操作(如删除)创建一个变体 */
|
||
.menu-item-danger {
|
||
@apply text-red-600;
|
||
}
|
||
.menu-item-icon-neutral {
|
||
@apply text-blue-500;
|
||
}
|
||
/* 定义菜单项内部图标的样式 */
|
||
.menu-item-icon {
|
||
@apply w-4;
|
||
}
|
||
/* 定义菜单中的分隔线 */
|
||
.menu-divider {
|
||
@apply my-1 h-px bg-zinc-200 dark:bg-zinc-700;
|
||
}
|
||
|
||
/*
|
||
* ds-stats-card (Dashboard Statistics Card)
|
||
* 定义了仪表盘页面顶部核心指标卡片的统一外观。
|
||
* 包含了内边距、圆角、边框、背景色、阴影以及深色模式下的样式。
|
||
*/
|
||
.ds-stats-card {
|
||
@apply p-6 rounded-2xl border border-zinc-400 shadow-sm dark:bg-zinc-900/50 dark:border-zinc-800;
|
||
}
|
||
|
||
/* -------------------------*/
|
||
/* ------ keygroups ------- */
|
||
/* ------------------------ */
|
||
/**
|
||
* 1. 【新增】Group 卡片的通用基础样式
|
||
* 抽离了 active 和 inactive 状态共享的所有样式。
|
||
* 注意:它不会替换 .group-card-active/inactive,而是与之共存。
|
||
*/
|
||
.group-card {
|
||
@apply cursor-pointer rounded-lg p-3 transition-all duration-200 h-16 flex flex-col justify-center;
|
||
}
|
||
/**
|
||
* 2. 【新增】移动端首屏的 "当前分组" 选择器样式
|
||
*/
|
||
.mobile-group-selector {
|
||
@apply flex-grow flex items-center justify-between p-3 border border-zinc-200 dark:border-zinc-700 rounded-lg;
|
||
}
|
||
/* 移动端群组下拉列表样式 */
|
||
.mobile-group-menu-active {
|
||
/* --- Positioning & Layering --- */
|
||
@apply absolute z-20 top-full left-0 right-0;
|
||
/* --- Appearance --- */
|
||
@apply bg-white dark:bg-zinc-800 shadow-lg rounded-b-lg border border-t-0 border-zinc-200 dark:border-zinc-700;
|
||
/* --- Spacing & Content Flow --- */
|
||
@apply p-4;
|
||
|
||
max-height: 14rem;
|
||
@apply overflow-y-auto;
|
||
}
|
||
/**
|
||
* 3. 【新增】卡片/选择器中的次要描述文本样式
|
||
*/
|
||
.card-sub-text {
|
||
@apply text-xs text-zinc-500 dark:text-zinc-400 truncate;
|
||
}
|
||
/**
|
||
* 4. 【新增】桌面端 “添加分组” 按钮的特定样式
|
||
*/
|
||
.add-group-btn-desktop {
|
||
/**
|
||
* [核心修正]
|
||
* 1. 新增 p-1: 增加一个4px的内边距,为背景裁剪创造空间。
|
||
* 2. 新增 bg-clip-content: 让背景只在内容区(内边距内部)绘制。
|
||
*/
|
||
@apply w-full h-16 border-zinc-300 dark:border-zinc-600 text-zinc-400 dark:text-zinc-500
|
||
hover:border-blue-500 hover:text-blue-500
|
||
p-1 bg-clip-content;
|
||
--stripe-color: theme('colors.zinc.200');
|
||
.dark & {
|
||
--stripe-color: theme('colors.zinc.700');
|
||
}
|
||
|
||
/**
|
||
* [核心修正]
|
||
* 1. 角度改为 -45deg 实现镜像。
|
||
* 2. 宽度和间距从 15px/30px 减半为 7.5px/15px。
|
||
*/
|
||
background-image: repeating-linear-gradient(
|
||
-45deg,
|
||
var(--stripe-color),
|
||
var(--stripe-color) 6px,
|
||
transparent 6px,
|
||
transparent 12px
|
||
);
|
||
}
|
||
/**
|
||
* 5. 【新增】移动端 “添加分组” 按钮的特定样式
|
||
*/
|
||
.add-group-btn-mobile {
|
||
@apply w-15 h-15 border-blue-500/50 text-blue-500;
|
||
}
|
||
/**
|
||
* 6. 【新增】健康指示器的外环样式
|
||
*/
|
||
.health-indicator-ring {
|
||
@apply w-5 h-5 flex items-center justify-center rounded-full shrink-0;
|
||
}
|
||
/**
|
||
* 7. 【新增】健康指示器的核心圆点样式
|
||
*/
|
||
.health-indicator-dot {
|
||
@apply w-2 h-2 rounded-full;
|
||
}
|
||
/*
|
||
* 8. JS依赖
|
||
*/
|
||
.group-card-active {
|
||
@apply cursor-pointer rounded-lg p-3 mr-3 bg-blue-500/10 border border-blue-500/30 text-zinc-800 dark:text-zinc-200 transition-all duration-200;
|
||
}
|
||
.group-card-inactive {
|
||
@apply cursor-pointer rounded-lg p-3 mr-3 bg-white dark:bg-zinc-800/50 border border-zinc-200 dark:border-zinc-700/60 text-zinc-800 dark:text-zinc-200 hover:border-blue-500/50 hover:bg-blue-500/5;
|
||
transition-property: background-color, border-color, transform;
|
||
transition-duration: 200ms;
|
||
}
|
||
|
||
/* ==========================================================================
|
||
Modal Component Styles (单功能模态框组件)
|
||
========================================================================== */
|
||
/**
|
||
* 1. 模态框遮罩层 (Modal Overlay)
|
||
* 覆盖整个屏幕的半透明背景。
|
||
*/
|
||
.modal-overlay {
|
||
@apply fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm;
|
||
}
|
||
/* ... (modal-panel, header, title, close-btn, body, label, footer 保持不变) ... */
|
||
.modal-panel {
|
||
@apply w-full max-w-2xl rounded-lg bg-white p-8 shadow-2xl dark:bg-zinc-800/90 border dark:border-zinc-700 flex flex-col;
|
||
}
|
||
.modal-header {
|
||
@apply flex items-center justify-between pb-4 border-b dark:border-zinc-700;
|
||
}
|
||
.modal-title {
|
||
@apply text-xl font-semibold;
|
||
}
|
||
.modal-close-btn {
|
||
@apply text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-200 transition-colors;
|
||
}
|
||
.modal-body {
|
||
@apply mt-6 p-1 pr-4 -mr-4;
|
||
}
|
||
.modal-label {
|
||
@apply text-sm font-medium text-zinc-700 dark:text-zinc-300;
|
||
}
|
||
.modal-footer {
|
||
@apply mt-2 flex justify-end gap-x-3 pt-3;
|
||
}
|
||
/**
|
||
* [修正] 将所有按钮的样式定义分离,避免 @apply 嵌套自定义类。
|
||
* HTML中将同时使用 .modal-btn 和 .modal-btn-primary/secondary/danger。
|
||
*/
|
||
/* 9. 模态框按钮基础样式 (Modal Button Base) */
|
||
.modal-btn {
|
||
@apply rounded-md px-4 py-2 text-sm font-medium transition-colors;
|
||
}
|
||
|
||
/* 10. 主要操作按钮 (如: 导入, 保存) */
|
||
.modal-btn-primary {
|
||
@apply bg-blue-600 text-white hover:bg-blue-700;
|
||
}
|
||
|
||
/* 11. 次要/取消按钮 */
|
||
.modal-btn-secondary {
|
||
@apply bg-zinc-200 text-zinc-700 hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-200 dark:hover:bg-zinc-600;
|
||
}
|
||
|
||
/* 12. 危险操作按钮 (如: 删除) */
|
||
.modal-btn-danger {
|
||
@apply bg-red-600 text-white hover:bg-red-700;
|
||
}
|
||
|
||
/* Modal Inputs */
|
||
.modal-input {
|
||
/*@apply mt-1 block w-full rounded-md border border-zinc-300 bg-white p-2 min-h-[40px] focus:border-blue-500 focus:ring-blue-500 dark:bg-zinc-700 dark:border-zinc-600 sm:text-sm;*/
|
||
@apply mt-1 block w-full px-3 py-2 text-xs bg-white dark:bg-zinc-800 border border-zinc-300 dark:border-zinc-600 rounded-md placeholder:text-zinc-400 dark:placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-500 focus:border-transparent transition duration-150 ease-in-out;
|
||
}
|
||
/*
|
||
* 修正:确保textarea也使用相同的字体大小和行高
|
||
* Tailwind forms 插件有时会覆盖这些,所以我们明确指定
|
||
*/
|
||
textarea.modal-input {
|
||
@apply text-sm leading-6;
|
||
}
|
||
/* Tag Input Component */
|
||
.tag-input-container {
|
||
|
||
@apply flex flex-wrap items-center gap-2 mt-1 w-full rounded-md bg-white dark:bg-zinc-700 border border-zinc-300 dark:border-zinc-600 p-2 min-h-[40px] focus-within:border-blue-500 focus-within:ring-1 focus-within:ring-blue-500;
|
||
}
|
||
.tag-item {
|
||
@apply flex items-center gap-x-1.5 bg-blue-100 dark:bg-blue-500/20 text-blue-800 dark:text-blue-200 text-sm font-medium rounded-full px-2.5 py-0.5;
|
||
}
|
||
.tag-delete {
|
||
@apply text-blue-500 dark:text-blue-300 hover:text-blue-700 dark:hover:text-blue-100 font-bold;
|
||
}
|
||
.tag-input-new {
|
||
/* 使其在容器内垂直居中,感觉更好 */
|
||
@apply flex-grow bg-transparent focus:outline-none text-sm self-center;
|
||
}
|
||
|
||
/* 为复制按钮提供基础样式 */
|
||
.tag-copy-btn {
|
||
background: none;
|
||
border: none;
|
||
cursor: pointer;
|
||
font-size: 1.0rem; /* 调整图标大小 */
|
||
padding: 0 8px;
|
||
opacity: 0.6;
|
||
transition: opacity 0.2s, transform 0.2s;
|
||
}
|
||
.tag-copy-btn:hover {
|
||
opacity: 1;
|
||
transform: scale(1.1);
|
||
}
|
||
/* 复制成功后的状态 */
|
||
.tag-copy-btn.copied span {
|
||
color: #4CAF50; /* 绿色,表示成功 */
|
||
font-size: 0.8rem; /* 可以让提示文字小一点 */
|
||
font-weight: bold;
|
||
}
|
||
/* 复制成功后的状态 */
|
||
.tag-copy-btn.none span {
|
||
color: #3766c3; /* 绿色,表示成功 */
|
||
font-size: 0.8rem; /* 可以让提示文字小一点 */
|
||
font-weight: bold;
|
||
}
|
||
|
||
/* Advanced Request Settings Modal Specifics */
|
||
details summary::-webkit-details-marker {
|
||
display: none;
|
||
}
|
||
details > summary {
|
||
list-style: none;
|
||
}
|
||
details > summary .fa-chevron-down {
|
||
transition: transform 0.2s ease-in-out;
|
||
}
|
||
details[open] > summary .fa-chevron-down {
|
||
transform: rotate(180deg);
|
||
}
|
||
|
||
.dynamic-kv-item {
|
||
@apply flex items-center gap-x-2;
|
||
}
|
||
.dynamic-kv-key {
|
||
@apply w-full px-3 py-2 bg-zinc-100 dark:bg-zinc-700/50 border border-zinc-300 dark:border-zinc-600 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-500 focus:border-transparent transition duration-150 ease-in-out font-mono text-xs;
|
||
}
|
||
.dynamic-kv-value {
|
||
@apply w-full px-3 py-2 bg-white dark:bg-zinc-800 border border-zinc-300 dark:border-zinc-600 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-500 focus:border-transparent transition duration-150 ease-in-out font-mono text-xs;
|
||
}
|
||
}
|
||
|
||
@layer components {
|
||
/* Toggle Switch Component */
|
||
.toggle-checkbox:checked {
|
||
@apply right-0 border-blue-600;
|
||
right: 0;
|
||
}
|
||
.toggle-checkbox:checked + .toggle-label {
|
||
@apply bg-blue-600;
|
||
}
|
||
|
||
/* Tooltip Component */
|
||
.tooltip-icon {
|
||
@apply relative inline-flex items-center justify-center ml-2 text-zinc-400 cursor-pointer;
|
||
}
|
||
/* .tooltip-text is now dynamically generated by JS */
|
||
.global-tooltip {
|
||
@apply fixed z-[9999] w-max max-w-xs whitespace-normal rounded-lg bg-zinc-800 px-3 py-2 text-sm font-medium text-white shadow-lg transition-opacity duration-200;
|
||
}
|
||
}
|
||
|
||
@layer components {
|
||
/* SortableJS Drag Styles */
|
||
.sortable-ghost {
|
||
@apply opacity-40 bg-blue-200 dark:bg-blue-900/50;
|
||
}
|
||
.sortable-drag {
|
||
@apply shadow-lg scale-105 cursor-grabbing;
|
||
}
|
||
|
||
/* Fallback class for when forceFallback is true */
|
||
.sortable-fallback {
|
||
@apply shadow-lg scale-105 cursor-grabbing;
|
||
}
|
||
}
|
||
|
||
/* =================================================================== */
|
||
/* 自定义 SweetAlert2 样式 (Custom SweetAlert2 Styles) */
|
||
/* =================================================================== */
|
||
.swal2-popup.swal2-custom-style {
|
||
@apply bg-zinc-300 dark:bg-zinc-800 text-sm; /* 为整个弹窗设置基础字体大小 */
|
||
}
|
||
.swal2-popup.swal2-custom-style .swal2-title {
|
||
@apply text-xl font-semibold text-zinc-800 dark:text-zinc-100; /* 应用标题样式 */
|
||
}
|
||
.swal2-popup.swal2-custom-style .swal2-html-container {
|
||
@apply text-sm text-zinc-600 dark:text-zinc-300; /* 应用正文样式 */
|
||
}
|
||
.swal2-popup.swal2-custom-style .swal2-confirm-button,
|
||
.swal2-popup.swal2-custom-style .swal2-cancel-button {
|
||
@apply text-sm font-medium px-4 py-2 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-offset-2; /* 应用按钮样式 */
|
||
@apply focus:ring-offset-white dark:focus:ring-offset-zinc-800;
|
||
}
|
||
.swal2-popup.swal2-custom-style .swal2-confirm-button {
|
||
@apply bg-red-600 text-white hover:bg-red-700 focus:ring-red-500;
|
||
}
|
||
.swal2-popup.swal2-custom-style .swal2-cancel-button {
|
||
@apply bg-transparent text-zinc-700 dark:text-zinc-200 border border-zinc-300 dark:border-zinc-600 hover:bg-zinc-50 dark:hover:bg-zinc-700 focus:ring-zinc-500;
|
||
}
|
||
/* 覆盖图标大小 */
|
||
.swal2-popup.swal2-custom-style .swal2-icon {
|
||
@apply w-8 h-8 my-2;
|
||
}
|
||
.swal2-popup.swal2-custom-style .swal2-icon .swal2-icon-content {
|
||
@apply text-4xl;
|
||
}
|