/* ========================================================================= Design Token System — 三层架构 (Primitive → Semantic → Component) 详见 Wayfinder #96: https://github.com/ddcat-ai/open-ai-canvas/issues/96 规范:禁止在组件中新增裸 text-[Npx]/rounded-[Npx]/z-[N],必须使用 token ========================================================================= */ /* ------------------------------------------------------------------------- Layer 1: Primitive — 纯值,无语义,不随主题变(所有维度的基础) ------------------------------------------------------------------------- */ :root { /* --- 0. 字体(composio:Inter + 开源等宽;@theme inline 自引用解析点)--- */ --font-sans: "Inter Variable", "Inter", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", ui-sans-serif, system-ui, sans-serif; --font-mono: "JetBrains Mono Variable", "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; --font-heading: "Inter Variable", "Inter", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", ui-sans-serif, system-ui, sans-serif; /* --- 1. 色彩(oklch 色板)--- */ --color-neutral-0: oklch(1 0 0); --color-neutral-50: oklch(0.985 0 0); --color-neutral-100: oklch(0.97 0 0); --color-neutral-200: oklch(0.922 0 0); --color-neutral-300: oklch(0.87 0 0); --color-neutral-400: oklch(0.708 0 0); --color-neutral-500: oklch(0.556 0 0); --color-neutral-600: oklch(0.439 0 0); --color-neutral-700: oklch(0.371 0 0); --color-neutral-800: oklch(0.269 0 0); --color-neutral-900: oklch(0.205 0 0); --color-neutral-950: oklch(0.145 0 0); /* 节点类型语义色板(对应 #97 色带+图标徽章方案) 注意:用 --palette- 前缀避免与 @theme 的 --color-* 命名空间冲突导致循环引用 */ --palette-node-image: oklch(0.75 0.15 75); /* 琥珀 300 — 图片 */ --palette-node-video: oklch(0.65 0.22 350); /* 品红 400 — 视频 */ --palette-node-text: oklch(0.45 0.02 250); /* 中性蓝灰 700 — 文本 */ --palette-node-audio: oklch(0.7 0.13 220); /* 青蓝 400 — 音频 */ --palette-node-config: oklch(0.55 0.04 250); /* 灰蓝 500 — 配置 */ --palette-node-script: oklch(0.6 0.18 300); /* 紫色 400 — 脚本 */ --palette-node-drawing: oklch(0.65 0.12 55); /* 赭石 400 — 绘图 */ --palette-node-frame: oklch(0.7 0.15 155); /* 翠绿 400 — 帧 */ --palette-node-character: oklch(0.78 0.13 20); /* 桃红 300 — 角色引用 */ --palette-node-skill: oklch(0.7 0.17 55); /* 橙色 400 — 技能 */ /* 状态色(用 --palette- 前缀避免循环引用)*/ --palette-status-success: #16a34a; --palette-status-error: #dc2626; --palette-status-loading: #2563eb; --palette-status-warning: #d97706; /* 顶部常驻通知条主题色:按「通知类型」区分底色(类型定义见 lib/announcements/banner-notice) 两档取值都由白字对比度反推——light 档 ≥ 4.5:1(WCAG AA 正文),dark 档约 8.5:1(压暗避免刺眼)*/ --palette-banner-notice-500: #5c67e2; /* 公告 · 白字 4.67:1 */ --palette-banner-notice-700: #3f4590; /* 白字 8.52:1 */ --palette-banner-activity-500: #da2470; /* 活动 · 白字 4.70:1 */ --palette-banner-activity-700: #7b3552; /* 白字 8.49:1 */ --palette-banner-update-500: #138279; /* 更新 · 白字 4.67:1 */ --palette-banner-update-700: #235450; /* 白字 8.55:1 */ --palette-banner-warning-500: #b55b0c; /* 警告 · 白字 4.70:1 */ --palette-banner-warning-700: #6a4424; /* 白字 8.52:1 */ /* --- 2. 间距(4px 栅格 + 半距)--- */ --space-0: 0px; --space-half: 2px; --space-1: 4px; --space-1-half: 6px; --space-2: 8px; --space-2-half: 10px; --space-3: 12px; --space-3-half: 14px; --space-4: 16px; --space-5: 20px; --space-6: 24px; --space-8: 32px; --space-10: 40px; --space-12: 48px; --space-16: 64px; --space-20: 80px; --space-24: 96px; /* --- 3. 字号(10 档)--- */ --fs-nano: 7px; /* 纳米标注(角标计数、节点预览、% 后缀)*/ --fs-micro: 9px; /* 极小标注(分镜行号辅助)*/ --fs-tiny: 10px; /* 小标注(徽章、tag)*/ --fs-label: 11px; /* 标签文字 */ --fs-caption: 12px; /* 说明文字 */ --fs-body: 14px; /* 正文(基准)*/ --fs-body-lg: 15px; /* 大正文 */ --fs-heading: 16px; /* 小标题 */ --fs-heading-lg: 18px; /* 大标题 */ --fs-title: 22px; /* 页面标题 */ --fs-display: 36px; /* 展示标题 */ /* --- 3b. composio 排版语义(tokens.json typography 14 档;字号变量,行高/字重/字距见 utilities .typ-* 类)--- */ --typ-display-mega: 72px; /* display-mega */ --typ-display-xl: 56px; /* display-xl */ --typ-display-lg: 44px; /* display-lg */ --typ-display-md: 32px; /* display-md */ --typ-display-sm: 24px; /* display-sm */ --typ-title-md: 18px; /* title-md */ --typ-title-sm: 16px; /* title-sm */ --typ-body-md: 16px; /* body-md */ --typ-body-sm: 14px; /* body-sm */ --typ-caption: 13px; /* caption */ --typ-caption-uppercase: 11px; /* caption-uppercase */ --typ-code: 13px; /* code */ --typ-button: 14px; /* button */ --typ-nav-link: 14px; /* nav-link */ /* --- 4. 圆角(10 档)--- */ --r-xs: 4px; --r-sm: 6px; --r-md: 8px; --r-lg: 12px; --r-xl: 14px; --r-2xl: 16px; --r-3xl: 20px; --r-4xl: 24px; --r-tight: 15px; --r-dock-compact: 13px; --r-wide-tight: 22px; --r-5xl: 32px; --r-full: 9999px; /* --- 5. 阴影(含 glow)--- */ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.04); --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.06); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08); --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.1); --shadow-xl: 0 16px 40px rgba(0, 0, 0, 0.12); --shadow-2xl: 0 24px 60px rgba(0, 0, 0, 0.16); --shadow-glow-sm: 0 0 12px rgba(125, 162, 255, 0.2); --shadow-glow-md: 0 0 24px rgba(125, 162, 255, 0.3); --shadow-glow-lg: 0 0 40px rgba(125, 162, 255, 0.4); /* --- 5b. 抬升(overlay / card)--- --shadow-* 在暗色下会翻成白影,浮层用会发光刺眼。以下 token 两个主题都用黑影, 靠 hairline(内描边)而不是发光来交代层级,浮层与卡片统一引用这里。 */ /* 亮色下卡片浮在白底上,hairline 要比暗色更实才看得见边界(暗色靠影,亮色靠线)。 */ --elevation-hairline: inset 0 0 0 1px rgba(17, 17, 17, 0.13); --elevation-card: 0 1px 2px rgba(0, 0, 0, 0.05); --elevation-card-hover: 0 10px 26px rgba(0, 0, 0, 0.1), 0 2px 5px rgba(0, 0, 0, 0.05); --elevation-overlay: 0 24px 60px rgba(0, 0, 0, 0.2), 0 3px 10px rgba(0, 0, 0, 0.09); --elevation-panel: -18px 0 52px rgba(0, 0, 0, 0.16); --focus-ring-soft: 0 0 0 3px color-mix(in srgb, var(--ring) 28%, transparent); /* 卡片表面:亮色需要一点灰底把卡片从白页面里托出来,暗色则是提亮。 */ --surface-card: rgba(17, 17, 17, 0.028); --surface-card-hover: rgba(17, 17, 17, 0.055); /* 项目列表卡是高频入口,不能沿用过轻的通用 surface。 */ --project-library-surface: #f5f5f5; --project-library-cover-surface: #ececec; --project-library-icon-surface: #ffffff; --project-library-shadow: none; /* === 新卡片系统 Token(对应 docs/ui-design-system.md)=== */ /* 卡片表面通过明度分层,普通卡片不依赖描边和投影。 */ --card-surface: #f7f7f7; --card-surface-hover: #f0f0f0; --card-surface-raised: #ececec; --card-border: transparent; --card-border-hover: transparent; --card-elevation: none; --card-elevation-hover: none; /* 画布卡片封面区 - 浅灰衬托内容 */ --canvas-cover-surface: #f5f5f5; --canvas-icon-surface: #ffffff; --canvas-icon-shadow: 0 2px 8px rgba(0, 0, 0, 0.12); /* 画布文件夹:由现有画布语义色派生,封面样式不脱离主题合同。 */ --canvas-folder-surface: color-mix(in srgb, var(--background) 76%, transparent); --canvas-folder-surface-strong: color-mix(in srgb, var(--background) 90%, transparent); --canvas-folder-edge: color-mix(in srgb, var(--background) 72%, var(--foreground) 28%); --canvas-folder-ink: var(--foreground); --canvas-folder-muted: color-mix(in srgb, var(--foreground) 52%, transparent); --canvas-folder-action-bg: var(--btn-solid-bg); --canvas-folder-action-fg: var(--btn-solid-fg); --canvas-folder-shadow: var(--elevation-overlay); /* 媒体区背景 */ --media-surface: #f5f5f5; /* 骨架屏 */ --skeleton-surface: linear-gradient( 90deg, rgba(17, 17, 17, 0.04) 0%, rgba(17, 17, 17, 0.06) 50%, rgba(17, 17, 17, 0.04) 100% ); /* 交互状态必须成对定义背景和前景。主操作、普通选择、勾选和 Switch 是四种不同角色,禁止再把反相主按钮颜色直接复用到普通选中态。 */ --btn-solid-bg: #171717; --btn-solid-hover-bg: #303030; --btn-solid-active-bg: #404040; --btn-solid-fg: #ffffff; --btn-outline-border: color-mix(in srgb, var(--foreground) 16%, transparent); --btn-outline-hover-border: color-mix(in srgb, var(--foreground) 28%, transparent); --btn-outline-hover-bg: color-mix(in srgb, var(--foreground) 6%, transparent); --btn-outline-active-bg: color-mix(in srgb, var(--foreground) 9%, transparent); --control-selected-bg: rgba(17, 17, 17, 0.09); --control-selected-hover-bg: rgba(17, 17, 17, 0.13); --control-selected-fg: #171717; --control-selected-border: rgba(17, 17, 17, 0.18); --control-check-bg: #171717; --control-check-fg: #ffffff; --control-switch-checked-bg: #16a34a; --control-switch-checked-hover-bg: #15803d; --control-switch-checked-handle: #ffffff; --control-switch-off-bg: #b8b8b8; --control-switch-off-hover-bg: #9f9f9f; --control-switch-off-handle: #ffffff; --destructive-hover: #b91c1c; --destructive-active: #991b1b; --destructive-foreground: #ffffff; --control-disabled-bg: rgba(17, 17, 17, 0.05); --control-disabled-fg: rgba(17, 17, 17, 0.36); --control-focus-ring: color-mix(in srgb, var(--ring) 72%, transparent); /* --- 6. Elevation(z-index 14 档,按视觉层划分,见 ADR-001)--- */ --z-canvas: 0; /* L0 画布底 */ --z-canvas-overlay: 5; /* L1 画布覆盖(网格、连线)*/ --z-node: 10; /* L2 节点层(未选中)*/ --z-node-active: 20; /* L3 激活节点(选中/拖拽)*/ --z-toolbar: 30; /* L4 浮动工具栏(顶栏、dock、zoom)*/ --z-node-toolbar: 50; /* L5 节点工具栏(click 触发)*/ --z-panel: 60; /* L6 侧边面板(侧栏、素材托盘)*/ --z-panel-floating: 80; /* L7 浮动面板(助手/agent/活动任务)*/ --z-modal: 100; /* L8 对话框 */ --z-modal-overlay: 110; /* L9 遮罩 */ --z-canvas-overlay-active: 150; /* 画布浮层:最后交互的面板 */ --z-popover: 200; /* L10 弹出层 */ --z-toast: 500; /* L11 通知 */ --z-tooltip: 1000; /* L12 提示 */ --z-dialog-popover: 1100; /* AntD Modal 之上的设置浮层 */ --z-loader: 1200; /* 全屏加载遮罩 */ --z-max: 2000; /* L13 最高(紧急通知)*/ /* --- 6b. Canvas 浮层定位 inset(画布安全区,对应审计 D2/P0-2)--- */ --canvas-inset-x: 16px; /* 浮层水平安全区(dock inset、顶栏 px)*/ --canvas-inset-y: 16px; /* 浮层垂直安全区(dock 底部)*/ --canvas-topbar-h: 64px; /* 顶部栏高度 */ --canvas-topbar-offset: calc(var(--canvas-topbar-h) + 8px); /* 顶栏下方浮层顶部偏移 */ --canvas-dock-popover-offset: 50px; /* dock 弹出面板底部偏移 */ /* --- 7. 动效(对应 #99 动效 token)--- */ /* duration */ --motion-dur-instant: 80ms; --motion-dur-fast: 150ms; --motion-dur-base: 250ms; --motion-dur-slow: 400ms; --motion-dur-emphasize: 600ms; /* easing */ --motion-ease-out: cubic-bezier(0.22, 1, 0.36, 1); --motion-ease-in: cubic-bezier(0.64, 0, 0.78, 0); --motion-ease-in-out: cubic-bezier(0.64, 0, 0.36, 1); --motion-ease-overshoot: cubic-bezier(0.34, 1.56, 0.64, 1); --motion-ease-linear: linear; /* delay */ --motion-delay-none: 0ms; --motion-delay-xs: 30ms; --motion-delay-sm: 60ms; --motion-delay-md: 100ms; --motion-delay-lg: 150ms; /* motion-scale(联动 prefers-reduced-motion)*/ --motion-scale: 1; /* --- 8. 描边宽度 --- */ --stroke-0: 0px; --stroke-1: 1px; --stroke-2: 2px; --stroke-3: 3px; /* --- 9. 不透明度(6 档)--- */ --opa-hide: 0.08; --opa-faint: 0.2; --opa-muted: 0.45; --opa-subtle: 0.55; --opa-medium: 0.72; --opa-full: 1; /* 毛玻璃参数:收敛浮层玻璃质感,避免组件散落字面 blur/saturate */ --glass-blur: 10px; --glass-saturate: 112%; --glass-alpha: 0.94; --glass-alpha-strong: 0.97; --glass-border-alpha: 0.78; /* 登录表单跟随全局明暗主题;品牌影片保留独立深色舞台。 */ --auth-page-bg: #ffffff; --auth-panel-bg: #f7f7f7; --auth-card-bg: #ffffff; --auth-accent: #2563eb; --auth-muted: #737373; /* 协议勾选框的填充色与对勾色。必须成对维护:两者相近会在某一主题下 退化成看不见的勾选态。深色主题下这里与 --foreground 的白色相反。 */ --auth-check-bg: #171717; --auth-check-fg: #ffffff; /* 可配置皮肤的组件入口。经典主题保持这些项目原始值;自定义主题在 React 启动前由公开外观配置覆盖,页面和组件只消费这些语义变量。 */ --icon-foreground: #3f3f46; --icon-muted: #a1a1aa; --icon-active: #171717; --control-radius: 6px; --button-radius: 6px; --input-radius: 6px; --card-radius: 12px; --overlay-radius: 12px; --menu-radius: 8px; --checkbox-radius: 4px; --control-border-width: 1px; --focus-ring-width: 2px; --icon-size: 16px; --theme-hover-lift: 1px; } /* prefers-reduced-motion 降级(对应 #99 三级降级策略 L1)*/ @media (prefers-reduced-motion: reduce) { :root { --motion-scale: 0.3; } } /* 用户在应用内选择"无动效"时,JS 添加 .no-motion 类(L2 禁用)*/ .no-motion { --motion-scale: 0; } /* infinite 装饰动画在 reduced-motion / no-motion 下降级(对应 #99 三级降级)*/ @media (prefers-reduced-motion: reduce) { .canvas-connection-flow, .canvas-connection-comet, .canvas-connection-draft, .canvas-task-progress-shimmer, .ai-title-aurora, .creation-intro-mark, .creation-intro-word, .creation-intro-signal { animation-duration: 0.01ms; animation-iteration-count: 1; } } .no-motion .canvas-connection-flow, .no-motion .canvas-connection-comet, .no-motion .canvas-connection-draft, .no-motion .canvas-task-progress-shimmer, .no-motion .ai-title-aurora, .no-motion .creation-intro-mark, .no-motion .creation-intro-word, .no-motion .creation-intro-signal { animation: none; } .auth-scene { background: var(--auth-page-bg); color: var(--foreground); } .auth-scene-hero { background: var(--auth-panel-bg); color: var(--foreground); } .auth-scene-hero-overlay { background: linear-gradient( 180deg, color-mix(in srgb, var(--auth-panel-bg) 40%, transparent), transparent 42%, color-mix(in srgb, var(--auth-panel-bg) 76%, transparent) ); pointer-events: none; } .auth-scene-brand, .auth-scene-brand:hover { color: inherit; } .auth-scene-hero-control { border: 1px solid color-mix(in srgb, var(--foreground) 16%, transparent); background: color-mix(in srgb, var(--auth-panel-bg) 78%, transparent); color: color-mix(in srgb, var(--foreground) 82%, transparent); } .auth-scene-hero-control:hover { background: color-mix(in srgb, var(--auth-panel-bg) 92%, transparent); } .auth-scene-hero-muted { color: color-mix(in srgb, var(--foreground) 64%, transparent); } .auth-scene-hero-title { color: var(--foreground); } .auth-scene-form-pane { background: var(--auth-panel-bg); } .auth-scene-video-blend { background: linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--auth-panel-bg) 68%, transparent) 58%, var(--auth-panel-bg) 100%); } .auth-scene-card { background: var(--auth-card-bg); box-shadow: var(--elevation-card-hover); } .auth-scene-eyebrow { color: var(--auth-accent); } .auth-scene-muted { color: var(--auth-muted); } .auth-scene-label { color: color-mix(in srgb, var(--foreground) 72%, transparent); } .auth-scene-icon { color: var(--auth-muted); } .auth-scene-link { color: var(--auth-accent); } .auth-scene-link:hover { color: var(--foreground); } .auth-scene-link:focus-visible { outline: var(--focus-ring-width) solid var(--ring); outline-offset: 3px; } .auth-scene-divider.ant-divider { border-color: var(--border); color: var(--auth-muted); } .auth-scene-notice { --auth-notice-color: var(--palette-status-warning); border-color: color-mix(in srgb, var(--auth-notice-color) 24%, transparent); background: color-mix(in srgb, var(--auth-notice-color) 6%, transparent); color: var(--foreground); } .auth-scene-notice[data-tone="blue"] { --auth-notice-color: var(--palette-status-loading); } .auth-scene-notice > span:first-child { color: var(--auth-notice-color); } .auth-scene-return { border: var(--control-border-width) solid var(--border); background: color-mix(in srgb, var(--foreground) 4%, transparent); color: var(--auth-muted); } .auth-scene-return:hover { border-color: var(--input); background: color-mix(in srgb, var(--foreground) 8%, transparent); color: var(--foreground); } /* --- 注册页协议同意行 --------------------------------------------------------- 勾选热区必须覆盖“文字 + 协议名”整段,但协议名同时是可点击的阅读入口, 因此热区由 label 承担,协议名按钮用 stopPropagation 之外的方式独立可点: 这里只做视觉与排布,行为仍由 React 侧控制。 */ .auth-agreement-row { display: flex; align-items: flex-start; gap: var(--space-2); padding: var(--space-2) var(--space-3); border: var(--control-border-width) solid transparent; border-radius: var(--r-sm); color: var(--auth-muted); font-size: var(--fs-label); line-height: 1.65; transition: border-color var(--motion-instant) ease-out, background-color var(--motion-instant) ease-out, color var(--motion-instant) ease-out; } .auth-agreement-row:hover { background: color-mix(in srgb, var(--foreground) 4%, transparent); } /* 已勾选时用极轻的强调底色标记“这一步已完成”,不做成第二主色。 */ .auth-agreement-row[data-accepted="true"] { border-color: color-mix(in srgb, var(--foreground) 10%, transparent); background: color-mix(in srgb, var(--foreground) 4.5%, transparent); color: color-mix(in srgb, var(--foreground) 78%, transparent); } /* 未勾选时给协议名一个克制的提示底色,指向“这里还没有同意”。 */ .auth-agreement-row[data-accepted="false"] .auth-agreement-link { text-decoration-line: underline; text-decoration-color: color-mix(in srgb, var(--auth-accent) 42%, transparent); text-decoration-thickness: 1px; text-underline-offset: 3px; } .auth-agreement-row .ant-checkbox-wrapper { flex: 0 0 auto; margin-inline-end: 0; color: inherit; font-size: inherit; line-height: inherit; } /* AntD 默认把 checkbox 行高 22px 与文案首行错开 1px 左右,这里统一到首行。 */ .auth-agreement-row .ant-checkbox { align-self: flex-start; top: 0.1em; } .auth-agreement-row .ant-checkbox + span { padding-inline-start: var(--space-2); padding-inline-end: 0; } .auth-agreement-label { color: inherit; } .auth-agreement-link { display: inline; margin: 0; padding: 0; border: 0; background: none; color: var(--auth-accent); font: inherit; line-height: inherit; text-align: start; transition: color var(--motion-instant) ease-out; } .auth-agreement-link:hover { color: var(--foreground); } .auth-agreement-link:focus-visible { border-radius: 3px; outline: var(--focus-ring-width) solid var(--ring); outline-offset: 3px; } /* --- 协议阅读弹窗 ------------------------------------------------------------- 长条款需要稳定的阅读列宽和可预期的滚动边界;正文段落之间用间距而不是 空行撑开,避免后台多段文本被渲染成松散的空洞。 */ .auth-agreement-modal .ant-modal-container { border-radius: var(--r-lg); } .auth-agreement-modal .ant-modal-header { margin-bottom: var(--space-1); } .auth-agreement-modal .ant-modal-title { font-size: var(--fs-title-sm, 16px); font-weight: 600; letter-spacing: -0.01em; line-height: 1.5; } .auth-agreement-body { max-height: min(56vh, 460px); overflow-y: auto; padding-inline-end: var(--space-3); overscroll-behavior: contain; color: color-mix(in srgb, var(--foreground) 74%, transparent); font-size: var(--fs-body, 13px); line-height: 1.85; } .auth-agreement-body p { margin: 0; } .auth-agreement-body p + p { margin-top: var(--space-4); } /* 启用“一、二、三”式条目标题时,标题段单独加重,正文段保持常规字重。 */ .auth-agreement-body p[data-role="heading"] { margin-top: var(--space-5); color: var(--foreground); font-weight: 600; } .auth-agreement-body p[data-role="heading"]:first-child { margin-top: 0; } .auth-agreement-empty { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-4) var(--space-3); border: var(--control-border-width) dashed color-mix(in srgb, var(--foreground) 16%, transparent); border-radius: var(--r-md); color: var(--auth-muted); font-size: var(--fs-label); justify-content: center; } .auth-agreement-meta { display: flex; align-items: center; gap: var(--space-2); margin-top: var(--space-4); padding-top: var(--space-3); border-top: var(--control-border-width) solid var(--border); color: var(--auth-muted); font-size: var(--fs-micro, 11px); letter-spacing: 0.01em; } .site-compliance-footer { display: flex; min-width: 0; align-items: center; justify-content: center; gap: var(--space-3); padding: var(--space-3) var(--space-4); color: color-mix(in srgb, var(--foreground) 48%, transparent); font-size: var(--fs-label); line-height: 1.6; text-align: center; } .site-compliance-footer > span { min-width: 0; max-width: 100%; overflow-wrap: anywhere; } .site-compliance-footer a { display: inline-flex; align-items: center; gap: var(--space-1); color: inherit; text-decoration: none; transition: color var(--motion-instant) ease-out; } .site-compliance-footer a:hover, .site-compliance-footer a:focus-visible { color: var(--foreground); } .site-compliance-footer a:focus-visible { outline: 1px solid color-mix(in srgb, var(--ring) 68%, transparent); outline-offset: 3px; } .site-compliance-footer svg { width: 11px; height: 11px; } .site-compliance-footer.is-auth { min-height: 54px; border-top: var(--control-border-width) solid var(--border); background: color-mix(in srgb, var(--auth-panel-bg) 88%, transparent); color: var(--auth-muted); backdrop-filter: blur(14px); } .site-compliance-footer.is-auth a:hover, .site-compliance-footer.is-auth a:focus-visible { color: var(--foreground); } @media (max-width: 640px) { .site-compliance-footer { flex-direction: column; gap: var(--space-1); } } /* 动效计算函数(实际 duration = base * motion-scale)*/ :root { --motion-dur-instant-calc: calc(var(--motion-dur-instant) * var(--motion-scale)); --motion-dur-fast-calc: calc(var(--motion-dur-fast) * var(--motion-scale)); --motion-dur-base-calc: calc(var(--motion-dur-base) * var(--motion-scale)); --motion-dur-slow-calc: calc(var(--motion-dur-slow) * var(--motion-scale)); --motion-dur-emphasize-calc: calc(var(--motion-dur-emphasize) * var(--motion-scale)); } @theme inline { /* 响应式断点(对应 #99 四断点体系:mobile/tablet/desktop/wide)*/ --breakpoint-tablet: 768px; --breakpoint-desktop: 1024px; --breakpoint-wide: 1440px; --color-background: var(--background); --color-foreground: var(--foreground); --color-border: var(--border); --color-ring: var(--ring); --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); --font-heading: var(--font-sans); --font-sans: var(--font-sans); --font-mono: var(--font-mono); --color-sidebar-ring: var(--sidebar-ring); --color-sidebar-border: var(--sidebar-border); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-accent: var(--sidebar-accent); --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); --color-sidebar-primary: var(--sidebar-primary); --color-sidebar-foreground: var(--sidebar-foreground); --color-sidebar: var(--sidebar); --color-chart-5: var(--chart-5); --color-chart-4: var(--chart-4); --color-chart-3: var(--chart-3); --color-chart-2: var(--chart-2); --color-chart-1: var(--chart-1); --color-input: var(--input); --color-destructive: var(--destructive); --color-accent-foreground: var(--accent-foreground); --color-accent: var(--accent); --color-muted-foreground: var(--muted-foreground); --color-muted: var(--muted); --color-secondary-foreground: var(--secondary-foreground); --color-secondary: var(--secondary); --color-primary-foreground: var(--primary-foreground); --color-primary: var(--primary); --color-popover-foreground: var(--popover-foreground); --color-popover: var(--popover); --color-card-foreground: var(--card-foreground); --color-card: var(--card); --radius-2xl: calc(var(--radius) * 1.8); --radius-3xl: calc(var(--radius) * 2.2); --radius-4xl: calc(var(--radius) * 2.6); /* === Design Token System 映射(对应 #96 三层架构)=== */ /* 色彩 — 节点类型色(可用 text-node-image / bg-node-video 等)*/ --color-node-image: var(--cn-type-image); --color-node-video: var(--cn-type-video); --color-node-text: var(--cn-type-text); --color-node-audio: var(--cn-type-audio); --color-node-config: var(--cn-type-config); --color-node-script: var(--cn-type-script); --color-node-drawing: var(--cn-type-drawing); --color-node-frame: var(--cn-type-frame); --color-node-character: var(--cn-type-character); --color-node-skill: var(--cn-type-skill); /* 色彩 — 状态色(可用 text-status-success / bg-status-error 等)*/ --color-status-success: var(--status-success); --color-status-error: var(--status-error); --color-status-loading: var(--status-loading); --color-status-warning: var(--status-warning); --color-surface: var(--surface); --color-surface-hover: var(--surface-hover); --color-surface-active: var(--surface-active); --color-surface-secondary: var(--bg-secondary); --color-surface-tertiary: var(--bg-tertiary); --color-surface-strong: var(--workspace-surface-strong); --color-workspace-glass: var(--workspace-glass-surface); /* 色彩 — Canvas 语义色 */ --color-cn-text: var(--cn-text); --color-cn-muted: var(--cn-muted); --color-cn-faint: var(--cn-faint); --color-cn-stroke: var(--cn-stroke); --color-cn-fill: var(--cn-fill); /* 字号 注意:Tailwind v4 的字号命名空间是 --text-*,--font-size-* 不被识别, 因此下面这组声明不会生成 text-micro / text-caption 之类的工具类。 组件请沿用既有惯例直接引用 Primitive:text-[var(--fs-label)]、text-[var(--fs-caption)] 等。 */ --font-size-micro: var(--fs-micro); --font-size-tiny: var(--fs-tiny); --font-size-label: var(--fs-label); --font-size-caption: var(--fs-caption); --font-size-body: var(--fs-body); --font-size-body-lg: var(--fs-body-lg); --font-size-heading: var(--fs-heading); --font-size-heading-lg: var(--fs-heading-lg); --font-size-title: var(--fs-title); --font-size-display: var(--fs-display); } :root { --radius: 0.5rem; --motion-instant: 120ms; --motion-state: 180ms; --motion-panel: 240ms; --ease-aceternity: var(--motion-ease-out); --ease-product-enter: cubic-bezier(0.16, 1, 0.3, 1); --workspace-canvas: var(--background); /* 页面、导航和内容区共用同一底色;卡片/浮层才允许使用 surface token。 */ --workspace-page: var(--workspace-canvas); --workspace-navigation: var(--workspace-page); --workspace-content: var(--workspace-page); --workspace-surface: #ffffff; --workspace-surface-strong: #ffffff; --workspace-border: rgba(17, 17, 17, 0.14); --workspace-border-strong: rgba(17, 17, 17, 0.22); --workspace-grid-line: rgba(17, 17, 17, 0.045); --workspace-nav: var(--workspace-navigation); --workspace-sidebar: var(--workspace-navigation); --workspace-accent: #171717; --workspace-accent-soft: rgba(17, 17, 17, 0.07); --workspace-nav-active-bg: color-mix(in srgb, var(--workspace-accent) 12%, transparent); --workspace-nav-active-hover-bg: color-mix(in srgb, var(--workspace-accent) 16%, transparent); --workspace-sidebar-width: 250px; /* 侧栏展开宽度:较 208px 加宽 20% */ --workspace-sidebar-nav-width: 250px; /* 展开态导航内容宽度 */ --workspace-sidebar-collapsed-width: 67px; /* 折叠态保留可发现的图标菜单轨 */ --workspace-shell-gutter: 6px; /* 工作区外壳画布留白与卡片间隙(组件 token)*/ --workspace-card-gap: 4px; /* 侧边栏与主区卡片之间间隙(组件 token)*/ /* --- Semantic 层(引用 Primitive,随主题切换)--- */ /* 通用语义色(引用 Primitive neutral 色板)*/ --bg: var(--color-neutral-0); --fg: var(--color-neutral-950); --border-semantic: var(--color-neutral-200); --bg-secondary: var(--color-neutral-50); --bg-tertiary: var(--color-neutral-100); --surface: var(--color-neutral-0); --surface-hover: rgba(17, 17, 17, 0.05); --surface-active: rgba(17, 17, 17, 0.09); /* composio 文字层级(light 自推导;dark 值见 .dark 同区)*/ --workspace-text-body: var(--color-neutral-600); /* body 角色 */ --workspace-text-muted: var(--color-neutral-500); /* muted 角色 */ --workspace-text-faint: var(--color-neutral-400); /* muted-soft 角色 */ --workspace-canvas-deep: var(--color-neutral-0); /* canvas-deep 角色(light 无更深处)*/ --workspace-glass-surface: color-mix(in srgb, var(--workspace-surface) calc(var(--glass-alpha) * 100%), transparent); --workspace-glass-border: color-mix(in srgb, var(--workspace-border) calc(var(--glass-border-alpha) * 100%), transparent); --accent: var(--workspace-accent); --accent-soft: var(--workspace-accent-soft); --muted: var(--color-neutral-100); /* 顶部常驻通知条(Layer 3 组件引用;文字恒为白) 四个 --notice-banner-surface- 与通知类型一一对应,dark 覆盖见 .dark 语义覆盖区; --notice-banner-surface 是「公告」的别名,供不区分类型的引用使用。*/ --notice-banner-surface-notice: var(--palette-banner-notice-500); --notice-banner-surface-activity: var(--palette-banner-activity-500); --notice-banner-surface-update: var(--palette-banner-update-500); --notice-banner-surface-warning: var(--palette-banner-warning-500); --notice-banner-surface: var(--notice-banner-surface-notice); /* Canvas Theme 语义(从 CSS 变量反序列化到 TS 主题对象,对应 #96 决策3)*/ --cn-text: var(--color-neutral-950); --cn-muted: var(--color-neutral-500); --cn-faint: var(--color-neutral-400); --cn-stroke: var(--color-neutral-200); --cn-fill: var(--color-neutral-50); --cn-active-stroke: var(--workspace-accent); --cn-active-stroke-soft: var(--workspace-accent-soft); /* Aceternity spatial 语义(对应 #96 决策3:CSS→TS 单向同步)*/ --cn-spatial-surface: var(--workspace-surface); --cn-spatial-surface-strong: var(--workspace-surface-strong); --cn-spatial-shadow: rgba(0, 0, 0, 0.12); --cn-spatial-glow: rgba(125, 162, 255, 0.2); --cn-spatial-glow-strong: rgba(125, 162, 255, 0.35); --cn-spatial-elevated: var(--color-neutral-0); --cn-spatial-toolbar-border: var(--color-neutral-200); --previs-sequencer-surface: var(--color-neutral-900); --previs-sequencer-surface-raised: var(--color-neutral-800); --previs-sequencer-border: rgba(255, 255, 255, 0.11); --previs-sequencer-muted: rgba(255, 255, 255, 0.48); --previs-sequencer-grid: rgba(255, 255, 255, 0.055); --previs-dock-surface: rgba(17, 19, 21, 0.92); --previs-dock-fg: rgba(255, 255, 255, 0.62); --previs-dock-fg-strong: rgba(255, 255, 255, 0.96); --previs-dock-active-surface: rgba(255, 255, 255, 0.14); --previs-control-hover: rgba(255, 255, 255, 0.09); --previs-swatch-inset: rgba(0, 0, 0, 0.18); /* 编辑器工作台:圆角浮卡舞台底色 + 常亮强调色(明暗两主题同值,避免 workspace-accent 黑白反转)*/ --previs-workspace-bg: #0b0d0f; --previs-accent: #4f8cff; --previs-accent-hover: #6ba0ff; --previs-on-accent: #ffffff; --previs-success: #34d399; --previs-warning: #fbbf24; --previs-danger: #f87171; --previs-success-soft: rgba(52, 211, 153, 0.14); --previs-warning-soft: rgba(251, 191, 36, 0.14); --previs-danger-soft: rgba(248, 113, 113, 0.14); /* 节点类型色(引用 Primitive 节点色板,对应 #97 决策1 色带方案)*/ --cn-type-image: var(--palette-node-image); --cn-type-video: var(--palette-node-video); --cn-type-text: var(--palette-node-text); --cn-type-audio: var(--palette-node-audio); --cn-type-config: var(--palette-node-config); --cn-type-script: var(--palette-node-script); --cn-type-drawing: var(--palette-node-drawing); --cn-type-frame: var(--palette-node-frame); --cn-type-character: var(--palette-node-character); --cn-type-skill: var(--palette-node-skill); /* 状态语义色 */ --status-success: var(--palette-status-success); --status-error: var(--palette-status-error); --status-loading: var(--palette-status-loading); --status-warning: var(--palette-status-warning); --border: oklch(0.922 0 0); --ring: oklch(0.708 0 0); --background: oklch(1 0 0); --foreground: oklch(0.145 0 0); --card: oklch(1 0 0); --card-foreground: oklch(0.145 0 0); --popover: oklch(1 0 0); --popover-foreground: oklch(0.145 0 0); --primary: oklch(0.205 0 0); --primary-foreground: oklch(0.985 0 0); --secondary: oklch(0.97 0 0); --secondary-foreground: oklch(0.205 0 0); --muted: oklch(0.97 0 0); --muted-foreground: oklch(0.556 0 0); --accent: oklch(0.97 0 0); --accent-foreground: oklch(0.205 0 0); --destructive: #dc2626; --input: oklch(0.922 0 0); --chart-1: oklch(0.87 0 0); --chart-2: oklch(0.556 0 0); --chart-3: oklch(0.439 0 0); --chart-4: oklch(0.371 0 0); --chart-5: oklch(0.269 0 0); --sidebar: oklch(0.985 0 0); --sidebar-foreground: oklch(0.145 0 0); --sidebar-primary: var(--btn-solid-bg); --sidebar-primary-foreground: var(--btn-solid-fg); --sidebar-accent: oklch(0.97 0 0); --sidebar-accent-foreground: oklch(0.205 0 0); --sidebar-border: oklch(0.922 0 0); --sidebar-ring: oklch(0.708 0 0); } .dark { --background: #0f0f0f; --auth-page-bg: #08090c; --auth-panel-bg: #0b0c10; --auth-card-bg: #121318; --auth-accent: #93c5fd; --auth-muted: #8a8b91; /* 深色主题下勾选框用浅底 + 深勾,与浅色主题的深底 + 白勾形成互补; 直接复用 --foreground 会得到白底白勾。 */ --auth-check-bg: #e5e5e5; --auth-check-fg: #171717; --foreground: #ffffff; --border: #222222; --ring: oklch(0.556 0 0); --card: #181818; --card-foreground: #ffffff; --popover: #222222; --popover-foreground: #ffffff; --primary: oklch(0.922 0 0); --primary-foreground: oklch(0.205 0 0); --secondary: oklch(0.269 0 0); --secondary-foreground: oklch(0.985 0 0); --muted: oklch(0.269 0 0); --muted-foreground: #a8a8a8; --accent: oklch(0.269 0 0); --accent-foreground: oklch(0.985 0 0); --destructive: #ff4d4d; --destructive-hover: #ff6b6b; --destructive-active: #e63939; --destructive-foreground: #2b0808; --palette-status-success: #33d17a; --palette-status-error: #ff4d4d; --palette-status-loading: #60a5fa; --palette-status-warning: #fbbf24; --input: rgba(255, 255, 255, 0.15); --workspace-canvas: var(--background); --workspace-page: var(--workspace-canvas); --workspace-navigation: var(--workspace-page); --workspace-content: var(--workspace-page); --workspace-surface: #181818; --workspace-surface-strong: #2a2a2a; /* composio surface-strong(原 #222222 并入 elevated 语义)*/ --workspace-border: #222222; --workspace-border-strong: #333333; --workspace-grid-line: rgba(255, 255, 255, 0.038); --workspace-nav: var(--workspace-navigation); --workspace-sidebar: var(--workspace-navigation); --workspace-accent: #f5f5f5; --workspace-accent-soft: rgba(255, 255, 255, 0.09); --workspace-nav-active-bg: color-mix(in srgb, var(--workspace-accent) 13%, transparent); --workspace-nav-active-hover-bg: color-mix(in srgb, var(--workspace-accent) 18%, transparent); --chart-1: oklch(0.87 0 0); --chart-2: oklch(0.556 0 0); --chart-3: oklch(0.439 0 0); --chart-4: oklch(0.371 0 0); --chart-5: oklch(0.269 0 0); --sidebar: oklch(0.205 0 0); --sidebar-foreground: oklch(0.985 0 0); --sidebar-primary: var(--btn-solid-bg); --sidebar-primary-foreground: var(--btn-solid-fg); --sidebar-accent: oklch(0.269 0 0); --sidebar-accent-foreground: oklch(0.985 0 0); --sidebar-border: oklch(1 0 0 / 10%); --sidebar-ring: oklch(0.556 0 0); /* --- Semantic 层 dark 覆盖 --- */ --bg: var(--color-neutral-950); --fg: var(--color-neutral-50); --border-semantic: var(--color-neutral-800); --bg-secondary: #141414; --bg-tertiary: #181818; --surface: #1f1f1f; --surface-hover: rgba(255, 255, 255, 0.07); --surface-active: rgba(255, 255, 255, 0.12); --muted: var(--color-neutral-900); /* 顶部常驻通知条:暗色下四种类型统一压暗,白字对比度约 8.5:1 */ --notice-banner-surface-notice: var(--palette-banner-notice-700); --notice-banner-surface-activity: var(--palette-banner-activity-700); --notice-banner-surface-update: var(--palette-banner-update-700); --notice-banner-surface-warning: var(--palette-banner-warning-700); --notice-banner-surface: var(--notice-banner-surface-notice); /* composio 文字层级(dark 直取)*/ --workspace-text-body: #a8a8a8; /* body(tokens.json text/body)*/ --workspace-text-muted: #888888; /* muted(tokens.json text/muted)*/ --workspace-text-faint: #666666; /* muted-soft(tokens.json text/muted-soft)*/ --workspace-canvas-deep: #000000; /* canvas-deep(tokens.json color/canvas-deep)*/ --cn-text: var(--color-neutral-50); --cn-muted: var(--color-neutral-400); --cn-faint: var(--color-neutral-500); --cn-stroke: rgba(255, 255, 255, 0.1); --cn-fill: rgba(255, 255, 255, 0.04); --cn-active-stroke: var(--workspace-accent); --cn-active-stroke-soft: var(--workspace-accent-soft); --cn-spatial-surface: var(--workspace-surface); --cn-spatial-surface-strong: var(--workspace-surface-strong); --cn-spatial-shadow: rgba(0, 0, 0, 0.4); --cn-spatial-glow: rgba(125, 162, 255, 0.15); --cn-spatial-glow-strong: rgba(125, 162, 255, 0.25); --cn-spatial-elevated: var(--color-neutral-900); --cn-spatial-toolbar-border: rgba(255, 255, 255, 0.1); --previs-sequencer-surface: #111315; --previs-sequencer-surface-raised: #191c1f; --previs-sequencer-border: rgba(255, 255, 255, 0.11); --previs-sequencer-muted: rgba(255, 255, 255, 0.48); --previs-sequencer-grid: rgba(255, 255, 255, 0.055); --previs-dock-surface: rgba(17, 19, 21, 0.92); --previs-dock-fg: rgba(255, 255, 255, 0.62); --previs-dock-fg-strong: rgba(255, 255, 255, 0.96); --previs-dock-active-surface: rgba(255, 255, 255, 0.14); --previs-control-hover: rgba(255, 255, 255, 0.09); --previs-swatch-inset: rgba(0, 0, 0, 0.18); /* 编辑器工作台:圆角浮卡舞台底色 + 常亮强调色(明暗两主题同值,避免 workspace-accent 黑白反转)*/ --previs-workspace-bg: #0b0d0f; --previs-accent: #4f8cff; --previs-accent-hover: #6ba0ff; --previs-on-accent: #ffffff; --previs-success: #34d399; --previs-warning: #fbbf24; --previs-danger: #f87171; --previs-success-soft: rgba(52, 211, 153, 0.14); --previs-warning-soft: rgba(251, 191, 36, 0.14); --previs-danger-soft: rgba(248, 113, 113, 0.14); } /* 剪辑工作台:跟随明暗主题的表面(作用域覆盖 previs 常暗 token;canvas 导演工作台全局值不受影响)*/ .editor-workbench { --previs-sequencer-surface: #fbfcfe; --previs-sequencer-surface-raised: #f1f4f7; --previs-sequencer-border: rgba(15, 23, 42, 0.12); --previs-sequencer-muted: rgba(15, 23, 42, 0.5); --previs-sequencer-grid: rgba(15, 23, 42, 0.07); --previs-dock-surface: rgba(255, 255, 255, 0.96); --previs-dock-fg: rgba(15, 23, 42, 0.62); --previs-dock-fg-strong: rgba(15, 23, 42, 0.94); --previs-dock-active-surface: rgba(15, 23, 42, 0.12); --previs-control-hover: rgba(15, 23, 42, 0.06); --previs-swatch-inset: rgba(0, 0, 0, 0.12); --previs-workspace-bg: #e9edf2; } .dark .editor-workbench { --previs-sequencer-surface: #111315; --previs-sequencer-surface-raised: #191c1f; --previs-sequencer-border: rgba(255, 255, 255, 0.11); --previs-sequencer-muted: rgba(255, 255, 255, 0.48); --previs-sequencer-grid: rgba(255, 255, 255, 0.055); --previs-dock-surface: rgba(17, 19, 21, 0.92); --previs-dock-fg: rgba(255, 255, 255, 0.62); --previs-dock-fg-strong: rgba(255, 255, 255, 0.96); --previs-dock-active-surface: rgba(255, 255, 255, 0.14); --previs-control-hover: rgba(255, 255, 255, 0.09); --previs-swatch-inset: rgba(0, 0, 0, 0.18); --previs-workspace-bg: #0b0d0f; } /* 全屏编辑:workbench 全屏时铺满视口(背景沿用工作区底色) */ .editor-workbench:fullscreen { width: 100vw; height: 100vh; background: var(--previs-workspace-bg); } .dark { /* --- Shadow dark 覆盖(暗色下黑影不可见,改用白色微影制造抬升感,审计 D4/P2-D2)--- 组件 token(--node-shadow/--dock-shadow/--panel-shadow/--modal-shadow)均引用 var(--shadow-*),此处覆盖自动级联。--cn-spatial-shadow(内联 boxShadow 用)已有 暗色变体(0.4),保留不动。 */ --shadow-xs: 0 1px 2px rgba(255, 255, 255, 0.04); --shadow-sm: 0 2px 4px rgba(255, 255, 255, 0.05); --shadow-md: 0 4px 12px rgba(255, 255, 255, 0.06); --shadow-lg: 0 8px 24px rgba(255, 255, 255, 0.07); --shadow-xl: 0 16px 40px rgba(255, 255, 255, 0.08); --shadow-2xl: 0 24px 60px rgba(255, 255, 255, 0.1); /* 抬升 token:暗色下继续用黑影压深,只把 hairline 换成浅色描边。 */ --elevation-hairline: inset 0 0 0 1px rgba(255, 255, 255, 0.085); --elevation-card: 0 1px 2px rgba(0, 0, 0, 0.4); --elevation-card-hover: 0 12px 30px rgba(0, 0, 0, 0.5), 0 2px 6px rgba(0, 0, 0, 0.32); --elevation-overlay: 0 28px 72px rgba(0, 0, 0, 0.62), 0 4px 14px rgba(0, 0, 0, 0.4); --elevation-panel: -20px 0 60px rgba(0, 0, 0, 0.56); --surface-card: rgba(255, 255, 255, 0.035); --surface-card-hover: rgba(255, 255, 255, 0.062); --project-library-surface: #151515; --project-library-cover-surface: #1c1c1c; --project-library-icon-surface: #0d0d0d; --project-library-shadow: none; /* === 新卡片系统 Token - Dark(对应 docs/ui-design-system.md)=== */ --card-surface: #171717; --card-surface-hover: #1e1e1e; --card-surface-raised: #252525; --card-border: transparent; --card-border-hover: transparent; --card-elevation: none; --card-elevation-hover: none; --canvas-cover-surface: #171717; --canvas-icon-surface: #0d0d0d; --canvas-icon-shadow: 0 2px 8px rgba(0, 0, 0, 0.4); --canvas-folder-surface: color-mix(in srgb, var(--workspace-surface-strong) 78%, transparent); --canvas-folder-surface-strong: color-mix(in srgb, var(--workspace-surface-strong) 92%, transparent); --canvas-folder-edge: color-mix(in srgb, var(--foreground) 22%, transparent); --canvas-folder-ink: var(--foreground); --canvas-folder-muted: color-mix(in srgb, var(--foreground) 54%, transparent); --canvas-folder-action-bg: var(--primary); --canvas-folder-action-fg: var(--primary-foreground); --media-surface: #171717; --skeleton-surface: linear-gradient( 90deg, rgba(255, 255, 255, 0.05) 0%, rgba(255, 255, 255, 0.08) 50%, rgba(255, 255, 255, 0.05) 100% ); --btn-solid-bg: #f5f5f5; --btn-solid-hover-bg: #ffffff; --btn-solid-active-bg: #e5e5e5; --btn-solid-fg: #131313; --control-selected-bg: rgba(255, 255, 255, 0.12); --control-selected-hover-bg: rgba(255, 255, 255, 0.16); --control-selected-fg: #f5f5f5; --control-selected-border: rgba(255, 255, 255, 0.18); --control-check-bg: #f5f5f5; --control-check-fg: #131313; --control-switch-checked-bg: #22c55e; --control-switch-checked-hover-bg: #4ade80; --control-switch-checked-handle: #071a0f; --control-switch-off-bg: #525252; --control-switch-off-hover-bg: #686868; --control-switch-off-handle: #f5f5f5; --control-disabled-bg: rgba(255, 255, 255, 0.06); --control-disabled-fg: rgba(255, 255, 255, 0.38); } /* ------------------------------------------------------------------------- Layer 3: Component — 引用 Semantic,某组件专属 ------------------------------------------------------------------------- */ :root { /* 插件页也消费统一的主题开关合同,不再维护一套脱离主题的固定色。 */ --plugin-switch-checked-bg: var(--control-switch-checked-bg); --plugin-switch-checked-hover-bg: var(--control-switch-checked-hover-bg); --plugin-switch-checked-handle: var(--control-switch-checked-handle); --plugin-switch-off-bg: var(--control-switch-off-bg); --plugin-switch-off-hover-bg: var(--control-switch-off-hover-bg); --plugin-switch-off-handle: var(--control-switch-off-handle); /* Library 卡片组件:所有作品库共用同一表面和状态合同。 */ --library-surface: var(--card-surface); --library-surface-hover: var(--card-surface-hover); --library-cover-surface: var(--card-surface-raised); --library-selected-stroke: var(--control-selected-border); --library-hover-offset: -2px; --library-active-offset: -1px; /* Dock 组件(FloatingDock、悬停工具栏,对应 #95 工具栏方案)*/ --dock-radius: var(--r-xl); /* 14px */ --dock-padding: var(--space-2); /* 8px */ --dock-icon-size: 32px; --dock-icon-size-labeled: 36px; --dock-label-fs: var(--fs-label); /* 11px */ --dock-blur: 24px; --dock-surface: var(--cn-spatial-surface); --dock-border: transparent; --dock-item-radius: var(--r-md); /* 8px */ --dock-item-radius-labeled: var(--r-lg); /* 12px */ --dock-radius-tight: var(--r-tight); --dock-radius-compact: var(--r-dock-compact); --dock-tooltip-z: 140; --dock-precision-width: var(--space-12); --dock-z-popover: 30; /* dock 子面板在 toolbar 根 stacking context 内的层级(见 ADR-001)*/ --dock-switch-track: #000000; /* 抓手/框选胶囊轨道:纯黑,和工具栏表面分开 */ --dock-switch-thumb: #ffffff; --dock-switch-thumb-text: #000000; /* 选中图标落在白圆上,用纯黑描边避免发灰 */ /* 页面顶部栏(PageHeader / 工作台头部)*/ --page-topbar-h: 64px; --page-topbar-px: var(--space-4); --page-topbar-surface: var(--bg-secondary); --page-topbar-border: var(--workspace-border); --canvas-topbar-surface: var(--workspace-glass-surface); /* Canvas 创建菜单:固定行高保证图标、徽标和单行标签互不挤占 */ --canvas-create-node-height: var(--space-16); --canvas-create-resource-height: var(--space-8); /* Node 组件:节点首先是内容容器,常态不使用卡片投影或发光。 */ --node-radius: var(--r-lg); /* 12px */ --node-header-height: 24px; --node-title-fs: var(--fs-label); /* 11px */ --node-badge-fs: var(--fs-tiny); /* 10px */ --node-type-strip-width: 3px; /* 色带宽度 */ --node-type-badge-size: 20px; /* 图标徽章尺寸 */ --node-z-content: 30; /* 节点遮罩层(stacking context 内,见 ADR-001)*/ --node-z-overlay: 40; /* 节点角标/按钮层 */ --node-z-handle: 50; /* 节点 resize handle 层 */ /* 节点上下文生成器:一层浮动表面,内部仅靠明度和间距组织信息。 */ --canvas-composer-radius: var(--r-lg); --canvas-composer-surface: var(--workspace-surface-strong); --canvas-composer-control-surface: color-mix(in srgb, var(--foreground) 5%, transparent); --canvas-composer-control-hover: color-mix(in srgb, var(--foreground) 8%, transparent); --canvas-composer-shadow: var(--elevation-card); --canvas-composer-settings-width: 138px; --canvas-mention-menu-max-height: 320px; --canvas-mention-search-height: 38px; --canvas-mention-item-height: 38px; --canvas-mention-chip-height: 22px; --canvas-mention-chip-preview-size: 18px; --canvas-mention-chip-gap: 0.12em; --canvas-mention-chip-padding-inline: 0.16em; --canvas-mention-chip-offset-y: 0.14em; --canvas-reference-chip-size: 44px; /* Modal 组件(对话框,对应 #98 面板层级)*/ --modal-radius: var(--r-lg); --modal-width-compact: 480px; --modal-width-standard: 640px; --modal-width-wide: 920px; --modal-overlay-opacity: 0.5; --modal-shadow: var(--shadow-2xl); --modal-padding: var(--space-5); /* 20px */ /* Style Center / Editor */ --style-center-height: min(780px, 84dvh); --style-editor-mobile-preview-height: 220px; --style-center-sidebar-width: 184px; --style-center-search-width: 320px; /* Panel 组件(侧边面板,对应 #98 五层体系 L2)*/ --panel-radius: var(--r-2xl); /* 16px */ --panel-padding: var(--space-4); /* 16px */ --panel-shadow: var(--shadow-lg); --panel-section-gap: var(--space-3); /* 12px */ --panel-width-compact: 320px; --panel-radius-wide-tight: var(--r-wide-tight); --loader-z: var(--z-loader); /* Previs workbench / Sequencer */ --previs-sequencer-min-height: 180px; --previs-sequencer-label-width: 208px; --previs-sequencer-row-height: 30px; --previs-sequencer-base-width: 860px; --previs-sequencer-shot-select-width: 144px; --previs-dock-button-size: var(--space-8); --previs-dock-bottom: var(--space-2); --previs-pose-button-height: var(--space-8); --previs-color-swatch-size: var(--space-6); /* Canvas 布局(画布页浮层定位,对应审计 P0-8.1/P1-2.1)*/ --canvas-sidebar-width: 232px; /* 项目侧栏宽度(短剧模式)*/ --canvas-panel-width: min(332px, calc(100vw - 24px)); /* 浮动面板默认宽度(活动任务等)*/ --video-segment-preview-max-height: min(46vh, 480px); /* Prompt 面板(对应 #98 决策2 渐进式三区)*/ --prompt-panel-max-height: min(70vh, 640px); --prompt-panel-section-fs: var(--fs-body); /* 14px A区 */ --prompt-panel-caption-fs: var(--fs-caption); /* 12px B区 */ --prompt-panel-label-fs: var(--fs-label); /* 11px 标签 */ --settings-model-option-min-height: 76px; --prompt-panel-heading-fs: var(--fs-heading); /* 16px 区标题 */ --creation-media-pending-max-width: 320px; /* 进度条(对应 #98 决策3 任务进度)*/ --progress-bar-height: 6px; --progress-bar-radius: var(--r-xs); /* 3px */ --progress-bar-fill: var(--status-loading); --progress-bar-fill-success: var(--status-success); --progress-bar-fill-error: var(--status-error); /* 缩放控制(对应 #95 决策5)*/ --zoom-control-min: 0.05; --zoom-control-max: 2; --zoom-control-step: 0.1; /* 短剧流程引导步骤(里程碑节点 + 状态轨道)*/ --flow-step-node: var(--space-5); /* 20px 完成/待办节点直径 */ --flow-step-node-current: var(--space-6); /* 24px 当前节点直径 */ --flow-step-gap: var(--space-1); /* 4px 节点与标签间距 */ --flow-step-track-height: var(--stroke-2); /* 2px 状态轨道高 */ --flow-step-track-width: var(--space-5); /* 20px 轨道段长 */ --flow-step-current-glow: 0 0 0 4px var(--cn-active-stroke-soft); /* 当前节点光晕 */ } @layer base { * { @apply border-border outline-ring/50; } html, body, #root, .ant-app { width: 100%; height: 100%; margin: 0; padding: 0; border: 0; overflow: hidden; overscroll-behavior: none; background: var(--workspace-page); } body { background: var(--workspace-page); color: var(--foreground); } #root { position: fixed; inset: 0; isolation: isolate; overflow: hidden; } textarea { resize: none; } textarea::-webkit-resizer { display: none; } html { @apply font-sans; } } /* CodeMirror 使用运行时注入样式,需在全局覆盖中绑定项目主题 token。 */ .prompt-code-editor, .prompt-code-editor .cm-editor { width: 100%; height: 100%; min-height: 0; } .prompt-code-editor .cm-editor { background: var(--workspace-surface-strong) !important; color: var(--foreground); font-size: var(--fs-caption); } .prompt-code-editor .cm-editor.cm-focused { outline: 2px solid color-mix(in srgb, var(--workspace-accent) 42%, transparent); outline-offset: -2px; } .prompt-code-editor .cm-scroller { overflow: auto; overflow-x: hidden; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; line-height: 1.65; } .prompt-code-editor .cm-content { padding-block: var(--space-3); color: var(--foreground) !important; caret-color: var(--foreground); } .prompt-code-editor .cm-line { padding-inline: var(--space-3); overflow-wrap: anywhere; } .prompt-code-editor .cm-gutters { border-right: 1px solid var(--workspace-border) !important; background: color-mix(in srgb, var(--workspace-surface-strong) 92%, var(--foreground) 8%) !important; color: color-mix(in srgb, var(--foreground) 42%, transparent) !important; } .prompt-code-editor .cm-activeLine, .prompt-code-editor .cm-activeLineGutter { background: color-mix(in srgb, var(--workspace-accent) 7%, transparent) !important; } .prompt-code-editor .cm-selectionBackground, .prompt-code-editor .cm-content ::selection { background: color-mix(in srgb, var(--workspace-accent) 24%, transparent) !important; } @layer utilities { /* --- composio 排版语义类(tokens.json typography 14 档;abcDiatype → Inter,code → JetBrains Mono)--- */ .typ-display-mega { font-family: var(--font-sans); font-size: var(--typ-display-mega); line-height: 1.05; font-weight: 500; letter-spacing: -2.16px; } .typ-display-xl { font-family: var(--font-sans); font-size: var(--typ-display-xl); line-height: 1.05; font-weight: 500; letter-spacing: -1.68px; } .typ-display-lg { font-family: var(--font-sans); font-size: var(--typ-display-lg); line-height: 1.1; font-weight: 500; letter-spacing: -1.32px; } .typ-display-md { font-family: var(--font-sans); font-size: var(--typ-display-md); line-height: 1.15; font-weight: 500; letter-spacing: -0.96px; } .typ-display-sm { font-family: var(--font-sans); font-size: var(--typ-display-sm); line-height: 1.25; font-weight: 500; letter-spacing: -0.5px; } .typ-title-md { font-family: var(--font-sans); font-size: var(--typ-title-md); line-height: 1.4; font-weight: 600; letter-spacing: 0; } .typ-title-sm { font-family: var(--font-sans); font-size: var(--typ-title-sm); line-height: 1.4; font-weight: 600; letter-spacing: 0; } .typ-body-md { font-family: var(--font-sans); font-size: var(--typ-body-md); line-height: 1.5; font-weight: 400; letter-spacing: 0; } .typ-body-sm { font-family: var(--font-sans); font-size: var(--typ-body-sm); line-height: 1.5; font-weight: 400; letter-spacing: 0; } .typ-caption { font-family: var(--font-sans); font-size: var(--typ-caption); line-height: 1.4; font-weight: 400; letter-spacing: 0; } .typ-caption-uppercase { font-family: var(--font-sans); font-size: var(--typ-caption-uppercase); line-height: 1.4; font-weight: 600; letter-spacing: 0.88px; text-transform: uppercase; } .typ-code { font-family: var(--font-mono); font-size: var(--typ-code); line-height: 1.5; font-weight: 400; letter-spacing: 0; } .typ-button { font-family: var(--font-sans); font-size: var(--typ-button); line-height: 1; font-weight: 500; letter-spacing: 0; } .typ-nav-link { font-family: var(--font-sans); font-size: var(--typ-nav-link); line-height: 1.4; font-weight: 500; letter-spacing: 0; } .app-spatial-workspace { --workspace-canvas: var(--background); --workspace-page: var(--workspace-canvas); --workspace-navigation: var(--workspace-page); --workspace-content: var(--workspace-page); --workspace-surface: rgba(255, 255, 255, 0.74); --workspace-surface-strong: rgba(255, 255, 255, 1); --workspace-border: rgba(17, 17, 17, 0.1); --workspace-border-strong: rgba(17, 17, 17, 0.2); --workspace-grid-line: rgba(17, 17, 17, 0.035); --workspace-nav: var(--workspace-navigation); --workspace-sidebar: var(--workspace-navigation); --workspace-accent: #171717; --workspace-accent-soft: rgba(17, 17, 17, 0.065); background-color: var(--workspace-canvas); background-image: linear-gradient(var(--workspace-grid-line) 1px, transparent 1px), linear-gradient(90deg, var(--workspace-grid-line) 1px, transparent 1px); background-size: 34px 34px; } .dark .app-spatial-workspace { --workspace-canvas: var(--background); --workspace-page: var(--workspace-canvas); --workspace-navigation: var(--workspace-page); --workspace-content: var(--workspace-page); --workspace-surface: rgba(18, 18, 18, 0.76); --workspace-surface-strong: rgba(22, 22, 22, 1); --workspace-border: rgba(255, 255, 255, 0.09); --workspace-border-strong: rgba(255, 255, 255, 0.18); --workspace-grid-line: rgba(255, 255, 255, 0.026); --workspace-nav: var(--workspace-navigation); --workspace-sidebar: var(--workspace-navigation); --workspace-accent: #f5f5f5; --workspace-accent-soft: rgba(255, 255, 255, 0.08); } .app-workspace-sidebar-scrim { position: absolute; z-index: 30; inset: 0; border: 0; background: rgba(0, 0, 0, 0.42); backdrop-filter: blur(2px); } /* 侧栏导航子项展开引导线:替代每组子项自行维护的分割线 */ .app-workspace-nav-guide-line { position: absolute; top: 0; bottom: 0; width: 0; border-left: 1px solid color-mix(in srgb, var(--foreground) 6%, transparent); pointer-events: none; } /* 分组标题:小号大写标签,弱化但可读;有标题的分组支持折叠,padding/间距由折叠按钮接管 */ .app-workspace-nav-group-label { display: block; font-size: var(--fs-label); font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: color-mix(in srgb, var(--foreground) 36%, transparent); transition: color var(--motion-instant) ease-out; } .app-workspace-nav-group-toggle { display: flex; width: 100%; min-height: 28px; align-items: center; justify-content: space-between; gap: 8px; padding: 0 8px; border-radius: var(--r-sm); text-align: left; color: inherit; transition: background-color var(--motion-instant) ease-out; } .app-workspace-nav-group-toggle:hover, .app-workspace-nav-group-toggle:focus-visible { background: var(--surface-hover); } .app-workspace-nav-group-toggle:hover .app-workspace-nav-group-label, .app-workspace-nav-group-toggle:focus-visible .app-workspace-nav-group-label { color: color-mix(in srgb, var(--foreground) 55%, transparent); } .app-workspace-nav-group-toggle:hover svg, .app-workspace-nav-group-toggle:focus-visible svg { color: color-mix(in srgb, var(--foreground) 70%, transparent); } /* 工作区切换器下拉浮层 */ .app-workspace-nav-popover { box-shadow: none; } body.app-spatial-overlays { --workspace-overlay-bg: rgba(244, 244, 245, 1); --workspace-overlay-bg-strong: rgba(250, 250, 250, 1); --workspace-overlay-border: rgba(17, 17, 17, 0.22); --workspace-overlay-divider: rgba(17, 17, 17, 0.1); --workspace-overlay-highlight: rgba(255, 255, 255, 0.86); --workspace-overlay-hover: rgba(17, 17, 17, 0.065); --workspace-overlay-selected: rgba(17, 17, 17, 0.1); --workspace-overlay-shadow: 0 26px 72px rgba(15, 23, 42, 0.18), 0 4px 18px rgba(15, 23, 42, 0.08); } .dark body.app-spatial-overlays { --workspace-overlay-bg: rgba(10, 10, 11, 1); --workspace-overlay-bg-strong: rgba(15, 15, 16, 1); --workspace-overlay-border: rgba(255, 255, 255, 0.22); --workspace-overlay-divider: rgba(255, 255, 255, 0.105); --workspace-overlay-highlight: rgba(255, 255, 255, 0.2); --workspace-overlay-hover: rgba(255, 255, 255, 0.075); --workspace-overlay-selected: rgba(255, 255, 255, 0.115); --workspace-overlay-shadow: 0 30px 84px rgba(0, 0, 0, 0.62), 0 8px 24px rgba(0, 0, 0, 0.34); } /* 全局轻量通知与消息提示框 */ .ant-message-notice .ant-message-notice-content, :where(.dark, [data-theme="dark"]) .ant-message-notice .ant-message-notice-content { color: var(--foreground) !important; background: var(--color-surface, var(--workspace-overlay-bg-strong, #ffffff)) !important; border: 1px solid var(--color-border, var(--workspace-overlay-border, rgba(0, 0, 0, 0.12))) !important; box-shadow: 0 8px 30px rgba(0, 0, 0, 0.18) !important; } .dark .ant-message-notice .ant-message-notice-content, .dark body .ant-message-notice-content, [data-theme="dark"] .ant-message-notice .ant-message-notice-content, .dark .ant-message-custom-content, .dark .ant-message-notice { color: #f4f4f5 !important; background: #1e1e20 !important; border-color: rgba(255, 255, 255, 0.16) !important; box-shadow: 0 12px 36px rgba(0, 0, 0, 0.55) !important; } .dark .ant-message-notice-content span, .dark .ant-message-custom-content span { color: #f4f4f5 !important; } .ant-notification-notice { color: var(--foreground) !important; background: var(--color-surface, var(--workspace-overlay-bg-strong, #ffffff)) !important; border: 1px solid var(--color-border, var(--workspace-overlay-border, rgba(0, 0, 0, 0.12))) !important; } .dark .ant-notification-notice, .dark body .ant-notification-notice { color: #f4f4f5 !important; background: #1e1e20 !important; border-color: rgba(255, 255, 255, 0.16) !important; } .dark .ant-tooltip .ant-tooltip-inner { color: #f4f4f5 !important; background: #1e1e20 !important; border: 1px solid rgba(255, 255, 255, 0.14) !important; } body.app-spatial-overlays :where( .ant-popover-container, .ant-picker-dropdown .ant-picker-panel-container, .ant-cascader-menus, .ant-mentions-dropdown, .ant-tooltip-inner, .ant-modal-content, .ant-drawer-content, .ant-message-notice-content, .ant-notification-notice ) { border: 1px solid var(--workspace-overlay-border) !important; background: var(--workspace-overlay-bg-strong) !important; box-shadow: var(--workspace-overlay-shadow) !important; } body.app-spatial-overlays :where(.ant-modal-content, .ant-drawer-content, .ant-notification-notice) { background: var(--workspace-overlay-bg-strong) !important; } body.app-spatial-overlays :where(.ant-dropdown-menu, .ant-select-dropdown, .ant-popover-container, .ant-cascader-menus, .ant-mentions-dropdown) { border-radius: 8px !important; } /* 下拉层用背景和柔和阴影建立层次,不再用亮色描边圈住选项。 */ body.app-spatial-overlays :where(.ant-dropdown-menu, .ant-select-dropdown, .ant-cascader-menus, .ant-mentions-dropdown) { border: 0 !important; background: var(--workspace-overlay-bg-strong) !important; box-shadow: var(--elevation-overlay) !important; } body.app-spatial-overlays :where( .ant-dropdown-menu-item:not(.ant-dropdown-menu-item-disabled), .ant-dropdown-menu-submenu-title:not(.ant-dropdown-menu-item-disabled), .ant-select-item-option:not(.ant-select-item-option-disabled), .ant-cascader-menu-item:not(.ant-cascader-menu-item-disabled), .ant-mentions-dropdown-menu-item ) { border-radius: 5px; transition: background-color var(--motion-instant) ease-out, color var(--motion-instant) ease-out; } body.app-spatial-overlays :where( .ant-dropdown-menu-item:not(.ant-dropdown-menu-item-disabled):hover, .ant-dropdown-menu-submenu-title:not(.ant-dropdown-menu-item-disabled):hover, .ant-select-item-option-active:not(.ant-select-item-option-disabled), .ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled), .ant-mentions-dropdown-menu-item-active ) { background: var(--workspace-overlay-hover) !important; } body.app-spatial-overlays :where( .ant-dropdown-menu-item-selected, .ant-select-item-option-selected:not(.ant-select-item-option-disabled), .ant-cascader-menu-item-active ) { background: var(--workspace-overlay-selected) !important; color: var(--foreground) !important; } body.app-spatial-overlays :where( .ant-dropdown-menu-item-divider, .ant-popover-content > .border-b, .ant-popover-content > .border-y, .ant-modal-header, .ant-modal-footer, .ant-drawer-header ) { border-color: var(--workspace-overlay-divider) !important; } body.app-spatial-overlays :where(.ant-popover-arrow::before, .ant-tooltip-arrow::before) { border: 1px solid var(--workspace-overlay-border); background: var(--workspace-overlay-bg-strong) !important; } body.app-spatial-overlays :where(.ant-modal-mask, .ant-drawer-mask) { background: rgba(0, 0, 0, 0.48) !important; backdrop-filter: blur(7px); -webkit-backdrop-filter: blur(7px); } .app-workspace-shell.is-spatial .app-workspace-brand-mark { border: 1px solid color-mix(in srgb, var(--workspace-accent) 36%, transparent); background: var(--workspace-accent); color: color-mix(in srgb, var(--workspace-canvas) 92%, black); box-shadow: 0 8px 24px color-mix(in srgb, var(--workspace-accent) 18%, transparent); } .brand-logo-frame[data-logo-frame-enabled="false"] > :is(img, svg) { width: 100%; height: 100%; } /* 工作区保留滚轮与触控板滚动,只隐藏会形成额外竖向分割的浏览器轨道。 */ .app-spatial-workspace .app-workspace-scroll { scrollbar-width: none; } .app-spatial-workspace .app-workspace-scroll::-webkit-scrollbar { display: none; } .app-spatial-workspace .app-page-header { border-color: var(--workspace-border); } .app-spatial-workspace .app-page-header h1 { letter-spacing: 0; text-wrap: balance; } .app-spatial-workspace .app-workspace-surface, .app-spatial-workspace .app-collection-card { border-color: var(--workspace-border); background: var(--workspace-surface); box-shadow: 0 18px 50px color-mix(in srgb, var(--workspace-canvas) 54%, transparent), inset 0 1px 0 color-mix(in srgb, white 8%, transparent); backdrop-filter: blur(18px) saturate(118%); } .app-spatial-workspace .app-collection-card:hover, .app-spatial-workspace .app-collection-card:focus-within { border-color: var(--workspace-border-strong); background: color-mix(in srgb, var(--workspace-surface-strong) 96%, var(--workspace-accent) 4%); box-shadow: 0 18px 42px color-mix(in srgb, var(--workspace-accent) 7%, transparent); } .app-spatial-workspace .app-table-surface { border-color: var(--workspace-border); background: var(--workspace-surface-strong); box-shadow: 0 20px 54px color-mix(in srgb, var(--workspace-canvas) 58%, transparent), inset 0 1px 0 color-mix(in srgb, white 7%, transparent); } .app-spatial-workspace .app-data-table .ant-table, .app-spatial-workspace .app-data-table .ant-table-container { background: transparent; } .app-spatial-workspace .app-list-search:focus-within { filter: drop-shadow(0 0 16px color-mix(in srgb, var(--workspace-accent) 10%, transparent)); } .app-spatial-workspace .app-pagination-bar { border-color: var(--workspace-border); background: transparent; } .app-spatial-workspace .workspace-signal-icon path { stroke: var(--workspace-accent) !important; } .app-spatial-workspace .workspace-signal-icon circle { fill: color-mix(in srgb, var(--workspace-accent) 62%, transparent) !important; } .app-spatial-workspace .project-overview-focus, .app-spatial-workspace .project-pipeline-surface { border-color: var(--workspace-border); background: var(--workspace-surface-strong); box-shadow: none; } .app-spatial-workspace .project-overview-status { background: color-mix(in srgb, var(--workspace-surface) 82%, var(--workspace-accent) 3%); } .app-spatial-workspace .project-workbench-header { border-color: var(--workspace-border); background: color-mix(in srgb, var(--workspace-nav) 92%, transparent); box-shadow: none; backdrop-filter: blur(22px) saturate(120%); } .app-spatial-workspace .project-pipeline-surface > div > a:hover { background: color-mix(in srgb, var(--workspace-accent) 5%, transparent); } @media (max-width: 639px) { /* 窄屏下侧栏常驻,收缩到图标主轨,避免遮挡主内容 */ .app-workspace-shell.is-spatial .app-workspace-sidebar.is-collapsed { width: 0 !important; } } @media (max-width: 1023px) { .app-workspace-sidebar-scrim { left: 0; } .app-workspace-shell .app-workspace-sidebar { width: 0 !important; border: 0 !important; transition: width var(--motion-state) var(--ease-aceternity); } .app-workspace-shell .app-workspace-sidebar.is-mobile-expanded { position: absolute; z-index: 40; inset: 6px auto 6px 6px; width: min(264px, calc(100vw - 58px)) !important; border: 1px solid color-mix(in srgb, var(--foreground) 7%, transparent); border-radius: var(--r-xl); box-shadow: 22px 0 70px rgba(0, 0, 0, 0.42), inset 0 1px 0 color-mix(in srgb, white 7%, transparent); } } .app-user-workspace { /* 用户端工作区:浅灰画布 + 白色内容面,弱化后台式分隔线。 */ --workspace-canvas: #f4f4f5; --workspace-page: var(--workspace-canvas); --workspace-navigation: #efeff0; --workspace-content: #f8f8f9; --workspace-sidebar: var(--workspace-navigation); --workspace-surface: #ffffff; --workspace-surface-strong: #ffffff; --workspace-border: rgba(17, 17, 17, 0.08); --workspace-border-strong: rgba(17, 17, 17, 0.14); --workspace-nav: var(--workspace-navigation); --workspace-accent: #171717; --workspace-accent-soft: rgba(17, 17, 17, 0.06); --workspace-nav-active-bg: rgba(17, 17, 17, 0.075); --workspace-nav-active-hover-bg: rgba(17, 17, 17, 0.11); --workspace-sidebar-width: 200px; --workspace-sidebar-nav-width: 200px; --workspace-sidebar-collapsed-width: 64px; --workspace-shell-gutter: 0px; --workspace-card-gap: 0px; --workspace-topbar-height: 56px; background-color: var(--workspace-page); } .dark .app-user-workspace { --workspace-canvas: #101011; --workspace-page: var(--workspace-canvas); --workspace-navigation: #171718; --workspace-content: #121213; --workspace-sidebar: var(--workspace-navigation); --workspace-surface: #1b1b1d; --workspace-surface-strong: #222224; --workspace-border: rgba(255, 255, 255, 0.09); --workspace-border-strong: rgba(255, 255, 255, 0.16); --workspace-nav: var(--workspace-navigation); --workspace-accent: #f5f5f5; --workspace-accent-soft: rgba(255, 255, 255, 0.08); --workspace-nav-active-bg: rgba(255, 255, 255, 0.09); --workspace-nav-active-hover-bg: rgba(255, 255, 255, 0.13); } /* 画布编辑器保持独立的全屏工作区,但沿用用户端的安全区和控件密度。 */ .app-user-workspace.app-spatial-workspace { --canvas-topbar-h: 56px; --canvas-inset-x: 12px; --canvas-inset-y: 12px; --canvas-dock-popover-offset: 46px; } /* 画布编辑器和管理后台不继承用户端的圆角卡片外壳。 */ .app-user-workspace .app-workspace-sidebar { background: var(--workspace-sidebar); } .app-user-workspace .app-workspace-stage { background: var(--workspace-content); } .app-user-workspace .app-workspace-sidebar-search > button { min-height: 40px; border-radius: var(--r-md); background: color-mix(in srgb, var(--foreground) 4%, transparent); } .app-user-workspace .app-workspace-sidebar-search > button:hover, .app-user-workspace .app-workspace-sidebar-search > button:focus-visible { background: color-mix(in srgb, var(--foreground) 8%, transparent); } .app-user-workspace .app-workspace-nav-link { min-height: 40px; border-radius: 14px; padding-inline: 12px; color: color-mix(in srgb, var(--foreground) 62%, transparent); transition: background-color var(--motion-instant) var(--ease-product-enter), color var(--motion-instant) var(--ease-product-enter), transform var(--motion-instant) var(--ease-product-enter); } .app-user-workspace .app-workspace-nav-link:hover:not(.is-active) { background: color-mix(in srgb, var(--foreground) 5%, transparent); color: var(--foreground); } .app-user-workspace .app-workspace-nav-link:active, .app-user-workspace .app-workspace-topbar-icon-button:active, .app-user-workspace .app-workspace-sidebar-search > button:active { transform: scale(0.985); } .app-user-workspace .app-workspace-nav-link:focus-visible, .app-user-workspace .app-workspace-sidebar-search > button:focus-visible, .app-user-workspace .app-workspace-sidebar-rail-button:focus-visible { outline: 2px solid color-mix(in srgb, var(--workspace-accent) 42%, transparent); outline-offset: 2px; } .app-workspace-shell { position: relative; padding: var(--workspace-shell-gutter); background: var(--workspace-page); } /* 画布编辑器与运营后台(hideChrome 契约):保持全屏连体,不套圆角卡片 */ .app-workspace-shell:not(.is-spatial) { padding: 0; } .app-workspace-shell:not(.is-spatial) .app-workspace-stage { border: 0; border-radius: 0; box-shadow: none; } /* 工作区外壳通过表面明度与间距分层,避免边框和内高光叠加造成线条感。 */ .app-workspace-sidebar, .app-workspace-stage { border: 0; border-radius: var(--r-xl); box-shadow: none; } .app-workspace-sidebar { width: var(--workspace-sidebar-width, 208px); background: color-mix(in srgb, var(--workspace-sidebar) 96%, var(--foreground) 4%); transition: width var(--motion-state) var(--ease-aceternity); } .app-workspace-shell .app-workspace-sidebar.is-collapsed { width: var(--workspace-sidebar-collapsed-width) !important; } .app-workspace-sidebar-nav { width: var(--workspace-sidebar-nav-width); transition: width var(--motion-state) var(--ease-aceternity); } .app-workspace-sidebar-nav.is-collapsed { width: var(--workspace-sidebar-collapsed-width); } .app-workspace-sidebar-rail-header { display: grid; min-height: 56px; padding: 10px; place-items: center; } .app-workspace-sidebar-rail-button { display: grid; width: 36px; height: 36px; place-items: center; border-radius: var(--r-sm); color: color-mix(in srgb, var(--foreground) 66%, transparent); transition: color var(--motion-instant) ease-out, background-color var(--motion-instant) ease-out; } .app-workspace-sidebar-rail-button:hover, .app-workspace-sidebar-rail-button:focus-visible { background: var(--surface-hover); color: var(--foreground); } .app-workspace-sidebar-nav.is-collapsed .app-workspace-sidebar-search { padding: 0 10px 4px; } .app-workspace-sidebar-nav.is-collapsed .app-workspace-sidebar-search > button, .app-workspace-nav-link.is-collapsed { justify-content: center; gap: 0; padding-inline: 0; } .app-workspace-sidebar-nav.is-collapsed .app-workspace-sidebar-search-label, .app-workspace-sidebar-nav.is-collapsed .app-workspace-sidebar-search-shortcut, .app-workspace-nav-link.is-collapsed .app-workspace-nav-title, .app-workspace-nav-link.is-collapsed .app-workspace-nav-meta { display: none; } .app-workspace-nav-link.is-collapsed .app-workspace-nav-main { gap: 0; } .app-workspace-sidebar-scroll-area.is-collapsed { gap: 6px; padding: 4px 10px 8px; } .app-workspace-sidebar-nav.is-collapsed .app-workspace-sidebar-footer { padding: 8px 10px 10px; } .app-workspace-sidebar .app-workspace-sidebar-scroll-area { scrollbar-width: none; } .app-workspace-sidebar .app-workspace-sidebar-scroll-area::-webkit-scrollbar { display: none; } .app-workspace-stage, .app-user-content, .app-workspace-grid { background: var(--workspace-content); } .app-workspace-page { background: var(--workspace-content); } .app-workspace-navigation { background: var(--workspace-navigation); } .app-page-header { position: sticky; top: 0; z-index: var(--z-toolbar); min-height: var(--page-topbar-h); padding-top: 10px; padding-bottom: 10px; background: var(--workspace-content); border-bottom: 0; backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)); } .app-page-header-title { font-size: var(--fs-title); letter-spacing: -0.01em; } .canvas-topbar { background: transparent; border-bottom: 0; backdrop-filter: none; } .canvas-topbar-cluster { min-height: var(--space-10); border: 1px solid color-mix(in srgb, currentColor 8%, transparent); border-radius: var(--r-2xl); background: color-mix(in srgb, var(--dock-surface) 72%, transparent) !important; padding: var(--space-half) var(--space-2); box-shadow: 0 10px 28px color-mix(in srgb, black 16%, transparent); -webkit-backdrop-filter: blur(22px) saturate(140%); backdrop-filter: blur(22px) saturate(140%); } /* 顶部操作区复用底部 FloatingDock 的命令状态,保持两组浮层在不同主题下有同一套反馈。 */ .canvas-topbar-action { border-color: transparent; background: transparent; box-shadow: none; transition: background-color var(--motion-instant) ease-out, color var(--motion-instant) ease-out, opacity var(--motion-instant) ease-out; } .canvas-topbar-action:hover:not(:disabled) { background: var(--dock-command-hover) !important; } .canvas-topbar-action:hover:not(:disabled) .app-workspace-credit-gift { transform: translateY(-1px) rotate(-8deg); } .canvas-topbar-project-cluster { width: max-content; max-width: min(360px, calc(50vw - 88px)); } /* 右侧命令组在窄屏保持可达,不挤压项目标题,也不制造横向溢出。 */ .canvas-topbar > .canvas-topbar-cluster:last-child { min-width: 0; max-width: min(52vw, 620px); overflow-x: auto; scrollbar-width: none; } .canvas-topbar > .canvas-topbar-cluster:last-child::-webkit-scrollbar { display: none; } .canvas-topbar-title-block, .canvas-topbar-title-row, .canvas-topbar-project-context { max-width: 100%; } .canvas-topbar-title-row { width: fit-content; } @media (max-width: 767px) { .app-user-workspace.app-spatial-workspace { --canvas-topbar-h: 56px; --canvas-inset-x: 12px; --canvas-inset-y: max(12px, env(safe-area-inset-bottom)); --canvas-dock-popover-offset: 48px; } .canvas-topbar { padding-inline: max(12px, env(safe-area-inset-left)) max(12px, env(safe-area-inset-right)); } .canvas-topbar-project-cluster { max-width: min(260px, calc(100vw - 132px)); } .canvas-topbar > .canvas-topbar-cluster:last-child { max-width: calc(50vw - 12px); } .canvas-topbar-project-context { display: none; } } /* 画布项目侧栏:把章节、画风和资产入口收敛成低干扰的创作导航。 */ .canvas-project-sidebar { --canvas-sidebar-surface: color-mix(in srgb, var(--background) 94%, var(--foreground) 6%); width: var(--canvas-sidebar-width); border-color: color-mix(in srgb, var(--foreground) 9%, transparent) !important; background: var(--canvas-sidebar-surface) !important; box-shadow: inset -1px 0 0 color-mix(in srgb, var(--foreground) 4%, transparent); backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)); } .canvas-project-sidebar.is-collapsed { width: 48px; background: color-mix(in srgb, var(--canvas-sidebar-surface) 96%, var(--foreground) 4%) !important; } .canvas-project-sidebar-header { min-height: 56px; border-color: color-mix(in srgb, var(--foreground) 8%, transparent) !important; padding-inline: 12px; } .canvas-project-sidebar-header a, .canvas-project-sidebar-header button, .canvas-project-sidebar-back-link { transition: background-color var(--motion-instant) var(--ease-product-enter), color var(--motion-instant) var(--ease-product-enter), transform var(--motion-instant) var(--ease-product-enter); } .canvas-project-sidebar-header a:hover, .canvas-project-sidebar-header button:hover, .canvas-project-sidebar-back-link:hover { background: color-mix(in srgb, var(--foreground) 6%, transparent); color: var(--foreground); } .canvas-project-sidebar-header a:active, .canvas-project-sidebar-header button:active, .canvas-project-sidebar-back-link:active, .canvas-project-sidebar-assets-button:active { transform: scale(0.985); } .canvas-project-sidebar-header a:focus-visible, .canvas-project-sidebar-header button:focus-visible, .canvas-project-sidebar-back-link:focus-visible, .canvas-project-sidebar-assets-button:focus-visible, .canvas-project-sidebar-chapter-row button:focus-visible { outline: 2px solid color-mix(in srgb, var(--workspace-accent) 42%, transparent); outline-offset: 2px; } .canvas-project-sidebar-style, .canvas-project-sidebar-assets { border-color: color-mix(in srgb, var(--foreground) 8%, transparent) !important; } .canvas-project-sidebar-style-button { min-height: 44px; border-radius: var(--r-md); transition: background-color var(--motion-instant) var(--ease-product-enter), color var(--motion-instant) var(--ease-product-enter), transform var(--motion-instant) var(--ease-product-enter); } .canvas-project-sidebar-style-button:hover:not(:disabled) { background: color-mix(in srgb, var(--foreground) 6%, transparent); } .canvas-project-sidebar-style-button img, .canvas-project-sidebar-style-button > span:first-of-type { border-radius: var(--r-sm); } .canvas-project-sidebar-section-heading { color: color-mix(in srgb, var(--foreground) 52%, transparent); } .canvas-project-sidebar-search { min-height: 34px; border-color: color-mix(in srgb, var(--foreground) 10%, transparent) !important; background: color-mix(in srgb, var(--foreground) 3%, transparent) !important; transition: border-color var(--motion-instant) var(--ease-product-enter), background-color var(--motion-instant) var(--ease-product-enter), box-shadow var(--motion-instant) var(--ease-product-enter); } .canvas-project-sidebar-search:focus-within { border-color: color-mix(in srgb, var(--workspace-accent) 42%, transparent) !important; background: var(--background) !important; box-shadow: none; } .canvas-project-sidebar-chapter-scroll { scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--foreground) 12%, transparent) transparent; } .canvas-project-sidebar-chapter-row { border-radius: var(--r-md); color: color-mix(in srgb, var(--foreground) 70%, transparent); transition: background-color var(--motion-instant) var(--ease-product-enter), color var(--motion-instant) var(--ease-product-enter), transform var(--motion-instant) var(--ease-product-enter); } .canvas-project-sidebar-chapter-row:hover { background: color-mix(in srgb, var(--foreground) 5%, transparent) !important; color: var(--foreground); } .canvas-project-sidebar-chapter-row.bg-surface-active { background: color-mix(in srgb, var(--workspace-accent) 9%, transparent) !important; color: var(--foreground); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--workspace-accent) 12%, transparent); } .canvas-project-sidebar-assets-button { min-height: 40px; border-color: color-mix(in srgb, var(--foreground) 10%, transparent) !important; border-radius: var(--r-md); background: color-mix(in srgb, var(--background) 74%, var(--foreground) 3%); transition: background-color var(--motion-instant) var(--ease-product-enter), border-color var(--motion-instant) var(--ease-product-enter), color var(--motion-instant) var(--ease-product-enter), transform var(--motion-instant) var(--ease-product-enter); } .canvas-project-sidebar-assets-button:hover { border-color: color-mix(in srgb, var(--workspace-accent) 30%, transparent) !important; background: color-mix(in srgb, var(--workspace-accent) 7%, var(--background)); color: var(--foreground); } @media (prefers-reduced-motion: reduce) { .canvas-project-sidebar-header a, .canvas-project-sidebar-header button, .canvas-project-sidebar-back-link, .canvas-project-sidebar-style-button, .canvas-project-sidebar-search, .canvas-project-sidebar-chapter-row, .canvas-project-sidebar-assets-button { transition: none; } } .app-workspace-main-row { display: flex; gap: var(--workspace-card-gap); min-height: 0; min-width: 0; flex: 1 1 auto; overflow: hidden; } .app-workspace-topbar { position: relative; z-index: var(--z-toolbar); height: var(--workspace-topbar-height, 56px); border: 0; border-bottom: 1px solid var(--workspace-border); border-radius: 0; background: color-mix(in srgb, var(--workspace-content) 94%, transparent); box-shadow: none; backdrop-filter: none; -webkit-backdrop-filter: none; } .app-workspace-topbar.has-extension { border-bottom: 1px solid var(--workspace-border); background: color-mix(in srgb, var(--workspace-nav) 92%, transparent); backdrop-filter: blur(22px) saturate(120%); -webkit-backdrop-filter: blur(22px) saturate(120%); } .app-workspace-topbar-icon-button { display: inline-flex; width: 36px; height: 36px; flex: 0 0 auto; align-items: center; justify-content: center; border-radius: var(--r-md); color: color-mix(in srgb, var(--foreground) 58%, transparent); transition: background-color var(--motion-instant) ease-out, color var(--motion-instant) ease-out; } .app-workspace-topbar-icon-button > svg, .app-workspace-topbar-icon-button > span > svg { width: 18px; height: 18px; stroke-width: 1.8; } /* 账户触发按钮为身份标识,占位图标默认不弱化(与其他工具图标区分) */ .app-workspace-account-trigger > span > svg { color: var(--foreground); } .app-workspace-topbar-icon-button:hover { background: var(--surface-hover); color: var(--foreground); } .app-workspace-topbar-icon-button:focus-visible { outline: 2px solid color-mix(in srgb, var(--workspace-accent) 46%, transparent); outline-offset: -2px; } /* 品牌字标:弱化但可读,hover 加深 */ .app-workspace-brand-wordmark { color: color-mix(in srgb, var(--foreground) 78%, transparent); letter-spacing: 0.01em; transition: color var(--motion-instant) ease-out; } .app-workspace-nav-link { position: relative; } /* 侧栏激活项只保留底色高亮,不使用左侧竖条(用户决策:选中不画竖线)。 */ .app-workspace-nav-link.is-active { background: var(--workspace-nav-active-bg); color: var(--foreground); box-shadow: none; } .app-workspace-nav-link.is-active:hover { background: var(--workspace-nav-active-hover-bg); } .app-workspace-icon-button { display: inline-flex; width: 30px; height: 30px; flex: 0 0 auto; align-items: center; justify-content: center; border-radius: 6px; color: color-mix(in srgb, var(--foreground) 58%, transparent); transition: color var(--motion-instant) ease-out, background-color var(--motion-instant) ease-out; } .app-workspace-icon-button:hover { background: var(--surface-hover); color: var(--foreground); } /* Sidebar custom scrollbar - 隐身融入设计 */ .app-workspace-sidebar-scroll-area { position: relative; /* 为渐变遮罩定位 */ overflow-y: auto; scrollbar-width: thin; scrollbar-color: transparent transparent; /* 默认完全隐藏 */ transition: scrollbar-color var(--motion-state) ease-in-out; } .app-workspace-sidebar-scroll-area::-webkit-scrollbar { width: 4px; background: transparent; /* 默认轨道透明 */ } .app-workspace-sidebar-scroll-area::-webkit-scrollbar-track { background: transparent; } .app-workspace-sidebar-scroll-area::-webkit-scrollbar-thumb { background: transparent; /* 默认滑块透明 */ border-radius: 9999px; transition: background-color var(--motion-state) ease-in-out; } /* Hover state - 显示滚动条 */ .app-workspace-sidebar:hover .app-workspace-sidebar-scroll-area, .app-workspace-sidebar-scroll-area:hover { scrollbar-color: rgba(255, 255, 255, 0.2) transparent; } .app-workspace-sidebar:hover .app-workspace-sidebar-scroll-area::-webkit-scrollbar-thumb, .app-workspace-sidebar-scroll-area:hover::-webkit-scrollbar-thumb { background-color: rgba(255, 255, 255, 0.2); } /* Dark mode scrollbar */ .dark .app-workspace-sidebar:hover .app-workspace-sidebar-scroll-area, .dark .app-workspace-sidebar-scroll-area:hover { scrollbar-color: rgba(255, 255, 255, 0.15) transparent; } .dark .app-workspace-sidebar:hover .app-workspace-sidebar-scroll-area::-webkit-scrollbar-thumb, .dark .app-workspace-sidebar-scroll-area:hover::-webkit-scrollbar-thumb { background-color: rgba(255, 255, 255, 0.15); } /* Scroll fade gradients - 光影提示设计 */ .app-workspace-sidebar-scroll-area.has-top-fade::before, .app-workspace-sidebar-scroll-area.has-bottom-fade::after { content: ""; position: absolute; left: 0; right: 0; height: 12px; pointer-events: none; /* 不阻塞点击事件 */ z-index: 10; } .app-workspace-sidebar-scroll-area.has-top-fade::before { top: 0; background: linear-gradient(to bottom, var(--workspace-sidebar), transparent); } .app-workspace-sidebar-scroll-area.has-bottom-fade::after { bottom: 0; background: linear-gradient(to top, var(--workspace-sidebar), transparent); } .workspace-signal-icon { filter: drop-shadow(0 7px 16px color-mix(in srgb, var(--workspace-accent) 14%, transparent)); } .workspace-state { animation: workspace-state-enter var(--motion-panel) var(--ease-product-enter) both; } .workspace-loading-state .ant-skeleton-title, .workspace-loading-state .ant-skeleton-paragraph > li { border-radius: 4px; } /* 全屏仅用于应用启动;骨架延续真实工作区结构,路由加载只占内容舞台。 */ .full-screen-loader { position: fixed; inset: 0; z-index: var(--loader-z); min-height: 100dvh; overflow: hidden; background: var(--workspace-page); color: var(--foreground); animation: loader-surface-enter var(--motion-panel) var(--motion-ease-out) both; } .full-screen-loader-shell { display: flex; width: 100%; height: 100dvh; flex-direction: column; } .full-screen-loader-topbar { display: flex; height: var(--page-topbar-h); flex: 0 0 var(--page-topbar-h); align-items: center; justify-content: space-between; padding-inline: var(--space-5); background: var(--workspace-navigation); } .full-screen-loader-topbar-group { display: flex; align-items: center; gap: var(--space-2); } .loader-placeholder { display: block; background: color-mix(in srgb, var(--foreground) 6%, transparent); } .loader-placeholder-control, .loader-placeholder-mark, .loader-placeholder-rail-item { border-radius: var(--r-md); } .loader-placeholder-control { width: 36px; height: 36px; } .loader-placeholder-mark { width: 28px; height: 28px; } .loader-placeholder-wordmark { width: 40px; height: 10px; border-radius: var(--r-full); } .loader-placeholder-action { width: 88px; height: 32px; border-radius: var(--r-md); } .full-screen-loader-main { display: flex; min-height: 0; flex: 1 1 auto; } .full-screen-loader-rail { display: flex; width: 64px; flex: 0 0 64px; flex-direction: column; align-items: center; gap: var(--space-2); padding-top: calc(var(--space-12) + var(--space-3)); background: var(--workspace-navigation); } .loader-placeholder-rail-item { width: 40px; height: 40px; } .full-screen-loader-stage { min-width: 0; flex: 1 1 auto; overflow: hidden; padding: var(--space-8); background: var(--workspace-content); } .full-screen-loader-stage-header { display: flex; min-height: var(--space-10); align-items: center; justify-content: space-between; gap: var(--space-4); } .full-screen-loader-status, .workspace-route-loader-content { display: flex; align-items: center; gap: var(--space-3); color: color-mix(in srgb, var(--foreground) 54%, transparent); font-size: var(--fs-caption); } .loading-signal { width: 20px; height: 20px; flex: 0 0 20px; border: 2px solid color-mix(in srgb, var(--foreground) 12%, transparent); border-top-color: color-mix(in srgb, var(--foreground) 72%, transparent); border-radius: var(--r-full); animation: loading-signal-spin 900ms linear infinite; } .full-screen-loader-stage-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-4); margin-top: var(--space-6); } .full-screen-loader-surface { min-width: 0; } .loader-placeholder-media { aspect-ratio: 16 / 10; border-radius: var(--r-lg); } .loader-placeholder-title { width: 58%; height: 10px; margin-top: var(--space-3); border-radius: var(--r-full); } .loader-placeholder-meta { width: 34%; height: 8px; margin-top: var(--space-2); border-radius: var(--r-full); opacity: 0.72; } .workspace-route-loader { position: absolute; inset: 0; display: grid; min-height: 100%; place-items: center; background: var(--workspace-page); color: var(--foreground); opacity: 0; transition: opacity var(--motion-instant) ease-out; } .workspace-route-loader.is-visible { opacity: 1; } .workspace-route-loader-content { justify-content: center; } @keyframes loader-surface-enter { from { opacity: 0; } to { opacity: 1; } } @keyframes loading-signal-spin { to { transform: rotate(360deg); } } @media (max-width: 1023px) { .full-screen-loader-rail { display: none; } .full-screen-loader-stage { padding: var(--space-6); } .full-screen-loader-stage-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 639px) { .full-screen-loader-topbar { padding-inline: var(--space-4); } .full-screen-loader-topbar-group:last-child .loader-placeholder-control:not(:last-child) { display: none; } .full-screen-loader-stage { padding: var(--space-5) var(--space-4); } .full-screen-loader-stage-grid { grid-template-columns: 1fr; } .full-screen-loader-stage-grid .full-screen-loader-surface:nth-child(n + 3) { display: none; } .loader-placeholder-action { width: var(--space-10); } } @media (prefers-reduced-motion: reduce) { .full-screen-loader { animation: none; } .loading-signal { animation: none; } .workspace-route-loader { transition: none; } } /* 启动页以品牌标记和创作流程为视觉中心,不模拟尚未出现的工作区骨架。 */ .full-screen-loader { display: grid; place-items: center; background-color: var(--workspace-page); background-image: linear-gradient(color-mix(in srgb, var(--foreground) 3.5%, transparent) 1px, transparent 1px), linear-gradient(90deg, color-mix(in srgb, var(--foreground) 3.5%, transparent) 1px, transparent 1px); background-size: 32px 32px; } .full-screen-loader::before { position: absolute; inset: 0; background: radial-gradient(circle at center, color-mix(in srgb, var(--workspace-accent) 8%, transparent), transparent 34%); content: ""; pointer-events: none; } .full-screen-loader-scene { position: relative; width: min(300px, 72vw); aspect-ratio: 1; color: var(--foreground); } .full-screen-loader-logo { position: absolute; z-index: 3; top: 50%; left: 50%; display: grid; width: 72px; height: 72px; place-items: center; border: 1px solid color-mix(in srgb, var(--foreground) 13%, transparent); border-radius: var(--r-xl); background: color-mix(in srgb, var(--workspace-navigation) 92%, transparent); box-shadow: 0 20px 60px color-mix(in srgb, var(--workspace-accent) 12%, transparent); transform: translate(-50%, -50%); animation: loader-logo-breathe 2.8s ease-in-out infinite; } .full-screen-loader-logo-image { width: 38px; height: 38px; } .full-screen-loader-logo-fallback { display: block; width: 36px; height: 36px; background: currentColor; mask: url('/logo.svg') center / contain no-repeat; -webkit-mask: url('/logo.svg') center / contain no-repeat; } .workspace-route-loader-logo .full-screen-loader-logo-fallback { width: 16px; height: 16px; } .full-screen-loader-orbit { position: absolute; z-index: 2; inset: 65px; border: 1px solid color-mix(in srgb, var(--workspace-accent) 30%, transparent); border-right-color: transparent; border-radius: 50%; animation: loader-orbit-spin 5.5s linear infinite; } .full-screen-loader-orbit::before, .full-screen-loader-orbit::after { position: absolute; width: 7px; height: 7px; border-radius: 50%; background: var(--workspace-accent); box-shadow: 0 0 18px color-mix(in srgb, var(--workspace-accent) 72%, transparent); content: ""; } .full-screen-loader-orbit::before { top: 17px; right: 17px; } .full-screen-loader-orbit::after { bottom: 17px; left: 17px; opacity: .45; } .full-screen-loader-guide { position: absolute; z-index: 0; opacity: .45; } .full-screen-loader-guide.is-horizontal { top: 50%; right: 0; left: 0; border-top: 1px dashed color-mix(in srgb, var(--foreground) 14%, transparent); } .full-screen-loader-guide.is-vertical { top: 0; bottom: 0; left: 50%; border-left: 1px dashed color-mix(in srgb, var(--foreground) 14%, transparent); } .full-screen-loader-frame, .full-screen-loader-script, .full-screen-loader-timeline { position: absolute; z-index: 1; border: 1px solid color-mix(in srgb, var(--foreground) 11%, transparent); background: color-mix(in srgb, var(--workspace-navigation) 78%, transparent); box-shadow: 0 10px 28px color-mix(in srgb, #000 16%, transparent); } .full-screen-loader-frame { top: 38px; display: grid; width: 70px; height: 46px; grid-template-columns: repeat(3, 1fr); gap: 3px; padding: 5px; border-radius: var(--r-sm); } .full-screen-loader-frame.is-left { left: 10px; transform: rotate(-7deg); animation: loader-frame-float 3.2s ease-in-out infinite; } .full-screen-loader-frame.is-right { right: 10px; transform: rotate(7deg); animation: loader-frame-float 3.2s .8s ease-in-out infinite reverse; } .full-screen-loader-frame i { border-radius: 2px; background: color-mix(in srgb, var(--workspace-accent) 16%, var(--workspace-content)); } .full-screen-loader-script { bottom: 34px; left: 24px; width: 78px; height: 54px; border-radius: var(--r-sm); padding: 10px; transform: rotate(5deg); animation: loader-frame-float 3.6s .35s ease-in-out infinite; } .full-screen-loader-script i { display: block; width: 78%; height: 2px; margin-bottom: 7px; background: color-mix(in srgb, var(--foreground) 25%, transparent); } .full-screen-loader-script i:nth-child(2) { width: 100%; } .full-screen-loader-script i:nth-child(3) { width: 56%; } .full-screen-loader-script b { position: absolute; right: 9px; bottom: 8px; width: 1px; height: 12px; background: var(--workspace-accent); animation: loader-caret 900ms steps(1) infinite; } .full-screen-loader-timeline { right: 18px; bottom: 38px; display: flex; width: 88px; height: 44px; align-items: flex-end; gap: 3px; border-radius: var(--r-sm); padding: 8px; transform: rotate(-4deg); animation: loader-frame-float 3.4s 1.1s ease-in-out infinite; } .full-screen-loader-timeline i { width: 14px; background: color-mix(in srgb, var(--workspace-accent) 18%, var(--workspace-content)); } .full-screen-loader-timeline i:nth-child(1) { height: 16px; } .full-screen-loader-timeline i:nth-child(2) { height: 27px; } .full-screen-loader-timeline i:nth-child(3) { height: 20px; } .full-screen-loader-timeline i:nth-child(4) { height: 24px; } .full-screen-loader-timeline b { position: absolute; right: 8px; bottom: 6px; left: 8px; height: 1px; background: var(--workspace-accent); transform-origin: left; animation: loader-timeline-progress 2.2s ease-in-out infinite; } .full-screen-loader-copy { position: absolute; top: calc(50% + 176px); left: 50%; display: flex; min-width: 240px; flex-direction: column; align-items: center; gap: var(--space-1); color: var(--foreground); text-align: center; transform: translateX(-50%); } .full-screen-loader-copy strong { font-size: var(--fs-body); font-weight: 620; letter-spacing: .01em; } .full-screen-loader-copy > span:not(.loading-signal) { color: color-mix(in srgb, var(--foreground) 48%, transparent); font-size: var(--fs-label); } .loading-signal { display: flex; width: auto; height: 12px; flex: 0 0 auto; align-items: center; gap: 4px; margin-top: var(--space-2); border: 0; border-radius: 0; animation: none; } .loading-signal i { width: 4px; height: 4px; border-radius: 50%; background: color-mix(in srgb, var(--workspace-accent) 76%, var(--foreground)); animation: loader-signal-pulse 1.25s ease-in-out infinite; } .loading-signal i:nth-child(2) { animation-delay: 140ms; } .loading-signal i:nth-child(3) { animation-delay: 280ms; } .workspace-route-loader-content { flex-direction: column; gap: var(--space-2); } .workspace-route-loader-content .loading-signal { margin-top: 0; } .workspace-route-loader-mark { display: grid; width: 36px; height: 36px; place-items: center; border: 1px solid color-mix(in srgb, var(--foreground) 10%, transparent); border-radius: var(--r-md); background: var(--workspace-navigation); } .workspace-route-loader-logo { display: grid; place-items: center; color: var(--foreground); } @keyframes loader-orbit-spin { to { transform: rotate(360deg); } } @keyframes loader-logo-breathe { 0%, 100% { transform: translate(-50%, -50%) scale(.97); } 50% { transform: translate(-50%, -50%) scale(1.035); } } @keyframes loader-frame-float { 0%, 100% { translate: 0 0; } 50% { translate: 0 -6px; } } @keyframes loader-caret { 0%, 48% { opacity: 1; } 49%, 100% { opacity: 0; } } @keyframes loader-timeline-progress { 0% { transform: scaleX(.15); opacity: .5; } 55% { transform: scaleX(1); opacity: 1; } 100% { transform: scaleX(1); opacity: 0; } } @keyframes loader-signal-pulse { 0%, 100% { opacity: .25; transform: translateY(0); } 50% { opacity: 1; transform: translateY(-2px); } } @media (max-width: 639px) { .full-screen-loader-scene { width: min(260px, 76vw); } .full-screen-loader-copy { top: calc(50% + 154px); } } @media (prefers-reduced-motion: reduce) { .full-screen-loader-logo, .full-screen-loader-orbit, .full-screen-loader-frame, .full-screen-loader-script, .full-screen-loader-timeline, .full-screen-loader-script b, .full-screen-loader-timeline b, .loading-signal i { animation: none; } } :where(.ant-btn) { letter-spacing: 0; transition: color var(--motion-instant) ease-out, background-color var(--motion-instant) ease-out, border-color var(--motion-instant) ease-out, box-shadow var(--motion-instant) ease-out, transform 90ms ease-out; } :where(.ant-btn:not(:disabled)):active { transform: scale(0.98); } /* aria-pressed 表示持久选择,不是主操作。即使调用方仍传 primary, 也统一降为软选中态,避免暗色主题出现成排白色按钮。 */ :where(.ant-btn[aria-pressed="true"]) { border-color: var(--control-selected-border) !important; background: var(--control-selected-bg) !important; color: var(--control-selected-fg) !important; box-shadow: none !important; } :where(.ant-btn[aria-pressed="true"]:not(:disabled)):hover { background: var(--control-selected-hover-bg) !important; color: var(--control-selected-fg) !important; } /* AntD Switch 只有一个 handleBg token,无法分别表达开/关滑块颜色。 这里是全应用唯一的状态配对层,确保任何容器和 Portal 中都保持对比。 */ :where(.ant-switch.ant-switch-checked) { background: var(--control-switch-checked-bg) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--control-switch-checked-bg) 70%, var(--foreground)), 0 0 0 2px color-mix(in srgb, var(--control-switch-checked-bg) 15%, transparent); } :where(.ant-switch.ant-switch-checked:not(.ant-switch-disabled)):hover { background: var(--control-switch-checked-hover-bg) !important; } :where(.ant-switch.ant-switch-checked) .ant-switch-handle::before { background: var(--control-switch-checked-handle) !important; } :where(.ant-switch:not(.ant-switch-checked)) { background: var(--control-switch-off-bg) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--foreground) 18%, transparent); } :where(.ant-switch:not(.ant-switch-checked):not(.ant-switch-disabled)):hover { background: var(--control-switch-off-hover-bg) !important; } :where(.ant-switch:not(.ant-switch-checked)) .ant-switch-handle::before { background: var(--control-switch-off-handle) !important; } /* 自研 Switch(data-state on/off)上下文语义覆盖:插件开关保持绿/中性双态。 */ :where([data-slot="switch"].plugin-state-switch[data-state="on"]) { background: var(--plugin-switch-checked-bg) !important; } :where([data-slot="switch"].plugin-state-switch[data-state="on"]:not(:disabled)):hover { background: var(--plugin-switch-checked-hover-bg) !important; } :where([data-slot="switch"].plugin-state-switch[data-state="off"]) { background: var(--plugin-switch-off-bg) !important; } :where([data-slot="switch"].plugin-state-switch[data-state="off"]:not(:disabled)):hover { background: var(--plugin-switch-off-hover-bg) !important; } :where(.ant-switch):focus-visible { outline: 2px solid var(--control-focus-ring); outline-offset: 2px; } :where(.ant-select-item-option-content) { min-width: 0; } .creation-home { --creation-accent: var(--workspace-accent); --creation-bg: var(--workspace-page); --creation-surface: rgba(255, 255, 255, .68); --creation-surface-muted: rgba(238, 241, 245, .68); --creation-surface-hover: rgba(228, 232, 237, .7); --creation-surface-selected: rgba(218, 223, 229, .72); --creation-border: rgba(179, 188, 199, .34); --creation-border-strong: rgba(123, 136, 151, .42); --creation-text: #17191d; --creation-muted: #929aa5; --creation-faint: #b5bbc3; isolation: isolate; background: var(--creation-bg); color: var(--creation-text); backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)); } .dark .creation-home { --creation-accent: var(--workspace-accent); --creation-bg: var(--workspace-page); --creation-surface: rgba(27, 29, 34, .72); --creation-surface-muted: rgba(35, 38, 44, .68); --creation-surface-hover: rgba(47, 50, 58, .72); --creation-surface-selected: rgba(57, 61, 70, .74); --creation-border: rgba(104, 111, 124, .24); --creation-border-strong: rgba(137, 146, 160, .36); --creation-text: #f2f4f6; --creation-muted: #737b86; --creation-faint: #565d67; } .creation-new-button { position: absolute; z-index: 30; top: 24px; right: 28px; display: grid; width: 36px; height: 36px; place-items: center; border: 1px solid var(--creation-border); border-radius: 9px; background: var(--creation-surface); color: var(--creation-muted); box-shadow: 0 8px 24px rgba(31, 37, 45, .06), inset 0 1px 0 color-mix(in srgb, white 58%, transparent); backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate)); transition: border-color 160ms ease, background-color 160ms ease, color 160ms ease; } .creation-new-button:hover { border-color: var(--creation-border-strong); background: var(--creation-surface-hover); color: var(--creation-text); } .creation-empty-workspace { display: flex; width: min(1000px, calc(100% - 64px)); min-height: 100%; flex: 1 0 auto; flex-direction: column; align-items: center; justify-content: center; margin: 0 auto; padding: 0 0 20px; } .creation-empty-composer { width: 100%; animation: creation-workbench-enter var(--motion-dur-slow-calc) var(--motion-ease-out) both; } .creation-composer { position: relative; width: 100%; min-width: 0; border: 1px solid var(--creation-border); border-radius: 16px; background: var(--creation-surface); box-shadow: 0 22px 72px rgba(27, 33, 42, .065), inset 0 1px 0 color-mix(in srgb, white 76%, transparent); overflow: hidden; backdrop-filter: blur(26px) saturate(128%); -webkit-backdrop-filter: blur(26px) saturate(128%); transition: border-color 180ms ease, box-shadow 180ms ease; }