# 深蓝色 UI 规范 · 02 表单(§14–§21) > 《深蓝色 UI 规范》分册之一。基础令牌见 `00-基础-色彩字体间距.md`,可 import 的变量见 `tokens.css`,总目录与 §索引见 `README.md`。`§N` 编号全局唯一。 **本篇目录**:`14` 输入框 · `15` 选择器 · `16` 单选与多选 · `17` 日期选择器 · `18` 穿梭框 · `19` 树选择 · `20` 上传 · `21` 弹出式窗口 --- ## 14. 输入框(搜索框) > 对应设计稿「输入框.png」。按使用场景分三类:**基本搜索框 / 后台系统搜索框 / 页面头部搜索框**。配色全部从 ZS-002 主色蓝与 ZS-004 深蓝系取。 ### 14.1 公共规格 所有搜索框共用同一套尺寸 / 边框规格: | 属性 | 默认(正常) | 小号 | |------|--------------|------| | 高度 | `32px` | `28px` | | 水平 padding | `--spacing-3` (12px) | `--spacing-2` (8px) | | 圆角 | `2px`(§4.1) | `2px` | | 字号 | `14px Regular` | `14px Regular` | | 文字色 | `#C5CFE0` (ZS-004-02) | 同 | | 占位符色 | `#6E88B0` (ZS-004-04) | 同 | | 背景 | `#0C1836` (ZS-004-09) | 同 | #### 14.1.1 边框状态 | 状态 | 边框 | 来源 | |------|------|------| | 默认 | `1px solid #1A2F5A` | ZS-004-07 | | Hover | `1px solid #4096FF` | ZS-002-05 | | Focus | `1px solid #1677FF` + 外发光 `0 0 0 2px rgba(22,119,255,0.16)` | ZS-002-06 | | 失效 | `1px solid #2D4473`,背景 `rgba(22,119,255,0.04)` | ZS-004-06 | | 错误 | `1px solid #F5222D` + 外发光 `0 0 0 2px rgba(245,34,45,0.16)` | ZS-001-06 | ### 14.2 基本搜索框 #### 14.2.1 基础搜索框 输入框尾部带 🔍 图标,回车或点击图标触发搜索: ``` [ 搜索 🔍 ] ``` | 角色 | 色值 / 规格 | 来源 | |------|-------------|------| | 搜索图标 🔍 | `16px`,`#6E88B0` | ZS-004-04 | | 图标 hover | `#4096FF` | ZS-002-05 | | 图标 → 输入边缘间距 | `--spacing-2` (8px) | — | #### 14.2.2 分类搜索框(带前缀下拉) 输入框左侧拼一个分类下拉,常用于「按协议搜 IP」等场景: ``` [ http:// ▾ ] [ 搜索 IP 地址 🔍 ] ``` | 角色 | 色值 / 规格 | 备注 | |------|-------------|------| | 前缀下拉宽度 | `auto`,最小 `72px` | 内容自适应 | | 前缀下拉与输入框 | 共用同一组边框,**中间无缝**(公用一条 `1px #1A2F5A` 分隔) | 视为一体控件 | | 前缀下拉箭头 `▾` | `12px`,`#6E88B0` | hover → `#4096FF` | | 整体 focus 行为 | 焦点落到输入框时,**前缀下拉的边框也同步高亮** | — | ### 14.3 后台系统常用搜索框 输入框 + 紧贴右侧的**实心蓝色搜索按钮**,常用于后台主内容区列表筛选: ``` [ 🔍 搜索任务集名称/负责人 ] [ 搜索 ] ``` #### 14.3.1 规格 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 左侧搜索图标 🔍 | `16px`,`#6E88B0` | ZS-004-04 | | 图标 → 文字间距 | `--spacing-2` (8px) | — | | 输入框右边框 | **无**(与按钮无缝拼接) | — | | 按钮 | 沿用 §5.2.1 主按钮,圆角 `2px`,文字 `搜索` | — | | 按钮高度 | 与输入框一致 `32px` | — | | 按钮左侧 | 与输入框紧贴,**无间距** | — | ### 14.4 页面头部搜索框 页头位置的搜索控件,支持四种扩展:**单行 / 高级搜索 / 历史记录 / 输入联想**。 #### 14.4.1 单行(最简) ``` [ 输入的文字 ] [ 搜索 ] ``` 规格同 §14.3,仅省略左侧 🔍 图标,让输入文字占满。 #### 14.4.2 含高级搜索切换 右侧叠加一个文字按钮「高级搜索 ▾」,展开后显示模式选项: ``` [ 输入的文字 ] [ 搜索 ] 高级搜索 ▾ ○ 模糊匹配 ● 精准匹配 ``` | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 「高级搜索 ▾」文字按钮 | `14px Regular`,`#4096FF`,hover `#1677FF` | ZS-002-05 → ZS-002-06 | | 「高级搜索」与「搜索」按钮间距 | `--spacing-3` (12px) | — | | 单选项「模糊匹配 / 精准匹配」 | 沿用通用 Radio 配色:未选 `1px solid #6E88B0`,已选实心 `#1677FF` | — | | 单选项 → 搜索框纵向间距 | `--spacing-2` (8px) | — | #### 14.4.3 含历史记录 输入框下方显示最近搜索词列表,点击直接用该词搜索: ``` [ 输入的文字 ] [ 搜索 ] 搜索记录词、搜索记录词、记录词 ``` | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 历史记录文字 | `12px Regular`,`#4096FF` | ZS-002-05 | | 项间分隔符(顿号 `、`) | `#4A6491` | ZS-004-05(与文字色不同,弱化分隔) | | 历史项 hover | `#1677FF` + 下划线 | ZS-002-06 | | 历史区与搜索框纵向间距 | `--spacing-2` (8px) | — | #### 14.4.4 含输入联想下拉 用户输入时,下方弹出联想词面板: ``` [ 这是 ] [ 搜索 ] ┌─────────────────────────────────┐ │ 这是搜索输入联想词 │ │ 这是搜索输入联想词 │ │ 这是搜索输入联想词 │ │ 这是联想词 │ │ 这是联想词悬浮 ←hovered │ │ …… │ └─────────────────────────────────┘ ``` ##### 面板规格 | 属性 | 取值 | |------|------| | 背景 | `#122347` (ZS-004-08) | | 边框 | `1px solid #1A2F5A` (ZS-004-07) | | 阴影 | `0 4px 16px rgba(6, 14, 36, 0.6)`(§3.1.4 三级阴影变体) | | 圆角 | `2px`(与输入框一致) | | 项高度 | `36px` | | 项水平 padding | `--spacing-3` (12px) | | 项字号 | `14px Regular`,`#C5CFE0` (ZS-004-02) | | 面板宽度 | 与输入框等宽(不含右侧按钮) | | 面板与输入框纵向间距 | `--spacing-1` (4px) | ##### 项状态 | 状态 | 背景 | 文字 | |------|------|------| | 默认 | `transparent` | `#C5CFE0` | | Hover(鼠标 / 键盘焦点) | `rgba(22,119,255,0.16)` 或 `#1A2F5A` (ZS-004-07) | `#FFFFFF` | | 已点击(点选后回填输入框) | — | — | ##### 键盘导航 - `↑` / `↓` 在联想词之间移动焦点(焦点项视觉等价于 Hover) - `Enter` 选中焦点项并回填输入框 + 触发搜索 - `Esc` 关闭面板,焦点回到输入框 #### 14.4.5 联想下拉 + 历史记录的关系 - **未输入时**:可显示历史记录(§14.4.3 横向展开形态) - **开始输入时**:历史记录被联想下拉**取代**,不要并存 - **清空输入框**:回到历史记录显示 ### 14.5 三种搜索框的选用决策 | 场景 | 选择 | |------|------| | 表单内 / 卡片内的辅助搜索 | §14.2.1 基础搜索框(图标内嵌) | | 需要按类型 / 协议过滤的搜索 | §14.2.2 分类搜索框(带前缀下拉) | | 后台列表 / 表格顶部筛选 | §14.3 后台搜索框(输入 + 实心按钮) | | 页面头部全局搜索 | §14.4 页面头部搜索框(按需开启高级 / 历史 / 联想) | ### 14.6 CSS Token 参考 ```css :root { --search-bg: #0C1836; /* ZS-004-09 */ --search-border: #1A2F5A; /* ZS-004-07 */ --search-border-hover: #4096FF; /* ZS-002-05 */ --search-border-focus: #1677FF; /* ZS-002-06 */ --search-border-error: #F5222D; /* ZS-001-06 */ --search-text: #C5CFE0; /* ZS-004-02 */ --search-placeholder: #6E88B0; /* ZS-004-04 */ --search-icon: #6E88B0; --search-icon-hover: #4096FF; /* 联想下拉 */ --suggest-bg: #122347; /* ZS-004-08 */ --suggest-item-hover: rgba(22,119,255,0.16); --suggest-item-text: #C5CFE0; --suggest-item-hover-text: #FFFFFF; /* 历史记录 */ --history-text: #4096FF; --history-text-hover: #1677FF; --history-sep: #4A6491; } ``` --- ## 15. 选择器(Select / Multi-Select / Cascader) > 对应设计稿「多项选择.png」。覆盖**多项选择**与**多项带搜索**两种主要变体(基础单选选择器同规格,仅触发器不渲染 Tag、面板项不带复选框;级联选择器原则相同,差异在面板分栏横向铺开)。配色全部从 §1.1.3 渐蓝系(ZS-002)与 §1.1.5 深蓝系(ZS-004)取,与 §14 搜索框完全对齐。 ### 15.1 公共规格 #### 15.1.1 触发器(Trigger) 触发器即「请选择 ▾」或「已选 Tag … ▾」那一行。尺寸、边框、状态机与 §14.1 输入框完全对齐: | 属性 | 取值 | 来源 | |------|------|------| | 高度 | `32px` | §14.1 | | 圆角 | `2px` | §4.1 | | 水平 padding | `--spacing-3` (12px) | §7.1 | | 背景 | `#0C1836` (ZS-004-09) | — | | 边框 | `1px solid #1A2F5A` (ZS-004-07) | — | | 占位文字 "请选择" | `14px Regular`,`#6E88B0` (ZS-004-04) | — | | 右侧箭头 `▾` | `12px`,`#6E88B0`,hover `#4096FF` | ZS-002-05 | 边框状态机(默认 / hover / focus / 失效 / 错误)直接复用 §14.1.1。 #### 15.1.2 下拉面板(Panel) 面板沿用 §14.4.4 联想下拉的容器规格,仅项内容不同: | 属性 | 取值 | |------|------| | 背景 | `#122347` (ZS-004-08) | | 边框 | `1px solid #1A2F5A` (ZS-004-07) | | 阴影 | `0 4px 16px rgba(6, 14, 36, 0.6)`(§3.1.4 三级阴影) | | 圆角 | `2px` | | 项高度 | `36px` | | 项水平 padding | `--spacing-3` (12px) | | 项字号 | `14px Regular`,`#C5CFE0` (ZS-004-02) | | 面板宽度 | 与触发器等宽(搜索框、底部按钮均内嵌等宽) | | 面板与触发器纵向间距 | `--spacing-1` (4px) | #### 15.1.3 项状态 | 状态 | 背景 | 文字 | |------|------|------| | 默认 | `transparent` | `#C5CFE0` (ZS-004-02) | | Hover / 键盘焦点 | `rgba(22,119,255,0.16)` 或 `#1A2F5A` | `#FFFFFF` | | 已选中 | `transparent`(依赖左侧复选框示态,不改行底色) | `#FFFFFF` | | 禁用 | `transparent` | `#4A6491` (ZS-004-05) | 点击行的任意位置等价于点击复选框(命中区 = 整行)。 --- ### 15.2 多项选择 > 触发器内渲染**已选 Tag 列表**而不是单行文字;面板项左侧带**复选框**,多选不关闭面板。 ``` ┌─────────────────────────────────────┐ │ n1 × n2 × +1 × ▾ │ ← 触发器(已选 Tag) └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ ← 下拉面板 │ ☑ n1 │ │ ☐ n2 │ │ ☐ n3 │ │ ☐ n4 │ │ ☐ n5 │ ├─────────────────────────────────────┤ │ [+ 添加项] │ ← 可选:底部「添加」按钮(§15.2.4) └─────────────────────────────────────┘ ``` #### 15.2.1 已选 Tag 触发器内每个已选项渲染为一颗 Tag。**实心主色蓝底 + 白字**,右侧带关闭按钮 `×`。 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 背景 | `#1677FF` (ZS-002-06) | — | | 文字 | `12px Regular`,`#FFFFFF` | — | | 圆角 | `2px` | — | | 内边距 | `2px 6px` | — | | Tag 间距 | `--spacing-1` (4px) | §7.1 | | 关闭按钮 `×` | `12px`,`rgba(255,255,255,0.72)`,hover `#FFFFFF` | — | | 折叠展示 `+N ×` | 当选中超过宽度可容纳时,把剩余 N 项收成一颗 `+N ×` Tag。Hover 显示 Tooltip 列出剩余项名;点击 `×` 清空溢出选项 | — | #### 15.2.2 复选项 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 复选框尺寸 | `14px × 14px` | — | | 复选框圆角 | `2px` | — | | 未选边框 | `1px solid #6E88B0` (ZS-004-04) | — | | 未选背景 | `transparent` | — | | 已选填充 | `#1677FF` (ZS-002-06) | — | | 已选勾 ✓ | `#FFFFFF`,描边 `2px` | — | | 半选填充 | `#1677FF` | — | | 半选指示 | 中央横线 `width 8px / height 2px / #FFFFFF` | — | | Hover 边框 | `#4096FF` (ZS-002-05) | — | | 禁用边框 | `#4A6491` (ZS-004-05) + 背景 `rgba(22,119,255,0.04)` | — | | 复选框 → 文字间距 | `--spacing-2` (8px) | §7.1 | #### 15.2.3 全选模式(顶部「全部」节点) 面板首行可选地渲染一个「全部」聚合节点,作用类似一次性勾 / 取消所有项: ``` ┌─────────────────────────────────────┐ │ ▢ 全部 │ ← 半选 / 未选 / 全选三态 │ ☑ n1 │ │ ☐ n2 │ └─────────────────────────────────────┘ ``` | 子状态 | 复选框外观 | 触发动作 | |--------|-----------|----------| | 一个都没选 | 空心,边框 `#6E88B0` | 点击 → 勾上**全部**子项 | | 部分选中 | 实心 `#1677FF` + 中央 `2px` 白色横线(半选) | 点击 → 勾上**全部**剩余未选 | | 全部选中 | 实心 `#1677FF` + 白色勾 ✓ | 点击 → 清空全部 | 文字 "全部" 与下方项同色 `#C5CFE0`,不加粗。 #### 15.2.4 底部「+ 添加项」按钮 面板底部可选地嵌入一颗虚线主色按钮,常用于「在已知池子里允许用户**就地新增**一项」(如标签、自定义分类): ``` ┌─────────────────────────────────────┐ │ [+ 正常] │ └─────────────────────────────────────┘ ``` | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 高度 | `32px`(与复选项行齐) | — | | 边框 | `1px dashed #1677FF` (ZS-002-06) | — | | 背景 | `transparent` | — | | 文字 | `14px Regular`,`#4096FF` (ZS-002-05) | — | | 前缀图标 `+` | `12px`,与文字同色 | — | | Hover | 背景 `rgba(22,119,255,0.16)`,文字 `#1677FF` | ZS-002-05 → ZS-002-06 | | Active | 背景 `rgba(22,119,255,0.24)`,文字 `#FFFFFF` | — | | 与最后一条复选项纵向分隔 | 上方分割线 `1px solid #1A2F5A` + `--spacing-1` (4px) 间距 | §6.1 | 点击行为由业务自行实现(如弹出输入框、内联编辑)。 --- ### 15.3 多项带搜索 > 在 §15.2 基础上,**面板顶部嵌入一行搜索框**,输入时实时过滤复选项列表。其它结构(已选 Tag / 复选项 / 全选 / 底部添加)完全沿用 §15.2。 ``` ┌─────────────────────────────────────┐ │ n1 × +1 × ▾ │ └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ │ [ 搜索 🔍 ] │ ← 嵌入式搜索框(§15.3.1) ├─────────────────────────────────────┤ │ ▢ 全部 │ │ ☑ n1 │ │ ☐ n2 │ │ ☐ n3 │ └─────────────────────────────────────┘ ``` #### 15.3.1 嵌入式搜索框 搜索框尺寸采用 §14.1 公共规格的**小号**(高度 28px),保持与面板视觉上的"嵌入感": | 属性 | 取值 | |------|------| | 高度 | `28px`(小号) | | 水平 padding | `--spacing-2` (8px) | | 圆角 | `2px` | | 背景 | `#0C1836` (ZS-004-09,比面板背景深一档) | | 边框 | `1px solid #1A2F5A` (ZS-004-07) | | 文字 | `14px Regular`,`#C5CFE0` | | 占位符 | "搜索",`#6E88B0` | | 右侧 🔍 / ⊗ 图标 | `14px`,`#6E88B0`,hover `#4096FF` | | 搜索框 → 列表项纵向间距 | `--spacing-2` (8px) + 分割线 `1px solid #1A2F5A` | 输入非空时右侧图标切换为 `⊗`(清空),点击清空输入并恢复完整列表。 #### 15.3.2 加载与空状态 异步获取选项(如远程搜索)时,列表区按以下规则渲染: | 状态 | 渲染 | |------|------| | 加载中 | 文字 "加载中…",单行居左,`14px Regular`,`#6E88B0`,行高 `32px` | | 无匹配 | 文字 "无匹配项",同上 | | 网络错误 | 文字 "加载失败,点击重试",`#FF7875` (ZS-001-04),可点击 | --- ### 15.4 选用决策 | 场景 | 选择 | |------|------| | 候选池 ≤ 10 项,单值 | §15.1 公共规格 + 去掉复选框(基础单选) | | 候选池 ≤ 10 项,多值 | §15.2 多项选择 | | 候选池 > 10 项 / 不可枚举 | §15.3 多项带搜索 | | 候选池有层级关系(如部门 / 区域) | 级联选择器:每级独立面板横向铺开,单级内部规格同 §15.1~15.3 | | 允许用户**新增不在候选池**的项 | 在 §15.2 / §15.3 末尾启用 §15.2.4「+ 添加项」按钮 | --- ### 15.5 CSS Token 参考 ```css :root { /* 触发器 —— 复用 §14 搜索框 */ --select-trigger-bg: var(--search-bg); /* #0C1836 */ --select-trigger-border: var(--search-border); /* #1A2F5A */ --select-trigger-placeholder: var(--search-placeholder); /* #6E88B0 */ --select-trigger-arrow: #6E88B0; --select-trigger-arrow-hover: #4096FF; /* 下拉面板 —— 复用 §14.4.4 联想 */ --select-panel-bg: var(--suggest-bg); /* #122347 */ --select-panel-border: #1A2F5A; --select-item-text: var(--suggest-item-text); /* #C5CFE0 */ --select-item-hover-bg: var(--suggest-item-hover); /* rgba(22,119,255,0.16) */ --select-item-hover-text: var(--suggest-item-hover-text); /* #FFFFFF */ --select-item-disabled: #4A6491; /* ZS-004-05 */ /* 已选 Tag */ --select-tag-bg: #1677FF; /* ZS-002-06 */ --select-tag-text: #FFFFFF; --select-tag-close: rgba(255,255,255,0.72); --select-tag-close-hover: #FFFFFF; /* 复选框 */ --check-border: #6E88B0; /* ZS-004-04 */ --check-border-hover: #4096FF; /* ZS-002-05 */ --check-fill: #1677FF; /* ZS-002-06 */ --check-mark: #FFFFFF; --check-disabled-border: #4A6491; /* ZS-004-05 */ --check-disabled-bg: rgba(22,119,255,0.04); /* 底部「+ 添加项」 */ --select-add-border: #1677FF; /* ZS-002-06 */ --select-add-text: #4096FF; /* ZS-002-05 */ --select-add-hover-bg: rgba(22,119,255,0.16); --select-add-hover-text: #1677FF; --select-add-active-bg: rgba(22,119,255,0.24); --select-add-active-text: #FFFFFF; /* 加载 / 错误 */ --select-loading-text: #6E88B0; --select-error-text: #FF7875; /* ZS-001-04 */ } ``` --- ## 16. 单选与多选(Radio / Checkbox) > 对应设计稿「多选框.png」。本章定义独立作为表单字段使用的**单选(Radio)**和**多选(Checkbox)**两类原子控件,包含**未选 / 已选 / 未选禁用 / 已选禁用**四种状态。§15.2.2「多项选择的复选项」中的复选框直接复用本章 §16.3 规格,本章是单一真源。 ### 16.1 公共规格 | 属性 | 取值 | |------|------| | 控件尺寸 | `14px × 14px` | | 控件描边宽度 | `1px` | | 控件 → 文字间距 | `--spacing-2` (8px)(§7.1) | | 文字字号 | `14px Regular` | | 行高 | `20px`(点击命中区与文字垂直对齐) | | 同一组**横向相邻**项的间距 | `--spacing-6` (24px)(§7.1) | | 同一组**纵向相邻**项的间距 | `--spacing-3` (12px)(§7.1) | 整行(控件 + 文字)任意位置可点击 = 等效切换该项状态。 --- ### 16.2 单选(Radio) > 一组互斥选项中只能选中一个。视觉为圆形描边 + 内圆实心点。 ``` ○ 未选 ● 已选 ○ 未选禁用 ● 已选禁用 (整组降饱和) ``` #### 16.2.1 外观规格 | 状态 | 外环 | 内圆 | 文字 | |------|------|------|------| | 未选 | `1px solid #4096FF` (ZS-002-05) + 背景 `transparent` | — | `#C5CFE0` (ZS-004-02) | | 未选 Hover | `1px solid #1677FF` (ZS-002-06) | — | `#FFFFFF` | | 已选 | `1px solid #1677FF` (ZS-002-06) | 中心实心圆 `6px × 6px`,`#1677FF` | `#FFFFFF` | | 已选 Focus | 外环外加 `0 0 0 2px rgba(22,119,255,0.16)` 焦点环 | — | `#FFFFFF` | | 未选禁用 | `1px solid #4A6491` (ZS-004-05) + 背景 `rgba(22,119,255,0.04)` | — | `#4A6491` | | 已选禁用 | `1px solid #4A6491` (ZS-004-05) | 中心实心圆 `6px × 6px`,`#4A6491` | `#4A6491` | 外环与内圆均为正圆(`border-radius: 50%`)。 #### 16.2.2 与 label 组合使用 「基本使用-组合」场景:选中某 Radio 项后,**下方展开关联输入字段**(如 Antd 的 Form.Item 嵌入式组合)。 ``` ● 已选 lable: [ ] lable: [ ] ``` | 元素 | 规格 | |------|------| | Radio → 下方第一行 label 纵向间距 | `--spacing-3` (12px)(§7.1) | | 嵌入字段左缩进 | 与 Radio 文字左边缘对齐(即外环宽 14px + 间距 8px = **22px 左缩进**) | | 嵌入字段的 label 与 input | 沿用 §14.1 输入框规格 | | 嵌入区分组背景 | 可选地用 `#1A2F5A` (ZS-004-07) 作浅色卡片底色,强化"属于该 Radio"的视觉归属 | --- ### 16.3 多选(Checkbox) > 多个选项可同时选中,互不影响。视觉为方形描边 + 内填勾 ✓。 ``` ☐ 未选 ☑ 已选 ☐ 未选禁用 ☑ 已选禁用 (整组降饱和) ``` #### 16.3.1 外观规格 | 状态 | 边框 / 背景 | 勾 ✓ | 文字 | |------|------------|------|------| | 未选 | `1px solid #4096FF` (ZS-002-05) + 背景 `transparent` | — | `#C5CFE0` (ZS-004-02) | | 未选 Hover | `1px solid #1677FF` (ZS-002-06) | — | `#FFFFFF` | | 已选 | 实心填充 `#1677FF` (ZS-002-06) | `#FFFFFF`,描边 `2px` | `#FFFFFF` | | 已选 Focus | 外加 `0 0 0 2px rgba(22,119,255,0.16)` 焦点环 | `#FFFFFF` | `#FFFFFF` | | 半选 | 实心填充 `#1677FF` (ZS-002-06) | 中央横线 `8px × 2px`,`#FFFFFF` | `#FFFFFF` | | 未选禁用 | `1px solid #4A6491` (ZS-004-05) + 背景 `rgba(22,119,255,0.04)` | — | `#4A6491` | | 已选禁用 | 实心填充 `#4A6491` (ZS-004-05) | `#C5CFE0` 或 `rgba(255,255,255,0.4)` | `#4A6491` | 复选框统一圆角 `2px`(§4.1)。 #### 16.3.2 与 label 组合使用 与 §16.2.2 完全一致 —— Checkbox 选中后下方展开嵌入式输入字段,缩进与间距规格相同(左缩进 22px、纵向间距 12px)。 ``` ☑ 已选 lable: [ ] lable: [ ] ``` --- ### 16.4 状态对照表 | 状态 | Radio 外环 | Radio 内圆 | Checkbox 外框 | Checkbox 勾 | 文字 | |------|-----------|-----------|--------------|------------|------| | 未选 | `#4096FF` 描边 | — | `#4096FF` 描边 | — | `#C5CFE0` | | Hover | `#1677FF` 描边 | — | `#1677FF` 描边 | — | `#FFFFFF` | | 已选 | `#1677FF` 描边 | `#1677FF` 6px 圆 | `#1677FF` 填充 | `#FFFFFF` ✓ | `#FFFFFF` | | 半选(仅 Checkbox) | — | — | `#1677FF` 填充 | `#FFFFFF` 横线 | `#FFFFFF` | | Focus | + `0 0 0 2px rgba(22,119,255,0.16)` | — | + `0 0 0 2px rgba(22,119,255,0.16)` | — | `#FFFFFF` | | 未选禁用 | `#4A6491` 描边 | — | `#4A6491` 描边 | — | `#4A6491` | | 已选禁用 | `#4A6491` 描边 | `#4A6491` 6px 圆 | `#4A6491` 填充 | `#C5CFE0` ✓ | `#4A6491` | --- ### 16.5 与 §15.2.2 的关系 §15.2.2「多项选择面板内的复选项」直接复用本章 §16.3 的复选框外观规格,**唯一差异**: - 在多项选择下拉面板里,**未选状态边框**是 `#6E88B0` (ZS-004-04,更"灰"的占位色),而非本章 §16.3 默认的 `#4096FF`(更"蓝"的强调色) - 原因:下拉面板里项数多,所有复选框同时蓝色描边会过于喧闹;独立表单字段里数量少(通常 2–4 项),用强调色更醒目 如需统一也可以全面采用本章规格 —— 二选一即可,但**一个项目内部应保持一致**。 --- ### 16.6 CSS Token 参考 ```css :root { /* 公共 */ --field-size: 14px; --field-border-w: 1px; --field-radius: 2px; /* 仅 Checkbox 用 */ --field-text: #C5CFE0; /* ZS-004-02 */ --field-text-hover: #FFFFFF; --field-text-disabled: #4A6491; /* ZS-004-05 */ --field-focus-ring: 0 0 0 2px rgba(22,119,255,0.16); /* Radio */ --radio-border: #4096FF; /* ZS-002-05 */ --radio-border-hover: #1677FF; /* ZS-002-06 */ --radio-border-checked: #1677FF; --radio-dot: #1677FF; /* 中心 6×6 实心 */ --radio-border-disabled: #4A6491; /* ZS-004-05 */ --radio-dot-disabled: #4A6491; --radio-bg-disabled: rgba(22,119,255,0.04); /* Checkbox */ --checkbox-border: #4096FF; /* ZS-002-05 */ --checkbox-border-hover: #1677FF; /* ZS-002-06 */ --checkbox-fill-checked: #1677FF; /* ZS-002-06 */ --checkbox-mark: #FFFFFF; --checkbox-border-disabled: #4A6491; /* ZS-004-05 */ --checkbox-fill-disabled: #4A6491; --checkbox-mark-disabled: #C5CFE0; --checkbox-bg-disabled: rgba(22,119,255,0.04); /* 组合:嵌入式 label + 输入框(§16.2.2 / §16.3.2) */ --field-group-indent: 22px; /* 14px 控件 + 8px 间距 */ --field-group-gap-y: var(--spacing-3); /* 12px */ } ``` --- ## 17. 日期选择器(DatePicker) > 对应设计稿「日期时间筛选框.png」。覆盖**单日期选择**与**日期范围选择**两种场景。面板包含**左侧快捷模式**(按天 / 按周 / 按月 / 自定义)、**起止输入区**、**双月日历主体**、**底部确认按钮**四块。配色全部从 §1.1.3 渐蓝系(ZS-002)与 §1.1.5 深蓝系(ZS-004)取,与 §14 搜索框 / §15 选择器完全对齐。 ### 17.1 触发器(Trigger) 触发器即「2021-12-09 📅」那一行。规格与 §14.1 输入框完全一致: | 属性 | 取值 | 来源 | |------|------|------| | 高度 | `32px` | §14.1 | | 圆角 | `2px` | §4.1 | | 水平 padding | `--spacing-3` (12px) | §7.1 | | 背景 | `#0C1836` (ZS-004-09) | — | | 边框 | `1px solid #1A2F5A` (ZS-004-07) | — | | 默认日期文字 | `14px Regular`,`#C5CFE0` (ZS-004-02);占位时 "请选择日期" 用 `#6E88B0` (ZS-004-04) | — | | 右侧 📅 图标 | `14px`,`#6E88B0`,hover `#4096FF` | ZS-002-05 | 边框状态机(默认 / hover / focus / 失效 / 错误)直接复用 §14.1.1。 **范围选择**触发器变体:宽度自动延展,内显示 `2021-12-09 至 2022-01-09`。 --- ### 17.2 下拉面板(Panel) 面板为**左 + 右**两栏组合: ``` ┌──────────┬───────────────────────────────────────────────────────┐ │ 按天 › │ [ 2021-12-09 ⊗ ] 至 [ 2021-12-09 ⊗ ] │ │ 按周 › ├───────────────────────────────────────────────────────┤ │ 按月 › │ « < 2021 年 12 月 > » « < 2022 年 1 月 > » │ │ 自定义 │ 日 一 二 三 四 五 六 日 一 二 三 四 五 六 │ │ │ 29 30 1 2 3 4 5 29 30 1 2 3 4 5 │ │ │ 6 7 8 ⓿ 10 11 12 6 7 8 ⓿ 10 11 12 │ │ │ 13 14 ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ │ │ │ 20 ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ │ │ │ 27 ▓▓ ▓▓ ▓▓ ▓▓ 1 2 3 4 5 6 7 8 9 │ │ │ 3 4 5 6 7 8 9 …… │ │ ├───────────────────────────────────────────────────────┤ │ │ [确定] [取消] │ └──────────┴───────────────────────────────────────────────────────┘ ⓿ = 起止日(实心蓝圆) ▓▓ = 范围内(浅蓝底矩形) ``` #### 17.2.1 面板容器规格 | 属性 | 取值 | |------|------| | 背景 | `#122347` (ZS-004-08) | | 边框 | `1px solid #1A2F5A` (ZS-004-07) | | 阴影 | `0 4px 16px rgba(6, 14, 36, 0.6)`(§3.1.4 三级阴影) | | 圆角 | `2px` | | 与触发器纵向间距 | `--spacing-1` (4px) | | 整体宽度 | 由左栏宽 `80px` + 右栏(双月并列)自适应得出 | | 左右栏分隔线 | `1px solid #1A2F5A`(ZS-004-07) | --- ### 17.3 左侧快捷模式(Sidebar) | 属性 | 取值 | |------|------| | 宽度 | `80px` | | 项高度 | `36px` | | 水平 padding | `--spacing-3` (12px) | | 字号 | `14px Regular` | | 右侧 `›` 图标(除"自定义"外) | `12px`,与文字同色 | #### 17.3.1 项状态 | 状态 | 背景 | 文字 | |------|------|------| | 默认 | `transparent` | `#C5CFE0` (ZS-004-02) | | Hover | `rgba(22,119,255,0.16)` | `#FFFFFF` | | 已选 | `#1677FF` (ZS-002-06) | `#FFFFFF` | #### 17.3.2 四种模式语义 | 模式 | 行为 | |------|------| | 按天 | 点击日期格 → 立即选中单日,关闭面板,触发器显示该日 | | 按周 | hover 任意日期格 → **整周高亮**,点击 → 选中该周 | | 按月 | 切换到月视图(日期格变成 12 个月名),点击 → 选中该月 | | 自定义 | 默认显示双月日历,支持选中起止日做范围(详见 §17.5) | --- ### 17.4 起止日期输入区(Range Inputs) 仅在**自定义模式**下显示在右栏顶部: ``` [ 2021-12-09 ⊗ ] 至 [ 2021-12-09 ⊗ ] ``` | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 输入框 | 沿用 §14.1 公共规格,宽度 `132px`,**只读**(点击日历格回填,不直接输入) | §14.1 | | 中间 "至" 文字 | `14px Regular`,`#6E88B0` (ZS-004-04),左右 padding `--spacing-3` (12px) | — | | 右侧 `⊗` 清空按钮 | `14px`,`#6E88B0`,hover `#4096FF` | ZS-002-05 | | 输入区 → 日历主体纵向间距 | `--spacing-3` (12px) + 分割线 `1px solid #1A2F5A` | §6.1 | | 整行右内 padding | `--spacing-4` (16px) | §7.1 | 未选起 / 止时对应输入框留空显示占位 "开始日期" / "结束日期"(`#6E88B0`)。 --- ### 17.5 双月日历主体(Calendar Grid) 并列展示**当月**与**下月**两张日历,便于跨月选范围。 #### 17.5.1 标题栏 ``` « < 2021 年 12 月 > » ``` | 元素 | 色值 / 规格 | |------|-------------| | 年月文字 | `14px Medium`,`#C5CFE0` (ZS-004-02) | | 翻页箭头 `‹ ›` | `14px`,`#6E88B0`,hover `#4096FF` | | 翻年箭头 `« »` | `14px`,`#6E88B0`,hover `#4096FF` | | 标题栏高度 | `36px` | | 双月之间间距 | `--spacing-6` (24px)(§7.1) | 行为:`«` `»` 翻年;`‹` `›` 翻月。左日历翻动时右日历同步前移一月,保持"双月连续"。 #### 17.5.2 星期表头 | 属性 | 取值 | |------|------| | 文字 | `日 一 二 三 四 五 六` | | 字号 | `12px Regular` | | 颜色 | `#6E88B0` (ZS-004-04) | | 行高 | `28px` | #### 17.5.3 日期格规格 | 属性 | 取值 | |------|------| | 单元尺寸 | `28px × 28px`(点击命中区) | | 数字字号 | `14px Regular` | | 圆角 | `50%`(已选时实心圆) | | 行间距 | `0`(紧凑排列) | #### 17.5.4 日期格状态 | 状态 | 背景 | 文字 | |------|------|------| | 当月普通 | `transparent` | `#C5CFE0` (ZS-004-02) | | 上下月填充(如 12 月日历里显示的 11/29、11/30、1/1、1/2) | `transparent` | `#4A6491` (ZS-004-05) | | 今天(无边框样式) | `transparent` + `1px solid #1677FF` | `#C5CFE0` | | Hover | `rgba(22,119,255,0.16)` | `#FFFFFF` | | 已选起止日 | 实心圆 `#1677FF` (ZS-002-06) | `#FFFFFF` | | 范围内(起止之间) | `rgba(22,119,255,0.16)` 矩形(无圆角,左右相连成连续色带) | `#FFFFFF` | | 范围内 + 端点 | 矩形底色 + 端点实心圆叠加(视觉上"圆形扣"在色带头尾) | `#FFFFFF` | | 禁用(超出 min/max) | `transparent` | `#4A6491`,鼠标 `not-allowed` | > ⚠️ **范围色带的实现要点**:范围内日期格不能各自圆角,否则中间会出现空隙。推荐方案:每行整体作为容器,范围内的日期用同色底向左右各延伸 `4px` 模拟连续;端点处再叠加 `28×28` 实心圆。 --- ### 17.6 底部「确定 / 取消」按钮 | 元素 | 规格 | 来源 | |------|------|------| | 区域高度 | `48px` | | 顶部分割线 | `1px solid #1A2F5A` (ZS-004-07) | §6.1 | | 右内 padding | `--spacing-4` (16px) | §7.1 | | 按钮对齐 | 右对齐 | | 「确定」 | 沿用 §5.2.1 主按钮(实心 `#1677FF`),尺寸"小号"`28px` | §5.2.1 | | 「取消」 | 沿用 §5.2.2 默认按钮(描边 + 透明底),尺寸"小号"`28px` | §5.2.2 | | 两按钮间距 | `--spacing-2` (8px) | §7.1 | 行为: - 「确定」 → 提交当前选择,关闭面板,触发器显示选中值 - 「取消」 → 丢弃临时选择,关闭面板,触发器值不变 按 `Esc` 等价于「取消」;按 `Enter` 等价于「确定」(当选择合法时)。 --- ### 17.7 选用决策与变体 | 场景 | 选择 | |------|------| | 单日期 | 触发器 + 单月日历(无左侧快捷栏,无起止输入区) | | 日期范围(常见筛选) | 完整组合:左侧快捷栏 + 双月日历 + 起止输入区 | | 仅按周 / 按月 / 按季度 | 左侧只保留对应模式项;右侧日历切换为相应粒度 | | 带时间(小时 / 分) | 在 §17.4 起止输入区下方追加时分选择列(24h 滚轮,未在本节展开) | | 多日期独立选(非连续) | 不推荐用本组件 —— 改用 §15 多项选择 + 日期值列表 | --- ### 17.8 CSS Token 参考 ```css :root { /* 触发器 —— 复用 §14 搜索框 */ --date-trigger-bg: var(--search-bg); /* #0C1836 */ --date-trigger-border: var(--search-border); /* #1A2F5A */ --date-trigger-text: var(--search-text); /* #C5CFE0 */ --date-trigger-placeholder: var(--search-placeholder); /* #6E88B0 */ --date-trigger-icon: #6E88B0; --date-trigger-icon-hover: #4096FF; /* ZS-002-05 */ /* 面板 —— 复用 §14.4.4 联想 */ --date-panel-bg: var(--suggest-bg); /* #122347 */ --date-panel-border: #1A2F5A; --date-panel-divider: #1A2F5A; /* 左右栏 + 顶/底分割线 */ /* 左侧快捷栏 */ --date-sidebar-w: 80px; --date-sidebar-item-h: 36px; --date-sidebar-text: #C5CFE0; /* ZS-004-02 */ --date-sidebar-text-hover: #FFFFFF; --date-sidebar-bg-hover: rgba(22,119,255,0.16); --date-sidebar-bg-active: #1677FF; /* ZS-002-06 */ --date-sidebar-text-active: #FFFFFF; /* 起止输入区 */ --date-range-sep: #6E88B0; /* "至" 文字 */ --date-range-clear: #6E88B0; --date-range-clear-hover: #4096FF; /* 日历单元 */ --date-cell-size: 28px; --date-cell-text: #C5CFE0; /* 当月 */ --date-cell-text-outside: #4A6491; /* 上下月填充, ZS-004-05 */ --date-cell-text-disabled: #4A6491; --date-cell-bg-hover: rgba(22,119,255,0.16); --date-cell-text-hover: #FFFFFF; --date-cell-bg-selected: #1677FF; /* 起止实心圆 */ --date-cell-text-selected: #FFFFFF; --date-cell-bg-in-range: rgba(22,119,255,0.16); /* 范围色带 */ --date-cell-border-today: #1677FF; /* 今天 1px 边框 */ /* 标题栏 */ --date-title-text: #C5CFE0; --date-title-arrow: #6E88B0; --date-title-arrow-hover: #4096FF; --date-weekday-text: #6E88B0; /* 日一二…六 */ /* 底部按钮区 */ --date-footer-h: 48px; --date-footer-divider: #1A2F5A; } ``` --- ## 18. 穿梭框(Transfer) > 对应设计稿「5.18 输入-穿梭框」。用于在「源列表 / 目标列表」两栏之间搬移条目,中间用 `‹ ›` 方向按钮转移选中项。覆盖**基础用法**与**可搜索**两种变体;左栏可为**树形**(带层级 + 复选框),右栏为**已选平铺列表**。配色全部从 §1.1.3 渐蓝系(ZS-002)与 §1.1.5 深蓝系(ZS-004)取,与 §14 搜索框 / §15 选择器 / §16 复选框完全对齐。 ### 18.1 整体结构 ``` ┌─ 列表(0/13) ──────┐ ┌─ 已选(6/49) ──────┐ │ ▸ ☐ XXXX公司 │ │ ☐ 李宏洋 │ │ ▸ ☐ 总裁办 │ ┌──┐ │ ☐ 舒敌 │ │ ▸ ☐ 人事部 │ │ ‹ │ │ ☑ 宴青 │ │ ▸ ☐ 技术部 │ ├──┤ │ ☐ 陈平 │ │ ☐ 张小刚 │ │ › │ │ ☐ 张小凡 │ │ ☐ 李小红 │ └──┘ │ ☐ 李小红 │ └───────────────────┘ └───────────────────┘ 源栏(可树形) 方向按钮组 目标栏(已选平铺) ``` - 左 = **源列表**(待选),右 = **目标列表**(已选);中间两颗上下排列的方向按钮 `‹`(移回源)/ `›`(移入目标)。 - 两栏顶部各有一条**标题栏**,显示名称 + 计数 `(已选/总数)`,如 `列表(0/13)`、`已选(6/49)`。 - 源栏支持**树形结构**(部门层级 + 叶子节点),目标栏为**平铺列表**。 ### 18.2 外层容器与栏规格 | 属性 | 取值 | 来源 | |------|------|------| | 外层分栏框背景 | `#0C1836` (ZS-004-09) | §3.1.1 | | 外层分栏框圆角 | `4px` | §4.1 | | 外层内边距 | `--spacing-5` (24px) | §7.1 | | 单栏宽度 | `≥ 240px`,两栏等宽 | — | | 单栏背景 | `#122347` (ZS-004-08) | §3.1.2 卡片 | | 单栏边框 | `1px solid #1A2F5A` (ZS-004-07) | — | | 单栏圆角 | `4px` | §4.1 | | 栏体最小高度 | `360px`(不足时撑满,超出滚动) | — | | 两栏与方向按钮组间距 | `--spacing-3` (12px) | §7.1 | ### 18.3 栏标题栏(Header) 标题栏是**实心主色蓝**横条,承载栏名 + 计数。 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 背景 | `#1677FF` (ZS-002-06) | §1.1.6 主色 | | 高度 | `40px` | — | | 水平 padding | `--spacing-4` (16px) | §7.1 | | 标题文字(如「列表」「已选」) | `14px Medium`,`#FFFFFF` | — | | 计数文字 `(0/13)` | `14px Regular`,`rgba(255,255,255,0.85)` | — | | 圆角 | 上方两角 `4px`,与栏体顶部贴合 | §4.1 | ### 18.4 栏内条目 #### 18.4.1 平铺列表项(目标栏 / 源栏叶子) 每行 = 复选框 + 文字,整行可点击切换勾选。复选框规格复用 §16.3。 | 状态 | 背景 | 复选框 | 文字 | |------|------|--------|------| | 默认 | `transparent` | 未选:`1px solid #6E88B0` (ZS-004-04) | `#C5CFE0` (ZS-004-02) | | Hover | `rgba(22,119,255,0.08)` | hover 边框 `#4096FF` (ZS-002-05) | `#FFFFFF` | | 已选 | `transparent` | 实心填充 `#1677FF` (ZS-002-06) + 白勾 ✓ | `#FFFFFF` | | 禁用 | `transparent` | `1px solid #4A6491` (ZS-004-05) + 背景 `rgba(22,119,255,0.04)` | `#4A6491` | | 属性 | 取值 | |------|------| | 行高 | `36px` | | 水平 padding | `--spacing-3` (12px) | | 复选框 → 文字间距 | `--spacing-2` (8px) | | 项之间分隔 | 无分割线(靠 hover 背景区分) | #### 18.4.2 树形节点(源栏) 源栏按部门层级缩进,父节点带展开箭头 `▸ / ▾`。 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 展开箭头 `▸ / ▾` | `12px`,`#6E88B0` (ZS-004-04),hover `#4096FF` | ZS-002-05 | | 每级缩进 | `--spacing-4` (16px) | §7.1 | | 父节点复选框 | 支持**半选**(部分子项选中),中央 `8px × 2px` 白色横线,填充 `#1677FF` | §16.3 半选 | | 箭头 → 复选框间距 | `--spacing-1` (4px) | — | | 节点文字 | 同 §18.4.1 平铺列表项配色 | — | > 勾选父节点 = 勾选其全部子孙;子项部分选中时父节点显示半选态(同 §15.2.3 全选逻辑)。 ### 18.5 中间方向按钮组 两颗上下排列的小尺寸图标按钮,控制条目在两栏间转移。 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 按钮尺寸 | `28px × 28px`(小号) | §5.1 | | 圆角 | `2px` | §4.1 | | 两按钮纵向间距 | `--spacing-2` (8px) | §7.1 | | 图标 `‹` `›` | `14px`,`#FFFFFF` | — | | **可用态**背景 | `#1677FF` (ZS-002-06) | §5.2.1 主按钮 | | 可用态 Hover | `#0958D9` (ZS-002-07) | — | | 可用态 Active | `#003EB3` (ZS-002-08) | — | | **禁用态**背景 | `rgba(22,119,255,0.35)`,图标 `#6E88B0` (ZS-004-04) | §5.2.1 失效 | 行为: - `›`:把**源栏选中项**移入目标栏;源栏无选中时按钮禁用。 - `‹`:把**目标栏选中项**移回源栏;目标栏无选中时按钮禁用。 - 转移后两栏标题计数 `(已选/总数)` 同步刷新。 ### 18.6 可搜索变体 在**两栏标题栏下方各嵌入一行搜索框**,输入时实时过滤本栏条目;树形栏过滤后保留命中项的祖先路径。 | 属性 | 取值 | 来源 | |------|------|------| | 搜索框规格 | 沿用 §14.1 公共规格**小号**(高 `28px`) | §14.1 | | 占位符 | "请输入",`#6E88B0` (ZS-004-04) | — | | 右侧 🔍 图标 | `14px`,`#6E88B0`,hover `#4096FF` | ZS-002-05 | | 搜索框背景 | `#0C1836` (ZS-004-09,比栏体深一档) | — | | 搜索框水平外边距 | `--spacing-3` (12px)(与栏体左右留白对齐) | — | | 搜索框 → 列表纵向间距 | `--spacing-2` (8px) | §7.1 | ### 18.7 选用决策 | 场景 | 选择 | |------|------| | 候选项 ≤ 20、无层级 | §18.1 基础用法(两栏平铺) | | 候选项有部门 / 分类层级 | 源栏启用 §18.4.2 树形节点 | | 候选项较多 / 需快速定位 | §18.6 可搜索变体 | | 仅单选搬移、候选少 | 不必用穿梭框,改用 §15 选择器 | ### 18.8 CSS Token 参考 ```css :root { /* 外层与栏 */ --transfer-frame-bg: #0C1836; /* ZS-004-09 外层分栏 */ --transfer-col-bg: #122347; /* ZS-004-08 单栏 */ --transfer-col-border: #1A2F5A; /* ZS-004-07 */ --transfer-col-radius: 4px; /* 标题栏 */ --transfer-header-bg: #1677FF; /* ZS-002-06 */ --transfer-header-text: #FFFFFF; --transfer-header-count: rgba(255,255,255,0.85); --transfer-header-h: 40px; /* 条目 */ --transfer-item-h: 36px; --transfer-item-text: #C5CFE0; /* ZS-004-02 */ --transfer-item-text-on: #FFFFFF; --transfer-item-hover-bg: rgba(22,119,255,0.08); --transfer-item-disabled: #4A6491; /* ZS-004-05 */ --transfer-tree-indent: 16px; --transfer-tree-arrow: #6E88B0; /* ZS-004-04 */ --transfer-tree-arrow-hover: #4096FF; /* ZS-002-05 */ /* 复选框(复用 §16.3) */ --transfer-check-border: #6E88B0; /* ZS-004-04 */ --transfer-check-fill: #1677FF; /* ZS-002-06 */ --transfer-check-mark: #FFFFFF; /* 方向按钮 */ --transfer-btn-size: 28px; --transfer-btn-bg: #1677FF; /* ZS-002-06 */ --transfer-btn-hover: #0958D9; /* ZS-002-07 */ --transfer-btn-active: #003EB3; /* ZS-002-08 */ --transfer-btn-disabled: rgba(22,119,255,0.35); --transfer-btn-icon: #FFFFFF; --transfer-btn-icon-disabled: #6E88B0; /* 搜索框(复用 §14.1 小号) */ --transfer-search-h: 28px; --transfer-search-bg: #0C1836; /* ZS-004-09 */ --transfer-search-border: #1A2F5A; /* ZS-004-07 */ } ``` --- ## 19. 树选择(TreeSelect) > 对应设计稿「5.19 输入-树选择」。触发器即一个「请选择 ▾」控件,下拉展开一棵**可折叠树**,叶子 / 节点可被选中。按值数分**单选 / 多选**,按是否带过滤分**无搜索 / 有搜索**,共 4 种组合。触发器规格复用 §15.1.1 选择器触发器;面板规格复用 §15.1.2 下拉面板;多选 Tag、复选框分别复用 §15.2.1、§16.3。配色全部从 §1.1.3 渐蓝系(ZS-002)与 §1.1.5 深蓝系(ZS-004)取。 ### 19.1 触发器(Trigger) | 变体 | 触发器内容 | 来源 | |------|-----------|------| | 单选 | 单行文字(已选节点名,如 `PC终端`);占位 "请选择" | §15.1.1 | | 多选 | 渲染已选 Tag 列表(`n1 × n1 ×`),超宽折叠成 `+N ×` | §15.2.1 | | 属性 | 取值 | 来源 | |------|------|------| | 高度 | `32px` | §14.1 | | 圆角 | `2px` | §4.1 | | 背景 | `#0C1836` (ZS-004-09) | — | | 边框 | `1px solid #1A2F5A`(默认);状态机复用 §14.1.1 | ZS-004-07 | | 右侧箭头 | 收起 `▾` / 展开 `▴`,`12px`,`#6E88B0`,hover `#4096FF` | ZS-002-05 | ### 19.2 下拉面板(Panel) | 属性 | 取值 | 来源 | |------|------|------| | 背景 | `#122347` (ZS-004-08) | §15.1.2 | | 边框 | `1px solid #1A2F5A` (ZS-004-07) | — | | 阴影 | `0 4px 16px rgba(6, 14, 36, 0.6)`(§3.1.4 三级阴影) | — | | 圆角 | `2px` | — | | 内边距 | 上下 `--spacing-2` (8px) | §7.1 | | 与触发器纵向间距 | `--spacing-1` (4px) | — | | 面板宽度 | 与触发器等宽(最小 `220px`) | — | ### 19.3 树节点(公共) ``` [-] 全部终端 └ [-] 本级中心 └ [-] PC终端 ├ ─ 研发管理部 ├ [-] 产品线 │ ├ ▓ 开发小组 ← 选中(整行高亮) │ └ ─ 测试小组 └ ─ 未分组用户终端 └ [+] 下级中心 ← 折叠(含未展开子树) ``` #### 19.3.1 节点规格 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 节点行高 | `32px` | — | | 每级缩进 | `--spacing-4` (16px) | §7.1 | | 展开 / 折叠图标 | 方形 `[-]` / `[+]`(含子树时显示),`12px`,描边 `1px solid #6E88B0`,符号 `#6E88B0` | ZS-004-04 | | 图标 Hover | 描边 + 符号 `#4096FF` (ZS-002-05) | — | | 叶子前缀 | 短横 `─`(占位对齐),`#4A6491` (ZS-004-05) | — | | 图标 → 文字间距 | `--spacing-2` (8px) | — | | 文字 | `14px Regular` | — | #### 19.3.2 节点状态配色 | 状态 | 行背景 | 文字 | 来源 | |------|--------|------|------| | 默认 | `transparent` | `#C5CFE0` (ZS-004-02) | — | | Hover | `rgba(22,119,255,0.08)` | `#FFFFFF` | — | | 选中(单选 / 命中叶子) | **整行实心高亮** `#1677FF` (ZS-002-06) | `#FFFFFF` | §1.1.6 主色 | | 父级(含选中子项,未自身选中) | `transparent` | `#FFFFFF` | — | | 禁用 | `transparent` | `#4A6491` (ZS-004-05) | — | > 单选选中态用**整行通栏蓝底**(不是仅文字变色),与下拉联想项的局部 hover 区分;点击节点空白处 = 选中该节点(父节点亦可选)。 ### 19.4 单选变体 | 维度 | 规则 | |------|------| | 选中表现 | 点击节点 → 整行 `#1677FF` 高亮,回填触发器文字,**关闭面板** | | 同时可选数 | 1(再选其它节点替换原值) | | 触发器 | 单行文字 | | 节点前缀 | 无复选框,仅展开图标 + 叶子短横 | ### 19.5 多选变体 | 维度 | 规则 | |------|------| | 节点前缀 | 展开图标后增加**复选框**(规格复用 §16.3) | | 选中表现 | 勾选复选框;命中行可叠加 `#1677FF` 整行高亮强调当前焦点 | | 父子联动 | 勾父节点 → 勾全部子孙;子项部分选中 → 父节点**半选**(中央白横线) | | 触发器 | 渲染已选 Tag(`n1 ×`),溢出折叠 `+N ×`(§15.2.1) | | 关闭时机 | 多选**不关闭**面板,点触发器外部或箭头收起 | | 复选框状态 | 外观 | 来源 | |-----------|------|------| | 未选 | `1px solid #6E88B0` (ZS-004-04) + 透明底 | §16.5(面板内用灰描边) | | 已选 | 实心 `#1677FF` (ZS-002-06) + 白勾 ✓ | §16.3 | | 半选 | 实心 `#1677FF` + 中央 `8px × 2px` 白横线 | §16.3 | | 禁用 | `1px solid #4A6491` (ZS-004-05) + 背景 `rgba(22,119,255,0.04)` | — | ### 19.6 有搜索变体 面板顶部嵌入一行搜索框,输入时实时过滤树节点,**保留命中节点的祖先链**并自动展开。 | 属性 | 取值 | 来源 | |------|------|------| | 搜索框规格 | 沿用 §14.1 公共规格**小号**(高 `28px`) | §14.1 | | 占位符 | "搜索",`#6E88B0` (ZS-004-04) | — | | 右侧 🔍 图标 | `14px`,`#6E88B0`,hover `#4096FF` | ZS-002-05 | | 搜索框背景 | `#0C1836` (ZS-004-09) | — | | 搜索框 → 树主体间距 | `--spacing-2` (8px) + 分割线 `1px solid #1A2F5A` | §6.1 | | 命中文字高亮(可选) | 关键字片段 `#4096FF` (ZS-002-05) | — | ### 19.7 交互与动画 | 行为 | 动效 | 来源 | |------|------|------| | 面板展开 | `scaleY(0.95) → 1`,`opacity 0 → 1`,`200ms ease-out` | §8.5 | | 节点展开 / 折叠 | 子树高度 `0 → auto`,`[+]/[-]` 切换,`200ms ease-out` | — | | 触发器箭头 | `▾ → ▴` 旋转 `180deg`,`200ms ease-out` | — | | Hover 背景过渡 | `120ms ease-out` | §8.5 | ### 19.8 选用决策 | 场景 | 选择 | |------|------| | 层级数据、选单个节点 | §19.4 单选 | | 层级数据、选多个节点(含父子联动) | §19.5 多选 | | 树节点多 / 需快速定位 | 叠加 §19.6 有搜索 | | 需要在两栏之间搬移而非单纯选取 | 改用 §18 穿梭框 | | 无层级的平铺多选 | 改用 §15.2 多项选择 | ### 19.9 CSS Token 参考 ```css :root { /* 触发器(复用 §15.1.1 / §14.1) */ --tree-trigger-bg: #0C1836; /* ZS-004-09 */ --tree-trigger-border: #1A2F5A; /* ZS-004-07 */ --tree-trigger-text: #C5CFE0; /* ZS-004-02 */ --tree-trigger-arrow: #6E88B0; /* ZS-004-04 */ --tree-trigger-arrow-hover: #4096FF; /* ZS-002-05 */ /* 面板(复用 §15.1.2) */ --tree-panel-bg: #122347; /* ZS-004-08 */ --tree-panel-border: #1A2F5A; /* ZS-004-07 */ /* 节点 */ --tree-node-h: 32px; --tree-indent: 16px; --tree-node-text: #C5CFE0; /* ZS-004-02 */ --tree-node-text-on: #FFFFFF; --tree-node-hover-bg: rgba(22,119,255,0.08); --tree-node-selected-bg: #1677FF; /* ZS-002-06 整行高亮 */ --tree-node-disabled: #4A6491; /* ZS-004-05 */ --tree-toggle-border: #6E88B0; /* [+]/[-] 描边 */ --tree-toggle-hover: #4096FF; /* ZS-002-05 */ --tree-leaf-dash: #4A6491; /* 叶子短横 */ /* 多选复选框(复用 §16) */ --tree-check-border: #6E88B0; /* ZS-004-04 面板内灰描边 */ --tree-check-fill: #1677FF; /* ZS-002-06 */ --tree-check-mark: #FFFFFF; /* 多选 Tag(复用 §15.2.1) */ --tree-tag-bg: #1677FF; /* ZS-002-06 */ --tree-tag-text: #FFFFFF; --tree-tag-close: rgba(255,255,255,0.72); /* 搜索框(复用 §14.1 小号) */ --tree-search-h: 28px; --tree-search-bg: #0C1836; /* ZS-004-09 */ --tree-search-border: #1A2F5A; /* ZS-004-07 */ } ``` --- ## 20. 上传(Upload) > 对应设计稿「5.20 输入-上传(上)」。覆盖三种形态:**上传组件**(label + 触发按钮 + 文件名回填框)、**批量上传**(拖拽区 + 文件表格 + 底部操作)、**批量上传中**(带状态列的文件列表)。按钮复用 §5.2,输入框复用 §14.1,表格分割线复用 §6,状态色取 §1.1.2 渐红系(错误)与 §1.1.4 渐青系(成功)。其余配色从渐蓝系(ZS-002)与深蓝系(ZS-004)取。 ### 20.1 上传组件(单文件 · 表单内) 表单字段形态:左 `label` + 触发按钮 + 说明 + 文件名回填框。 ``` label [ ⬆ 上传文件 ] 支持 DOCX/ZIP/PDF 格式,文件大小不超过 2 MB。 下载示例文件 label [ 未选择文件 ] [ 选择文件 ] ``` #### 20.1.1 元素规格 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | `label` 文字 | `14px Regular`,`#6E88B0` (ZS-004-04) | §12.2.2 | | 「⬆ 上传文件」按钮 | 沿用 §5.2.2 默认按钮(描边 `#6E88B0` + 透明底 + `#C5CFE0` 文字),前缀上传图标同文字色 | §5.3.2 | | 帮助说明文字 | `14px Regular`,`#4096FF` (ZS-002-05) | §1.1.6 | | 「下载示例文件」链接 | `14px Regular`,`#4096FF`,hover `#1677FF` + 下划线 | §5.2.3 文本按钮 | | 文件名回填框 | 沿用 §14.1 输入框(高 `32px`,只读),占位 "未选择文件" `#6E88B0` | §14.1 | | 「选择文件」按钮 | 沿用 §5.2.1 主按钮(实心 `#1677FF` + 白字) | §5.2.1 | | 回填框 → 按钮间距 | `--spacing-2` (8px) | §7.1 | | 行与行纵向间距 | `--spacing-3` (12px) | §7.1 | ### 20.2 批量上传(拖拽区 + 文件表格) ``` [ ⬆ 上传文件 ] 支持批量上传,上传格式为txt文件 ┌───────────────────────────────────────────────┐ │ 文件名 大小 状态 操作 │ ← 表头 ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ │ │ │ 释放鼠标 │ ← 空态 / 拖拽提示 │ │ └───────────────────────────────────────────────┘ [ 取消 ] [ 开始上传 ] ``` #### 20.2.1 触发区 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 「⬆ 上传文件」按钮 | 沿用 §5.2.1 主按钮(实心 `#1677FF`),前缀上传图标白色 | §5.3.2 | | 右侧格式说明 | `14px Regular`,`#6E88B0` (ZS-004-04) | — | | 按钮 → 说明间距 | `--spacing-3` (12px) | §7.1 | #### 20.2.2 拖拽区 / 文件表格容器 | 属性 | 取值 | 来源 | |------|------|------| | 容器背景 | `#0C1836` (ZS-004-09) | §3.1.3(凹陷感) | | 容器边框 | `1px dashed #1A2F5A`(空闲);**拖拽悬停时** `1px dashed #4096FF` (ZS-002-05) | §6.1 虚线 | | 圆角 | `4px` | §4.1 | | 空态提示文字「释放鼠标」 | `14px Regular`,`#4096FF` (ZS-002-05),居中 | — | | 容器最小高度 | `200px` | — | #### 20.2.3 表头 | 属性 | 取值 | 来源 | |------|------|------| | 列 | `文件名 / 大小 / 状态 / 操作` | — | | 文字 | `14px Medium`,`#C5CFE0` (ZS-004-02) | — | | 表头底分割线 | `1px dashed #4A6491` (ZS-004-05) | §6.1 虚线 | | 行高 | `40px` | — | | 水平 padding | `--spacing-4` (16px) | §7.1 | #### 20.2.4 底部操作 | 元素 | 规格 | 来源 | |------|------|------| | 「取消」 | 沿用 §5.2.2 默认按钮 | §5.2.2 | | 「开始上传」 | 沿用 §5.2.1 主按钮 | §5.2.1 | | 按钮排列 | 默认按钮在左、主按钮在右 | §5.3.4 | | 按钮间距 | `--spacing-2` (8px) | §7.1 | | 操作区与表格间距 | `--spacing-4` (16px),右对齐 | §7.1 | ### 20.3 批量上传中(带状态列) 文件入列后逐行显示上传状态,状态色按结果区分。 ``` ┌───────────────────────────────────────────────────────┐ │ 文件名 大小 状态 操作 │ ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤ │ 文件名.txt ✓ 上传成功 删除 │ │ 文件名是六个字…txt 40K ⊘ 文件格式有误 删除 │ │ 文件名.txt 40K ◌ 上传40%… 删除 │ │ 文件名.txt 40K ◌ 上传40%… 删除 │ │ 文件名.txt 40K ◷ 待上传 删除 │ └───────────────────────────────────────────────────────┘ [ 取消 ] [ 开始上传 ] ``` #### 20.3.1 数据行规格 | 属性 | 取值 | 来源 | |------|------|------| | 行高 | `40px` | — | | 行间分割线 | `1px dashed #2D4473` (ZS-004-06,弱化) | §6.1 | | 文件名文字 | `14px Regular`,`#C5CFE0` (ZS-004-02),过长 `…` 省略中部 | — | | 大小文字(数字) | `14px Regular`(D-DIN / Arial),`#6E88B0` (ZS-004-04) | §2.1.2 | | 「删除」操作 | 沿用 §5.2.3 文本按钮,默认 `#4096FF`,hover `#1677FF` + 下划线 | §5.2.3 | #### 20.3.2 状态列配色 | 状态 | 图标 | 图标 / 文字色 | 来源 | |------|------|--------------|------| | 上传成功 | ✓(实心圆勾) | `#13C2C2` (ZS-003-06,渐青/成功) | §1.1.4 | | 文件格式有误 / 失败 | ⊘(实心圆叹号) | `#F5222D` (ZS-001-06,渐红/错误) | §1.1.2 | | 上传中(带百分比) | ◌(旋转环) | `#1677FF` (ZS-002-06),环旋转 `1.2s linear infinite` | §5.4.2 加载 | | 待上传(排队) | ◷(时钟) | `#4096FF` (ZS-002-05) | §1.1.6 | | 属性 | 取值 | |------|------| | 状态图标尺寸 | `16px` | | 图标 → 文字间距 | `--spacing-2` (8px) | | 状态文字字号 | `14px Regular` | | 进度文字("上传40%…") | 与所在状态图标同色 | > 进度可叠加细进度条:行底 `2px` 高,已传段 `#1677FF` (ZS-002-06),未传段 `#1A2F5A` (ZS-004-07),宽度按百分比。 ### 20.4 状态流转 | 流转 | 触发 | |------|------| | 待上传 → 上传中 | 点击「开始上传」,按队列依次启动 | | 上传中 → 上传成功 | 服务端返回 2xx,图标切 ✓,行可保留或淡出 | | 上传中 → 失败 | 网络 / 服务端错误,图标切 ⊘,文字 `#F5222D`,可点「删除」或重试 | | 校验即失败 | 入列时格式 / 大小不符,直接标「文件格式有误」,不进入上传 | | 任意态 → 移除 | 点「删除」从列表移除(上传中则中断请求) | ### 20.5 选用决策 | 场景 | 选择 | |------|------| | 表单内单文件(头像 / 附件) | §20.1 上传组件 | | 多文件批量、需拖拽 | §20.2 批量上传 | | 多文件需逐条看进度 / 结果 | §20.3 批量上传中 | | 仅展示已传文件、不再上传 | 用只读文件列表,去掉状态列与底部操作 | ### 20.6 CSS Token 参考 ```css :root { /* 触发按钮(复用 §5.2) */ --upload-btn-primary-bg: #1677FF; /* ZS-002-06 主按钮 */ --upload-btn-outline-border: #6E88B0; /* ZS-004-04 默认按钮 */ --upload-btn-outline-text: #C5CFE0; /* ZS-004-02 */ /* 说明 / 链接 */ --upload-help-text: #4096FF; /* ZS-002-05 */ --upload-tip-text: #6E88B0; /* ZS-004-04 */ --upload-link: #4096FF; /* ZS-002-05 */ --upload-link-hover: #1677FF; /* ZS-002-06 */ /* 文件名回填框(复用 §14.1) */ --upload-input-bg: #0C1836; /* ZS-004-09 */ --upload-input-border: #1A2F5A; /* ZS-004-07 */ --upload-input-placeholder:#6E88B0; /* ZS-004-04 */ /* 拖拽区 / 表格容器 */ --upload-drop-bg: #0C1836; /* ZS-004-09 */ --upload-drop-border: #1A2F5A; /* ZS-004-07 虚线 */ --upload-drop-border-active:#4096FF; /* ZS-002-05 拖拽悬停 */ --upload-drop-hint: #4096FF; /* "释放鼠标" */ /* 表格 */ --upload-th-text: #C5CFE0; /* ZS-004-02 */ --upload-th-divider: #4A6491; /* ZS-004-05 表头虚线 */ --upload-row-divider: #2D4473; /* ZS-004-06 行间虚线 */ --upload-filename-text: #C5CFE0; /* ZS-004-02 */ --upload-size-text: #6E88B0; /* ZS-004-04 */ --upload-action-text: #4096FF; /* ZS-002-05 删除 */ /* 状态列 */ --upload-status-success: #13C2C2; /* ZS-003-06 成功 */ --upload-status-error: #F5222D; /* ZS-001-06 失败 */ --upload-status-loading: #1677FF; /* ZS-002-06 上传中 */ --upload-status-pending: #4096FF; /* ZS-002-05 待上传 */ /* 进度条 */ --upload-progress-done: #1677FF; /* ZS-002-06 */ --upload-progress-track: #1A2F5A; /* ZS-004-07 */ } ``` --- ## 21. 弹出式窗口(Modal / Dialog) > 对应设计稿「弹出式窗口」。居中模态弹窗,承载多步表单 / 编辑流程。结构 = 遮罩 + 标题栏(含关闭)+ 可选 Tabs + 可选步骤条 + 表单主体 + 底部操作。Tabs 复用 §9.1.1、步骤条复用 §10.2、各表单控件复用 §14~17;本节额外定义弹窗容器、表单项布局,以及截图中出现但前文未覆盖的几个表单原子(分段按钮组 / 密码框 / 文本域 / 数字+单位 / 错误态)。配色从 §1.1.2 渐红系(错误)、§1.1.3 渐蓝系(ZS-002)、§1.1.5 深蓝系(ZS-004)取。 ### 21.1 遮罩与容器 | 属性 | 取值 | 来源 | |------|------|------| | 遮罩背景 | `rgba(6, 14, 36, 0.6)`(基于 ZS-004-10) | §3.1.4 | | 遮罩动画 | `opacity 0 → 1`,`200ms ease-out` | — | | 容器背景 | `linear-gradient(180deg, #122347 0%, #0C1836 100%)`(ZS-004-08 → ZS-004-09) | §8.2.1 | | 容器边框 | `1px solid #1A2F5A` (ZS-004-07) | — | | 容器圆角 | `4px`(§4.1 Modal/Drawer) | §4.1 | | 容器阴影 | `0 8px 32px rgba(6, 14, 36, 0.6)`(§3.1.4 三级阴影) | §3.1.4 | | 容器内边距 | `--spacing-6` (32px) | §7.1 | | 弹出动画 | `scale(0.96) → 1` + `opacity 0 → 1`,`200ms ease-out` | — | | 宽度档位 | 小 `480px` / 中 `640px` / 大 `800px`(按内容选) | — | ### 21.2 标题栏 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 标题文字 | `20px Bold`,`#FFFFFF`,**水平居中** | §2.1.2 | | 标题下分隔线 | `linear-gradient(90deg, transparent 0%, #1677FF 50%, transparent 100%)`,`1px` 高 | §8.2.4 | | 关闭按钮 `×` | `16px`,`#6E88B0` (ZS-004-04),hover `#4096FF` (ZS-002-05) | §5.2.4 | | 关闭按钮位置 | 右上角,距容器上 / 右内边距对齐 | — | | 标题栏 → 主体间距 | `--spacing-5` (24px) | §7.1 | ### 21.3 内嵌 Tabs 与步骤条 | 组件 | 复用 | 备注 | |------|------|------| | 顶部 Tabs(`Tab1选中 / Tab2默认`) | §9.1.1 横向页签 | 激活 `#4096FF` + `2px` 下划线,下方通栏基线 `1px solid #1A2F5A` | | 步骤条(`第一步 ✓ / 第二步 ② / 第三步 ③`) | §10.2 弹窗步骤条 | 完成态描边圆 + 蓝勾,当前态实心 `#1677FF` + 白字,未开始描边 `#4A6491`;连接线 `1px dashed` | | Tabs → 步骤条间距 | `--spacing-5` (24px) | — | | 步骤条 → 表单间距 | `--spacing-5` (24px) | — | ### 21.4 表单项布局 弹窗内表单采用**左 label + 右控件**横向布局。 | 元素 | 规格 | 来源 | |------|------|------| | label 文字 | `14px Regular`,`#C5CFE0` (ZS-004-02),**右对齐** | — | | label 列宽 | 固定(如 `96px`),右侧留 `--spacing-3` (12px) 到控件 | §7.1 | | 必填星号 `*` | `#F5222D` (ZS-001-06),置于 label 前 | §1.1.2 | | 表单项纵向间距 | `--spacing-4` (16px) | §7.1 | | 控件默认宽度 | 撑满 label 右侧剩余区 | — | | label 与控件垂直对齐 | 控件首行基线居中 | — | #### 21.4.1 错误态与校验信息 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 错误边框 | `1px solid #F5222D` + 外发光 `0 0 0 2px rgba(245,34,45,0.16)` | §14.1.1 错误 | | 错误提示文字(如「输入表单内容报错」) | `12px Regular`,`#F5222D` (ZS-001-06) | §1.1.2 | | 提示文字位置 | 控件正下方,左对齐于控件 | — | | 控件 → 提示文字间距 | `--spacing-1` (4px) | §7.1 | ### 21.5 表单控件补充 截图中出现、前文未单列的控件原子: #### 21.5.1 分段按钮组(Segmented,如「一级风险 / 二级风险」) 并排互斥按钮,选中态高亮。 | 状态 | 背景 | 边框 | 文字 | |------|------|------|------| | 未选 | `transparent` | `1px solid #6E88B0` (ZS-004-04) | `#C5CFE0` (ZS-004-02) | | 选中 | `rgba(22,119,255,0.16)` | `1px solid #1677FF` (ZS-002-06) | `#4096FF` (ZS-002-05) | | Hover(未选) | `rgba(22,119,255,0.08)` | `#4096FF` | `#4096FF` | | 禁用 | `transparent` | `#4A6491` (ZS-004-05) | `#4A6491` | - 高度 `32px`,圆角 `2px`(§4.1),内边距 `0 14px` - 相邻项间距 `--spacing-2` (8px)(独立按钮形态);若做无缝连体段则共用一条 `1px #1A2F5A` 分隔 #### 21.5.2 密码输入框(可见性切换) | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 输入框 | 沿用 §14.1 公共规格 | §14.1 | | 掩码字符 | `●` / `*`,`#C5CFE0` | — | | 右侧眼睛图标 `👁 / 👁‍🗨` | `16px`,`#6E88B0`,hover `#4096FF` | ZS-002-05 | | 切换行为 | 点击图标在「明文 / 掩码」间切换 | — | #### 21.5.3 禁用输入框(「未填-禁用」) | 属性 | 取值 | 来源 | |------|------|------| | 边框 | `1px solid #2D4473` (ZS-004-06) | §14.1.1 失效 | | 背景 | `rgba(22,119,255,0.04)` | — | | 占位 / 文字 | `#4A6491` (ZS-004-05) | — | | 光标 | `not-allowed` | — | #### 21.5.4 文本域(Textarea) | 属性 | 取值 | 来源 | |------|------|------| | 边框 / 背景 / 状态机 | 同 §14.1 输入框 | §14.1 | | 最小高度 | `96px`(约 4 行) | — | | 内边距 | `--spacing-3` (12px) | §7.1 | | 占位文字 | "请输入",`#6E88B0` | — | | 圆角 | `2px` | §4.1 | | 右下角缩放手柄 | 可选,`#4A6491` | — | #### 21.5.5 数字 + 单位输入(「100 天」) 输入框右侧无缝拼一个**实心主色蓝单位块**。 | 元素 | 色值 / 规格 | 来源 | |------|-------------|------| | 数字输入区 | 沿用 §14.1,右边框去除(与单位块拼接) | §14.1 | | 单位块背景 | `#1677FF` (ZS-002-06) | §14.3 后台搜索框按钮 | | 单位块文字 | `14px Regular`,`#FFFFFF` | — | | 单位块内边距 | `0 --spacing-3`(12px) | — | | 整体高度 | `32px`,右侧两角圆角 `2px` | §4.1 | #### 21.5.6 行内日期 / 范围 / 下拉 / 复选 | 控件 | 复用 | |------|------| | 「威胁类型 请选择 ▾」 | §15.1 选择器触发器 | | 「首发时间」日期时间 | §17.1 日期触发器(错误态见 §21.4.1) | | 「周期 … 至 …」范围 | §17.1 范围触发器变体 | | 「该账户仅允许…」复选框 | §16.3 多选 | ### 21.6 底部操作 | 元素 | 规格 | 来源 | |------|------|------| | 区域顶部间距 | `--spacing-5` (24px)(与主体留白) | §7.1 | | 按钮对齐 | 右对齐(也可整体居中,跟随设计稿——本稿居中) | §5.3.4 | | 「取消」 | 沿用 §5.2.2 默认按钮 | §5.2.2 | | 「保存」/「确定」 | 沿用 §5.2.1 主按钮 | §5.2.1 | | 排列顺序 | 默认按钮在左、主按钮在右 | §5.3.4 | | 按钮间距 | `--spacing-2` (8px) | §7.1 | ### 21.7 交互 | 行为 | 规则 | |------|------| | 打开 | 遮罩淡入 + 容器 `scale(0.96)→1`,焦点落到首个可输入控件 | | 关闭 | 点 `×` / 「取消」 / 遮罩外 / `Esc`;有未保存改动时可二次确认 | | 提交 | 「保存」前做校验,失败项标 §21.4.1 错误态并滚动到首个错误 | | 焦点陷阱 | `Tab` 循环限制在弹窗内(不泄漏到背景页面) | ### 21.8 CSS Token 参考 ```css :root { /* 遮罩与容器 */ --modal-mask: rgba(6,14,36,0.6); /* ZS-004-10 */ --modal-bg-top: #122347; /* ZS-004-08 */ --modal-bg-bottom: #0C1836; /* ZS-004-09 */ --modal-border: #1A2F5A; /* ZS-004-07 */ --modal-radius: 4px; --modal-shadow: 0 8px 32px rgba(6,14,36,0.6); /* 标题 */ --modal-title-text: #FFFFFF; --modal-title-line: linear-gradient(90deg, transparent, #1677FF, transparent); --modal-close: #6E88B0; /* ZS-004-04 */ --modal-close-hover: #4096FF; /* ZS-002-05 */ /* 表单项 */ --form-label: #C5CFE0; /* ZS-004-02 */ --form-required: #F5222D; /* ZS-001-06 */ --form-error-border: #F5222D; --form-error-ring: 0 0 0 2px rgba(245,34,45,0.16); --form-error-text: #F5222D; /* 分段按钮组 */ --seg-border: #6E88B0; /* ZS-004-04 未选 */ --seg-selected-bg: rgba(22,119,255,0.16); --seg-selected-border: #1677FF; /* ZS-002-06 */ --seg-selected-text: #4096FF; /* ZS-002-05 */ /* 数字+单位 */ --unit-addon-bg: #1677FF; /* ZS-002-06 */ --unit-addon-text: #FFFFFF; /* 禁用输入 */ --input-disabled-border:#2D4473; /* ZS-004-06 */ --input-disabled-bg: rgba(22,119,255,0.04); --input-disabled-text: #4A6491; /* ZS-004-05 */ } ``` ---