# Jointo(jointo)UI/UX 设计规范文档 > **项目名称**:Jointo(jointo) > **项目域名**:https://www.jointo.ai > **文档版本**:v1.0 > **创建日期**:2025-01-08 --- ## 目录 1. [设计原则](#1-设计原则) 2. [颜色系统](#2-颜色系统) 3. [字体系统](#3-字体系统) 4. [间距系统](#4-间距系统) 5. [圆角系统](#5-圆角系统) 6. [阴影系统](#6-阴影系统) 7. [交互状态](#7-交互状态) 8. [动画与过渡](#8-动画与过渡) 9. [响应式设计](#9-响应式设计) 10. [可访问性](#10-可访问性) 11. [图标规范](#11-图标规范) 12. [组件样式规范](#12-组件样式规范) --- ## 1. 设计原则 ### 1.1 核心设计原则 - **一致性**:整个应用保持统一的视觉语言和交互模式 - **清晰性**:界面元素层次分明,信息传达清晰 - **高效性**:减少用户操作步骤,提升工作效率 - **专业性**:面向视频创作专业用户,界面简洁专业 - **可访问性**:遵循 WCAG 标准,确保所有用户可用 ### 1.2 设计风格 - **双主题支持**:支持深色主题(默认)和亮色主题,可跟随系统自动切换 - **扁平化设计**:简洁的扁平化风格,减少视觉干扰 - **内容为王**:最大化内容展示区域,控件最小化 - **视觉层次**:通过颜色、大小、间距建立清晰的视觉层次 ### 1.3 主题模式 | 模式 | 说明 | 使用场景 | | ---------------------- | ------------------ | ---------------------------- | | **深色主题(Dark)** | 默认主题,深色背景 | 减少视觉疲劳,适合长时间工作 | | **亮色主题(Light)** | 浅色背景 | 光线充足的环境 | | **跟随系统(System)** | 自动检测系统偏好 | 用户无需手动切换 | --- ## 2. 颜色系统 我们采用 Element Plus 风格的分级颜色系统,将颜色变量分为 7 个核心体系,以支持更灵活的主题定制和更清晰的语义表达。 ### 2.1 颜色变量层级架构 | 体系 | 前缀 | 描述 | 示例 | | ------------------------ | ------------------------- | -------------------- | ---------------------------------- | | **1. 文字 (Text)** | `--text-` | 4级文字层级 | `--text-primary`, `--text-regular` | | **2. 边框 (Border)** | `--border-` | 4级边框层级 | `--border-base`, `--border-light` | | **3. 背景 (Background)** | `--bg-` / `--fill-` | 页面/元素背景与填充 | `--bg-page`, `--fill-default` | | **4. 品牌 (Brand)** | `--brand-` | 品牌主色 | `--brand-default`, `--brand-hover` | | **5. 功能 (Functional)** | `--success`, `--error` 等 | 状态反馈色 | `--success`, `--error` | | **6. 组件 (Component)** | `--input-` 等 | 特定组件专用变量 | `--input-bg`, `--input-border` | | **7. 轨道 (Track)** | `--track-` | 业务专用(如分镜看板) | `--track-storyboard` | ### 2.2 详细变量定义 (CSS Variables) > **注意**: 项目使用 Tailwind v4 的 `@theme` 语法,变量通过 `--color-*` 前缀自动映射为工具类。 ```css /* 深色模式 (默认) */ :root { color-scheme: dark; /* * 1. 文字体系 (Typography) - Zinc 色系 * 分为主要、常规、次要、极弱、占位符 5 个等级 */ --text-primary: #fafafc; /* 主要文字 (标题, 重要信息) - Zinc-50 */ --text-regular: #e4e4e7; /* 常规文字 (正文, 默认文本) - Zinc-200 */ --text-secondary: #a1a1aa; /* 次要文字 (说明, 辅助信息) - Zinc-400 */ --text-tertiary: #71717a; /* 极弱文字 (弱化信息) - Zinc-500 */ --text-placeholder: #71717a; /* 占位符/禁用文字 - Zinc-500 */ /* * 2. 边框体系 (Borders) - Zinc 色系 * 分为深色、基础、浅色、极浅 4 个等级 */ --border-dark: #52525b; /* 深色边框 (强调, 选中) - Zinc-600 */ --border-base: #3f3f46; /* 基础边框 (默认) - Zinc-700 */ --border-light: #27272a; /* 浅色边框 (分割线, 卡片) - Zinc-800 */ --border-lighter: #18181b; /* 极浅边框 (极弱分割) - Zinc-900 */ /* * 3. 背景体系 (Backgrounds & Fills) - Zinc 色系 */ /* 页面级背景 */ --bg-page: #09090b; /* 页面背景 (最底层) - Zinc-950 */ --bg-overlay: #18181b; /* 浮层背景 (对话框, 下拉菜单) - Zinc-900 */ --bg-element: #18181b; /* 元素背景 (卡片, 面板) - Zinc-900 */ /* 填充色 (用于交互元素背景) */ --fill-default: #27272a; /* 默认填充 (Tag, Badge) - Zinc-800 */ --fill-darker: #121214; /* 深色填充 (Input 内部) */ --fill-lighter: #3f3f46; /* 浅色填充 (悬停状态) - Zinc-700 */ --fill-tertiary: #18181b; /* 第三级填充 - Zinc-900 */ /* * 4. 品牌色 (Primary/Brand) - 星际蓝 */ --primary: #3b82f6; /* 品牌主色 - Blue-500 */ --primary-foreground: #ffffff; /* 品牌色前景 (文字) */ --primary-hover: #2563eb; /* 品牌色悬停 - Blue-600 */ --primary-active: #1d4ed8; /* 品牌色激活 - Blue-700 */ /* * 5. 功能色 (Functional) */ --success: #22c55e; /* 成功 - Green-500 */ --warning: #f59e0b; /* 警告 - Amber-500 */ --error: #ef4444; /* 错误/破坏性操作 - Red-500 */ --info: #3b82f6; /* 信息 - Blue-500 */ --destructive: #7f1d1d; /* 破坏性操作背景 - Red-900 */ --destructive-foreground: #fef2f2; /* 破坏性操作文字 - Red-50 */ /* * 6. 组件专用 (Components) * 针对常用组件的特定定义,提高自由度 */ /* 输入框 */ --input-bg: var(--fill-darker); --input-bg-hover: var(--fill-default); --input-border: var(--border-light); --input-border-hover: var(--border-dark); --input-text: var(--text-regular); --input-placeholder: var(--text-placeholder); /* * 7. Jointo - 轨道专用色 */ --track-storyboard: #60a5fa; /* 分镜轨道 - Blue-400 */ --track-resource: #a78bfa; /* 资源轨道 - Violet-400 */ --track-video: #34d399; /* 视频轨道 - Emerald-400 */ --track-sound: #fbbf24; /* 音频轨道 - Amber-400 */ --track-subtitle: #f87171; /* 字幕轨道 - Red-400 */ --track-voice: #22d3ee; /* 配音轨道 - Cyan-400 */ /* 其他变量 */ --radius-sm: 0.125rem; /* 2px */ --radius: 0.5rem; /* 8px */ --radius-md: 0.375rem; /* 6px */ --radius-lg: 0.5rem; /* 8px */ --radius-xl: 0.75rem; /* 12px */ } /* 亮色模式 */ .light { color-scheme: light; /* 1. 文字体系 */ --text-primary: #09090b; /* Zinc-950 */ --text-regular: #18181b; /* Zinc-900 */ --text-secondary: #71717a; /* Zinc-500 */ --text-tertiary: #a1a1aa; /* Zinc-400 */ --text-placeholder: #a1a1aa; /* Zinc-400 */ /* 2. 边框体系 */ --border-dark: #a1a1aa; /* Zinc-400 */ --border-base: #e4e4e7; /* Zinc-200 */ --border-light: #f4f4f5; /* Zinc-100 */ --border-lighter: #fafafa; /* Zinc-50 */ /* 3. 背景体系 */ --bg-page: #f4f4f5; /* Zinc-100 */ --bg-overlay: #ffffff; /* White */ --bg-element: #ffffff; /* White */ --fill-default: #f4f4f5; /* Zinc-100 */ --fill-darker: #fafafa; /* Zinc-50 */ --fill-lighter: #e4e4e7; /* Zinc-200 */ --fill-tertiary: #fafafa; /* Zinc-50 */ /* 4. 品牌色 */ --primary: #2563eb; /* Blue-600 */ --primary-foreground: #ffffff; --primary-hover: #1d4ed8; /* Blue-700 */ --primary-active: #1e40af; /* Blue-800 */ /* 5. 功能色 */ --destructive: #ef4444; /* Red-500 */ --destructive-foreground: #ffffff; /* 6. 组件专用 */ --input-bg: var(--fill-darker); --input-bg-hover: var(--bg-overlay); --input-border: var(--border-base); --input-border-hover: var(--border-dark); --input-text: var(--text-regular); --input-placeholder: var(--text-placeholder); } ``` ### 2.3 工具类映射 (Tailwind CSS) 项目使用 **Tailwind v4** 的 `@theme` 语法,CSS 变量通过 `--color-*` 前缀自动映射为工具类。 #### 自动映射规则 ```css /* globals.css 中的映射定义 */ @theme { --color-text-primary: var(--text-primary); --color-bg-page: var(--bg-page); --color-border-base: var(--border-base); --color-primary: var(--primary); /* ... 其他映射 */ } ``` #### 可用工具类 **文字颜色**: - `text-text-primary` - 主要文字 - `text-text-regular` - 常规文字 - `text-text-secondary` - 次要文字 - `text-text-tertiary` - 极弱文字 - `text-text-placeholder` - 占位符 **背景颜色**: - `bg-bg-page` - 页面背景 - `bg-bg-overlay` - 浮层背景 - `bg-bg-element` - 元素背景 - `bg-fill-default` - 默认填充 - `bg-fill-darker` - 深色填充 - `bg-fill-lighter` - 浅色填充 **边框颜色**: - `border-border-dark` - 深色边框 - `border-border-base` - 基础边框 - `border-border-light` - 浅色边框 - `border-border-lighter` - 极浅边框 **品牌色**: - `text-primary` / `bg-primary` - 品牌主色 - `text-brand-default` / `bg-brand-default` - 品牌色别名 **功能色**: - `text-success` / `bg-success` - 成功 - `text-warning` / `bg-warning` - 警告 - `text-error` / `bg-error` - 错误 - `text-info` / `bg-info` - 信息 #### 实际使用示例 ```tsx // 页面容器
{/* 卡片 */}
{/* 标题 */}

项目标题

{/* 描述 */}

项目描述信息

{/* 主要按钮 */} {/* 次要按钮 */}
``` --- ## 3. 字体系统 ### 3.1 字体家族 ```css :root { /* 主字体 - 中英文混排 */ --font-family-sans: "Inter", "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif; /* 等宽字体 - 代码、时间码 */ --font-family-mono: "JetBrains Mono", "Fira Code", "SF Mono", Monaco, monospace; } ``` ### 3.2 字体大小 ```css :root { /* 字体大小 */ --font-size-xs: 0.75rem; /* 12px - 辅助文字 */ --font-size-sm: 0.875rem; /* 14px - 次要文字、标签 */ --font-size-base: 1rem; /* 16px - 正文 */ --font-size-lg: 1.125rem; /* 18px - 小标题 */ --font-size-xl: 1.25rem; /* 20px - 标题 */ --font-size-2xl: 1.5rem; /* 24px - 大标题 */ --font-size-3xl: 1.875rem; /* 30px - 页面标题 */ } ``` ### 3.3 字重 ```css :root { --font-weight-normal: 400; /* 正常 */ --font-weight-medium: 500; /* 中等 */ --font-weight-semibold: 600; /* 半粗 */ --font-weight-bold: 700; /* 粗体 */ } ``` ### 3.4 行高 ```css :root { --line-height-tight: 1.25; /* 紧凑 - 标题 */ --line-height-normal: 1.5; /* 正常 - 正文 */ --line-height-relaxed: 1.75; /* 宽松 - 段落 */ } ``` ### 3.5 字体使用规范 | 用途 | 大小 | 字重 | 行高 | 颜色 | | -------- | ---- | ---- | ---- | ------------------- | | 页面标题 | 24px | 600 | 1.25 | text-primary | | 区域标题 | 18px | 600 | 1.25 | text-primary | | 卡片标题 | 16px | 500 | 1.5 | text-primary | | 正文内容 | 14px | 400 | 1.5 | text-primary | | 辅助说明 | 14px | 400 | 1.5 | text-secondary | | 标签文字 | 12px | 500 | 1.25 | text-secondary | | 时间码 | 14px | 500 | 1 | text-primary (mono) | | 按钮文字 | 14px | 500 | 1 | text-primary | --- ## 4. 间距系统 ### 4.1 基础间距单位 基础单位:`4px`,所有间距为基础单位的倍数。 ```css :root { --spacing-0: 0; --spacing-0.5: 0.125rem; /* 2px */ --spacing-1: 0.25rem; /* 4px */ --spacing-1.5: 0.375rem; /* 6px */ --spacing-2: 0.5rem; /* 8px */ --spacing-2.5: 0.625rem; /* 10px */ --spacing-3: 0.75rem; /* 12px */ --spacing-3.5: 0.875rem; /* 14px */ --spacing-4: 1rem; /* 16px */ --spacing-5: 1.25rem; /* 20px */ --spacing-6: 1.5rem; /* 24px */ --spacing-7: 1.75rem; /* 28px */ --spacing-8: 2rem; /* 32px */ --spacing-9: 2.25rem; /* 36px */ --spacing-10: 2.5rem; /* 40px */ --spacing-12: 3rem; /* 48px */ --spacing-16: 4rem; /* 64px */ --spacing-20: 5rem; /* 80px */ } ``` ### 4.2 组件内边距 | 组件类型 | 水平内边距 | 垂直内边距 | | ------------ | ---------- | ---------- | | 按钮(小) | 12px | 6px | | 按钮(默认) | 16px | 8px | | 按钮(大) | 24px | 12px | | 输入框 | 12px | 8px | | 卡片 | 16px | 16px | | 面板 | 16px | 12px | | 弹窗内容 | 24px | 20px | | Tab 项 | 16px | 8px | ### 4.3 组件间距 | 场景 | 间距 | | ---------- | ---- | | 相关元素间 | 8px | | 组间 | 16px | | 区块间 | 24px | | 面板与内容 | 16px | | 列表项间 | 8px | | 按钮组间 | 8px | --- ## 5. 圆角系统 ```css :root { --radius-none: 0; --radius-sm: 0.125rem; /* 2px - 小标签 */ --radius-default: 0.25rem; /* 4px - 按钮、输入框 */ --radius-md: 0.375rem; /* 6px - 卡片 */ --radius-lg: 0.5rem; /* 8px - 面板 */ --radius-xl: 0.75rem; /* 12px - 弹窗 */ --radius-2xl: 1rem; /* 16px - 大弹窗 */ --radius-full: 9999px; /* 圆形 - 头像、徽章 */ } ``` ### 5.1 组件圆角规范 | 组件 | 圆角 | | -------- | ---- | | 按钮 | 4px | | 输入框 | 4px | | 标签 | 2px | | 卡片 | 6px | | 面板 | 8px | | 弹窗 | 12px | | 头像 | 圆形 | | 分镜看板块 | 4px | | 缩略图 | 4px | --- ## 6. 阴影系统 ```css :root { /* 阴影 - 深色主题专用 */ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3); --shadow-default: 0 1px 3px 0 rgb(0 0 0 / 0.4), 0 1px 2px -1px rgb(0 0 0 / 0.4); --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.4); --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.4); --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.4), 0 8px 10px -6px rgb(0 0 0 / 0.4); /* 焦点环 */ --shadow-focus: 0 0 0 2px var(--color-bg-primary), 0 0 0 4px var(--color-primary); } ``` ### 6.1 组件阴影规范 | 组件/场景 | 阴影 | | --------- | ------------ | | 默认状态 | 无 | | 卡片悬停 | shadow-sm | | 下拉菜单 | shadow-md | | 弹窗 | shadow-lg | | 抽屉 | shadow-xl | | 焦点状态 | shadow-focus | --- ## 7. 交互状态 ### 7.1 按钮状态 ```css /* 主要按钮 */ .btn-primary { /* 默认状态 */ background: var(--color-primary); color: white; /* 悬停状态 */ &:hover { background: var(--color-primary-hover); } /* 激活状态 */ &:active { background: var(--color-primary-active); } /* 禁用状态 */ &:disabled { background: var(--color-bg-tertiary); color: var(--color-text-disabled); cursor: not-allowed; } /* 加载状态 */ &.loading { pointer-events: none; opacity: 0.7; } } /* 次要按钮 */ .btn-secondary { background: var(--color-bg-secondary); color: var(--color-text-primary); border: 1px solid var(--color-border-default); &:hover { background: var(--color-bg-tertiary); border-color: var(--color-border-hover); } } /* 幽灵按钮 */ .btn-ghost { background: transparent; color: var(--color-text-secondary); &:hover { background: var(--color-bg-tertiary); color: var(--color-text-primary); } } ``` ### 7.2 输入框状态 ```css .input { /* 默认状态 */ background: var(--color-bg-secondary); border: 1px solid var(--color-border-default); color: var(--color-text-primary); /* 占位符 */ &::placeholder { color: var(--color-text-tertiary); } /* 悬停状态 */ &:hover { border-color: var(--color-border-hover); } /* 焦点状态 */ &:focus { border-color: var(--color-border-focus); outline: none; box-shadow: var(--shadow-focus); } /* 错误状态 */ &.error { border-color: var(--color-error); } /* 禁用状态 */ &:disabled { background: var(--color-bg-tertiary); color: var(--color-text-disabled); cursor: not-allowed; } } ``` ### 7.3 选中状态 ```css /* 分镜选中 */ .storyboard-item { &.selected { background: var(--color-bg-tertiary); border-left: 3px solid var(--color-primary); } } /* Tab 选中 */ .tab-item { &.active { color: var(--color-primary); border-bottom: 2px solid var(--color-primary); } } /* 列表项选中 */ .list-item { &.selected { background: var(--color-primary); background-opacity: 0.1; color: var(--color-primary); } } /* 分镜看板块选中 */ .timeline-block { &.selected { outline: 2px solid var(--color-primary); outline-offset: 1px; } } ``` --- ## 8. 动画与过渡 ### 8.1 过渡时间 ```css :root { --duration-instant: 0ms; --duration-fast: 100ms; --duration-normal: 200ms; --duration-slow: 300ms; --duration-slower: 500ms; } ``` ### 8.2 缓动函数 ```css :root { --ease-linear: linear; --ease-in: cubic-bezier(0.4, 0, 1, 1); --ease-out: cubic-bezier(0, 0, 0.2, 1); --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); --ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1); } ``` ### 8.3 常用过渡 ```css /* 颜色过渡 - 按钮、链接 */ .transition-colors { transition: background-color var(--duration-fast) var(--ease-in-out), border-color var(--duration-fast) var(--ease-in-out), color var(--duration-fast) var(--ease-in-out); } /* 透明度过渡 - 显示/隐藏 */ .transition-opacity { transition: opacity var(--duration-normal) var(--ease-in-out); } /* 变换过渡 - 缩放、移动 */ .transition-transform { transition: transform var(--duration-normal) var(--ease-out); } /* 全部过渡 */ .transition-all { transition: all var(--duration-normal) var(--ease-in-out); } ``` ### 8.4 动画效果 ```css /* 淡入 */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* 淡出 */ @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } /* 向上滑入 */ @keyframes slideInUp { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } /* 向下滑入 */ @keyframes slideInDown { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } /* 缩放进入 */ @keyframes scaleIn { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } /* 旋转加载 */ @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* 脉冲效果 */ @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } ``` ### 8.5 动画使用场景 | 场景 | 动画 | 时长 | | ------------ | ------------------ | ------------- | | 弹窗打开 | scaleIn + fadeIn | 200ms | | 弹窗关闭 | scaleOut + fadeOut | 150ms | | 下拉菜单打开 | slideInDown | 200ms | | Toast 出现 | slideInUp | 300ms | | 按钮点击 | scale(0.98) | 100ms | | 加载中 | spin | 1000ms (循环) | | 骨架屏 | pulse | 2000ms (循环) | --- ## 9. 响应式设计 ### 9.1 断点设置 ```css :root { --breakpoint-sm: 640px; --breakpoint-md: 768px; --breakpoint-lg: 1024px; --breakpoint-xl: 1280px; --breakpoint-2xl: 1536px; } ``` ### 9.2 Tailwind 配置 项目使用 **Tailwind v4**,配置通过 `@theme` 指令在 `globals.css` 中定义,无需单独的 `tailwind.config.js` 文件。 ```css /* client/src/styles/globals.css */ @theme { /* 断点配置 (Tailwind v4 默认值) */ --breakpoint-sm: 640px; --breakpoint-md: 768px; --breakpoint-lg: 1024px; --breakpoint-xl: 1280px; --breakpoint-2xl: 1536px; /* 颜色映射 */ --color-text-primary: var(--text-primary); --color-bg-page: var(--bg-page); /* ... */ } ``` **使用方式**: ```tsx
响应式布局
``` ### 9.3 布局适配策略 | 屏幕尺寸 | 断点 | 布局策略 | | ------------ | ------- | ------------------------------ | | 超大屏 | ≥1536px | 完整布局,所有面板展开 | | 大屏(默认) | ≥1280px | 完整布局 | | 中屏 | ≥1024px | 侧边栏可折叠 | | 小屏 | ≥768px | 侧边栏默认收起,可展开覆盖 | | 移动端 | <768px | 单列布局,面板切换(可选实现) | ### 9.4 面板宽度 ```css :root { /* 侧边栏宽度 */ --sidebar-width-collapsed: 60px; --sidebar-width-expanded: 280px; /* 右侧面板宽度 */ --right-panel-width: 320px; /* 分镜看板高度 */ --timeline-height-collapsed: 48px; --timeline-height-expanded: 300px; } ``` --- ## 10. 可访问性 ### 10.1 颜色对比度 - **文字对比度**:主文字与背景对比度 ≥ 4.5:1(WCAG AA 级) - **大文字对比度**:标题与背景对比度 ≥ 3:1 - **交互元素**:与背景对比度 ≥ 3:1 ### 10.2 焦点指示器 ```css /* 焦点可见性 */ *:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; } /* 鼠标操作隐藏焦点环 */ *:focus:not(:focus-visible) { outline: none; } ``` ### 10.3 键盘导航 | 按键 | 功能 | | ----------------- | ------------------ | | `Tab` | 在可交互元素间前进 | | `Shift + Tab` | 在可交互元素间后退 | | `Enter` / `Space` | 激活按钮、链接 | | `Esc` | 关闭弹窗、取消操作 | | `↑` / `↓` | 列表项导航 | | `←` / `→` | Tab 切换、滑块调节 | ### 10.4 ARIA 标签规范 ```html
...
保存成功

新建项目

``` ### 10.5 屏幕阅读器友好 - 所有图片提供 `alt` 文本 - 表单元素关联 `label` - 隐藏装饰性元素:`aria-hidden="true"` - 使用语义化 HTML 标签 --- ## 11. 图标规范 ### 11.1 图标库 使用 **lucide-react** 图标库,与 shadcn/ui 配套。 ```bash npm install lucide-react ``` ### 11.2 图标尺寸 ```css :root { --icon-xs: 12px; --icon-sm: 16px; --icon-md: 20px; --icon-lg: 24px; --icon-xl: 32px; } ``` ### 11.3 图标使用规范 | 场景 | 尺寸 | strokeWidth | | ------------ | ---- | ----------- | | 按钮内图标 | 16px | 2 | | 菜单项图标 | 16px | 2 | | 标签内图标 | 14px | 2 | | 工具栏图标 | 20px | 2 | | 面板头部图标 | 20px | 2 | | 空状态图标 | 48px | 1.5 | ### 11.4 常用图标映射 | 功能 | 图标名称 | | ------- | ---------------- | | 新建 | `Plus` | | 删除 | `Trash2` | | 编辑 | `Pencil` | | 搜索 | `Search` | | 设置 | `Settings` | | 关闭 | `X` | | 返回 | `ArrowLeft` | | 更多 | `MoreHorizontal` | | 播放 | `Play` | | 暂停 | `Pause` | | 上一帧 | `SkipBack` | | 下一帧 | `SkipForward` | | 放大 | `ZoomIn` | | 缩小 | `ZoomOut` | | 导出 | `Download` | | 上传 | `Upload` | | 文件夹 | `Folder` | | 文件 | `File` | | 用户 | `User` | | 通知 | `Bell` | | AI/魔法 | `Sparkles` | --- ## 12. 组件样式规范 ### 12.1 按钮组件 ```tsx // 按钮变体 type ButtonVariant = "primary" | "secondary" | "ghost" | "destructive" | "link"; // 按钮大小 type ButtonSize = "sm" | "default" | "lg" | "icon"; // 样式规范 const buttonStyles = { // 大小 sm: "h-8 px-3 text-xs", default: "h-9 px-4 text-sm", lg: "h-10 px-6 text-base", icon: "h-9 w-9", // 变体 primary: "bg-primary text-white hover:bg-primary-hover", secondary: "bg-background-secondary border border-border hover:bg-background-tertiary", ghost: "hover:bg-background-tertiary", destructive: "bg-error text-white hover:bg-error/90", link: "text-primary underline-offset-4 hover:underline", }; ``` ### 12.2 卡片组件 ```tsx // 卡片样式 const cardStyles = { base: ` bg-background-secondary rounded-md border border-border `, hover: ` hover:border-border-hover hover:shadow-sm transition-all `, selected: ` border-primary bg-primary/5 `, }; ``` ### 12.3 面板组件 ```tsx // 面板样式 const panelStyles = { header: ` flex items-center justify-between px-4 py-3 border-b border-border `, content: ` p-4 overflow-auto `, footer: ` flex items-center justify-end gap-2 px-4 py-3 border-t border-border `, }; ``` ### 12.4 弹窗组件 ```tsx // 弹窗样式 const dialogStyles = { overlay: ` fixed inset-0 bg-black/80 backdrop-blur-sm `, content: ` fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 bg-background-secondary rounded-xl border border-border shadow-xl max-h-[85vh] overflow-hidden `, sizes: { sm: "w-[400px]", md: "w-[500px]", lg: "w-[600px]", xl: "w-[800px]", full: "w-[90vw] max-w-[1200px]", }, }; ``` --- ## 附录 ### A. CSS 变量完整清单 所有 CSS 变量应在 `globals.css` 中定义: ```css @tailwind base; @tailwind components; @tailwind utilities; @layer base { :root { /* 在此定义所有 CSS 变量 */ } } ``` ### B. 设计稿参考 - **Figma 文件**:`https://www.figma.com/make/xgPuMR3GZzHpYh0RZJdiYK/kaidong.ai` - **密码**:`0592` ### C. 变更记录 - **v1.0** (2025-01-08):初始版本,从 PRD 文档中拆分 --- **文档结束** > 本文档定义Jointo产品的视觉设计规范,所有前端开发应遵循本规范确保界面一致性。