--- name: AI Foundation Design System license: CC-BY-4.0 description: Enterprise AI foundation design system built on Ant Design conventions, optimized for model, knowledge, agent, workflow, evaluation, observability, and governance products. colors: primary: '#0958D9' primary-hover: '#1265E0' primary-active: '#003EB3' success: '#389E0D' success-text: '#237804' warning: '#D46B08' warning-text: '#AD5A00' error: '#CF1322' error-hover: '#A8071A' info: '#0958D9' surface: '#FFFFFF' surface-container: '#FAFAFA' surface-layout: '#F5F5F5' surface-elevated: '#FFFFFF' on-surface: 'rgba(0, 0, 0, 0.88)' on-surface-variant: 'rgba(0, 0, 0, 0.65)' on-surface-tertiary: 'rgba(0, 0, 0, 0.58)' on-surface-disabled: 'rgba(0, 0, 0, 0.25)' outline: '#D9D9D9' outline-control: '#8C8C8C' outline-variant: '#F0F0F0' ai-accent: '#531DAB' ai-accent-container: '#F9F0FF' knowledge-accent: '#006D75' knowledge-container: '#E6FFFB' tool-accent: '#AD4E00' tool-container: '#FFF7E6' risk-container: '#FFF1F0' on-primary: '#FFFFFF' focus-ring: '#1677FF' chart-1: '#0072B2' chart-2: '#B3261E' chart-3: '#5C4BC4' chart-4: '#B0487F' chart-5: '#8A6D00' chart-6: '#007A5E' chart-7: '#D55E00' chart-8: '#5A5A5A' scrim: 'rgba(0, 0, 0, 0.45)' overlay-edge: 'rgba(0, 0, 0, 0.08)' shadow-color: 'rgba(0, 0, 0, 0.15)' dark-primary: '#4096FF' dark-primary-hover: '#69B1FF' dark-primary-active: '#2B85F5' dark-success: '#73D13D' dark-success-text: '#95DE64' dark-warning: '#FFA940' dark-warning-text: '#FFC069' dark-error: '#FF7875' dark-error-hover: '#FFA39E' dark-info: '#4096FF' dark-surface: '#141414' dark-surface-container: '#1F1F1F' dark-surface-layout: '#0D0D0D' dark-surface-elevated: '#262626' dark-on-surface: 'rgba(255, 255, 255, 0.88)' dark-on-surface-variant: 'rgba(255, 255, 255, 0.68)' dark-on-surface-tertiary: 'rgba(255, 255, 255, 0.58)' dark-on-surface-disabled: 'rgba(255, 255, 255, 0.30)' dark-outline: '#424242' dark-outline-control: '#8C8C8C' dark-outline-variant: '#303030' dark-ai-accent: '#B37FEB' dark-ai-accent-container: '#22123A' dark-knowledge-accent: '#5CDBD3' dark-knowledge-container: '#0A2A2C' dark-tool-accent: '#FFB761' dark-tool-container: '#2B1D0A' dark-risk-container: '#2A1215' dark-on-primary: '#0A0A0A' dark-focus-ring: '#69B1FF' dark-scrim: 'rgba(0, 0, 0, 0.65)' dark-overlay-edge: 'rgba(255, 255, 255, 0.16)' dark-shadow-color: 'rgba(0, 0, 0, 0.60)' dark-chart-1: '#56B4E9' dark-chart-2: '#FF8A80' dark-chart-3: '#9C8CFF' dark-chart-4: '#E58BC0' dark-chart-5: '#F0E442' dark-chart-6: '#2DC9A0' dark-chart-7: '#E69F00' dark-chart-8: '#BDBDBD' typography: display-lg: fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" fontSize: 38px fontWeight: '600' lineHeight: 46px headline-lg: fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" fontSize: 30px fontWeight: '600' lineHeight: 38px headline-md: fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" fontSize: 24px fontWeight: '600' lineHeight: 32px headline-sm: fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" fontSize: 20px fontWeight: '600' lineHeight: 28px title-lg: fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" fontSize: 16px fontWeight: '600' lineHeight: 24px title-md: fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" fontSize: 14px fontWeight: '600' lineHeight: 22px body-lg: fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" fontSize: 16px fontWeight: '400' lineHeight: 24px body-md: fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" fontSize: 14px fontWeight: '400' lineHeight: 22px body-sm: fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" fontSize: 12px fontWeight: '400' lineHeight: 20px code: fontFamily: "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace" fontSize: 13px fontWeight: '400' lineHeight: 20px rounded: none: 0px sm: 2px md: 4px DEFAULT: 6px lg: 8px xl: 16px full: 9999px spacing: unit: 4px xs: 4px sm: 8px md: 12px lg: 16px xl: 24px xxl: 32px section: 40px control-height: 32px control-height-lg: 40px focus-ring-width: 2px components: button-primary: backgroundColor: '{colors.primary}' textColor: '{colors.on-primary}' typography: '{typography.body-md}' rounded: '{rounded.DEFAULT}' height: 32px padding: 0 16px button-primary-hover: backgroundColor: '{colors.primary-hover}' button-primary-active: backgroundColor: '{colors.primary-active}' button-default: backgroundColor: '{colors.surface}' textColor: '{colors.on-surface}' typography: '{typography.body-md}' rounded: '{rounded.DEFAULT}' height: 32px padding: 0 16px input-field: backgroundColor: '{colors.surface}' textColor: '{colors.on-surface}' typography: '{typography.body-md}' rounded: '{rounded.DEFAULT}' height: 32px padding: 4px 12px select-field: backgroundColor: '{colors.surface}' textColor: '{colors.on-surface}' typography: '{typography.body-md}' rounded: '{rounded.DEFAULT}' height: 32px padding: 0 12px card: backgroundColor: '{colors.surface}' textColor: '{colors.on-surface}' rounded: '{rounded.lg}' padding: 24px modal: backgroundColor: '{colors.surface-elevated}' textColor: '{colors.on-surface}' rounded: '{rounded.lg}' padding: 20px 24px table-header: backgroundColor: '{colors.surface-container}' textColor: '{colors.on-surface}' typography: '{typography.title-md}' padding: 12px 16px tag: backgroundColor: '{colors.surface-container}' textColor: '{colors.on-surface-variant}' typography: '{typography.body-sm}' rounded: '{rounded.md}' padding: 0 8px prompt-editor: backgroundColor: '{colors.surface}' textColor: '{colors.on-surface}' typography: '{typography.code}' rounded: '{rounded.DEFAULT}' padding: 12px ai-output: backgroundColor: '{colors.ai-accent-container}' textColor: '{colors.on-surface}' typography: '{typography.body-md}' rounded: '{rounded.lg}' padding: 16px knowledge-source: backgroundColor: '{colors.knowledge-container}' textColor: '{colors.on-surface}' typography: '{typography.body-sm}' rounded: '{rounded.md}' padding: 8px 12px tool-call: backgroundColor: '{colors.tool-container}' textColor: '{colors.on-surface}' typography: '{typography.code}' rounded: '{rounded.DEFAULT}' padding: 12px execution-step: backgroundColor: '{colors.surface-container}' textColor: '{colors.on-surface}' typography: '{typography.body-md}' rounded: '{rounded.DEFAULT}' padding: 12px 16px approval-gate: backgroundColor: '{colors.risk-container}' textColor: '{colors.on-surface}' typography: '{typography.body-md}' rounded: '{rounded.lg}' padding: 16px app-shell: backgroundColor: '{colors.surface-layout}' textColor: '{colors.on-surface}' typography: '{typography.body-md}' metadata: backgroundColor: '{colors.surface}' textColor: '{colors.on-surface-tertiary}' typography: '{typography.body-sm}' input-disabled: backgroundColor: '{colors.surface-container}' textColor: '{colors.on-surface-disabled}' typography: '{typography.body-md}' rounded: '{rounded.DEFAULT}' height: 32px padding: 4px 12px alert-success: backgroundColor: '{colors.surface}' textColor: '{colors.on-surface}' typography: '{typography.body-md}' rounded: '{rounded.lg}' padding: 8px 12px alert-warning: backgroundColor: '{colors.surface}' textColor: '{colors.on-surface}' typography: '{typography.body-md}' rounded: '{rounded.lg}' padding: 8px 12px alert-info: backgroundColor: '{colors.surface}' textColor: '{colors.info}' typography: '{typography.body-md}' rounded: '{rounded.lg}' padding: 8px 12px knowledge-tag: backgroundColor: '{colors.knowledge-container}' textColor: '{colors.knowledge-accent}' typography: '{typography.body-sm}' rounded: '{rounded.md}' padding: 0 8px tool-tag: backgroundColor: '{colors.tool-container}' textColor: '{colors.tool-accent}' typography: '{typography.body-sm}' rounded: '{rounded.md}' padding: 0 8px badge-status-success: backgroundColor: '{colors.success}' rounded: '{rounded.full}' width: 6px height: 6px badge-status-warning: backgroundColor: '{colors.warning}' rounded: '{rounded.full}' width: 6px height: 6px input-border: backgroundColor: '{colors.outline-control}' height: 1px status-text-success: backgroundColor: '{colors.surface}' textColor: '{colors.success-text}' typography: '{typography.body-md}' status-text-warning: backgroundColor: '{colors.surface}' textColor: '{colors.warning-text}' typography: '{typography.body-md}' button-danger: backgroundColor: '{colors.error}' textColor: '{colors.on-primary}' typography: '{typography.body-md}' rounded: '{rounded.DEFAULT}' height: 32px padding: 0 16px button-danger-hover: backgroundColor: '{colors.error-hover}' textColor: '{colors.on-primary}' button-danger-disabled: backgroundColor: '{colors.surface-container}' textColor: '{colors.on-surface-disabled}' button-disabled: backgroundColor: '{colors.surface-container}' textColor: '{colors.on-surface-disabled}' typography: '{typography.body-md}' rounded: '{rounded.DEFAULT}' height: 32px padding: 0 16px focus-ring: backgroundColor: '{colors.focus-ring}' height: '{spacing.focus-ring-width}' input-border-hover: backgroundColor: '{colors.primary-hover}' height: 1px input-border-focus: backgroundColor: '{colors.primary}' height: '{spacing.focus-ring-width}' input-border-error: backgroundColor: '{colors.error}' height: 1px alert-error: backgroundColor: '{colors.risk-container}' textColor: '{colors.on-surface}' typography: '{typography.body-md}' rounded: '{rounded.lg}' padding: 8px 12px badge-status-error: backgroundColor: '{colors.error}' rounded: '{rounded.full}' width: 6px height: 6px dark-app-shell: backgroundColor: '{colors.dark-surface-layout}' textColor: '{colors.dark-on-surface}' dark-card: backgroundColor: '{colors.dark-surface}' textColor: '{colors.dark-on-surface}' dark-modal: backgroundColor: '{colors.dark-surface-elevated}' textColor: '{colors.dark-on-surface}' dark-table-header: backgroundColor: '{colors.dark-surface-container}' textColor: '{colors.dark-on-surface}' dark-tag: backgroundColor: '{colors.dark-surface-container}' textColor: '{colors.dark-on-surface-variant}' dark-metadata: backgroundColor: '{colors.dark-surface}' textColor: '{colors.dark-on-surface-tertiary}' dark-input-disabled: backgroundColor: '{colors.dark-surface-container}' textColor: '{colors.dark-on-surface-disabled}' dark-button-primary: backgroundColor: '{colors.dark-primary}' textColor: '{colors.dark-on-primary}' dark-button-primary-hover: backgroundColor: '{colors.dark-primary-hover}' textColor: '{colors.dark-on-primary}' dark-button-primary-active: backgroundColor: '{colors.dark-primary-active}' textColor: '{colors.dark-on-primary}' dark-button-danger: backgroundColor: '{colors.dark-error}' textColor: '{colors.dark-on-primary}' dark-button-danger-hover: backgroundColor: '{colors.dark-error-hover}' textColor: '{colors.dark-on-primary}' dark-input-border: backgroundColor: '{colors.dark-outline-control}' height: 1px dark-divider: backgroundColor: '{colors.dark-outline}' height: 1px dark-divider-subtle: backgroundColor: '{colors.dark-outline-variant}' height: 1px dark-focus-ring: backgroundColor: '{colors.dark-focus-ring}' height: 2px dark-badge-success: backgroundColor: '{colors.dark-success}' height: 6px dark-badge-warning: backgroundColor: '{colors.dark-warning}' height: 6px dark-alert-info: backgroundColor: '{colors.dark-surface}' textColor: '{colors.dark-info}' dark-status-text-success: backgroundColor: '{colors.dark-surface}' textColor: '{colors.dark-success-text}' dark-status-text-warning: backgroundColor: '{colors.dark-surface}' textColor: '{colors.dark-warning-text}' dark-ai-output: backgroundColor: '{colors.dark-ai-accent-container}' textColor: '{colors.dark-on-surface}' dark-ai-tag: backgroundColor: '{colors.dark-ai-accent-container}' textColor: '{colors.dark-ai-accent}' dark-knowledge-source: backgroundColor: '{colors.dark-knowledge-container}' textColor: '{colors.dark-on-surface}' dark-knowledge-tag: backgroundColor: '{colors.dark-knowledge-container}' textColor: '{colors.dark-knowledge-accent}' dark-tool-call: backgroundColor: '{colors.dark-tool-container}' textColor: '{colors.dark-on-surface}' dark-tool-tag: backgroundColor: '{colors.dark-tool-container}' textColor: '{colors.dark-tool-accent}' dark-approval-gate: backgroundColor: '{colors.dark-risk-container}' textColor: '{colors.dark-on-surface}' scrim: backgroundColor: '{colors.scrim}' overlay-border: backgroundColor: '{colors.overlay-edge}' height: 1px popover-shadow: backgroundColor: '{colors.shadow-color}' dark-scrim: backgroundColor: '{colors.dark-scrim}' dark-overlay-border: backgroundColor: '{colors.dark-overlay-edge}' height: 1px dark-popover-shadow: backgroundColor: '{colors.dark-shadow-color}' chart-series-1: backgroundColor: '{colors.chart-1}' height: 8px chart-series-2: backgroundColor: '{colors.chart-2}' height: 8px chart-series-3: backgroundColor: '{colors.chart-3}' height: 8px chart-series-4: backgroundColor: '{colors.chart-4}' height: 8px chart-series-5: backgroundColor: '{colors.chart-5}' height: 8px chart-series-6: backgroundColor: '{colors.chart-6}' height: 8px chart-series-7: backgroundColor: '{colors.chart-7}' height: 8px chart-series-8: backgroundColor: '{colors.chart-8}' height: 8px dark-chart-series-1: backgroundColor: '{colors.dark-chart-1}' height: 8px dark-chart-series-2: backgroundColor: '{colors.dark-chart-2}' height: 8px dark-chart-series-3: backgroundColor: '{colors.dark-chart-3}' height: 8px dark-chart-series-4: backgroundColor: '{colors.dark-chart-4}' height: 8px dark-chart-series-5: backgroundColor: '{colors.dark-chart-5}' height: 8px dark-chart-series-6: backgroundColor: '{colors.dark-chart-6}' height: 8px dark-chart-series-7: backgroundColor: '{colors.dark-chart-7}' height: 8px dark-chart-series-8: backgroundColor: '{colors.dark-chart-8}' height: 8px --- # AI 基座设计规范 ## Overview 本文件是 AI 基座产品的设计与实现契约,同时服务于设计师、产品经理、工程师和 AI Coding Agent。机器可读 Token 是视觉实现的规范值,Markdown 正文解释为什么使用这些值、何时使用以及如何验收。 设计基线参考 Ant Design 的企业级产品方法,但不照搬品牌外观。AI 基座在其基础上增加透明、可控、可追溯和安全默认四项约束。 决策优先级如下: 1. Certain:状态、环境、版本和下一步明确。 2. Controllable:用户可以审阅、停止、重试、批准或回滚关键 AI 行为。 3. Traceable:输入、配置、模型、数据、工具、输出和操作者可追溯。 4. Natural:遵循成熟企业软件认知,不创造无必要的新交互。 5. Meaningful:视觉强调只服务于任务、风险和决策。 6. Growing:同一体系可扩展到模型、知识库、Agent、工作流、评测与治理模块。 ## Colors 颜色按角色使用,不按页面临时选择。业务代码只引用语义 Token,不直接写 Hex、RGB 或品牌色。 - primary 用于单个区域内唯一的主要操作、链接、焦点和选中状态。 - success、warning、error、info 只表达对应语义,不作为装饰色。 - 文字用 *-text,图标和圆点用原色。 - surface-layout、surface、surface-container、surface-elevated 构成页面、内容、次级容器和浮层的表面层级。 - on-surface 系列承载主文字、辅助信息、说明和禁用状态。 - ai-accent、knowledge-accent、tool-accent 只用于对象类型的轻量辅助识别,不代替状态色。 - risk-container 只用于高风险说明、审批门和不可逆操作确认。 同一屏原则上只允许一个主要强调色。预设彩色只用于图表和分类标签。状态必须同时具有文本,不得仅依赖颜色。 主按钮使用深一级蓝色以满足小字号白字的 WCAG AA 对比度目标。若品牌主题调整主色,必须重新验证主要按钮、链接、焦点和选中状态的对比度。 ## Dark Mode 深色模式由 `dark-*` 颜色 Token 定义,与浅色 Token 一一对应(`dark-primary` 对应 `primary`,以此类推),浅色值不受影响。官方 CLI 暂无多主题语法,因此采用命名空间表达,由 `tokens/build-dark.mjs` 导出为 `.dark` 变量组。 - 原则:不是浅色反相。深色下彩色整体提亮、降低饱和压力;主按钮、危险按钮上的文字改为深色 `dark-on-primary`。 - 层级:只用表面亮度递进表达,由低到高为 surface-layout `#0D0D0D`、surface `#141414`、surface-container `#1F1F1F`、surface-elevated `#262626`。浮层越高越亮,不使用阴影。 - 对比度:文字对其背景至少 4.5:1;输入框边框、焦点环、状态点至少 3:1。装饰性 `outline`、`outline-variant` 与禁用文字不受此限。所有组合由 `build-dark.mjs` 计算,低于要求时 CI 失败。 - 切换:默认跟随系统 `prefers-color-scheme`;允许用户手动覆盖,在根元素加 `.dark` 强制深色,加 `.light` 强制浅色,并持久化用户选择。 | 深色文字 / 控件 | 背景 | 对比度 | | --- | --- | --- | | on-surface | surface | 14.33 | | on-surface-variant | surface | 8.87 | | on-surface-tertiary | surface-elevated | 6.06 | | primary(链接) | surface-elevated | 5.06 | | on-primary | primary | 6.62 | | on-primary | primary-active | 5.45 | | on-primary | error | 7.73 | | success-text / warning-text | surface-elevated | 9.30 / 9.37 | | ai-accent | ai-accent-container | 5.88 | | knowledge-accent / tool-accent | 各自 container | 9.08 / 9.51 | | outline-control(边框) | surface-elevated | 4.50 | | focus-ring | surface-elevated | 6.73 | ### 深色阴影与遮罩 - 遮罩(scrim):Modal、Drawer 背后使用 `scrim`(浅色 黑 45%)和 `dark-scrim`(深色 黑 65%)。深色背景本身接近黑色,遮罩要更重才能把弹层与页面分开。 - 浮层边缘:深色下阴影几乎不可见,Dropdown、Popover、Modal、Drawer 加 1px `dark-overlay-edge`(白 16%)高亮边,并使用 `surface-elevated`。浅色使用 `overlay-edge`(黑 8%)作为可选细边,主要靠阴影。 - 阴影:浅色已有 Level 1 到 3 阴影,颜色统一为 `shadow-color`(黑 15%)。深色用 `dark-shadow-color`(黑 60%),只作辅助,不能代替亮度和高亮边。阴影尺寸导出为 `--shadow-level-1/2/3`,随主题自动切换颜色。 - 对比度:浅色下弹层表面对遮罩后的页面至少 3:1;深色下弹层高亮边对遮罩后的页面至少 2:1。由 `build-dark.mjs` 计算,低于要求 CI 失败。 ### 数据可视化色 - 分类色:`chart-1` 到 `chart-8`(浅色)和 `dark-chart-1` 到 `dark-chart-8`(深色),基于 Okabe-Ito 色盲友好色板调整。相邻序号刻意拉开色相和明度,按序号顺序取色,不跳取。 - 数量:同一图表建议不超过 6 个系列,超过 6 个先合并为「其他」。必须配图例或直接标注,同时使用线型、标记形状或数据标签,不能只靠颜色区分。 - 对比度:每个分类色对四个表面至少 3:1(图形对象要求)。相邻序号在红色盲、绿色盲、蓝黄色盲模拟下色差 ΔE 至少 25。由 `build-dark.mjs` 计算,不达标则 CI 失败。 - 顺序色板:表示从低到高的连续数值时,用单一色相渐变,导出为 `--chart-seq-1` 到 `--chart-seq-5`,由 primary 与当前表面按 30%、45%、60%、80%、100% 混合而成,随主题自动切换。最浅的几档不要承载需要精确辨认的信息,必须配数值标注。 - 语义色:状态用 success、warning、error,对象类型用 ai-accent、knowledge-accent、tool-accent,这些语义色不要放进分类色序列,以免和含义冲突。图表里表达「正常或异常」时用语义色,表达「A、B、C 是不同类别」时用分类色。 ## Typography 企业控制台默认正文为 14px / 22px。16px 用于重要正文或低密度阅读,12px 只用于标签和元信息,13px 等宽字体用于 Prompt、JSON、日志和代码。 产品 UI 仅使用两档字重: - 400:正文、表单控件、菜单、标签和普通数据。 - 600:标题、表头和需要稳定强调的短文本。 禁止使用 700 以上字重制造层级,禁止通过大量加粗弥补布局问题。选中状态优先通过颜色、边框或下划线表达。 中英文均优先使用操作系统 UI 字体;代码与机器数据使用统一等宽字体。数字列必须支持快速扫描,必要时采用等宽数字特性。 ## Layout 所有间距对齐 4px 网格。推荐尺度为 4 / 8 / 12 / 16 / 24 / 32 / 40px。禁止在业务页面中使用无 Token 的魔法数字。 表面采用四层模型: 1. surface-layout:应用背景与全局框架。 2. surface:主要内容、表格、表单和工作区。 3. surface-container:次级分组、表头、局部悬停和弱强调。 4. surface-elevated:Modal、Dropdown、Popover 等浮层。 标准页面结构: App Shell → Workspace / Project / Environment → Page Header → Version / Status Bar → Toolbar / Filters → Main Content → Pagination / Footer 复杂构建页采用 Resource Panel、Editor or Canvas、Configuration Panel、Test or Run Panel。面板可折叠或调整宽度,编辑主任务必须占据最大面积。 普通业务页最大宽度 1440px;表格、Trace、日志和编排画布允许全宽;说明文档最大宽度 960px;文字主导区域控制在 680–760px。 ## Elevation & Depth 界面默认扁平。层级优先通过表面色、边框和间距表达,阴影只用于真正浮起的内容。 - Level 0:页面、表格、普通 Card,无阴影。 - Level 1:可拖拽面板、局部浮动工具条,使用轻阴影。 - Level 2:Dropdown、Popover、DatePicker、Tooltip,使用标准浮层阴影。 - Level 3:Modal、Drawer 和重要全局浮层,使用更强阴影与遮罩。 动效只解释状态变化: - 100ms:Hover、Focus、Pressed。 - 200ms:Collapse、Fade、局部面板切换。 - 300ms:Modal、Drawer、表面级进出场。 不得自行创建缓动曲线。优先使用组件库的 motionDurationFast、motionDurationMid、motionDurationSlow 与命名 easing。必须支持 reduced motion。 ## Shapes 默认圆角为 6px。 - Button、Input、Select、Dropdown Trigger:6px。 - Card、Modal、Drawer、Notification:8px。 - Tag、Tooltip、Popover:4px。 - Badge Dot、Avatar:full。 - Table 和组合控件内部拼接边:0px。 全胶囊圆角只用于圆形头像、状态点和少量语义明确的 Chip,不用于普通 Button 或 Tag。相邻组件的圆角层级必须协调,禁止出现大圆角容器嵌套大圆角容器。 ## Components 所有基础组件优先使用 Ant Design 或团队封装层,不重复实现同类基础能力。视觉定制按以下顺序进行: 1. ConfigProvider 的 Seed Token。 2. 官方 Theme Algorithm。 3. Component Token Override。 4. 团队语义组件封装。 5. 最后才允许新增样式能力。 禁止通过页面级 CSS 覆盖组件内部结构。禁止复制组件源码形成不可升级分支。 基础组件约束: - Primary Button:单一决策区域只保留一个;默认高 32px,大型关键操作可用 40px。 - Default Button:用于次要操作;危险操作使用 Danger 语义且按钮名称必须描述动作。 - Input / Select:高 32px,Label 永远可见,Placeholder 不替代 Label。 - Card:只承载独立信息对象;避免 Card inside Card。 - Modal:只处理短任务、确认和聚焦决策;复杂配置使用独立 Page 或 Drawer。 - Table:默认行高 48px,文字左对齐,数字右对齐,操作右对齐。 - Tag:表达类别或弱状态;关键错误和风险使用 Alert、Badge 加文本或 Result。 - Tooltip:补充短说明,不承载关键操作和长篇帮助。 - Tabs:同一层级内容切换,不作为跨模块导航。 - Danger Button:使用 button-danger 及 hover、disabled 变体;禁用态统一使用 button-disabled 配色。 - Input 状态:边框依次使用 input-border、input-border-hover、input-border-focus、input-border-error。 - Focus:所有可交互元素聚焦时显示 focus-ring,宽度取 focus-ring-width。 - Alert 与 Badge 的错误态使用 alert-error 和 badge-status-error,必须同时有文本。 AI 语义组件约束: - Prompt Editor:使用等宽字体,支持变量、Token 估算、校验、版本差异和测试输入。 - AI Output:必须区分事实、解释与建议,并提供来源、复制、编辑、重试和反馈入口。 - Knowledge Source:显示文档、片段位置、相关性、权限范围和原文入口。 - Tool Call:显示工具名称、输入摘要、执行状态、输出摘要、耗时和错误。 - Execution Step:显示阶段、状态、耗时、Token、成本与重试信息。 - Approval Gate:明确操作对象、影响范围、数据范围、环境、风险和是否可撤销。 - Run Trace:支持从 Run 下钻到 Model、Retrieval、Tool、Approval 和 Output,不暴露模型私有思维链。 - Model Selector:同时显示能力、上下文、区域、可用性、质量、延迟、成本和合规限制。 - Version Bar:持续展示 Draft or Published、当前版本、目标环境和未保存变更。 ## Do's and Don'ts ### Do - 使用语义 Token 和组件 Token,不直接使用颜色值。 - 每个操作区域只保留一个 Primary Action。 - 明确展示 Workspace、Project、Environment、Version 和 Status。 - 完整设计 Default、Hover、Focus、Active、Disabled、Loading、Empty、Error、Permission Denied 与 Partial Success。 - 长任务展示阶段、耗时、取消和失败恢复入口。 - AI 输出展示来源、证据、运行记录和可执行反馈。 - 高风险操作引入人工审批或显式策略授权。 - 用 Border、Surface 和 Spacing 建立层级,只有浮层使用 Shadow。 - 让设计 Agent 先检索现有 Component、Pattern 和 Token,再生成界面。 - 在主题调整后验证对比度、Dark Mode、Compact Mode 与 200% Zoom。 ### Don't - 不要硬编码白色、灰色、主色、间距、圆角和阴影。 - 不要在同一决策区域堆叠多个 Primary Button。 - 不要用彩色 Tag 代替错误、风险或审批提示。 - 不要使用 Card inside Card inside Card。 - 不要让 Modal 承载复杂页面、导航或大表单。 - 不要让用户猜测 AI 正在做什么或为什么失败。 - 不要展示模型私有思维链;展示可验证的执行摘要、工具调用和依据。 - 不要让 AI 默认执行删除、发送、支付、授权或生产变更。 - 不要只显示长时间 Spinner。 - 不要创造页面专属组件变体或一次性强调色。 - 不要绕过 ConfigProvider、Theme Algorithm 和 Component Token。 - 不要把测试数据、生产数据与不同环境的资源混在同一上下文中。 ## Conformance & Validation 本文件遵循 google-labs-code/design.md 的 alpha 格式。YAML Front Matter 与 Markdown 正文共同构成完整规范,其中 Token 是机器执行时的规范值,正文负责解释设计理由和使用边界。 规范优先级: 1. YAML Front Matter 中的 Token 与组件引用。 2. Overview 至 Do's and Don'ts 的标准设计语言章节。 3. AI Foundation Product Contract 的领域规则。 4. 具体产品需求与页面说明。 当低优先级要求与高优先级规则冲突时,不得静默覆盖 Token 或创造一次性样式。应优先调整实现;确需例外时,记录 Design Exception、Owner、Risk、Mitigation 与 Expiration Date。 文件结构要求: - Front Matter 必须位于文件第一行,并使用独占一行的三个连字符作为起止边界。 - 机器可读字段仅使用 version、name、description、omitted、colors、typography、rounded、spacing 与 components。 - Token 引用使用 {path.to.token} 语法,禁止引用不存在的路径。 - 标准章节使用二级标题,并保持 Overview、Colors、Typography、Layout、Elevation & Depth、Shapes、Components、Do's and Don'ts 的顺序。 - AI 基座扩展章节可以保留,但不得与标准章节重名。 - 组件 Token 优先使用 backgroundColor、textColor、typography、rounded、padding、size、height 与 width。 每次修改后必须执行: ~~~bash npx @google/design.md lint DESIGN.md ~~~ 交付门禁: - Errors = 0 - Warnings = 0 - 所有 Token 引用可解析 - 普通文本对比度达到 WCAG AA 4.5:1 - 标准章节无缺失、重复或顺序错误 - 新增颜色均被组件或明确模式引用 设计系统版本升级或大规模 Token 调整时,必须对比修改前后版本: ~~~bash npx @google/design.md diff DESIGN.previous.md DESIGN.md ~~~ 如果规范格式版本不再是 alpha,Owner 必须先评估 Schema、Lint Rule 与导出格式变化,再升级本文件。禁止只修改 version 字段而不完成迁移。 ## AI Foundation Product Contract ### 0. Purpose 本文件定义团队建设和交付 AI 基座产品时统一遵循的设计规范。 AI 基座是支撑模型接入、知识处理、Agent 构建、工作流编排、评测、运行观测与安全治理的企业级平台。本规范不是单纯的视觉规范,而是产品设计、技术实现与 AI 行为之间的 Design Contract。 所有以下角色均应遵循: - Product Manager - Product Designer - AI Engineer - Product Engineer - Frontend Engineer - AI Coding Agent - External Delivery Team 所有新增页面、组件、功能以及 AI 自动生成 UI,默认必须符合本规范。 当业务需求与本规范冲突时: 1. 优先复用现有设计模式 2. 无法满足时扩展现有模式 3. 最后才允许创造新的模式 4. 新模式必须沉淀回 Design System 原则: > 不只设计页面,还要设计可理解、可控制、可追溯的 AI 系统。 --- ### 1. Product Scope AI 基座默认覆盖以下能力域: - 模型管理与接入 - Prompt 管理与调试 - 知识库与检索增强 - Agent 创建与运行 - Workflow 编排 - Tool 与 API 管理 - 数据集与评测 - 运行记录与可观测性 - 成本、配额与限流 - 权限、安全与审计 - 发布、版本与环境管理 不同模块必须使用统一的信息架构、交互模式、状态语言和设计 Token。 --- ### 2. Design Philosophy #### 2.1 Enterprise First 这是企业级 AI 基础设施,不是消费级聊天应用。 优先级: 1. 清晰 2. 可控 3. 可追溯 4. 效率 5. 一致性 6. 信息密度 7. 美观 不得为了视觉效果牺牲操作效率、系统解释性或风险提示。 #### 2.2 AI Is a System, Not a Magic Box 界面必须帮助用户理解: - 当前使用什么模型 - 使用了哪些输入与上下文 - 调用了哪些工具与数据 - 系统处于什么阶段 - 结果依据是什么 - 失败发生在哪里 - 用户可以如何干预 不得用长时间 Spinner 隐藏复杂执行过程。 #### 2.3 Quiet Interface 界面应该安静。用户的注意力应集中在: - 配置 - 数据 - 运行状态 - 调试信息 - AI 结果 - 风险与决策 避免: - 大面积渐变 - 无意义阴影 - 装饰性动画 - 过度圆角 - 大量彩色卡片 - 不必要的拟人化元素 - 视觉噪音 #### 2.4 Dense but Breathable AI 基座允许高信息密度,但必须保持强视觉层级和可扫描性。 不要用大量留白制造“高级感”,也不要把所有技术信息同时暴露给用户。 #### 2.5 Progressive Disclosure 默认展示完成任务所需的核心信息。 按需展示: - 高级模型参数 - 原始请求与响应 - Token 明细 - 检索分片 - Tool 参数 - Trace 与日志 - 安全策略详情 #### 2.6 Human Control 重要 AI 行为必须允许用户: - Review - Edit - Approve - Reject - Retry - Stop - Rollback 高风险操作禁止默认自动执行。 --- ### 3. Core Design Principles #### P1 — Clear 用户应该在 3 秒内理解: - 这是哪个模块 - 当前对象与环境是什么 - 当前状态是什么 - 可以执行什么操作 - 下一步是什么 #### P2 — Explainable 模型选择、数据来源、工具调用、运行过程和结果依据必须可查看。 #### P3 — Controllable AI 自动化程度越高,用户控制能力必须越强。 #### P4 — Traceable 每次运行应能追溯到版本、配置、输入、数据、工具、输出和操作者。 #### P5 — Safe by Default 权限、敏感数据、外部调用和不可逆操作默认采用最小授权与显式确认。 #### P6 — Consistent 模型、Agent、Workflow、评测任务和运行记录应共享一致的创建、配置、发布与排障模式。 #### P7 — Action Oriented 每个页面必须围绕明确任务设计,而不是堆叠平台能力或展示技术概念。 --- ### 4. Information Architecture 推荐一级导航: 1. Overview 2. Build 3. Knowledge 4. Models 5. Evaluate 6. Observe 7. Governance 8. Settings 推荐对象归属: | 模块 | 核心对象 | |---|---| | Build | Agent、Workflow、Prompt、Tool | | Knowledge | Knowledge Base、Document、Chunk、Retrieval Test | | Models | Provider、Model、Endpoint、Deployment | | Evaluate | Dataset、Evaluator、Experiment、Report | | Observe | Run、Trace、Log、Metric、Alert | | Governance | Permission、Policy、Audit、Budget、Quota | 导航层级原则上不超过 3 层。 --- ### 5. Global Context AI 基座必须持续展示关键上下文,避免用户在错误环境或错误版本中操作。 推荐全局上下文: - Organization / Workspace - Project - Environment - Region 推荐对象上下文: - Current Version - Draft / Published - Model - Owner - Last Updated 生产环境必须使用明确的文字标签,不得只用颜色区分。 示例: `Production` + 红色或橙色语义标识 --- ### 6. Core Object Model AI 基座中的核心对象应共享统一的生命周期: Draft → Testing → Review → Published → Deprecated → Archived 每个可发布对象必须具备: - Stable ID - Name - Description - Owner - Version - Environment - Status - Created / Updated Time - Dependency - Change Log - Audit Log 对象详情页推荐统一结构: Overview Configuration Test Runs Versions Dependencies Permissions --- ### 7. Model Management 模型列表至少展示: - Provider - Model Name - Capability - Context Window - Region - Availability - Latency - Cost - Status 模型配置必须区分: ##### Basic - Model - Temperature - Max Output - Response Format ##### Advanced - Top P - Seed - Stop Sequence - Frequency / Presence Penalty - Timeout - Retry Policy ##### Safety - Content Policy - Data Retention - PII Handling - Region Restriction 选择模型时应展示能力、质量、延迟、成本和合规限制,不得只展示模型名称。 --- ### 8. Prompt Design Prompt 编辑器必须支持: - System / User / Assistant Role - Variable - Template Validation - Token Estimation - Model Selection - Test Input - Output Preview - Version Comparison - Save as Draft - Publish Prompt 与模型参数必须分区,避免混在同一表单中。 变量使用统一语法并高亮显示,例如: `{{customer_name}}` 编辑器必须明确提示: - 未定义变量 - 未使用变量 - 敏感变量 - 超出上下文限制 - 可能的 Prompt Injection 风险 --- ### 9. Knowledge Base & Retrieval 知识库详情必须区分: - Data Source - Sync Status - Processing Status - Index Status - Retrieval Configuration - Permission Scope 文档状态推荐: Queued → Parsing → Chunking → Embedding → Indexing → Ready 失败时必须显示具体阶段、原因和重试入口。 检索测试必须展示: - Query - Retrieved Chunks - Relevance Score - Source Document - Chunk Position - Filter - Latency - Token Usage AI 输出引用知识库内容时,必须允许用户查看来源与原文片段。 --- ### 10. Agent Builder Agent 创建流程推荐: Identity → Instructions → Model → Knowledge → Tools → Memory → Guardrails → Test → Publish Agent Builder 必须持续展示: - Draft / Published 状态 - 当前版本 - 使用模型 - 已连接知识库 - 已授权工具 - 风险级别 - 未保存变更 测试区必须支持: - 多轮对话 - 查看 Thinking State 的安全摘要 - 查看 Tool Call - 查看 Source - 查看 Token / Latency / Cost - 重置会话 - 保存为 Test Case - 提交反馈 不得暴露模型私有思维链。应提供可验证的执行摘要、工具调用和依据。 --- ### 11. Workflow Builder Workflow 节点至少分为: - Trigger - Input - Model - Agent - Knowledge - Tool - Logic - Human Approval - Output 画布设计要求: - 节点类型清晰 - 输入输出端口明确 - 连线方向一致 - 错误节点可定位 - 当前执行节点可识别 - 支持缩放与 Mini Map - 支持 Keyboard Navigation - 支持只读模式 配置错误必须尽量在运行前发现。 发布前至少校验: - 孤立节点 - 缺失变量 - 类型不匹配 - 循环依赖 - 无权限 Tool - 未配置 Model - 未处理失败分支 - 缺少高风险人工确认 --- ### 12. Tools & Integrations Tool 详情必须展示: - Name - Description - Owner - Authentication - Input Schema - Output Schema - Permission Scope - Timeout - Retry - Rate Limit - Risk Level Tool Call 展示格式: Tool Name → Input Summary → Execution Status → Output Summary → Duration → Error / Retry 涉及写入、发送、删除、支付、授权或生产变更的 Tool,默认要求显式审批或策略授权。 密钥、Token、密码等 Secret 不得以明文展示、复制或写入日志。 --- ### 13. Run, Trace & Observability 运行详情必须回答: 1. 谁在什么环境发起运行? 2. 使用了哪个版本和模型? 3. 经历了哪些步骤? 4. 调用了哪些数据和工具? 5. 在哪里消耗了时间与 Token? 6. 为什么成功、失败或降级? 推荐 Trace 结构: Run ├── Input ├── Model Call ├── Retrieval ├── Tool Call ├── Human Approval └── Output 每个步骤展示: - Start / End Time - Duration - Status - Input / Output Summary - Token - Cost - Error - Retry 默认显示摘要;原始 Payload、Header 和日志放入高级信息,并执行脱敏。 --- ### 14. Evaluation 评测对象包括: - Prompt - Model - Agent - Workflow - Retrieval 评测流程推荐: Select Target → Select Dataset → Configure Evaluator → Run → Compare → Review Bad Cases → Decide 结果必须区分: - Objective Metric - Model-based Evaluation - Human Review - Business Metric 对比视图至少展示: - Baseline - Candidate - Score Difference - Latency Difference - Cost Difference - Regression - Sample Size 不得仅用一个总分表达复杂质量结论。 --- ### 15. AI State Language 统一运行状态: Queued Running Waiting for Approval Completed Partially Completed Failed Cancelled Timed Out 统一构建状态: Draft Testing In Review Published Deprecated Archived 统一资源状态: Available Degraded Unavailable Disabled 不要使用 Done、Finished、Success、Completed 表达同一种状态。 长任务必须展示当前阶段和进度信息,例如: Understanding request → Retrieving knowledge → Calling tools → Generating result → Validating output --- ### 16. Forms, Tables & Filters #### 16.1 Forms 推荐结构: Label → Input → Help / Error Label 必须始终可见,不能只用 Placeholder 代替。 超过 8 个字段时,使用 Section、Step 或 Progressive Disclosure。 #### 16.2 Tables - 文字左对齐 - 数字右对齐 - 状态左对齐或居中 - 操作右对齐 - 默认行高 48px 按场景支持: - Sort - Filter - Search - Column Settings - Pagination - Selection - Bulk Action - Sticky Header #### 16.3 Filters 标准结构: Search | Status | Owner | Environment | Date | More Filters | Reset 已生效筛选条件必须可见并可单独移除。 --- ### 17. Feedback & System States #### 17.1 Empty State 必须说明: 1. 为什么这里是空的? 2. 用户下一步可以做什么? #### 17.2 Loading 短加载使用 Skeleton 或局部 Spinner。 长任务展示阶段、耗时和取消入口。 #### 17.3 Error 错误信息必须包含: What happened + Why + What can I do 应保留 Error ID 或 Run ID,便于排障。 #### 17.4 Partial Success 批处理或多步骤任务必须明确区分: - 成功数量 - 失败数量 - 跳过数量 - 失败原因 - 重试范围 #### 17.5 Toast Toast 只表达短暂反馈,例如 Saved、Copied、Created、Updated。 重要错误、审批请求和安全风险不能只使用 Toast。 --- ### 18. Version, Publish & Environment Draft 与 Published 必须明确区分。 发布前必须展示: - Target Environment - Version - Change Summary - Dependency Change - Evaluation Result - Risk - Approver 生产发布属于高风险操作时,必须二次确认。 推荐发布流程: Save Draft → Test → Evaluate → Review Changes → Approve → Publish → Monitor 必须支持版本历史、差异对比和回滚。 --- ### 19. Permissions & Governance 默认采用 RBAC,并在需要时结合资源级权限。 推荐角色: - Organization Admin - Workspace Admin - AI Platform Engineer - Builder - Reviewer - Operator - Viewer 用户无权限时,根据场景选择: - Hide:完全不可见或涉及敏感信息 - Disabled + Explanation:帮助用户理解能力与申请方式 - Request Access:允许发起权限申请 关键操作必须进入 Audit Log: - 创建或删除资源 - 修改权限 - 修改模型与安全策略 - 发布与回滚 - 查看或导出敏感数据 - 执行高风险 Tool - 修改预算和配额 --- ### 20. Security & Safety AI 基座默认考虑: - Prompt Injection - Data Leakage - PII / Secret Exposure - Unauthorized Tool Use - Unsafe Content - Model Hallucination - Excessive Agency - Supply Chain Risk - Region / Retention Compliance 高风险操作必须展示: - 操作对象 - 影响范围 - 数据范围 - 执行环境 - 是否可撤销 - 审批人 AI 内容必须区分: ##### Source Data 原始数据与可验证事实。 ##### AI Interpretation 模型对数据的分析与解释。 ##### Recommendation 模型提出的建议,不代表已执行操作。 --- ### 21. Cost, Quota & Rate Limit 成本信息应在决策发生的位置出现,而不是只放在账单页面。 重要场景展示: - Estimated Token - Actual Token - Estimated Cost - Actual Cost - Budget Usage - Rate Limit - Remaining Quota 接近限制时使用 Warning;达到限制时说明影响、恢复条件和解决方式。 批量评测、大规模索引和高成本模型运行前,应展示预估成本。 --- ### 22. Accessibility 最低标准:WCAG 2.1 AA。 必须支持: - Keyboard Navigation - Visible Focus - Screen Reader Label - Contrast - Zoom 200% - Reduced Motion 画布、Trace、图表和状态不得只依赖颜色表达信息。 --- ### 23. Responsive Design 优先级: Desktop → Tablet → Mobile AI 基座的复杂构建与调试能力不强制在移动端保持完整功能。 移动端优先支持: - 查看状态 - 查看告警 - 审批 - 停止运行 - 查看摘要 不得在小屏中压缩复杂 Workflow Canvas 或多面板调试界面。 --- ### 24. Copywriting 文案原则: - Clear - Short - Human - Specific - Actionable 错误: `Operation succeeded.` 推荐: `Agent published to Production.` 错误: `System exception.` 推荐: `The workflow stopped because the model request timed out. Retry the failed step or select another model.` 模型、Agent、Assistant、Bot、Workflow 等名称必须与产品对象定义一致,不得混用。 --- ### 25. Standard Templates #### 25.1 Resource List #### 25.2 Resource Detail Overview Configuration Test Runs Versions Permissions #### 25.3 AI Builder #### 25.4 Run Detail --- ### 26. AI-Specific Anti-Patterns #### Visual ❌ Gradient Everywhere ❌ Huge Rounded Card ❌ Card inside Card inside Card ❌ Excessive Shadow ❌ Rainbow Status ❌ 用机器人插画代替真实信息 #### Interaction ❌ 隐藏当前环境与版本 ❌ Unexplained Disabled Button ❌ Modal inside Modal ❌ 无限长配置表单 ❌ 重要错误只使用 Toast ❌ 发布后无法查看变更或回滚 #### AI ❌ AI 黑盒执行 ❌ 长时间只显示 Spinner ❌ 不展示 Tool Execution ❌ 结果没有来源与运行记录 ❌ AI 自动执行高风险操作 ❌ 暴露模型私有思维链 ❌ 用单一总分掩盖评测差异 ❌ 生产数据与测试数据混用 --- ### 27. Design Review Checklist ##### Product - [ ] 页面核心任务是否明确? - [ ] Primary Action 是否唯一? - [ ] 对象、版本与环境是否明确? - [ ] Information Architecture 是否合理? ##### Design - [ ] 是否使用现有 Design System? - [ ] Spacing、Typography、Color 是否遵循 Token? - [ ] 信息密度是否适合目标用户? - [ ] 状态与反馈是否完整? ##### AI - [ ] 模型与配置是否明确? - [ ] AI 运行状态是否可见? - [ ] Source 是否可追溯? - [ ] Tool Call 是否可查看? - [ ] AI 结果是否可 Review、Edit、Retry? - [ ] 是否避免暴露私有思维链? ##### Engineering - [ ] Version 是否明确? - [ ] Dependency 是否可查看? - [ ] Error 是否可定位? - [ ] Trace、Log、Metric 是否完整? - [ ] Token、Latency、Cost 是否可观测? ##### Enterprise - [ ] 权限是否符合最小授权? - [ ] Audit 是否完整? - [ ] 高风险操作是否确认或审批? - [ ] 数据影响范围是否明确? - [ ] 敏感数据是否脱敏? ##### Accessibility - [ ] Keyboard - [ ] Focus - [ ] Contrast - [ ] Screen Reader - [ ] Zoom - [ ] Reduced Motion --- ### 28. AI Coding Rules 所有 Coding Agent / Vibe Coding 在生成 AI 基座 UI 前必须读取 DESIGN.md。 生成前必须: 1. 搜索现有 Component 2. 搜索现有 Pattern 3. 搜索 Design Token 4. 确认对象、状态、版本与环境模型 5. 补全 Loading、Empty、Error、Permission 与 Partial Success 6. 再生成代码 禁止 AI: - 自己创造 Color、Radius、Shadow、Spacing - 自己创造新的 Button Style - 混用 AI 对象命名 - 省略版本与环境信息 - 省略失败和权限状态 - 用无法追溯的假数据伪装真实运行结果 除非需求明确要求扩展 Design System。 --- ### 29. New Pattern Protocol 如果必须增加新组件或新交互模式,需要回答: ##### Problem 现有组件或模式为什么无法解决? ##### Usage 新模式解决什么任务?适用于哪些 AI 对象? ##### States Default Hover Focus Active Disabled Loading Empty Error Permission Denied Partial Success ##### AI Behavior 运行状态、来源、工具调用、人工控制与失败恢复如何设计? ##### Safety 是否涉及敏感数据、权限、外部写入或不可逆操作? ##### Accessibility Keyboard ARIA Focus Contrast 完成后必须加入: Design System + Storybook + DESIGN.md --- ### 30. Governance Design System Owner: Product Design + AI Platform Engineering 版本采用 Major.Minor,例如: 1.0 1.1 1.2 2.0 任何违反 DESIGN.md 的实现,原则上不进入 Production。 如果业务需要例外,必须记录 Design Exception: - Reason - Owner - Risk - Mitigation - Expiration Date 避免临时方案永久存在。 --- ### 31. Definition of Done 一个 AI 基座功能只有同时满足: Product Complete + Design Complete + AI Behavior Complete + Engineering Complete + Evaluation Complete + Safety Complete + Accessibility Complete + Observability Complete 才算 Done。 最终目标: > 用户能够理解 AI 正在做什么、为什么得到这个结果,并在关键时刻拥有控制权。 同时: > 整个 AI 基座应像由一个团队、遵循一套规则构建而成。