Files
deerflow-code/frontend-web/src/styles/globals.css
T

1379 lines
42 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.
@import "tailwindcss";
@import "tw-animate-css";
@source "../node_modules/streamdown/dist/index.js";
/* Heading */
@source inline("text-{xs,sm,base,lg,xl,2xl,3xl,4xl,5xl,6xl}");
@source inline("font-{normal,medium,semibold,bold,extrabold}");
@source inline("leading-{none,tight,snug,normal,relaxed,loose}");
/* Spacing */
@source inline("m{t,b,l,r,x,y}-{0,1,2,3,4,5,6,8,10,12,16,20,24}");
@source inline("p{t,b,l,r,x,y}-{0,1,2,3,4,5,6,8,10,12,16,20,24}");
@source inline("space-{x,y}-{1,2,3,4,5,6,8}");
/* List */
@source inline("list-{disc,decimal,none,inside,outside}");
/* Text */
@source inline("text-{left,center,right,justify}");
@source inline("text-{slate,gray,zinc,neutral,stone}-{50,100,200,300,400,500,600,700,800,900,950}");
@source inline("italic");
@source inline("underline");
@source inline("line-through");
/* Code */
@source inline("font-mono");
@source inline("bg-{slate,gray,zinc,muted}-{50,100,200}");
@source inline("rounded{,-sm,-md,-lg,-xl}");
@source inline("border{,-2,-4}");
@source inline("border-{slate,gray,zinc,border}-{200,300}");
/* Blockquote */
@source inline("border-l-{2,4}");
@source inline("border-l-{slate,gray,primary}-{300,400,500}");
/* 战情大屏(dashboard-agent):时间线圆圈/虚线、FooterNote 左侧强调条等用到的
* 语义色边框——本项目边框色需显式 safelist,否则只生成宽度、颜色回退成灰色。
* 明、暗两套各一行。 */
@source inline("border-{red,emerald,sky,amber}-{200,300,400,500,600,700}");
@source inline("dark:border-{red,emerald,sky,amber}-{200,300,400,500,600,700}");
/* Link */
@source inline("text-{blue,primary,accent}-{500,600,700}");
@source inline("hover:text-{blue,primary,accent}-{600,700,800}");
@source inline("hover:underline");
/* Table */
@source inline("border-collapse");
@source inline("table-auto");
@source inline("w-full");
@source inline("divide-{x,y}");
@source inline("divide-{slate,gray,border}-{200,300}");
/* Image */
@source inline("max-w-{xs,sm,md,lg,xl,2xl,full}");
@source inline("h-auto");
@source inline("object-cover");
/* Horizontal Rule */
@source inline("border-t");
@source inline("border-{slate,gray,border}-{200,300}");
/* General */
@source inline("block");
@source inline("inline");
@source inline("inline-block");
@source inline("break-words");
@source inline("overflow-{auto,hidden,x-auto}");
@source inline("whitespace-pre-wrap");
/* Shadcn Colors */
@source inline("text-{foreground,muted-foreground,primary,secondary,accent}");
@source inline("bg-{background,muted,primary,secondary,accent}");
@source inline("border-{border,input}");
@custom-variant dark (&:is(.dark *));
@theme {
--font-sans:
"Noto Sans S Chinese", "Noto Sans SC", "Source Han Sans SC", "思源黑体",
"Microsoft YaHei", "PingFang SC", ui-sans-serif, system-ui, sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--animate-fade-in: fade-in 1.1s;
@keyframes fade-in {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
--animate-fade-in-up: fade-in-up 0.15s ease-in-out forwards;
@keyframes fade-in-up {
0% {
opacity: 0;
transform: translateY(1rem) scale(1.2);
}
100% {
opacity: 1;
}
}
--animate-bouncing: bouncing 0.5s infinite alternate;
@keyframes bouncing {
to {
opacity: 0.1;
transform: translateY(-8px);
}
}
--animate-skeleton-entrance: skeleton-entrance 0.35s ease-out forwards;
@keyframes skeleton-entrance {
0% {
opacity: 0;
transform: scaleX(0);
}
100% {
opacity: 1;
transform: scaleX(1);
}
}
--animate-suggestion-in: suggestion-in 0.2s ease-out forwards;
@keyframes suggestion-in {
0% {
opacity: 0;
transform: translateY(-1.25rem);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
--animate-breathe-stop: breathe-stop 1.8s ease-in-out infinite;
@keyframes breathe-stop {
0%,
100% {
transform: scale(1);
box-shadow:
0 0 0 0 rgba(217, 33, 33, 0.14),
0 8px 24px -14px rgba(217, 33, 33, 0.35);
}
50% {
transform: scale(1.06);
box-shadow:
0 0 0 10px rgba(217, 33, 33, 0),
0 14px 32px -16px rgba(217, 33, 33, 0.45);
}
}
}
@theme inline {
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--radius-2xl: calc(var(--radius) + 8px);
--radius-3xl: calc(var(--radius) + 12px);
--radius-4xl: calc(var(--radius) + 16px);
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
--animate-aurora: aurora 8s ease-in-out infinite alternate;
@keyframes aurora {
0% {
background-position: 0% 50%;
transform: rotate(-5deg) scale(0.9);
}
25% {
background-position: 50% 100%;
transform: rotate(5deg) scale(1.1);
}
50% {
background-position: 100% 50%;
transform: rotate(-3deg) scale(0.95);
}
75% {
background-position: 50% 0%;
transform: rotate(3deg) scale(1.05);
}
100% {
background-position: 0% 50%;
transform: rotate(-5deg) scale(0.9);
}
}
--animate-shine: shine var(--duration) infinite linear;
@keyframes shine {
0% {
background-position: 0% 0%;
}
50% {
background-position: 100% 100%;
}
to {
background-position: 0% 0%;
}
}
}
:root {
--workspace-brand: #f5222d;
--workspace-brand-foreground: #ffffff;
--brand-200: #feeded;
--brand-900: #cf1322;
--brand-950: #a8071a;
--radius: 0.75rem;
/* Keep the base design tokens in legacy color syntax. CSS custom
properties containing oklch() make every dependent Tailwind color rule
invalid in Chrome 109 and below. */
--background: #ffffff;
--foreground: #231716;
--card: #ffffff;
--card-foreground: #231716;
--popover: #ffffff;
--popover-foreground: #231716;
--primary: #be2323;
--primary-foreground: #fcfcfc;
--secondary: #f2f0ea;
--secondary-foreground: #513b38;
--muted: #f5f3ef;
--muted-foreground: #695958;
--accent: #ffedeb;
--accent-foreground: #7b2727;
--destructive: #e40014;
--border: #dfded8;
--input: #e0ded7;
--ring: rgba(190, 35, 35, 0.35);
--chart-1: #d94a32;
--chart-2: #188f95;
--chart-3: #4f6680;
--chart-4: #e8a72a;
--chart-5: #db8d16;
--sidebar: #fdfcfb;
--sidebar-foreground: #322524;
--sidebar-primary: #be2323;
--sidebar-primary-foreground: #fcfcfc;
--sidebar-accent: #fff6ec;
--sidebar-accent-foreground: #633a32;
--sidebar-border: #e8e4dd;
--sidebar-ring: rgba(190, 35, 35, 0.4);
/* Chrome 109 fallback channels for Tailwind opacity modifiers. */
--legacy-accent-rgb: 255 237 235;
--legacy-background-rgb: 255 255 255;
--legacy-border-rgb: 223 222 216;
--legacy-brand-200-rgb: 254 237 237;
--legacy-card-rgb: 255 255 255;
--legacy-destructive-rgb: 228 0 20;
--legacy-foreground-rgb: 35 23 22;
--legacy-input-rgb: 224 222 215;
--legacy-muted-rgb: 245 243 239;
--legacy-muted-foreground-rgb: 105 89 88;
--legacy-primary-rgb: 190 35 35;
--legacy-primary-foreground-rgb: 252 252 252;
--legacy-ring-rgb: 190 35 35;
--legacy-secondary-rgb: 242 240 234;
--legacy-sidebar-accent-rgb: 255 246 236;
--legacy-sidebar-border-rgb: 232 228 221;
--legacy-sidebar-foreground-rgb: 50 37 36;
--legacy-workspace-brand-rgb: 245 34 45;
}
.dark {
--workspace-brand: #3b82f6;
--workspace-brand-foreground: #ffffff;
--background: #0e172b;
--foreground: #eff2f5;
--card: #1a2539;
--card-foreground: #eff2f5;
--popover: #17243a;
--popover-foreground: #eff2f5;
--primary: #2b81ff;
--primary-foreground: #fcfcfc;
--secondary: #273346;
--secondary-foreground: #eff2f5;
--muted: #232e40;
--muted-foreground: #8e9aa4;
--accent: #283b5a;
--accent-foreground: #eff2f5;
--destructive: #ff6568;
--border: rgba(255, 255, 255, 0.12);
--input: rgba(255, 255, 255, 0.14);
--ring: rgba(43, 129, 255, 0.45);
--chart-1: #236bdb;
--chart-2: #51c49d;
--chart-3: #e8b02a;
--chart-4: #a65be5;
--chart-5: #e65a42;
--sidebar: #0d1830;
--sidebar-foreground: #e8ecee;
--sidebar-primary: #2b81ff;
--sidebar-primary-foreground: #fcfcfc;
--sidebar-accent: #1d2e49;
--sidebar-accent-foreground: #eff2f5;
--sidebar-border: rgba(255, 255, 255, 0.1);
--sidebar-ring: rgba(43, 129, 255, 0.45);
--legacy-accent-rgb: 40 59 90;
--legacy-background-rgb: 14 23 43;
--legacy-border-rgb: 255 255 255;
--legacy-card-rgb: 26 37 57;
--legacy-destructive-rgb: 255 101 104;
--legacy-foreground-rgb: 239 242 245;
--legacy-input-rgb: 255 255 255;
--legacy-muted-rgb: 35 46 64;
--legacy-muted-foreground-rgb: 142 154 164;
--legacy-primary-rgb: 43 129 255;
--legacy-primary-foreground-rgb: 252 252 252;
--legacy-ring-rgb: 43 129 255;
--legacy-secondary-rgb: 39 51 70;
--legacy-sidebar-accent-rgb: 29 46 73;
--legacy-sidebar-border-rgb: 255 255 255;
--legacy-sidebar-foreground-rgb: 232 236 238;
--legacy-workspace-brand-rgb: 59 130 246;
font-weight: 300;
}
/* 浅蓝色主题 —— 详见 docs/ui规范-浅蓝/浅蓝色ui规范.md。
第三套主题,由 next-themes 在 <html> 加 `.lightblue` 类触发。
只覆盖颜色 token(圆角/间距沿用 :root),实现整站换肤;
主色 #0062D9(ZS-002 深色基准),浅底 #EAF4FF,正文 #3D3D3D。 */
.lightblue {
--workspace-brand: #0062d9;
--workspace-brand-foreground: #ffffff;
--brand-200: #eaf4ff;
--brand-900: #0062d9;
--brand-950: #004ab3;
--background: #ffffff;
--foreground: #3d3d3d;
--card: #ffffff;
--card-foreground: #3d3d3d;
--popover: #ffffff;
--popover-foreground: #3d3d3d;
--primary: #0062d9;
--primary-foreground: #ffffff;
--secondary: #f4f9ff;
--secondary-foreground: #0056c6;
--muted: #f3f5f8;
--muted-foreground: #7f7f7f;
--accent: #eaf4ff;
--accent-foreground: #0062d9;
--destructive: #f5222d;
--border: #dbdbdb;
--input: #dbdbdb;
--ring: rgb(0 98 217 / 0.35);
--chart-1: #0062d9;
--chart-2: #1eb07f;
--chart-3: #ff9900;
--chart-4: #2f9acc;
--chart-5: #f5222d;
--sidebar: #f9fcff;
--sidebar-foreground: #3d3d3d;
--sidebar-primary: #0062d9;
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: #eaf4ff;
--sidebar-accent-foreground: #0056c6;
--sidebar-border: #e6ebf2;
--sidebar-ring: rgb(0 98 217 / 0.4);
--legacy-accent-rgb: 234 244 255;
--legacy-background-rgb: 255 255 255;
--legacy-border-rgb: 219 219 219;
--legacy-brand-200-rgb: 234 244 255;
--legacy-card-rgb: 255 255 255;
--legacy-destructive-rgb: 245 34 45;
--legacy-foreground-rgb: 61 61 61;
--legacy-input-rgb: 219 219 219;
--legacy-muted-rgb: 243 245 248;
--legacy-muted-foreground-rgb: 127 127 127;
--legacy-primary-rgb: 0 98 217;
--legacy-primary-foreground-rgb: 255 255 255;
--legacy-ring-rgb: 0 98 217;
--legacy-secondary-rgb: 244 249 255;
--legacy-sidebar-accent-rgb: 234 244 255;
--legacy-sidebar-border-rgb: 230 235 242;
--legacy-sidebar-foreground-rgb: 61 61 61;
--legacy-workspace-brand-rgb: 0 98 217;
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
/* 打通高度链:html/body/#root 取满父级高度,使下游用 h-full(100%) 的根布局
(PageRoutes 的 PageLayout)跟随容器尺寸而非视口。
- 全屏:100% 逐级解析到视口,与原先的 h-screen 等价,无视觉变化;
- 无界(wujie)等嵌套:wujie 会把子应用的 html/body 选择器作用到 <wujie-app>
容器,于是高度收缩到容器而非整屏 —— 这正是「高度对齐容器」所需。
只设 height、不设 overflow,因此不影响 Landing 等需要自然滚动的页面。 */
html,
body,
#root {
height: 100%;
}
/* 无界嵌入:Radix scroll-lock 可能误算 margin-right,留下右侧空白条 */
html.wujie-embed body {
margin-right: 0 !important;
padding-right: 0 !important;
}
[data-sidebar="menu-button"][data-active="true"] {
box-shadow: inset 3px 0 0 var(--primary);
font-weight: 600;
}
[data-sidebar="menu-button"][data-active="true"] svg {
color: var(--primary);
}
.container-md {
width: 100%;
@media (width >= 40rem) {
max-width: 40rem;
}
@media (width >= 48rem) {
max-width: 48rem;
}
@media (width >= 64rem) {
max-width: 64rem;
}
@media (width >= 80rem) {
max-width: 80rem;
}
}
.ambilight {
pointer-events: none;
opacity: 0;
transition: opacity 1s ease-in-out;
}
.ambilight:before,
.ambilight:after {
content: "";
pointer-events: none;
position: absolute;
left: 0;
top: 0;
background: linear-gradient(
45deg,
#fb0094,
#0000ff,
#00ff00,
#ffff00,
#ff0000,
#fb0094,
#0000ff,
#00ff00,
#ffff00,
#ff0000
);
background-size: 400%;
width: 100%;
height: 100%;
border-radius: 10px;
z-index: -1;
animation: ambilight 40s ease-in-out infinite;
}
.ambilight.enabled {
opacity: 1;
}
.dark .ambilight:before,
.dark .ambilight:after {
opacity: 0.85;
}
@keyframes ambilight {
0% {
background-position: 0 0;
}
50% {
background-position: 400% 0;
}
100% {
background-position: 0 0;
}
}
.ambilight:after {
filter: blur(60px);
}
.golden-text {
background: linear-gradient(135deg, #d19e1d 0%, #e9c665 50%, #e3a812 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
text-fill-color: transparent;
}
*::-webkit-scrollbar {
width: 10px;
height: 10px;
}
*::-webkit-scrollbar-track {
background: transparent;
}
*::-webkit-scrollbar-thumb {
border: 2px solid transparent;
border-radius: 999px;
background: linear-gradient(180deg, rgb(241 89 89 / 0.82), rgb(214 36 36 / 0.9))
padding-box;
}
.workspace-shell {
background: #ffffff;
}
.dark .workspace-shell {
background: var(--background);
}
/* 深色背景换成设计稿深蓝主题底图。background-color 作为图片加载前/超出
* 区域的回落底色。仅 .dark 生效,浅色模式不受影响。
* - .workspace-chat-bg:紧凑模式聊天页(ChatPage 在 compactChrome 下挂)
* - .canvas-writing-bg:AI 写作页(AIWritingPage 根容器)*/
.dark .workspace-chat-bg,
.dark .canvas-writing-bg {
background-color: var(--background);
background-image: url("../assets/img/layout-bg-theme-dark-blue.svg");
background-size: cover;
background-position: center top;
background-repeat: no-repeat;
background-attachment: fixed;
}
/* AI 写作「课题研究」左栏(ResearchSidebar,class=ai-research-sidebar)的深蓝适配。
* 该组件只为浅色写死了 slate/white,这里仅在 .dark 下统一改写为半透明深蓝玻璃面板 +
* 可读文字(对齐 .sidebar-contents:bg rgba(3,38,80,.8) + 蓝色发光边框),叠 backdrop
* 模糊让外壳 canvas-writing-bg 的深蓝底图朦胧透出。浅色模式不命中,原样式完全不变;
* 彩色图标 chip / rose 选中态作语义高亮,刻意不收进此表。 */
.dark .ai-research-sidebar {
background-color: rgba(3, 38, 80, 0.8) !important;
border-color: rgba(43, 143, 254, 0.45) !important;
color: #c5cfe0 !important;
box-shadow: none !important;
backdrop-filter: blur(12px);
}
.dark .ai-research-sidebar .bg-white {
background-color: rgba(255, 255, 255, 0.05) !important;
}
.dark .ai-research-sidebar
:is(.bg-slate-50, .bg-slate-50\/80, .bg-slate-50\/70, .bg-slate-100) {
background-color: rgba(255, 255, 255, 0.06) !important;
}
.dark .ai-research-sidebar
:is(.hover\:bg-slate-50:hover, .hover\:bg-slate-50\/70:hover) {
background-color: rgba(255, 255, 255, 0.09) !important;
}
.dark .ai-research-sidebar .focus\:bg-white:focus {
background-color: rgba(255, 255, 255, 0.1) !important;
}
.dark .ai-research-sidebar
:is(.border-slate-100, .border-slate-100\/80, .border-slate-200) {
border-color: rgba(43, 143, 254, 0.22) !important;
}
.dark .ai-research-sidebar .hover\:border-slate-200:hover {
border-color: rgba(43, 143, 254, 0.42) !important;
}
.dark .ai-research-sidebar :is(.text-slate-900, .text-slate-800, .text-slate-700) {
color: #e8edf5 !important;
}
.dark .ai-research-sidebar
:is(.text-slate-600, .text-slate-500, .text-slate-400, .text-slate-300) {
color: #8aa0c4 !important;
}
.dark .ai-research-sidebar
:is(
.hover\:text-slate-800:hover,
.hover\:text-slate-900:hover,
.hover\:text-slate-950:hover
) {
color: #e8edf5 !important;
}
/* 浅色投影在深底上发灰,去掉子元素的阴影 */
.dark .ai-research-sidebar [class*="shadow-"] {
box-shadow: none !important;
}
/* 模板图标 chip:浅彩底(*-50)深色下发白 → 改主题语义色 16% 透明软底 + 提亮图标
* (色值取自《深蓝色 UI 规范》§1.1.9 功能语义色 / §1.1.7 装饰色)。 */
.dark .ai-research-sidebar .bg-blue-50 {
background-color: rgba(22, 119, 255, 0.16) !important;
}
.dark .ai-research-sidebar .text-blue-600 {
color: #4096ff !important;
}
.dark .ai-research-sidebar .bg-violet-50 {
background-color: rgba(99, 136, 255, 0.16) !important;
}
.dark .ai-research-sidebar .text-violet-600 {
color: #6388ff !important;
}
.dark .ai-research-sidebar .bg-emerald-50 {
background-color: rgba(82, 196, 26, 0.16) !important;
}
.dark .ai-research-sidebar .text-emerald-600 {
color: #52c41a !important;
}
.dark .ai-research-sidebar .bg-cyan-50 {
background-color: rgba(19, 194, 194, 0.16) !important;
}
.dark .ai-research-sidebar .text-cyan-600 {
color: #36cfc9 !important;
}
.dark .ai-research-sidebar .bg-rose-50 {
background-color: rgba(245, 34, 45, 0.16) !important;
}
.dark .ai-research-sidebar .text-rose-600 {
color: #ff7875 !important;
}
/* 警告橙(amber):模板「周报」chip + 「笔记本服务暂不可用」提示,统一警告软底 +
* 警告色文字(§1.1.9:警告 #FAAD14 / 软底 rgba(250,173,20,0.16))。 */
.dark .ai-research-sidebar .bg-amber-50 {
background-color: rgba(250, 173, 20, 0.16) !important;
}
.dark .ai-research-sidebar :is(.text-amber-700, .text-amber-600) {
color: #faad14 !important;
}
/* 全量模式通用问答左栏(GeneralQaSidebar,class=gq-sidebar)的深蓝适配:深蓝(.dark)
* 主题下由扁平 bg-sidebar 改为「深蓝主题底图 + 半透明蓝罩」玻璃面板——与右侧主区
* workspace-chat-bg 同一张 fixed 底图(视口对齐、左右连续),叠一层蓝罩使其略深、读作
* 独立面板。内部元素已走语义 token,自适配。浅色 / 浅蓝主题不命中,仍用 sidebar token。 */
.dark .gq-sidebar {
background-color: transparent !important;
background-image: linear-gradient(
rgba(3, 38, 80, 0.72),
rgba(3, 38, 80, 0.72)
),
url("../assets/img/layout-bg-theme-dark-blue.svg");
background-size: cover, cover;
background-position: center top, center top;
background-repeat: no-repeat, no-repeat;
background-attachment: fixed, fixed;
}
/* 「大屏绘制智能体」独立页顶栏(DashboardAgentPage,class=dashboard-agent-topbar)深色
* 适配:顶栏只为浅色写死了 slate/white 渐变,深色(.dark)下统一改深蓝(《深蓝色 UI 规范》
* 卡片底 #122347 / 页面底 #0C1836 / 边框 #1A2F5A / 字体 #C5CFE0),仅作用于顶栏内,
* 不影响下方大屏/聊天区。浅色不命中,原样式不变。 */
.dark .dashboard-agent-topbar {
background-image: linear-gradient(to right, #122347, #0c1836) !important;
border-color: #1a2f5a !important;
}
.dark .dashboard-agent-topbar .text-slate-900 {
color: #e8edf5 !important;
}
.dark .dashboard-agent-topbar
:is(.text-slate-700, .hover\:text-slate-700:hover) {
color: #c5cfe0 !important;
}
.dark .dashboard-agent-topbar :is(.text-slate-500, .text-slate-400) {
color: #6e88b0 !important;
}
.dark .dashboard-agent-topbar .bg-white {
background-color: #1a2f5a !important;
}
.dark .dashboard-agent-topbar
:is(.bg-slate-50, .hover\:bg-slate-50:hover) {
background-color: #0c1836 !important;
}
.dark .dashboard-agent-topbar
:is(.border-slate-100, .border-slate-200) {
border-color: #1a2f5a !important;
}
/* 「大屏绘制智能体」战情大屏:**全页最小字号 16px**(仅命中本页 wrapper
* .dashboard-agent-fontscale —— 加在 DashboardAgentPage 根容器上,会包住其下的
* DashboardApp 顶部标题/导航 Tab/页脚 + 七个战情子页)。把 10/11/12/13px 统一抬到 16px、
* 14px(text-sm) 抬到 18px,保留「正文 16 / 卡片标题 18(再叠 bold) / 指标大数 ≥20」的层级,
* 看上去自然不错乱;text-xl/2xl/3xl 本就 ≥16,保持原样不动。
* 作用域严格限定本页:会商共享的 DashboardApp(无此 wrapper)与其它页面零影响。 */
.dashboard-agent-fontscale
:is(.text-\[10px\], .text-\[11px\], .text-xs, .text-\[13px\]) {
font-size: 16px !important;
line-height: 1.75 !important;
}
.dashboard-agent-fontscale .text-sm {
font-size: 18px !important;
line-height: 1.65 !important;
}
/* 语义色边框兜底:本项目 border-red/emerald/sky 等颜色类未被 Tailwind 生成时只剩宽度、
* 颜色回退成灰色(时间线圆圈/虚线、FooterNote 左侧强调条)。这里在本页作用域内**直接定义**
* 这些类的 border-color(用 Tailwind v4 颜色变量,带 hex 兜底),不依赖 @source 安全列表的
* 重新生成,改完即时生效。仅命中 .dashboard-agent-fontscale 子树,不影响其它页面。 */
.dashboard-agent-fontscale .border-red-200 { border-color: var(--color-red-200, #fecaca) !important; }
.dashboard-agent-fontscale .border-red-300 { border-color: var(--color-red-300, #fca5a5) !important; }
.dashboard-agent-fontscale .border-red-400 { border-color: var(--color-red-400, #f87171) !important; }
.dashboard-agent-fontscale .border-red-500 { border-color: var(--color-red-500, #ef4444) !important; }
.dashboard-agent-fontscale .border-emerald-500 { border-color: var(--color-emerald-500, #10b981) !important; }
.dashboard-agent-fontscale .border-sky-500 { border-color: var(--color-sky-500, #0ea5e9) !important; }
.workspace-panel {
border: 1px solid #f0d7d0;
background: #ffffff;
box-shadow:
0 32px 72px -46px rgb(98 63 42 / 0.35),
0 12px 28px -22px rgb(170 91 75 / 0.24);
}
.dark .workspace-panel {
border: 1px solid rgba(255, 255, 255, 0.1);
background: var(--card);
box-shadow: none;
}
.workspace-user-bubble {
max-width: min(82%, 42rem);
border: 1px solid rgb(255 255 255 / 0.14);
border-radius: 1.6rem 1.6rem 0.5rem 1.6rem;
background: linear-gradient(135deg, #ff5b67 0%, #ef334d 58%, #df213e 100%);
color: white;
box-shadow:
0 22px 40px -28px rgb(215 39 55 / 0.72),
0 10px 20px -16px rgb(155 18 34 / 0.48);
}
.workspace-user-bubble a,
.workspace-user-bubble code {
color: inherit;
}
.workspace-user-bubble code {
background: rgb(255 255 255 / 0.18);
border-radius: 0.5rem;
padding: 0.1rem 0.35rem;
}
.workspace-assistant-card {
position: relative;
width: 100%;
border: 1px solid #f1d9d3;
border-radius: 1.75rem;
background: rgb(255 255 255 / 0.94);
box-shadow:
0 28px 48px -42px rgb(120 74 55 / 0.38),
0 6px 18px -14px rgb(165 93 73 / 0.2);
}
.workspace-assistant-card::before {
content: "";
position: absolute;
top: 1rem;
left: 1rem;
width: 0.45rem;
height: calc(100% - 2rem);
border-radius: 999px;
background: linear-gradient(180deg, rgb(255 110 110 / 0.92), rgb(233 45 45 / 0.15));
opacity: 0.88;
}
.workspace-assistant-card > * {
position: relative;
z-index: 1;
}
.workspace-assistant-card .prose,
.workspace-assistant-card [data-state] {
width: 100%;
}
.workspace-assistant-card .my-3 {
margin-block: 0.25rem;
}
.workspace-chat-toolbar {
border: 1px solid rgb(255 255 255 / 0.22);
background: rgb(255 255 255 / 0.14);
color: white;
backdrop-filter: blur(18px);
}
@keyframes sandbox-preview-enter {
0% {
opacity: 0;
transform: translateY(14px) scale(0.985);
}
100% {
opacity: 1;
transform: translateY(0) scale(1);
}
}
@keyframes sandbox-preview-glow {
0%,
100% {
box-shadow:
0 0 0 0 rgb(227 39 39 / 0),
0 8px 20px -16px rgb(227 39 39 / 0.1);
}
50% {
box-shadow:
0 0 0 8px rgb(227 39 39 / 0.08),
0 18px 34px -18px rgb(227 39 39 / 0.3);
}
}
@keyframes sandbox-preview-badge {
0%,
100% {
transform: translateY(0);
opacity: 0.88;
}
50% {
transform: translateY(-1px);
opacity: 1;
}
}
@keyframes sandbox-scroll-button-in {
0% {
opacity: 0;
transform: translateY(-45%) scale(0.96);
}
100% {
opacity: 1;
transform: translateY(-50%) scale(1);
}
}
}
/* ─── Tiptap writing editor ─────────────────────────────────────────────── */
.tiptap-writing-editor .ProseMirror {
outline: none;
min-height: 320px;
caret-color: var(--primary);
padding-bottom: 6rem; /* ensure last paragraph isn't flush against the bottom */
}
.tiptap-writing-editor .ProseMirror p {
margin-bottom: 1rem;
line-height: 1.8;
font-size: 0.9375rem; /* 15px */
color: var(--foreground);
text-indent: 2em; /* 段落首行缩进 */
}
.tiptap-writing-editor .ProseMirror h1 {
font-size: 1.625rem;
font-weight: 700;
letter-spacing: -0.025em;
margin-top: 2rem;
margin-bottom: 0.75rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--border);
color: var(--foreground);
line-height: 1.25;
}
.tiptap-writing-editor .ProseMirror h1:first-child {
margin-top: 0;
}
.tiptap-writing-editor .ProseMirror h2 {
font-size: 1.25rem;
font-weight: 600;
letter-spacing: -0.015em;
margin-top: 1.75rem;
margin-bottom: 0.625rem;
color: var(--foreground);
line-height: 1.35;
}
.tiptap-writing-editor .ProseMirror h3 {
font-size: 1.0625rem;
font-weight: 600;
letter-spacing: -0.01em;
margin-top: 1.25rem;
margin-bottom: 0.5rem;
color: var(--foreground);
line-height: 1.4;
}
.tiptap-writing-editor .ProseMirror h2:first-child,
.tiptap-writing-editor .ProseMirror h3:first-child {
margin-top: 0;
}
.tiptap-writing-editor .ProseMirror strong {
font-weight: 600;
}
.tiptap-writing-editor .ProseMirror em {
font-style: italic;
}
.tiptap-writing-editor .ProseMirror s {
text-decoration: line-through;
opacity: 0.6;
}
.tiptap-writing-editor .ProseMirror ul {
list-style-type: disc;
margin-left: 1.5rem;
margin-bottom: 1rem;
font-size: 0.9375rem;
color: var(--foreground);
}
.tiptap-writing-editor .ProseMirror ol {
list-style-type: decimal;
margin-left: 1.5rem;
margin-bottom: 1rem;
font-size: 0.9375rem;
color: var(--foreground);
}
.tiptap-writing-editor .ProseMirror li {
line-height: 1.8;
margin-bottom: 0.25rem;
}
.tiptap-writing-editor .ProseMirror li > p {
margin-bottom: 0.25rem;
text-indent: 0; /* 列表项内段落不缩进 */
}
.tiptap-writing-editor .ProseMirror blockquote {
border-left: 3px solid var(--border);
padding-left: 1rem;
margin: 1.25rem 0;
font-style: italic;
font-size: 0.9375rem;
color: var(--muted-foreground);
}
.tiptap-writing-editor .ProseMirror pre {
background: var(--muted);
border-radius: 0.5rem;
padding: 1rem 1.25rem;
margin: 1rem 0 1.25rem;
overflow-x: auto;
border: 1px solid var(--border);
}
.tiptap-writing-editor .ProseMirror pre code {
background: transparent;
padding: 0;
font-size: 0.8125rem; /* 13px */
font-family: ui-monospace, 'Cascadia Code', 'Fira Code', monospace;
color: var(--foreground);
line-height: 1.7;
}
.tiptap-writing-editor .ProseMirror code {
background: var(--muted);
padding: 0.15rem 0.4rem;
border-radius: 0.25rem;
font-size: 0.8125rem;
font-family: ui-monospace, 'Cascadia Code', 'Fira Code', monospace;
color: var(--foreground);
border: 1px solid var(--border);
}
.tiptap-writing-editor .ProseMirror hr {
border: none;
border-top: 1px solid var(--border);
margin: 2rem 0;
}
.tiptap-writing-editor .ProseMirror a {
color: var(--primary);
text-decoration: underline;
text-underline-offset: 3px;
text-decoration-thickness: 1px;
transition: opacity 0.15s;
}
.tiptap-writing-editor .ProseMirror a:hover {
opacity: 0.75;
}
/* Placeholder */
.tiptap-writing-editor .ProseMirror p.is-editor-empty:first-child {
text-indent: 0; /* 占位文案不缩进 */
}
.tiptap-writing-editor .ProseMirror p.is-editor-empty:first-child::before {
content: attr(data-placeholder);
color: var(--muted-foreground);
pointer-events: none;
float: left;
height: 0;
opacity: 0.6;
}
/* Selection highlight — use color-mix to avoid the background+opacity mismatch */
.tiptap-writing-editor .ProseMirror ::selection {
background: color-mix(in srgb, #f87171 35%, transparent);
}
/* AI rewrite — highlight the selected range while the menu / preview is open */
.ai-rewrite-highlight {
background: color-mix(in srgb, #fbbf24 30%, transparent);
border-radius: 2px;
transition: background 0.2s ease;
}
.dark .ai-rewrite-highlight {
background: color-mix(in srgb, #fbbf24 18%, transparent);
}
:root {
--container-width-xs: calc(var(--spacing) * 72);
--container-width-sm: calc(var(--spacing) * 144);
--container-width-md: calc(var(--spacing) * 204);
--container-width-lg: calc(var(--spacing) * 256);
--container-width-xl: calc(var(--spacing) * 280);
}
/* ── Landing 态输入框 Gemini 风格:旋转彩色描边 + 多色柔光阴影 ───────── */
/* 关键:::before 转动的彩色锥形渐变 + ::after 内嵌白板遮罩中央,只在 1.5px 边缘可见模糊彩光 */
.gemini-shadow {
box-shadow:
0 0 20px rgba(66, 133, 244, 0.10),
0 0 40px rgba(219, 68, 55, 0.05),
0 0 60px rgba(244, 180, 0, 0.05),
0 0 80px rgba(15, 157, 88, 0.05);
}
.dark .gemini-shadow {
box-shadow:
0 0 24px rgba(66, 133, 244, 0.20),
0 0 48px rgba(219, 68, 55, 0.10),
0 0 72px rgba(244, 180, 0, 0.10),
0 0 96px rgba(15, 157, 88, 0.10);
}
.gemini-gradient-border {
position: relative;
background: var(--background);
border-radius: 1.5rem;
z-index: 0;
overflow: hidden;
}
.gemini-gradient-border::before {
content: '';
position: absolute;
width: 200%;
height: 200%;
top: -50%;
left: -50%;
background: conic-gradient(
from 0deg,
#4285F4 0deg,
#DB4437 90deg,
#F4B400 180deg,
#0F9D58 270deg,
#4285F4 360deg
);
z-index: -2;
animation: gemini-rotate 4s linear infinite;
filter: blur(10px);
pointer-events: none;
}
.gemini-gradient-border::after {
content: '';
position: absolute;
inset: 2.5px;
background: var(--background);
border-radius: calc(1.5rem - 2px);
z-index: -1;
}
@keyframes gemini-rotate {
to {
transform: rotate(360deg);
}
}
* {
border-color: var(--border);
outline-color: var(--ring);
}
/* ─── 全局字号缩放(只改字号,不动布局)──────────────────────────────────
* 用户在「设置 → 外观 → 字号」里选的倍数由 FontScaleApplier 写到
* <html> 的 `--ui-font-scale`(默认 1)。这里只把 Tailwind 的 `--text-*`
* 字号 token 乘以该倍数 —— 间距 token(--spacing)原样不动,所以 padding /
* margin / gap / 宽高这些布局尺寸不随字号变化,避免放大字体把页面挤错位。
* 行高用 Tailwind 默认的无单位比值,会跟随字号等比变化(文字不会重叠)。
* 不在 @layer 内,优先级高于 Tailwind 的主题层变量,确保覆盖生效。 */
:root {
--ui-font-scale: 1;
--text-xs: calc(0.75rem * var(--ui-font-scale, 1));
--text-sm: calc(0.875rem * var(--ui-font-scale, 1));
--text-base: calc(1rem * var(--ui-font-scale, 1));
--text-lg: calc(1.125rem * var(--ui-font-scale, 1));
--text-xl: calc(1.25rem * var(--ui-font-scale, 1));
--text-2xl: calc(1.5rem * var(--ui-font-scale, 1));
--text-3xl: calc(1.875rem * var(--ui-font-scale, 1));
--text-4xl: calc(2.25rem * var(--ui-font-scale, 1));
--text-5xl: calc(3rem * var(--ui-font-scale, 1));
--text-6xl: calc(3.75rem * var(--ui-font-scale, 1));
--text-7xl: calc(4.5rem * var(--ui-font-scale, 1));
--text-8xl: calc(6rem * var(--ui-font-scale, 1));
--text-9xl: calc(8rem * var(--ui-font-scale, 1));
}
/* 没有显式 text-* 类的元素(继承自 body 的默认正文)也跟随缩放。
* 只设 font-size,不影响任何盒模型尺寸。 */
body {
font-size: calc(1rem * var(--ui-font-scale, 1));
}
/* Strategy 顶栏:浅色 / 深色背景图随 html.dark 切换 */
.strategy-app-header {
background-color: transparent;
background-image: url("../assets/img/red-header.png");
background-size: cover;
background-repeat: no-repeat;
background-position: center;
}
html.dark .strategy-app-header {
background-image: url("../assets/img/top-bg.svg");
background-size: cover;
}
/* 深色顶栏:居中「CM助手」标题,落在背景图中间的发光梯形基座上。
左右菜单分区各 flex-1 等宽,本元素居中即对齐背景图基座。 */
.header-center-title {
flex: 0 0 auto;
height: 64px;
display: flex;
align-items: center;
justify-content: center;
/* 左右内边距随视口宽度等比缩放,与背景图基座的 background-size:cover 同步,
使两侧菜单在 1080p / 2K / 4K 下都贴齐发光基座边缘。
基准:1920 宽时 155px → 155/1920×100 ≈ 8.07vw。 */
padding: 0 8.07vw;
/* 文字略微上移,贴合基座视觉中心 */
transform: translateY(-6px);
font-family: "Source Han Sans SC", "Noto Sans SC", "Noto Sans S Chinese",
"Microsoft YaHei", sans-serif;
font-size: 26px;
font-weight: 700;
letter-spacing: 4px;
white-space: nowrap;
pointer-events: none;
user-select: none;
}
.header-center-title__label {
/* 白→浅蓝→白 金属质感渐变文字 */
background: linear-gradient(
180deg,
#f9f9fa 0%,
#ffffff 15%,
#d8e5ff 49%,
#ffffff 89%,
#f8fafb 100%
);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
filter: drop-shadow(0 0 14px rgba(120, 200, 255, 0.35));
}
/* ── 浅蓝主题:覆盖散落在各处的红色硬编码(CSS 变量管不到的地方)────────── */
html.lightblue .strategy-app-header {
background-image: url("../assets/img/blue-header.png");
}
html.lightblue *::-webkit-scrollbar-thumb {
background: linear-gradient(180deg, rgb(85 166 254 / 0.82), rgb(0 98 217 / 0.9))
padding-box;
}
html.lightblue .workspace-panel {
border: 1px solid #d6e4f5;
box-shadow:
0 32px 72px -46px rgb(42 70 110 / 0.35),
0 12px 28px -22px rgb(75 120 180 / 0.24);
}
html.lightblue .workspace-user-bubble {
border: 1px solid rgb(255 255 255 / 0.14);
background: linear-gradient(135deg, #55a6fe 0%, #0079fe 58%, #0062d9 100%);
box-shadow:
0 22px 40px -28px rgb(0 98 217 / 0.55),
0 10px 20px -16px rgb(0 54 140 / 0.42);
}
html.lightblue .workspace-assistant-card {
border: 1px solid #d9e6f5;
}
html.lightblue .workspace-assistant-card::before {
background: linear-gradient(180deg, rgb(85 166 254 / 0.92), rgb(0 121 254 / 0.15));
}
html.lightblue .tiptap-writing-editor .ProseMirror ::selection {
background: color-mix(in srgb, #55a6fe 35%, transparent);
}
/* ── 来源上传弹窗:A系统基因库的分段单选条(custom-radio) ─────────────── */
/* 外层容器,模拟 nz-radio-group */
.custom-radio-group {
display: inline-flex;
align-items: center;
font-size: 12px;
}
/* 单个按钮样式 */
.custom-radio-btn {
position: relative;
display: inline-block;
padding: 5px 16px;
line-height: 12px;
background: #fff;
border: 1px solid #d9d9d9;
cursor: pointer;
/* 除第一个外向左移 1px,实现边框重叠,消除双层边框 */
margin-left: -1px;
transition: all 0.1s ease;
user-select: none;
}
/* 第一个按钮:左侧圆角 */
.custom-radio-btn:first-child {
margin-left: 0;
border-radius: 4px 0 0 4px;
}
/* 最后一个按钮:右侧圆角 */
.custom-radio-btn:last-child {
border-radius: 0 4px 4px 0;
}
/* 悬浮状态 */
.custom-radio-btn:hover {
color: #1890ff;
z-index: 1;
}
/* 选中状态 */
.custom-radio-btn.active {
background-color: #e6f7ff;
border-color: #1890ff;
color: #1890ff;
z-index: 2;
}
/* --------------------------------------------------------------------------
* Legacy Chrome visual fallbacks
*
* Tailwind v4 deliberately uses color-mix() for `bg-primary/10` and similar
* opacity utilities. In Chrome versions without color-mix(), its generated
* fallback is the fully opaque primary color. That turns pale selected cards
* into solid red blocks and makes same-color icons disappear. Keep critical
* agent surfaces on classic rgba()/hex colours instead.
* -------------------------------------------------------------------------- */
.agent-avatar {
background-color: #feeded;
color: #cf1322;
box-shadow: inset 0 0 0 1px rgba(190, 35, 35, 0.15);
}
.dark .agent-avatar {
background-color: #1b355d;
color: #ffffff;
box-shadow: inset 0 0 0 1px rgba(91, 157, 255, 0.38);
}
.lightblue .agent-avatar {
background-color: #eaf4ff;
color: #0062d9;
box-shadow: inset 0 0 0 1px rgba(0, 98, 217, 0.16);
}
.agent-sidebar-card--active {
background-color: #feeded;
border-color: rgba(190, 35, 35, 0.5);
}
.dark .agent-sidebar-card--active {
background-color: #0b4fae;
border-color: #2b8ffe;
}
.lightblue .agent-sidebar-card--active {
background-color: #eaf4ff;
border-color: rgba(0, 98, 217, 0.5);
}
@supports not (color: oklch(1 0 0)) {
.bg-primary\/5 { background-color: rgba(190, 35, 35, 0.05); }
.bg-primary\/8 { background-color: rgba(190, 35, 35, 0.08); }
.bg-primary\/10 { background-color: rgba(190, 35, 35, 0.10); }
.bg-primary\/14 { background-color: rgba(190, 35, 35, 0.14); }
.bg-primary\/15 { background-color: rgba(190, 35, 35, 0.15); }
.bg-primary\/20 { background-color: rgba(190, 35, 35, 0.20); }
.bg-primary\/25 { background-color: rgba(190, 35, 35, 0.25); }
.bg-primary\/30 { background-color: rgba(190, 35, 35, 0.30); }
.bg-primary\/60 { background-color: rgba(190, 35, 35, 0.60); }
.bg-primary\/70 { background-color: rgba(190, 35, 35, 0.70); }
.bg-primary\/90 { background-color: rgba(190, 35, 35, 0.90); }
.border-primary\/15 { border-color: rgba(190, 35, 35, 0.15); }
.border-primary\/20 { border-color: rgba(190, 35, 35, 0.20); }
.border-primary\/25 { border-color: rgba(190, 35, 35, 0.25); }
.border-primary\/30 { border-color: rgba(190, 35, 35, 0.30); }
.border-primary\/35 { border-color: rgba(190, 35, 35, 0.35); }
.border-primary\/40 { border-color: rgba(190, 35, 35, 0.40); }
.border-primary\/50 { border-color: rgba(190, 35, 35, 0.50); }
.border-primary\/60 { border-color: rgba(190, 35, 35, 0.60); }
.ring-primary\/15 { --tw-ring-color: rgba(190, 35, 35, 0.15); }
.ring-primary\/20 { --tw-ring-color: rgba(190, 35, 35, 0.20); }
.ring-primary\/30 { --tw-ring-color: rgba(190, 35, 35, 0.30); }
.ring-primary\/40 { --tw-ring-color: rgba(190, 35, 35, 0.40); }
.ring-primary\/50 { --tw-ring-color: rgba(190, 35, 35, 0.50); }
.ring-primary\/60 { --tw-ring-color: rgba(190, 35, 35, 0.60); }
.dark .bg-primary\/5 { background-color: rgba(43, 129, 255, 0.05); }
.dark .bg-primary\/8 { background-color: rgba(43, 129, 255, 0.08); }
.dark .bg-primary\/10 { background-color: rgba(43, 129, 255, 0.10); }
.dark .bg-primary\/14 { background-color: rgba(43, 129, 255, 0.14); }
.dark .bg-primary\/15 { background-color: rgba(43, 129, 255, 0.15); }
.dark .bg-primary\/20 { background-color: rgba(43, 129, 255, 0.20); }
.dark .bg-primary\/25 { background-color: rgba(43, 129, 255, 0.25); }
.dark .bg-primary\/30 { background-color: rgba(43, 129, 255, 0.30); }
.dark .bg-primary\/60 { background-color: rgba(43, 129, 255, 0.60); }
.dark .bg-primary\/70 { background-color: rgba(43, 129, 255, 0.70); }
.dark .bg-primary\/90 { background-color: rgba(43, 129, 255, 0.90); }
.lightblue .bg-primary\/5 { background-color: rgba(0, 98, 217, 0.05); }
.lightblue .bg-primary\/8 { background-color: rgba(0, 98, 217, 0.08); }
.lightblue .bg-primary\/10 { background-color: rgba(0, 98, 217, 0.10); }
.lightblue .bg-primary\/14 { background-color: rgba(0, 98, 217, 0.14); }
.lightblue .bg-primary\/15 { background-color: rgba(0, 98, 217, 0.15); }
.lightblue .bg-primary\/20 { background-color: rgba(0, 98, 217, 0.20); }
.lightblue .bg-primary\/25 { background-color: rgba(0, 98, 217, 0.25); }
.lightblue .bg-primary\/30 { background-color: rgba(0, 98, 217, 0.30); }
.lightblue .bg-primary\/60 { background-color: rgba(0, 98, 217, 0.60); }
.lightblue .bg-primary\/70 { background-color: rgba(0, 98, 217, 0.70); }
.lightblue .bg-primary\/90 { background-color: rgba(0, 98, 217, 0.90); }
}