@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 在 加 `.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 选择器作用到 容器,于是高度收缩到容器而非整屏 —— 这正是「高度对齐容器」所需。 只设 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 写到 * 的 `--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); } }