# Cedar Design Web > Vue 3 component library. Package: @cedar-design/ui. Component prefix: C / c-. Read the quick start and the relevant component page before generating code. Follow the documented props, events, slots, imports and styles. Do not substitute APIs from another component library. Documentation language: zh-CN. --- Document: llms/zh-CN/components/affix.md # Affix 与 Maple 使用相同场景、参数和交互顺序;示例源码仅替换组件前缀,主题与站点外壳各自保留。 ## 基础示例 ### 基础用法 Example source: src/affix/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 吸附方向、偏移与容器 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `target` | 滚动容器或选择器;省略时寻找最近滚动父元素,找不到则使用 window | 吸附方向、偏移与容器 | | `offset-top` | 相对滚动容器顶部的吸附距离,支持 CSS 长度 | 吸附方向、偏移与容器 | | `offset-bottom` | 相对滚动容器底部的吸附距离;设置后优先于 offset-top,0 也有效 | 吸附方向、偏移与容器 | 分别滚动三个有边框的区域,比较顶部/底部吸附和不同偏移;每个预览独立指定滚动容器。 Example source: src/affix/__demos__/offset-container-comparison.vue ```vue ``` ## 交互与控制 ### 吸附状态变化 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `target` | 滚动容器或选择器;省略时寻找最近滚动父元素,找不到则使用 window | 吸附状态变化、禁用、CSS 模式与手动更新 | | `offset-top` | 相对滚动容器顶部的吸附距离,支持 CSS 长度 | 吸附状态变化、禁用、CSS 模式与手动更新 | | `disabled` | 禁用吸附 | 禁用、CSS 模式与手动更新 | | `css-mode` | 使用原生 position: sticky,受祖先 overflow 和容器边界影响 | 禁用、CSS 模式与手动更新 | | `z-index` | 固钉层级 | 禁用、CSS 模式与手动更新 | Example source: src/affix/__demos__/fix-change.vue ```vue ``` 上述示例通过 `target` 指定独立滚动容器,便于在 PC 页面和移动模拟器中复现;省略 `target` 时寻找最近滚动父元素,找不到则监听窗口。`offset-top` / `offset-bottom` 也接受 CSS 长度。 ### 禁用、CSS 模式与手动更新 Example source: src/affix/__demos__/controls.vue ```vue ``` ## API ### Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | offset-top | 相对滚动容器顶部的吸附距离,支持 CSS 长度 | `number / string` | `0` | | offset-bottom | 相对滚动容器底部的吸附距离;设置后优先于 offset-top,0 也有效 | `number / string` | `undefined` | | target | 滚动容器或选择器;省略时寻找最近滚动父元素,找不到则使用 window | `string / HTMLElement / Window` | `undefined` | | target-container | 额外监听的外层滚动容器或选择器;不传则不额外监听,也不作为裁剪边界 | `string / HTMLElement / Window` | `undefined` | | z-index | 固钉层级 | `number / string` | `10` | | disabled | 禁用吸附 | `boolean` | `false` | | css-mode | 使用原生 position: sticky,受祖先 overflow 和容器边界影响 | `boolean` | `false` | ### Events | 事件 | 参数与时机 | | --- | --- | | change | `(fixed: boolean, offset: number)`,固定状态变化时触发;固定时 offset 为吸附阈值,未固定时为距离对应容器边缘的距离,禁用解除固定时为 0 | ### Slots | 插槽 | 说明 | 参数 | | --- | --- | --- | | default | 需要吸附的内容 | — | ### Methods | 方法 | 说明 | 参数 | 返回值 | | --- | --- | --- | --- | | updatePosition | 下一动画帧重新绑定滚动容器并计算位置 | — | `Promise` | ### 跨端说明 属性、事件参数、插槽与公开方法一致。CSS 模式遵循浏览器 sticky 规则;示例统一使用独立滚动容器。 ### 类型定义 组件导出以下类型定义 ```ts import type { AffixInstance } from '@cedar-design/ui' ``` `change` 只通知固定状态变化:已固定时重复测量不重复发送 true,禁用解除固定发送 false、0。视口单位随测量重新求值。CSS 模式将有效长度交给原生 sticky;JS 模式解析数字、数值字符串、px、rem、vw、vh、vmin、vmax。target 控制监听及 JS 测量,原生 sticky 仍受实际 CSS 祖先约束。停用后,待完成的 `updatePosition()` 不会恢复旧激活代次的监听。 --- Document: llms/zh-CN/components/alert.md # Alert 向用户显示警告的信息时,通过警告提示,展现需要关注的信息。 ## 基础示例 ### 基础用法 展现需要关注的信息,适用于简短的警告提示。 Example source: src/alert/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 外观配置对比 选择一个对比维度后,同屏展示它的全部可选值;其余配置和内容保持一致。可切换其他配置检查组合效果;输入类预览共享一个值。
配置说明与使用限制 #### 视觉变体 `variant` 支持 `standard`(默认,浅色填充 + 描边)、`tonal`(浅色填充无描边)、`outline`(透明背景 + 描边)。 #### 外观组合 适用于提示信息的强调程度。调整变体、状态,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。 #### 提示类型 警告提示有 `info`、`success`、`warning`、`danger`、`default` 五种类型。`default` 类型下默认不展示图标,可通过 `#icon` 插槽自定义。
Example source: src/alert/__demos__/appearance-lab.vue ```vue ``` ## 内容与展示 ### 标题、对齐与通栏 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `title` | 警告提示的标题 | 标题、对齐与通栏、操作项 | | `status` | 警告提示的类型 | 标题、对齐与通栏、隐藏图标 | | `center` | 内容是否居中显示 | 标题、对齐与通栏 | | `banner` | 是否作为顶部公告使用(去除边框和圆角) | 标题、对齐与通栏 | | `show-icon` | 是否展示图标 | 隐藏图标 | | `closable` | 是否展示关闭按钮 | 操作项 | 比较标题层级、内容居中与通栏布局。通栏用于页面级提示;操作和关闭能力另见后续示例。
配置说明与使用限制 #### 提示标题 通过设置 `title` 可以给警告提示添加标题。 #### 居中 通过设置 `center`,内容居中显示。 #### 顶部公告 通过设置 `banner`,可将警告提示作为顶部公告使用(去除边框和圆角)。
Example source: src/alert/__demos__/content-comparison.vue ```vue ``` ### 隐藏图标 通过设置 `:show-icon="false"` 来隐藏图标。 Example source: src/alert/__demos__/show-icon.vue ```vue ``` ### 操作项 通过 `#action` 插槽自定义操作按钮。 Example source: src/alert/__demos__/action.vue ```vue ``` ## 自定义与插槽 ### 自定义图标 通过 `#icon` 插槽自定义前置图标。 Example source: src/alert/__demos__/custom-icon.vue ```vue ``` ## 交互与控制 ### 关闭入口与自定义图标 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `closable` | 是否展示关闭按钮 | 关闭入口与自定义图标 | | `status` | 警告提示的类型 | 关闭入口与自定义图标 | 分别操作默认与自定义关闭入口,比较相同关闭能力的呈现方式。
配置说明与使用限制 #### 可关闭 关闭按钮支持点击、Space 与 Enter。close 表示开始关闭,closed 在退出动画结束后触发;若业务在 close 中直接卸载组件,就不能继续观察该实例的动画结束。每个 Alert 独立关闭;需要重开时由业务以新实例重建,不代表旧实例的内部可见状态自动恢复。 通过设置 `closable`,可开启关闭按钮。 #### 自定义关闭图标 指定 `close-icon` slot,自定义关闭元素。
Example source: src/alert/__demos__/dismiss-comparison.vue ```vue ``` ## API ### `` Props | 属性 | 说明 | 类型 | 默认值 | | --------- | --------------------------------------------------------------------- | --------------------------------------------------- | ------------ | | status | 警告提示的类型 | `'info' \| 'success' \| 'warning' \| 'danger' \| 'default'` | `'info'` | | variant | 视觉变体 | `'standard' \| 'tonal' \| 'outline'` | `'standard'` | | color | 自定义背景色(覆盖 type 派生背景) | `string` | - | | title | 警告提示的标题 | `string` | - | | message | 内容文本(亦可使用默认插槽) | `string` | - | | show-icon | 是否展示图标 | `boolean` | `true` | | closable | 是否展示关闭按钮 | `boolean` | `false` | | banner | 是否作为顶部公告使用(去除边框和圆角) | `boolean` | `false` | | center | 内容是否居中显示 | `boolean` | `false` | | elevation | 阴影层级,可选 `true` / `false` 或 `0-24` | `boolean \| number` | `false` | ### `` Events | 事件名 | 说明 | 参数 | | ----------- | ------------------ | ----------------------------- | | close | 点击关闭按钮时触发 | `(event: MouseEvent) => void` | | closed | 关闭动画结束后触发 | - | ### `` Slots | 插槽名 | 说明 | 参数 | | ---------- | -------- | ---- | | default | 内容 | - | | icon | 图标 | - | | title | 标题 | - | | action | 操作项 | - | | close-icon | 关闭图标 | - | ### 类型定义 组件导出以下类型定义: ```ts import type { AlertInstance, AlertProps, AlertStatus, AlertVariant, } from '@cedar-design/ui' ``` ### 样式变量 参见 `style/token.less`,所有变量以 `--c-alert-` 为前缀。覆盖示例: ```css :root { --c-alert-padding-vertical: 12px; --c-alert-padding-horizontal: 20px; } ``` ## 升级提示(Breaking) | 旧 | 新 | | -- | -- | | `type="error"` | `type="danger"` | | `type="normal"` | `type="default"` | | `closeable` | `closable` | | `#close-element` slot | `#close-icon` slot | 新增能力:`variant` / `color` / `elevation` / `default` 类型 / `closed` 事件。 `type="default"` 不渲染内置图标;需要图标时用 `#icon`。 ## 同源实现与平台边界 两端各自保存完整源码,不引用公共核心,不共享组件实例或响应式状态;修改时同步维护两份实现。主体、Props、关键样式及配对测试纳入只读源码一致性检查,主题 token 和安装入口各自维护。 关闭按钮支持键盘操作,close 只触发一次,closed 在离场动画完成后触发。Maple 内部关闭类由 __close-icon 调整为 __close-btn;默认图标资源由各库本地适配。 ### 完整变量默认值 彩色标题、正文、图标及 outline 描边使用可读 system content。standard 与 tonal 使用同一第 1 阶浅底,前者额外带弱装饰描边;默认标题为 content-primary,正文、图标为 content-secondary。content 变量同时控制根容器继承色,关闭图标及未显式设色的操作内容跟随它。Maple 暗色继承同一套颜色,但保留原有几何覆盖(内边距 16px、图标 22px、图标/关闭间距 12px、正文行高 1.5)。color 仅改背景,调用方须同时验证前景对比度。下表为 :root 默认值,不是主题覆盖值。 | 变量 | 默认值 | | --- | --- | | `--c-alert-padding-vertical` | `var(--c-sys-space-4)` | | `--c-alert-padding-horizontal` | `var(--c-sys-space-6)` | | `--c-alert-padding-vertical-with-title` | `var(--c-sys-space-6)` | | `--c-alert-padding-horizontal-with-title` | `var(--c-sys-space-6)` | | `--c-alert-border-radius` | `var(--c-sys-radius-md)` | | `--c-alert-border-width` | `1px` | | `--c-alert-font-size-content` | `var(--c-sys-font-size-md)` | | `--c-alert-font-size-title` | `var(--c-sys-font-size-lg)` | | `--c-alert-font-weight-title` | `var(--c-sys-font-weight-medium)` | | `--c-alert-line-height` | `1.5715` | | `--c-alert-line-height-title` | `1.5` | | `--c-alert-title-margin-bottom` | `var(--c-sys-space-2)` | | `--c-alert-icon-size` | `16px` | | `--c-alert-icon-margin-right` | `var(--c-sys-space-4)` | | `--c-alert-action-margin-left` | `var(--c-sys-space-5)` | | `--c-alert-close-margin-left` | `var(--c-sys-space-4)` | | `--c-alert-standard-info-bg` | `rgb(var(--c-blue-1))` | | `--c-alert-standard-info-border` | `rgb(var(--c-blue-3))` | | `--c-alert-standard-info-title` | `var(--c-sys-color-content-info)` | | `--c-alert-standard-info-content` | `var(--c-sys-color-content-info)` | | `--c-alert-standard-info-icon` | `var(--c-sys-color-content-info)` | | `--c-alert-standard-success-bg` | `rgb(var(--c-success-1))` | | `--c-alert-standard-success-border` | `rgb(var(--c-success-3))` | | `--c-alert-standard-success-title` | `var(--c-sys-color-content-success)` | | `--c-alert-standard-success-content` | `var(--c-sys-color-content-success)` | | `--c-alert-standard-success-icon` | `var(--c-sys-color-content-success)` | | `--c-alert-standard-warning-bg` | `rgb(var(--c-warning-1))` | | `--c-alert-standard-warning-border` | `rgb(var(--c-warning-3))` | | `--c-alert-standard-warning-title` | `var(--c-sys-color-content-warning)` | | `--c-alert-standard-warning-content` | `var(--c-sys-color-content-warning)` | | `--c-alert-standard-warning-icon` | `var(--c-sys-color-content-warning)` | | `--c-alert-standard-danger-bg` | `rgb(var(--c-danger-1))` | | `--c-alert-standard-danger-border` | `rgb(var(--c-danger-3))` | | `--c-alert-standard-danger-title` | `var(--c-sys-color-content-danger)` | | `--c-alert-standard-danger-content` | `var(--c-sys-color-content-danger)` | | `--c-alert-standard-danger-icon` | `var(--c-sys-color-content-danger)` | | `--c-alert-standard-default-bg` | `var(--c-color-fill-2)` | | `--c-alert-standard-default-border` | `var(--c-sys-color-border-default)` | | `--c-alert-standard-default-title` | `var(--c-sys-color-content-primary)` | | `--c-alert-standard-default-content` | `var(--c-sys-color-content-secondary)` | | `--c-alert-standard-default-icon` | `var(--c-sys-color-content-secondary)` | | `--c-alert-tonal-info-bg` | `rgb(var(--c-blue-1))` | | `--c-alert-tonal-info-title` | `var(--c-sys-color-content-info)` | | `--c-alert-tonal-info-content` | `var(--c-sys-color-content-info)` | | `--c-alert-tonal-info-icon` | `var(--c-sys-color-content-info)` | | `--c-alert-tonal-success-bg` | `rgb(var(--c-success-1))` | | `--c-alert-tonal-success-title` | `var(--c-sys-color-content-success)` | | `--c-alert-tonal-success-content` | `var(--c-sys-color-content-success)` | | `--c-alert-tonal-success-icon` | `var(--c-sys-color-content-success)` | | `--c-alert-tonal-warning-bg` | `rgb(var(--c-warning-1))` | | `--c-alert-tonal-warning-title` | `var(--c-sys-color-content-warning)` | | `--c-alert-tonal-warning-content` | `var(--c-sys-color-content-warning)` | | `--c-alert-tonal-warning-icon` | `var(--c-sys-color-content-warning)` | | `--c-alert-tonal-danger-bg` | `rgb(var(--c-danger-1))` | | `--c-alert-tonal-danger-title` | `var(--c-sys-color-content-danger)` | | `--c-alert-tonal-danger-content` | `var(--c-sys-color-content-danger)` | | `--c-alert-tonal-danger-icon` | `var(--c-sys-color-content-danger)` | | `--c-alert-tonal-default-bg` | `var(--c-color-fill-2)` | | `--c-alert-tonal-default-title` | `var(--c-sys-color-content-primary)` | | `--c-alert-tonal-default-content` | `var(--c-sys-color-content-secondary)` | | `--c-alert-tonal-default-icon` | `var(--c-sys-color-content-secondary)` | | `--c-alert-outline-info-border` | `var(--c-sys-color-content-info)` | | `--c-alert-outline-info-title` | `var(--c-sys-color-content-info)` | | `--c-alert-outline-info-content` | `var(--c-sys-color-content-info)` | | `--c-alert-outline-info-icon` | `var(--c-sys-color-content-info)` | | `--c-alert-outline-success-border` | `var(--c-sys-color-content-success)` | | `--c-alert-outline-success-title` | `var(--c-sys-color-content-success)` | | `--c-alert-outline-success-content` | `var(--c-sys-color-content-success)` | | `--c-alert-outline-success-icon` | `var(--c-sys-color-content-success)` | | `--c-alert-outline-warning-border` | `var(--c-sys-color-content-warning)` | | `--c-alert-outline-warning-title` | `var(--c-sys-color-content-warning)` | | `--c-alert-outline-warning-content` | `var(--c-sys-color-content-warning)` | | `--c-alert-outline-warning-icon` | `var(--c-sys-color-content-warning)` | | `--c-alert-outline-danger-border` | `var(--c-sys-color-content-danger)` | | `--c-alert-outline-danger-title` | `var(--c-sys-color-content-danger)` | | `--c-alert-outline-danger-content` | `var(--c-sys-color-content-danger)` | | `--c-alert-outline-danger-icon` | `var(--c-sys-color-content-danger)` | | `--c-alert-outline-default-border` | `var(--c-sys-color-border-default)` | | `--c-alert-outline-default-title` | `var(--c-sys-color-content-primary)` | | `--c-alert-outline-default-content` | `var(--c-sys-color-content-secondary)` | | `--c-alert-outline-default-icon` | `var(--c-sys-color-content-secondary)` | ### 动效变量 内置动效遵循 `prefers-reduced-motion: reduce`;减少动效不会阻止加载状态或关闭事件更新。 | Token | Default | | --- | --- | | `--c-alert-close-duration` | `var(--c-sys-motion-duration-slow)` | --- Document: llms/zh-CN/components/anchor.md # Anchor 通过锚点可快速找到信息内容在当前页面的位置。 ## 基础示例 ### 基础用法 锚点的基本用法 Example source: src/anchor/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 固钉位置 使用 `affix` 组件可以让锚点固定在页面之内。 Example source: src/anchor/__demos__/affix.vue ```vue ``` ## 内容与展示 ### 无轴线模式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `show-line` | 是否显示左侧轴线 | 无轴线模式 | | `change-hash` | 是否改变hash。设置为 `false` 时点击锚点不会改变页面的 hash | 是否改变hash | 当页面滚动或浏览器窗口改变时,元素向下滚动到距底部一定距离时固定。 Example source: src/anchor/__demos__/show-line.vue ```vue ``` ### 是否改变hash 可以设置点击锚点而不改变浏览器历史。 Example source: src/anchor/__demos__/hash.vue ```vue ``` ## 生命周期与边界 ### 锚点滚动偏移量 可以设置 `boundary` 来定制锚点滚动偏移量。 Example source: src/anchor/__demos__/boundary.vue ```vue ``` ### 滚动消费者生命周期 Example source: src/anchor/__demos__/scroll-lifecycle.vue ```vue ``` 连续点击会取消上一次滚动;KeepAlive 停用、卸载、滚动容器或 boundary 改变会取消当前滚动与测量帧,移除原容器监听。激活只重新绑定和测量,不恢复旧动画。旧通知、旧滚动完成和重复帧不能覆盖新阶段;同一目标的重复点击仍保留一次有效的待发 change 通知。失效的保留点击不阻止默认导航,也不发 select。 私有视觉滚动保留 300ms/quartOut;它不是 CSS transition 完成计时,不新增时长 Token。帧由目标所属窗口创建/取消,每帧检查当前减少动效偏好;已开启时直接定位,运行中开启则下一帧完成。取消停在当前位置,不跳到目标、不发完成通知。nextTick 通知只能逻辑失效,不能物理撤销已排队续体或回滚已执行滚动。 AnchorLink 卸载及 href 变化会注销原节点;旧节点清理不会删除同 hash 的新注册。测量/几何读取后再次核对归属,防止停用、卸载或新请求重入后提交旧结果。公开 Props/Events、颜色和 CSS 变量保持不变;Maple 没有对应 Anchor 运行时。 ## 阅读方向 轴线和高亮位于阅读起点,链接缩进使用逻辑位置,纵向滚动和锚点目标保持不变。 ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ---------------- | ---------------------------------------------------------------------------- | ----------------------------------------------------- | :-------: | | boundary | 滚动边界值,设置该值为数字后,将会在距离滚动容器 `boundary` 距离时停止滚动。 | `'start' \| 'end' \| 'center' \| 'nearest' \| number` | `'start'` | | show-line | 是否显示左侧轴线 | `boolean` | `true` | | show-background | 是否显示背景 | `boolean` | `true` | | scroll-container | 滚动容器 | `string \| HTMLElement \| Window` | `-` | | change-hash | 是否改变hash。设置为 `false` 时点击锚点不会改变页面的 hash | `boolean` | `true` | ### `` Events | 事件名 | 描述 | 参数 | | ------ | ------------------ | ------------------------------------------------ | | select | 用户点击链接时触发 | hash: `string \| undefined`
preHash: `string` | | change | 链接发生改变时触发 | hash: `string` | ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------ | ------------------ | -------- | :----: | | title | 锚点链接的文本内容 | `string` | `-` | | href | 锚点链接的地址 | `string` | `-` | ### 类型定义 组件导出以下类型定义 ```ts import type { AnchorInstance } from '@cedar-design/ui' ``` --- Document: llms/zh-CN/components/auto-complete.md # AutoComplete 自动补全 允许自由输入的单行文本框,候选只是快捷填写方式。两端独立维护同源主体、Props、Menu 和样式;触控与 hover 差异由本地 Input 处理,没有跨库运行时或 platform 配置。 shouldOpen 控制是否允许展开,filterOption 控制逐项过滤;它们不是同一个设置。没有候选、禁用或只读时不会打开。自动补全不提供 list/picker 展示。 ## 阅读方向 输入框与候选弹层继承来源 dir,自定义挂载容器不覆盖来源方向。左右光标键保持原生编辑行为,上下键选择候选、Enter 提交、Escape 关闭。候选更新期间保留正在组合的原生文本;组合结束后提交,不因重绘覆盖为旧模型值。 ## 基础示例 ### 基础输入与选择 Example source: src/auto-complete/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 外观配置对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ----------- | -------------------------------------------- | ------------ | | `options` | 候选;支持分组,value 唯一,选择后转为字符串 | 外观配置对比 | | `clearable` | 允许清除可编辑的非空值 | 外观配置对比 | 选择一个对比维度后,同屏展示它的全部可选值;其余配置和内容保持一致。可切换其他配置检查组合效果;输入类预览共享一个值。
配置说明与使用限制 #### 外观组合 适用于允许自由输入的候选提示。调整变体、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。
Example source: src/auto-complete/__demos__/appearance-lab.vue ```vue ``` ## 匹配与候选列表 ### 展开条件与过滤 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ---------------- | --------------------------------------------------- | ------------------------------------ | | `options` | 候选;支持分组,value 唯一,选择后转为字符串 | 展开条件与过滤、大小写匹配、分组间距 | | `placeholder` | 占位文字或浮动提示内容 | 展开条件与过滤、大小写匹配、分组间距 | | `should-open` | 允许展开的条件,不负责过滤候选 | 展开条件与过滤、分组间距、虚拟列表 | | `filter-option` | 按标签过滤;false 用于远程筛选 | 展开条件与过滤 | | `case-sensitive` | 内置过滤是否区分大小写 | 大小写匹配 | | `trigger-props` | 弹层配置;不能覆盖内部 open / disabled / 容器优先级 | 分组间距 | Example source: src/auto-complete/__demos__/opening-policy.vue ```vue ``` ### 大小写匹配 Example source: src/auto-complete/__demos__/case-sensitive.vue ```vue ``` ### 分组间距 Example source: src/auto-complete/__demos__/group-spacing.vue ```vue ``` ### 虚拟列表 Example source: src/auto-complete/__demos__/virtual-list.vue ```vue ``` ## 内容与字段定制 ### 自定义字段与内容 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------- | -------------------------------------------- | -------------------------------- | | `options` | 候选;支持分组,value 唯一,选择后转为字符串 | 自定义字段与内容、外观与浮动提示 | | `placeholder` | 占位文字或浮动提示内容 | 自定义字段与内容、外观与浮动提示 | | `field-names` | 映射 value、label、disabled 等字段 | 自定义字段与内容 | | `variant` | 输入外观;未设置时继承 Group | 外观与浮动提示 | | `hint` | 启用 Input 的浮动提示 | 外观与浮动提示 | | `clearable` | 允许清除可编辑的非空值 | 外观与浮动提示 | Example source: src/auto-complete/__demos__/footer.vue ```vue ``` ### 外观与浮动提示 Example source: src/auto-complete/__demos__/decorator.vue ```vue ``` ## 交互与键盘 ### 交互状态对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------- | -------------------------------------------- | -------------------------- | | `options` | 候选;支持分组,value 唯一,选择后转为字符串 | 交互状态对比、键盘与无障碍 | | `clearable` | 允许清除可编辑的非空值 | 交互状态对比 | | `disabled` | 禁用;未设置时继承,显式 false 覆盖 | 交互状态对比 | | `readonly` | 只读,可聚焦复制,不展开候选 | 交互状态对比 | | `error` | 错误状态;未设置时继承 FormItem | 交互状态对比 | | `input-attrs` | 原生 input 属性,combobox 状态由组件维护 | 键盘与无障碍 | 在同一实例上切换禁用、只读和错误状态后再操作控件,比较可编辑性和交互反馈。恢复开关位于目标控件外;错误外观本身不会执行校验。
配置说明与使用限制 #### 交互状态切换 适用于允许自由输入的候选提示。调整禁用、只读、错误反馈,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。
Example source: src/auto-complete/__demos__/state-lab.vue ```vue ``` ### 键盘与无障碍 Example source: src/auto-complete/__demos__/accessibility.vue ```vue ``` 选项分组与 Menu 使用一致的间距逻辑:标题行高 20px,上下各 4px 留白(总高 28px);后续分组前额外留 8px,首组不添加组间距。标题与选项文字左对齐;AutoComplete 的标题缩进跟随其选项水平 padding 配置。 ## 异步与配置 ### 异步建议 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | --------------------------------------------------- | ------------------------------ | | `options` | 候选;支持分组,value 唯一,选择后转为字符串 | 异步建议、透传配置边界与优先级 | | `filter-option` | 按标签过滤;false 用于远程筛选 | 异步建议 | | `placeholder` | 占位文字或浮动提示内容 | 异步建议 | | `disabled` | 禁用;未设置时继承,显式 false 覆盖 | 透传配置边界与优先级 | | `should-open` | 允许展开的条件,不负责过滤候选 | 透传配置边界与优先级 | | `trigger-props` | 弹层配置;不能覆盖内部 open / disabled / 容器优先级 | 透传配置边界与优先级 | Example source: src/auto-complete/__demos__/remote.vue ```vue ``` ### 透传配置边界与优先级 建议使用 `AutoCompleteTriggerOptions` 声明 trigger-props。展开由内部输入/焦点与 shouldOpen 管理;AutoComplete 不公开顶层 open/defaultOpen/update:open。disabled 归顶层管理;不能用嵌套配置绕过只读/禁用。placement、popupOffset、样式等普通 Trigger 属性延续原透传。popup-container 顶层明确传入时优先(包括 false),否则回退 triggerProps.popupContainer。内部 Trigger 展开监听继续执行;不要通过嵌套监听替代内部展开协议。 本次仅新增可主动选用的专用类型,不收窄已发布的宽属性类型,不增加运行时过滤、不改变覆盖顺序;旧业务写法继续可编译。若直接使用旧宽属性,内部托管字段仍可能通过类型检查,但不代表能控制内部状态。 ```ts import type { AutoCompleteTriggerOptions } from "@cedar-design/ui"; ``` Example source: src/auto-complete/__demos__/passthrough-options.vue ```vue ``` ### 共享字段加载 `loading` 控制共享字段加载状态;`loading-mode` 为 `default`(指示器)或 `line`(底部不定进度线),默认 `default`。渲染统一由 FieldDecorator 负责,不隐式改变 disabled/readonly;需要禁止编辑时单独设置。 ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### Props | 属性 | 说明 | 类型 | 默认值 | | -------------------- | --------------------------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------- | | `model-value` | 受控文本值 | `string` | `—` | | `default-value` | 非受控初始文本 | `string` | `''` | | `options` | 候选;支持分组,value 唯一,选择后转为字符串 | `(AutoCompleteOption \| SelectOptionGroup)[]` / `(query, { signal }) => Array / Promise` | `undefined` | | `field-names` | 映射 value、label、disabled 等字段 | `AutoCompleteFieldNames` | `—` | | `should-open` | 允许展开的条件,不负责过滤候选 | `(value: string) => boolean` | `value.length > 0` | | `filter-option` | 按标签过滤;false 用于远程筛选 | `AutoCompleteFilterOption` | 自动:数组开启,加载函数关闭 | | `case-sensitive` | 内置过滤是否区分大小写 | `boolean` | `false` | | `popup-container` | 弹层挂载容器,与 Trigger 一致 | `PopupContainer` | `—` | | `trigger-props` | 弹层配置;不能覆盖内部 open / disabled / 容器优先级 | `TriggerProps` | `—` | | `virtual-list-props` | 传入后启用虚拟列表 | `VirtualListProps` | `—` | | `size` | 五档尺寸;未设置时继承 Group / Form / 全局配置 | `xs \| sm \| md \| lg \| xl` | `md` | | `variant` | 输入外观;未设置时继承 Group | `filled \| outline \| standard` | `outline` | | `disabled` | 禁用;未设置时继承,显式 false 覆盖 | `boolean` | `undefined` | | `readonly` | 只读,可聚焦复制,不展开候选 | `boolean` | `undefined` | | `error` | 错误状态;未设置时继承 FormItem | `boolean` | `undefined` | | `clearable` | 允许清除可编辑的非空值 | `boolean` | `false` | | `placeholder` | 占位文字或浮动提示内容 | `string` | `—` | | `hint` | 启用 Input 的浮动提示 | `boolean` | `undefined` | | `line` | 显示边框或底线 | `boolean` | `true` | | `text-color` | 实例文字颜色 | `string` | `—` | | `focus-color` | 实例聚焦颜色 | `string` | `—` | | `blur-color` | 实例失焦提示颜色 | `string` | `—` | | `enterkeyhint` | 移动虚拟键盘回车提示 | `InputHTMLAttributes['enterKeyHint']` | `—` | | `aria-label` | 输入框可访问名称 | `string` | `—` | | `max-length` | 输入与候选选择使用相同的截断规则 | `number \| { length: number; errorOnly?: boolean }` | `0` | | `show-word-limit` | 显示字数统计 | `boolean` | `false` | | `word-length` | 自定义长度计算 | `(value: string) => number` | `—` | | `word-slice` | 自定义截断 | `(value: string, maxLength: number) => string` | `—` | | `input-attrs` | 原生 input 属性,combobox 状态由组件维护 | `Record` | `—` | ### Events | 事件 | 参数 | | ----------------------------------------- | ------------------------------------------------------------- | | `update:model-value` | `value: string` | | `input / search / change` | `value: string, event: Event` | | `select` | `value: string, option: AutoCompleteOptionInfo, event: Event` | | `clear` | `event: Event` | | `focus / blur` | `event: FocusEvent` | | `dropdown-scroll / dropdown-reach-bottom` | `event: Event` | 输入顺序:`input → update:modelValue → search`;选择:`update:modelValue → select → change`;清除:`clear → input → update:modelValue → change`。同值选择只发 select。change 表示失焦、Enter 或候选选择产生的提交。Input 负责输入、焦点与清除的 Form 通知,AutoComplete 仅对候选提交通知一次。选择也遵守 maxLength;select 的 value 是最终提交字符串,option.value 保留原始候选。clear 参数为事件,不再是字符串。 ### Slots | 插槽 | 说明 | | ----------------- | ---------------------------------- | | `option` | `{ data: AutoCompleteOptionInfo }` | | `footer` | 菜单底部 | | `prefix / suffix` | 输入框前后缀 | | `clear-icon` | `{ clear }` | ### Methods `focus()` / `blur()` label 使用文本;复杂候选通过 option 插槽或选项 render 实现,不保留旧的函数/VNode label 写法。方向键浏览、Enter 选择、Escape 关闭,Tab 保留原生焦点导航。使用 Vue useId 保证 SSR 标识稳定。 ## 类型定义 ```ts import type { AutoCompleteProps, AutoCompleteInstance, AutoCompleteOption, AutoCompleteOptionData, AutoCompleteOptionInfo, AutoCompleteFieldNames, AutoCompleteFilterOption, } from "@cedar-design/ui"; ``` ## 样式变量 | Token | 默认值 | | ----------------------------------------------- | --------------------------------------------------- | | `--c-auto-complete-popup-max-height` | `var(--c-select-popup-max-height)` | | `--c-auto-complete-popup-bg` | `var(--c-select-popup-bg)` | | `--c-auto-complete-popup-border-radius` | `var(--c-select-popup-border-radius)` | | `--c-auto-complete-popup-padding-vertical` | `var(--c-select-popup-padding-vertical)` | | `--c-auto-complete-popup-font-size` | `var(--c-select-popup-font-size)` | | `--c-auto-complete-popup-border-color` | `var(--c-select-popup-border-color)` | | `--c-auto-complete-popup-box-shadow` | `var(--c-select-popup-box-shadow)` | | `--c-auto-complete-option-height` | `var(--c-select-popup-option-height)` | | `--c-auto-complete-option-font-weight-selected` | `var(--c-select-popup-option-font-weight-selected)` | | `--c-auto-complete-option-padding-horizontal` | `var(--c-select-popup-option-padding-horizontal)` | | `--c-auto-complete-option-bg-default` | `var(--c-select-popup-option-bg)` | | `--c-auto-complete-option-bg-hover` | `var(--c-select-popup-option-bg-hover)` | | `--c-auto-complete-option-bg-selected` | `var(--c-select-popup-option-bg-selected)` | | `--c-auto-complete-option-bg-disabled` | `var(--c-select-popup-option-bg-disabled)` | | `--c-auto-complete-option-text-color-default` | `var(--c-select-popup-option-text-color)` | | `--c-auto-complete-option-text-color-hover` | `var(--c-select-popup-option-text-color-hover)` | | `--c-auto-complete-option-text-color-selected` | `var(--c-select-popup-option-text-color-selected)` | | `--c-auto-complete-option-text-color-disabled` | `var(--c-select-popup-option-text-color-disabled)` | 清空不发 search,也不重新展开候选面板,包括从键盘聚焦的清空按钮回到输入框。受控值由父级决定:连续被拒绝的清空或选择仍各自发出 change 提议;已接受的候选选择只通知 Form 一次。 ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 候选列表与 Select 统一使用分组、选中、禁用样式,AutoComplete 样式变量默认跟随对应的 Select 变量。`inline` 列表默认在输入框下方展开,随滚动更新位置;可通过 `trigger-props` 显式调整方向或开启自动翻转。`popup` 候选列表使用与 Select 相同的完整编辑面板样式。 ### 公开类型入口 根入口和组件入口均导出 `AutoCompleteEmits`、`AutoCompleteSlots`、`AutoCompleteExpose`,与 Props、Instance 配套。Emits 为从运行时事件声明推导的参数元组映射;Expose 包含 focus/blur。 `case-sensitive` 只使内置本地过滤区分大小写:默认 false 时输入 `ap` 可以匹配 `Apple`,true 时不能。它不限制必须选择候选,不校验输入值。自定义 `filterOption` 优先;`filterOption=false` 关闭本地过滤,此时 case-sensitive 不起作用。 ### strict 迁移 / Migration 旧 `strict` 已移除,直接改为 `case-sensitive`(TS 属性为 `caseSensitive`)。true/false 语义和默认 false 保持不变;该删除标记为下个 major,不保留兼容别名。 ### 内置搜索字段配置 `searchFields` / `search-fields` 是只读 `('label' | 'value')[]`,默认 `['label']`;多字段为 OR 匹配,大小写默认不敏感。配置 `['value', 'label']` 可同时搜索编码和名称,fieldNames 将语义字段映射到业务字段;空数组对非空查询不匹配任何项。value 采用字符串比较,不做对象深层搜索,对象值或拼音等复杂规则仍用自定义回调。自定义回调优先并自行决定大小写;远程结果使用原有关闭本地过滤协议。Cascader 保留路径语义,会检查路径各节点的配置字段。 ## 配置清空后的值 `empty-value` 指定当前组件已有清空动作的输出;省略时采用该组件默认返回。具体类型以组件 API 为准。它不改变 empty-values 的识别规则,也不改变 Form reset 的初始值。 ## 函数属性加载候选 直接传 options(query, { signal }),无需调用 useAsyncData。options 继续接收数组,显式数组(包括 [])优先。组件内部管理 loading、旧结果隔离与请求取消;load-error 通知失败,实例 refresh() 重试。业务函数可只接收 query,忽略第二参数。 filterable 表示允许输入搜索词。filterOption 只控制本地候选匹配,从不发请求。使用 options 加载函数时默认不再二次过滤远程结果;仅传数组时默认启用本地匹配。业务通常无需设置 filter-option。 ```vue ``` `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 --- Document: llms/zh-CN/components/avatar.md # Avatar 头像 用于展示用户或事物的头像,支持图片、文字、图标和头像组。 ## 基础示例 ### 基础用法 头像默认使用圆形、默认尺寸。没有图片时,可以通过默认插槽展示文字或图标;也可以直接传入图片。 Example source: src/avatar/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 尺寸与形状对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `shape` | 头像形状 | 尺寸与形状对比、颜色与边框、头像可悬停 | | `image-url` | 图片地址 | 尺寸与形状对比、头像可悬停 | | `alt` | 图片替代文本 | 尺寸与形状对比、头像可悬停 | | `bordered` | 是否显示描边 | 颜色与边框、头像可悬停 | | `size` | 头像宽高;数字为 px,字符串为 CSS 长度 | 尺寸与形状对比 | | `color` | 头像背景色 | 颜色与边框 | 先比较相同内容在各尺寸下的占位,再比较圆形和方形边界;图片适配与错误回退保持独立。
配置说明与使用限制 #### 尺寸 `size` 控制头像宽高:数字为 px,字符串为 CSS 长度(如 `3rem`)。未设置时使用 `--c-avatar-size-default`。可同时用于文字头像和图片头像。 #### 形状 `shape` 支持圆形和方形。
Example source: src/avatar/__demos__/shape-size-comparison.vue ```vue ``` ### 颜色与边框 使用 `color` 设置背景色,可传入主题色变量。`bordered` / `borderColor` 控制描边。 Example source: src/avatar/__demos__/style.vue ```vue ``` ### 头像可悬停 设置 `hoverable` 后,鼠标悬停时头像会放大,可单独使用,也可以用在头像组里。 Example source: src/avatar/__demos__/hoverable.vue ```vue ``` ## 布局与排列 ### 头像组排列与溢出 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `image-url` | 图片地址 | 头像组排列与溢出 | | `alt` | 图片替代文本 | 头像组排列与溢出 | | `bordered` | 是否显示描边 | 头像组排列与溢出 | | `color` | 头像背景色 | 头像组排列与溢出 | 比较横向和纵向头像组,观察最大数量、重叠顺序和溢出提示。
配置说明与使用限制 #### 头像组 `AvatarGroup` 会自动堆叠子头像。可以用 `bordered` 做出叠层描边,`maxCount` 将超出的头像收纳到 Popover,`maxStyle` 定制汇总头像,`zIndexAscend` 按顺序递增层级。`shape` / `size` / `offset` 会作用到组内全部子头像。 #### 纵向头像组 `vertical` 改为纵向堆叠,`offset` 控制重叠间距,数字为 px。
Example source: src/avatar/__demos__/group-comparison.vue ```vue ``` ## 内容与展示 ### 文字自适应 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `image-url` | 图片地址 | 图片头像、图片填充、加载与回退 | | `alt` | 图片替代文本 | 图片头像、图片填充、加载与回退 | | `size` | 头像宽高;数字为 px,字符串为 CSS 长度 | 图片头像、图片填充、加载与回退 | | `shape` | 头像形状 | 文字自适应、图片头像 | | `auto-fix-font-size` | 是否自动缩放过长的文字内容 | 文字自适应 | | `object-fit` | 图片填充方式 | 图片填充 | 默认会按头像宽度缩放过长文字。插槽文本更新后会重新测量;改回可容纳的短文本时恢复原始比例。将 `auto-fix-font-size` 设为 `false` 后保持原始字号。 Example source: src/avatar/__demos__/auto-fix.vue ```vue ``` ### 图片头像 使用 `imageUrl` 设置图片,并通过 `alt` 提供可访问的替代文本。也可以在默认插槽里放 `img` / `picture`,组件会按图片头像处理。 Example source: src/avatar/__demos__/image.vue ```vue ``` ### 图片填充 `objectFit` 控制图片在头像区域内的填充方式。 Example source: src/avatar/__demos__/fit.vue ```vue ``` ### 加载与回退 `lazy` 开启懒加载,`loading` 指定加载中占位图。失败时可用 `error` 占位图,或使用 `error` 插槽自定义内容。 Example source: src/avatar/__demos__/fallback.vue ```vue ``` ## 交互与控制 ### 交互图标 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `image-url` | 图片地址 | 交互图标 | | `alt` | 图片替代文本 | 交互图标 | | `size` | 头像宽高;数字为 px,字符串为 CSS 长度 | 交互图标 | | `trigger-type` | 交互图标展示方式 | 交互图标 | 使用 `trigger-icon` 插槽添加交互入口。`triggerType` 支持独立按钮(`button`)和悬浮背景层(`overlay`)两种形式;点击会触发 `click`。 Example source: src/avatar/__demos__/trigger.vue ```vue ``` ## API ### Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | shape | 头像形状 | `circle / square` | `circle` | | image-url | 图片地址 | `string` | `-` | | alt | 图片替代文本 | `string` | `''` | | size | 头像宽高;数字为 px,字符串为 CSS 长度 | `number / string` | `-` | | auto-fix-font-size | 是否自动缩放过长的文字内容 | `boolean` | `true` | | trigger-type | 交互图标展示方式 | `button / overlay` | `button` | | trigger-icon-style | 交互图标的自定义样式 | `CSSProperties` | `-` | | object-fit | 图片填充方式 | `fill / contain / cover / none / scale-down` | `cover` | | color | 头像背景色 | `string` | `-` | | bordered | 是否显示描边 | `boolean` | `false` | | border-color | 描边颜色 | `string` | `-` | | loading | 图片加载中的占位图地址 | `string` | `-` | | error | 图片加载失败的占位图地址 | `string` | `-` | | lazy | 是否懒加载图片 | `boolean` | `false` | | hoverable | 是否开启悬停放大效果 | `boolean` | `false` | ### Events | 事件 | 说明 | 参数 | | --- | --- | --- | | click | 点击头像时触发 | `(event: MouseEvent) => void` | | load | 图片加载成功触发 | `() => void` | | error | 图片加载失败触发 | `() => void` | ### Slots | 插槽 | 说明 | | --- | --- | | default | 文字、图标或图片加载中内容 | | error | 图片加载失败时的回退内容 | | trigger-icon | 头像上的交互图标 | ### Methods 无自定义公开方法。 ### AvatarGroup Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | shape | 子头像形状 | `circle / square` | `circle` | | size | 子头像宽高;数字为 px,字符串为 CSS 长度 | `number / string` | `-` | | auto-fix-font-size | 是否自动缩放子头像中的文字 | `boolean` | `true` | | max-count | 最多直接展示的头像数,`0` 表示不限 | `number` | `0` | | z-index-ascend | 头像层级是否按顺序递增 | `boolean` | `false` | | max-style | 数量汇总头像的自定义样式 | `CSSProperties` | `-` | | max-popover-props | 汇总 Popover 的属性 | `PopoverProps` | `-` | | offset | 组内头像的重叠偏移量 | `number / string` | `-` | | vertical | 是否纵向堆叠 | `boolean` | `false` | ### AvatarGroup Slots | 插槽 | 说明 | | --- | --- | | default | 头像列表 | ### 类型定义 ```ts import type { AvatarGroupInstance, AvatarGroupProps, AvatarInstance, AvatarProps, AvatarObjectFit, AvatarShape, AvatarTriggerType, } from "@cedar-design/ui"; ``` ### 样式变量 | 变量 | 默认值 | | --- | --- | | `--c-avatar-size-default` | `40px` | | `--c-avatar-font-size-text` | `20px` | | `--c-avatar-text-color` | `var(--c-sys-color-content-primary)` | | `--c-avatar-text-padding-inline` | `4px` | | `--c-avatar-bg` | `var(--c-color-fill-4)` | | `--c-avatar-border-width` | `2px` | | `--c-avatar-border-color` | `var(--c-sys-color-surface-default)` | | `--c-avatar-group-item-border` | `var(--c-sys-color-surface-default)` | | `--c-avatar-group-item-border-width` | `2px` | | `--c-avatar-group-offset` | `-10px` | | `--c-avatar-group-popover-item-spacing` | `8px` | | `--c-avatar-font-weight-text` | `500` | | `--c-avatar-circle-border-radius` | `50%` | | `--c-avatar-square-border-radius` | `4px` | | `--c-avatar-size-trigger-button` | `20px` | | `--c-avatar-trigger-button-bg` | `var(--c-color-fill-2)` | | `--c-avatar-trigger-button-bg-hover` | `var(--c-color-fill-3)` | | `--c-avatar-trigger-overlay-icon` | `var(--c-sys-color-content-on-dark)` | | `--c-avatar-trigger-overlay-bg` | `color-mix(in srgb, var(--c-color-black) 60%, transparent)` | | `--c-avatar-trigger-icon-button` | `var(--c-sys-color-content-primary)` | | `--c-avatar-spacing-trigger-button-right` | `4px` | | `--c-avatar-spacing-trigger-button-bottom` | `4px` | | `--c-avatar-size-trigger-icon` | `12px` | | `--c-avatar-trigger-button-border-radius` | `50%` | | `--c-avatar-font-size-max-count` | `20px` | | `--c-avatar-max-count-text-color` | `var(--c-sys-color-content-primary)` | | `--c-avatar-trigger-overlay-font-size` | `16px` | | `--c-avatar-hover-transform` | `scale(1.1)` | | `--c-avatar-motion-duration` | `0.2s` | | `--c-avatar-z-index-trigger` | `1` | | `--c-avatar-z-index-overlay` | `0` | | `--c-avatar-z-index-overlay-hover` | `2` | 文字、汇总数量和按钮式触发图标默认使用主要内容色;描边跟随容器表面;只有深色交互遮罩上的图标使用 `content-on-dark`。头像背景的 `fill-4`、按钮背景与 hover 阶梯、黑色半透明遮罩保留为组件视觉值。使用 `color` 属性覆盖头像背景时,应同步检查文字对比度,必要时覆盖 `text-color`。 ### 减少动态效果 内置 CSS 过渡遵循 `prefers-reduced-motion: reduce`。关闭过渡不改变最终显隐、选中/展开状态及事件语义;插槽内自定义动画由应用自行控制。 --- Document: llms/zh-CN/components/back-top.md # BackTop 回到顶部 滚动页面或指定容器的回顶按钮,支持原生键盘操作。 ## 基础示例 ### 基础用法 Example source: src/back-top/__demos__/basic.vue ```vue ``` ## 自定义与插槽 ### 自定义位置 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `target-container` | 滚动容器;省略时为页面 | 自定义位置 | | `popup-container` | 挂载容器;false 原地渲染 | 自定义位置 | | `visible-height` | 显示阈值(含边界);数字字符串按 px,不支持 CSS 单位 | 自定义位置 | | `right` | 右侧偏移;数字按 px,字符串支持 CSS 长度 | 自定义位置 | | `bottom` | 底部偏移;数字按 px,字符串支持 CSS 长度 | 自定义位置 | | `aria-label` | 无障碍名称 | 自定义位置 | Example source: src/back-top/__demos__/custom-position.vue ```vue ``` ## 交互与控制 ### 切换滚动容器 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `target-container` | 滚动容器;省略时为页面 | 切换滚动容器、自定义内容与事件 | | `popup-container` | 挂载容器;false 原地渲染 | 切换滚动容器、自定义内容与事件 | | `visible-height` | 显示阈值(含边界);数字字符串按 px,不支持 CSS 单位 | 切换滚动容器、自定义内容与事件 | | `right` | 右侧偏移;数字按 px,字符串支持 CSS 长度 | 切换滚动容器、自定义内容与事件 | | `bottom` | 底部偏移;数字按 px,字符串支持 CSS 长度 | 切换滚动容器、自定义内容与事件 | | `aria-label` | 无障碍名称 | 切换滚动容器、自定义内容与事件 | Example source: src/back-top/__demos__/container.vue ```vue ``` ### 自定义内容与事件 Example source: src/back-top/__demos__/custom.vue ```vue ``` 示例使用独立局部容器,避免多个卡片争用页面回顶按钮。不传 `target-container` 时监听页面,不自动查找滚动祖先。无效或未匹配的选择器会隐藏按钮;异步容器使用返回元素的响应式 getter。`popup-container` 只控制按钮挂载位置,不改变滚动目标。 ## 生命周期与边界 ### 调度生命周期 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `target-container` | 滚动容器;省略时为页面 | 调度生命周期 | | `popup-container` | 挂载容器;false 原地渲染 | 调度生命周期 | | `duration` | 回顶动画毫秒数,0 立即回顶 | 调度生命周期 | | `easing` | 内置曲线或输入/输出 0–1 的自定义缓动函数 | 调度生命周期 | Example source: src/back-top/__demos__/scheduler-lifecycle.vue ```vue ``` ## API ### Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | `target-container` | 滚动容器;省略时为页面 | `string \| HTMLElement \| (() => HTMLElement \| null \| undefined)` | `—` | | `popup-container` | 挂载容器;false 原地渲染 | `string \| HTMLElement \| false` | `body` | | `visible-height` | 显示阈值(含边界);数字字符串按 px,不支持 CSS 单位 | `number \| string` | `200` | | `duration` | 回顶动画毫秒数,0 立即回顶 | `number` | `200` | | `easing` | 内置曲线或输入/输出 0–1 的自定义缓动函数 | `'linear' \| 'quartOut' \| 'easeInOutCubic' \| ((progress: number) => number)` | `'quartOut'` | | `right` | 右侧偏移;数字按 px,字符串支持 CSS 长度 | `number \| string` | `—` | | `bottom` | 底部偏移;数字按 px,字符串支持 CSS 长度 | `number \| string` | `—` | | `elevation` | 阴影等级;true 为 2,false 关闭 | `boolean \| number` | `true` | | `aria-label` | 无障碍名称 | `string` | `'Back to top'` | `popup-container=false` 时按钮绝对定位,父级需 `position: relative`。重复点击替换前次动画;切换目标、KeepAlive 停用和卸载都会清理监听与动画。系统开启减少动态效果时立即回顶,不改变横向滚动位置。 ### 事件 / 插槽 / 方法 - `click(event: MouseEvent)`:每次激活通知一次。 - 默认插槽:文字、图标等非交互内容;根节点已是原生 button,不再嵌套 Button 或链接。 - `scrollToTop()`:滚动当前目标,不额外触发 click。 - 键盘:Tab 聚焦可见按钮,Enter / Space 激活;隐藏时不可聚焦。 ### 类型 ```ts import type { BackTopProps, BackTopInstance, BackTopTarget, BackTopEasing } from '@cedar-design/ui' ``` ### 样式变量 | Token | 默认值 | | --- | --- | | `--c-back-top-right` | `40px` | | `--c-back-top-bottom` | `40px` | | `--c-back-top-button-size` | `var(--c-sys-control-touch-target)` | | `--c-back-top-button-border-radius` | `50%` | | `--c-back-top-font-size` | `var(--c-sys-font-size-md)` | | `--c-back-top-icon-size` | `20px` | | `--c-back-top-background` | `var(--c-sys-color-surface-raised)` | | `--c-back-top-text-color` | `var(--c-sys-color-content-brand)` | | `--c-back-top-hover-background` | `var(--c-sys-color-state-hover)` | | `--c-back-top-focus-color` | `var(--c-sys-color-content-brand)` | | `--c-back-top-focus-width` | `2px` | | `--c-back-top-focus-offset` | `2px` | | `--c-back-top-z-index` | `var(--c-z-index-local-sticky)` | 预发布迁移:Cedar 的 `margin-right/bottom` → `right/bottom`、`button-size-width` → `button-size`、`button-size-font/icon` → `font-size/icon-size`、`button-bg/bg-hover/text-color` → `background/hover-background/text-color`(均带组件前缀)。Maple 默认动画改为 200ms,默认目标为页面。旧 BTween 任意曲线字符串改用上述枚举或函数;不保留兼容别名。 --- Document: llms/zh-CN/components/badge.md # Badge 与 Maple 使用相同场景、参数和交互顺序;示例源码仅替换组件前缀,主题与站点外壳各自保留。 ## 基础示例 ### 基础用法 Example source: src/badge/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 状态和颜色 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `content` | 徽标显示的内容 | 状态和颜色、外观配置对比 | | `status` | 徽标的状态 | 状态和颜色 | | `mode` | 徽标的类型 | 状态和颜色 | | `description` | 徽标的描述文本 | 状态和颜色 | | `color` | 徽标的背景色,也可以设置自定义色值 | 状态和颜色 | | `text-color` | 徽标显示的内容颜色 | 状态和颜色 | Example source: src/badge/__demos__/color.vue ```vue ``` ### 外观配置对比 选择一个对比维度后,同屏展示它的全部可选值;其余配置和内容保持一致。可切换其他配置检查组合效果;输入类预览共享一个值。
配置说明与使用限制 #### 外观组合 适用于通知数量和标记。调整变体、状态、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。
Example source: src/badge/__demos__/appearance-lab.vue ```vue ``` ## 布局与排列 ### 位置与偏移 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `position` | 浮动徽标在宿主盒子中的物理角落或左右中点,默认 top-right;只在 floating 模式生效,RTL 不反转 | 位置与偏移 | | `content` | 徽标显示的内容 | 位置与偏移 | | `dot` | 显示为小红点 | 位置与偏移 | | `offset-x` | 设置徽标位置的偏移X,mode为inline时无效。 | 位置与偏移 | | `offset-y` | 设置徽标位置的偏移Y。 | 位置与偏移 | | `mode` | 徽标的类型 | 位置与偏移 | Example source: src/badge/__demos__/position.vue ```vue ``` ## 内容与展示 ### 内联与独立展示 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `content` | 徽标显示的内容 | 内联与独立展示、小圆点、最大值与零值 | | `dot` | 显示为小红点 | 内联与独立展示、小圆点、显示与隐藏 | | `description` | 徽标的描述文本 | 内联与独立展示、显示与隐藏 | | `show-zero` | 徽标为0时是否显示 | 最大值与零值、显示与隐藏 | | `mode` | 徽标的类型 | 内联与独立展示 | | `inline-position` | 内联徽标位于宿主内容的逻辑 start 或 end,默认 end;仅 inline 模式生效 | 内联与独立展示 | Example source: src/badge/__demos__/inline.vue ```vue ``` ### 小圆点 Example source: src/badge/__demos__/dot.vue ```vue ``` ### 最大值与零值 Example source: src/badge/__demos__/max.vue ```vue ``` ### 显示与隐藏 Example source: src/badge/__demos__/show.vue ```vue ``` ## 自定义与插槽 ### 自定义内容 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `content` | 徽标显示的内容 | 自定义内容 | | `mode` | 徽标的类型 | 自定义内容 | | `inline-position` | 内联徽标位于宿主内容的逻辑 start 或 end,默认 end;仅 inline 模式生效 | 自定义内容 | Example source: src/badge/__demos__/content.vue ```vue ``` ## API ### Props | 参数名 | 描述 | 类型 | 默认值 | | --------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------- | :---------: | | description | 徽标的描述文本 | `string` | `-` | | content | 徽标显示的内容 | `number \| string` | `-` | | max | 徽标最大显示数值,如果content超过这个数值会显示为`${max}+`,content 为数字时有效。 | `number` | `99` | | dot | 显示为小红点 | `boolean` | `false` | | offset-x | 设置徽标位置的偏移X,mode为inline时无效。 | `number` | `0` | | offset-y | 设置徽标位置的偏移Y。 | `number` | `0` | | color | 徽标的背景色,也可以设置自定义色值 | `string` | `-` | | text-color | 徽标显示的内容颜色 | `string` | `-` | | mode | 徽标的类型 | `'floating' \| 'inline'` | `floating` | | position | 浮动徽标在宿主盒子中的物理角落或左右中点,默认 top-right;只在 floating 模式生效,RTL 不反转 | `'top-right' \| 'top-left' \| 'bottom-right' \| 'bottom-left' \| 'left' \| 'right'` | `top-right` | | inline-position | 内联徽标位于宿主内容的逻辑 start 或 end,默认 end;仅 inline 模式生效 | `'start' \| 'end'` | `end` | | size | 徽标的尺寸 | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `md` | | status | 徽标的状态 | `SemanticStatus` | `danger` | | show | 是否显示徽标 | `boolean` | `true` | | show-zero | 徽标为0时是否显示 | `boolean` | `false` | | variant | 徽标的变体 | `'outline' \| 'default'` | `default` | ### Events 无组件自定义事件。 ### Slots | 插槽名 | 说明 | 参数 | | ------- | ---------------- | ---- | | default | 徽标的描述文本 | - | | content | 徽标中显示的内容 | - | ### Methods 无公开方法。 ### 跨端说明 属性和插槽契约一致。没有 default 插槽且 description 为空时自动独立内联展示;未提供 content 时显示圆点。两端分别通过各自配置读取文字方向,主题颜色和 CSS 前缀由各端提供。 ### 样式变量 以下为组件使用的 css 变量,可以使用 [StyleProvider 组件](#/zh-CN/style-provider) 进行样式定制。 | 变量 | 默认值 | | --- | --- | | `--c-badge-font-weight` | `var(--c-sys-font-weight-medium)` | | `--c-badge-description-size-xs-font-size` | `var(--c-sys-font-size-xs)` | | `--c-badge-description-size-sm-font-size` | `var(--c-sys-font-size-xs)` | | `--c-badge-description-size-md-font-size` | `var(--c-sys-font-size-md)` | | `--c-badge-description-size-lg-font-size` | `var(--c-sys-font-size-lg)` | | `--c-badge-description-size-xl-font-size` | `var(--c-sys-font-size-xl)` | | `--c-badge-description-text-color` | `var(--c-sys-color-content-primary)` | | `--c-badge-size-xs-font-size` | `var(--c-sys-font-size-xs)` | | `--c-badge-size-sm-font-size` | `var(--c-sys-font-size-xs)` | | `--c-badge-size-md-font-size` | `var(--c-sys-font-size-xs)` | | `--c-badge-size-lg-font-size` | `var(--c-sys-font-size-md)` | | `--c-badge-size-xl-font-size` | `var(--c-sys-font-size-lg)` | | `--c-badge-size-xs-scale` | `0.6667` | | `--c-badge-size-sm-scale` | `0.8333` | | `--c-badge-size-md-scale` | `1` | | `--c-badge-size-lg-scale` | `1` | | `--c-badge-size-xl-scale` | `1` | | `--c-badge-size-xs-dot-width` | `4px` | | `--c-badge-size-sm-dot-width` | `5px` | | `--c-badge-size-md-dot-width` | `6px` | | `--c-badge-size-lg-dot-width` | `7px` | | `--c-badge-size-xl-dot-width` | `8px` | | `--c-badge-size-xs-dot-height` | `4px` | | `--c-badge-size-sm-dot-height` | `5px` | | `--c-badge-size-md-dot-height` | `6px` | | `--c-badge-size-lg-dot-height` | `7px` | | `--c-badge-size-xl-dot-height` | `8px` | | `--c-badge-size-xs-space` | `0px` | | `--c-badge-size-sm-space` | `var(--c-sys-space-1)` | | `--c-badge-size-md-space` | `var(--c-sys-space-3)` | | `--c-badge-size-lg-space` | `var(--c-sys-space-3)` | | `--c-badge-size-xl-space` | `var(--c-sys-space-4)` | | `--c-badge-size-xs-padding` | `0 var(--c-sys-space-3)` | | `--c-badge-size-sm-padding` | `0 var(--c-sys-space-3)` | | `--c-badge-size-md-padding` | `0 var(--c-sys-space-4)` | | `--c-badge-size-lg-padding` | `0 var(--c-sys-space-4)` | | `--c-badge-size-xl-padding` | `0 10px` | | `--c-badge-size-xs-height` | `20px` | | `--c-badge-size-sm-height` | `20px` | | `--c-badge-size-md-height` | `24px` | | `--c-badge-size-lg-height` | `28px` | | `--c-badge-size-xl-height` | `32px` | | `--c-badge-size-xs-border-radius` | `20px` | | `--c-badge-size-sm-border-radius` | `20px` | | `--c-badge-size-md-border-radius` | `24px` | | `--c-badge-size-lg-border-radius` | `28px` | | `--c-badge-size-xl-border-radius` | `32px` | | `--c-badge-bg-color` | `rgb(var(--c-danger-7))` | | `--c-badge-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-badge-status-default-bg-color` | `#e0e0e0` | | `--c-badge-status-default-text-color` | `var(--c-sys-color-content-on-bright)` | | `--c-badge-status-info-bg-color` | `var(--c-sys-color-status-info)` | | `--c-badge-status-info-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-badge-status-success-bg-color` | `var(--c-sys-color-status-success)` | | `--c-badge-status-success-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-badge-status-warning-bg-color` | `var(--c-sys-color-status-warning)` | | `--c-badge-status-warning-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-badge-status-danger-bg-color` | `rgb(var(--c-danger-7))` | | `--c-badge-status-danger-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-badge-status-primary-bg-color` | `var(--c-sys-color-action-primary)` | | `--c-badge-status-primary-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-badge-status-secondary-bg-color` | `rgb(var(--c-gray-6))` | | `--c-badge-status-secondary-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-badge-status-tertiary-bg-color` | `rgb(var(--c-gray-7))` | | `--c-badge-status-tertiary-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-badge-variant-outline-bg-color` | `transparent` | | `--c-badge-variant-outline-text-color` | `var(--c-sys-color-content-danger)` | | `--c-badge-variant-outline-status-info-text-color` | `var(--c-sys-color-content-info)` | | `--c-badge-variant-outline-status-success-text-color` | `var(--c-sys-color-content-success)` | | `--c-badge-variant-outline-status-warning-text-color` | `var(--c-sys-color-content-warning)` | | `--c-badge-variant-outline-status-danger-text-color` | `var(--c-sys-color-content-danger)` | | `--c-badge-variant-outline-status-primary-text-color` | `var(--c-sys-color-content-brand)` | | `--c-badge-variant-outline-status-default-text-color` | `var(--c-sys-color-content-primary)` | | `--c-badge-variant-outline-status-secondary-text-color` | `var(--c-sys-color-content-secondary)` | | `--c-badge-variant-outline-status-tertiary-text-color` | `var(--c-sys-color-content-secondary)` | | `--c-badge-border-color` | `var(--c-sys-color-surface-default)` | | `--c-badge-offset` | `2px` | | `--c-badge-ring-width` | `2px` | 填充徽标的文字配色以 Button 为准:primary、info、success、warning、danger、secondary 使用 `content-on-dark`;tertiary 在亮色使用 `content-on-dark`,暗色使用 `content-on-bright`。默认通知徽标使用红底白字,中性背景 `#e0e0e0` 为固定浅灰色。 彩色轮廓文字和描边与 Button 一致,使用对应的 `content-brand` / `content-info` / `content-success` / `content-warning` / `content-danger` 语义色;secondary 与 tertiary 轮廓均使用 `content-secondary` 保持可读性。`variant-outline-bg-color` 对所有状态均生效,默认透明。`color` 属性覆盖轮廓文字和描边,`text-color` 进一步覆盖文字;二者均保留背景变量的控制权。自定义前景或背景后须重新验证对比度。 ### 类型定义 组件导出以下类型定义 ```ts import type { BadgeInstance } from '@cedar-design/ui' ``` ### 颜色覆盖边界 bg-color 兜底和 danger 填充均使用红色背景与白色文字:浅色主题为 danger 第 7 阶,暗色主题为第 4 阶。中性固定浅灰与 secondary/tertiary 灰阶是有意的组件配色;border-color 隔离环可按宿主表面覆盖。自定义 color/text-color 由调用方保证对比度。 --- Document: llms/zh-CN/components/breadcrumb.md # Breadcrumb 面包屑是辅助导航模式,用于识别页面在层次结构内的位置,并根据需要向上返回。 当前位置(最后一级)默认使用主文字色,不额外加粗,并标记 `aria-current="page"`。纯文本无点击反馈;配置 `href` 的链接、绑定 `@click` 的操作和下拉入口显示品牌色、手型及悬停 / 按下反馈,键盘聚焦时显示焦点轮廓。`@click` 操作支持 Enter 和空格。最后一级通常保持纯文本;显式提供链接或操作时仍可交互。 触屏设备上,可点击项的触摸区域至少为 44 × 44px;按下显示底色和下划线,松手后恢复,不保留鼠标悬停效果。省略图标支持点击查看隐藏路径。 ## 基础示例 ### 基本用法 面包屑的基本用法 Example source: src/breadcrumb/__demos__/basic.vue ```vue ``` ## 内容与展示 ### 参数化配置 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `routes` | 设置路径 | 参数化配置、带有下拉菜单、显示省略 | | `max-count` | 最多展示的正常面包屑项数量,不包含 more(0 表示不限制) | 显示省略 | 通过`routes`来传递面包屑数据。若是要自定义面包屑的话,建议使用`BreadcrumbItem` 组件默认仅为前面的层级渲染链接,最后一级保持文本;可通过 `item-render` 插槽自定义渲染。 Example source: src/breadcrumb/__demos__/routes.vue ```vue ``` ### 带有下拉菜单 通过`droplist`或者`routes`来指定下拉菜单。 Example source: src/breadcrumb/__demos__/droplist.vue ```vue ``` ### 显示省略 通过`max-count`来指定面包屑的最多渲染数量,超出的部分将显示为省略号 Example source: src/breadcrumb/__demos__/max-count.vue ```vue ``` ### 链接与点击 对比纯文本、`href` 链接和 `@click` 操作。点击后下方显示选择结果;最后一级默认保持纯文本。省略项不会触发 `click`。 Example source: src/breadcrumb/__demos__/link.vue ```vue ``` ## 自定义与插槽 ### 自定义分隔符 通过`separator`属性或插槽自定义分隔符,面包屑子项也可通过`separator`属性或插槽自定义分隔符,且优先级高于父项。 Example source: src/breadcrumb/__demos__/custom-split.vue ```vue ``` ### 自定义图标 可以在内容中使用自定义图标 Example source: src/breadcrumb/__demos__/custom-icon.vue ```vue ``` ## API ### Breadcrumb Props | 属性 | 说明 | 类型 | 默认值 | | --------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ------ | | max-count | 最多展示的正常面包屑项数量,不包含 more(0 表示不限制) | `number` | `0` | | routes | 设置路径 | `BreadcrumbRoute[]` | `-` | | separator | 分隔符文字 | `string \| number` | `/` | ### Breadcrumb Slots | 插槽名 | 说明 | 参数 | | ----------- | ---------------------------------- | --------------------------------------------------------------------------- | | more-icon | 自定义更多图标 | `omittedItems` `count` `start` `end` | | item-render | routes设置时生效,自定义渲染面包屑 | `route:BreadcrumbRoute`
`routes:BreadcrumbRoute[]`
`paths:string[]` | | separator | 自定义分隔符 | `-` | ### BreadcrumbItem Props | 属性 | 说明 | 类型 | 默认值 | | -------------- | ------------ | ----------------------------- | ------ | | separator | 分隔符文字 | `string \| number` | `-` | | href | 跳转链接 | `string` | `-` | | droplist | 下拉菜单内容 | `BreadcrumbRoute['children']` | `-` | | dropdown-props | 下拉菜单属性 | `MenuProps` | `-` | ### BreadcrumbItem Events | 事件名 | 说明 | 参数 | | ------ | -------- | -------------- | | click | 点击事件(省略项不触发) | `event: MouseEvent` | | select | 选择内置下拉项时触发 | `route: BreadcrumbRoute, event?: Event` | ### BreadcrumbItem Slots | 插槽名 | 说明 | 参数 | | --------- | -------------- | ---- | | droplist | 自定义下拉菜单 | `-` | | separator | 自定义分隔符 | `-` | ### BreadcrumbRoute | 参数名 | 描述 | 类型 | 默认值 | | -------- | ------------------------- | ------------------------------ | ------ | | label | 面包屑名称 | `string` | `-` | | path | 跳转路径(`a`标签的`href`) | `string` | | children | 下拉菜单展示项 | `{label:string,path:string}[]` | `-` | ## 类型定义 组件导出以下类型定义 ```ts import type { BreadcrumbProps, BreadcrumbItemProps, BreadcrumbRoute } from '@cedar-design/ui' ``` ## 同源实现与平台边界 Breadcrumb 与 BreadcrumbItem 在 Cedar / Maple 中独立复制维护,主体、Props、上下文、类型、关键样式及配对测试纳入 `design-ui/bin/copied-components-check.mjs`。图标、安装入口、菜单实现和主题 token 由各库本地提供。 - 非空 `routes` 优先于默认插槽;空数组回退到插槽。默认路由渲染仅前面的项目带链接,最后一项标记 `aria-current="page"`;`item-render` 自行控制链接。 - 分隔符优先级:子项插槽 → 子项属性 → 父级插槽 → 父级属性;支持 `0` 和空字符串。 - `max-count` 沿用现有边界:总数大于 `max-count + 1` 才折叠;保留首项和尾部项目,省略位置不触发原项的点击、链接或下拉菜单。 - 内置下拉选择派发 `select(route, event)`。动态增删、重排及 SSR 会同步计算索引和分隔符。 - Cedar 项内容新增 `__content` 包装,属性透传到该内容节点;Maple 原有主题变量继续通过 token 映射生效。 --- Document: llms/zh-CN/components/button.md Button 的禁用配色按变体区分:彩色实心使用淡化状态背景;text/outline 保持透明背景并淡化状态文字;tonal 保留浅色背景。中性按钮使用中性禁用色。禁用时暂停 color/text-color 覆盖,关闭 hover/active 反馈和阴影。 # Button 两端使用同一份实现和示例,组件前缀、主题基础变量与注册入口各自保留。 ## 基础示例 ### 八种主题色 Example source: src/button/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 变体、状态与尺寸 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `variant` | 外观;省略时继承按钮组,否则 default | 变体、状态与尺寸、自定义颜色 | | `size` | 尺寸;省略时继承按钮组,否则 md | 变体、状态与尺寸、五档尺寸 | | `status` | 主题色;省略时继承按钮组,否则 default | 变体、状态与尺寸 | | `disabled` | 禁用;省略时继承按钮组,显式 false 可覆盖 | 禁用与链接拦截 | | `component` | 根标签,链接属性通过 attrs 传入 | 禁用与链接拦截 | | `loading` | 加载状态,禁止点击和链接跳转 | 禁用与链接拦截 | 选择变体和尺寸,同时对比八种状态色。实心适合主要操作,text 和 outline 适合次要操作;可切换卡片背景,对照透明按钮在不同背景上的表现。 变体、尺寸和背景选项较少,使用按钮式 RadioGroup 直接展示;Form/FormItem 提供标准字段布局,Card 承载背景对照。 Example source: src/button/__demos__/variants.vue ```vue ``` ### 五档尺寸 同一平台的水平 Button 与 Input 默认按相同 size 对齐高度和字号。Cedar 高度为 24/28/32/36/44px,Maple 为 32/40/48/56/64px;按钮单侧内边距为 8/12/16/20/24px,图标与文字间距为 6px。堆叠按钮使用独立的内容高度规则。组件局部样式覆盖仍各自生效。 Example source: src/button/__demos__/size.vue ```vue ``` ### 禁用与链接拦截 Example source: src/button/__demos__/disabled.vue ```vue ``` ### 自定义颜色 Example source: src/button/__demos__/custom-color.vue ```vue ``` ## 图标与布局 ### 图标与图文布局 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `status` | 主题色;省略时继承按钮组,否则 default | 图标与图文布局 | | `variant` | 外观;省略时继承按钮组,否则 default | 图标与图文布局 | | `size` | 尺寸;省略时继承按钮组,否则 md | 图标与图文布局 | | `stacked` | 图标文字纵向排列;省略时继承按钮组 | 图标与图文布局 | | `round` | 圆形按钮 | 图标与图文布局 | | `block` | 占满可用宽度 | 块级按钮 | 使用内置图标,切换四种变体和五档尺寸,对比纯图标、横排图文、上下堆叠。堆叠按钮按内容撑高,上下至少保留 8px 内边距。纯图标只传 icon 插槽;round 控制圆形,stacked 控制上下排列。 Example source: src/button/__demos__/icons.vue ```vue ``` ### 块级按钮 Example source: src/button/__demos__/block.vue ```vue ``` ## 按钮组 ### 按钮组继承与覆盖 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `status` | 主题色;省略时继承按钮组,否则 default | 按钮组继承与覆盖 | | `disabled` | 禁用;省略时继承按钮组,显式 false 可覆盖 | 按钮组继承与覆盖 | | `loading` | 加载状态,禁止点击和链接跳转 | 按钮组图文与加载 | 切换组尺寸和禁用状态,观察子按钮继承配置。子按钮可独立覆盖状态色,显式 disabled=false 可覆盖组禁用。 Example source: src/button/__demos__/button-group.vue ```vue ``` ### 按钮组布局 切换 Mixed variants,让中间操作使用 text 外观,对照横向与纵向的接缝。 在水平和垂直排列中比较变体和尺寸。尺寸、变体与排列方向共同组成三个外观维度。 Example source: src/button/__demos__/button-group-layout.vue ```vue ``` ### 按钮组图文与加载 切换图文堆叠和排列方向,再启用第一个按钮的加载状态;其他操作仍可独立使用。竖向按钮组的横排图文按起始边对齐,避免文字长度不同导致图标错位。 Example source: src/button/__demos__/button-group-content.vue ```vue ``` ## 表单与事件 ### 表单控件尺寸对照 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `size` | 尺寸;省略时继承按钮组,否则 md | 表单控件尺寸对照 | | `variant` | 外观;省略时继承按钮组,否则 default | 表单控件尺寸对照 | | `html-type` | 原生按钮类型 | 原生表单、焦点与触摸事件 | | `focusable` | 允许 Tab 顺序聚焦;不影响通过代码聚焦 | 原生表单、焦点与触摸事件 | 切换五档 size 和三种字段变体,比较 Input、Button、Select、日期时间及其他单行表单控件的高度。Button 在这里固定使用 outline。DatePicker/TimePicker 是面板,此处使用带输入框的 Date/Time 字段。示例同时展示有值、可清空、标签删除与长标签多选;Select/Cascader 设置 tag-nowrap 时保持同档高度,长标签文字省略、删除图标保留;标签行可横向滚动,清空按钮和箭头固定在外侧。被省略的标签正文支持悬停、键盘聚焦或点按查看完整文字,点外部或按 Esc 关闭,不改变选中值。可清空后恢复选中值重复比较。多行文本和允许换行的多选内容按内容撑高。 Example source: src/field-decorator/__demos__/control-sizes.vue ```vue ``` ### 原生表单、焦点与触摸事件 Example source: src/button/__demos__/native-events.vue ```vue ``` ## 加载与操作反馈 ### 加载动画、布局与尺寸 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `loading` | 加载状态,禁止点击和链接跳转 | 加载动画、布局与尺寸、加载指示器样式 | | `loading-size` | 指示器尺寸;xs/sm/md/lg/xl 对应 12/14/16/18/20px,数字为 px;省略时跟随按钮尺寸,line 模式不适用 | 加载动画、布局与尺寸、加载指示器样式 | | `loading-type` | 加载动画;与 Loading 的 type 相同,line 模式不适用 | 加载动画、布局与尺寸 | | `loading-mode` | 行内、覆盖或底部进度线;line 只使用 loading-color | 加载动画、布局与尺寸 | | `loading-color` | 加载指示器颜色 | 加载指示器样式 | | `ripple` | 点击水波 | 水波与阴影反馈 | 选择加载布局和指示器尺寸,对比五种动画。加载时按钮保留文案并阻止重复操作。 Example source: src/button/__demos__/loading.vue ```vue ``` ### 加载指示器样式 Example source: src/button/__demos__/loading-appearance.vue ```vue ``` ### 水波与阴影反馈 点击按钮观察水波,调整阴影等级比较层次感。关闭水波不会影响点击事件。 Example source: src/button/__demos__/feedback.vue ```vue ``` ### 受控加载与失败恢复 Example source: src/button/__demos__/controlled-loading.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换和局部覆盖。图标与内容按阅读顺序排列,stacked 仍由上到下排列,不整体镜像插槽图形。ButtonGroup 的横向排列、拼接边框与首尾圆角由组方向决定,子按钮可以单独设置文字方向;单个按钮保留完整圆角,纵向组保持上下顺序。使用原生 Tab、Enter、Space 操作,普通按钮组不额外接管左右键;禁用和加载规则保持不变。 ## API ### Props | 属性 | 说明 | 类型 | 默认值 | | ------------- | ------------------------------------------------------------------------------------------------ | ----------------------------------------- | -------------- | | status | 主题色;省略时继承按钮组,否则 default | `SemanticStatus` | `undefined` | | variant | 外观;省略时继承按钮组,否则 default | `default / text / outline / tonal` | `undefined` | | size | 尺寸;省略时继承按钮组,否则 md | `xs / sm / md / lg / xl` | `undefined` | | html-type | 原生按钮类型 | `button / submit / reset` | `button` | | component | 根标签,链接属性通过 attrs 传入 | `button / a` | `button` | | round | 圆形按钮 | `boolean` | `false` | | block | 占满可用宽度 | `boolean` | `false` | | loading | 加载状态,禁止点击和链接跳转 | `boolean` | `false` | | loading-type | 加载动画;与 Loading 的 type 相同,line 模式不适用 | `circle / wave / cube / rect / disappear` | `circle` | | loading-mode | 行内、覆盖或底部进度线;line 只使用 loading-color | `default / fill / line` | `default` | | loading-size | 指示器尺寸;xs/sm/md/lg/xl 对应 12/14/16/18/20px,数字为 px;省略时跟随按钮尺寸,line 模式不适用 | `ComponentSize / number` | `undefined` | | loading-color | 加载指示器颜色 | `string` | `currentColor` | | disabled | 禁用;省略时继承按钮组,显式 false 可覆盖 | `boolean` | `undefined` | | ripple | 点击水波 | `boolean` | `true` | | focusable | 允许 Tab 顺序聚焦;不影响通过代码聚焦 | `boolean` | `true` | | autofocus | 原生自动聚焦 | `boolean` | `false` | | text-color | 自定义文字色 | `string` | `undefined` | | color | 自定义背景/变体基色 | `string` | `undefined` | | elevation | default 变体阴影;true 为 2,false 关闭,数字四舍五入并限制 0~24;组内由组控制 | `boolean / number` | `true` | | stacked | 图标文字纵向排列;省略时继承按钮组 | `boolean` | `undefined` | ### Events | 事件 | 参数与行为 | | ---------- | ------------------------------------------- | | click | `(event: MouseEvent) => void` | | touchstart | `(event: TouchEvent) => void` | click 是普通事件通知,支持 async 回调;loading 由业务状态控制,建议在 finally 中恢复。事件监听器的 Promise 不会自动驱动加载。禁用/加载链接移除有效 href。 ### Slots | 插槽 | 说明 | 参数 | | ------- | -------------------------------- | ---- | | default | 按钮内容;加载时保留 | — | | icon | 前置图标;stacked 时位于文字上方 | — | ### Methods 无自定义公开方法。 ## ButtonGroup ### ButtonGroup Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | status | 子按钮默认语义状态;子按钮可覆盖 | SemanticStatus | default | | size | 子按钮默认尺寸;子按钮可覆盖 | xs / sm / md / lg / xl | md | | variant | 子按钮默认外观;相邻按钮按生效变体拼接,允许混合 | default / text / outline / tonal | default | | color | 子按钮默认自定义色;子按钮可覆盖 | string | undefined | | text-color | 子按钮默认文字色;子按钮可覆盖 | string | undefined | | disabled | 子按钮默认禁用状态;显式 false 可覆盖组 true | boolean | false | | stacked | 默认图文纵排;子按钮可显式 false 覆盖 | boolean | false | | vertical | 按钮组纵向排列,独立于按钮内部 stacked | boolean | false | | elevation | 组整体阴影;true 为 2,数值归一化到 0–24;仅 default 变体且组未禁用时生效 | boolean / number | true | 根元素默认 `role="group"`;使用 `aria-label` 或 `aria-labelledby` 为需要命名的操作组提供名称。原生属性可覆盖 role,普通按钮组仍使用 Tab / Enter / Space,不自动接管方向键。 **继承边界:** status、size、variant、color、text-color、disabled、stacked 按子按钮显式值优先。elevation 始终由组管理,子按钮自己的 elevation 不生效。嵌套组使用最近组的配置和默认值,不自动叠加外层禁用。 ### ButtonGroup Events 无自定义事件。`@click` 是根元素的原生事件透传,可以接收后代冒泡;各操作继续监听对应 Button 的 click。组不收集事件 Promise,也不管理任务或选中值。 ### ButtonGroup Slots | 插槽 | 说明 | 参数 | | --- | --- | --- | | default | 连体样式支持组根元素下直接相邻的 Button DOM 节点 | — | **组合边界:** 额外的 DOM 包装层、前后文本和其他控件不属于连体外观契约。包装层内的按钮仍可能继承配置,但不会获得相同拼接效果。组接管首尾圆角,不保留独立 round 按钮的圆形外观。需要分离排列或任意内容混排时组合 Space;较窄区域由业务选择滚动、缩短文案或切换纵向,不自动换行。 ### ButtonGroup Expose | 名称 | 说明 | | --- | --- | | buttonGroupProvider | 响应式组配置对象,各字段为只读 ComputedRef;elevation 为 boolean / number,其余字段与 Props 对齐 | 无额外的组级动作方法。 ## 类型 ButtonProps、ButtonVariant、ButtonLoadingMode、ButtonInstance、ButtonGroupProps、ButtonGroupInstance。 ## CSS 变量职责与完整默认值 Button 保留 58 个外观变量。`{status}-color` 控制实心背景,`{status}-foreground-color` 控制 text/outline/tonal 的文字和图标,`{status}-tonal-color` 控制浅色背景。语义状态共用 `solid-text-color` 和 `solid-state-layer-color`;default/tertiary 前景与 primary/tertiary 状态层保留必要的主题差异。 尺寸统一使用 xs/sm/md/lg/xl。字号、过渡时长、焦点宽度与偏移、堆叠高度增量直接复用系统变量;按钮组与堆叠圆角共用 border-radius。四个状态透明度变量保留 hover/active 的差异。loading-duration 仅控制底部进度线;其他加载动画由 Loading 负责。内部变量与固定动画几何细节不再作为公共定制项。 | 变量名 | 默认值 | | --------------------------------------- | ----------------------------------------- | | `--c-button-border-radius` | `var(--c-sys-radius-md)` | | `--c-button-content-gap` | `var(--c-sys-space-3)` | | `--c-button-danger-color` | `var(--c-sys-color-status-danger)` | | `--c-button-danger-disabled-color` | `rgb(var(--c-danger-3))` | | `--c-button-danger-foreground-color` | `var(--c-sys-color-content-danger)` | | `--c-button-danger-tonal-color` | `rgb(var(--c-danger-1))` | | `--c-button-default-color` | `var(--c-sys-color-surface-default)` | | `--c-button-default-foreground-color` | `var(--c-sys-color-content-primary)` | | `--c-button-default-tonal-color` | `var(--c-sys-color-surface-muted)` | | `--c-button-disabled-color` | `var(--c-color-fill-2)` | | `--c-button-disabled-solid-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-button-disabled-text-color` | `var(--c-sys-color-content-disabled)` | | `--c-button-focus-color` | `var(--c-sys-color-content-brand)` | | `--c-button-info-color` | `var(--c-sys-color-status-info)` | | `--c-button-info-disabled-color` | `rgb(var(--c-blue-3))` | | `--c-button-info-foreground-color` | `var(--c-sys-color-content-info)` | | `--c-button-info-tonal-color` | `rgb(var(--c-blue-1))` | | `--c-button-lg-height` | `36px` | | `--c-button-lg-padding` | `0 var(--c-sys-space-7)` | | `--c-button-loading-duration` | `1s` | | `--c-button-loading-line-height` | `3px` | | `--c-button-md-height` | `32px` | | `--c-button-md-padding` | `0 var(--c-sys-space-6)` | | `--c-button-plain-state-opacity-active` | `1` | | `--c-button-plain-state-opacity-hover` | `0.5` | | `--c-button-primary-color` | `var(--c-sys-color-action-primary)` | | `--c-button-primary-disabled-color` | `rgb(var(--c-primary-3))` | | `--c-button-primary-foreground-color` | `var(--c-sys-color-content-brand)` | | `--c-button-primary-state-layer-color` | `var(--c-button-solid-state-layer-color)` | | `--c-button-primary-tonal-color` | `rgb(var(--c-primary-1))` | | `--c-button-secondary-color` | `rgb(var(--c-gray-6))` | | `--c-button-secondary-foreground-color` | `var(--c-sys-color-content-secondary)` | | `--c-button-secondary-tonal-color` | `rgb(var(--c-gray-2))` | | `--c-button-sm-height` | `28px` | | `--c-button-sm-padding` | `0 var(--c-sys-space-5)` | | `--c-button-solid-state-layer-color` | `var(--c-sys-color-content-on-dark)` | | `--c-button-solid-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-button-stacked-gap` | `var(--c-sys-space-2)` | | `--c-button-state-layer-color` | `var(--c-sys-color-surface-page)` | | `--c-button-state-opacity-active` | `0.12` | | `--c-button-state-opacity-hover` | `0.08` | | `--c-button-success-color` | `var(--c-sys-color-status-success)` | | `--c-button-success-disabled-color` | `rgb(var(--c-success-3))` | | `--c-button-success-foreground-color` | `var(--c-sys-color-content-success)` | | `--c-button-success-tonal-color` | `rgb(var(--c-success-1))` | | `--c-button-tertiary-color` | `rgb(var(--c-gray-7))` | | `--c-button-tertiary-foreground-color` | `var(--c-sys-color-content-secondary)` | | `--c-button-tertiary-state-layer-color` | `var(--c-sys-color-content-on-bright)` | | `--c-button-tertiary-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-button-tertiary-tonal-color` | `rgb(var(--c-gray-1))` | | `--c-button-warning-color` | `var(--c-sys-color-status-warning)` | | `--c-button-warning-disabled-color` | `rgb(var(--c-warning-3))` | | `--c-button-warning-foreground-color` | `var(--c-sys-color-content-warning)` | | `--c-button-warning-tonal-color` | `rgb(var(--c-warning-1))` | | `--c-button-xl-height` | `44px` | | `--c-button-xl-padding` | `0 var(--c-sys-space-8)` | | `--c-button-xs-height` | `24px` | | `--c-button-xs-padding` | `0 var(--c-sys-space-4)` | --- Document: llms/zh-CN/components/calendar.md # Calendar 用于展示月历或年历,并支持单日期选择、自定义日期内容和受控状态。表单中的日期输入请使用 Date,带选择面板的复杂选择请使用 DatePicker,日程编排请使用 Scheduler。 ## 基础示例 ### 基础用法 展示并选择日期。 Example source: src/calendar/__demos__/basic.vue ```vue ``` ## 视图与日期展示 ### 月视图与年视图 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `mode` | 模式 | 月视图与年视图 | | `modes` | 显示的模式 | 月视图与年视图 | | `day-start-of-week` | 一周开始日 | 一周起始与周序号 | | `is-week` | 是否显示周序号 | 一周起始与周序号 | 使用 `mode` 控制视图。未传入 `mode` 时,也可以通过头部的模式切换器改变内部视图。 Example source: src/calendar/__demos__/modes.vue ```vue ``` ### 一周起始与周序号 `day-start-of-week` 控制星期排列,`is-week` 在日期前显示周序号。 Example source: src/calendar/__demos__/week-options.vue ```vue ``` ## 交互与内容定制 ### 受控状态与事件 通过 `v-model` 从外部设置日期,并通过 `change`、`panel-change` 区分日期选择和面板翻页。 Example source: src/calendar/__demos__/controlled.vue ```vue ``` ### 自定义日期单元格 默认插槽可在日期数字下方展示标记、摘要等轻量内容。点击自定义内容所在单元格仍会选择日期。 Example source: src/calendar/__demos__/custom-cell.vue ```vue ``` ### 自定义头部标题 `header` 插槽替换中间标题,上一页、下一页、今天和模式切换仍由 Calendar 管理。 Example source: src/calendar/__demos__/custom-header.vue ```vue ``` ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------------------------- | -------------------- | ----------------------- | :-----------------: | | model-value **(v-model)** | 绑定值 | `date` | `-` | | default-value | 默认值(非受控状态) | `date` | `-` | | mode | 模式 | `'month' \| 'year'` | `-` | | default-mode | 默认模式 | `'month' \| 'year'` | `'month'` | | modes | 显示的模式 | `('month' \| 'year')[]` | `['month', 'year']` | | day-start-of-week | 一周开始日 | `0 \| 1` | `0` | | is-week | 是否显示周序号 | `boolean` | `false` | ### `` Events | 事件名 | 描述 | 参数 | | ------------ | -------------------- | ------------ | | change | 选择的日期改变时触发 | date: `Date` | | panel-change | 日期面板改变时触发 | date: `Date` | ### `` Slots | 插槽名 | 描述 | 参数 | 版本 | | ------- | :--------------: | --------------------------------------------------- | :----- | | header | 自定义头部内容 | year: `number`
month: `number` | 2.53.0 | | default | 自定义单元格内容 | year: `number`
month: `number`
date: `number` | 2.53.0 | ### 类型定义 组件导出以下类型定义 ```ts import type { CalendarInstance } from "@cedar-design/ui"; ``` --- Document: llms/zh-CN/components/card.md # Card ## 基础示例 ### 基础用法与副标题 Example source: src/card/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 外观配置对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `title` | 标题 | 外观配置对比、悬浮样式 | | `description` | 描述 | 外观配置对比 | | `hoverable` | 悬浮样式 | 悬浮样式 | 选择一个对比维度后,同屏展示它的全部可选值;其余配置和内容保持一致。可切换其他配置检查组合效果;输入类预览共享一个值。
配置说明与使用限制 #### 外观组合 适用于信息分组和内容层次。调整变体、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。
Example source: src/card/__demos__/appearance-lab.vue ```vue ``` ### 悬浮样式 Example source: src/card/__demos__/hoverable.vue ```vue ``` ## 布局与排列 ### 图片与三种布局 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `direction` | 封面与正文的排列顺序,默认 column;支持 row、column、row-reverse,不表示卡片自身位置 | 图片与三种布局 | | `title` | 标题 | 图片与三种布局 | | `src` | 封面图片地址;cover 插槽优先 | 图片与三种布局 | | `alt` | 封面图片替代文本 | 图片与三种布局 | | `image-height` | 封面图片高度,数字单位为 px | 图片与三种布局 | | `image-width` | 封面图片宽度,数字单位为 px | 图片与三种布局 | Example source: src/card/__demos__/image.vue ```vue ``` ## 内容与展示 ### 长标题与提示 Example source: src/card/__demos__/tooltip.vue ```vue ``` ## 自定义与插槽 ### 自定义标题区域 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `title` | 标题 | 自定义标题区域 | | `top-divider` | 上分割线 | 内容插槽 | | `bottom-divider` | 下分割线 | 内容插槽 | Example source: src/card/__demos__/no-padding.vue ```vue ``` ### 内容插槽 Example source: src/card/__demos__/slots.vue ```vue ``` ## 交互与控制 ### 水波与点击事件 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `title` | 标题 | 水波与点击事件、全屏展开与关闭 | | `ripple` | 点击水波 | 水波与点击事件 | | `floating` | 全屏展开状态,支持 v-model:floating | 全屏展开与关闭 | | `floating-duration` | 全屏展开与关闭动画时长,单位 ms | 全屏展开与关闭 | Example source: src/card/__demos__/ripple.vue ```vue ``` ### 全屏展开与关闭 Example source: src/card/__demos__/floating.vue ```vue ``` 长标题示例通过插槽内的 CSS 和原生 `title` 提供提示;Card 本身没有 `ellipsis` / `tooltip` 属性。 ## 生命周期与边界 ### Floating scheduler lifecycle / 浮起调度生命周期 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `floating` | 全屏展开状态,支持 v-model:floating | Floating scheduler lifecycle / 浮起调度生命周期 | | `ripple` | 点击水波 | Floating scheduler lifecycle / 浮起调度生命周期 | | `floating-duration` | 全屏展开与关闭动画时长,单位 ms | Floating scheduler lifecycle / 浮起调度生命周期 | | `title` | 标题 | Floating scheduler lifecycle / 浮起调度生命周期 | Example source: src/card/__demos__/scheduler-lifecycle.vue ```vue ``` 与 Maple 使用相同场景、参数和交互顺序;示例源码仅替换组件前缀,主题与站点外壳各自保留。 ## 阅读方向 标题、内容和操作沿阅读顺序排列,默认浮动操作位于阅读终点,不镜像图片或自定义插槽。 ## API ### Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | variant | 卡片外观 | `default / outline / tonal` | `default` | | size | 内容密度;省略时按平台规则回退,见下方说明 | `sm / md` | `undefined` | | direction | 封面与正文的排列顺序,默认 column;支持 row、column、row-reverse,不表示卡片自身位置 | `row / column / row-reverse` | `column` | | hoverable | 悬浮样式 | `boolean` | `false` | | title-style | 标题行样式 | `CSSProperties` | `undefined` | | title | 标题 | `string` | `undefined` | | subtitle | 副标题 | `string` | `undefined` | | description | 描述 | `string` | `undefined` | | top-divider | 上分割线 | `boolean` | `false` | | bottom-divider | 下分割线 | `boolean` | `false` | | src | 封面图片地址;cover 插槽优先 | `string` | `undefined` | | fit | 封面图片填充方式 | `fill / contain / cover / none / scale-down` | `cover` | | image-height | 封面图片高度,数字单位为 px | `string / number` | `undefined` | | image-width | 封面图片宽度,数字单位为 px | `string / number` | `undefined` | | alt | 封面图片替代文本 | `string` | `undefined` | | elevation | default 变体阴影;true 为等级 1,false 为无阴影,数字范围 0~24 | `boolean / number` | `true` | | ripple | 点击水波 | `boolean` | `false` | | floating | 全屏展开状态,支持 v-model:floating | `boolean` | `false` | | floating-duration | 全屏展开与关闭动画时长,单位 ms | `number` | `250` | ### Events | 事件 | 参数与时机 | | --- | --- | | click | `(event: Event)`,点击卡片时触发 | | update:floating | `(value: boolean)`,内置关闭按钮请求关闭时发送 false;展开由父级设置 | ### Slots | 插槽 | 说明 | 参数 | | --- | --- | --- | | default | 正文 | — | | cover | 封面,覆盖 src 图片 | — | | header | 整个标题区域,覆盖 title、title-action 和 subtitle | — | | title | 标题 | `{ slotClass: string }` | | title-action | 标题右侧操作 | — | | subtitle | 副标题 | `{ slotClass: string }` | | description | 描述 | `{ slotClass: string }` | | footer | 底部操作 | — | | floating-content | 全屏扩展内容,仅 column 布局渲染 | — | | close-button | 自定义关闭按钮;需自行更新 floating | — | ### Methods 无公开方法。 ### 跨端说明 属性、事件参数及插槽契约一致。Cedar 省略 size 时继承全局尺寸(xs/sm 映射 sm,其余映射 md);Maple 回退 md。需要一致密度时显式传入 size。主题和 CSS 前缀分别使用各端配置。 Card 不再提供 loading 属性;加载遮罩使用 Loading 指令组合。 ### `` CSS 变量 | 变量名 | 默认值 | | --- | --- | | `--c-card-hover-shadow` | `0 4px 12px rgb(0 0 0 / 12%)` | | `--c-card-size-sm-title-font-size` | `16px` | | `--c-card-size-sm-section-margin` | `8px 0 0` | | `--c-card-size-sm-section-padding` | `0 12px` | | `--c-card-padding` | `0 0 15px 0` | | `--c-card-background` | `var(--c-sys-color-surface-default)` | | `--c-card-filled-background` | `var(--c-sys-color-surface-muted)` | | `--c-card-outline-color` | `var(--c-sys-color-border-default)` | | `--c-card-border-radius` | `4px` | | `--c-card-image-width` | `100%` | | `--c-card-row-image-width` | `140px` | | `--c-card-image-height` | `200px` | | `--c-card-row-height` | `140px` | | `--c-card-title-color` | `var(--c-sys-color-content-primary)` | | `--c-card-title-font-size` | `20px` | | `--c-card-title-padding` | `0 12px` | | `--c-card-title-margin` | `15px 0 0 0` | | `--c-card-title-row-margin` | `12px 0` | | `--c-card-content-padding` | `0 16px` | | `--c-card-content-margin` | `16px 0 0 0` | | `--c-card-content-color` | `var(--c-sys-color-content-tertiary)` | | `--c-card-content-font-size` | `14px` | | `--c-card-content-row-margin` | `16px 0 0 0` | | `--c-card-subtitle-color` | `var(--c-sys-color-content-secondary)` | | `--c-card-subtitle-font-size` | `14px` | | `--c-card-subtitle-padding` | `0 12px` | | `--c-card-subtitle-margin` | `10px 0 0 0` | | `--c-card-subtitle-row-margin` | `-8px 0 0 0` | | `--c-card-description-color` | `var(--c-sys-color-content-secondary)` | | `--c-card-description-font-size` | `14px` | | `--c-card-description-margin` | `20px 0 0 0` | | `--c-card-description-padding` | `0 13px` | | `--c-card-footer-padding` | `0 12px` | | `--c-card-footer-right` | `13px` | | `--c-card-footer-bottom` | `9px` | | `--c-card-footer-margin` | `30px 0 0 0` | | `--c-card-line-height` | `22px` | | `--c-card-row-line-height` | `1.5` | | `--c-card-floating-buttons-bottom` | `16px` | | `--c-card-floating-buttons-right` | `16px` | | `--c-card-floating-buttons-color` | `var(--c-sys-color-content-primary)` | | `--c-card-close-button-icon-size` | `24px` | | `--c-card-close-button-size` | `56px` | | `--c-card-close-button-background` | `#212121` | | `--c-card-close-button-text-color` | `var(--c-sys-color-content-on-dark)` | | `--c-card-close-button-border-radius` | `50%` | Card 主体颜色按 system 语义分层:普通背景、filled 背景和描边分别使用 `surface-default`、`surface-muted`、`border-default`;标题、正文、辅助文字分别使用 `content-primary`、`content-tertiary`、`content-secondary`。展开后的悬浮按钮容器位于卡片表面,使用 `content-primary`;深色关闭按钮上的文字与图标使用 `content-on-dark`。关闭按钮背景 `#212121` 是 Card 专属值,并非全局主操作色。旧变量名的迁移关系见 Design Token 规范。 ### 类型定义 组件导出以下类型定义 ```ts import type { CardProps } from '@cedar-design/ui' ``` 尺寸与跨端迁移约定见仓库根目录 `API-MIGRATION.md`。只支持文档列出的档位,不代表支持全部 ComponentSize。 ### 变量消费约定 横向内容区独立消费 `--c-card-content-row-margin`,不再误用标题间距。Card 的密度 API 明确只支持 sm/md,不套用表单控件五档。动效时长 `--c-card-animation-duration` 默认为 `var(--c-sys-motion-duration-slow)`,曲线 `--c-card-animation-easing` 默认为 `var(--c-sys-motion-easing-standard)`。reduced-motion 关闭所有 Card 动画分区的过渡。 --- Document: llms/zh-CN/components/carousel.md # Carousel 自动播放的间隔是业务播放节奏(business-clock),不是 CSS 动效时长;默认关闭,启用 true 时默认3000ms,数字/配置间隔、hover/focus/隐藏暂停规则保持。取消或重排使旧播放任务失效;当前回调消费一次后才调用导航。停用/卸载保留 next/prev/to、键盘和滚轮入口无效,不能翻页或拦截输入。激活建立新观察器/事件绑定,解绑前迟交付不得借新 active 状态重新排任务。 ## 基础示例 ### 基础用法 Example source: src/carousel/__demos__/basic.vue ```vue ``` ## 方向与布局 ### 垂直轮播 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `slides-per-view` | 同时显示页数;auto使用子项宽高 | 多图同屏、centered-slides、auto-sized | | `space-between` | 项间距;数字/数字字符串为px | 多图同屏、centered-slides、auto-sized | | `draggable` | 鼠标拖动,可与触摸并存 | 多图同屏、auto-sized | | `centered-slides` | 当前页居中 | centered-slides、auto-sized | | `orientation` | 轮播内容滑动的横纵轴向,默认 horizontal;不决定指示器所在位置 | 垂直轮播 | | `model-value` | 受控页序号,从 1 开始 | 多图同屏 | 通过 `orientation` 属性可以控制轮播方向,支持 `horizontal` 和 `vertical`。 Example source: src/carousel/__demos__/vertical.vue ```vue ``` ### 多图同屏 示例同时显示2.5项,可用鼠标拖拽并切换“接受切换”和“循环”。Current为父级已接受的从 1 开始的页序号,Proposal记录切换请求,Changes统计change事件;受控拒绝时仍可能发出提案及change,不等于模型已更新。接受后可正反拖动,首项向前循环到末项;关闭循环后末端继续拖动不越界、不重复通知。此处是鼠标组合示例,不代表真机触屏或所有居中/自动宽度组合均已验收。 通过 `slides-per-view` 和 `space-between` 属性可以控制每屏显示的 slide 数量及间距。 Example source: src/carousel/__demos__/multi-slides.vue ```vue ``` ### centered-slides Example source: src/carousel/__demos__/centered-slides.vue ```vue ``` ### auto-sized “反转顺序”以卡片宽度作为本示例的唯一key,反转同一批卡片。current 按页序号而非业务卡片身份解释:页序号 2从220px变成180px,索引与change次数不变;向左拖到页序号 3后恢复顺序,当前位置对应180px,向右拖回页序号 2。重排本身不提交切换;任意插入排序、身份保持、持按中重排和物理触屏仍未覆盖。 Reverse cards reorders the same uniquely keyed cards (their distinct widths are the Demo keys). Current is positional, not a business-card identity: slide number 2 changes from 220px to 180px without changing the index or event count. Drag left to slide number 3, restore order to show 180px there, then drag right to slide number 2. Reordering alone emits no change. Arbitrary insertion/sorting, identity-following selection, reordering during a held gesture and physical touch remain unverified. 活动第五项删除组合:选中新增第五项后关闭“增加末项”,父级Current仍4、Changes不增加;显示层将越界索引限制到剩余第四项并居中。随后向左拖动才按四项循环到 1,回写模型并增加一次change。这里不自动修正父级受控值;业务若需要删除即重写索引,应自行更新current。未覆盖任意重排或持按手势中删除。 When the active fifth card is removed, parent Current stays 5 without another change; the view clamps it to the remaining fourth card and centers that card. A subsequent left drag wraps to 1 and updates the model once. Applications that need immediate parent-index correction must update current themselves. Arbitrary reordering and deletion during a held gesture remain unverified. 从末项页序号 4清空再恢复时,父级Current保留3、Changes不增加;恢复后末项仍居中,随后向左拖动才循环到 1并增加一次change。空态不把受控父级值强制回写0。此记录不覆盖活动末项删除、任意越界值或手势中清空。 Clearing from slide number 4 retains the parent Current and change count. Restoring centers the last card; the next left drag wraps to 1 and emits once. Empty content does not force the controlled parent value to 0. Active-card deletion, arbitrary invalid indices and clearing during a held gesture remain unverified. “清空项目”临时移除所有卡片,空态导航禁用、拖动不发切换;解除后恢复此前配置的卡片,不自动切换。从初始页序号 1清空再恢复后,向右拖动可正常循环到末项。此流程未覆盖非零越界受控索引或清空途中仍按住指针。 “增加末项”追加200px第五项,不改变当前有效索引或增加change;从首项向右拖到新增项,再向右拖回原末项后移除第五项,仍保持原末项和次数。此时向左拖可按恢复后的四项循环回首项。这里只覆盖移除非活动末项,未认证删除当前项、任意重排或手势途中增删。 先拖到末项,再开启“加宽卡片”(各项增加80px)和“窄容器”(300px),当前模型与change次数不因尺寸变化而增加;观察当前340px卡片重新居中,再向左拖动循环到首项。恢复开关后应继续居中。本段描述真实ResizeObserver响应已结束手势后的尺寸变化,不代表按住拖动期间改变尺寸。 居中自动宽度示例包含140/220/180/260px四个独立项目,间隔12px。鼠标拖拽逐项切换,首尾均可循环;Current显示已接受的从 1 开始的模型,Changes记录change事件次数。当前项宽度不同仍保持居中。本示例不代表真机触屏、手势中尺寸变化或动态增删项目已全部验收。 Example source: src/carousel/__demos__/auto-sized.vue ```vue ``` ## 切换控件与效果 ### 切换箭头 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `show-arrow` | 箭头显示策略 | 切换箭头 | | `indicator-type` | 指示器样式 | 指示器样式与位置 | | `indicator-position` | 指示器在轮播容器中的边缘或 outer 外部区域,默认 bottom;不是浮层相对触发器的方位 | 指示器样式与位置 | | `effect` | 视觉效果,两端全部支持 | 切换效果对比 | 通过 `show-arrow` 控制切换箭头的显示时机,支持 `always`、`hover`、`never`。PC 端默认 `always`。 Example source: src/carousel/__demos__/navigation.vue ```vue ``` ### 指示器样式与位置 所有指示器方案使用相同的三张本地幻灯片和当前页模型。点击任一方案的指示器或翻页箭头,其他方案同步切换。第一组比较 dot、line、slider 样式,第二组比较 top、outer 位置;窄屏下自动纵向排列。
配置说明与使用限制 #### 指示器类型 通过 `indicator-type` 设置指示器类型,支持 `dot`、`line`、`slider`。隐藏指示器请使用 `indicator`。 #### 指示器位置 通过 `indicator-position` 属性可以设置指示器位置。
Example source: src/carousel/__demos__/indicator-comparison.vue ```vue ``` ### 切换效果对比 在各预览中切换相邻项,比较淡入淡出、卡片与滑动效果;自动播放和输入方式不混入效果配置。
配置说明与使用限制 #### effect-fade 通过指示器按钮切换;非活动页透明且退出交互。各页重叠在同一网格位置,活动页占满视口宽度而不是分列。示例图片使用站点根路径,避免组件子路由下解析为相对资源。 #### effect-card 活动项恢复原始比例和不透明度,相邻项缩小、降低不透明度;上一页/下一页按钮支持原生键盘操作。
Example source: src/carousel/__demos__/effect-comparison.vue ```vue ``` ### 自定义指示器 通过 `#indicator` 插槽可以自定义指示器。 Example source: src/carousel/__demos__/custom-indicator.vue ```vue ``` ## 播放与交互 ### 禁止循环 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `height` | 容器高度,数字为px | 自动播放、controlled、interactive-content | | `keyboard` | 组件内方向键/Home/End | 键盘控制、controlled、interactive-content | | `auto-play` | 自动播放及间隔 | 自动播放、悬停暂停自动播放 | | `draggable` | 鼠标拖动,可与触摸并存 | controlled、interactive-content | | `loop` | 循环,跨边界不复制实例 | 禁止循环 | | `trigger` | 指示器触发方式 | 悬停触发 | 通过 `loop` 属性可以控制是否循环轮播。 Example source: src/carousel/__demos__/forbid-loop.vue ```vue ``` ### 自动播放 通过 `auto-play` 开启自动播放。传入 `true` 使用默认间隔 3000ms;传入数字则作为间隔(毫秒)。 Example source: src/carousel/__demos__/autoplay.vue ```vue ``` 示例使用 2000ms 间隔,下方页码按 1 开始显示(API 序号同样从 1 开始)。取消勾选立即停止自动播放,重新开启后继续;焦点在轮播内部时也会暂停。 ### 悬停暂停自动播放 `auto-play` 支持传入对象 `{ interval, hoverToPause }` 进行高级配置。 Example source: src/carousel/__demos__/auto-play-hover.vue ```vue ``` ### 悬停触发 通过 `trigger` 属性可以设置指示器的触发方式,支持 `click` 和 `hover`。 Example source: src/carousel/__demos__/trigger.vue ```vue ``` ### 鼠标滚轮控制 通过 `mousewheel` 属性可以开启鼠标滚轮切换。滚轮作用在轮播区域时切换页,不滚动外层页面;开启 loop 时从首项向前切换到末项。该能力不等同于触屏拖拽。 Example source: src/carousel/__demos__/mousewheel.vue ```vue ``` ### 键盘控制 通过 `keyboard` 属性可以开启键盘方向键切换。 Example source: src/carousel/__demos__/keyboard.vue ```vue ``` ### 监听切换事件 通过 `change` 事件可以监听幻灯片切换。 Example source: src/carousel/__demos__/change-event.vue ```vue ``` ### controlled Example source: src/carousel/__demos__/controlled.vue ```vue ``` ### interactive-content 当前索引和变更次数展示受控模型。输入框内的方向键、Home/End和鼠标拖选文字保留原生编辑,不切换轮播;拖动背景,或聚焦轮播容器后按方向键,才切换页面。返回原页面仍保留输入文字;示例不涉及外部保存或物理触屏文字选择。 Example source: src/carousel/__demos__/interactive-content.vue ```vue ``` ## 生命周期 ### Scheduler lifecycle / 调度生命周期 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `auto-play` | 自动播放及间隔 | Scheduler lifecycle / 调度生命周期 | | `move-speed` | 显式切换时长(毫秒) | Scheduler lifecycle / 调度生命周期 | | `height` | 容器高度,数字为px | Scheduler lifecycle / 调度生命周期 | | `keyboard` | 组件内方向键/Home/End | Scheduler lifecycle / 调度生命周期 | | `mousewheel` | 滚轮切换 | Scheduler lifecycle / 调度生命周期 | Example source: src/carousel/__demos__/scheduler-lifecycle.vue ```vue ``` 用于展示多张图片、视频或内嵌框架等内容的循环播放,支持系统自动播放或用户手动切换。 ## API ### 主值与默认值 使用普通 `v-model`。`modelValue` 表示当前页序号,从 1 开始;`defaultValue` 仅在创建时初始化非受控值,后续修改不会重置当前状态。显式绑定值优先,初始化不发出 `update:modelValue`。 ### Carousel Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | `model-value` | 受控页序号,从 1 开始 | `number` | `undefined` | | `default-value` | 非受控初始页序号(从 1 开始) | `number` | `1` | | `loop` | 循环,跨边界不复制实例 | `boolean` | `true` | | `auto-play` | 自动播放及间隔 | `boolean \| number \| CarouselAutoPlayConfig` | `false` | | `move-speed` | 显式切换时长(毫秒) | `number` | `undefined (token)` | | `trigger` | 指示器触发方式 | `click \| hover` | `click` | | `orientation` | 轮播内容滑动的横纵轴向,默认 horizontal;不决定指示器所在位置 | `horizontal \| vertical` | `horizontal` | | `show-arrow` | 箭头显示策略 | `always \| hover \| never` | `always` | | `arrow-class` | 箭头附加类 | `string` | `undefined` | | `indicator` | 显示指示器 | `boolean` | `true` | | `indicator-type` | 指示器样式 | `dot \| line \| slider` | `dot` | | `indicator-position` | 指示器在轮播容器中的边缘或 outer 外部区域,默认 bottom;不是浮层相对触发器的方位 | `bottom \| top \| left \| right \| outer` | `bottom` | | `indicator-class` | 指示器附加类 | `string` | `undefined` | | `indicator-color` | 自定义指示器背景 | `string` | `undefined` | | `height` | 容器高度,数字为px | `number \| string` | `undefined` | | `transition-timing-function` | 显式缓动曲线 | `string` | `undefined (token)` | | `touchable` | 触摸拖动 | `boolean` | `true` | | `draggable` | 鼠标拖动,可与触摸并存 | `boolean` | `false` | | `mousewheel` | 滚轮切换 | `boolean` | `false` | | `keyboard` | 组件内方向键/Home/End | `boolean` | `false` | | `slides-per-view` | 同时显示页数;auto使用子项宽高 | `number \| auto` | `1` | | `space-between` | 项间距;数字/数字字符串为px | `number \| string` | `0` | | `effect` | 视觉效果,两端全部支持 | `slide \| fade \| card` | `slide` | | `centered-slides` | 当前页居中 | `boolean` | `false` | | `aria-label` | 轮播可访问名称 | `string` | Locale | | `previous-button-aria-label` | 上一页按钮名称 | `string` | Locale | | `next-button-aria-label` | 下一页按钮名称 | `string` | Locale | ### 模型与交互 公开页序号从 1 开始。受控操作先发 update:model-value,再发 change(slideNumber, previousSlideNumber, isManual),父级接受 current 前不移动;外部赋值不补发 change。方法 options 的 event:false 只关闭 change,不吞掉模型提议。用户操作的 isManual 为 true,自动播放为 false。 loop 跨边界移动原有子项,不复制组件实例。非循环且未居中时,末尾视区钳制以避免留白,选中项可能在最后一组可见项内移动而不再移动轨道。部分可见页保持可访问,完全离屏页 inert。fade 固定展示一页;auto 使用 CarouselItem 显式 width(横向)或 height(纵向),纵向需提供容器高度。默认插槽只统计 CarouselItem(可包在 Vue Fragment 中),注释、普通元素不成为页。 auto-play=true 使用 3000ms 且悬停暂停,数字指定毫秒且不启用悬停暂停;对象配置 interval/hoverToPause。焦点在组件内、拖动中、文档/祖先隐藏、KeepAlive 停用始终暂停。尊重减少动态效果偏好。输入框、按钮等交互子项保留原生行为,自定义交互区域可加 data-carousel-no-drag。show-arrow=hover 在键盘聚焦时也显示。 ### Events | 事件 | 参数 | | --- | --- | | update:model-value | slideNumber: number | | change | slideNumber: number, previousSlideNumber: number, isManual: boolean | ### Slots | 插槽 | 参数 | | --- | --- | | default | CarouselItem | | prev / next / indicator | { slideNumber, length, hovering, prev, next, to, resize } | ### Methods | 方法 | 签名 | | --- | --- | | prev / next | (options?: CarouselToOptions) => void | | to | (slideNumber: number, options?: CarouselToOptions) => void | | resize | () => void | CarouselItem 无自有 Props、事件或方法;默认插槽为页面内容。 ### Types CarouselProps, CarouselItemProps, CarouselInstance, CarouselItemInstance, CarouselEmits, CarouselSlots, CarouselItemSlots, CarouselExpose, CarouselSlotScope, CarouselToOptions, CarouselChangeData, CarouselOrientation, CarouselEffect, CarouselAutoPlayConfig, CarouselArrowType, CarouselIndicatorType, CarouselIndicatorPosition, CarouselTriggerEvent. ### 样式变量 | Token | 默认值 | | --- | --- | | `--c-carousel-indicator-dot-size` | `8px` | | `--c-carousel-indicator-position` | `var(--c-sys-space-4)` | | `--c-carousel-indicator-gap` | `var(--c-sys-space-3)` | | `--c-carousel-indicator-color-default` | `rgb(255 255 255 / 35%)` | | `--c-carousel-indicator-color-active` | `var(--c-sys-color-content-on-dark)` | | `--c-carousel-indicator-outer-margin-bottom` | `var(--c-sys-space-8)` | | `--c-carousel-indicator-line-width` | `20px` | | `--c-carousel-indicator-line-height` | `3px` | | `--c-carousel-indicator-line-border-radius` | `var(--c-sys-radius-sm)` | | `--c-carousel-arrow-size` | `var(--c-sys-control-height-md)` | | `--c-carousel-arrow-font-size` | `var(--c-sys-font-size-xl)` | | `--c-carousel-arrow-margin` | `var(--c-sys-space-4)` | | `--c-carousel-arrow-color` | `var(--c-sys-color-content-on-dark)` | | `--c-carousel-arrow-background` | `rgb(0 0 0 / 35%)` | | `--c-carousel-arrow-background-hover` | `rgb(0 0 0 / 55%)` | | `--c-carousel-arrow-disabled-opacity` | `0.4` | | `--c-carousel-navigation-z-index` | `10` | | `--c-carousel-transition-duration` | `var(--c-sys-motion-duration-standard)` | | `--c-carousel-transition-timing-function` | `ease` | | `--c-carousel-fade-duration` | `var(--c-sys-motion-duration-standard)` | | `--c-carousel-card-duration` | `var(--c-sys-motion-duration-standard)` | | `--c-carousel-card-scale` | `0.85` | | `--c-carousel-card-opacity` | `0.6` | | `--c-carousel-focus-width` | `2px` | | `--c-carousel-focus-offset` | `2px` | | `--c-carousel-focus-color` | `var(--c-sys-color-content-brand)` | ### 循环过渡边界 每个轮播项始终只有一个组件实例。普通上一页/下一页在出场项离开后回收位置;跨多页或居中跳转若需要同一项同时占据两个位置,则直接无动画定位,不复制交互内容,也不排队执行无限过渡。项目数量小于可视页数时不会复制项目填满。可访问名称跟随全局 Locale,显式标签属性优先。 根节点的 `keydown`、`mouseenter`、`mouseleave`、`focusin`、`focusout` 原生监听器与内部翻页、自动播放暂停逻辑同时生效;原生 `.once` 监听器在该根元素生命周期内只执行一次。 --- Document: llms/zh-CN/components/cascader.md # Cascader 多选时,`inline` 下拉只显示选项;已选内容、单项移除和清空由输入框承担。确认式编辑面板保留“已选/清空”,选择为草稿,确认后提交。 指在选择器选项数量较多时,采用多级分类的方式将选项进行分隔。 ## 阅读方向 继承来源 dir;子列沿阅读方向展开,展开图标及列分隔线随方向变化。左右键按可见方向进入已加载子级或返回父级,并跳过禁用子项;上下键保持逻辑顺序。搜索状态保留原生左右光标编辑,不反转路径或多选数组。关闭状态清空最后值后,重开从根级恢复导航。 ## 基础示例 ### 基本使用 逐级选择地区,选择叶子节点后收起并回填完整路径。下方显示当前绑定值;禁用状态放在独立案例中。 Example source: src/cascader/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 外观配置对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------- | ------------------------------------------------------ | ------------------------------ | | `options` | 树形选项;叶值模式要求叶值唯一,路径模式可区分不同分支 | 外观配置对比、表单控件尺寸对照 | | `clearable` | 允许清除,保留禁用的已选项 | 外观配置对比、表单控件尺寸对照 | | `size` | 完整支持 xs、sm、md、lg、xl,未设置时继承分组与表单 | 表单控件尺寸对照 | | `variant` | filled、outline、standard;未设置时继承 InputGroup | 表单控件尺寸对照 | | `placeholder` | 占位文本 | 表单控件尺寸对照 | | `multiple` | 多选;默认启用搜索 | 表单控件尺寸对照 | 选择一个对比维度后,同屏展示它的全部可选值;其余配置和内容保持一致。可切换其他配置检查组合效果;输入类预览共享一个值。
配置说明与使用限制 #### 尺寸 完整支持 xs、sm、md、lg、xl 五档尺寸 #### 外观组合 适用于地区等层级选项。调整变体、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。
Example source: src/cascader/__demos__/appearance-lab.vue ```vue ``` ### 表单控件尺寸对照 切换 size 和字段变体,对比有值、可清空、多选不换行的 Cascader、Select、Input 与 Button。长标签文字省略,删除图标保留,标签行可横向滚动;清空按钮和箭头固定在外侧。被省略的标签正文支持悬停、键盘聚焦或点按查看完整文字,点外部或按 Esc 关闭,不改变选中值。 Example source: src/field-decorator/__demos__/control-sizes.vue ```vue ``` ## 选择模式与路径 ### 多选模式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ---------------- | ------------------------------------------------------ | -------------------------------- | | `options` | 树形选项;叶值模式要求叶值唯一,路径模式可区分不同分支 | 多选模式、严格选择模式、路径模式 | | `placeholder` | 占位文本 | 多选模式、严格选择模式、路径模式 | | `multiple` | 多选;默认启用搜索 | 多选模式、严格选择模式 | | `default-value` | 默认值(非受控状态) | 严格选择模式、路径模式 | | `expand-trigger` | Menu / List 的展开交互:click 或 hover | 严格选择模式、路径模式 | | `check-strictly` | 允许选中父节点;多选不关联父子节点 | 严格选择模式 | 设置属性`multiple` 开启多选模式。 Example source: src/cascader/__demos__/multiple.vue ```vue ``` ### 严格选择模式 设置属性 `check-strictly`,开启严格选择模式,点击任何结点都可以选择。多选时将会解除父子节点的关联。 Example source: src/cascader/__demos__/check-strictly.vue ```vue ``` ### 路径模式 modelValue 使用路径作为值。 Example source: src/cascader/__demos__/path-mode.vue ```vue ``` ### 管理已选项 确认式多选编辑面板顶部提供已选数量与清空。Cedar 在列表上方显示可删除标签;Maple 点击数量查看已选明细,支持逐项移除并返回可选项。popup/popover 与 dialog 共用该内容。移除和清空先修改草稿,关闭取消会恢复原值,确认后才提交;禁用项保留,异步确认期间禁用操作。面板的清空入口独立于字段清空图标。 ### 允许清除 设置属性 `clearable` 允许清除输入框的内容。 Example source: src/cascader/__demos__/clearable.vue ```vue ``` ## 搜索与展示 ### 允许搜索 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ---------------- | ------------------------------------------------------ | -------------------------------------------- | | `options` | 树形选项;叶值模式要求叶值唯一,路径模式可区分不同分支 | 允许搜索、搜索匹配规则、自定义输入框的展示值 | | `placeholder` | 占位文本 | 允许搜索、搜索匹配规则、自定义输入框的展示值 | | `filterable` | 开启搜索 | 允许搜索、搜索匹配规则 | | `case-sensitive` | 内置本地过滤是否区分大小写,自定义过滤函数优先 | 搜索匹配规则 | | `format-label` | 格式化已选标签;VNode 使用 label 插槽 | 自定义输入框的展示值 | 通过设置 filterable 让输入框支持搜索功能。 Example source: src/cascader/__demos__/filterable.vue ```vue ``` ### 搜索匹配规则 `case-sensitive` 默认 false,只控制内置本地匹配是否区分大小写;自定义过滤函数优先。保留原有路径标签和 checkStrictly 行为;远程结果不需本地筛选时可使用 `:filter-option="() => true"`,该属性仍是原有函数协议。 Example source: src/cascader/__demos__/case-sensitive.vue ```vue ``` ### 自定义输入框的展示值 利用 formatLabel 对显示的内容进行自定义处理。 Example source: src/cascader/__demos__/format-label.vue ```vue ``` ## 交互与控制 ### 交互状态对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ----------- | ------------------------------------------------------ | ------------ | | `options` | 树形选项;叶值模式要求叶值唯一,路径模式可区分不同分支 | 交互状态对比 | | `clearable` | 允许清除,保留禁用的已选项 | 交互状态对比 | | `disabled` | 是否禁用 | 交互状态对比 | 在同一实例上切换禁用、只读和错误状态后再操作控件,比较可编辑性和交互反馈。恢复开关位于目标控件外;错误外观本身不会执行校验。
配置说明与使用限制 #### 禁用选项 设置属性 `disabled` 禁用选项。 #### 交互状态切换 适用于地区等层级选项。调整禁用、只读、错误反馈,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。
Example source: src/cascader/__demos__/state-lab.vue ```vue ``` ## 配置与组合 ### 透传配置边界与优先级 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------------- | -------------------------------------------------------------------------------------- | -------------------------------- | | `edit-mode` | 展示方式 | 透传配置边界与优先级、复制与编辑 | | `options` | 树形选项;叶值模式要求叶值唯一,路径模式可区分不同分支 | 透传配置边界与优先级、复制与编辑 | | `trigger-props` | Menu 的 Trigger 属性;展开状态由字段控制 | 透传配置边界与优先级 | | `open-trigger-target` | 打开面板的点击区域;field 为整个字段,icon 仅右侧选择按钮。不影响键盘展开及受控 open。 | 复制与编辑 | | `filterable` | 开启搜索 | 复制与编辑 | 建议使用 `CascaderTriggerOptions` 声明 trigger-props。open/defaultOpen、disabled 和展开更新归 Cascader 管理。popup-container 顶层明确传入时优先(包括 false),否则回退 triggerProps.popupContainer。Trigger 的普通配置保留原顺序,嵌套 unmountOnClose 仍可覆盖顶层 unmount-on-close;默认的定位/交互配置也仍可被有效嵌套字段覆盖。内部展开监听继续执行,通知使用 Cascader 事件。 本次仅新增可主动选用的专用类型,不收窄已发布的宽属性类型,不增加运行时过滤、不改变覆盖顺序;旧业务写法继续可编译。若直接使用旧宽属性,内部托管字段仍可能通过类型检查,但不代表能控制内部状态。 ```ts import type { CascaderTriggerOptions } from "@cedar-design/ui"; ``` Example source: src/cascader/__demos__/passthrough-options.vue ```vue ``` ### 复制与编辑 open-trigger-target="icon" 时,输入区可以编辑或复制,只有右侧选择按钮响应点击打开。关闭手输或搜索后,已有文本仍可复制。 Example source: src/cascader/__demos__/open-trigger-target.vue ```vue ``` ## 异步加载与回显 ### 加载中 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------- | --------------------------------------------------------------------- | ---------------------------------------- | | `options` | 树形选项;叶值模式要求叶值唯一,路径模式可区分不同分支 | 加载中、子选项懒加载、异步设备与 ID 回显 | | `placeholder` | 占位文本 | 加载中、子选项懒加载、异步设备与 ID 回显 | | `loading` | 加载状态;禁止选择和确认 | 加载中、异步设备与 ID 回显 | | `load-more` | 异步加载子节点;完成后调用 done(children),失败调用 done() 以允许重试 | 子选项懒加载 | | `path-mode` | true 返回完整路径;false 返回选中节点的值 | 异步设备与 ID 回显 | | `filterable` | 开启搜索 | 异步设备与 ID 回显 | 选择框和下拉菜单显示加载状态 Example source: src/cascader/__demos__/loading.vue ```vue ``` ### 子选项懒加载 通过 load-more 属性可以开启数据懒加载功能。 开启数据懒加载功能后,需要在叶子节点标注 isLeaf: true,没有标注且没有 children 属性的节点会认为需要懒加载处理。 load-more 属性有提供 done 函数进行回调,可以在回调中传入懒加载的子数据。如果 done 函数没有传入数据会认为懒加载失败,此节点可以再次触发懒加载。 Example source: src/cascader/__demos__/load-more.vue ```vue ``` ### 异步设备与 ID 回显 Example source: src/cascader/__demos__/async-devices.vue ```vue ``` 单选已选项在右侧显示内置主色对勾。多选使用 Checkbox:可选后代全部未选为未选,部分选中为半选,全部可选叶子选中为全选;禁用叶子不参与全选计算。checkStrictly 开启时父子独立选择,不汇总半选。确认式编辑面板中的选择先作为草稿,确认后才提交。 ### 共享字段加载 `loading` 控制共享字段加载状态;`loading-mode` 为 `default`(指示器)或 `line`(底部不定进度线),默认 `default`。渲染统一由 FieldDecorator 负责,不隐式改变 disabled/readonly;需要禁止编辑时单独设置。 ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### Cascader 属性 分别使用 `v-model`、`v-model:open` 和 `v-model:input-value` 控制选中值、展开状态和搜索词。单选清空为 `''`,多选为 `[]`;Select 存在真实空字符串选项时,清空值为 `undefined`。 | 属性 | 说明 | 类型 | 默认值 | | --------------------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------- | ------------------------ | | `open-trigger-target` | 打开面板的点击区域;field 为整个字段,icon 仅右侧选择按钮。不影响键盘展开及受控 open。 | `'field' \| 'icon'` | `'field'` | | `model-value / default-value` | 受控值 / 非受控初始值 | `Value` | `单选 '',多选 []` | | `open / default-open` | 受控展开 / 默认展开 | `boolean` | `undefined / false` | | `input-value / default-input-value` | 搜索文本,独立于选中值 | `string` | `undefined / ''` | | `multiple` | 多选;默认启用搜索 | `boolean` | `false` | | `size` | 完整支持 xs、sm、md、lg、xl,未设置时继承分组与表单 | `ComponentSize` | `md` | | `variant` | filled、outline、standard;未设置时继承 InputGroup | `FormControlVariant` | `filled` | | `disabled / readonly / error` | 未设置时继承表单;显式 false 可覆盖 | `boolean` | `undefined` | | `placeholder` | 占位文本 | `string` | `—` | | `hint / line` | 浮动提示 / standard 变体下划线 | `boolean` | `true` | | `text-color / focus-color / blur-color` | 字段颜色 | `string` | `—` | | `loading` | 加载状态;禁止选择和确认 | `boolean` | `false` | | `show-tags` | 多选值以标签展示;false 改用分隔文本 | `boolean` | `true` | | `separator` | show-tags=false 时的多选分隔符 | `string` | `,` | | `text-align` | 文字对齐 left / center / right;未设置时继承 FormItem 的 content-align,独立使用默认阅读起点 start | `'left' \| 'center' \| 'right'` | `-` | | `max-tag-count` | 标签数量上限,0 不限制 | `number` | `0` | | `tag-nowrap` | 标签单行显示;长文字省略、删除图标保留,标签行可横向滚动;悬停、聚焦或点按省略正文查看全文 | `boolean` | `false` | | `popup-container` | 选择器、元素、返回元素的函数或 false(原地渲染) | `PopupContainer` | `—` | | `trigger-props` | Menu 的 Trigger 属性;展开状态由字段控制 | `TriggerProps` | `—` | | `virtual-list-props` | Menu / List 的虚拟列表参数 | `VirtualListProps` | `—` | | `search-delay` | search 事件防抖时长(毫秒) | `number` | `500` | | `format-label` | 格式化已选标签;VNode 使用 label 插槽 | `function` | `—` | | `clearable` | 允许清除,保留禁用的已选项 | `boolean` | `false` | | `options` | 树形选项;叶值模式要求叶值唯一,路径模式可区分不同分支 | `CascaderOption[]` / `(query, { signal }) => Array / Promise` | `undefined` | | `field-names` | value、label、disabled、children、isLeaf、tagProps、render 的字段映射 | `CascaderFieldNames` | `—` | | `path-mode` | true 返回完整路径;false 返回选中节点的值 | `boolean` | `false` | | `check-strictly` | 允许选中父节点;多选不关联父子节点 | `boolean` | `false` | | `filterable` | 开启搜索 | `boolean` | `单选 false / 多选 true` | | case-sensitive | 内置本地过滤是否区分大小写,自定义过滤函数优先 | boolean | false | | `filter-option` | 接收搜索词和原始节点 | `(input, option) => boolean` | `—` | | `expand-trigger` | Menu / List 的展开交互:click 或 hover | `string` | `click` | | `expand-child` | 展开到首个子节点 | `boolean` | `false` | | `load-more` | 异步加载子节点;完成后调用 done(children),失败调用 done() 以允许重试 | `(option, done) => void` | `—` | | `fallback-option` | 尚未加载的值如何反显 | `boolean 或 (value) => string` | `true` | | `search-option-only-label` | 搜索结果仅显示节点标签,不显示路径 | `boolean` | `false` | | `auto-fit-popup-width` | Menu 是否与字段等宽 | `boolean` | `false` | | `edit-mode` | 展示方式 | `menu` | `menu` | ### 事件与方法 - `update:modelValue`、`change(value)`:提交时触发,编辑草稿不触发。 - `update:open`、`open-change(open)`:请求改变展开状态。 - `update:inputValue`、`input-value-change(text)`、`search(text)`:搜索状态。 - `focus(event)`、`blur(event)`、`clear(event)`:原生字段事件;只有字段所有者通知 Form。 - 方法:`focus()`、`blur()`。 ### 插槽与选项数据 使用 `label({ data })` 自定义已选标签,`selected` 替换整个已选区域。还支持 `prefix`、`suffix`、`clear-icon({ clear })`、`arrow-icon`、`loading-icon`、`search-icon`、`empty`、`option({ data })`。 选项 `label` 是用于搜索的纯文本;自定义选项内容使用 `render` 或 `option` 插槽,自定义反显使用 `format-label` 或 `label` 插槽。以 value 而非 label 识别选项。选项的 `disabled` 禁止选择和删除,`tagProps` 可定制已选标签。 ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :---------------------: | | path-mode | 绑定值是否为路径 | `boolean` | `false` | | multiple | 是否为多选状态(多选模式默认开启搜索) | `boolean` | `false` | | model-value **(v-model)** | 绑定值 | `string\| number\| Record\| ( \| string \| number \| Record \| (string \| number \| Record)[] )[]\| undefined` | `-` | | default-value | 默认值(非受控状态) | `string\| number\| Record\| ( \| string \| number \| Record \| (string \| number \| Record)[] )[]\| undefined` | `'' \| undefined \| []` | | options | 级联选择器的选项 | `CascaderOption[]` / `(query, { signal }) => Array / Promise` | `undefined` | | expand-trigger | 展开下一级的触发方式 | `string` | `'click'` | | check-strictly | 是否开启严格选择模式 | `boolean` | `false` | | load-more | 数据懒加载函数,传入时开启懒加载功能 | `( option: CascaderOption, done: (children?: CascaderOption[]) => void) => void` | `-` | | field-names | 自定义 `CascaderOption` 中的字段;当选项值为对象时,也用其中的 `value` 作为键属性 | `CascaderFieldNames` | `-` | | expand-child | 是否展开子菜单 | `boolean` | `false` | ### `` Events | 事件名 | 描述 | 参数 | | ------ | ---------------- | -------------------------------------------------------------------------------------- | | change | 选中值改变时触发 | value: `string \| number \| (string \| number \| (string \| number)[])[] \| undefined` | ### `` Slots | 插槽名 | 描述 | 参数 | | ------ | :------------------: | ---- | | empty | 选项为空时的显示内容 | - | ### CascaderOption | 参数名 | 描述 | 类型 | 默认值 | | -------- | -------------- | ----------------------------------------- | :-----: | | value | 选项值 | `string \| number \| Record` | `-` | | label | 选项文本 | `string` | `-` | | render | 自定义渲染 | `RenderFunction` | `-` | | disabled | 是否禁用 | `boolean` | `false` | | tagProps | 展示的标签属性 | `TagProps` | `-` | | children | 下一级选项 | `CascaderOption[]` | `-` | | isLeaf | 是否是叶子节点 | `boolean` | `false` | ## 类型定义 组件导出以下类型定义 ```ts import type { CascaderProps } from "@cedar-design/ui"; ``` ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 字段编辑统一使用 edit-mode:Cedar 支持 direct/click/dblclick,Maple 支持 direct/popup;不保留 menu/list/picker 这些旧编辑枚举。弹层复用原选项索引、搜索、异步加载与虚拟列表算法。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 ### 单选对勾样式变量 | 变量 | 默认值 | | ------------------------------- | ----------------------------------- | | `--c-cascader-item-check-color` | `var(--c-sys-color-action-primary)` | | `--c-cascader-item-check-size` | `var(--c-sys-font-size-md)` | ### 内置搜索字段配置 `searchFields` / `search-fields` 是只读 `('label' | 'value')[]`,默认 `['label']`;多字段为 OR 匹配,大小写默认不敏感。配置 `['value', 'label']` 可同时搜索编码和名称,fieldNames 将语义字段映射到业务字段;空数组对非空查询不匹配任何项。value 采用字符串比较,不做对象深层搜索,对象值或拼音等复杂规则仍用自定义回调。自定义回调优先并自行决定大小写;远程结果使用原有关闭本地过滤协议。Cascader 保留路径语义,会检查路径各节点的配置字段。 ## 配置清空后的值 `empty-value` 指定当前组件已有清空动作的输出;省略时采用该组件默认返回。具体类型以组件 API 为准。它不改变 empty-values 的识别规则,也不改变 Form reset 的初始值。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 候选属性 `options` 支持数组或 `(query, { signal }) => 数组/Promise`。加载、取消、过期结果隔离由组件内部处理,失败触发 load-error。单选/多选分组初始化以空字符串查询,搜索型字段在查询变化时调用;树形字段根数据与原有 load-more 子节点懒加载独立。 --- Document: llms/zh-CN/components/checkbox.md # Checkbox 独立 Checkbox 的 modelValue 在布尔模式下表示是否选中,在数组模式下表示选中选项的集合;value 是当前选项的标识。CheckboxGroup 的 modelValue 是选中值数组。defaultValue 只初始化非受控状态,不会回写父级绑定值。 在一组数据中,用户可通过复选框选择一个或多个数据。 分组示例覆盖父级接受/拒绝更新、只读和异步选项回显;移除选项不会清空业务值。示例外层 Space 的纵向布局使用 `direction="column"`,与选择组自身的 `orientation="vertical"` 分开理解。 ## 阅读方向 复选框标签及分组按来源 dir 排列,业务数组顺序不变。Space 保持切换语义,禁用/只读状态不因方向变化失效;切换 LTR/RTL 不自动勾选或清空选项。 ## 基础示例 ### 基础用法 基础用法。 Example source: src/checkbox/__demos__/basic.vue ```vue ``` ## 分组与布局 ### 选项声明方式对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ---------- | ------------------------------- | ---------------------- | | `value` | 数组/分组模式的选项标识 | 选项声明方式对比、布局 | | `disabled` | 是否禁用;未设置时继承表单/分组 | 布局 | 比较子组件声明和 options 数据声明;两种方式都使用组值,字段映射和异步选项另见对应示例。
配置说明与使用限制 #### 复选框组 通过 `CheckboxGroup`组件展示复选框组。设置`orientation="vertical"`可以展示竖向的复选框组 #### 复选框组选项 `CheckboxGroup`通过options属性设置子元素
Example source: src/checkbox/__demos__/group-declaration-comparison.vue ```vue ``` ### 布局 使用`CheckboxGroup`传入`Checkbox`,配合`Grid`组件实现灵活的布局 Example source: src/checkbox/__demos__/grid.vue ```vue ``` ### 分组状态与只读 `model-value !== undefined` 表示受控,父级不回写时保留原值;`default-value` 只初始化非受控值。分组内只由 Group 发出 `update:model-value → change(value, event?)`,并通知 FormItem 一次,子项不重复发值变化事件。 Group 的 `disabled`、`readonly`、`error` 未设置时继承表单,显式 `false` 可以覆盖表单;子项不能绕过 Group 的禁用或只读限制。 Example source: src/checkbox/__demos__/group-state.vue ```vue ``` ## 选项与值模型 ### 独立值模型与方法 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | ------------------------------- | ---------------------- | | `default-value` | 非受控初始值 | 独立值模型与方法、受控 | | `value` | 数组/分组模式的选项标识 | 独立值模型与方法 | | `readonly` | 是否只读;未设置时继承表单/分组 | 独立值模型与方法 | | `disabled` | 是否禁用;未设置时继承表单/分组 | 独立值模型与方法 | Checkbox 的布尔模型始终返回 boolean;数组模型按 value 增删选项,不修改传入数组。indeterminate 只用于展示,由业务方计算,不会自动回写。 两端统一使用 `default-value` 初始化非受控值;受控提议被拒绝时保持原值。用户选择按 `update:model-value → change(value, event?)` 通知,命令式调用的 event 为 undefined。 提供 `toggle(checked?: boolean)`、`focus(options?)`、`blur()`。禁用禁止选择和聚焦,只读允许聚焦、禁止改值。Enter 按下与空格释放激活当前控件,长按不重复激活,失焦/停用会取消待处理的空格操作。 Example source: src/checkbox/__demos__/control-value.vue ```vue ``` ### 选项数据与标签 两端均支持原始值或对象选项。`field-names` 映射 `label/value/disabled/readonly/indeterminate`;只读选项允许聚焦但不能改值,Checkbox 的半选仅用于展示。 `label` 插槽接收 `{ data, checked }`,优先于标签渲染函数 `(data, checked) => VNodeChild`。data 为保留业务字段的归一化副本,不修改输入对象;未提供标签时显示值的文字。 显式传入 `options` 时替代默认插槽,包括 `[]`;不传时使用默认插槽。选项值限字符串、有限数字或布尔值;缺失/非法值及同类型重复值被忽略(保留第一项)。`false`、`0`、`''` 和 `'0'` 是不同选项。异步选项变更不反向修改模型。 CheckboxGroup 使用 `ChoiceValue[]`,`max` 只接受 number,请使用 `:max="2"`。 Example source: src/checkbox/__demos__/option-data.vue ```vue ``` ### 受控 通过`v-model` (`model-value`)属性控制是否选中 Example source: src/checkbox/__demos__/controlled-mode.vue ```vue ``` ## 选择与批量操作 ### 限制可勾选数量 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | ------------------------------- | ---------------------------- | | `value` | 数组/分组模式的选项标识 | 限制可勾选数量、全选 | | `disabled` | 是否禁用;未设置时继承表单/分组 | 限制可勾选数量、交互状态对比 | | `indeterminate` | 是否为半选状态 | 全选 | | `readonly` | 是否只读;未设置时继承表单/分组 | 交互状态对比 | | `error` | 错误态;未设置时继承表单/分组 | 交互状态对比 | 通过设置`max`限制最多可被勾选的项目数。 Example source: src/checkbox/__demos__/max-checked.vue ```vue ``` ### 全选 在实现全选功能时,可以通过`indeterminate`属性展示半选效果。 Example source: src/checkbox/__demos__/checked-all-indeterminate.vue ```vue ``` ### 分组批量方法 两端提供 `checkAll()` 和 `inverseAll()`,返回独立数组副本。仅操作已挂载且可编辑的子项,保留禁用、只读及未加载的已选值;重复值只要有一项被锁定,该值就不参与批量修改。 `checkAll` 保留原模型顺序,按当前 DOM 顺序追加未选值;`inverseAll` 先移除可编辑的已选值,再按 DOM 顺序加入此前未选值。新增选择遵守 `max`,不裁剪外部传入的超限值。 受控模式返回提议,需父级回写;拒绝的提议不保存。分组禁用/只读时只返回当前值副本。有实际变化才按 `update:model-value → change(value, undefined) → FormItem` 通知一次,无变化不发事件。 子项重排、挂载、卸载及 KeepAlive 激活/停用会同步更新候选;变更渲染子项后应等待 `nextTick` 再调用方法。 Example source: src/checkbox/__demos__/group-methods.vue ```vue ``` ### 交互状态对比 在同一实例上切换禁用、只读和错误状态后再操作控件,比较可编辑性和交互反馈。恢复开关位于目标控件外;错误外观本身不会执行校验。
配置说明与使用限制 #### 禁用状态 禁用复选框 #### 交互状态切换 适用于协议确认和独立勾选。调整禁用、只读、错误反馈,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。
Example source: src/checkbox/__demos__/state-lab.vue ```vue ``` ## 控件与插槽定制 ### 原生控件与外观 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | ------------------------------- | -------------- | | `name` | 原生字段名,未设置时继承 Group | 原生控件与外观 | | `indeterminate` | 是否为半选状态 | 原生控件与外观 | | `aria-label` | 无可见标签时的无障碍名称 | 原生控件与外观 | | `default-value` | 非受控初始值 | 原生控件与外观 | | `readonly` | 是否只读;未设置时继承表单/分组 | 原生控件与外观 | | `disabled` | 是否禁用;未设置时继承表单/分组 | 原生控件与外观 | 两端主体均独立复制为原生 checkbox + label。Tab 聚焦,空格/Enter 切换;只读可聚焦,禁用不可聚焦。半选通过 aria-checked="mixed" 表达,点击标签只激活一次。没有可见标签时设置 aria-label;name 传到原生输入,子项未设置时继承 Group。 icon-size 接受像素数字或 CSS 长度字符串,不是 ComponentSize 档位;默认图标 Cedar 为 14px、Maple 为 24px。实例颜色仅作用于普通状态,错误和禁用颜色优先。checkbox 插槽覆盖整个控件外观(也可在 Group 上统一设置),checked-icon、unchecked-icon、indeterminate-icon 仅替换对应图标。以上图标槽是装饰内容,不应放置另一个独立可聚焦控件。 Example source: src/checkbox/__demos__/native-control.vue ```vue ``` ### 自定义复选框 使用`#checkbox`插槽自定义复选框的展示 Example source: src/checkbox/__demos__/checked-custom.vue ```vue ``` ### 自定义控件插槽 通过控件插槽替换外观,仍使用相同的值模型和键盘操作。 Example source: src/checkbox/__demos__/custom-control.vue ```vue ``` ## 异步选项 ### 异步选项 开启手动返回后,每次加载创建本地 Promise,可分别返回最早或最新任务验证两种乱序。示例业务加载器用版本保护忽略旧响应:旧结果不结束新加载、不清空选择、不释放 `max=2` 名额,也不增加用户变更次数。移除使在途结果失效,新加载仍按保留模型反显;停用或卸载会结清等待并取消定时器。此保护属于示例业务逻辑,不代表组件自动处理网络竞争;不访问外部接口。 选项载入、移除和外部值更新均不会反向触发值变化;未载入的已选值不会自动清理。示例使用 800ms 本地延迟模拟请求;加载中移除选项会取消待完成的加载,避免旧结果重新显示。已选 remote 占一个名额,再选设备 A 后达到 `max=2`,设备 B 将不可选;取消任一已选项会释放名额。外部超限值不会自动裁剪。 等待期间可用空格或 Enter 操作已有选项;同值选项重载后保留键盘焦点和最新选择。加载提示保持稳定节点,避免显隐导致分组重新挂载,取消已选项后仍可继续选择并释放名额。 Example source: src/checkbox/__demos__/async-options.vue ```vue ``` ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 `ChoiceValue = string | number | boolean`;`CheckboxModel = boolean | ChoiceValue[]`;`RadioModel = ChoiceValue | null`。 ### Checkbox Props | 属性 | 说明 | 类型 | 默认值 | | ---------------------- | ---------------------------------- | ------------------------ | --------- | | model-value (v-model) | 受控值 | boolean \| ChoiceValue[] | undefined | | default-value | 非受控初始值 | boolean \| ChoiceValue[] | false | | value | 数组/分组模式的选项标识 | string\|number\|boolean | true | | disabled | 是否禁用;未设置时继承表单/分组 | boolean | undefined | | readonly | 是否只读;未设置时继承表单/分组 | boolean | undefined | | error | 错误态;未设置时继承表单/分组 | boolean | undefined | | indeterminate | 是否为半选状态 | boolean | false | | checked-color | 实例选中颜色;错误/禁用优先 | string | undefined | | unchecked-color | 实例未选中颜色;错误/禁用优先 | string | undefined | | icon-size | 数字为 px,字符串为 CSS 长度 | number \| string | undefined | | ripple | 是否启用波纹 | boolean | true | | uninject-group-context | 脱离外层 CheckboxGroup,仍参与表单 | boolean | false | | name | 原生字段名,未设置时继承 Group | string | undefined | | aria-label | 无可见标签时的无障碍名称 | string | undefined | ### Checkbox Events | 事件名 | 说明 | 参数 | | ------------------ | ---------------- | ----------------------------------- | | update:model-value | 提议新值 | value: CheckboxModel | | change | 值变化 | value: CheckboxModel, event?: Event | | click | 点击;禁用不触发 | event: MouseEvent | | focus | 聚焦 | event: FocusEvent | | blur | 失焦 | event: FocusEvent | ### Checkbox Methods | 方法 | 参数 | 返回值 | | ------ | ---------------------- | ------ | | toggle | checked?: boolean | void | | focus | options?: FocusOptions | void | | blur | - | void | ### Checkbox Slots | 插槽名 | 说明 | 参数 | | ------------------ | ------------------ | ----------------------------------------------------------- | | checkbox | 自定义完整控件外观 | checked: boolean, disabled: boolean, indeterminate: boolean | | checked-icon | 选中图标 | - | | unchecked-icon | 未选中图标 | - | | indeterminate-icon | 半选图标 | - | | default | 标签 | checked: boolean | ### CheckboxGroup Props | 属性 | 说明 | 类型 | 默认值 | | --------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ------------ | | model-value (v-model) | 受控值 | ChoiceValue[] | undefined | | default-value | 非受控初始值 | ChoiceValue[] | [] | | max | 最多可选数量 | number | undefined | | options | 选项;传入时替代默认插槽 | Array> / `(query, { signal }) => Array / Promise` | `undefined` | | orientation | 复选组内选项的横纵排列,默认 horizontal;不表示文字阅读方向 | Orientation | 'horizontal' | | disabled | 是否禁用;未设置时继承表单/分组 | boolean | undefined | | readonly | 是否只读;未设置时继承表单/分组 | boolean | undefined | | error | 错误态;未设置时继承表单/分组 | boolean | undefined | | field-names | 选项字段映射 | ChoiceFieldNames | undefined | | name | 组内原生输入字段名 | string | undefined | | aria-label | 分组无障碍名称 | string | undefined | ### CheckboxGroup Methods | 方法 | 参数 | 返回值 | | ---------- | ---- | ------------- | | checkAll | - | ChoiceValue[] | | inverseAll | - | ChoiceValue[] | ### CheckboxGroup Events | 事件名 | 说明 | 参数 | | ------------------ | --------------------------- | -------------------------------------------------- | | update:model-value | 提议新值 | value: (string \| number \| boolean)[] | | change | 值变化,只由 Group 通知一次 | value: (string \| number \| boolean)[], ev?: Event | ### CheckboxGroup Slots | 插槽名 | 说明 | 参数 | | -------- | ----------------- | -------------------------------------- | | checkbox | 自定义复选框 | checked: boolean
disabled: boolean | | label | checkbox 文案内容 | data: CheckboxOption, checked: boolean | ### CheckboxOption | 字段 | 说明 | 类型 | | ------------- | -------------- | -------------------------------------------------------------------- | | value | 选项标识 | ChoiceValue | | label | 标签或渲染函数 | VNodeChild \| (data: CheckboxOption, checked: boolean) => VNodeChild | | disabled | 禁用 | boolean | | readonly | 只读 | boolean | | indeterminate | 仅展示半选状态 | boolean | ## 类型定义 组件导出以下类型定义 ```ts import type { CheckboxProps } from "@cedar-design/ui"; ``` ### ChoiceFieldNames `{ label?: string; value?: string; disabled?: string; readonly?: string; indeterminate?: string }` 公开导出类型:`CheckboxOption`、`ChoiceFieldNames`。 公开方法类型:`CheckboxGroupMethods`;`CheckboxGroupInstance` 包含上述方法。 ### 减少动态效果 内置 CSS 过渡遵循 `prefers-reduced-motion: reduce`。关闭过渡不改变最终显隐、选中/展开状态及事件语义;插槽内自定义动画由应用自行控制。 ### 样式变量 | 变量名 | 默认值 | | ---------------------------------------- | -------------------------------------- | | `--c-checkbox-control-color` | `var(--c-sys-color-content-secondary)` | | `--c-checkbox-control-color-checked` | `var(--c-sys-color-content-brand)` | | `--c-checkbox-mark-color` | `var(--c-sys-color-surface-default)` | | `--c-checkbox-control-color-disabled` | `var(--c-sys-color-content-disabled)` | | `--c-checkbox-control-color-error` | `var(--c-sys-color-content-danger)` | | `--c-checkbox-control-size` | `14px` | | `--c-checkbox-label-text-color` | `var(--c-sys-color-content-primary)` | | `--c-checkbox-label-text-color-disabled` | `var(--c-sys-color-content-disabled)` | | `--c-checkbox-label-font-size` | `var(--c-font-size-body-3)` | | `--c-checkbox-label-gap` | `var(--c-spacing-4)` | | `--c-checkbox-action-padding` | `5px` | | `--c-checkbox-group-gap` | `var(--c-spacing-7)` | | `--c-checkbox-animation-duration` | `var(--c-transition-duration-3)` | ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 候选属性 `options` 支持数组或 `(query, { signal }) => 数组/Promise`。加载、取消、过期结果隔离由组件内部处理,失败触发 load-error。单选/多选分组初始化以空字符串查询,搜索型字段在查询变化时调用;树形字段根数据与原有 load-more 子节点懒加载独立。 --- Document: llms/zh-CN/components/col.md # Col 24 栏 Flex 栅格。Row 管理间距与对齐,Col 管理列宽、偏移、排序与响应式配置。需要 CSS Grid 折叠与后缀时使用 Grid。 > **布局怎么选** > > - Grid + GridItem:适合表单分栏、卡片网格,需要统一列宽、跨列、响应式列数或折叠行与后缀时使用。 > - Row + Col:适合 24 栏 Flex 布局,需要水平/垂直对齐、控制换行、固定宽度与自适应宽度组合,或响应式排序时使用。Row 控制整行,Col 控制列宽、偏移和排序。 > - Space:适合按钮、标签、文字等简单排列,只需要间距、方向和对齐时使用;更自由的宽度分配可使用原生 Flex。 ## 基础示例 ### 列宽与偏移 Example source: src/col/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 弹性比例与固定宽度 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `flex` | 弹性比例、固定长度或 CSS flex 值 | 弹性比例与固定宽度 | | `xs` | 响应式栏数或包含 span、offset、order 的对象 | 响应式对象与隐藏恢复 | | `sm` | 响应式栏数或包含 span、offset、order 的对象 | 响应式对象与隐藏恢复 | | `md` | 响应式栏数或包含 span、offset、order 的对象 | 响应式对象与隐藏恢复 | | `span` | 占用栏数;0 隐藏 | 响应式对象与隐藏恢复 | Example source: src/col/__demos__/flex.vue ```vue ``` ### 响应式对象与隐藏恢复 Example source: src/col/__demos__/responsive.vue ```vue ``` ## 内容与展示 ### 排序与零值恢复 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `span` | 占用栏数;0 隐藏 | 排序与零值恢复 | | `order` | 排序,0 可恢复 | 排序与零值恢复 | Example source: src/col/__demos__/order.vue ```vue ``` ## API ### Props | 属性 | 说明 | Type | Default | | --- | --- | --- | --- | | span | 占用栏数;0 隐藏 | `number` | `24` | | offset | 左侧偏移,0 可恢复 | `number` | `undefined` | | order | 排序,0 可恢复 | `number` | `undefined` | | xs | 响应式栏数或包含 span、offset、order 的对象 | `number / ColSizeDescriptor` | `undefined` | | sm | 响应式栏数或包含 span、offset、order 的对象 | `number / ColSizeDescriptor` | `undefined` | | md | 响应式栏数或包含 span、offset、order 的对象 | `number / ColSizeDescriptor` | `undefined` | | lg | 响应式栏数或包含 span、offset、order 的对象 | `number / ColSizeDescriptor` | `undefined` | | xl | 响应式栏数或包含 span、offset、order 的对象 | `number / ColSizeDescriptor` | `undefined` | | xxl | 响应式栏数或包含 span、offset、order 的对象 | `number / ColSizeDescriptor` | `undefined` | | flex | 弹性比例、固定长度或 CSS flex 值 | `number / string` | `undefined` | ### Events | Event | Description | | --- | --- | | click | 原生 MouseEvent,每次点击一次 | ### Slots | Slot | Description | | --- | --- | | default | 布局内容 | ### Methods | Method | Description | | --- | --- | 排序示例关闭倒序后,各列恢复 `order: 0`。响应式断点依据浏览器视口,而非 Demo 卡片宽度;仅加宽卡片不会触发断点。`span: 0` 隐藏列,匹配更大断点后可恢复。 ## 响应式与可访问性 断点基于浏览器视口:xs 为基础值,sm ≥576、md ≥768、lg ≥992、xl ≥1200、xxl ≥1600px;从最大匹配断点向下取已配置值。SSR 首屏使用 xs,挂载后响应视口;Grid 折叠和动态排序在挂载后计算。组件为布局容器,不增加键盘快捷键;内容语义及可聚焦元素由调用者提供。没有公开方法和专用主题 Token。 ## 导入 Grid 仅包含 Grid.Item;Row、Col 是独立组件,拥有独立源码、样式、菜单、文档和 Demo。已移除 Grid.Row/Grid.Col、Grid 入口的 Row/Col 转导出以及 GridRowInstance/GridColInstance。请从库根入口或独立 row/col 入口导入;安装 Grid 不再自动注册 Row/Col。 --- Document: llms/zh-CN/components/collapse.md # Collapse 可以折叠 / 展开的内容区域。 ## 基础示例 ### 基础用法 用于将复杂的内容区域分组和隐藏,可折叠或展开。默认可以展开多个面板。 Example source: src/collapse/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 禁用 通过 `disabled` 禁用面板。 Example source: src/collapse/__demos__/disabled.vue ```vue ``` ## 布局与排列 ### 嵌套面板 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-value` | 非受控初始展开面板 | 嵌套面板、展开图标位置 | | `destroy-on-hide` | 是否在隐藏时销毁内容 | 嵌套面板 | | `offset` | 展开面板是否显示间距 | 展开间距 | | `expand-icon-position` | 展开图标在标题区域的 left 或 right 位置,默认 left;不控制内容展开方向 | 展开图标位置 | | `show-expand-icon` | 是否显示展开图标;未设置时由子项决定 | 展开图标位置 | 面板多层嵌套。 Example source: src/collapse/__demos__/nested.vue ```vue ``` ### 展开间距 通过 `offset` 控制展开面板之间的间距。 Example source: src/collapse/__demos__/offset.vue ```vue ``` ### 展开图标位置 通过 `expand-icon-position` 属性设置展开图标的位置。 Example source: src/collapse/__demos__/icon-position.vue ```vue ``` ## 内容与展示 ### 手风琴模式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-value` | 非受控初始展开面板 | 手风琴模式、边框与分隔线、展开图标 | | `accordion` | 手风琴模式,同时最多展开一项 | 手风琴模式 | | `bordered` | 是否显示边框 | 边框与分隔线 | | `divider` | 是否显示面板分割线 | 边框与分隔线 | | `destroy-on-hide` | 是否在隐藏时销毁内容 | 隐藏时销毁 | 通过 `accordion` 开启手风琴模式,同时只能打开一个面板。手风琴模式下 `modelValue` 仍为数组,最多包含一项。 Example source: src/collapse/__demos__/accordion.vue ```vue ``` ### 边框与分隔线 比较外边框和面板间分隔线,分别展开面板观察两种装饰的边界。
配置说明与使用限制 #### 无边框模式 通过设置 `bordered="false"` 隐藏边框。 #### 分割线 通过 `divider` 控制面板之间的分割线。
Example source: src/collapse/__demos__/border-comparison.vue ```vue ``` ### 额外节点 通过 `extra` 可以设置额外节点。点击 `extra` 区域不会触发展开。 Example source: src/collapse/__demos__/extra.vue ```vue ``` ### 展开图标 为展开项自定义展开图标。父级 `expand-icon` 插槽会下发给未自定义图标的子项。 Example source: src/collapse/__demos__/expand-icon.vue ```vue ``` ### 隐藏时销毁 通过设置 `destroy-on-hide` 可以让面板内容在隐藏时销毁。 Example source: src/collapse/__demos__/destroy.vue ```vue ``` ## 自定义与插槽 ### 自定义样式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-value` | 非受控初始展开面板 | 自定义样式 | | `bordered` | 是否显示边框 | 自定义样式 | 自定义面板样式。 Example source: src/collapse/__demos__/custom.vue ```vue ``` ## 交互与控制 ### 切换全部 通过 `toggleAll` 批量展开 / 收起面板。手风琴模式下不可用。 Example source: src/collapse/__demos__/toggle-all.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。标题文字与扩展内容继承阅读方向,展开状态不因切换方向改变。expand-icon-position 的 left/right 始终表示物理侧,不改为逻辑起止;自定义展开图形不额外镜像。 ## API 主值使用普通 `v-model`:`modelValue` 表示展开面板的 name 数组,手风琴模式也使用数组。`defaultValue` 仅在创建时初始化非受控状态,之后修改不会重置当前值;初始化不触发 `update:modelValue`。提供 `modelValue` 时由父级控制,以受控值为准。 ### Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | model-value | 当前展开面板的 name,支持 v-model | `(string \| number)[]` | `—` | | default-value | 非受控初始展开面板 | `(string \| number)[]` | `[]` | | accordion | 手风琴模式,同时最多展开一项 | `boolean` | `false` | | show-expand-icon | 是否显示展开图标;未设置时由子项决定 | `boolean` | `—` | | expand-icon-position | 展开图标在标题区域的 left 或 right 位置,默认 left;不控制内容展开方向 | `'left' \| 'right'` | `'left'` | | bordered | 是否显示边框 | `boolean` | `true` | | divider | 是否显示面板分割线 | `boolean` | `true` | | offset | 展开面板是否显示间距 | `boolean` | `false` | | destroy-on-hide | 是否在隐藏时销毁内容 | `boolean` | `false` | ### Events | Event | Description | Arguments | | --- | --- | --- | | update:model-value | 请求更新展开面板 | `(string \| number)[]` | | change | 展开面板变化时触发 | `(string \| number)[]`, `Event` | ### Slots | Slot | Description | Scope | | --- | --- | --- | | default | 面板列表 | `—` | ### Methods | Method | Description | | --- | --- | | toggleAll | 开启或关闭所有面板(手风琴模式下无效) | 父级可通过 `expand-icon` 插槽下发默认展开图标,作用域为 `expanded`、`disabled`、`position`。该插槽由子项读取,不在根节点渲染。 #### CollapseToggleAllOptions | 参数 | 描述 | 类型 | 默认值 | | --- | --- | --- | --- | | expand | `'inverse'` 切换全部;`boolean` 控制全部展开或收起 | `'inverse' \| boolean` | `—` | | skipDisabled | 是否跳过禁用面板 | `boolean` | `false` | ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | --- | --- | --- | --- | | name **(必填)** | 面板唯一标识,对应 `modelValue` 中的值 | `string \| number` | `—` | | title | 面板的标题 | `string` | `—` | | disabled | 是否禁用 | `boolean` | `false` | | show-expand-icon | 是否显示展开图标 | `boolean` | `true` | | destroy-on-hide | 是否在隐藏时销毁内容 | `boolean` | `false` | ### `` Slots | 插槽名 | 描述 | 参数 | | --- | --- | --- | | title | 面板的标题 | `—` | | extra | 额外内容 | `—` | | expand-icon | 展开图标 | expanded: `boolean`
disabled: `boolean`
position: `'left' \| 'right'` | | default | 面板内容 | `—` | ### 类型定义 组件导出以下类型定义。`Collapse.Item` 与 `CollapseItem` 为同一组件。 ```ts import type { CollapseInstance, CollapseToggleAllOptions, ExpandIconPosition } from '@cedar-design/ui' ``` ## 颜色变量 Collapse 的公开颜色变量使用 system 语义作为默认值,Cedar 与 Maple 保持一致: | 变量 | 默认语义 | | --- | --- | | `--c-collapse-border-color` | `--c-sys-color-border-default` | | `--c-collapse-title-bg` | `--c-sys-color-surface-default` | | `--c-collapse-title-bg-active` | `--c-sys-color-surface-default` | | `--c-collapse-title-bg-disabled` | `--c-sys-color-surface-default` | | `--c-collapse-title-text-color` | `--c-sys-color-content-primary` | | `--c-collapse-title-text-color-disabled` | `--c-sys-color-content-disabled` | | `--c-collapse-content-text-color` | `--c-sys-color-content-primary` | | `--c-collapse-content-text-color-disabled` | `--c-sys-color-content-disabled` | | `--c-collapse-content-bg` | `--c-sys-color-surface-muted` | | `--c-collapse-expand-icon` | `var(--c-sys-color-content-secondary)` | | `--c-collapse-item-border-color` | `--c-sys-color-border-default` | ### 减少动态效果 内置 CSS 过渡遵循 `prefers-reduced-motion: reduce`。关闭过渡不改变最终显隐、选中/展开状态及事件语义;插槽内自定义动画由应用自行控制。 --- Document: llms/zh-CN/components/color-picker.md # ColorPicker 颜色选择**面板**(默认无触发器)。 表单字段请使用 [`Color`](llms/zh-CN/components/color.md)。 ## 基础示例 ### 基本用法 默认只渲染面板。 Example source: src/color-picker/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 禁用 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-value` | 默认值 | 禁用 | | `disabled` | 禁用 | 禁用 | | `hide-trigger` | 无触发器,仅面板 | 禁用 | | `show-text` | 显示颜色值 | 禁用 | Example source: src/color-picker/__demos__/disabled.vue ```vue ``` ## 内容与展示 ### 预设颜色和历史颜色 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-value` | 默认值 | 预设颜色和历史颜色 | | `history-colors` | 历史颜色 | 预设颜色和历史颜色 | | `show-history` | 显示历史颜色 | 预设颜色和历史颜色 | | `show-preset` | 显示预设颜色 | 预设颜色和历史颜色 | 通过 `showPreset` 和 `showHistory` 开启预设颜色和历史颜色区域。 Example source: src/color-picker/__demos__/colors.vue ```vue ``` ## 数据与选项 ### 颜色格式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-value` | 默认值 | 颜色格式 | | `format` | 颜色值格式 | 颜色格式 | | `show-text` | 显示颜色值 | 颜色格式 | | `hide-trigger` | 无触发器,仅面板 | 颜色格式 | 通过 `format` 设置颜色值的格式,支持 `hex` 和 `rgb`。 Example source: src/color-picker/__demos__/format.vue ```vue ``` ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | --- | --- | --- | --- | | model-value **(v-model)** | 绑定值 | `string` | `-` | | default-value | 默认值 | `string` | `-` | | format | 颜色值格式 | `'hex' \| 'rgb'` | `-` | | size | 尺寸 | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | | show-text | 显示颜色值 | `boolean` | `false` | | show-history | 显示历史颜色 | `boolean` | `false` | | show-preset | 显示预设颜色 | `boolean` | `false` | | disabled | 禁用 | `boolean` | `false` | | disabled-alpha | 禁用透明通道 | `boolean` | `false` | | hide-trigger | 无触发器,仅面板 | `boolean` | `true` | | history-colors | 历史颜色 | `string[]` | `-` | | preset-colors | 预设颜色 | `string[]` | `-` | ### 透传配置的现有优先级(F07) 现有 triggerProps 在部分内部 Trigger 配置之后展开,嵌套 disabled 等字段目前可以覆盖内部传值。F07 兼容阶段保留该顺序和类型,不套用 AutoComplete 的托管字段规则;不新增安全子集承诺,也不自动禁止这些旧能力。 拖动监听绑定控件所属视图。KeepAlive 停用或卸载会结束当前手势并释放监听;重新激活后需重新开始手势,旧手势回调不能继续改值。 --- Document: llms/zh-CN/components/color.md # Color 表单颜色字段(带触发器)。内部使用 `ColorPicker`。 纯面板请使用 [`ColorPicker`](llms/zh-CN/components/color-picker.md)(默认无触发器)。设计 Token 色板见 [颜色 Color](llms/zh-CN/components/style/color.md)。 ## 基础示例 ### 基本用法 Example source: src/color/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 尺寸 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ----------- | ---------- | -------- | | `size` | 尺寸 | 尺寸 | | `show-text` | 显示颜色值 | 尺寸 | Example source: src/color/__demos__/size.vue ```vue ``` ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### Props | 参数 | 说明 | 类型 | 默认值 | | -------------------- | ------------------ | ---------------------------- | ------- | | `model-value` | 绑定值 | `string` | `-` | | `format` | 颜色格式 | `hex \| rgb` | `-` | | `size` | 尺寸 | `xs \| sm \| md \| lg \| xl` | `md` | | `show-text` | 显示颜色值 | `boolean` | `false` | | `show-history` | 显示历史颜色 | `boolean` | `false` | | `show-preset` | 显示预设颜色 | `boolean` | `false` | | `disabled` | 禁用 | `boolean` | `false` | | `disabled-alpha` | 禁用透明通道 | `boolean` | `false` | | `color-picker-props` | 透传给 ColorPicker | `object` | `{}` | ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 拖动监听绑定控件所属视图。KeepAlive 停用或卸载会结束当前手势并释放监听;重新激活后需重新开始手势,旧手势回调不能继续改值。 --- Document: llms/zh-CN/components/config-provider.md # ConfigProvider 在应用的最外层进行配置,一次设置,全局生效。一般用于设置国际化语言等功能。 ## 基础示例 ### 基础用法 通过 Provider 为子组件设置统一尺寸,点击按钮在 sm / lg 之间切换;内部 Input 和 Button 无需重复声明 size。 Example source: src/config-provider/__demos__/basic.vue ```vue ``` ## API ### ConfigProvider Props | 属性 | 说明 | 类型 | 默认值 | | ---- | -------- | ------ | ------ | | dir | 阅读方向;省略时继承来源作用域。物理 left/right 方位保持原意。 | `ReadingDirection` (`ltr` / `rtl`) | — | | type | 参数类型 | string | - | ### ConfigProvider Events | 事件名 | 说明 | 参数 | | ------ | -------------- | ----------------------------- | | click | 点击触发的事件 | `(event: MouseEvent) => void` | ### ConfigProvider Slots | 插槽名 | 说明 | | ------- | -------------- | | default | 自定义默认内容 | ## 类型定义 组件导出以下类型定义 ```ts import type { ConfigProviderProps } from '@cedar-design/ui' ``` ## 阅读方向 使用 `` 设置局部 RTL;省略 dir 时继承父级,可嵌套 `dir="ltr"` 切回 LTR。普通原生 DOM dir 容器同样有效。Provider 使用 display: contents 的 div 承载方向,不增加布局盒子;请放在允许 div 的 HTML 上下文中。它不会修改整个 document。发布前将原 rtl 布尔配置统一收敛为 dir;明确表示物理左右的方位 API 保持原意。 --- Document: llms/zh-CN/components/count-to.md # CountTo 数字动画 展示起始数值到目标数值的数字动画。 ## 基础示例 ### 基础用法 通过 `from` 和 `to` 指定起始值与目标值。 Example source: src/count-to/__demos__/basic.vue ```vue ``` ## 内容与展示 ### 精度、时长与动画曲线 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `to` | 目标值 | 精度、时长与动画曲线 | | `precision` | 小数精度 | 精度、时长与动画曲线 | | `duration` | 动画持续时间(毫秒) | 精度、时长与动画曲线 | | `timing-function` | 动画缓动函数 | 精度、时长与动画曲线 | 比较小数精度对最终文本的影响,以及时长和缓动曲线对数字变化过程的影响;手动启动、暂停另行展示。
配置说明与使用限制 #### 精度 通过 `precision` 控制小数位数。 #### 自定义时长 通过 `duration` 指定动画时长(毫秒)。 #### 自定义动画曲线 通过 `timing-function` 指定缓动函数。
Example source: src/count-to/__demos__/number-format-comparison.vue ```vue ``` ## 自定义与插槽 ### 自定义样式 通过默认插槽自定义展示内容,插槽参数为当前数值。 Example source: src/count-to/__demos__/custom.vue ```vue ``` ## 交互与控制 ### 手动控制 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `to` | 目标值 | 手动控制 | | `auto-start` | 是否自动开始播放动画 | 手动控制 | 设置 `auto-start` 为 `false`,通过 `start`、`pause`、`reset` 手动控制动画。 Example source: src/count-to/__demos__/manual.vue ```vue ``` ## API ### CountTo Props | 属性 | 说明 | 类型 | 默认值 | | ----------------- | ------------------------ | ------------------------ | -------- | | from | 起始值 | _number \| string_ | `0` | | to | 目标值 | _number \| string_ | `0` | | duration | 动画持续时间(毫秒) | _number \| string_ | `2000` | | precision | 小数精度 | _number \| string_ | `0` | | auto-start | 是否自动开始播放动画 | _boolean_ | `true` | | timing-function | 动画缓动函数 | _(v: number) => number_ | `-` | ### CountTo Events | 事件名 | 说明 | 回调参数 | | ------ | -------------- | -------- | | end | 动画结束时触发 | `-` | ### CountTo Slots | 插槽名 | 说明 | 参数 | | ------- | ---------- | ----------------- | | default | 自定义内容 | `value: number` | ### CountTo Methods | 方法名 | 说明 | 参数 | 返回值 | | ------ | ---------------------------------------------------------------- | ---- | ------ | | start | 开始动画 | `-` | `-` | | pause | 暂停动画 | `-` | `-` | | reset | 重置动画;若 `auto-start` 为 `true`,重置后会自动开始播放 | `-` | `-` | ## 类型定义 组件导出以下类型定义 ```ts import type { CountToProps, CountToInstance } from '@cedar-design/ui' ``` ### 样式变量 | 变量名 | 默认值 | | ----------------------------- | -------------------------- | | `--c-count-to-text-color` | `var(--c-sys-color-content-primary)` | | `--c-count-to-text-font-size` | `var(--c-font-size-lg)` | ## 同源实现与平台边界 两端各自保存完整源码,不引用公共核心,不共享组件实例或响应式状态;修改时同步维护两份实现。主体、Props、关键样式及配对测试纳入只读源码一致性检查,主题 token 和安装入口各自维护。 动画在卸载及 KeepAlive 停用时暂停,重新激活后恢复;各实例的数值和动画状态独立。 --- Document: llms/zh-CN/components/countdown.md # Countdown 倒计时 ### Countdown 业务时钟与停用边界 Countdown 的 RAF 刷新业务剩余时间,不是视觉插值;CSS duration/减少动效不能改变业务计时。暂停与 KeepAlive 停用冻结剩余时间,重新激活按冻结值续跑,不把停用期间计入消耗。停用时更新 time/reset 可更新剩余数据及 change 通知,但不申请 RAF;auto-start 的启动延后到激活,手动 pause 取消待恢复。停用期间直接 start 被忽略,卸载后的 start/reset 不再通知或调度。 实时展示剩余时长,支持暂停、重置与毫秒精度。 `time` 为剩余时长(毫秒)。若要对准某个时刻,传入 `deadline - Date.now()`。 ## 基础示例 ### 基础用法 Example source: src/countdown/__demos__/basic.vue ```vue ``` ## 内容与展示 ### 时间格式与自定义内容 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `time` | 倒计时时长(毫秒) | 时间格式与自定义内容、嵌入 Statistic | | `format` | 展示格式 | 时间格式与自定义内容、嵌入 Statistic | 比较单位格式、毫秒显示和自定义时间片段。使用各示例中的时间字段检查最终文本,而非把精度与启动控制混在一起。
配置说明与使用限制 #### 显示毫秒 通过 `S` / `SS` / `SSS` 展示毫秒。 #### 自定义格式 `format` 占位符为 `DD` / `HH` / `mm` / `ss` / `S`(`SS` / `SSS`)。未出现的高位会累加到下一级。 #### 自定义样式 默认插槽参数为 `timeData`,可按天、时、分、秒分别渲染。
Example source: src/countdown/__demos__/format-comparison.vue ```vue ``` ### 嵌入 Statistic 未传入 `value` 时,Statistic 可用默认插槽嵌入 Countdown。 Example source: src/countdown/__demos__/statistic.vue ```vue ``` ## 交互与控制 ### 手动控制 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `time` | 倒计时时长(毫秒) | 手动控制 | | `auto-start` | 是否自动开始倒计时 | 手动控制 | | `format` | 展示格式 | 手动控制 | 设置 `auto-start` 为 `false`,通过 `start`、`pause`、`reset` 控制。倒计时结束时触发 `end`。 Example source: src/countdown/__demos__/manual.vue ```vue ``` ## API ### Countdown Props | 属性 | 说明 | 类型 | 默认值 | | ------------- | ------------------------------------------ | -------------------- | ------------ | | `time` | 倒计时时长(毫秒) | `number \| string` | `0` | | `format` | 展示格式 | `string` | `'HH:mm:ss'` | | `auto-start` | 是否自动开始倒计时 | `boolean` | `true` | ### format 占位符 | 格式 | 说明 | | ----- | ------------- | | `DD` | 天数 | | `HH` | 小时 | | `mm` | 分钟 | | `ss` | 秒 | | `S` | 毫秒(1 位) | | `SS` | 毫秒(2 位) | | `SSS` | 毫秒(3 位) | ### Countdown Events | 事件名 | 说明 | 参数 | | -------- | ---------------- | --------------------- | | `change` | 倒计时变化时触发 | `timeData: TimeData` | | `end` | 倒计时结束时触发 | `-` | ### Countdown Slots | 插槽名 | 说明 | 参数 | | --------- | ---------- | --------------------- | | `default` | 自定义内容 | `timeData: TimeData` | ### TimeData | 名称 | 说明 | 类型 | | -------------- | -------- | -------- | | `days` | 剩余天数 | `number` | | `hours` | 剩余小时 | `number` | | `minutes` | 剩余分钟 | `number` | | `seconds` | 剩余秒 | `number` | | `milliseconds` | 剩余毫秒 | `number` | ### Countdown Methods | 方法名 | 说明 | 参数 | 返回值 | | ------- | ----------------------------------------------------------------- | ---- | ------ | | `start` | 开始倒计时 | `-` | `-` | | `pause` | 暂停倒计时 | `-` | `-` | | `reset` | 重置倒计时;若 `auto-start` 为 `true`,重置后会自动开始 | `-` | `-` | ## 类型定义 组件导出以下类型定义 ```ts import type { CountdownProps, CountdownInstance, TimeData } from '@cedar-design/ui' ``` ### 样式变量 | 变量名 | 默认值 | | ------------------------------- | -------------------------- | | `--c-countdown-text-color` | `var(--c-sys-color-content-primary)` | | `--c-countdown-text-font-size` | `var(--c-font-size-lg)` | ## 同源实现与平台边界 两端各自保存完整源码,不引用公共核心,不共享组件实例或响应式状态;修改时同步维护两份实现。主体、Props、关键样式及配对测试纳入只读源码一致性检查,主题 token 和安装入口各自维护。 SSR 输出初始格式化时间。暂停时修改 format 会更新显示;结束事件每轮只触发一次,reset 后可开始新一轮;卸载清理动画帧。 --- Document: llms/zh-CN/components/date-picker.md # DatePicker 日期选择**面板**(默认无触发器)。通过 `type` 切换年/月/周/日/季度。 ### 单值快捷预览等待(2026-10-16) 离开快捷项后的100ms为悬停交互宽限,不是CSS动画完成时长;不提交模型。新预览、关闭、禁用、只读、关闭快捷预览、模型替换、停用/卸载使旧等待失效;已取消/已消费回调不能清掉新预览。重新激活只接受新hover,不恢复旧等待。保留100ms默认值与公开API,无新CSS Token。 表单字段请使用 [`Date`](llms/zh-CN/components/date.md);日期范围字段请使用 [`DateRange`](llms/zh-CN/components/date-range.md);范围面板请使用 [`DateRangePicker`](components/date-range-picker)。 根入口和 date 子路径均导出 DatePicker、DatePickerProps、DatePickerInstance、DatePickerType、DatePickerOptions、DatePickerEmits。面板可以单独 app.use 安装,也可使用 Date.Picker。Options 只允许展示配置,不含模型、格式、边界和禁用规则。没有独立的 date-picker/date-range-picker npm 子路径。 两端共同支持 abbreviation;日期语言使用全局 Locale。移动端 presentation、multiple/range、触摸手势及面板外观为真实展示差异,不把差集机械补成空 API。 ## 基础示例 ### 基本用法 默认只渲染面板。 Example source: src/date/picker/__demos__/basic.vue ```vue ``` ## 日期视图与展示 ### 选择类型 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `type` | 面板类型 | 选择类型、月份标签、日期语言的实例隔离 | | `disable-confirm` | 选择后立即提交 | 月份标签、窄屏与组合面板 | | `day-start-of-week` | 每周第一天(仅日历),整数 0~6 | 日期语言的实例隔离 | | `show-time` | 选择时间 | 窄屏与组合面板 | 通过 `type` 切换面板类型。 Example source: src/date/picker/__demos__/mode.vue ```vue ``` ### 月份标签 `abbreviation`(boolean,默认 `true`)控制日历月份网格的缩写;`false` 使用当前 Locale 的完整月份名。运行时修改立即生效,不改变值,也不触发选择事件。此开关不影响星期标签、标题、滚轮列或值格式。范围日历以顶层选项为准,嵌套日历参数不能覆盖。 Example source: src/date/picker/__demos__/month-labels.vue ```vue ``` ### 语言与嵌套日历参数 日期标签、标题和动作接入各库的全局 Locale 与既有 Provider。Cedar 删除日期组件级 `locale`,不保留覆盖字典或兼容别名。切换语言不会选择或提交日期。 ### 日期语言的实例隔离 日期所有者读取本库全局 Locale/Provider,周起始日由各实例 `day-start-of-week` 管理。不切换宿主 Dayjs 默认语言,也不覆盖宿主基础语言配置;只在各库命名空间下注册日期语言元数据,组件实例与源码不跨库共享。 `value-format` 是稳定英文日期协议(包括月份名称 token),`format` 的显示及手输文本使用界面语言。切换语言不会改写模型,也不会令英文月份名称模型失效。默认数字协议、Date 对象、时间戳不变。中文核心语言与 Maple 内置语言数据已接入;其他日期格式优先使用已注册 Dayjs 语言数据,未加载的语言安全回退英文。 周号和周比较不再依赖全局周起始设置,跨年同周号不能被误判成同一周。两个不同周起始实例的挂载、更新和卸载互不影响。 Example source: src/date/picker/__demos__/locale-isolation.vue ```vue ``` ### 编辑容器与面板复用 DatePicker / DateRangePicker 独立使用时自带表面背景和操作区;actions 插槽替换整个默认操作区。嵌入 Form 的弹层时,统一外壳负责标题、关闭与底部确认,日期面板只贡献此刻等辅助操作,避免重复确认。关闭放弃草稿,确认失败仍保留草稿。 ### 窄屏与组合面板 独立面板随容器宽度收缩;范围日历在空间不足时上下排列。可切换快捷项位置,检查时间、导航与确认操作。 Example source: src/date/picker/__demos__/responsive-panels.vue ```vue ``` ## 时间与选择规则 ### 带时间 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `show-time` | 选择时间 | 带时间、禁用部分日期、内嵌时间与滚轮展示 | | `format` | 展示格式 | 带时间、内嵌时间与滚轮展示 | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | 当前日期与范围策略、内嵌时间与滚轮展示 | | `default-value` | 非受控初始值,仅初始化读取 | 带时间 | | `disabled-date` | 禁用日期 | 禁用部分日期 | | `disabled-time` | 当前日期、端点的时间禁用列表 | 禁用部分日期 | Example source: src/date/picker/__demos__/show-time.vue ```vue ``` ### 禁用部分日期 Example source: src/date/picker/__demos__/disabled-parts.vue ```vue ``` ### 当前日期与范围策略 Example source: src/date/picker/__demos__/current-range.vue ```vue ``` | 属性 | 说明 | 默认值 | | ----------------- | -------------------------------------------------- | ------ | | `show-current` | 日历中高亮当前日/月/年,不产生选择或提交 | true | | `show-now-button` | DatePicker 单选面板的选择当前按钮,多选/范围不显示 | true | 选择当前按面板 type、时间精度与 value-format 生成候选,遵守 disabled/readonly、min/max、日期和时间禁用规则及 disable-confirm。disable-confirm=false 时只选择草稿,确认才提交;挂载或改变高亮均不写模型。字段通过 date-picker-props 配置。旧 showNowBtn 名称已删除,不保留别名。 actions 插槽提供 `{ confirm, disabled, selectNow, nowDisabled }`。自定义按钮应调用这两个受保护动作,不应直接写模型。 DateRangePicker 的 `exchange-time` 默认 true。反序交互日期在 true 时交换整个日期时间端点;false 时只交换日期、保留起止位置的时分秒。结果仍须通过端点规则和锁定端点校验。外部模型、手输值和快捷项不静默重排;保留时间位置后同日时间仍逆序的候选不能提交。Cedar 原 ConfigProvider.exchangeTime 全局覆盖已移除。 ### 内嵌时间与滚轮展示 `time-picker-props` 使用 `DateTimePickerOptions`:`use12Hours`、`step`、`hideDisabledOptions`、`class`、`style`。仅配置时间展示;日期值、格式/秒精度、约束和确认仍由日期所有者管理。`step` 负责展示采样,不静默修正外部值。未知参数及监听函数不转发。 Example source: src/date/picker/__demos__/time-presentation.vue ```vue ``` ## 快捷工具与定制 ### 预设快捷选择 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `disable-confirm` | 选择后立即提交 | 快捷选项与日历视口、字段与嵌入式面板 | | `show-time` | 选择时间 | 预设快捷选择 | | `day-start-of-week` | 每周第一天(仅日历),整数 0~6 | 字段与嵌入式面板 | Example source: src/date/picker/__demos__/short-cuts.vue ```vue ``` ### 额外页脚 Example source: src/date/picker/__demos__/footer.vue ```vue ``` ### 快捷选项与日历视口 Example source: src/date/picker/__demos__/panel-tools.vue ```vue ``` 两端均导出 `DateShortcut`、`DateShortcutsPosition`。快捷项包含 `label`、`value`(值或按需执行的函数)、可选 `format`(快捷值的输入格式)与 `disabled`;输出使用面板的 `value-format`。悬停或聚焦只预览,不提交;点击走普通日期选择的校验与确认流程。设置 `preview-shortcut=false` 仅关闭预览。`shortcuts-position` 支持 left/bottom/right,移动端建议 bottom。 `picker-value` 管理日历视口,不是选中值;`default-picker-value` 仅初始化读取。范围视口为两个日期。导航发出 `update:picker-value` 和 `picker-value-change(value, dates, texts)`,不触发 `change` 或 `select`;受控更新不被接纳时保留原视口。`select-shortcut(shortcut)` 仅在快捷项通过校验并被接受后触发。移动端滚轮/时钟展示不提供日历月份导航。字段通过 `date-picker-props` 配置这些选项,转发上述三个事件。 ### 字段与嵌入式面板 字段管理输入与浮层,纯面板直接嵌入页面。日历周起点统一为 day-start-of-week(数字 0~6,0 为周日),动态修改立即生效。 本例纯面板显式设置 `:disable-confirm="false"`:点击日期只修改草稿,“已提交”在确认后更新。切换周起点或移除边界不提交新值;恢复边界不会清除已有模型,超出新边界的草稿不能确认,请重新选择合法日期。 面板箭头提供可访问名称,并跟随组件语言系统切换;日面板为上一月/下一月,月份面板为上一年/下一年,年份列表为上一组/下一组年份。月份预览变化不等于提交日期。 Example source: src/date/picker/__demos__/entry-boundary.vue ```vue ``` ## 阅读方向 组件继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部方向覆盖。日历日期、月份、年份按阅读顺序排列,前后翻页图形随方向调整,日期值与起止顺序保持原义。分页网格中左右键按视觉方向移动焦点,上下键移动一行,Home/End 移至当前行首尾并跳过禁用项;焦点移动不提交,Enter/Space 沿用选值行为,边界停留在当前显示网格。快捷区 `shortcuts-position="left|right"` 保持物理侧,底部使用 `bottom`。弹层继承字段来源方向。 ## API ### Props 纯面板不接收 open/default-open、popup-container、placement、trigger-props、placeholder、variant、clearable 等字段/浮层属性。浮层配置请使用 Date/DateRange 的 popup-props;输入可编辑性使用字段 input-editable。确认区只由 disable-confirm 控制,不再使用 show-confirm-btn。 | 参数 | 说明 | 类型 | 默认值 | | ------------------- | ------------------------------- | ------------------------------------------ | ------- | | `model-value` | 绑定值 | `Date \| string \| number` | `-` | | `type` | 面板类型 | `date \| week \| month \| year \| quarter` | `date` | | `format` | 展示格式 | `string \| Function` | `-` | | `day-start-of-week` | 每周第一天(仅日历),整数 0~6 | `DateWeekStart` | `0` | | `readonly` | 只读,不更改选择 | `boolean` | `false` | | `time-picker-props` | 本库时间面板展示选项 | `Partial` | `-` | | `show-time` | 选择时间 | `boolean` | `false` | | `disabled` | 禁用 | `boolean` | `false` | | `disabled-date` | 禁用日期 | `Function` | `-` | 桌面日历展示能力(快捷选择、页脚和单元格插槽)保留在独立的 presentation 实现中。 ### 日期族统一契约 | 参数 | 说明 | 类型 | 默认值 | | ----------------- | ------------------------------------------------------- | ------------------------------------------------ | ------- | | `default-value` | 非受控初始值,仅初始化读取 | DateValue / DateValue[] | — | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | string | 随 type | | `min` / `max` | 包含端点的边界;字符串按 value-format 解析 | DateValue | — | | `disabled-time` | 当前日期、端点的时间禁用列表 | (date: Date, side: DateSide) => DateDisabledTime | — | | `disable-confirm` | 选择后立即提交 | boolean | true | `DateValue = Date | string | number`。单值清除为 undefined,范围清除为 []。 `disabledDate(date, side)` 和 `disabledTime(date, side)` 的 date 始终为 Date,side 为 start/end。 时间回调返回 `disabledHours()`、`disabledMinutes(hour)`、`disabledSeconds(hour, minute)` 数字列表。 非法日期、不完整或逆序范围不能提交;确认时重新验证动态禁用规则。范围锁定端点不能被清除或改动。 嵌套面板 props 只配置展示,不得覆盖顶层 model-value、格式、边界、禁用规则或控制事件。 ### Events | 事件 | 说明 | 参数 | | -------------------- | ----------------------- | --------------------------------- | | `update:model-value` | 写入模型 | value | | `select` | 选择草稿,不等于提交 | value, date(s), formatted text(s) | | `change` | 有效值正式变化 | value, date(s), formatted text(s) | | `confirm` | 确认有效选择,不使用 ok | value, date(s), formatted text(s) | 设置 `:disable-confirm="false"` 显示确认区;`actions` 插槽提供 `{ confirm, disabled }`,自定义操作仍须调用 confirm 完成校验。 --- Document: llms/zh-CN/components/date-range.md # DateRange 表单日期范围字段(带触发器)。内部使用 `DateRangePicker`。 纯面板请使用 [`DateRangePicker`](components/date-range-picker)(默认无触发器)。 字段通过 `date-picker-props`(Date)或 `date-range-picker-props`(DateRange)配置面板的该选项。 `abbreviation`(boolean,默认 `true`)控制日历月份网格的缩写;`false` 使用当前 Locale 的完整月份名。运行时修改立即生效,不改变值,也不触发选择事件。此开关不影响星期标签、标题、滚轮列或值格式。范围日历以顶层选项为准,嵌套日历参数不能覆盖。 ## 基础示例 ### 基本用法 Example source: src/date-range/__demos__/basic.vue ```vue ``` ## 外观与日期展示 ### 外观配置对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | -------------- | ------------------------------------------------------- | ---------------------------- | | `clearable` | 可清除 | 选择类型、自定义分隔符与占位 | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | 外观配置对比 | | `type` | 选择类型 | 选择类型 | | `separator` | 分隔符 | 自定义分隔符与占位 | | `placeholder` | 占位 | 自定义分隔符与占位 | 选择一个对比维度后,同屏展示它的全部可选值;其余配置和内容保持一致。可切换其他配置检查组合效果;输入类预览共享一个值。
配置说明与使用限制 #### 外观组合 适用于预订或查询的起止日期。调整变体、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。
Example source: src/date-range/__demos__/appearance-lab.vue ```vue ``` ### 选择类型 通过 `type` 切换日 / 周 / 月 / 年 / 季度范围。 Example source: src/date-range/__demos__/mode.vue ```vue ``` ### 自定义分隔符与占位 Example source: src/date-range/__demos__/separator.vue ```vue ``` ## 时间与范围规则 ### 带时间 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | ------------------------------------------------------- | ---------------------- | | `format` | 展示格式 | 带时间、边界和端点禁用 | | `show-time` | 选择时间 | 带时间 | | `clearable` | 可清除 | 带时间 | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | 边界和端点禁用 | | `disabled-date` | 禁用日期 | 边界和端点禁用 | Example source: src/date-range/__demos__/show-time.vue ```vue ``` ### 边界和端点禁用 桌面日历需要选齐起点和终点后才能确认;点击结束输入可先选终点、再选起点。Escape 关闭时丢弃未确认的范围。 Example source: src/date-range/__demos__/boundaries.vue ```vue ``` ### 语言与嵌套日历参数 日期标签、标题和动作接入各库的全局 Locale 与既有 Provider。Cedar 删除日期组件级 `locale`,不保留覆盖字典或兼容别名。切换语言不会选择或提交日期。 ### 内嵌时间与滚轮展示 日期范围的内嵌时间选择也属于外层草稿:修改起点或终点时间不会提前写回,显式确认后才提交;取消保留原模型。日期时间手输的反序范围不会自动交换端点。 Embedded time edits update the outer range draft, not the committed model. Confirm explicitly to submit; cancel preserves the previous value. Reversed date-time text input is rejected rather than reordered. `time-picker-props` 使用 `DateTimePickerOptions`:`use12Hours`、`step`、`hideDisabledOptions`、`class`、`style`。仅配置时间展示;日期值、格式/秒精度、约束和确认仍由日期所有者管理。`step` 负责展示采样,不静默修正外部值。未知参数及监听函数不转发。 ### 真实端侧能力 Cedar 不公开 `Date.pickerProps`、`DateRange.pickerProps` 或 `DateRange.datePickerProps`:PC 字段不渲染移动滚轮或范围内部的移动日历插件,原无效参数已删除且无兼容别名。Maple 保留这些真实扩展,使用 DateWheelOptions 与 DateRangeCalendarOptions。两端通过 `Date.datePickerProps` / `DateRange.dateRangePickerProps` 配置完整面板,`timePickerProps` 配置内嵌时间展示。初始日期时间放在顶层 `defaultValue`,不要放在 `timePickerProps.defaultValue` 中。 ### 日期语言的实例隔离 日期所有者读取本库全局 Locale/Provider,周起始日由各实例 `day-start-of-week` 管理。不切换宿主 Dayjs 默认语言,也不覆盖宿主基础语言配置;只在各库命名空间下注册日期语言元数据,组件实例与源码不跨库共享。 `value-format` 是稳定英文日期协议(包括月份名称 token),`format` 的显示及手输文本使用界面语言。切换语言不会改写模型,也不会令英文月份名称模型失效。默认数字协议、Date 对象、时间戳不变。中文核心语言与 Maple 内置语言数据已接入;其他日期格式优先使用已注册 Dayjs 语言数据,未加载的语言安全回退英文。 周号和周比较不再依赖全局周起始设置,跨年同周号不能被误判成同一周。两个不同周起始实例的挂载、更新和卸载互不影响。 ### 周与季度手输 默认周展示 `gggg-wo` 按当前界面语言与实例周起始解析为该周的第一天,模型仍为 `YYYY-MM-DD`。中文周一起始的 `2020-53周` 提交 `2020-12-28`;不存在的周、错误序数后缀不提交。默认季度 `YYYY-[Q]Q`(如 `2025-Q2`)严格解析为首月,模型 `YYYY-MM`(`2025-04`)。手输继续遵守禁用、边界和范围顺序,不自动交换端点。 自定义周/季度展示可以使用 Dayjs 支持的普通日期 token;任意自定义周序数格式没有逆解析协议。`format` 为函数时请设置 `input-editable=false`,通过面板选择。 日期字段的可编辑条件由公共所有者统一管理:`input-editable` 默认 true,函数 `format` 不可反解析,因此输入只读。两端单值/范围的 Enter、失焦、组合输入、受控拒绝回写、禁用与范围顺序通过同一组原生输入测试;Maple 多选拼接文本保持只读,由面板选择。 ## 值模型与输入 ### 字符串模型:年月日、年月与月日范围 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | -------------- | ------------------------------------------------------- | -------------------------------------------------- | | `format` | 展示格式 | 字符串模型:年月日、年月与月日范围、手输与面板选择 | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | 字符串模型:年月日、年月与月日范围 | | `disabled` | 禁用 | 手输与面板选择 | `format` 决定显示,`value-format` 决定提交值。下面直接得到 `"2026-09-10"`、`"2026-09"` 或 `["09-10", "10-10"]`,无需将 Date 再转换。日期范围使用数组。`MM-DD` 没有年份,解析时使用当前年,不能表示跨年先后或某个明确年份的 2 月 29 日;有跨年、时区或闰年要求时保留 `YYYY-MM-DD`,在业务提交时单独映射月日。默认仍是 page,未指定 timeZone 使用浏览器本地时区。 Example source: src/date-range/__demos__/string-values.vue ```vue ``` ### 手输与面板选择 Example source: src/date/picker/__demos__/text-entry.vue ```vue ``` ## 交互与字段配置 ### 交互状态对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------------------- | ------------------------------------------------------- | ------------------------------------ | | `open` | 弹层显隐 | 受控关闭被拒绝、透传配置边界与优先级 | | `date-range-picker-props` | 面板展示选项 | 字段视口与快捷项事件、字段与面板边界 | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | 交互状态对比 | | `readonly` | 只读 | 交互状态对比 | | `format` | 展示格式 | 字段视口与快捷项事件 | | `popup-props` | Trigger 展示配置;不允许覆盖展开状态及规则 | 透传配置边界与优先级 | 在同一实例上切换禁用、只读和错误状态后再操作控件,比较可编辑性和交互反馈。恢复开关位于目标控件外;错误外观本身不会执行校验。
配置说明与使用限制 #### 交互状态切换 适用于预订或查询的起止日期。调整只读、错误反馈,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。
Example source: src/date-range/__demos__/state-lab.vue ```vue ``` ### 受控关闭被拒绝 父级拒绝关闭时,范围面板会保留展开;同一选择的重复确认不会再次提交或请求关闭,修改起止日期后则可以开启新的确认事务。 Example source: src/date-range/__demos__/rejected-close.vue ```vue ``` ### 字段视口与快捷项事件 字段通过嵌套 `date-range-picker-props` 配置 `pickerValue`、`defaultPickerValue` 和快捷项,不新增第二套顶层视口 Prop。嵌套配置里的监听器不会透传;在字段组件上监听以下事件并回写嵌套 `pickerValue`。 | 事件 | 说明 | 参数 | | --------------------- | -------------------------------- | --------------------------------- | | `update:picker-value` | 请求日历视口更新,不改变选择模型 | value: DateSelection | | `picker-value-change` | 已请求的视口及展示通知 | value, date(s), formatted text(s) | | `select-shortcut` | 接受的快捷项,仍遵守字段确认策略 | shortcut: DateShortcut | 受控视口拒绝更新时保持原月份,后续回写才更新;快捷项选择先进入字段草稿,默认确认后提交。滚轮/时钟没有日历月份导航能力。 Example source: src/date-range/__demos__/field-panel-tools.vue ```vue ``` ### 展示模式的所有权 Cedar 只实现桌面日历,不公开移动 `edit-mode`。Maple 在字段/纯面板根选择真实展示模式;字段嵌套 `DatePickerOptions` / `DateRangePickerOptions` 不包含 presentation,两库复制的过滤器均拒绝嵌套选择器,不通过隐式覆盖保留无效 API。 ### 周起始日的响应式展示 `dayStartOfWeek` 更新时,日历表头与日期列位置同步更新,不改变选中值或提交草稿。纯面板使用根属性,字段通过 `datePickerProps` / `dateRangePickerProps` 配置;滚轮视图不使用星期列。 ### 动态日期限制 更新或移除 `min` / `max` 会重新计算可选日期,不自动修改已有模型或草稿。面板导航与候选日期校验是不同职责,已有值超出新限制时也不会被静默重写;用户重新选择或确认时按当前限制校验。 ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 日期/时间字段在 inline 下沿用原确认策略;在 click/dblclick 编辑展示中,内部纯面板隐藏确认工具栏,由编辑层提供唯一一组确认/取消。独立 DatePicker、DateRangePicker、TimePicker、TimeRangePicker 保留原有面板 API 和确认行为,不继承 Form 的字段展示。 ### 范围日历的视口与选择 默认双日历从起始日期所在月开始显示连续两个月;两侧外部箭头联动翻月,跨年连续。月份/年份标题选择同步调整相邻面板,视口导航只发 picker-value 事件,不修改选中范围。显式 picker-value / default-picker-value 可以指定独立视口;同月或逆序视口只在显示层纠正,不回写受控值。 已有范围时重新点选第一个日期会进入未完成草稿,确认暂时禁用;第二个端点合法后才可确认。反向点选按日期排序,取消恢复先前已提交值。禁用端点和日期/时间限制仍在选择及确认时校验。 独立 DatePicker / DateRangePicker 与 inline 共用日历基准宽度(每个 265px)。单日期带时间时,宽屏下日历与时间列左右排列;范围在宽屏保留两个并排日历。面板会按窄容器换行,侧边快捷项另占一列,不压缩日历;确认与 actions 插槽保持由面板自身管理。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 ### 字段与面板边界 字段保留输入和浮层状态;嵌套面板参数只接受展示选项,不能覆盖顶层模型、格式或校验规则。 Example source: src/date-range/__demos__/entry-boundary.vue ```vue ``` ### 日期值格式 两端使用独立复制的日期值、约束、面板和字段主体。年/月/日模型格式为 `YYYY` / `YYYY-MM` / `YYYY-MM-DD`,日期时间默认含秒;`format="YYYY-MM-DD HH:mm"` 与 `value-format="YYYY-MM-DD HH:mm"` 使用分钟字符串。`format` 只控制显示,`value-format` 控制模型和事件,支持自定义格式、`Date` 与 `timestamp`。Cedar 另提供周/季度面板;Maple 另提供移动端滚轮和时钟展示。 起止输入使用同一字段焦点:Tab 在两端间切换时保留草稿,不触发 blur 校验或提交;Enter 或离开整个字段才提交,Escape 丢弃草稿。点击结束输入会让范围面板从结束端开始选择。 字段使用 PickerField → FieldDecorator;面板只负责选择,不注入表单。有效文本在回车或失焦时提交,Escape 或外部关闭丢弃未确认草稿,清除立即提交空值。四类字段的统一示例见 [Date](llms/zh-CN/components/date.md#统一字段与提交)。 ### 透传配置边界与优先级 建议使用 `DateRangePopupOptions` 声明 popup-props,边界与 DatePopupOptions 一致。仅用于 inline 锚定弹层;范围值、规则、open/defaultOpen、禁用及通知归 DateRange 管理。popup-container 顶层优先、嵌套回退,popupClass 合并内部类;trigger、closeOnClickReference、preventFocus、popupOffset 由展示层固定,Maple 还固定 unmountOnClose=true。新类型不开放这些固定项,附加平移使用 popupTranslate。已有运行时字段/监听过滤和旧配置可用能力保持。 本次仅新增可主动选用的专用类型,不收窄已发布的宽属性类型,不增加运行时过滤、不改变覆盖顺序;旧业务写法继续可编译。若直接使用旧宽属性,内部托管字段仍可能通过类型检查,但不代表能控制内部状态。 ```ts import type { DateRangePopupOptions } from "@cedar-design/ui"; ``` Example source: src/date-range/__demos__/passthrough-options.vue ```vue ``` ### 复制与编辑 open-trigger-target="icon" 时,输入区可以编辑或复制,只有右侧选择按钮响应点击打开。关闭手输或搜索后,已有文本仍可复制。 Example source: src/date-range/__demos__/open-trigger-target.vue ```vue ``` ### 共享字段加载 `loading` 控制共享字段加载状态;`loading-mode` 为 `default`(指示器)或 `line`(底部不定进度线),默认 `default`。渲染统一由 FieldDecorator 负责,不隐式改变 disabled/readonly;需要禁止编辑时单独设置。 ## 阅读方向 范围值始终保持 `[开始, 结束]`,切换阅读方向不会交换端点或提交草稿。日历范围连接线与边界圆角跟随阅读方向;分页网格的左右键按视觉方向移动焦点,上下键保持日期行序。Maple 的端点编辑和连续范围高亮是不同展示路径。显式 `shortcuts-position="left|right"` 保持物理侧;弹层继承字段来源方向。 ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### Props | 参数 | 说明 | 类型 | 默认值 | | ------------------------- | -------------------------------------------------------------------------------------- | ------------------------------------------ | --------- | | `open-trigger-target` | 打开面板的点击区域;field 为整个字段,icon 仅右侧选择按钮。不影响键盘展开及受控 open。 | `'field' \| 'icon'` | `'field'` | | `model-value` | 绑定值 | `(Date \| string \| number)[]` | `-` | | `type` | 选择类型 | `date \| week \| month \| year \| quarter` | `date` | | `open` | 弹层显隐 | `boolean` | `-` | | `clearable` | 可清除 | `boolean` | `true` | | `disabled` | 禁用 | `boolean \| boolean[]` | `-` | | `readonly` | 只读 | `boolean` | `false` | | `size` | 尺寸 | `xs \| sm \| md \| lg \| xl` | `-` | | `variant` | 输入框变体 | `filled \| outline \| standard` | `filled` | | `separator` | 分隔符 | `string` | `-` | | `placeholder` | 占位 | `string[]` | `-` | | `disabled-date` | 禁用日期 | `Function` | `-` | | `format` | 展示格式 | `string` | `-` | | `show-time` | 选择时间 | `boolean` | `false` | | `date-range-picker-props` | 面板展示选项 | `DateRangePickerOptions` | `{}` | ### 日期族统一契约 | 参数 | 说明 | 类型 | 默认值 | | ----------------- | ------------------------------------------------------- | -------------------------------------------------- | ------- | | `default-value` | 非受控初始值,仅初始化读取 | DateValue / DateValue[] | — | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | string | 随 type | | `min` / `max` | 包含端点的边界;字符串按 value-format 解析 | DateValue | — | | `disabled-time` | 当前日期、端点的时间禁用列表 | (date: Date, side: DateSide) => DateDisabledTime | — | | `disable-confirm` | 选择后立即提交 | boolean | false | | `default-open` | 非受控初始展开 | boolean | false | | `popup-props` | Trigger 展示配置;不允许覆盖展开状态及规则 | object | {} | | `popup-container` | 挂载目标;顶层优先,支持 false 原地渲染 | string / HTMLElement / (() => HTMLElement) / false | — | `DateValue = Date | string | number`。单值清除为 undefined,范围清除为 []。 `disabledDate(date, side)` 和 `disabledTime(date, side)` 的 date 始终为 Date,side 为 start/end。 `disabled-date` 限制起止端点,范围可以跨过中间的禁用项;不会逐项扫描或自动截断范围。日期、月份、年份均采用此规则。中间禁用项保持灰色,翻页保留已选起点并清除悬浮预览;反向点选按时间先后排序。 时间回调返回 `disabledHours()`、`disabledMinutes(hour)`、`disabledSeconds(hour, minute)` 数字列表。 非法日期、不完整或逆序范围不能提交;确认时重新验证动态禁用规则。范围锁定端点不能被清除或改动。 嵌套面板 props 只配置展示,不得覆盖顶层 model-value、格式、边界、禁用规则或控制事件。 ### Events | 事件 | 说明 | 参数 | | ----------------------------- | -------------------- | --------------------------------- | | `update:model-value` | 写入模型 | value | | `select` | 选择草稿,不等于提交 | value, date(s), formatted text(s) | | `change` | 有效值正式变化 | value, date(s), formatted text(s) | | `update:open` / `open-change` | 展开状态变化 | open: boolean | | `clear` | 清除 | 无 | | `focus` / `blur` | 整个字段的焦点边界 | 无 | | `click` | 点击字段 | event | 桌面支持键盘编辑。默认面板先编辑草稿再确认;设置 disable-confirm 可直接提交。Escape 或关闭会丢弃草稿。focus(index = 0) 定位起止输入,blur() 关闭浮层。 ## 配置清空后的值 `empty-value` 指定当前组件已有清空动作的输出;省略时采用该组件默认返回。具体类型以组件 API 为准。它不改变 empty-values 的识别规则,也不改变 Form reset 的初始值。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 --- Document: llms/zh-CN/components/date.md # Date 浮动日期面板按可视视口限制高度,正常高度完整展示日历;只有窗口放不下时才滚动,确认操作保持可见。可通过 `--c-date-picker-popover-max-height` 调整最大高度(默认 `100dvh - 32px`)。 展开时,原生 combobox 通过 `aria-controls` 关联当前实例的命名弹层;关闭后同步更新状态并移除关联。`aria-label`、`aria-describedby` 可传递给原生控件。自定义 selected/触发插槽需自行保留可访问名称、键盘操作和状态关联。 表单日期字段(带触发器)。内部使用 `DatePicker`。 纯面板请使用 [`DatePicker`](llms/zh-CN/components/date-picker.md)(默认无触发器)。日期范围字段请使用 [`DateRange`](llms/zh-CN/components/date-range.md)。 ## 基础示例 ### 基本用法 Example source: src/date/__demos__/basic.vue ```vue ``` ## 外观与日期展示 ### 外观配置对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | -------------- | ------------------------------------------------------- | -------------------------------- | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | 外观配置对比、日期语言的实例隔离 | | `type` | 选择类型 | 选择类型、日期语言的实例隔离 | | `size` | 尺寸 | 表单控件尺寸对照 | | `variant` | 输入框变体 | 表单控件尺寸对照 | | `placeholder` | 占位 | 表单控件尺寸对照 | | `clearable` | 可清除 | 选择类型 | 选择一个对比维度后,同屏展示它的全部可选值;其余配置和内容保持一致。可切换其他配置检查组合效果;输入类预览共享一个值。
配置说明与使用限制 #### 外观组合 适用于选择单个日期。调整变体、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。
Example source: src/date/__demos__/appearance-lab.vue ```vue ``` ### 表单控件尺寸对照 切换五档 size 和三种字段变体,比较 Input、Button、Select、日期时间及其他单行表单控件的高度。Button 在这里固定使用 outline。DatePicker/TimePicker 是面板,此处使用带输入框的 Date/Time 字段。示例同时展示有值、可清空、标签删除与长标签多选;Select/Cascader 设置 tag-nowrap 时保持同档高度,长标签文字省略、删除图标保留;标签行可横向滚动,清空按钮和箭头固定在外侧。被省略的标签正文支持悬停、键盘聚焦或点按查看完整文字,点外部或按 Esc 关闭,不改变选中值。可清空后恢复选中值重复比较。多行文本和允许换行的多选内容按内容撑高。 Example source: src/field-decorator/__demos__/control-sizes.vue ```vue ``` ### 选择类型 通过 `type` 切换日 / 周 / 月 / 年 / 季度。 Example source: src/date/__demos__/type.vue ```vue ``` ### 月份标签 字段通过 `date-picker-props`(Date)或 `date-range-picker-props`(DateRange)配置面板的该选项。 `abbreviation`(boolean,默认 `true`)控制日历月份网格的缩写;`false` 使用当前 Locale 的完整月份名。运行时修改立即生效,不改变值,也不触发选择事件。此开关不影响星期标签、标题、滚轮列或值格式。范围日历以顶层选项为准,嵌套日历参数不能覆盖。 Example source: src/date/picker/__demos__/month-labels.vue ```vue ``` ### 语言与嵌套日历参数 日期标签、标题和动作接入各库的全局 Locale 与既有 Provider。Cedar 删除日期组件级 `locale`,不保留覆盖字典或兼容别名。切换语言不会选择或提交日期。 ### 日期语言的实例隔离 日期所有者读取本库全局 Locale/Provider,周起始日由各实例 `day-start-of-week` 管理。不切换宿主 Dayjs 默认语言,也不覆盖宿主基础语言配置;只在各库命名空间下注册日期语言元数据,组件实例与源码不跨库共享。 `value-format` 是稳定英文日期协议(包括月份名称 token),`format` 的显示及手输文本使用界面语言。切换语言不会改写模型,也不会令英文月份名称模型失效。默认数字协议、Date 对象、时间戳不变。中文核心语言与 Maple 内置语言数据已接入;其他日期格式优先使用已注册 Dayjs 语言数据,未加载的语言安全回退英文。 周号和周比较不再依赖全局周起始设置,跨年同周号不能被误判成同一周。两个不同周起始实例的挂载、更新和卸载互不影响。 Example source: src/date/picker/__demos__/locale-isolation.vue ```vue ``` ## 时间与选择规则 ### 带时间 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | -------------- | ------------------------------------------------------- | -------- | | `show-time` | 选择时间 | 带时间 | | `format` | 展示格式 | 带时间 | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | 带时间 | | `clearable` | 可清除 | 带时间 | Example source: src/date/__demos__/show-time.vue ```vue ``` ### 内嵌时间与滚轮展示 `time-picker-props` 使用 `DateTimePickerOptions`:`use12Hours`、`step`、`hideDisabledOptions`、`class`、`style`。仅配置时间展示;日期值、格式/秒精度、约束和确认仍由日期所有者管理。`step` 负责展示采样,不静默修正外部值。未知参数及监听函数不转发。 Example source: src/date/picker/__demos__/time-presentation.vue ```vue ``` ### 真实端侧能力 Cedar 不公开 `Date.pickerProps`、`DateRange.pickerProps` 或 `DateRange.datePickerProps`:PC 字段不渲染移动滚轮或范围内部的移动日历插件,原无效参数已删除且无兼容别名。Maple 保留这些真实扩展,使用 DateWheelOptions 与 DateRangeCalendarOptions。两端通过 `Date.datePickerProps` / `DateRange.dateRangePickerProps` 配置完整面板,`timePickerProps` 配置内嵌时间展示。初始日期时间放在顶层 `defaultValue`,不要放在 `timePickerProps.defaultValue` 中。 ## 值模型与输入 ### 模型格式与显示格式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------------- | ------------------------------------------------------- | ---------------------------------------------------------------------- | | `format` | 展示格式 | 模型格式与显示格式、字符串模型:年月日、年月与月日范围、手输与面板选择 | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | 模型格式与显示格式、字符串模型:年月日、年月与月日范围 | | `type` | 选择类型 | 字符串模型:年月日、年月与月日范围、周与季度手输 | | `date-picker-props` | 面板展示选项 | 周与季度手输 | Example source: src/date/__demos__/value-formats.vue ```vue ``` ### 字符串模型:年月日、年月与月日范围 `format` 决定显示,`value-format` 决定提交值。下面直接得到 `"2026-09-10"`、`"2026-09"` 或 `["09-10", "10-10"]`,无需将 Date 再转换。日期范围使用数组。`MM-DD` 没有年份,解析时使用当前年,不能表示跨年先后或某个明确年份的 2 月 29 日;有跨年、时区或闰年要求时保留 `YYYY-MM-DD`,在业务提交时单独映射月日。默认仍是 page,未指定 timeZone 使用浏览器本地时区。 Example source: src/date/__demos__/string-values.vue ```vue ``` ### 周与季度手输 默认周展示 `gggg-wo` 按当前界面语言与实例周起始解析为该周的第一天,模型仍为 `YYYY-MM-DD`。中文周一起始的 `2020-53周` 提交 `2020-12-28`;不存在的周、错误序数后缀不提交。默认季度 `YYYY-[Q]Q`(如 `2025-Q2`)严格解析为首月,模型 `YYYY-MM`(`2025-04`)。手输继续遵守禁用、边界和范围顺序,不自动交换端点。 自定义周/季度展示可以使用 Dayjs 支持的普通日期 token;任意自定义周序数格式没有逆解析协议。`format` 为函数时请设置 `input-editable=false`,通过面板选择。 Example source: src/date/picker/__demos__/period-text.vue ```vue ``` 日期字段的可编辑条件由公共所有者统一管理:`input-editable` 默认 true,函数 `format` 不可反解析,因此输入只读。两端单值/范围的 Enter、失焦、组合输入、受控拒绝回写、禁用与范围顺序通过同一组原生输入测试;Maple 多选拼接文本保持只读,由面板选择。 ### 手输与面板选择 Example source: src/date/picker/__demos__/text-entry.vue ```vue ``` ## 交互与字段配置 ### 交互状态对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------------- | ------------------------------------------------------- | ------------------------------------ | | `disabled` | 禁用 | 交互状态对比、统一字段与提交 | | `open` | 弹层显隐 | 受控关闭被拒绝、透传配置边界与优先级 | | `date-picker-props` | 面板展示选项 | 字段视口与快捷项事件、字段与面板边界 | | `placeholder` | 占位 | 统一字段与提交、字段与面板边界 | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | 交互状态对比 | | `readonly` | 只读 | 交互状态对比 | 在同一实例上切换禁用、只读和错误状态后再操作控件,比较可编辑性和交互反馈。恢复开关位于目标控件外;错误外观本身不会执行校验。
配置说明与使用限制 #### 交互状态切换 适用于选择单个日期。调整禁用、只读、错误反馈,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。
Example source: src/date/__demos__/state-lab.vue ```vue ``` ### 受控关闭被拒绝 父级可以拒绝 `update:open(false)`,此时面板仍展开。一次选择只能提交并请求关闭一次;受控模型回写相同值不会重置已确认状态。在保持展开时选择新日期会开启新事务,可以再次确认。示例显示模型、提交次数与关闭请求次数。 Example source: src/date/__demos__/rejected-close.vue ```vue ``` ### 字段视口与快捷项事件 字段通过嵌套 `date-picker-props` 配置 `pickerValue`、`defaultPickerValue` 和快捷项,不新增第二套顶层视口 Prop。嵌套配置里的监听器不会透传;在字段组件上监听以下事件并回写嵌套 `pickerValue`。 | 事件 | 说明 | 参数 | | --------------------- | -------------------------------- | --------------------------------- | | `update:picker-value` | 请求日历视口更新,不改变选择模型 | value: DateSelection | | `picker-value-change` | 已请求的视口及展示通知 | value, date(s), formatted text(s) | | `select-shortcut` | 接受的快捷项,仍遵守字段确认策略 | shortcut: DateShortcut | 受控视口拒绝更新时保持原月份,后续回写才更新;快捷项选择先进入字段草稿,默认确认后提交。滚轮/时钟没有日历月份导航能力。 Example source: src/date/picker/__demos__/field-panel-tools.vue ```vue ``` ### 展示模式的所有权 Cedar 只实现桌面日历,不公开移动 `edit-mode`。Maple 在字段/纯面板根选择真实展示模式;字段嵌套 `DatePickerOptions` / `DateRangePickerOptions` 不包含 presentation,两库复制的过滤器均拒绝嵌套选择器,不通过隐式覆盖保留无效 API。 ### 周起始日的响应式展示 `dayStartOfWeek` 更新时,日历表头与日期列位置同步更新,不改变选中值或提交草稿。纯面板使用根属性,字段通过 `datePickerProps` / `dateRangePickerProps` 配置;滚轮视图不使用星期列。 ### 动态日期限制 更新或移除 `min` / `max` 会重新计算可选日期,不自动修改已有模型或草稿。面板导航与候选日期校验是不同职责,已有值超出新限制时也不会被静默重写;用户重新选择或确认时按当前限制校验。 ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 日期/时间字段在 inline 下沿用原确认策略;在 click/dblclick 编辑展示中,内部纯面板隐藏确认工具栏,由编辑层提供唯一一组确认/取消。独立 DatePicker、DateRangePicker、TimePicker、TimeRangePicker 保留原有面板 API 和确认行为,不继承 Form 的字段展示。 独立 DatePicker / DateRangePicker 与 inline 共用日历基准宽度(每个 265px)。单日期带时间时,宽屏下日历与时间列左右排列;范围在宽屏保留两个并排日历。面板会按窄容器换行,侧边快捷项另占一列,不压缩日历;确认与 actions 插槽保持由面板自身管理。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 ### 统一字段与提交 Date / DateRange / Time / TimeRange 使用相同的 PickerField → FieldDecorator 字段链路。桌面支持键入有效值后回车或失焦提交;有确认按钮的面板只在确认时写回,Escape 或外部关闭丢弃草稿。清除立即提交空值。面板组件不再提供 `hideTrigger` 双模式,自定义触发器使用字段的默认插槽。 Example source: src/date/__demos__/field-protocol.vue ```vue ``` ### 字段与面板边界 字段保留输入和浮层状态;嵌套面板参数只接受展示选项,不能覆盖顶层模型、格式或校验规则。 Example source: src/date/picker/__demos__/entry-boundary.vue ```vue ``` ### 日期值格式 两端使用独立复制的日期值、约束、面板和字段主体。年/月/日模型格式为 `YYYY` / `YYYY-MM` / `YYYY-MM-DD`,日期时间默认含秒;`format="YYYY-MM-DD HH:mm"` 与 `value-format="YYYY-MM-DD HH:mm"` 使用分钟字符串。`format` 只控制显示,`value-format` 控制模型和事件,支持自定义格式、`Date` 与 `timestamp`。Cedar 另提供周/季度面板;Maple 另提供移动端滚轮和时钟展示。 ### 透传配置边界与优先级 建议使用 `DatePopupOptions` 声明 popup-props;仅用于 inline 锚定弹层的允许展示/定位配置。open/defaultOpen、disabled/readonly、modelValue、值格式、日期规则及通知监听由字段管理,已有 datePresentationOptions 会过滤托管字段和 onXxx 监听。popup-container 顶层明确传入时优先(包括 false),否则回退 popupProps.popupContainer;popupClass 与内部类合并。trigger、closeOnClickReference、preventFocus、popupOffset 由字段展示层固定(偏移当前为 4);Maple 还固定 unmountOnClose=true。新类型为两端共同的安全子集,不能设置这些固定项;Cedar 旧配置可透传的 unmountOnClose 不受本次影响。可使用 popupTranslate 定制附加平移。其他有效展示字段保持原透传。 本次仅新增可主动选用的专用类型,不收窄已发布的宽属性类型,不增加运行时过滤、不改变覆盖顺序;旧业务写法继续可编译。若直接使用旧宽属性,内部托管字段仍可能通过类型检查,但不代表能控制内部状态。 ```ts import type { DatePopupOptions } from "@cedar-design/ui"; ``` Example source: src/date/__demos__/passthrough-options.vue ```vue ``` 日期范围还会保留未改动端点的原始 Date/时间戳及隐藏毫秒,避免重复小时中的第二次发生被错误转换成第一次。夏令时仅跳过半小时的地区仍可选择剩余有效分钟;交互范围排序比较真实时刻,交换日期但保留时间时会重新计算目标日期的时区偏移。 ### 复制与编辑 open-trigger-target="icon" 时,输入区可以编辑或复制,只有右侧选择按钮响应点击打开。关闭手输或搜索后,已有文本仍可复制。 Example source: src/date/__demos__/open-trigger-target.vue ```vue ``` ### 共享字段加载 `loading` 控制共享字段加载状态;`loading-mode` 为 `default`(指示器)或 `line`(底部不定进度线),默认 `default`。渲染统一由 FieldDecorator 负责,不隐式改变 disabled/readonly;需要禁止编辑时单独设置。 ## 阅读方向 组件继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部方向覆盖。日历日期、月份、年份按阅读顺序排列,前后翻页图形随方向调整,日期值与起止顺序保持原义。分页网格中左右键按视觉方向移动焦点,上下键移动一行,Home/End 移至当前行首尾并跳过禁用项;焦点移动不提交,Enter/Space 沿用选值行为,边界停留在当前显示网格。快捷区 `shortcuts-position="left|right"` 保持物理侧,底部使用 `bottom`。弹层继承字段来源方向。 ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### Props | 参数 | 说明 | 类型 | 默认值 | | --------------------- | -------------------------------------------------------------------------------------- | ------------------------------------------ | --------- | | `open-trigger-target` | 打开面板的点击区域;field 为整个字段,icon 仅右侧选择按钮。不影响键盘展开及受控 open。 | `'field' \| 'icon'` | `'field'` | | `model-value` | 绑定值 | `Date \| string \| number` | `-` | | `type` | 选择类型 | `date \| week \| month \| year \| quarter` | `date` | | `open` | 弹层显隐 | `boolean` | `-` | | `clearable` | 可清除 | `boolean` | `true` | | `disabled` | 禁用 | `boolean` | `false` | | `readonly` | 只读 | `boolean` | `false` | | `size` | 尺寸 | `xs \| sm \| md \| lg \| xl` | `-` | | `variant` | 输入框变体 | `filled \| outline \| standard` | `filled` | | `placeholder` | 占位 | `string` | `-` | | `disabled-date` | 禁用日期 | `Function` | `-` | | `format` | 展示格式 | `string \| Function` | 随 `type` | | `show-time` | 选择时间 | `boolean` | `false` | | `date-picker-props` | 面板展示选项 | `DatePickerOptions` | `{}` | ### 日期族统一契约 | 参数 | 说明 | 类型 | 默认值 | | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------- | | `default-value` | 非受控初始值,仅初始化读取 | DateValue / DateValue[] | — | | `value-format` | 模型与事件的格式,可为自定义日期格式、Date 或 timestamp | string | 随 type | | `min` / `max` | 包含端点的边界;字符串按 value-format 解析 | DateValue | — | | `disabled-time` | 当前日期、端点的时间禁用列表 | (date: Date, side: DateSide) => DateDisabledTime | — | | `disable-confirm` | 选择后立即提交 | boolean | false | | `default-open` | 非受控初始展开 | boolean | false | | `popup-props` | 可选的字段浮层展示配置,placement 默认 bottom-start;交给底层 Trigger 自动定位,可覆盖首选方位;不增加顶层 placement,不允许覆盖字段状态和规则 | object | {} | | `popup-container` | 挂载目标;顶层优先,支持 false 原地渲染 | string / HTMLElement / (() => HTMLElement) / false | — | `DateValue = Date | string | number`。单值清除为 undefined,范围清除为 []。 `disabledDate(date, side)` 和 `disabledTime(date, side)` 的 date 始终为 Date,side 为 start/end。 时间回调返回 `disabledHours()`、`disabledMinutes(hour)`、`disabledSeconds(hour, minute)` 数字列表。 非法日期、不完整或逆序范围不能提交;确认时重新验证动态禁用规则。范围锁定端点不能被清除或改动。 嵌套面板 props 只配置展示,不得覆盖顶层 model-value、格式、边界、禁用规则或控制事件。 ### Events | 事件 | 说明 | 参数 | | ----------------------------- | -------------------- | --------------------------------- | | `update:model-value` | 写入模型 | value | | `select` | 选择草稿,不等于提交 | value, date(s), formatted text(s) | | `change` | 有效值正式变化 | value, date(s), formatted text(s) | | `update:open` / `open-change` | 展开状态变化 | open: boolean | | `clear` | 清除 | 无 | | `focus` / `blur` | 整个字段的焦点边界 | 无 | | `click` | 点击字段 | event | 桌面支持键盘编辑。默认面板先编辑草稿再确认;设置 disable-confirm 可直接提交。Escape 或关闭会丢弃草稿。focus(index = 0) 定位起止输入,blur() 关闭浮层。 ## 显式时区 `timeZone` 接受 IANA 名称,例如 `Asia/Shanghai`。Date 与毫秒时间戳表示真实时刻,字符串表示目标时区的当地时间;展示、手输、min/max、快捷项和禁用规则遵守同一协议,事件 Date 保留真实时刻。未设置时保持本地时区行为。不存在的夏令时时间禁止提交,重复时间取第一次,非法时区禁止提交。Maple 的 scroll / line 属于移动日历呈现能力,桌面端继续使用现有面板。 ## 配置清空后的值 `empty-value` 指定当前组件已有清空动作的输出;省略时采用该组件默认返回。具体类型以组件 API 为准。它不改变 empty-values 的识别规则,也不改变 Form reset 的初始值。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 ### 方位语义与配置入口 Date 字段默认从输入框下方 bottom-start 打开。需要时通过 popupProps.placement 覆盖首选方位,由底层 Trigger 定位;不是透传给 Popup 或 Popover。DatePicker 是独立日期面板,没有输入框锚点,不能把旧 date/picker 目录中的 placement 当成当前 DatePicker 的公开属性。 --- Document: llms/zh-CN/components/descriptions.md # Descriptions 一般用于详情页的信息展示。 ## 基础示例 ### 基础用法 简单地成组展示多个只读字段,一般用于详情页的信息。 Example source: src/descriptions/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 标签文本对齐 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `data` | 描述列表的数据 | 标签文本对齐、布局模式 | | `title` | 描述列表的标题 | 标签文本对齐、布局模式 | | `layout` | 描述列表的排列方式 | 标签文本对齐、布局模式 | | `align` | 文字的对齐位置 | 标签文本对齐 | | `size` | 描述列表的大小 | 布局模式 | | `bordered` | 是否显示边框 | 布局模式 | 标签文本可以设置左对齐右对齐,也可以设置垂直的排列方式。 Example source: src/descriptions/__demos__/label-text-alignment.vue ```vue ``` ### 布局模式 有水平排列、垂直排列、行内水平排列、行内垂直、行内自适应分隔排列五种布局模式。 Example source: src/descriptions/__demos__/layout-pattern.vue ```vue ``` ## 内容与展示 ### 常用案例 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `data` | 描述列表的数据 | 常用案例、带边框样式 | | `title` | 描述列表的标题 | 常用案例、带边框样式 | | `column` | 每行放置的数据个数。2.20.0 版本支持响应式配置,配置可参考 Grid | 常用案例 | | `size` | 描述列表的大小 | 常用案例 | | `bordered` | 是否显示边框 | 带边框样式 | 单列的描述列表样式。 Example source: src/descriptions/__demos__/singel-column-style.vue ```vue ``` ### 带边框样式 带边框和背景颜色的列表。 Example source: src/descriptions/__demos__/border-background-list.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。标签和值按阅读顺序排列,边界和默认文本对齐使用逻辑起止位置;切换方向不反转记录、列定义或 span 的含义。 ## API ### `` Props | 属性 | 说明 | 类型 | 默认值 | | ------------ | ------------------------------------------------------------------ | :---------------------------------------------------------------------------------------: | :------------- | | data | 描述列表的数据 | `DescData[]` | `[]` | | column | 每行放置的数据个数。2.20.0 版本支持响应式配置,配置可参考 Grid | `number \| ResponsiveValue` | `3` | | title | 描述列表的标题 | `string` | `-` | | layout | 描述列表的排列方式 | `'horizontal' \| 'vertical' \| 'inline-horizontal' \| 'inline-vertical' \| 'inline-auto'` | `'horizontal'` | | align | 文字的对齐位置 | `TextAlign \| { label?: TextAlign; value?: TextAlign }` | `'left'` | | size | 描述列表的大小 | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `-` | | bordered | 是否显示边框 | `boolean` | `false` | | label-style | 数据标签的样式 | `CSSProperties` | `-` | | value-style | 数据内容的样式 | `CSSProperties` | `-` | | table-layout | 描述中表格样式的 `layout-fixed`,当设置成 `fixed` 时,宽度会均分。 | `'auto' \| 'fixed'` | `'auto'` | | aria-label | 描述列表的无障碍标签 | `string` | `-` | ### `` Slots | 插槽名 | 说明 | 参数 | | ------ | :------: | ------------------------------------------------------ | | value | 数据内容 | value: `string`
index: `number`
data: `DescData` | | label | 数据标签 | label: `string`
index: `number`
data: `DescData` | | title | 标题 | - | ### `` Props | 属性 | 说明 | 类型 | 默认值 | | ----- | -------- | :------: | :----- | | span | 所占列数 | `number` | `1` | | label | 标签 | `string` | `-` | ### `` Slots | 插槽名 | 说明 | 参数 | | ------- | :--: | ---- | | default | 内容 | - | | label | 标签 | - | ### DescData | 参数名 | 描述 | 类型 | 默认值 | | ------ | -------- | -------------------------- | :----: | | label | 标签 | `string \| RenderFunction` | `-` | | value | 数据 | `string \| RenderFunction` | `-` | | span | 所占列数 | `number` | `-` | ## 类型定义 组件导出以下类型定义 ```ts import type { DescriptionsProps } from "@cedar-design/ui"; ``` --- Document: llms/zh-CN/components/dialog.md # Dialog 在当前页面打开一个浮层,承载相关操作。组件式与函数式 API 命名一致。 ## 基础示例 ### 基本用法 Example source: src/dialog/__demos__/basic.vue ```vue ``` ## 调用方式与内容 ### 函数调用 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `title` | 标题 | 确认框、弹出层表单、简洁模式 | | `type` | 类型图标:`info` `success` `warning` `error` | 确认框、简洁模式 | | `message` | 内容(也可用 default 插槽) | 确认框、简洁模式 | | `before-close` | 返回 boolean/Promise 或调用 done;首次完成生效 | 弹出层表单 | | `simple` | 简洁布局(紧凑 padding、footer 居中) | 简洁模式 | Example source: src/dialog/__demos__/global.vue ```vue ``` ### Alert Example source: src/dialog/__demos__/alert.vue ```vue ``` ### 确认框 Example source: src/dialog/__demos__/confirm.vue ```vue ``` ### 消息提示 设置 `type` 为 `info` / `success` / `warning` / `error` 显示对应图标。 Example source: src/dialog/__demos__/message.vue ```vue ``` ### 弹出层表单 Example source: src/dialog/__demos__/form.vue ```vue ``` ### 简洁模式 `simple` 适合内容简短、操作聚焦的对话框。 Example source: src/dialog/__demos__/simple.vue ```vue ``` ## 尺寸与布局 ### 弹窗尺寸与长内容 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `title` | 标题 | 去除内容边距、最大高度 | | `body-style` | 内容区 style | 去除内容边距、最大高度 | | `width` | 宽度 | 弹窗尺寸与长内容 | | `fullscreen` | 全屏 | 弹窗尺寸与长内容 | 分别打开弹窗,比较宽度、全屏或长内容的可视范围;关闭当前弹窗后再打开另一种布局。
配置说明与使用限制 #### 对话框宽度 通过 `width` 自定义宽度。
Example source: src/dialog/__demos__/size-comparison.vue ```vue ``` ### 去除内容边距 通过 `body-class` / `body-style` 自定义内容区样式。 Example source: src/dialog/__demos__/no-padding.vue ```vue ``` ### 最大高度 Example source: src/dialog/__demos__/max-height.vue ```vue ``` ## 交互与定制 ### 可拖动 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `unmount-on-close` | 关闭后卸载 | 定制按钮文字、高级属性 | | `draggable` | 可拖动 | 可拖动 | | `confirm-button-text` | 确认按钮文案 | 定制按钮文字 | | `cancel-button-text` | 取消按钮文案 | 定制按钮文字 | | `footer` | 是否展示 footer 区域 | 高级属性 | | `type` | 类型图标:`info` `success` `warning` `error` | 高级属性 | Example source: src/dialog/__demos__/draggable.vue ```vue ``` ### 自定义底部 `footer` 插槽会暴露 `confirm`、`cancel` 和 `close` 方法,便于组合自定义操作。 Example source: src/dialog/__demos__/custom-footer.vue ```vue ``` ### 定制按钮文字 Example source: src/dialog/__demos__/custom-text.vue ```vue ``` ### 高级属性 组合 `footer`、`hide-title`、`body-class` / `body-style` 和 `unmount-on-close` 控制对话框的渲染行为。 Example source: src/dialog/__demos__/advanced.vue ```vue ``` ## 异步与关闭控制 ### 异步关闭 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `before-close` | 返回 boolean/Promise 或调用 done;首次完成生效 | 异步关闭、before 钩子与 done 兼容 | | `title` | 标题 | 异步关闭 | | `message` | 内容(也可用 default 插槽) | 异步关闭 | Example source: src/dialog/__demos__/async.vue ```vue ``` ### before 钩子与 done 兼容 `beforeClose({ action }, done, context)` 为统一入口,不新增另一套命名。 只记录日志的同步钩子应显式 return true;同步 undefined 表示仍在等待回调。注意:以前返回 `Promise` 却不调用 done 的异步钩子,现在会在 Promise 完成后放行。 Example source: src/dialog/__demos__/guard-protocol.vue ```vue ``` Promise 与 done 共用一次完成状态:`false` / `done(false)` 阻止,`true` / `done()` 允许;Promise<void> 正常完成允许。重复完成只生效一次,异常触发 guard-error,取消或卸载后迟到结果无效。此类关闭/确认回调同步返回 void 时保留原回调协议,等待 done。 守卫统一使用 `(payload, done, context)`:关闭 payload 为 `{ action }`,切换和提交为 `{ value, previousValue }`,Popup 为 `{ reason }`。context 提供 `signal` 和可选原始 `event`。返回 boolean/Promise,或调用 done()/done(false);同步 void 等待 done,Promise<void> 放行。首次完成生效。等待期间自动管理 loading/disabled,取消后旧结果失效,不暴露内部按钮 refs。 ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。内容、标题与动作间距使用逻辑起止位置;外部弹层继承来源方向。关闭、确认、取消和未提交状态不因方向切换改变。 ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------------------------- | -------------------------------------------- | -------------------------------- | ------------ | | dir | 阅读方向;省略时继承来源作用域。物理 left/right 方位保持原意。 | `ReadingDirection` (`ltr` / `rtl`) | — | | `open` **(v-model)** | 是否显示 | `boolean` | `-` | | `default-open` | 非受控默认显示 | `boolean` | `false` | | `title` | 标题 | `string` | `-` | | `message` | 内容(也可用 default 插槽) | `string` | `-` | | `message-align` | 内容对齐 | `'left' \| 'center' \| 'right'` | `'left'` | | `type` | 类型图标:`info` `success` `warning` `error` | `string` | `-` | | `simple` | 简洁布局(紧凑 padding、footer 居中) | `boolean` | `false` | | `width` | 宽度 | `number \| string` | `-` | | `top` | 距顶部高度(`align-center` 时无效) | `number \| string` | `-` | | `title-align` | 标题对齐 | `'start' \| 'center'` | `'center'` | | `align-center` | 垂直水平居中 | `boolean` | `true` | | `overlay` | 是否显示背景层 | `boolean` | `true` | | `overlay-class` | 背景层 class | `string` | `-` | | `overlay-style` | 背景层 style | `CSSProperties` | `-` | | `overlay-closable` | 点击背景层关闭 | `boolean` | `true` | | `esc-to-close` | ESC 关闭 | `boolean` | `true` | | `lock-scroll` | 打开时锁定背景滚动 | `boolean` | `true` | | `close-on-route-change` | 浏览器历史或 hash 变化时关闭 | `boolean` | `false` | | `popup-container` | 挂载位置,`false` 禁用 teleport | `string \| HTMLElement \| false` | `'body'` | | `confirm-button` | 显示确认按钮 | `boolean` | `true` | | `cancel-button` | 显示取消按钮 | `boolean` | `true` | | `closable` | 显示右上角关闭按钮 | `boolean` | `true` | | `confirm-button-text` | 确认按钮文案 | `string` | `-` | | `cancel-button-text` | 取消按钮文案 | `string` | `-` | | `confirm-button-loading` | 确认按钮 loading | `boolean` | `false` | | `cancel-button-loading` | 取消按钮 loading | `boolean` | `false` | | `confirm-button-disabled` | 确认按钮 disabled | `boolean` | `false` | | `cancel-button-disabled` | 取消按钮 disabled | `boolean` | `false` | | `confirm-button-props` | 确认按钮 props | `ButtonProps` | `-` | | `cancel-button-props` | 取消按钮 props | `ButtonProps` | `-` | | `footer` | 是否展示 footer 区域 | `boolean` | `true` | | `dialog-class` | 对话框 class | `string \| any[]` | `-` | | `dialog-style` | 对话框 style | `CSSProperties` | `-` | | `body-class` | 内容区 class | `string \| any[]` | `-` | | `body-style` | 内容区 style | `StyleValue` | `-` | | `hide-title` | 隐藏标题 | `boolean` | `false` | | `unmount-on-close` | 关闭后卸载 | `boolean` | `false` | | `draggable` | 可拖动 | `boolean` | `false` | | `fullscreen` | 全屏 | `boolean` | `false` | | `overlay-animation-name` | 背景层动画 | `string` | `fade-modal` | | `dialog-animation-name` | 对话框动画 | `string` | `zoom-modal` | | `z-index` | 层级 | `number` | `-` | | `before-close` | 返回 boolean/Promise 或调用 done;首次完成生效 | `DialogBeforeClose` | — | ### `` Events | 事件名 | 描述 | 参数 | | ------------ | ------------- | --------------- | | `open` | 打开时 | `-` | | `opened` | 打开动画结束 | `-` | | `close` | 关闭时 | `-` | | `closed` | 关闭动画结束 | `-` | | `confirm` | 点击确认 | `Event` | | `cancel` | 点击取消/关闭 | `Event` | | `click-overlay` | 点击背景层 | `MouseEvent` | | `key-escape` | ESC | `KeyboardEvent` | 关闭按钮、背景层、ESC 和 `close()` 使用 `close` 语义,不会额外触发 `cancel`。 ### `` Slots | 插槽名 | 描述 | 参数 | | --------- | ---- | ---------------------------- | | `default` | 内容 | `-` | | `title` | 标题 | `-` | | `footer` | 底部 | `cancel`, `confirm`, `close` | 确认与取消按钮默认使用 Button 的 `default` 状态和 `text` 变体;可通过 `confirmButtonProps` / `cancelButtonProps` 覆盖。 ### 全局方法 所有函数式 Dialog 默认使用简洁布局(`simple: true`)并隐藏右上角关闭按钮(`closable: false`),仍可通过传入参数或全局默认配置显式覆盖。 #### DialogConfig 与组件 props 一致(camelCase),另支持: | 参数名 | 描述 | 类型 | | ------------- | ---------------------------------- | -------------------------- | | `content` | 可渲染内容;设置时优先于 `message` | `RenderContent` | | `footer` | 是否展示 footer 或自定义 footer | `boolean \| RenderContent` | | `onConfirm` | 确认回调 | `(e?: Event) => void` | | `onCancel` | 取消回调 | `(e?: Event) => void` | | `onClickOverlay` | 点击背景层回调 | `() => void` | | `onKeyEscape` | ESC 回调 | `() => void` | #### DialogMethod | 方法 | 描述 | 返回值 | | ---------------------------------- | ------------------------------ | -------------------------------------- | | `Dialog.open(config)` | 打开对话框 | `Promise & DialogReturn` | | `Dialog.confirm(config)` | 确认框(默认 `type: warning`) | 同上 | | `Dialog.alert(config)` | Alert(无取消按钮) | 同上 | | `Dialog.info(config)` | 信息提示 | 同上 | | `Dialog.success(config)` | 成功提示 | 同上 | | `Dialog.warning(config)` | 警告提示 | 同上 | | `Dialog.error(config)` | 错误提示 | 同上 | | `Dialog.close()` | 关闭最近打开的函数式对话框 | `void` | | `Dialog.setDefaultOptions(config)` | 设置函数式默认配置 | `void` | | `Dialog.resetDefaultOptions()` | 重置函数式默认配置 | `void` | #### DialogReturn | 属性 | 描述 | | ---------------- | -------- | | `close()` | 关闭 | | `update(config)` | 更新配置 | 安装后可通过 `app.config.globalProperties.$dialog` 调用。 ### 类型定义 ```ts import type { DialogAction, DialogConfig, DialogMethod, DialogReturn, DialogService, DialogType, } from "@cedar-design/ui"; ``` ### 样式变量 Dialog 的公开颜色变量与 Maple 同义:`--c-dialog-background` 表示浮层背景(`surface-raised`),`--c-dialog-overlay-background` 表示遮罩,`--c-dialog-title-text-color` 和 `--c-dialog-content-text-color` 表示主要内容,`--c-dialog-close-button-color` 表示次要操作;`--c-dialog-status-{info|success|warning|danger}-color` 对应可读状态内容色(content-info/success/warning/danger),不是状态填充色。业务主题优先覆盖这些组件变量,跨组件主题则覆盖相应的 system 变量。边框、宽度、间距和布局仍遵循桌面端规格。 #### 完整变量默认值 遮罩通过 Dialog 组件变量消费 `sys-color-scrim`;Maple 不再借用 Popup 的遮罩颜色。实例遮罩变量可放在 `overlay-style` 上;放在面板 `dialog-style` 上的变量不会继承给兄弟遮罩节点。显式 `overlay-style.backgroundColor` 优先。Teleport 场景需要在实际 DOM 祖先作用域设置变量。暗色主题继承同一套颜色语义;几何保留平台差异。状态图标改用可读的 content 状态色。 变量按用途分组:background/overlay-background 是面板与遮罩;border-* 是面板或分隔线边框;title-* 是标题排版;content-* 是正文排版;actions-* 是操作区;close-button-* 是关闭按钮;status-* 是语义图标;simple-*/fullscreen-* 是对应模式的尺寸;animation-* 是入退场动效。width/margin-top 控制常规面板布局。内部拖动与定位变量不构成公开定制入口。 | 变量 | 默认值 | | --- | --- | | `--c-dialog-background` | `var(--c-sys-color-surface-raised)` | | `--c-dialog-overlay-background` | `var(--c-sys-color-scrim)` | | `--c-dialog-border-color` | `var(--c-sys-color-border-default)` | | `--c-dialog-border-width` | `1px` | | `--c-dialog-border-radius` | `var(--c-sys-radius-md)` | | `--c-dialog-width` | `520px` | | `--c-dialog-margin-top` | `100px` | | `--c-dialog-title-text-color` | `var(--c-sys-color-content-primary)` | | `--c-dialog-title-font-size` | `var(--c-sys-font-size-lg)` | | `--c-dialog-title-font-weight` | `var(--c-sys-font-weight-medium)` | | `--c-dialog-title-padding` | `0 var(--c-sys-space-8)` | | `--c-dialog-title-min-height` | `48px` | | `--c-dialog-title-justify` | `center` | | `--c-dialog-content-text-color` | `var(--c-sys-color-content-primary)` | | `--c-dialog-content-font-size` | `var(--c-sys-font-size-md)` | | `--c-dialog-content-line-height` | `var(--c-line-height)` | | `--c-dialog-content-padding` | `28px var(--c-sys-space-8)` | | `--c-dialog-actions-padding` | `var(--c-sys-space-7) var(--c-sys-space-8)` | | `--c-dialog-actions-button-gap` | `var(--c-sys-space-6)` | | `--c-dialog-close-button-size` | `32px` | | `--c-dialog-close-button-color` | `var(--c-sys-color-content-secondary)` | | `--c-dialog-close-button-font-size` | `var(--c-sys-font-size-lg)` | | `--c-dialog-close-button-inset-inline-end` | `var(--c-sys-space-7)` | | `--c-dialog-status-icon-size` | `18px` | | `--c-dialog-status-icon-gap` | `var(--c-sys-space-5)` | | `--c-dialog-status-info-color` | `var(--c-sys-color-content-info)` | | `--c-dialog-status-success-color` | `var(--c-sys-color-content-success)` | | `--c-dialog-status-warning-color` | `var(--c-sys-color-content-warning)` | | `--c-dialog-status-danger-color` | `var(--c-sys-color-content-danger)` | | `--c-dialog-simple-width` | `400px` | | `--c-dialog-simple-border-radius` | `var(--c-sys-radius-md)` | | `--c-dialog-simple-padding` | `28px 32px 32px` | | `--c-dialog-simple-content-gap` | `28px` | | `--c-dialog-simple-actions-gap` | `32px` | | `--c-dialog-fullscreen-width` | `100vw` | | `--c-dialog-fullscreen-height` | `100vh` | | `--c-dialog-animation-duration` | `var(--c-sys-motion-duration-slow)` | | `--c-dialog-animation-easing` | `var(--c-sys-motion-easing-standard)` | ### 守卫等待反馈 before-* 等待期间显示加载反馈并标记 aria-busy;拒绝或失败后恢复,重复提交不再启动同一操作。普通事件返回的 Promise 不参与加载。 函数调用的通知回调不控制任务完成。服务的选择或关闭结果独立于回调异常结算,关闭完成时仍会清理所属宿主。异常继续通过调用方或 Vue 错误通道传递;回调返回 Promise 不控制 loading 或关闭。 --- Document: llms/zh-CN/components/divider.md # Divider 分割线 用于分隔列表或布局中的内容区域。 ## 基础示例 ### 基础用法 用于分隔相邻的内容区域。 Example source: src/divider/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 垂直分割线 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `orientation` | 分割线自身的横纵朝向,默认 horizontal;不控制文字对齐 | 垂直分割线 | | `type` | 线型 | 垂直分割线 | | `text-align` | 文字沿分割线的位置;start/end 为逻辑起止位置 | 垂直分割线 | | `description` | 文字描述;默认插槽优先 | 垂直分割线 | 设置 `orientation="vertical"`;父容器使用 flex 并提供可用高度。文字沿竖直方向排列。 Example source: src/divider/__demos__/vertical.vue ```vue ``` ## 内容与展示 ### 线条尺寸、样式与颜色 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `inset` | 沿线两端缩进:水平时左右,竖直时上下 | 线条尺寸、样式与颜色 | | `spacing` | 线条两侧外间距:水平时上下,竖直时左右 | 线条尺寸、样式与颜色 | | `orientation` | 分割线自身的横纵朝向,默认 horizontal;不控制文字对齐 | 线条尺寸、样式与颜色 | | `type` | 线型 | 线条尺寸、样式与颜色 | | `thickness` | 有限线宽且至少 1,单位 px;未设置时使用主题默认 1px;hairline 优先 | 线条尺寸、样式与颜色 | | `color` | 线条颜色;未设置时使用主题边框色 | 线条尺寸、样式与颜色 | 比较线宽/缩进、线型和颜色;带文字与自定义内容保持独立,避免把插槽行为混入线条装饰。
配置说明与使用限制 #### 间距与缩进 对比五档预设、数值、CSS 长度和非对称数组;竖直示例展示切换方向后的作用。 #### 线型 通过 `type` 对比实线、虚线、点线和双线;双线建议设置至少 3px 的 `thickness`。 #### 颜色、线宽与透明度 通过 `color`、`thickness`、`opacity` 定制线条。`opacity=0` 保留布局;`hairline` 优先于 `thickness`。
Example source: src/divider/__demos__/line-appearance-comparison.vue ```vue ``` ### 带文字 通过 `description` 添加文字,`text-align` 控制起点、居中和终点位置。切换 RTL 可观察逻辑起止方向。 Example source: src/divider/__demos__/with-text.vue ```vue ``` ## 自定义与插槽 ### 自定义内容 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `type` | 线型 | 自定义内容 | | `description` | 文字描述;默认插槽优先 | 自定义内容 | 默认插槽优先于 `description`,自定义内容的留白由调用方设置。 Example source: src/divider/__demos__/custom.vue ```vue ``` ## 交互与控制 ### 动态属性 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `orientation` | 分割线自身的横纵朝向,默认 horizontal;不控制文字对齐 | 动态属性 | | `opacity` | 整个分割线(含文字)的不透明度,范围 0–1;0 保留布局 | 动态属性 | | `hairline` | 将主题线宽缩放为一半;默认主题下为 0.5px | 动态属性 | | `thickness` | 有限线宽且至少 1,单位 px;未设置时使用主题默认 1px;hairline 优先 | 动态属性 | | `inset` | 沿线两端缩进:水平时左右,竖直时上下 | 动态属性 | | `spacing` | 线条两侧外间距:水平时上下,竖直时左右 | 动态属性 | 切换方向、默认插槽文字、透明度和细线,观察属性更新及恢复。 Example source: src/divider/__demos__/live-properties.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`。水平文字 start/end 随阅读方向对齐,垂直文字 start/end 仍表示上/下。inset 表示沿线两端缩进,spacing 表示线外间距:水平线 inset 和垂直线 spacing 的成对数值按逻辑起止解释。竖线边框绘制在逻辑起点,hairline、线型与 aria-orientation 保持原义,方向切换不重建内容。 ### 内容占位与最小线宽 主动设置 thickness 时,只接受至少为 1 的有限数。hairline 仍优先,使用主题线宽的一半。小于 1(包括 0 和负数)及非有限值不会写入样式,而是使用主题线宽,并在开发环境提示。 带文字、换行描述和默认插槽内容均正常占位,包括 spacing=0 时;后续正文不会被文字覆盖。 Example source: src/divider/__demos__/content-flow.vue ```vue ``` ## API ### 属性 | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | `orientation` | 分割线自身的横纵朝向,默认 horizontal;不控制文字对齐 | `horizontal` \| `vertical` | `horizontal` | | `type` | 线型 | `solid` \| `dashed` \| `dotted` \| `double` | `solid` | | `text-align` | 文字沿分割线的位置;start/end 为逻辑起止位置 | `start` \| `center` \| `end` | `center` | | `description` | 文字描述;默认插槽优先 | `string` | — | | `inset` | 沿线两端缩进:水平时左右,竖直时上下 | `DividerSize` | — | | `spacing` | 线条两侧外间距:水平时上下,竖直时左右 | `DividerSize` | `md` | | `thickness` | 有限线宽且至少 1,单位 px;未设置时使用主题默认 1px;hairline 优先 | `number` | — | | `hairline` | 将主题线宽缩放为一半;默认主题下为 0.5px | `boolean` | `false` | | `color` | 线条颜色;未设置时使用主题边框色 | `string` | — | | `opacity` | 整个分割线(含文字)的不透明度,范围 0–1;0 保留布局 | `number` | — | ### 间距取值 `DividerSize = number | string | [number | string] | [number | string, number | string]` `inset` 设置沿分割线方向的两端缩进,`spacing` 设置分割线与相邻内容的外间距。两者均支持预设 `xs`、`sm`、`md`、`lg`、`xl`、数值(单位 px)、CSS 长度或数组。单值或单元素数组对称应用;`[start, end]` 分别设置两端。数组元素为长度值,不使用预设名称。 | 方向 | inset 数组顺序 | spacing 数组顺序 | | --- | --- | --- | | horizontal | 行内起点/终点缩进(RTL 时为右/左) | 上/下外间距 | | vertical | 上/下缩进 | 行内起点/终点外间距(RTL 时为右/左) | `inset` 默认不缩进;`spacing` 默认使用当前平台的 `md` 间距。预设读取平台主题 token,具体像素值可不同。 开发环境会检查 orientation、text-align、type、间距结构、thickness 和 opacity。非法枚举使用默认值;非法 inset 不缩进,非法 spacing 回退 md,非法 opacity 不覆盖样式。opacity 必须为 0–1 的有限数。数组只允许一元或二元长度,数组项不使用预设名。仍支持有限负 margin 和 CSS var/calc 表达式,具体 CSS 语法由浏览器解析。 ### 插槽 | 插槽名 | 说明 | | --- | --- | | `default` | 自定义分割线内容,优先于 description | ## 类型定义 ```ts import type { DividerProps, DividerInstance, DividerSize, DividerSizePreset, DividerOrientation, DividerTextAlign, DividerType } from '@cedar-design/ui' ``` ### 样式变量 | 变量名 | 默认值 | | --- | --- | | `--c-divider-color` | `var(--c-sys-color-border-default)` | | `--c-divider-text-color` | `var(--c-sys-color-content-secondary)` | | `--c-divider-border-width` | `1px` | | `--c-divider-text-padding` | `16px` | | `--c-divider-text-align-inset` | `24px` | | `--c-divider-orientation-vertical-inset-xs` | `2px` | | `--c-divider-orientation-horizontal-inset-xs` | `12px` | | `--c-divider-orientation-vertical-spacing-xs` | `4px` | | `--c-divider-orientation-horizontal-spacing-xs` | `8px` | | `--c-divider-orientation-vertical-inset-sm` | `4px` | | `--c-divider-orientation-horizontal-inset-sm` | `16px` | | `--c-divider-orientation-vertical-spacing-sm` | `8px` | | `--c-divider-orientation-horizontal-spacing-sm` | `12px` | | `--c-divider-orientation-vertical-inset-md` | `6px` | | `--c-divider-orientation-horizontal-inset-md` | `24px` | | `--c-divider-orientation-vertical-spacing-md` | `12px` | | `--c-divider-orientation-horizontal-spacing-md` | `16px` | | `--c-divider-orientation-vertical-inset-lg` | `8px` | | `--c-divider-orientation-horizontal-inset-lg` | `32px` | | `--c-divider-orientation-vertical-spacing-lg` | `16px` | | `--c-divider-orientation-horizontal-spacing-lg` | `24px` | | `--c-divider-orientation-vertical-inset-xl` | `12px` | | `--c-divider-orientation-horizontal-inset-xl` | `40px` | | `--c-divider-orientation-vertical-spacing-xl` | `24px` | | `--c-divider-orientation-horizontal-spacing-xl` | `32px` | 预设值读取当前平台主题;文字留白在桌面端为 16px,移动端为 8px。 --- Document: llms/zh-CN/components/drawer.md # Drawer 从容器一侧进入的桌面抽屉。Drawer 与 Maple Popup 共用同一套模态表面控制逻辑;标题、页脚、操作按钮和宽高仍是 Drawer 的桌面端能力。 ## 基础示例 ### 基础用法 Example source: src/drawer/__demos__/basic.vue ```vue ``` ## 尺寸与定位 ### 抽屉尺寸与方向 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `unmount-on-close` | 关闭动画后是否卸载内容 | 抽屉尺寸与方向 | | `placement` | 抽屉面板在容器中的出现侧,默认 right;不是相对按钮的定位,不执行浮层避让翻转 | 抽屉尺寸与方向 | | `popup-container` | 挂载容器 | 挂载位置 | 依次打开不同抽屉,比较方向和占用空间;嵌套、挂载容器与关闭拦截另见后续案例。
配置说明与使用限制 #### 自定义宽度 Drawer 不提供离散 `size` 枚举;左右位置使用 `width`,上下位置使用 `height`,均支持 `number | string`。
Example source: src/drawer/__demos__/position-size-comparison.vue ```vue ``` ### 挂载位置 `popup-container` 支持选择器、HTMLElement 和 `false`;`false` 表示保留在当前组件树位置。 Example source: src/drawer/__demos__/popup-container.vue ```vue ``` ## 内容与嵌套 ### 嵌套抽屉 Example source: src/drawer/__demos__/nest-drawer.vue ```vue ``` ### 自定义节点 Example source: src/drawer/__demos__/custom-node.vue ```vue ``` ### 函数调用 Example source: src/drawer/__demos__/function-call.vue ```vue ``` ## 关闭与异步控制 ### before 钩子与 done 兼容 `beforeClose({ action }, done, context)` 为统一入口,不新增另一套命名。 只记录日志的同步钩子应显式 return true;同步 undefined 表示仍在等待回调。注意:以前返回 `Promise` 却不调用 done 的异步钩子,现在会在 Promise 完成后放行。 Example source: src/drawer/__demos__/guard-protocol.vue ```vue ``` Promise 与 done 共用一次完成状态:`false` / `done(false)` 阻止,`true` / `done()` 允许;Promise<void> 正常完成允许。重复完成只生效一次,异常触发 guard-error,取消或卸载后迟到结果无效。此类关闭/确认回调同步返回 void 时保留原回调协议,等待 done。 守卫统一使用 `(payload, done, context)`:关闭 payload 为 `{ action }`,切换和提交为 `{ value, previousValue }`,Popup 为 `{ reason }`。context 提供 `signal` 和可选原始 `event`。返回 boolean/Promise,或调用 done()/done(false);同步 void 等待 done,Promise<void> 放行。首次完成生效。等待期间自动管理 loading/disabled,取消后旧结果失效,不暴露内部按钮 refs。 ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。抽屉 placement 的 left/right 保持物理侧,进入/退出仍从对应屏幕边缘运动;标题、内容和底部动作继承阅读方向。方向切换不提交或清空内容。 ## API ### Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | dir | 阅读方向;省略时继承来源作用域。物理 left/right 方位保持原意。 | `ReadingDirection` (`ltr` / `rtl`) | — | | open **(v-model)** | 是否可见 | `boolean` | - | | default-open | 非受控模式下是否默认可见 | `boolean` | `false` | | placement | 抽屉面板在容器中的出现侧,默认 right;不是相对按钮的定位,不执行浮层避让翻转 | `'top' \| 'right' \| 'bottom' \| 'left'` | `'right'` | | title | 标题 | `string` | - | | overlay | 是否显示遮罩 | `boolean` | `true` | | overlay-class / overlay-style | 遮罩类名 / 样式 | `string / CSSProperties` | - | | overlay-closable | 点击遮罩是否请求关闭 | `boolean` | `true` | | closable | 是否显示关闭按钮 | `boolean` | `true` | | confirm-button-text / cancel-button-text | 操作按钮文字 | `string` | - | | confirm-button-loading / cancel-button-loading | 操作按钮加载状态 | `boolean` | `false` | | confirm-button-disabled / cancel-button-disabled | 操作按钮禁用状态 | `boolean` | `false` | | confirm-button-props / cancel-button-props | 操作按钮属性 | `ButtonProps` | - | | unmount-on-close | 关闭动画后是否卸载内容 | `boolean` | `false` | | width / height | 左右宽度 / 上下高度 | `number \| string` | `250` | | popup-container | 挂载容器 | `string \| HTMLElement \| false` | `'body'` | | drawer-class / drawer-style | 面板类名 / 样式 | `string \| any[] / CSSProperties` | - | | body-class / body-style | 内容区类名 / 样式 | `string \| any[] / StyleValue` | - | | `before-close` | 返回 boolean/Promise 或调用 done;首次完成生效 | `DrawerBeforeClose` | — | | esc-to-close | ESC 是否请求关闭 | `boolean` | `true` | | lock-scroll | 是否锁定挂载容器滚动 | `boolean` | `true` | | close-on-route-change | 路由变化时是否请求关闭 | `boolean` | `false` | | z-index | 自定义层级 | `number` | 自动分配 | | header / footer / cancel-button | 是否显示对应区域 | `boolean` | `true` | ### Events | 事件 | 说明 | 参数 | | --- | --- | --- | | update:open | 可见状态请求 | `boolean` | | confirm / cancel | 点击对应操作按钮并获准关闭 | `Event` | | open / close | 开始打开 / 开始关闭 | - | | opened / closed | 打开 / 关闭动画结束 | - | | click-overlay | 点击当前最上层遮罩 | `MouseEvent` | | key-escape | 当前最上层抽屉收到 ESC | `KeyboardEvent` | ### Slots `default`、`header`、`title`、`footer`。`footer` 获得 `confirm`、`cancel`、`close` 三个方法。 ### 命令式调用 `Drawer.open(config)` 使用 camelCase 的同名配置,例如 `cancelButtonText`、`beforeClose`、`closeOnRouteChange`。通知事件使用 `onConfirm`、`onCancel`、`onOpen`、`onOpened`、`onClose`、`onClosed`、`onClickOverlay` 和 `onKeyEscape`。 ```ts import type { DrawerAction, DrawerConfig, DrawerProps } from '@cedar-design/ui' ``` ## CSS 变量与颜色语义 内置 fade/四方向 slide 在 prefers-reduced-motion: reduce 下关闭过渡与起始位移,组件样式自身生效,不依赖全局动效兜底。默认时长不变;业务自定义动画另行适配。已有编译 CSS 检查不等于真实 OS 动态切换验收。 面板 bg 使用 surface-raised;overlay-bg 使用 sys-color-scrim;header-text-color/content-text-color 使用 content-primary,关闭按钮与标题共享 header-text-color;border-color 使用 border-default。几何、动效与层级保留 Drawer 既有默认值。Drawer 是 Cedar 平台组件,不在 Maple 创建空壳同名变量。 overlay-style 可设置实例遮罩变量,drawer-style 可设置面板内变量;两者是兄弟节点,变量不会互相继承。全局主题在实际共同祖先设置 system 变量。显式背景属性优先于变量消费。已移除从未被消费的 close-icon-right 变量;关闭按钮位置由标题布局和 close-btn-margin-left 控制,不提供无效兼容别名。 | 变量 | 默认值 | | --- | --- | | `--c-drawer-header-height` | `var(--c-size-12)` | | `--c-drawer-footer-button-margin-left` | `var(--c-spacing-6)` | | `--c-drawer-header-font-size` | `var(--c-font-size-title-1)` | | `--c-drawer-padding-horizontal` | `var(--c-spacing-7)` | | `--c-drawer-footer-padding-vertical` | `var(--c-spacing-7)` | | `--c-drawer-content-padding-vertical` | `var(--c-spacing-6)` | | `--c-drawer-header-font-weight` | `var(--c-font-weight-500)` | | `--c-drawer-border-color` | `var(--c-sys-color-border-default)` | | `--c-drawer-border-width` | `var(--c-border-width-1)` | | `--c-drawer-header-text-color` | `var(--c-sys-color-content-primary)` | | `--c-drawer-content-text-color` | `var(--c-sys-color-content-primary)` | | `--c-drawer-bg` | `var(--c-sys-color-surface-raised)` | | `--c-drawer-overlay-bg` | `var(--c-sys-color-scrim)` | | `--c-drawer-line-height` | `var(--c-line-height)` | | `--c-drawer-z-index` | `var(--c-z-index-drawer)` | | `--c-drawer-close-icon-font-size` | `var(--c-size-3)` | | `--c-drawer-close-btn-margin-left` | `var(--c-spacing-4)` | | `--c-drawer-transition-duration` | `var(--c-transition-duration-3)` | | `--c-drawer-transition-timing-function` | `var(--c-transition-timing-function-standard)` | ### 守卫等待反馈 before-* 等待期间显示加载反馈并标记 aria-busy;拒绝或失败后恢复,重复提交不再启动同一操作。普通事件返回的 Promise 不参与加载。 --- Document: llms/zh-CN/components/ellipsis.md # Ellipsis 文本省略 单行或多行文本省略,可选展开交互和 Tooltip。 ## 基础示例 ### 单行省略 Example source: src/ellipsis/__demos__/basic.vue ```vue ``` ## 内容与展示 ### 多行省略 Example source: src/ellipsis/__demos__/multiline.vue ```vue ``` ## 自定义与插槽 ### 自定义提示 Example source: src/ellipsis/__demos__/custom-tooltip.vue ```vue ``` ## 交互与控制 ### 交互展开 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `line-clamp` | 正数行数,向下取整;未传或无效为单行 | 交互展开、受控展开 | | `expand-trigger` | 启用点击与 Enter / Space 展开 | 交互展开、受控展开 | | `tooltip` | Tooltip 配置,false 禁用 | 交互展开、受控展开 | | `expand` | 受控展开状态,配合 v-model:expand | 受控展开 | Example source: src/ellipsis/__demos__/expand.vue ```vue ``` ### 受控展开 Example source: src/ellipsis/__demos__/controlled.vue ```vue ``` ## API ### Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | `expand` | 受控展开状态,配合 v-model:expand | `boolean` | `undefined` | | `default-expand` | 非受控初始展开状态 | `boolean` | `false` | | `expand-trigger` | 启用点击与 Enter / Space 展开 | `'click'` | `—` | | `line-clamp` | 正数行数,向下取整;未传或无效为单行 | `number \| string` | `—` | | `tooltip` | Tooltip 配置,false 禁用 | `boolean \| TooltipProps` | `true` | 传入 `expand` 后只通知父级,不擅自修改受控值;省略时由内部状态管理,`default-expand` 仅用于初始化。Tooltip 遵循自身默认宽度及触发方式,不以实际测量是否溢出作为显示条件;触控场景可显式设置 `tooltip.trigger` 包含 `click`。外部 class/style/width 直接作用于文本节点。 ### 事件与插槽 - `update:expand(expand: boolean)`:用户操作请求的新状态;外部更新不触发。 - `default`:正文。 - `tooltip-content`:提示内容;未提供时优先 tooltip.content,否则使用正文,不重复拼接。 - 键盘:可展开文本支持 Enter / Space;启用 Tooltip 的文本可通过 Tab 聚焦。无公开实例方法。 ### 类型 ```ts import type { EllipsisProps, EllipsisInstance, EllipsisExpandTrigger } from '@cedar-design/ui' ``` ### 样式变量 | Token | 默认值 | | --- | --- | | `--c-ellipsis-focus-color` | `var(--c-sys-color-content-brand)` | | `--c-ellipsis-focus-width` | `2px` | | `--c-ellipsis-focus-offset` | `2px` | --- Document: llms/zh-CN/components/empty.md # Empty 指当前场景没有对应的数据内容,呈现出的一种状态。 ## 基础示例 ### 基础用法 空状态组件的基本用法。不传 `description` 时使用国际化文案。 Example source: src/empty/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 图片尺寸 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `image-size` | 图片/图标尺寸 | 图片尺寸 | | `description` | 描述内容,缺省时使用国际化文案 | 图片尺寸 | 通过 `image-size` 属性控制图标尺寸,可选值为 `xs` `sm` `md` `lg` `xl`,也可传入数值。 Example source: src/empty/__demos__/size.vue ```vue ``` ## 内容与展示 ### 空态图形与补充操作 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `description` | 描述内容,缺省时使用国际化文案 | 空态图形与补充操作、显示与隐藏 | | `image-url` | 自定义图片的地址 | 空态图形与补充操作 | | `alt` | 图片替代文本 | 空态图形与补充操作 | | `show-icon` | 是否显示图标 | 显示与隐藏 | | `show-description` | 是否显示描述 | 显示与隐藏 | 对比自定义图形和补充操作,观察替换默认内容与保留业务操作入口的区别。
配置说明与使用限制 #### 操作按钮 Reload 只更新本地刷新次数和描述,不请求服务;真实业务请自行接入请求与结果状态。 通过 `extra` 插槽添加操作按钮。 #### 自定义图片和文案 通过 `image` 插槽自定义图标、图片,或通过默认插槽修改文案。
Example source: src/empty/__demos__/content-comparison.vue ```vue ``` ### 显示与隐藏 通过两个按钮分别隐藏和恢复图标、描述。两者同时隐藏不代表隐藏整个组件,也不影响 extra 插槽。 通过 `show-icon`、`show-description` 控制图标和描述是否显示。 Example source: src/empty/__demos__/show.vue ```vue ``` ## API ### `` Props | 属性 | 说明 | 类型 | 默认值 | | ------------------ | ---------------------------- | -------------------------------------------------------- | ------- | | description | 描述内容,缺省时使用国际化文案 | `string` | - | | image-url | 自定义图片的地址 | `string` | - | | alt | 图片替代文本 | `string` | `''` | | image-size | 图片/图标尺寸 | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| number \| string` | `'md'` | | show-icon | 是否显示图标 | `boolean` | `true` | | show-description | 是否显示描述 | `boolean` | `true` | ### `` Events | 事件名 | 说明 | 参数 | | ------ | -------- | --------------------- | | click | 点击回调 | `(ev: MouseEvent)` | ### `` Slots | 插槽名 | 说明 | 参数 | | ------- | --------- | ---- | | image | 图片/图标 | - | | default | 描述内容 | - | | extra | 额外操作 | - | ### 类型定义 组件导出以下类型定义 ```ts import type { EmptyImageSize, EmptyProps } from '@cedar-design/ui' ``` ConfigProvider 的 `empty` 插槽可以替换未自定义内容的 Empty,不作为 Empty 的公开 Prop。 ### 样式变量 | 变量 | 默认值 | 用途 | | --- | --- | --- | | `--c-empty-description-color` | `var(--c-sys-color-content-tertiary)` | 低强调的空状态说明文字 | | `--c-empty-icon-color` | `var(--c-sys-color-content-decorative)` | 非文字装饰图标;不用于需要阅读的文字 | | `--c-empty-padding` | `var(--c-spacing-5) 0` | 容器留白 | | `--c-empty-image-margin-bottom` | `var(--c-spacing-2)` | 图标与说明的间距 | | `--c-empty-description-font-size` | `var(--c-font-size-body-3)` | 说明文字字号 | | `--c-empty-description-line-height` | `var(--c-line-height)` | 说明文字行高 | | `--c-empty-extra-margin-top` | `var(--c-spacing-5)` | 额外操作上方间距 | | `--c-empty-size-xs/sm/md/lg/xl` | `var(--c-size-15/20/25/35/45)` | 默认图标/图片的尺寸档位 | 描述是文字,必须按文本对比度检查;装饰图标可以更弱。自定义图片或插槽可能有自己的颜色,不会被 `icon-color` 强制重染。尺寸与间距按桌面/移动布局分别维护,但同名变量职责一致。 --- Document: llms/zh-CN/components/field-decorator.md # FieldDecorator 字段装饰器 FieldDecorator 是 Input、Textarea、Select 与日期时间控件的展示外壳,负责边框、尺寸、浮动提示、前后缀和清除按钮;不管理输入值、表单校验或弹层开合。 Cedar 完成实现后独立复制到 Maple,替换命名空间与导入路径;两端不引用另一端的运行时代码。主体、几何测量、插槽、事件及样式规则一致。 - 三种变体:`outline`(默认)、`filled`、`standard`。消费者可以显式选择自己的默认变体。 - 五种尺寸:`xs / sm / md / lg / xl`,默认 `md`;具体高度使用各端 token。 - `hint` 默认 Cedar 为 `false`,Maple 为 `true`。其他行为一致;Input 在 FormItem 已有外部标签时关闭浮动提示。 - 有内容且可编辑时才渲染清除按钮;`0` 算非空,`[]` 算空。Cedar 在 hover/focus 时显示,Maple 常驻;触屏媒体条件下 Cedar 也常驻。 - 默认按钮通过各端全局语言系统读取无障碍文案,不维护组件私有词典。 - 内容列尺寸使用 ResizeObserver 观察,支持前缀变化及隐藏容器重新显示;卸载时清理监听。 输入控件聚焦时不额外绘制外圈 outline,沿用各变体已有的边框、底线或背景聚焦反馈;适用于 Input、Textarea、Date 和 Time 等消费者。 输入框、文本域和数字输入框的光标使用 `currentColor`,与当前输入文字颜色一致;错误态不单独覆盖光标颜色。 `--c-field-caret-color` 默认 `currentColor`,统一控制 Input、InputNumber 与 Textarea 的光标颜色;不改变文字色。 ## 基础示例 ### 表单控件尺寸对照 切换五档 size 和三种字段变体,比较 Input、Button、Select、日期时间及其他单行表单控件的高度。Button 在这里固定使用 outline。DatePicker/TimePicker 是面板,此处使用带输入框的 Date/Time 字段。示例同时展示有值、可清空、标签删除与长标签多选;Select/Cascader 设置 tag-nowrap 时保持同档高度,长标签文字省略、删除图标保留;标签行可横向滚动,清空按钮和箭头固定在外侧。被省略的标签正文支持悬停、键盘聚焦或点按查看完整文字,点外部或按 Esc 关闭,不改变选中值。可清空后恢复选中值重复比较。多行文本和允许换行的多选内容按内容撑高。 Example source: src/field-decorator/__demos__/control-sizes.vue ```vue ``` ## 加载与等待 ### 共享字段加载 `loading` 控制共享字段加载状态;`loading-mode` 为 `default`(指示器)或 `line`(底部不定进度线),默认 `default`。渲染统一由 FieldDecorator 负责,不隐式改变 disabled/readonly;需要禁止编辑时单独设置。 Example source: src/field-decorator/__demos__/loading.vue ```vue ``` ### Loading tokens | Token | Default | | --- | --- | | `--c-field-loading-line-size` | `2px` | | `--c-field-loading-duration` | `1s` | | `--c-field-loading-color` | `var(--c-field-focus-color)` | ## Props 描边缺口通过 `fieldset / legend` 实现,不使用背景色遮罩。缺口起点与内容列对齐,左右各预留 `hint-space`;`padding-inline-start` 中的 CSS `max()/calc()` 必须使用 Less 原样输出,避免不同 Less 版本将其提前计算为 `0px`。`check:input` 同时检查源码一致性和两端 Less 编译产物。 | 属性 | 类型 | 默认值 / 含义 | | --- | --- | --- | | `tag` | `'div' \| 'span'` | `div`,外壳标签 | | `value` | `unknown` | 仅判断内容是否为空 | | `id` | `string` | 浮动标签关联的原生控件 id | | `title` | `string` | 原生标题提示 | | `size` | `ComponentSize` | `md`,实现全部五档尺寸 | | `variant` | `'outline' \| 'filled' \| 'standard'` | `outline` | | `placeholder` | `string` | 浮动标签文本 | | `hint` | `boolean` | Cedar false / Maple true | | `hint-center` | `boolean` | `true`;多行控件设为 false | | `line` | `boolean` | `true`,是否显示边框或底线 | | `focused` | `boolean` | 消费者传入焦点状态 | | `composing` | `boolean` | 输入法组合期间保持标签浮起 | | `disabled` / `readonly` / `error` | `boolean` | 消费者合并 Form / Group 后传入 | | `clearable` | `boolean` | `false`,是否允许清除 | | `text-color` / `focus-color` / `blur-color` | `string` | 自定义文字、焦点和非焦点颜色 | | `cursor` | `string` | 自定义光标 | ## 插槽与事件 `default` 放原生输入框、标签或展示内容;`prefix` / `suffix` 放附加内容;`clear-icon` 接收 `clear(event?)`,自定义按钮应调用它,清除不会冒泡打开选择面板。 `clear(event)` 通知消费者更新值;`mousedown(event)` 供消费者管理焦点。外壳不自行修改模型。 样式语义统一使用 `--c-field-*` / `--mp-field-*`;声明集中在各自 `style/token.less`,实现不跨库共享。不要在消费者中重复绘制边框。 ## 错误与禁用边框变量 以下后缀分别加上 `--c-field-` / `--mp-field-`:`variant-outline-border-color-error` 控制 outline 错误边框;`variant-standard-line-color-error` 控制 standard 错误底线;`variant-standard-line-color-disabled` 控制 standard 禁用底线,默认引用 system border-subtle。禁用优先于错误、hover 和 focus。三个入口均支持局部覆盖;错误提示文字仍由 `field-error-color` 管理。内部变量不是业务 API,已确认无消费的遗留内部声明直接删除,不提供别名。 动态更换 `tag` 后,尺寸观察会绑定当前根节点和内容节点。KeepAlive 停用释放观察和排队测量;旧激活代次的帧不会修改当前布局。 --- Document: llms/zh-CN/components/filter-form.md # FilterForm 列表页筛选项。FilterForm **不内置**输入组件,通过 `fields[].component` 直接传入组件(也可使用可选的 `field-map` 注册表),避免无用依赖进包。 持久化(记住筛选)由业务侧自行处理:组件只通过 `v-model` 同步值,不读写 storage。 ## 基础示例 ### 基础用法 在 `fields` 中直接传入组件并配置字段。宽屏会自动多列展示,超出时可展开/收起。 筛选容器使用主题表面色(亮色为白色、暗色随主题适配)、轻描边与20px内边距,不再使用输入控件的浅填充背景。操作区预留两列并与字段控件顶边对齐;单列时按可用列数收敛。单列/双列折叠默认保留一行字段和独立操作行,避免只剩按钮。展开/收起为原生按钮,支持Tab聚焦、Enter/空格操作并提供aria-expanded。行间距默认16px,可由grid-props.rowGap覆盖。 The filter uses the theme surface with a subtle border and 20px inset, rather than an input-fill background. Actions align with the fields and reserve two columns, clamped to the available column count. One- and two-column collapse retain a row of fields above the actions by default. Expand/collapse is a native keyboard-accessible button with aria-expanded. The default 16px row gap can be overridden through grid-props.rowGap. Example source: src/filter-form/__demos__/basic.vue ```vue ``` ```ts import { Input, Select, type FilterFormField } from '@cedar-design/ui' const fields: FilterFormField[] = [ { field: 'keyword', label: '关键词', component: Input }, { field: 'status', label: '状态', component: Select, props: { options: [{ label: '启用', value: 'enabled' }] }, }, ] ``` 所有字段组件统一使用 `modelValue` / `update:modelValue` 同步值。自定义组件也应遵循该协议;其他协议可通过包装组件适配。值同步与 FilterForm 的防抖 `change` 通知独立,`autoEmitChange: false` 时值仍会即时同步。 ## 内容与展示 ### 可选组件注册表 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `fields` | 筛选项 schema | 可选组件注册表 | | `field-map` | 可选字段组件注册表 | 可选组件注册表 | | `collapsible` | 是否启用展开/收起 | 可选组件注册表 | 需要复用组件默认属性或使用后端 JSON schema 时,可通过 `fieldMap` 注册组件,字段的 `component` 填写注册表 key。注册表支持直接传组件或 `{ component, defaultProps }`,字段 `props` 覆盖注册表默认属性。未注册的字符串 key 不渲染。 Example source: src/filter-form/__demos__/registered-fields.vue ```vue ``` ## 异步与动态数据 ### 异步 options #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `fields` | 筛选项 schema | 异步 options | | `collapsible` | 是否启用展开/收起 | 异步 options | 选项统一通过字段 `props.options` 传入。使用 `computed` 根据响应式选项构造 `fields`,接口返回后即可更新选项。关闭折叠时适合筛选项较少的场景。 Example source: src/filter-form/__demos__/async-options.vue ```vue ``` ## API ### 主值与默认值 使用普通 `v-model`。`modelValue` 表示筛选字段对象;`defaultValue` 仅在创建时初始化非受控值,后续修改不会重置当前状态。显式绑定值优先,初始化不发出 `update:modelValue`。 ### FilterForm Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | model-value **(v-model)** | 表单值 | `Record` | `{}` | | fields | 筛选项 schema | `FilterFormField[]` | `[]` | | field-map | 可选字段组件注册表 | `FilterFormFieldMap` | `{}` | | rules | 透传 Form 校验规则 | object | - | | collapsed **(v-model)** | 是否折叠多余项 | boolean | `true` | | collapsible | 是否启用展开/收起 | boolean | `true` | | cols | 响应式列数 | number \| object | `{ xs:1, sm:2, md:3, lg:3, xl:4, xxl:5 }` | | grid-props | Grid 其余属性 | object | - | | change-debounce | change 防抖毫秒 | number | `500` | ### FilterFormField | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | component | Vue 组件,或 `fieldMap` 的 key | `string \| Component` | - | | field | 表单字段路径 | string | - | | label | 标签 | string | - | | visible | 是否渲染 | boolean | `true` | | autoEmitChange | 输入过程是否触发 change | boolean | `true` | | props | 透传给字段组件 | object | - | | gridItemProps | GridItem 属性 | object | - | | formItemProps | FormItem 属性 | object | - | ### FilterFormFieldRegistration | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | component | 字段组件 | Component | - | | defaultProps | 默认 props | object | - | ### Events | 事件名 | 说明 | 参数 | | --- | --- | --- | | update:model-value | v-model | `(value) => void` | | update:collapsed | 折叠状态变化 | `(collapsed) => void` | | change | 字段值变化(防抖) | `(value, field) => void` | ### Slots | 插槽名 | 说明 | | --- | --- | | actions | 操作区(搜索 / 重置等),与展开收起同一行 | ### Methods | 方法名 | 说明 | | --- | --- | | formRef | 内部 Form 实例 | ## 样式变量 | 变量名 | 默认值 | | --- | --- | | `--c-filter-form-border-radius` | `var(--c-border-radius-md)` | | `--c-filter-form-background-color` | `var(--c-sys-color-surface-default)` | | `--c-filter-form-padding` | `var(--c-sys-space-7)`(20px) | | `--c-filter-form-border-color` | `var(--c-sys-color-border-subtle)` | | `--c-filter-form-border-width` | `1px` | | `--c-filter-form-action-offset` | `calc(1em * var(--c-form-line-height) + var(--c-form-vertical-label-margin-bottom))` | | `--c-filter-form-item-margin-bottom` | `0px`(行距由Grid负责) | | `--c-filter-form-actions-gap` | `var(--c-sys-space-5)`(12px) | | `--c-filter-form-collapse-gap` | `4px` | | `--c-filter-form-collapse-color` | `var(--c-color-text-2)` | | `--c-filter-form-collapse-hover-color` | `var(--c-sys-color-content-brand)` | | `--c-filter-form-focus-width` | `2px` | | `--c-filter-form-focus-offset` | `3px` | 2026-10-16 消费核验:真实 Less 编译与挂载 DOM 确认上述 13 项分别进入容器、FormItem、操作区和折叠按钮规则;静态样式入口同时导入 Form 样式。多列操作项的 `padding-top` 消费 action-offset,单列 stacked 状态覆盖为 `0`。根级派生别名不会保证随局部 Form 依赖覆盖重新计算,需要调整操作区对齐时直接在实际 FilterForm 根覆盖 `--c-filter-form-action-offset`。 ## 类型 ```ts import type { FilterFormProps, FilterFormField, FilterFormFieldMap, FilterFormFieldRegistration, } from '@cedar-design/ui' ``` Grid 列间距通过 `grid-props.colGap`(数字 px)控制;没有同名 CSS 覆盖入口,以确保 Grid 的数值测量与实际间距一致。 changeDebounce 改变时按新延迟重排待发送快照,0为立即通知。回车先取消待发送任务再通知当前值;外部重置或不同模型替换会取消旧快照,但正常接受 update:modelValue 的相同值回传不会取消 change。KeepAlive 停用与卸载取消待发送任务;重新激活后接受新输入。 --- Document: llms/zh-CN/components/form.md # Form 具有数据收集、校验和提交功能的表单,包含复选框、单选框、输入框、下拉选择框等元素。 标签一律由 `FormItem` 的 `label`(或 label 插槽)负责渲染;控件本身只提供 `placeholder` 等占位文案,不承担字段标签。 ## 阅读方向 Form 与 FormItem 的 content-align 支持 start、end、left、center、right,label-align 支持 start、end、left、right;默认内容 start、标签 end。默认 LTR 位置保持不变,RTL 按阅读方向排列;显式 left/right 均为物理对齐。字段覆盖优先于 Form,逐实例标签列样式保持最高优先级。切换方向不重置业务值、校验结果或只读/禁用状态。 ## 基础示例 ### 基础用法 Example source: src/form/__demos__/basic.vue ```vue ``` ## 表单外观与布局 ### 全局禁用 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------------ | --------------------------------------------------------- | ------------------------------------------ | | `layout` | 表单的布局方式,包括水平、垂直、多列 | 表单布局、标签与内容装饰、标签宽度方案对比 | | `model` | 表单数据对象 | 标签与内容装饰、标签宽度方案对比 | | `disabled` | 是否禁用表单 | 全局禁用 | | `label-align` | 标签的对齐方向 | 标签宽度方案对比 | | `auto-label-width` | 是否开启自动标签宽度,仅在 `layout="horizontal"` 下生效。 | 标签宽度方案对比 | | `label-col-flex` | 标签列 flex;数字为伸缩比例,带单位字符串为宽度 | 标签宽度方案对比 | 通过 disabled 属性可以禁用整个表单。 Example source: src/form/__demos__/disabled.vue ```vue ``` ### 表单布局 `edit-mode` 表示编辑模式:`direct` 始终显示控件;`click` / `dblclick` 保留当前在字段附近展开编辑浮层的行为。`readPretty` 是独立布尔属性。FormItem 和字段未设置时继承上层。字段旧 `presentation` 属性已移除,使用 `edit-mode` 配置编辑模式。`presentation="inline"` 迁移为 `edit-mode="direct"`,`layout="inline"` 不变。 表单支持三种布局方式: horizontal - 水平排列(默认,标签在左、控件在右), vertical - 垂直排列(标签在上、控件在下), inline - 行内排列。 组合切换 `layout`、`content-align` 与 `direct / click / dblclick` 编辑方式及独立的 `readPretty` 阅读开关,观察标签、字段值和长文字换行的对齐效果。备注项可单独覆盖布局,已有输入数据在切换时保留。`click` 单击进入弹层,`dblclick` 双击进入弹层,`readPretty` 只展示已保存的文字。 Example source: src/form/__demos__/layout.vue ```vue ``` ### 标签与内容装饰 Example source: src/form/__demos__/decoration.vue ```vue ``` ### 额外信息和帮助信息 可以使用 extra 添加额外信息。 如果需要在外部自定义校验信息,可以使用`help`属性或插槽。error 状态下校验信息优先;无错误展示时显示 help。 Example source: src/form/__demos__/extra.vue ```vue ``` ### 标签宽度方案对比 先输入数据,再切换自动测量、响应式栅格和固定宽度,三种方案使用同一份表单数据。修改最长标签或隐藏联系方式,观察自动测量更新。响应式方案在 576px 以下上下排列;固定宽度默认 6rem,联系方式单项覆盖为 8rem。
配置说明与使用限制 #### 自动标签宽度 设置 `auto-label-width` 开启自动标签宽度。仅在 `layout="horizontal"` 布局下生效。 自动宽度随标签修改、字段增删更新,各个表单独立计算。 #### 标签栅格与局部覆盖 两端默认横向比例为标签 5/24、内容 19/24;Cedar 默认 horizontal,Maple 默认 vertical。仅 horizontal 消费栅格比例与自动宽度;vertical/inline 不套用 Col 百分比。响应式 xs/sm 等按视口宽度生效。 #### 固定标签宽度 FormItem 显式配置优先于 Form。Col 参数与 style 对象整项覆盖,不做深层合并。label-col-flex 优先于 auto-label-width;带单位字符串指定宽度,数字沿用 Col 的伸缩比例(并非 px),内容列自动填满剩余空间。隐藏标签时内容占满。 自动宽度只测量未指定 label-col-flex 的横向标签;标签文字变化、动态增删会重新对齐。多个 Form 各自计算,标签为空或移除全部字段时不会产生 Infinity/NaN。使用很长的标签时建议在窄屏切换 vertical 或设置固定宽度。
Example source: src/form/__demos__/label-width-comparison.vue ```vue ``` ## 字段与数据模型 ### 嵌套数据 展示了多种表单项嵌套的方式。 表单控件通过 FormItem 注入的上下文继承状态和事件,无需绑定到第一子组件。 如果使用 Grid 组件进行布局,请设置 :content-flex="false" 关闭表单项内容的 flex 布局。 Example source: src/form/__demos__/nested-data.vue ```vue ``` ### 栅格布局 展示了使用栅格布局的方式。可以使用 `label-col-flex` 的带单位字符串指定标签宽度,数字表示 Col 伸缩比例。 ### 文本与数值字段 Example source: src/form/__demos__/field-components.vue ```vue ``` ### 开关与勾选字段 Example source: src/form/__demos__/field-choice.vue ```vue ``` ### 下拉选择字段 Example source: src/form/__demos__/field-selection.vue ```vue ``` ### 层级选择字段 Example source: src/form/__demos__/field-tree.vue ```vue ``` ### 日期字段 Example source: src/form/__demos__/field-date.vue ```vue ``` ### 时间字段 Example source: src/form/__demos__/field-time.vue ```vue ``` ### 进度与评分字段 Example source: src/form/__demos__/field-rating.vue ```vue ``` ### 附件字段 Example source: src/form/__demos__/field-upload.vue ```vue ``` ### 专用字段 Example source: src/form/__demos__/field-specialized.vue ```vue ``` ## 校验与提交 ### 验证表单 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | -------- | ------------------------------------ | ------------------------------------------ | | `model` | 表单数据对象 | 验证表单、跨字段校验与原生提交、清空时校验 | | `layout` | 表单的布局方式,包括水平、垂直、多列 | 清空时校验 | 展示了表单校验的使用方法。 Example source: src/form/__demos__/validate.vue ```vue ``` ### 跨字段校验与原生提交 Pause cross-field validation holds the local confirmation rule until Resolve cross-field result. Completion compares its confirmation value with the current source. Native reset settles pending tasks, clears the model and submitted snapshot, retains the history count and prevents late submission. This is not remote cancellation or exhaustive dependency-race coverage. “暂停跨字段校验”将确认规则挂起到“返回跨字段结果”,返回时比较本次确认值与当前源代码(不是远端接口或提交开始时的源快照)。匹配值提交后等待中修改源代码,会返回依赖错误;修正确认值并Enter重试后通过。等待中原生重置会结清本地任务、清空模型与提交快照、保留历史计数,不产生迟到提交;停用/卸载也清理等待。不代表异步循环依赖或多请求顺序均已覆盖。 未暂停时确认规则立即比较当前源代码。先匹配通过,再修改源代码,主动只校验确认值或重新提交会显示依赖错误;改正确认值后可按 Enter 或提交按钮提交。原生重置清空模型、反馈和上次提交值,提交次数累计不清零。依赖由业务主动复验,单纯编辑不保证已有成功态仍有效;本地示例不等于任意异步提交竞争或外部持久化。 Example source: src/form/__demos__/cross-field.vue ```vue ``` ### 清空时校验 `validate-trigger="clear"` 只在用户点击控件的清空按钮时校验;普通输入不会触发。本例清空后显示必填错误;重新输入不会自动清除该错误,可主动校验或重置表单。 Example source: src/form/__demos__/clear-trigger.vue ```vue ``` ### 空值标记与必填校验 接口用 -1 表示未选择。点击“校验”会显示必填错误;选择部门后再次校验通过。点击清空返回 -1,再次校验失败。Form 统一提供识别列表,字段单独指定清空输出;自定义校验仍收到原值。 Example source: src/form/__demos__/empty-values-validation.vue ```vue ``` ### 自定义表单校验状态 开启 feedback 可以让部分输入组件展示当前状态信息 Example source: src/form/__demos__/feedback.vue ```vue ``` ## 字段呈现与交互 ### 交互状态切换 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ----------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------- | | `layout` | 表单的布局方式,包括水平、垂直、多列 | 交互状态切换、校验展示状态、桌面与移动的同场景展示 | | `model` | 表单数据对象 | 字段展示与确认提交、桌面与移动的同场景展示、滚动到指定表单字段 | | `disabled` | 是否禁用表单 | 交互状态切换 | | `readonly` | 是否将表单控件设为只读 | 交互状态切换 | | `scroll-to-error` | 验证失败后滚动到页面顺序的第一个(start)或最后一个(end)错误字段;不是视口对齐方式 | 滚动到指定表单字段 | 适用于整张表单的状态继承。调整禁用、只读,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。 Example source: src/form/__demos__/state-lab.vue ```vue ``` ### 字段展示与确认提交 Form、FormItem、Input 和 Select 支持 edit-mode 继承,优先级为字段 > FormItem > Form。默认 direct;Cedar 支持 click/dblclick。普通 v-model 不变,弹层默认确认后提交。readPretty 不显示编辑器和搜索。direct 即时更新,弹层确认后更新;搜索框按展示位置自动排列。 Example source: src/form/__demos__/field-presentation.vue ```vue ``` ### 原位编辑的提交与切换 `click` / `dblclick` 共用事务逻辑:点击外部、Tab 离开或切换字段时先尝试保存,成功后关闭;校验失败或 `beforeCommit` 拒绝时保留草稿和错误,并阻止打开其他字段。同一文档同时只打开一个原位编辑器,包括不同 Form 和独立字段。字段自身传送到 body 的选项、日期和时间面板属于内部区域,选值不会触发外部保存。 内层面板打开时,Enter 优先选值,Esc 只关闭最上层面板并回到控件、保留字段草稿;面板关闭后,Enter 保存,Esc 取消并恢复原值。悬浮或键盘聚焦时显示编辑图标,并通过提示区分单击/双击;点击图标始终直接进入编辑。 多行文本保留 Enter 换行,Ctrl/Cmd+Enter 保存。输入法组词期间的 Enter 不提交。日期、时间面板内的单元格和列选项也只更新草稿,不误触外层保存。异步确认期间禁止重复确认、取消和切换;重置会终止保存及等待中的切换,迟到的结果不会写回。保存失败后可修改并重试。 ### 阅读空文案与配置继承 初始为阅读模式,姓名继承 Form 的默认“-”,编号使用 FormItem 的“未分配”,昵称使用字段的“匿名”,数量 0 保持可见。切换空文案只影响继承的字段;切换阅读/编辑不改模型。优先级为字段 > FormItem > Form;自定义 read 插槽优先。 Example source: src/form/__demos__/empty-text.vue ```vue ``` ### 校验展示状态 显式 validate-status 优先于自动状态;error 才显示错误信息,其他状态显示 help。它只控制展示,不改变 validate 的真实结果。自动校验经历 validating → success/error;clearValidate 恢复未校验状态。setFields 仅传 message 会设为 error;显式 status='' 和 message='' 可清空。 Example source: src/form/__demos__/presentation-status.vue ```vue ``` ### 桌面与移动的同场景展示 桌面字段在当前位置展开面板;选择后观察已提交模型。 Example source: src/form/__demos__/platform-presentation.vue ```vue ``` ### 独立面板操作区 Example source: src/form/__demos__/field-panel-actions.vue ```vue ``` ### 滚动到指定表单字段 展示了提交失败自动滚动到第一个错误字段和手动滚动对应字段的使用方法。 Example source: src/form/__demos__/scroll-assign.vue ```vue ``` ## 动态与异步字段 ### 动态表单 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ---------- | ---------------------- | ---------------------------------------- | | `model` | 表单数据对象 | 动态表单、表单异步校验、多字段异步聚合 | | `disabled` | 是否禁用表单 | 禁用、只读与异步确认、异步校验的返回顺序 | | `readonly` | 是否将表单控件设为只读 | 禁用、只读与异步确认、异步校验的返回顺序 | | `rules` | 表单项校验规则 | 禁用、只读与异步确认 | 通过数据动态控制表单内容。 Example source: src/form/__demos__/dynamic-form.vue ```vue ``` ### 表单异步校验 本地模拟异步校验,用户名输入 `admin` 后提交通过,其他值显示错误;不访问外部接口。原生提交/重置按钮使用 `html-type`。重置会取消本例的模拟校验并忽略旧提交结果,卸载或停用也会清理计时器。 外层标签通过 `label-attrs.for` 对应 Input 的 `id`;多个示例实例使用独立 ID,便于点击标签聚焦和辅助技术识别。 Example source: src/form/__demos__/async-validate-form.vue ```vue ``` ### 多字段异步聚合 State-command addendum: public `clearValidate()` and `setFields()` also invalidate a pending native submission, including field-scoped calls. Old completion cannot append submit events after a clear or explicit error; a fresh native submission still validates normally. The earlier exclusion below now applies only to editing without revalidation. The Demo keeps old tasks available for manual settlement; this does not cancel real requests. 显式调用validate()或validateField()会使等待中的旧原生submit失效:命令校验有自己的结果,不应让旧submit在完成后把旧错误或成功与当前模型混发。此后新的原生submit仍正常等待自己的字段校验并通知一次。该规则仅逻辑失效、不取消真实请求,不清空历史提交计数;既有方法签名不变,不保留旧的混发行为。仅编辑但未重新校验的快照协议仍未覆盖。 Explicit validate() or validateField() invalidates a pending older native submit. The imperative result is independent: an older submit must not later combine stale errors or success with the current model. A fresh native submit still waits for its own fields and notifies once. This is logical invalidation, not request cancellation, and retains submission history. Method signatures are unchanged; stale mixed notifications are not retained for compatibility. This does not define editing-only snapshot behavior. “返回最新用户名结果 / 返回最新代码结果”优先结清对应字段最新任务,可让新submit先完成、旧结果最后返回。新成功后旧失败不追加提交或恢复错误;新失败后旧成功不追加提交或清除新错误。仍须等最新提交的两个字段都返回,单个字段返回不提交;默认“返回用户名/代码结果”继续返回最早任务。 原生submit采用最新提交生效:旧提交仍等待时再次提交,使旧提交的submit/submit-success/submit-failed续体失效。用guest/bad提交后改为admin/1234再提交;先返回旧两个结果,原生提交计数应仍0,新提交仍等自己的两个结果。反向旧成功/新失败同理,旧成功不能提前报通过。这个规则不取消真实请求,也不处理仅编辑但没有再次提交的业务快照。 原生submit等待中调用resetFields(含原生reset)会使该提交失效;旧Promise结清后不得再发submit、submit-success或submit-failed。停用/卸载同样使旧提交失效,后续新提交仍正常校验。此为逻辑失效,不是取消远端请求;并发submit和跨字段异步依赖不在这个重置协议内。 “原生异步提交”是表单内的原生submit按钮,也可聚焦后按Enter。独立“原生提交”计数须等两个本地异步字段都返回才增加:用户名失败先返回时暂不提交,代码返回后记录失败;修正为admin再提交,反序返回代码/用户名后记录成功并清错。下方“结果”仍只表示命令式校验,两个计数/结果互不冒充。完成后重置清空字段、保留历史提交计数。此顺序重试不代表并发submit或跨字段异步依赖已覆盖。 同一示例可连续点击两次“校验两个字段”:先输入旧值并发起,再改值发起新一轮。“返回用户名结果 / 返回代码结果”各返回该字段最早任务。旧整表先完成时,新一轮仍须等它自己的两个字段;旧成功或失败都不应覆盖最新字段反馈。结果文案由示例序号单独保护,不是 Form 自动取消旧请求,也不是原生提交并发协议。 两个字段分别返回独立本地 Promise。先返回任一字段可更新该字段反馈,但整表须等两个字段都完成。重置使旧反馈和示例结果失效,旧任务仍可手动返回以观察迟到结果。这里演示命令式 validate(),不是原生提交事件并发或跨字段依赖。 也可在用户名结果已返回、代码仍等待时重置,立即输入新值并再次校验。此时返回最早代码只会结清旧任务,不能恢复旧错误或提前完成新整表;必须返回新一轮自己的两个结果。分别用旧失败/新成功、旧成功/新失败核对字段反馈;结果文案仍由示例版本号单独保护,不等于取消真实请求。 Example source: src/form/__demos__/async-fields.vue ```vue ``` ### 禁用、只读与异步确认 Example source: src/form/__demos__/presentation-state.vue ```vue ``` ### 异步校验的返回顺序 主动调用 `validateField` 后可继续修改字段并发起新校验。示例关闭自动触发,只通过按钮发起,手动返回本地结果以比较新旧顺序。先校验 guest,再校验 admin,先返回最新结果再返回最早结果;旧错误不应覆盖最新字段状态。结果文案由示例的请求序号保护,“本次校验值”是校验快照,不是服务端提交。 清空校验或重置后,仍可返回等待中的旧结果,确认不会恢复旧错误;卸载和停用会结清本地等待。真实接口还应取消请求,并由业务保护提交快照和版本。 本例也可在等待中切换表单 disabled / readonly:它们限制控件交互,不自动取消已经发起的校验,也不清除已有错误。外部校验控制按钮不属于被禁用的 Form。需要使旧结果失效时主动清空校验或重置;解除限制后可再次输入并发起新校验。 关闭 Mount async field 会移除字段但保留业务模型和待返回任务。重新挂载后可发起新校验,再按新旧顺序返回结果,核对旧实例的错误不会污染新字段;这不是删除业务数据,也不是整表并发提交协议。 等待中可通过“写入服务端错误”调用 `setFields` 设置显式错误;之前的异步成功或失败不应覆盖它。示例仍保留旧任务供手动返回,结果文案单独做版本保护。清空校验可移除错误,重新发起校验后以新结果为准;不代表真实接口已取消。 “校验整表”调用 `validate()`,“校验字段”调用 `validateField('name')`。可交错发起并按不同顺序返回,分别观察字段反馈和示例最新结果;重置使旧结果失效,不等于取消真实服务。当前示例只有一个异步字段,不代表多字段聚合、跨字段依赖或原生 submit 事件并发均已覆盖。 Example source: src/form/__demos__/async-race.vue ```vue ``` ### 日期范围的跨页边界 比较日期、月份、年份范围:禁用 2027-01-01、2026-12、2100 年。禁用项不能作为端点,范围可以跨过它们;翻页后检查禁用项仍保持灰态。 Example source: src/form/__demos__/field-range-boundaries.vue ```vue ``` ## 业务流程 ### 巡检任务完整流程 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | -------- | ------------------------------------ | ---------------- | | `model` | 表单数据对象 | 巡检任务完整流程 | | `layout` | 表单的布局方式,包括水平、垂直、多列 | 巡检任务完整流程 | 填写、校验、确认、模拟失败与重试;返回修改不会覆盖已提交记录。 Example source: src/form/__demos__/task-workflow.vue ```vue ``` ## API ### 空值识别与阅读空文案 Form / FormItem 通过 `empty-values` 提供空值识别策略;字段自己的 `empty-value` 决定清空输出。`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### `
` Props | 参数名 | 描述 | 类型 | 默认值 | | ----------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------ | :-------------------: | | model | 表单数据对象 | `object` | `{}` | | layout | 表单的布局方式,包括水平、垂直、多列 | `'horizontal' \| 'vertical' \| 'inline'` | `'horizontal'` | | size | 表单控件的尺寸 | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | | label-col-flex | 标签列 flex;数字为伸缩比例,带单位字符串为宽度 | `number \| string` | `-` | | label-col-style | 标签列逐实例样式 | `CSSProperties` | `-` | | wrapper-col-style | 内容列逐实例样式 | `CSSProperties` | `-` | | label-col-props | 标签元素布局选项。参数同 `` 组件一致 | `object` | `span: 5, offset: 0` | | wrapper-col-props | 表单控件布局选项。参数同 `` 组件一致 | `object` | `span: 19, offset: 0` | | label-align | 标签的对齐方向 | `'start' \| 'end' \| 'left' \| 'right'` | `'end'` | | `content-align` | 内容对齐,统一控制 direct 字段、弹出入口及 readPretty;与 label-align 独立 | `'start' \| 'end' \| 'left' \| 'center' \| 'right'` | `'start'` | | `read-pretty` | 独立的阅读开关;为 true 时展示已保存的值,关闭后恢复当前 edit-mode 的编辑方式;FormItem 未传时继承 Form | `boolean` | `-` | | `edit-mode` | 表单内字段的统一编辑模式;未设置时保留各字段默认值 | `'direct' \| 'click' \| 'dblclick'` | `-` | | disabled | 是否禁用表单 | `boolean` | `-` | | readonly | 是否将表单控件设为只读 | `boolean` | `-` | | rules | 表单项校验规则 | `Record` | `-` | | auto-label-width | 是否开启自动标签宽度,仅在 `layout="horizontal"` 下生效。 | `boolean` | `false` | | id | 表单控件`id`的前缀 | `string` | `-` | | scroll-to-error | 验证失败后滚动到页面顺序的第一个(start)或最后一个(end)错误字段;不是视口对齐方式 | `'start' \| 'end'` | 不滚动 | ### `` Events | 事件名 | 描述 | 参数 | | -------------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------- | | submit | 表单提交时触发 | data: `{values: Record; errors: Record \| undefined}`
ev: `Event` | | submit-success | 验证成功时触发 | values: `Record`
ev: `Event` | | submit-failed | 验证失败时触发 | data: `{values: Record; errors: Record}`
ev: `Event` | | reset | 原生重置时触发,并重置字段值与校验状态 | ev: `Event` | ### `` Methods | 方法名 | 描述 | 参数 | 返回值 | | ------------- | -------------------- | -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | | validate | 校验全部表单数据 | callback: `(errors: undefined \| Record) => void` | Promise> | | validateField | 校验部分表单数据 | field: `string \| string[]`
callback: `(errors: undefined \| Record) => void` | Promise> | | resetFields | 重置表单数据 | field: `string \| string[]` | - | | clearValidate | 清除校验状态 | field: `string \| string[]` | - | | setFields | 设置表单项的值和状态 | data: `Record` | - | | scrollToField | 滚动到指定表单项 | `field: string` | `-` | ### `` Props 未传布局、标签/内容栅格、样式、对齐和 flex 时继承 Form;显式值覆盖。 | 参数名 | 描述 | 类型 | 默认值 | | ----------------- | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | :--------------: | | field | 表单元素在数据对象中的path(数据项必填) | `string` | `''` | | label | 标签的文本 | `string` | `-` | | tooltip | 提示内容 | `string` | `-` | | show-colon | 是否显示冒号 | `boolean` | `false` | | no-style | 是否去除样式 | `boolean` | `false` | | disabled | 是否禁用 | `boolean` | `-` | | readonly | 是否只读;未传时继承 Form | `boolean` | `-` | | help | 帮助文案 | `string` | `-` | | extra | 额外显示的文案 | `string` | `-` | | required | 是否必须填写 | `boolean` | `false` | | asterisk-position | 必填星号在字段标签中的逻辑 start/end 位置,默认 start;不是表单或浮层位置 | `'start' \| 'end'` | `'start'` | | rules | 表单项校验规则(优先级高于 form 的 rules) | `FieldRule \| FieldRule[]` | `-` | | validate-status | 校验状态 | `'success' \| 'warning' \| 'error' \| 'validating'` | `-` | | validate-trigger | 触发校验的事件;`clear` 仅由控件清空动作触发,不等同于 `change` | `'change' \| 'input' \| 'focus' \| 'blur' \| 'clear'` | `'change'` | | size | 控件尺寸,未传继承 Form;标签外观仍由 Form 布局控制 | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `-` | | layout | 表单项布局;未传继承 Form | `'horizontal' \| 'vertical' \| 'inline'` | `-` | | label-align | 标签对齐;未传继承 Form | `'start' \| 'end' \| 'left' \| 'right'` | `-` | | `content-align` | 内容对齐,统一控制 direct 字段、弹出入口及 readPretty;与 label-align 独立 | `'start' \| 'end' \| 'left' \| 'center' \| 'right'` | `-`(继承 Form) | | `read-pretty` | 独立的阅读开关;为 true 时展示已保存的值,关闭后恢复当前 edit-mode 的编辑方式;FormItem 未传时继承 Form | `boolean` | `-` | | `edit-mode` | 编辑模式;未设置时继承 Form,字段可单独覆盖 | `'direct' \| 'click' \| 'dblclick'` | `-` | | label-col-props | 标签元素布局选项。参数同 `` 组件一致 | `object` | `-` | | wrapper-col-props | 表单控件布局选项。参数同 `` 组件一致 | `object` | `-` | | hide-label | 是否隐藏标签 | `boolean` | `false` | | hide-asterisk | 是否隐藏星号 | `boolean` | `false` | | label-col-style | 标签元素布局组件的 style | `object` | `-` | | wrapper-col-style | 表单控件布局组件的 style | `object` | `-` | | row-props | 表单项布局选项。参数同 `` 组件一致 | `object` | `-` | | row-class | 表单项布局组件的 class | `string\|array\|object` | `-` | | content-class | 表单控件包裹层的 class | `string\|array\|object` | `-` | | content-flex | 内容层是否开启 flex 布局 | `boolean` | `true` | | label-col-flex | 设置标签 `Col` 组件的 flex 属性。设置时表单 `Col` 组件的 flex 属性会被设置为 `auto`。 | `number\|string` | `-` | | feedback | 是否显示表单控件的反馈图标 | `boolean` | `false` | | label-component | 表单项标签渲染的元素 | `string` | `'label'` | | label-attrs | 标签原生属性;for 指向控件真实 id | `object` | `-` | ### `` Slots | 插槽名 | 描述 | 参数 | | ------ | :------: | ---- | | label | 标签 | - | | help | 帮助信息 | - | | extra | 额外内容 | - | ## Type ### FieldRule | 参数名 | 描述 | 类型 | 默认值 | | --------- | --------------------------------- | ----------------------------------------------------------------------------------------------------------- | :-----: | | type | 校验的值的类型,默认为 `'string'` | `'string' \| 'number' \| 'boolean' \| 'array' \| 'object' \| 'email' \| 'url' \| 'ip'` | `-` | | required | 是否必填 | `boolean` | `false` | | message | 校验失败时展示的信息 | `string` | `-` | | length | 校验长度(string, array) | `number` | `-` | | maxLength | 最大长度(string) | `number` | `-` | | minLength | 最小长度(string) | `number` | `-` | | match | 匹配校验(string) | `RegExp` | `-` | | uppercase | 大写(string) | `boolean` | `false` | | lowercase | 小写(string) | `boolean` | `false` | | min | 最小值(number) | `number` | `-` | | max | 最大值(number) | `number` | `-` | | equal | 校验数值(number) | `number` | `-` | | positive | 正数(number) | `boolean` | `false` | | negative | 负数(number) | `boolean` | `false` | | true | 是否为 `true`(boolean) | `boolean` | `false` | | false | 是否为 `false`(boolean) | `boolean` | `false` | | includes | 数组中是否包含给定值(array) | `any[]` | `-` | | deepEqual | 数组元素是否相等(array) | `any` | `-` | | empty | 是否为空(object) | `boolean` | `false` | | hasKeys | 对象是否包含给定属性(object) | `string[]` | `-` | | validator | 自定义校验规则 | `( value: FieldValue \| undefined, callback: (error?: string) => void ) => void` | `-` | ### FieldData | 参数名 | 描述 | 类型 | 默认值 | | ------- | -------------- | ---------------- | :----: | | value | 字段的值 | `any` | `-` | | status | 字段的状态 | `ValidateStatus` | `-` | | message | 字段的错误信息 | `string` | `-` | ### ValidatedError | 参数名 | 描述 | 类型 | 默认值 | | --------------- | ---------------------- | --------- | :-----: | | label | 标签的文本 | `string` | `-` | | field | 字段名 | `string` | `-` | | value | 字段值 | `any` | `-` | | type | 字段类型 | `string` | `-` | | isRequiredError | 是否为 `required` 错误 | `boolean` | `false` | | message | 错误信息 | `string` | `-` | ### FormItemEventHandler | 参数名 | 描述 | 类型 | 默认值 | | -------- | -------- | ---------------------- | :----: | | onChange | onChange | `(ev?: Event) => void` | `-` | | onInput | onInput | `(ev?: Event) => void` | `-` | | onFocus | onFocus | `(ev?: Event) => void` | `-` | | onBlur | onBlur | `(ev?: Event) => void` | `-` | ### useFormItem ```ts const useFormItem = (data: { size?: Ref; disabled?: Ref; error?: Ref; }) => { mergedSize: Ref; mergedDisabled: Ref; mergedError: Ref; feedback: Ref; eventHandlers: Ref; }; ``` ## 类型定义 组件导出以下类型定义 ```ts import type { FormProps } from "@cedar-design/ui"; ``` ### 五档密度与项目间距 xs/sm/md/lg/xl 均通过 size 类选择对应几何。项目下间距和验证文案预留高度共同使用 size-*-item-margin-bottom;inline 使用独立 inline-item-margin-bottom,error/help 不重复添加项目下间距。 | 变量 | 默认值 | | ------------------------------------- | --------------------------- | | `--c-form-size-xl-height` | `var(--c-size-xl)` | | `--c-form-size-xl-label-font-size` | `var(--c-sys-font-size-lg)` | | `--c-form-size-xl-item-margin-bottom` | `var(--c-spacing-8)` | ### edit-mode 继承规则 Form 支持 `direct / click / dblclick`;未设置时保留字段各自的默认值,FormItem 和字段继承上层显式设置的值,字段显式值优先。readPretty 是阅读属性,与 readonly/disabled 分开。确认编辑未结束时整表提交会失败并保留草稿;reset 取消编辑。原有默认插槽与 v-model 保持不变,不需要 editor 插槽。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 --- Document: llms/zh-CN/components/grid.md # Grid CSS Grid 布局:列数、跨列、间距、折叠与后缀。24 栏 Flex 布局使用 Row / Col。 > **布局怎么选** > > - Grid + GridItem:适合表单分栏、卡片网格,需要统一列宽、跨列、响应式列数或折叠行与后缀时使用。 > - Row + Col:适合 24 栏 Flex 布局,需要水平/垂直对齐、控制换行、固定宽度与自适应宽度组合,或响应式排序时使用。Row 控制整行,Col 控制列宽、偏移和排序。 > - Space:适合按钮、标签、文字等简单排列,只需要间距、方向和对齐时使用;更自由的宽度分配可使用原生 Flex。 ## 基础示例 ### 列数、跨列与偏移 Example source: src/grid/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 响应式列数、间距与跨列 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `cols` | 每行列数,最少为 1 | 响应式列数、间距与跨列 | | `col-gap` | 列间距(px) | 响应式列数、间距与跨列 | | `row-gap` | 行间距(px) | 响应式列数、间距与跨列 | Example source: src/grid/__demos__/responsive.vue ```vue ``` ## 自定义与插槽 ### 折叠行数与后缀插槽 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `cols` | 每行列数,最少为 1 | 折叠行数与后缀插槽 | | `col-gap` | 列间距(px) | 折叠行数与后缀插槽 | | `row-gap` | 行间距(px) | 折叠行数与后缀插槽 | | `collapsed` | 折叠超出的行 | 折叠行数与后缀插槽 | | `collapsed-rows` | 折叠时保留行数,最少为 1 | 折叠行数与后缀插槽 | 示例由父级保存 `collapsed` 和行数;More/Less 与开关修改同一状态。4列折叠1行时展示3项及后缀,2行时展示7项及后缀;展开后展示全部9项及后缀。后缀占一个网格位置,不是浮在内容之上的额外按钮。 Example source: src/grid/__demos__/collapse.vue ```vue ``` ## 交互与控制 ### 动态插入、删除与排序 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `cols` | 每行列数,最少为 1 | 动态插入、删除与排序 | | `col-gap` | 列间距(px) | 动态插入、删除与排序 | | `row-gap` | 行间距(px) | 动态插入、删除与排序 | | `collapsed` | 折叠超出的行 | 动态插入、删除与排序 | 按钮只修改本例的数据数组;删除至空时禁用 Remove first,后缀显示 End。重新插入后恢复布局与删除能力。Grid 本身不提供新增/删除业务事件。 Example source: src/grid/__demos__/dynamic.vue ```vue ``` ## API ### Props | 属性 | 说明 | Type | Default | | --- | --- | --- | --- | | cols | 每行列数,最少为 1 | `number / ResponsiveValue` | `24` | | row-gap | 行间距(px) | `number / ResponsiveValue` | `0` | | col-gap | 列间距(px) | `number / ResponsiveValue` | `0` | | collapsed | 折叠超出的行 | `boolean` | `false` | | collapsed-rows | 折叠时保留行数,最少为 1 | `number` | `1` | ### Events | Event | Description | | --- | --- | ### Slots | Slot | Description | | --- | --- | | default | 布局内容 | ### Methods | Method | Description | | --- | --- | ## 响应式与可访问性 断点基于浏览器视口:xs 为基础值,sm ≥576、md ≥768、lg ≥992、xl ≥1200、xxl ≥1600px;从最大匹配断点向下取已配置值。SSR 首屏使用 xs,挂载后响应视口;Grid 折叠和动态排序在挂载后计算。组件为布局容器,不增加键盘快捷键;内容语义及可聚焦元素由调用者提供。没有公开方法和专用主题 Token。 ## GridItem | Prop | Description | Type | Default | | --- | --- | --- | --- | | span | 跨越格数 | number / ResponsiveValue | 1 | | offset | 左侧留空格数 | number / ResponsiveValue | 0 | | suffix | 行末后缀 | boolean | false | 默认插槽参数 `{ overflow: boolean }` 表示折叠是否隐藏了内容;没有自定义事件或公开方法。 ## 导入 Grid 仅包含 Grid.Item;Row、Col 是独立组件,拥有独立源码、样式、菜单、文档和 Demo。已移除 Grid.Row/Grid.Col、Grid 入口的 Row/Col 转导出以及 GridRowInstance/GridColInstance。请从库根入口或独立 row/col 入口导入;安装 Grid 不再自动注册 Row/Col。 --- Document: llms/zh-CN/components/hover.md # Hover 悬停反馈 `v-hover` 通过鼠标进入和离开更新样式或通知回调;`HoverOverlay` 根据显式的悬停与聚焦状态绘制装饰遮层。两者可独立组合,遮层不接管点击和键盘语义。 ## 基础示例 ### 悬停与焦点 将鼠标移入按钮,观察悬停状态;再通过 Tab 聚焦,观察焦点状态。示例使用原生按钮语义,悬停指令自身只处理 mouseenter / mouseleave,键盘焦点由宿主事件传入。 Example source: src/hover/__demos__/basic.vue ```vue ``` ## API ### 指令 | 用法 | 说明 | | --- | --- | | `v-hover="callback"` | 鼠标进入和离开时通知 `(hovering: boolean) => void` | | `v-hover="styleObject"` | 鼠标进入时应用样式,离开时恢复 | | `v-hover:desktop` / `v-hover:mobile` | 按指令的端侧判断启用,不代表支持真实触屏悬停 | ### HoverOverlay Props | 属性 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | | hovering | boolean | false | 悬停装饰状态 | | focusing | boolean | false | 焦点装饰状态 | `useHoverOverlay()` 返回 `hovering` 与 `handleHovering`,可连接指令回调。遮层使用绝对定位,宿主需提供定位上下文;独立使用时引入 `@cedar-design/ui/hover/style`。 --- Document: llms/zh-CN/components/icon.md # Icon 图标以独立 SVG Vue 组件提供。推荐通过 Resolver 自动按需导入;需要统一尺寸、颜色或旋转时,使用 Icon 容器包裹图标。 ## 基础示例 ### 基础用法 Example source: src/icon/__demos__/basic-usage.vue ```vue ``` ## 外观与状态 ### 图标尺寸与颜色 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `size` | `inherit` | 图标尺寸与颜色 | | `color` | 图标颜色 | 图标尺寸与颜色 | 比较相同图标的尺寸和颜色,旋转/动画与点击行为另行展示。 Example source: src/icon/__demos__/appearance-comparison.vue ```vue ``` ## 内容与展示 ### 旋转与持续旋转 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `size` | `inherit` | 旋转与持续旋转 | | `rotate` | 旋转角度 | 旋转与持续旋转 | | `spin` | 是否持续旋转 | 旋转与持续旋转 | `rotate` 设置静态角度,`spin` 开启持续旋转动画,两者可以组合使用。 Example source: src/icon/__demos__/rotate-spin.vue ```vue ``` ### 全部图标 两端使用同一套规范名称。搜索忽略首尾空格和大小写,清空后恢复全部图标。卡片放大展示图标,完整名称可换行;点击或按 Enter / Space 复制对应标签。复制使用浏览器 Clipboard API,需要安全上下文及剪贴板权限;失败时显示错误反馈。 Example source: src/icon/__demos__/catalog.vue ```vue ``` ## 自定义与插槽 ### 自定义图标 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `size` | `inherit` | 自定义图标 | | `color` | 图标颜色 | 自定义图标 | 在默认插槽内放入自定义 SVG,尺寸和颜色由 Icon 容器统一控制。 Example source: src/icon/__demos__/custom.vue ```vue ``` ### 接入 IconPark 自定义项目 IconPark 自定义项目提供的 **SVG Symbol JS** 和 **Web Component JS** 都可以直接接入,不需要逐个导出 SVG,也不需要为每个图标生成 Vue 组件。它们是 SVG 资源方案,与通过 `@font-face` 加载文字字体不同。 `@icon-park/vue-next` 提供的公共图标组件与自定义项目 JS 是不同的资源入口;安装公共图标包不会自动包含团队上传或维护的自定义图标。 | 方式 | 图标资源来源 | 使用方式 | 加载粒度 | | --- | --- | --- | --- | | SVG Symbol JS | 自定义项目生成的 JS | 默认插槽放入 `svg` / `use` | 该 JS 包含的图标集合 | | Web Component JS | 自定义项目生成的 JS | 默认插槽放入自定义元素 | 以生成产物的实现为准,不能假定逐图标加载 | | 独立 SVG Vue 组件 | 本地图标文件或组件包 | 默认插槽放入 Vue 图标组件 | 按模块导入,具体取决于打包配置 | 建议先使用 SVG Symbol:它可以复用 Icon 容器,并且不需要配置 Vue 自定义元素识别。 **当前 API 边界:** `CIcon` 没有 `symbol` 属性,也不会自动下载、注册或注入 IconPark 资源。本文通过现有默认插槽接入;`name` 只解析当前 Vue 应用已注册的图标组件,不能用于查找 Symbol ID 或 Web Component 图标名称。默认插槽优先于 `name`。 #### SVG Symbol:加载项目 JS 从 IconPark 自定义项目复制 **SVG Symbol** 类型的 JS 地址,在业务应用的 HTML 入口加载一次。例如 Vite 应用的 `index.html`: ```html ``` 脚本执行后,应在页面中注入带有 `symbol` 节点的 SVG 集合。组件库不内置业务项目地址;由应用决定使用远程地址还是随应用部署的静态文件。Web Component 和 Symbol 两种 JS 按选定方式加载即可,不需要为了同一个图标集合同时引入两份。 #### SVG Symbol:引用图标 假设脚本注入了 ``,可以这样使用。以下路径和 ID 均为示例,以实际生成产物为准。 ```vue ``` `href` 指向页面中的完整 Symbol ID,包含 `#`。显示名称、组件库的 `name`、项目中的图标名称不一定等于 Symbol ID;不要自行添加或移除前缀。可在开发者工具中检查 `symbol[id]`。这里使用的是 JS 注入的页面内资源,不能写成 `href="项目.js#project-home"`。 `size` 控制外层字号,内部 SVG 使用 `1em` 跟随尺寸;`rotate`、`spin` 作用于整个容器。没有显式 `size` 时沿用 Icon 的尺寸继承规则。Symbol 应保留生成产物中的 `viewBox`,避免图形裁剪或缩放异常。 #### 在业务层封装简写 如果需要按 ID 传参,可以增加一个业务组件 `ProjectIcon.vue`,无需修改组件库或生成每个图标的 Vue 文件: ```vue ``` 业务调用: ```vue ``` 这里的 `symbol` 属于业务组件 `ProjectIcon`,传值不包含 `#`;`size`、`color`、`rotate`、`spin` 等未声明属性通过 Vue 的单根属性透传交给 `CIcon`。若封装组件增加多个根节点或关闭 `inheritAttrs`,需要显式转发 `$attrs`。`transition` 目前只控制 `CIcon` 的 `name` 切换,不会为插槽内的 Symbol 引用切换提供动画。 #### Web Component:加载与编译配置 也可以加载自定义项目提供的 **Web Component JS**,然后在插槽中使用其注册的元素。以下假设生成产物使用 `iconpark-icon` 标签和 `name` 属性,实际名称、属性及可配置主题以项目生成的使用说明为准。 ```html ``` 在使用该标签的 Vue SFC 的构建配置中,将它识别为自定义元素。Vite 示例: ```ts import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [ vue({ template: { compilerOptions: { isCustomElement: (tag) => tag === 'iconpark-icon', }, }, }), ], }) ``` 把配置合并到现有的 Vue 插件配置中,不要重复添加插件。`isCustomElement` 是编译时选项;使用构建工具时,仅设置 `app.config.compilerOptions` 不能替代上面的配置。如果组件库内部封装了该标签,应在组件库编译时配置;业务源码直接使用时,应在业务构建中配置。 ```vue ``` 示例沿用项目已有的 `c-icon` 导入或注册配置。外层 `CIcon` 不会自动把主题、线宽等属性传给插槽中的元素;请按生成产物支持的 API 直接设置。若元素使用 Shadow DOM,外部 `.c-icon svg` 样式不能直接设置内部 SVG;尺寸和颜色应通过该元素支持的属性、继承样式或 CSS 变量设置。 #### 尺寸、颜色与多色图标 | 配置 | 实际效果与限制 | | --- | --- | | `size` | Symbol 示例通过 `1em` 继承容器尺寸;Web Component 需要确认自身尺寸 API | | `color` | 只有图形使用 `currentColor` 或支持相应继承机制时才生效 | | 固定 `fill` / `stroke` | 图形内部写死的颜色不会被外层 `color` 自动覆盖 | | 多色图标 | 保留原有颜色,不建议对所有路径统一强制覆盖 `fill` 或 `stroke` | | 主题与线宽 | 取决于生成产物能力,不能把公共 Vue 图标包的属性直接套用到项目 JS | #### 按需加载与体积 组件的按需引入与图标资源的加载是两件事。使用插槽不会让 `CIcon` 自动依赖整个 IconPark 包,现有 Resolver 的按需导入方式仍然适用;Resolver 也不会根据 `use` 的 ID 自动加载图标资源。 对于一次性注入集合的 Symbol JS,加载单位是整个文件。例如项目文件包含 200 个图标,即使页面只引用 3 个,也会下载并注入该文件中的 200 个图标。`href="#project-home"` 只选择要显示的图形,不会触发单个图标的网络请求。静态脚本不进入业务模块的 tree-shaking 分析,字符串 ID 也不会让未使用的 Symbol 被自动裁剪。 | 目标 | 做法 | | --- | --- | | 集合较小、多个页面频繁复用 | 应用入口加载一次,按文件版本复用浏览器缓存 | | 集合较大、模块之间差异明显 | 在资源侧拆分公共集合和业务集合,在对应路由或模块需要时加载 | | 希望先渲染页面,再加载图标 | 业务维护加载完成、失败和占位状态,资源可用后显示图标 | | 必须逐个图标参与打包裁剪 | 使用独立 SVG 模块或 Vue 组件,并验证组件包导出和构建工具的裁剪结果 | 远程 JS 不会进入组件库 npm 包,但仍计入应用实际下载体积。新增或删除图标后需要更新项目产物并处理缓存版本;不要只依据组件库的构建体积判断页面成本。 #### 加载时机、SSR 与可访问性 - 静态脚本应在需要使用图标时可用;动态加载应等待脚本成功执行。Web Component 还可通过 `customElements.whenDefined('iconpark-icon')` 等待元素注册,该方法不负责下载脚本,也不表示资源加载失败会自动结束等待。 - 一个应用统一加载相同资源一次,避免组件每次挂载都创建脚本。多个集合中的 Symbol ID 应保持唯一,避免同名图形互相覆盖或引用错误。 - SSR 环境中,不要在服务端执行依赖 `window`、`document`、`customElements` 的项目脚本。通过 HTML 脚本或客户端生命周期加载;需要条件渲染时,让服务端和客户端首次渲染的占位内容一致。图形资源尚未注入时不会显示,严格要求首屏图标的场景需另行准备服务端内联 Symbol 或独立 SVG。 - 装饰性 SVG 使用 `aria-hidden="true"`。独立传递信息的 SVG 应设置 `role="img"` 和可访问名称;只有图标的按钮应给按钮设置 `aria-label`,不能仅靠图标表达操作。 #### 常见问题 | 问题 | 检查项 | | --- | --- | | 图标空白 | 脚本是否成功执行、是否选对 JS 类型、完整 ID 是否存在、容器尺寸是否为零 | | `Failed to resolve component: iconpark-icon` | 使用标签的源码是否在编译时配置了 `isCustomElement` | | 图标颜色不变 | 图形是否使用固定颜色,或 Web Component 是否提供了颜色设置接口 | | 尺寸不跟随 `CIcon` | 内部 SVG / 自定义元素是否使用 `1em`,是否存在固定像素尺寸 | | 更新项目后仍显示旧图标 | 页面是否加载了新版本 JS,浏览器或 CDN 缓存是否已更新 | | 本地正常,部署后空白 | 检查静态资源基础路径、网络请求、CSP 的 `script-src` 及脚本执行错误 | | 多项目图标显示错误 | 检查 Symbol ID 冲突和重复加载,使用资源产物实际提供的唯一 ID | 参考:[Vue 与 Web Components](https://cn.vuejs.org/guide/extras/web-components)、[SVG use 元素](https://developer.mozilla.org/zh-CN/docs/Web/SVG/Reference/Element/use)。 ## 交互与控制 ### 点击事件 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `size` | `inherit` | 点击事件、动态名称 | | `color` | 图标颜色 | 点击事件 | | `name` | 已显式注册的图标名称 | 动态名称 | | `transition` | 名称切换动画时长(ms) | 动态名称 | Example source: src/icon/__demos__/click.vue ```vue ``` ### 动态名称 `name` 使用短横线名称(例如 `arrow-left`),只查找当前 Vue 应用已注册的图标,不会自动加载图标全集。点击“切换图标”查看名称与图形同步变化。设置默认插槽时,优先显示插槽内容,`name` 不再决定图形。 Example source: src/icon/__demos__/dynamic-name.vue ```vue ``` ## 生命周期与边界 ### 名称切换与生命周期 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `name` | 已显式注册的图标名称 | 名称切换与生命周期 | | `transition` | 名称切换动画时长(ms) | 名称切换与生命周期 | | `size` | `inherit` | 名称切换与生命周期 | Example source: src/icon/__demos__/lifecycle.vue ```vue ``` ## API ### 独立图标样式与使用边界 Resolver 自动导入独立图标时会一并引入轻量旋转样式;`importStyle: false` 时由业务自行引入。UI Icon 的样式入口也包含这份样式,不需要加载全部图标。 手动导入独立 SVG 组件时,若使用 `spin`,请在应用入口引入一次: ```ts import '@cedar-design/icons-vue/style.css' ``` `rotate` 与 `spin` 可以组合;内置旋转遵循减少动态效果设置。`transition` 只控制注册名称的切换,以毫秒数值或数字字符串传入(如 `200` / `"200"`),不解析 `"200ms"` / `"1s"`。默认插槽接管内容后不执行名称切换动画,移除插槽时立即显示最新名称。自定义 `animation-class` 应避免覆盖持续旋转使用的 `transform`,并自行适配减少动态效果设置。 `name` 只查找当前应用在渲染前显式注册的图标,不自动下载资源;挂载后补注册不会自动刷新。容器的原生 `title` 不会传给内部 SVG,需要图像名称时在独立图标上设置 `title`;作为操作入口时使用带可访问名称的 Button。`click` 是普通通知事件,支持 Vue 的 `.once`,不会根据监听器返回的 Promise 管理等待状态。`stroke-*` 只作用于描边,填充或固定多色资源不保证随这些属性变化。 ### Icon Props | 属性 | 说明 | 类型 | 默认值 | | --------------- | ---------------------- | ---------------- | ------ | | name | 已显式注册的图标名称 | string | - | | size | `inherit` | number \| string | - | | color | 图标颜色 | string | - | | rotate | 旋转角度 | number | - | | spin | 是否持续旋转 | boolean | false | | transition | 名称切换动画时长(ms) | number \| string | 0 | | animation-class | 自定义切换动画类名 | string | - | ### Icon-xxx Props | 属性 | 说明 | 类型 | 默认值 | | --------------- | ---------- | ------------------------------------------ | ------- | | size | `inherit` | number \| string | - | | color | 图标颜色 | string | - | | rotate | 旋转角度 | number | - | | spin | 是否旋转 | boolean | false | | title | 无障碍标题 | string | - | | stroke-width | 线宽 | number | 4 | | stroke-linecap | 端点类型 | 'butt' \| 'round' \| 'square' | 'butt' | | stroke-linejoin | 拐角类型 | 'bevel' \| 'inherit' \| 'miter' \| 'round' | 'miter' | ### Icon Events | 事件名 | 说明 | 参数 | | ------ | -------------- | --------------------------- | | click | 点击触发的事件 | (event: MouseEvent) => void | ### Icon Slots | 插槽名 | 说明 | | ------- | -------------- | | default | 自定义默认内容 | ### 类型定义 组件导出以下类型定义 ```ts import type { IconProps, IconInstance } from "@cedar-design/ui"; ``` ## 同源实现与平台边界 两端各自保存完整源码,不引用公共核心,不共享组件实例或响应式状态;修改时同步维护两份实现。主体、Props、关键样式及配对测试纳入只读源码一致性检查,主题 token 和安装入口各自维护。 只解析本应用已注册的图标;连续切换 name 会取消过期定时器,卸载后不再执行切换。各库注册前缀和历史 spin 类由本地适配保留,图标资源不跨库引用。 两端 Icon 默认继承宿主字号。需要固定 20px 的场景请显式设置 size="20" 或 icon-size 变量;size 属性优先于变量,颜色默认继承宿主。 ### 动效变量 | Token | Default | | --- | --- | | `--c-icon-spin-duration` | `1s` | 内置动效遵循 prefers-reduced-motion: reduce:保留内容与状态反馈,关闭装饰性旋转、扫光和波纹。Icon 名称切换直接显示最新值并取消未结束阶段,CSS与JS时长保持一致;自定义动画类由调用方负责适配。Ripple的时长与清理策略以Ripple组件文档为准,不将其历史250ms规则当作Icon的时长上限。 --- Document: llms/zh-CN/components/image.md # Image ## 基础示例 ### 基础用法 设置 `src` 即可获得带预览能力的图片组件。 Example source: src/image/__demos__/basic.vue ```vue ``` ## 图片展示与状态 ### 填充模式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `width` | 图片显示宽度 | 填充模式、图片说明与附加内容、错误状态 | | `src` | 图片获取地址 | 填充模式、图片说明与附加内容、错误状态 | | `height` | 图片显示高度 | 填充模式、错误状态、加载状态 | | `preview-disabled` | 是否禁用点击预览 | 填充模式、加载状态、懒加载与回退 | | `object-fit` | 确定图片如何适应容器框 | 填充模式、懒加载与回退 | | `title` | 标题 | 图片说明与附加内容 | 通过 `object-fit` 控制图片如何适应容器。 Example source: src/image/__demos__/fit-mode.vue ```vue ``` ### 图片说明与附加内容 比较图片说明和附加插槽的位置;预览入口、加载和错误回退保持独立。
配置说明与使用限制 #### 标题与描述 通过 `title`、`description` 和 `footer-position` 控制说明文案的展示位置。 #### 底部额外内容 通过 `extra` 插槽在页脚定制额外内容。
Example source: src/image/__demos__/content-comparison.vue ```vue ``` ### 错误状态 图片加载失败时展示默认错误态,也可用 `error` 插槽自定义。示例使用损坏的内联图片数据触发解码失败,不发送无效网络请求。 Example source: src/image/__demos__/error.vue ```vue ``` ### 加载状态 通过 `showLoader` 显示默认加载效果,或通过 `loader` 插槽自定义、模拟渐进加载。 Example source: src/image/__demos__/loader.vue ```vue ``` ### 懒加载与回退 `lazy` 使用原生 `loading="lazy"`;失败时可用 `fallback-src` 回退。 Example source: src/image/__demos__/lazy.vue ```vue ``` ## 预览入口与分组 ### 禁用预览 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `width` | 图片显示宽度 | 禁用预览、预览入口与受控、图片预览组 | | `src` | 图片获取地址 | 禁用预览、预览入口与受控、图片预览组 | | `height` | 图片显示高度 | 预览入口与受控、图片预览组 | | `object-fit` | 确定图片如何适应容器框 | 预览入口与受控、图片预览组 | | `preview-disabled` | 是否禁用点击预览 | 禁用预览 | | `preview-props` | 预览的配置项 | 预览入口与受控 | Example source: src/image/__demos__/disable-preview.vue ```vue ``` ### 预览入口与受控 通过 `preview-src`、`v-model:open` 和 `preview-props` 配置 Image 内嵌预览。 Example source: src/image/__demos__/preview-entry.vue ```vue ``` ### 单图 Preview `ImagePreview` 只接收单个 `src`,负责缩放、旋转、拖拽和全屏等变换。 Example source: src/image/__demos__/component-preview.vue ```vue ``` ### 命令式预览 命令式 API 对单图和多图返回同一套控制方法。 Example source: src/image/__demos__/imperative-preview.vue ```vue ``` ### 图片预览组 `ImagePreviewGroup` 可以收集子 Image,集合状态只由 Group 管理。 Example source: src/image/__demos__/preview-group.vue ```vue ``` ### 数据驱动预览组 也可以直接传入 `images`,用按钮打开预览。 Example source: src/image/__demos__/component-preview-group.vue ```vue ``` ## 预览定制与交互 ### 水波与行内 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `width` | 图片显示宽度 | 水波与行内、点击背景层关闭、错误时仍显示 Footer | | `src` | 图片获取地址 | 水波与行内、点击背景层关闭、错误时仍显示 Footer | | `height` | 图片显示高度 | 水波与行内、点击背景层关闭、尺寸、圆角与位置 | | `object-fit` | 确定图片如何适应容器框 | 水波与行内、点击背景层关闭、尺寸、圆角与位置 | | `preview-disabled` | 是否禁用点击预览 | 水波与行内、错误时仍显示 Footer、尺寸、圆角与位置 | | `preview-props` | 预览的配置项 | 点击背景层关闭、指定挂载容器 | `ripple` 开启点击水波;`block` 设为 `false` 时作为行内元素排列。 Example source: src/image/__demos__/ripple.vue ```vue ``` ### 点击背景层关闭 通过 `preview-props.overlayClosable` 控制点击图片外的背景层是否关闭预览。左图开启,右图关闭;点击图片本身均不会关闭预览。 Example source: src/image/__demos__/overlay-closable.vue ```vue ``` ### 错误时仍显示 Footer `hide-footer="never"` 可在加载失败时仍展示底部信息。 Example source: src/image/__demos__/hide-footer-never.vue ```vue ``` ### 自定义预览内容 关闭图标、指示器与操作区均可自定义。 Example source: src/image/__demos__/preview-features.vue ```vue ``` ### 尺寸、圆角与位置 `width` / `height`、`radius` 和 `object-position` 控制几何与裁切位置。 Example source: src/image/__demos__/presentation.vue ```vue ``` ### 指定挂载容器 Example source: src/image/__demos__/preview-popup-container.vue ```vue ``` ## 生命周期 ### PreviewGroup track lifecycle / 轨道生命周期 Example source: src/image/__demos__/track-lifecycle.vue ```vue ``` 展示图片,支持说明、加载回退与预览。两端示例分组一致。 单图与预览组未设置 `popup-container` 时均挂载到 body 并覆盖视口;只有显式 `false` 才原地渲染,需要父容器提供定位和尺寸。预览组仅由当前图片的 load/error 结束加载提示,切回已加载的缓存图片不会残留加载图标。 ### 预览交互生命周期 Example source: src/image/__demos__/controller-lifecycle.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。预览集合的上一张/下一张、水平键与滑动沿阅读方向工作,值数组不反转。方向切换取消尚未完成的手势并保持当前图片、缩放与旋转;图片本身和放大后的拖拽坐标不自动镜像。图片序号保持 LTR 数值显示。 ## API 图片预览组使用 `v-model` 绑定从 1 开始的图片序号,`defaultValue` 提供非受控初始图片序号;面板开关独立使用 `v-model:open` 与 `defaultOpen`。函数式预览配置同步使用 modelValue/defaultValue 和 onUpdate:modelValue。 ### `` Props | 参数名 | 描述 | 类型 | 默认值 | 版本 | | -------------------------- | ------------------------------------------------------- | ---------------------------------------------------------- | :-------: | :----- | | src | 图片获取地址 | `string` | `-` | | | width | 图片显示宽度 | `string \| number` | `-` | | | height | 图片显示高度 | `string \| number` | `-` | | | title | 标题 | `string` | `-` | | | description | 描述,将显示在底部,如果 alt 没有值,则会将其设置给 alt | `string` | `-` | | | object-fit | 确定图片如何适应容器框 | `'contain' \| 'cover' \| 'fill' \| 'none' \| 'scale-down'` | `-` | | | alt | 图片的文字描述 | `string` | `-` | | | hide-footer | 是否隐藏 footer(支持 `'never'`,错误时仍显示底部) | `boolean \| 'never'` | `false` | | | footer-position | 说明区位于图片内部 inner 或外部 outer,默认 inner;不是四边浮层方位 | `'inner' \| 'outer'` | `'inner'` | | | show-loader | 是否显示加载中效果 | `boolean` | `false` | | | preview-disabled | 是否禁用点击预览 | `boolean` | `false` | | | open **(v-model)** | 控制预览的打开状态 | `boolean` | `-` | | | default-open | 预览的默认打开状态 | `boolean` | `false` | | | preview-props | 预览的配置项 | `ImagePreviewProps` | `-` | | | footer-class | 底部显示区域的类名 | `string\|array\|object` | `-` | 2.23.0 | | popup-container | 预览挂载容器 | `string \| HTMLElement \| false` | `-` | | ### `` Events | 事件名 | 描述 | 参数 | | ------------------- | -------------------- | --------------- | | open-change | 预览的打开和关闭事件 | open: `boolean` | ### `` Slots | 插槽名 | 描述 | 参数 | | --------------- | :------------------: | ---- | | error | 自定义错误状态内容 | - | | error-icon | 自定义错误状态的图标 | - | | loader | 自定义加载状态效果 | - | | extra | 底部额外内容 | - | | preview-actions | 自定义预览工具栏 | - | ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------------------ | ----------------------------------------------------------------- | ----------------------- | :----------------------------------------------------------------------------------------: | | src | 图片获取地址 | `string` | `-` | | open **(v-model)** | 是否打开 | `boolean` | `-` | | default-open | 默认是否打开,非受控 | `boolean` | `false` | | overlay-closable | 点击图片外的 overlay 是否触发关闭,点击图片不会关闭 | `boolean` | `true` | | closable | 是否显示关闭按钮 | `boolean` | `true` | | actions-layout | 操作项的布局 | `string[]` | `[ 'fullScreen', 'rotateRight', 'rotateLeft', 'zoomIn', 'zoomOut', 'originalSize',]` | | popup-container | 设置弹出框的挂载点,同 `teleport` 的 `to`,缺省值是 document.body | `HTMLElement \| string \| false` | `-` | | esc-to-close | 是否支持 ESC 键关闭预览 | `boolean` | `true` | | wheel-zoom | 是否开启滚轮缩放 | `boolean` | `true` | | keyboard | 是否开启键盘控制 | `boolean` | `true` | | default-scale | 默认缩放比 | `number` | `1` | | scale-step | 每次缩放的增量 | `number` | `0.5` | ### `` Events | 事件名 | 描述 | 参数 | | ----------- | ------------ | --------------- | | close | 关闭事件 | - | | open-change | 打开状态变更 | open: `boolean` | ### `` Slots | 插槽名 | 描述 | 参数 | 版本 | | ------- | :----------------: | ---- | :----- | | actions | 自定义额外的操作项 | - | 2.17.0 | ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | --------------------- | ----------------------------------------------------------------- | ----------------------- | :----------------------------------------------------------------------------------------: | | images | 图片列表(设置了本属性之后,将不再收集子 Image 的图片信息) | `string[]` | `-` | | model-value **(v-model)** | 当前展示的图片的序号(从 1 开始) | `number` | `-` | | default-value | 第一张展示的图片的序号(从 1 开始) | `number` | `1` | | loop | 是否无限循环 | `boolean` | `false` | | open **(v-model)** | 是否打开,受控属性 | `boolean` | `-` | | default-open | 默认是否打开,非受控 | `boolean` | `false` | | overlay-closable | 点击图片外的 overlay 是否触发关闭,点击图片不会关闭 | `boolean` | `true` | | closable | 是否显示关闭按钮 | `boolean` | `true` | | actions-layout | 控制条的布局 | `string[]` | `[ 'fullScreen', 'rotateRight', 'rotateLeft', 'zoomIn', 'zoomOut', 'originalSize',]` | | popup-container | 设置弹出框的挂载点,同 `teleport` 的 `to`,缺省值是 document.body | `string \| HTMLElement \| false` | `-` | ### `` Events | 事件名 | 描述 | 参数 | | ----------- | ---------------- | --------------- | | change | 切换图片 | imageNumber: `number`,previousImageNumber: `number` | | open-change | 预览的打开和关闭 | open: `boolean` | ### `` Slots | 插槽名 | 描述 | 参数 | 版本 | | ------- | :----------------: | ---- | :----- | | actions | 自定义额外的操作项 | - | 2.46.0 | ### `` Props (2.17.0) | 参数名 | 描述 | 类型 | 默认值 | | -------- | -------- | --------- | :-----: | | name | 名称 | `string` | `-` | | disabled | 是否禁用 | `boolean` | `false` | ### 类型定义 ```ts import type { ImageInstance } from "@cedar-design/ui"; import { imagePreview } from "@cedar-design/ui"; ``` ### `imagePreview` 方法 命令式预览被新的调用替换时,会清理旧实例并触发旧实例的 `onClosed`;与正常关闭一样,每个实例只通知一次,可用于释放 Object URL 等资源。旧句柄不会关闭后来打开的预览。若 `onClosed` 内同步打开新的预览,保留该新调用,外层调用返回 `undefined`。 | 方法名 | 描述 | 参数 | | ---------------------------------- | ------------ | ------------------------------------- | | `imagePreview` | 打开图片预览 | `url \| url[] \| ImagePreviewOptions` | | `imagePreview.close` | 关闭预览 | `-` | | `imagePreview.setDefaultOptions` | 设置默认配置 | `ImagePreviewOptions` | | `imagePreview.resetDefaultOptions` | 重置默认配置 | `-` | ## FAQ ### 关于 `image-preview` 的属性说明 1. 键盘快捷键 `keyboard` 设置此属性为 `true` 后,将根据 `actions-layout` 操作项来启用相应的快捷键操作。 - `esc`: 关闭预览 - `left`: 切换至上一张图片 - `right`: 切换至下一张图片 - `up`: 放大图片 - `down`: 缩小图片 - `space`: 还原至原始大小 2. 默认缩放比例 `defaultScale` 此属性定义了默认的图片缩放比例。例如,当设置为 1.5 时,图片将默认放大到原始大小的 1.5 倍。 3. `scaleStep` 控制滚轮、双击和工具栏每次放大或缩小的增量。 ### 变量消费边界 预览组箭头字号由 `--c-image-preview-arrow-font-size` 控制。旧 actions-item、trigger、scale-value 尺寸以及 simple toolbar 变量对应的 DOM 已不存在,已删除这些无效入口;预览工具栏使用 preview-color-action-* 与 preview-padding-action-content,底栏使用现有 footer 变量。错误/加载层填满图片,不另加100px最小高度。缩放与轨道过渡消费 system motion,reduced-motion 时关闭。 ### 图片预览组序号 `modelValue/defaultValue` 从 **1** 开始,`1` 表示第 1 张。`open(imageNumber = 1)`、`to(imageNumber)` 接收相同序号,无效或非整数序号会被忽略。`prev()/next()` 在循环边界也回传同一规则的序号。模型事件为 `update:modelValue(imageNumber)`,切换通知为 `change(imageNumber, previousImageNumber)`;外部赋值不补发切换通知。长按通知为 `long-press(imageNumber)`,指示器插槽参数为 `{ imageNumber, length }`。内部数组下标仍从 0 开始。 根节点 `class`、`style` 与 Image 容器样式合并;内部图片样式通过 `img-props.class/style` 设置。预览的 `open-change` 是 Vue 通知事件:每次状态切换只发送一次,`.once` 遵循 Vue 事件语义,返回 Promise 不控制 loading。类型中的 `onOpenChange` 监听器也走同一事件入口。 --- Document: llms/zh-CN/components/infinite-scroll.md # InfiniteScroll InfiniteScroll 负责检测接近滚动底部并驱动分页状态,不负责请求、数据拼接或列表布局。通常与 `List` 组合使用。 ## 基础示例 ### 与列表组合 `status` 是唯一分页状态。组件触底时先同步更新为 `loading`,再触发 `load`;请求结束后由业务更新为 `idle`、`error` 或 `finished`。 Example source: src/infinite-scroll/__demos__/list.vue ```vue ``` ## 内容与展示 ### 加载失败 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `status` | 分页状态,支持 `v-model:status` | 加载失败 | | `target` | 滚动容器;未传时使用最近滚动父级 | 加载失败 | 请求失败时将 `status` 设置为 `error`。默认错误区域和 `error` 插槽都可以触发 `retry`,重试事件不会额外触发 `load`。 Example source: src/infinite-scroll/__demos__/error.vue ```vue ``` 自定义重试操作请使用按钮,支持键盘 Enter/Space。示例中的模拟请求会在卸载或停用时清理计时器,避免离开页面后继续回写。 基础、自定义状态和错误重试示例均清理模拟请求;KeepAlive 恢复后可从 idle 状态重新加载,不复用取消前的计时器。 ## 自定义与插槽 ### 自定义状态 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `status` | 分页状态,支持 `v-model:status` | 自定义状态 | | `target` | 滚动容器;未传时使用最近滚动父级 | 自定义状态 | | `bottom-offset` | 距离底部的触发阈值,数字按 px,字符串按 CSS length | 自定义状态 | 通过 `loading`、`finished` 插槽自定义底部状态,同时可使用 CSS 长度设置 `bottom-offset`。 Example source: src/infinite-scroll/__demos__/custom-status.vue ```vue ``` 虚拟列表场景应将 `target` 指向实际虚拟滚动容器,并在追加数据后把 `status` 改回 `idle`;必要时调用 `check()`。 ## 生命周期与边界 ### 测量绑定生命周期 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `status` | 分页状态,支持 `v-model:status` | 测量绑定生命周期 | | `target` | 滚动容器;未传时使用最近滚动父级 | 测量绑定生命周期 | | `immediate` | 挂载并解析滚动容器后是否立即检查 | 测量绑定生命周期 | Example source: src/infinite-scroll/__demos__/scheduler-lifecycle.vue ```vue ``` ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------------- | -------------------------------------------------- | ---------------------------------------------- | -------- | | status | 分页状态,支持 `v-model:status` | `'idle' \| 'loading' \| 'error' \| 'finished'` | `'idle'` | | bottom-offset | 距离底部的触发阈值,数字按 px,字符串按 CSS length | `string \| number` | `0` | | immediate | 挂载并解析滚动容器后是否立即检查 | `boolean` | `true` | | disabled | 是否暂停加载和重试 | `boolean` | `false` | | target | 滚动容器;未传时使用最近滚动父级 | `string \| HTMLElement` | `-` | ### `` Events | 事件名 | 描述 | 参数 | | ------------- | -------------------------- | --------- | | update:status | 请求分页状态改为 `loading` | `loading` | | load | 空闲状态下到达阈值时触发 | - | | retry | 错误状态下调用重试时触发 | - | `retry` 不会同时触发 `load`。业务可让两个事件调用同一个请求函数。 ### `` Methods | 方法名 | 描述 | | ------ | ---------------------------- | | check | 立即检查当前是否到达加载阈值 | | retry | 在 `error` 状态下发起重试 | ### `` Slots | 插槽名 | 描述 | 参数 | | -------- | ---------------- | ------------------- | | default | 被监听的内容 | - | | loading | 分页加载状态 | - | | error | 分页失败状态 | `retry: () => void` | | finished | 全部加载完成状态 | - | 默认错误区域可点击重试。`finished` 是终态,只有外部将 `status` 重置为 `idle` 后才会恢复检测。 ### 类型定义 ```ts import type { InfiniteScrollInstance, InfiniteScrollMethods, InfiniteScrollProps, InfiniteScrollStatus, } from "@cedar-design/ui"; ``` ### 样式变量 | 变量名 | 默认值 | | ----------------------------------------------- | ----------------------- | | `--c-infinite-scroll-status-min-height` | `50px` | | `--c-infinite-scroll-status-padding` | `12px 0` | | `--c-infinite-scroll-status-color` | `var(--c-color-text-3)` | | `--c-infinite-scroll-status-font-size` | `var(--c-font-size-md)` | | `--c-infinite-scroll-loading-gap` | `8px` | | `--c-infinite-scroll-error-color` | `var(--c-color-danger)` | --- Document: llms/zh-CN/components/input-number.md # InputNumber InputNumber 用于编辑和提交业务数字。两端主体、数值控制器、样式及公开 API 按独立源码复制维护,不共享运行时实例。 - `model-value !== undefined` 表示受控;`default-value` 仅初始化非受控值。编辑草稿允许暂时不同于业务值;提交后若父组件拒绝更新,恢复到父组件值。外部回填不触发用户事件或校验。 - 默认在 Enter / 失焦时更新;`model-event="input"` 输入完整数字时更新,但 `change` 仍在提交时触发。Enter 后再失焦不会重复提交。 - 清空顺序为 **input → update:model-value → change → clear**,值为 `undefined`。这次改造移除了旧的“清空不触发 input/change”行为,不提供兼容分支。 - `-`、`.`、`1.` 等输入中间态暂时保留;提交 `1.` 得到数字 1,单独符号恢复之前的业务值。非法文本、NaN、Infinity 不会写入业务值。IME 组合输入结束后只处理一次。 - 范围优先于精度:舍入后仍限制在 min/max 内,非对齐边界保留实际值。两端采用独立配置的 Decimal 运算,不受应用修改 Decimal 全局配置影响;模型仍是 JavaScript number,不承诺任意精度的大数存储。 - 禁用/只读/尺寸从 InputGroup、FormItem、Form 继承,显式 false 可以覆盖;Cedar 的缺省尺寸再读取 ConfigProvider,Maple 使用现有默认系统。字段外观与 hint 可继承 InputGroup;外层已有 FormItem 标题时不重复显示浮动标签。 - 鼠标、触控都支持长按;释放、取消、移出、窗口失焦、组件停用/卸载或状态变化时停止。移动端建议用 button 布局增加触控面积;↑/↓ 步进,Enter 提交。 ## 阅读方向 数字输入继承来源 `dir`,增减按钮随阅读顺序排列。数值、精度和上下键语义保持不变:ArrowUp 增加,ArrowDown 减少;不对数值或显示字符串做反转。 ## 基础示例 ### 基础与状态 Example source: src/input-number/__demos__/field-basic.vue ```vue ``` ## 外观与布局 ### 外观组合 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------- | --------------------------- | ------------------------------------ | | `size` | 五档均完整实现,可继承 | 表单控件尺寸对照、五档尺寸与字段外观 | | `variant` | 字段外观,可继承 InputGroup | 表单控件尺寸对照、五档尺寸与字段外观 | | `placeholder` | 输入提示 | 表单控件尺寸对照、五档尺寸与字段外观 | | `min` | 最小值 | 外观组合 | | `max` | 最大值 | 外观组合 | | `mode` | 步进按钮布局 | 三种布局 | 适用于数量、配额等数值输入。调整变体、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。 Example source: src/input-number/__demos__/appearance-lab.vue ```vue ``` ### 表单控件尺寸对照 切换五档 size 和三种字段变体,比较 Input、Button、Select、日期时间及其他单行表单控件的高度。Button 在这里固定使用 outline。DatePicker/TimePicker 是面板,此处使用带输入框的 Date/Time 字段。示例同时展示有值、可清空、标签删除与长标签多选;Select/Cascader 设置 tag-nowrap 时保持同档高度,长标签文字省略、删除图标保留;标签行可横向滚动,清空按钮和箭头固定在外侧。被省略的标签正文支持悬停、键盘聚焦或点按查看完整文字,点外部或按 Esc 关闭,不改变选中值。可清空后恢复选中值重复比较。多行文本和允许换行的多选内容按内容撑高。 Example source: src/field-decorator/__demos__/control-sizes.vue ```vue ``` ### 三种布局 Example source: src/input-number/__demos__/field-modes.vue ```vue ``` ### 五档尺寸与字段外观 Example source: src/input-number/__demos__/field-options.vue ```vue ``` ## 数值输入与格式 ### 数量控制与提交拦截 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ----------- | ---------------------------- | -------------------------------------------------- | | `clearable` | 允许清空可编辑字段 | 数量控制与提交拦截、格式化与插槽、小步长与范围边界 | | `mode` | 步进按钮布局 | 数量控制与提交拦截、格式化与插槽 | | `min` | 最小值 | 数量控制与提交拦截、小步长与范围边界 | | `max` | 最大值 | 数量控制与提交拦截、小步长与范围边界 | | `step` | 正的有限步长,支持科学计数法 | 数量控制与提交拦截、小步长与范围边界 | | `formatter` | 只格式化展示,不改变业务数字 | 格式化与插槽、小步长与范围边界 | `disable-input` 只禁止手输与清空,按钮和方向键仍可步进。`disable-increment` / `disable-decrement` 分别禁用方向;`increment-button` / `decrement-button` 控制显示,隐藏的方向同样不能通过键盘触发。`press=false` 关闭连续长按。 `before-commit(value, { previousValue, signal })` 复用字段提交协议,返回 `false` 拒绝,返回 `void` 允许;可返回 Promise。inline 的输入提交、步进与清空均经过拦截,`model-event="input"` 也需先审批后回填。等待期间公开 `aria-busy`、锁定操作,外部回填、禁用、只读、配置变化、停用或卸载会取消旧请求。不要把 signal 取消当作成功。抛错保留原值并触发 `commit-error(error)`。click / dblclick 编辑层在最终确认时拦截一次,内部草稿不重复审批;错误使用面板现有反馈。启用拦截时,长按不会连续发起审批。 `step(value, direction, event)` 只在已允许且实际改变的步进发生时触发,direction 为 `plus` 或 `minus`。外部回填、拒绝、边界、隐藏或禁用的方向均不触发。 Example source: src/input-number/__demos__/quantity-controls.vue ```vue ``` ### 格式化与插槽 Example source: src/input-number/__demos__/format-slots.vue ```vue ``` ### 小步长与范围边界 Example source: src/input-number/__demos__/number-boundaries.vue ```vue ``` ### 空值标记与有效的 0 接口用 -1 表示未填写时,同时配置 empty-values 与 empty-value。初始输入框为空而模型仍为 -1;点击“设为 0”后应显示 0;清空再次返回 -1。另一字段清空恢复为 0,演示清空输出不一定代表缺失。 Example source: src/input-number/__demos__/empty-value.vue ```vue ``` ## 交互与表单 ### 交互状态切换 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ----------- | ----------------------------- | -------------------------- | | `disabled` | 禁用;未设置时继承 | 交互状态切换、表单继承 | | `readonly` | 只读;允许聚焦复制,禁止改值 | 交互状态切换、表单继承 | | `clearable` | 允许清空可编辑字段 | 受控值与事件顺序、表单继承 | | `min` | 最小值 | 交互状态切换 | | `max` | 最大值 | 交互状态切换 | | `error` | 错误态;未设置时继承 FormItem | 交互状态切换 | 适用于数量、配额等数值输入。调整禁用、只读、错误反馈,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。 Example source: src/input-number/__demos__/state-lab.vue ```vue ``` ### 受控值与事件顺序 Example source: src/input-number/__demos__/controlled-events.vue ```vue ``` ### 表单继承 Example source: src/input-number/__demos__/form-inheritance.vue ```vue ``` ### 共享字段加载 `loading` 控制共享字段加载状态;`loading-mode` 为 `default`(指示器)或 `line`(底部不定进度线),默认 `default`。渲染统一由 FieldDecorator 负责,不隐式改变 disabled/readonly;需要禁止编辑时单独设置。 ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### 清空输出 `empty-value` 指定当前组件已有清空动作的输出;省略时采用该组件默认返回。具体类型以组件 API 为准。它不改变 empty-values 的识别规则,也不改变 Form reset 的初始值。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 ### Props | 属性 | 说明 | 类型 | 默认值 | | ------------- | -------------------------------------------- | ------------------------------- | ---------------- | | model-value | 受控值;undefined 表示空值/非受控 | `number` | — | | default-value | 非受控初始值 | `number` | — | | mode | 步进按钮布局 | `embed \| button \| input` | `embed` | | precision | 小数位数 0–100,不小于 step 的小数位 | `number` | — | | step | 正的有限步长,支持科学计数法 | `number` | `1` | | disabled | 禁用;未设置时继承 | `boolean` | 继承,否则 false | | error | 错误态;未设置时继承 FormItem | `boolean` | 继承,否则 false | | max | 最大值 | `number` | `Infinity` | | min | 最小值 | `number` | `-Infinity` | | formatter | 只格式化展示,不改变业务数字 | `(text: string) => string` | — | | parser | 每次编辑解析一次原始输入 | `(text: string) => string` | — | | placeholder | 输入提示 | `string` | — | | size | 五档均完整实现,可继承 | `xs \| sm \| md \| lg \| xl` | 继承,否则 md | | variant | 字段外观,可继承 InputGroup | `outline \| filled \| standard` | `outline` | | hint | 浮动提示,可继承 InputGroup / FieldDecorator | `boolean` | 库默认 | | clearable | 允许清空可编辑字段 | `boolean` | `false` | | model-event | model 更新时机;change 仍只在提交时触发 | `change \| input` | `change` | | readonly | 只读;允许聚焦复制,禁止改值 | `boolean` | 继承,否则 false | | input-attrs | 原生 input 补充属性 | `Record` | — | ### Events | 事件 | 参数 | 说明 | | ------------------ | ---------------------------------------------------------- | -------------------------------------------- | | input | `(value: number \| undefined, text: string, event: Event)` | 编辑后解析值与展示文本 | | update:model-value | `(value: number \| undefined)` | 请求修改业务值 | | change | `(value: number \| undefined, event: Event)` | 提交、步进或清空 | | clear | `(event: Event)` | 主动清空 | | focus | `(event: FocusEvent)` | 获取焦点 | | blur | `(event: FocusEvent)` | 失去焦点 | | keydown | `(event: KeyboardEvent)` | 原生键盘事件,可 preventDefault 拦截默认操作 | ### Slots | 插槽 | 参数 | 说明 | | ---------------- | ------------------------------------ | -------------- | | prefix / suffix | — | 字段内部前后缀 | | prepend / append | — | 字段外部标签 | | plus / minus | — | 步进按钮图标 | | clear-icon | `{ clear: (event?: Event) => void }` | 自定义清除按钮 | ### Methods | 方法 / 属性 | 类型 | 说明 | | ----------- | ---------------------------------- | ---------------- | | focus | `(options?: FocusOptions) => void` | 聚焦,禁用时无效 | | blur | `() => void` | 失焦 | | select | `() => void` | 选中输入内容 | | inputRef | `HTMLInputElement \| undefined` | 原生输入元素 | ## 类型定义 / Types ```ts import type { InputNumberProps, InputNumberInstance, InputNumberMode, InputNumberModelEvent, InputNumberSize, InputNumberVariant, InputNumberFormatter, InputNumberParser, } from "@cedar-design/ui"; ``` ## 样式变量 | Token | Default | | -------------------------------------------------- | -------------------------------------- | | `--c-input-number-step-button-width` | `var(--c-sys-control-height-md)` | | `--c-input-number-step-button-color` | `var(--c-sys-color-content-secondary)` | | `--c-input-number-step-button-disabled-color` | `var(--c-sys-color-content-disabled)` | | `--c-input-number-step-button-border-color` | `var(--c-sys-color-border-subtle)` | | `--c-input-number-step-button-background` | `var(--c-sys-color-surface-muted)` | | `--c-input-number-step-button-hover-background` | `var(--c-sys-color-state-hover)` | | `--c-input-number-step-button-active-background` | `var(--c-sys-color-state-selected)` | | `--c-input-number-step-button-icon-size` | `14px` | | `--c-input-number-step-button-transition-duration` | `0.2s` | | `--c-input-number-addon-background` | `var(--c-sys-color-surface-muted)` | | `--c-input-number-addon-color` | `var(--c-sys-color-content-primary)` | | `--c-input-number-addon-border-color` | `var(--c-sys-color-border-default)` | | `--c-input-number-border-width` | `1px` | | `--c-input-number-border-radius` | `var(--c-field-border-radius)` | | `--c-input-number-size-xs-step-button-width` | `var(--c-sys-control-height-xs)` | | `--c-input-number-size-sm-step-button-width` | `var(--c-sys-control-height-sm)` | | `--c-input-number-size-md-step-button-width` | `var(--c-sys-control-height-md)` | | `--c-input-number-size-lg-step-button-width` | `var(--c-sys-control-height-lg)` | | `--c-input-number-size-xl-step-button-width` | `var(--c-sys-control-height-xl)` | 旧的 `--c-field-number-*` Token 已移除,统一为以上 `--c-input-number-*`;不保留旧别名。字段通用外观继续使用 FieldDecorator 的 `--c-field-*` Token。 ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 统一光标色通过 `--c-field-caret-color` 设置(默认 `currentColor`);本组件可用 `--c-input-number-caret-color` 单独覆盖,默认 `var(--c-field-caret-color)`。 显式 beforeCommit 等待会沿用现有 loadingMode 指示器并设置实际输入的 aria-busy。手动 loading 保持业务所有权,不会隐式只读;beforeCommit 守卫保留已有输入锁定规则。change/step 等通知返回 Promise 不控制等待。 --- Document: llms/zh-CN/components/input-tag.md # InputTag 用来输入标签。 ## 阅读方向 标签按阅读顺序排列,标签值的数组顺序保持不变。空输入时 Backspace 删除业务数组中最后一个可关闭标签;Enter 添加标签,输入法组合期间不触发标签提交或删除。 ## 基础示例 ### 基础用法 标签输入框的基本用法。 Example source: src/input-tag/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 标签输入尺寸与状态 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | -------------------- | ------------------ | | `default-value` | 默认值(非受控状态) | 标签输入尺寸与状态 | | `placeholder` | 占位符 | 标签输入尺寸与状态 | | `size` | 输入框的大小 | 标签输入尺寸与状态 | | `clearable` | 是否允许清空 | 标签输入尺寸与状态 | | `disabled` | 是否禁用 | 标签输入尺寸与状态 | | `readonly` | 是否为只读模式 | 标签输入尺寸与状态 | 比较尺寸和禁用/只读/错误外观,操作可编辑实例观察标签布局;空值协议保持独立。
配置说明与使用限制 #### 输入框状态 输入框有禁用、只读和错误三种状态。 #### 输入框尺寸 输入框分为 `xs`、`sm`、`md`、`lg`、`xl` 五种尺寸。
Example source: src/input-tag/__demos__/appearance-state-comparison.vue ```vue ``` ## 内容与展示 ### 最多展示标签数量 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | ---------------------------------- | ---------------- | | `default-value` | 默认值(非受控状态) | 最多展示标签数量 | | `placeholder` | 占位符 | 最多展示标签数量 | | `max-tag-count` | 最多展示的标签个数,`0` 表示不限制 | 最多展示标签数量 | | `clearable` | 是否允许清空 | 最多展示标签数量 | 设置最多展示标签数量。 Example source: src/input-tag/__demos__/max.vue ```vue ``` ## 加载与等待 ### 受控加载 | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | `loading` | 业务显式控制的加载状态 | `boolean` | `false` | 通过 loading 显式展示等待;普通事件返回值不参与加载。before-* 守卫按其契约管理内部等待状态。 Example source: src/input-tag/__demos__/loading.vue ```vue ``` ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------------------------- | ---------------------------------- | ------------------------------------------------- | :--------: | | model-value **(v-model)** | 绑定值 | `(string \| number \| TagData)[]` | `-` | | default-value | 默认值(非受控状态) | `(string \| number \| TagData)[]` | `[]` | | input-value **(v-model)** | 输入框的值 | `string` | `-` | | default-input-value | 输入框的默认值(非受控状态) | `string` | `''` | | placeholder | 占位符 | `string` | `-` | | disabled | 是否禁用 | `boolean` | `false` | | error | 是否为错误状态 | `boolean` | `false` | | readonly | 是否为只读模式 | `boolean` | `false` | | clearable | 是否允许清空 | `boolean` | `false` | | size | 输入框的大小 | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | | variant | 输入框的变体 | `'filled' \| 'outline' \| 'standard'` | `'filled'` | | max-tag-count | 最多展示的标签个数,`0` 表示不限制 | `number` | `0` | | retain-input-value | 是否保留输入框的内容 | `boolean \| { create?: boolean; blur?: boolean }` | `false` | | format-tag | 格式化标签内容 | `(data: TagData) => string` | `-` | | unique-value | 是否仅创建唯一的值 | `boolean` | `false` | | field-names | 自定义 `TagData` 中的字段 | `InputTagFieldNames` | `-` | | tag-nowrap | 标签内容不换行 | `boolean` | `false` | ### `` Events | 事件名 | 描述 | 参数 | | ------------------ | ------------------------ | ------------------------------------------------------- | | change | 值发生改变时触发 | value: `(string \| number \| TagData)[]`
ev: `Event` | | input-value-change | 输入值发生改变时触发 | inputValue: `string`
ev: `Event` | | press-enter | 按下回车键时触发 | inputValue: `string`
ev: `KeyboardEvent` | | remove | 点击标签的删除按钮时触发 | removed: `string \| number`
ev: `Event` | | clear | 点击清除按钮时触发 | ev: `MouseEvent` | | focus | 输入框获取焦点时触发 | ev: `FocusEvent` | | blur | 输入框失去焦点时触发 | ev: `FocusEvent` | ### `` Methods | 方法名 | 描述 | 参数 | 返回值 | | ------ | ---------------- | ---- | ------ | | focus | 使输入框获取焦点 | - | - | | blur | 使输入框失去焦点 | - | - | ### `` Slots | 插槽名 | 描述 | 参数 | | ------ | :------------------: | --------------- | | tag | 输入框标签的显示内容 | data: `TagData` | | prefix | 前缀元素 | - | | suffix | 后缀元素 | - | ### TagData | 参数名 | 描述 | 类型 | 默认值 | | -------- | ---------- | ------------------ | :-----: | | value | 标签值 | `string \| number` | `-` | | label | 标签内容 | `string` | `-` | | closable | 是否可关闭 | `boolean` | `false` | | tagProps | 标签属性 | `TagProps` | `-` | ### 类型定义 组件导出以下类型定义 ```ts import type { InputTagInstance } from "@cedar-design/ui"; ``` ## InputTag 旧图标引用收尾 Cedar InputTag 实际嵌入 Tag 的 close-btn,不渲染旧 c-icon-hover 伪元素。本次移除旧 mixin 导入、默认/focus 的伪元素背景规则,以及重复的自定义 Tag 文字规则(文字由 Tag 自身负责)。关闭按钮的现有外观、点击删除和 readonly / disabled 行为不变;没有新增 hover 背景效果。 同步删除两端 tag-custom-icon-bg-hover,以及 Cedar input-tag-tag-remove-icon-color-bg / input-tag-tag-remove-icon-color-bg-focus。旧变量没有替代项,业务中对此的无效覆盖可删除;不保留别名。Maple 没有 InputTag 组件,仅同步清理共享 Tag 变量。 此前的跨组件保留项已关闭。check:token-consumers 现在检查 414 项 Badge / Tag 声明且无豁免,并编译 InputTag 防止旧图标选择器/变量回流;实际 DOM、关闭交互和自定义颜色由 InputTag 集成测试验证。553 项共享默认值数量不变:本次删除的共享变量此前仅登记名称。此阶段仍不代表 InputTag 全部 Token、浏览器视觉或键盘交互已完成治理。 ## InputTag 外壳与内容职责 InputTag 的 outline / filled / standard 外壳由 FieldDecorator 管理。Form 不应重新设置其背景、边框或焦点阴影;本次删除了 Form 对旧 InputTag 状态类的重绘规则,保留校验提示职责。filled 的默认/hover/focus 继续走 FieldDecorator 的 fill-1 / fill-2 / fill-3 规则。 InputTag 的内容密度、默认标签底色和禁用文字由 input-tag-* 控制。内容选择器现在匹配实际的 c-field-decorator--size-* / --focus / --disabled 类名,而非不存在的旧 InputTag 状态类;disabled 优先于 focus。五档 xs / sm / md / lg / xl 内容规则均已覆盖;xl 的标签高度为 32px、输入文字为 16px、垂直内边距为 4px。 移除 33 项没有实际 CSS 消费的旧外壳变量:size-{xs,sm,md,lg}-height;color-text-error;color-placeholder、color-icon-clear、color-icon-clear-bg-hover;color-border-{default,error,disabled}(及其 -hover / -focus);color-bg-{default,error}(及其 -hover / -focus)、color-bg-disabled(及 -hover);color-shadow-{default,error}-focus、size-shadow-{default,error}-focus;border-radius、border-width、size-icon-clear、size-icon-clear-hover。以上后缀均属于 --c-input-tag-。没有兼容别名。 迁移时按职责选择实际入口:外壳背景用 field-variant-{variant}-background 系列,圆角用 field-border-radius,占位文字用 field-placeholder-text-color,清除图标用 field-clear-icon-color / field-clear-icon-size。几何优先使用 size 属性;不要覆盖 internal 变量。旧无消费变量不存在逐项等价替代;内容标签使用下列 InputTag 自身变量。 InputTag 保留 27 项内容变量,已加入无消费检查;两端 Badge / Tag 加 Cedar InputTag 共检查 441 项声明,内容 size / focus / disabled 级联覆盖 80 组。共享默认值契约仍为 553 项;Cedar-only InputTag 不冒充跨端共享组件。默认文字、禁用文字、标签底色与焦点底色分别引用 content-primary、content-disabled、surface-default、state-hover。禁用状态只重绘中性标签,不覆盖显式 color / status;业务自定义颜色的可读性由业务负责。父级 disabled / readonly 优先于 tagProps.closable / checkable,loading 或显式不可关闭的标签也不能用 Backspace 删除。已完成 Cedar 浏览器五档布局、xl 输入与键盘删除、明暗模式以及禁用自定义色的抽验,不代表全组件视觉验收。 ### 当前内容变量 | 变量 | 默认值 | | ----------------------------------------- | ------------------------------------- | | `--c-input-tag-size-xs-tag-height` | `20px` | | `--c-input-tag-size-sm-tag-height` | `20px` | | `--c-input-tag-size-md-tag-height` | `24px` | | `--c-input-tag-size-lg-tag-height` | `28px` | | `--c-input-tag-size-xl-tag-height` | `32px` | | `--c-input-tag-size-xs-font-size` | `12px` | | `--c-input-tag-size-sm-font-size` | `14px` | | `--c-input-tag-size-md-font-size` | `14px` | | `--c-input-tag-size-lg-font-size` | `14px` | | `--c-input-tag-size-xl-font-size` | `16px` | | `--c-input-tag-color-text-default` | `var(--c-sys-color-content-primary)` | | `--c-input-tag-color-text-disabled` | `var(--c-sys-color-content-disabled)` | | `--c-input-tag-tag-margin-right` | `4px` | | `--c-input-tag-tag-margin-y` | `2px` | | `--c-input-tag-padding-x` | `4px` | | `--c-input-tag-size-xs-padding-y` | `0px` | | `--c-input-tag-size-sm-padding-y` | `2px` | | `--c-input-tag-size-md-padding-y` | `2px` | | `--c-input-tag-size-lg-padding-y` | `2px` | | `--c-input-tag-size-xl-padding-y` | `4px` | | `--c-input-tag-tag-font-size` | `12px` | | `--c-input-tag-tag-color-bg` | `var(--c-sys-color-surface-default)` | | `--c-input-tag-tag-color-bg-focus` | `var(--c-sys-color-state-hover)` | | `--c-input-tag-tag-color-bg-disabled` | `var(--c-sys-color-state-hover)` | | `--c-input-tag-tag-color-border` | `var(--c-color-fill-3)` | | `--c-input-tag-tag-color-border-disabled` | `var(--c-color-fill-3)` | | `--c-input-tag-tag-color-border-focus` | `var(--c-sys-color-state-hover)` | ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 ## 配置清空后的值 `empty-value` 指定当前组件已有清空动作的输出;省略时采用该组件默认返回。具体类型以组件 API 为准。它不改变 empty-values 的识别规则,也不改变 Form reset 的初始值。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 --- Document: llms/zh-CN/components/input.md # Input 基本表单组件,并在原生控件基础上进行了功能扩展,可以组合使用。 默认长度按 UTF-16 码元计算(emoji 通常占 2);默认截断不会拆开有效的代理对,边界不足时舍去整个字符。若需按用户感知字符(字素簇)计数和裁剪,请配套提供 `word-length` 与 `word-slice`;自定义裁剪结果由业务负责。 ## 阅读方向 输入框继承页面或局部容器的 `dir`;前后缀、清除操作和输入框组按阅读顺序排列。运行时切换方向保留原生输入节点、焦点和选区;光标、选区、混合文字与输入法组合由浏览器处理,不交换左右编辑键。父级重绘时保留正在组合的原生文本;旧选区恢复任务不会覆盖新的组合缓冲。 ## 基础示例 ### 表单控件尺寸对照 切换五档 size 和三种字段变体,比较 Input、Button、Select、日期时间及其他单行表单控件的高度。Button 在这里固定使用 outline。DatePicker/TimePicker 是面板,此处使用带输入框的 Date/Time 字段。示例同时展示有值、可清空、标签删除与长标签多选;Select/Cascader 设置 tag-nowrap 时保持同档高度,长标签文字省略、删除图标保留;标签行可横向滚动,清空按钮和箭头固定在外侧。被省略的标签正文支持悬停、键盘聚焦或点按查看完整文字,点外部或按 Esc 关闭,不改变选中值。可清空后恢复选中值重复比较。多行文本和允许换行的多选内容按内容撑高。 Example source: src/field-decorator/__demos__/control-sizes.vue ```vue ``` 输入框的基本用法。 Example source: src/input/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 外观配置对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------- | ------------------ | ------------------ | | `placeholder` | 提示文字 | 表单反馈、浮动提示 | | `hint` | 提示文字是否浮起 | 表单反馈、浮动提示 | | `clearable` | 是否允许清空输入框 | 表单反馈、浮动提示 | | `variant` | 输入框变体 | 浮动提示 | 选择一个对比维度后,同屏展示它的全部可选值;其余配置和内容保持一致。可切换其他配置检查组合效果;输入类预览共享一个值。
配置说明与使用限制 #### 变体 设置 `variant` 来调整不同风格的输入框。 可选值为 `filled`、`outline` 和 `standard`。 #### 尺寸 输入框完整支持五种尺寸 `xs / sm / md / lg / xl`,默认 `md`。 #### 外观组合 适用于表单中的单行文本输入。调整变体、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。
Example source: src/input/__demos__/appearance-lab.vue ```vue ``` ### 表单反馈 通过 FormItem 的 `feedback` 和 `validate-status` 展示校验反馈。有外置 FormItem 标签时,Input 自动关闭内部浮动提示,避免重复标签。 Example source: src/input/__demos__/form-feedback.vue ```vue ``` ### 浮动提示 设置 `hint` 后,提示文字作为关联原生输入框的标签,在聚焦或输入非空值时浮起;`line` 控制描边或底线是否显示。桌面端默认不启用浮动提示,仍可使用普通 `placeholder`;移动端默认启用。`text-color`、`focus-color`、`blur-color` 可覆盖文字与提示颜色。 Example source: src/input/__demos__/floating-hint.vue ```vue ``` ## 输入内容与布局 ### 数字统计 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ----------------- | ---------------------------------------------------------- | ---------------------------------- | | `placeholder` | 提示文字 | 数字统计、前缀、后缀、输入框组合 | | `clearable` | 是否允许清空输入框 | 数字统计、前缀、后缀、组合状态继承 | | `max-length` | 输入值的最大长度 | 数字统计 | | `show-word-limit` | 是否显示字数统计 | 数字统计 | | `default-value` | 非受控初始值,仅创建时读取;后续修改不重置输入,不回写父级 | 组合状态继承 | | `disabled` | 是否禁用,可继承 Form | 组合状态继承 | 设置 max-length 可以限制最大字数,配合 show-word-limit 可以显示字数统计。 超出长度时会截断,并通过 `update:model-value` 与 `input` 传出截断后的值。清空按 `clear → input → update:model-value → change` 通知,随后失焦不会补发 `change`。 Example source: src/input/__demos__/word-limit.vue ```vue ``` ### 密码输入框 用于输入密码。 Example source: src/input/__demos__/password.vue ```vue ``` ### 前缀、后缀 通过指定 prefix 和 suffix 插槽来在输入框内添加前缀和后缀。 Example source: src/input/__demos__/prefix.vue ```vue ``` ### 输入框组合 通过 input-group 可以组合使用输入框。 Example source: src/input/__demos__/group.vue ```vue ``` ### 组合状态继承 `InputGroup` 统一传递 `size / variant / disabled / readonly / hint`;子项显式设置的值(包括 `false`)优先。`InputPassword` 和清除按钮同样遵循继承后的状态。 Example source: src/input/__demos__/group-state.vue ```vue ``` ## 值模型与交互 ### 默认值与双向绑定 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | ---------------------------------------------------------- | ---------------------------------- | | `clearable` | 是否允许清空输入框 | 主体与事件契约、清空按钮与手动删空 | | `default-value` | 非受控初始值,仅创建时读取;后续修改不重置输入,不回写父级 | 默认值与双向绑定 | | `aria-label` | 原生输入框的无障碍标签 | 默认值与双向绑定 | | `disabled` | 是否禁用,可继承 Form | 交互状态对比 | | `readonly` | 是否只读,可继承 Form | 交互状态对比 | | `error` | 是否为错误状态,可继承 FormItem | 交互状态对比 | `modelValue` 是受控值,通过普通 `v-model` 绑定;父级提供的值优先,包括空字符串。`defaultValue` 是非受控初始值,仅在组件创建时读取;之后由组件内部保存用户输入。修改 `defaultValue` 不会重置现有文字,重新挂载才会重新读取,也不会在初始化时触发 `update:modelValue` 或写入父级表单。 需要表单默认值时,直接初始化绑定字段,例如 `const text = ref('北京')`,然后使用 ``。 Example source: src/input/__demos__/default-value.vue ```vue ``` ### 清空按钮与手动删空 将清空输出设为 null。先点击清空图标,观察模型为 null;恢复初值后用 Backspace 删光,观察模型为空字符串。普通输入不会自动套用 empty-value。 Example source: src/input/__demos__/empty-value.vue ```vue ``` ### 交互状态对比 在同一实例上切换禁用、只读和错误状态后再操作控件,比较可编辑性和交互反馈。恢复开关位于目标控件外;错误外观本身不会执行校验。
配置说明与使用限制 #### 状态 输入框可以设置禁用和错误状态。 #### 交互状态切换 适用于表单中的单行文本输入。调整禁用、只读、错误反馈,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。
Example source: src/input/__demos__/state-lab.vue ```vue ``` ### 主体与事件契约 两端维护独立复制的主体。输入按 input → update:modelValue 通知;清空按 clear → input → update:modelValue → change 通知,各一次,Form 对应语义也各接收一次。只读、禁用和组合输入期间禁止清空。受控提议被拒绝后恢复原生内容,包括不支持光标 API 的输入类型。 Example source: src/input/__demos__/event-pipeline.vue ```vue ``` ### 提交前确认 字段提交也支持 `beforeCommit({ value, previousValue }, done, context)`:保留第二个 context 参数,第三个 done 可决定允许或拒绝;Promise 和 boolean 写法继续支持。声明 done 的回调必须调用完成函数,或返回 boolean/Promise。 守卫统一使用 `(payload, done, context)`:关闭 payload 为 `{ action }`,切换和提交为 `{ value, previousValue }`,Popup 为 `{ reason }`。context 提供 `signal` 和可选原始 `event`。返回 boolean/Promise,或调用 done()/done(false);同步 void 等待 done,Promise<void> 放行。首次完成生效。等待期间自动管理 loading/disabled,取消后旧结果失效,不暴露内部按钮 refs。 Example source: src/input/__demos__/commit-protocol.vue ```vue ``` ### 共享字段加载 `loading` 控制共享字段加载状态;`loading-mode` 为 `default`(指示器)或 `line`(底部不定进度线),默认 `default`。渲染统一由 FieldDecorator 负责,不隐式改变 disabled/readonly;需要禁止编辑时单独设置。 ## 加载与等待 ### 加载状态 切换加载状态,对比默认指示器与底部加载线。加载期间仍可编辑输入;是否禁止编辑由 disabled / readonly 单独控制。 Example source: src/input/__demos__/loading.vue ```vue ``` ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------------------------- | ---------------------------------------------------------- | --------------------------------------------------- | :---------: | | model-value **(v-model)** | 绑定值 | `string \| null` | `-` | | `loading` | 加载展示;不隐式禁用输入 | `boolean` | `false` | | `loading-mode` | 加载布局:默认指示器或底部加载线 | `default / line` | `default` | | model-modifiers | `v-model` 修饰符,支持 `trim` | `{ trim?: boolean }` | `{}` | | default-value | 非受控初始值,仅创建时读取;后续修改不重置输入,不回写父级 | `string` | `''` | | variant | 输入框变体 | `'filled' \| 'outline' \| 'standard'` | `'outline'` | | size | 输入框大小 | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | | clearable | 是否允许清空输入框 | `boolean` | `false` | | empty-value | 清空输出;省略时清空返回空字符串,不影响手动删除 | `string \| null \| (() => string \| null)` | `undefined` | | disabled | 是否禁用,可继承 Form | `boolean` | `-` | | readonly | 是否只读,可继承 Form | `boolean` | `-` | | error | 是否为错误状态,可继承 FormItem | `boolean` | `-` | | placeholder | 提示文字 | `string` | `-` | | hint | 提示文字是否浮起 | `boolean` | `false` | | line | 是否绘制边框或底线 | `boolean` | `true` | | text-color | 输入文字颜色 | `string` | `-` | | focus-color | 聚焦提示及支持的边框通道;不控制 caret | `string` | `-` | | blur-color | 未聚焦时提示颜色 | `string` | `-` | | aria-label | 原生输入框的无障碍标签 | `string` | `-` | | autofocus | 是否自动聚焦 | `boolean` | `false` | | enterkeyhint | 移动端虚拟键盘回车键提示 | `string` | `-` | | max-length | 输入值的最大长度 | `number \| { length: number; errorOnly?: boolean }` | `0` | | show-word-limit | 是否显示字数统计 | `boolean` | `false` | | word-length | 字符长度的计算方法 | `(value: string) => number` | `-` | | word-slice | 字符截取方法,同 wordLength 一起使用 | `(value: string, maxLength: number) => string` | `-` | | input-attrs | 内部 input 元素的属性 | `object` | `-` | `disabled / readonly / size` 按子项 → InputGroup → FormItem/Form → 库默认值继承;Cedar 的尺寸还支持 ConfigProvider。`clearable` 只对非空且可编辑的输入生效:PC 在悬浮或焦点进入时显示,触控设备与 Maple 常驻显示。原生 `name / id / aria-* / data-*` 会透传给 input;`class / style` 留在外壳,`input-attrs` 不能覆盖受控值、类型、禁用、只读和长度策略。 ### `` Events | 事件名 | 描述 | 参数 | | ----------- | -------------------------- | ------------------------------ | | input | 用户输入时触发 | value: `string`
ev: `Event` | | change | 失焦、回车提交或清空时触发 | value: `string`
ev: `Event` | | press-enter | 用户按下回车时触发 | ev: `KeyboardEvent` | | clear | 用户点击清除按钮时触发 | ev: `MouseEvent` | | focus | 输入框获取焦点时触发 | ev: `FocusEvent` | | blur | 输入框失去焦点时触发 | ev: `FocusEvent` | ### `` Methods | 方法名 | 描述 | 参数 | 返回值 | | ------ | ---------------- | ---- | ------ | | focus | 使输入框获取焦点 | - | - | | blur | 使输入框失去焦点 | - | - | | select | 选中输入内容 | - | - | ### `` Slots | 插槽名 | 描述 | 参数 | | ---------- | :------------: | ---------------------- | | suffix | 后缀元素 | - | | prefix | 前缀元素 | - | | clear-icon | 自定义清除按钮 | `clear(event?: Event)` | ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------------------ | --------------------------------------- | --------- | :-----: | | visibility-toggle | 是否显示密码可见性按钮 | `boolean` | `true` | | default-visibility | 默认是否可见,非受控 | `boolean` | `false` | | visibility | 受控密码可见性,支持 v-model:visibility | `boolean` | `-` | InputPassword 支持所有 Input 属性、事件、插槽与方法。 ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | -------- | ------------ | ------------------------------- | -------------------------------- | | size | 组内默认尺寸 | `ComponentSize` | 继承 Form/ConfigProvider 或 `md` | | variant | 组内默认变体 | `filled \| outline \| standard` | `filled` | | disabled | 组内禁用状态 | `boolean` | 继承 Form 或 `false` | | readonly | 组内只读状态 | `boolean` | 继承 Form 或 `false` | | hint | 组内浮动提示 | `boolean` | 库默认值 | ### `` Events | 参数名 | 描述 | 参数 | | ----------------- | -------------------- | ----------------- | | visibility-change | visibility改变时触发 | `visible:boolean` | ## 类型定义 组件导出以下类型定义 ```ts import type { InputProps } from "@cedar-design/ui"; ``` 公开类型 / Public types: `InputEmits`, `InputSlots`, `InputExpose`, `InputGroupSlots`, `InputPasswordEmits`, `InputPasswordSlots`, `InputPasswordExpose`. ### 表单展示继承 支持 `edit-mode`:`direct / click / dblclick`。未设置时继承 FormItem/Form,独立使用时默认 direct;readPretty 以纯文本阅读,编辑浮层默认确认后更新 v-model。可选 before-commit 在候选校验通过后拦截保存。使用方式与对比 Demo 统一见 Form 文档。 ### 输入光标主题 | CSS 变量 | 默认值 | 说明 | | ----------------------- | -------------- | -------------------------------- | | `--c-input-caret-color` | `currentColor` | 输入光标颜色,可独立于文字色覆盖 | 统一光标色通过 `--c-field-caret-color` 设置(默认 `currentColor`);本组件可用 `--c-input-caret-color` 单独覆盖,默认 `var(--c-field-caret-color)`。 --- Document: llms/zh-CN/components/layout.md # Layout 页面的基础布局框架,常与组件嵌套使用,构建页面整体布局。 ## 基础示例 ### 基本用法 典型的页面布局 Example source: src/layout/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 固定头尾与独立滚动 设置容器高度,对内容区域开启 `scrollable`。`scrollTo` 支持坐标和原生滚动选项。 Example source: src/layout/__demos__/scroll.vue ```vue ``` ### 侧栏位置与折叠模式 `placement` 自动调整侧栏位置和箭头方向。`width` 模式改变内容可用宽度,`transform` 模式保留内容宽度。零宽度折叠时仍保留展开按钮,内部内容不可聚焦。 Example source: src/layout/__demos__/sider-options.vue ```vue ``` ## 内容与展示 ### 可伸缩侧边栏 可以用鼠标进行拖拽放大缩小的侧边栏,需要用到的参数:resize-directions。 Example source: src/layout/__demos__/resize.vue ```vue ``` ### 侧栏折叠 通过 `v-model:collapsed` 控制折叠,也可以使用 `default-collapsed` 设置非受控初始状态。 Example source: src/layout/__demos__/collapse.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。内容继承阅读方向。Sider 的 placement=left/right 保持物理侧,折叠和 ResizeBox 的物理手柄语义不反转;标题与内容本身可使用局部 dir。 ## API ### Layout Props | 参数名 | 描述 | 类型 | 默认值 | | --------- | ------------------------------------------------------------------ | ------- | :----: | | scrollable | 是否在自身启用原生滚动(需要约束高度) | boolean | false | | has-sider | 表示子元素里有 Sider,一般不用指定。可用于服务端渲染时避免样式闪动 | boolean | false | ### Layout-Header Slots | 插槽名 | 描述 | 参数 | | ------- | :--: | ---- | | default | 内容 | - | ### Layout-content Slots | 插槽名 | 描述 | 参数 | | ------- | :--: | ---- | | default | 内容 | - | ### Layout-Footer Slots | 插槽名 | 描述 | 参数 | | ------- | :--: | ---- | | default | 内容 | - | ### Layout-Sider Props | 参数名 | 描述 | 类型 | 默认值 | | ----------------- | ---------------------------------------------------------------------------------------------------- | --------------------------------------------- | :-----: | | theme | 主题颜色 | 'dark' \| 'light' | 'light' | | collapsed | 当前收起状态 | boolean | - | | default-collapsed | 默认的收起状态 | boolean | false | | collapsible | 是否可收起 | boolean | false | | width | 宽度 | number \| string | 200 | | collapsed-width | 收缩宽度 | number | 48 | | reverse-arrow | 翻转折叠提示箭头的方向,当 Sider 在右边时可以使用 | boolean | false | | breakpoint | 触发响应式布局的断点, 详见响应式栅格 | 'xxl' \| 'xl' \| 'lg' \| 'md' \| 'sm' \| 'xs' | - | | resize-directions | 可以用 ResizeBox 替换原生的 aside 标签,这个参数即 ResizeBox的 directions 参数。详情请看 ResizeBox。 | Array<'left' \| 'right' \| 'top' \| 'bottom'> | - | | hide-trigger | 隐藏底部折叠触发器 | boolean | false | ### Layout-Sider Events | 事件名 | 描述 | 参数 | | ---------- | ---------------------------------------------------------------- | -------------------------------------------------------- | | collapse | 展开-收起时的事件,有点击 trigger 以及响应式反馈两种方式可以触发 | collapsed: boolean
type: 'clickTrigger'\|'responsive' | | breakpoint | 触发响应式布局断点时的事件 | collapsed: boolean | ### Layout-Sider Slots | 插槽名 | 描述 | 参数 | | ------- | :------------------: | ------------------ | | trigger | 自定义底部折叠触发器 | collapsed: boolean | ## 类型定义 组件导出以下类型定义 ```ts import type { LayoutProps } from '@cedar-design/ui' ``` ### 新增布局能力 | 组件 | 属性 | 类型 | 默认值 | 说明 | | --- | --- | --- | --- | --- | | Content | scrollable | boolean | false | 自身作为原生滚动容器 | | Header / Footer / Sider | bordered | boolean | false | 显示与内容相邻的边框 | | Sider | placement | 'left' / 'right' | 'left' | 侧栏所在方向,自动处理箭头;reverse-arrow 仍兼容 | | Sider | collapse-mode | 'width' / 'transform' | 'width' | 折叠时改变内容宽度或移动内容 | Layout、Content、Sider 均提供 `scroll` 事件(参数为原生 Event)及 `scrollTo(options: ScrollToOptions)` / `scrollTo(x: number, y: number)` 方法。Sider 默认在内部内容节点滚动。`width` 支持数字像素或 CSS 长度字符串;百分比宽度与 transform 模式组合不推荐,建议用 px/rem 等确定长度。 折叠按钮使用原生 button,支持 Tab、Enter 和空格;`collapsed-width="0"` 时隐藏区域设为 inert,展开入口保留在侧栏边缘。自定义 trigger 插槽应使用展示内容,避免嵌套按钮。 --- Document: llms/zh-CN/components/link.md # Link 链接的基本样式。 ## 基础示例 ### 基础用法 链接的基本用法。 Example source: src/link/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 链接尺寸与语义颜色 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `status` | 链接的状态 | 链接尺寸与语义颜色、链接模式、下划线 | | `href` | 链接地址 | 链接模式、悬浮态底色 | | `size` | 文字、图标和加载图标尺寸 | 链接尺寸与语义颜色 | | `icon` | 图标 | 链接尺寸与语义颜色 | | `loading` | 链接是否为加载中状态 | 链接尺寸与语义颜色 | | `target` | 原生链接打开目标 | 链接模式 | 比较尺寸和语义颜色;导航目标、禁用拦截和加载反馈保留独立行为示例。
配置说明与使用限制 #### 五种尺寸 通过 `size` 设置五档尺寸,文字、图标和加载图标同步缩放,默认 `md`。 #### 链接状态 链接使用统一语义状态,例如 `default`(默认)、`success`、`warning` 和 `danger`。
Example source: src/link/__demos__/appearance-comparison.vue ```vue ``` ### 链接模式 设置 `href` 后渲染为可导航链接;使用 `target="_blank"` 时建议同时设置 `rel="noopener noreferrer"`。 Example source: src/link/__demos__/link-mode.vue ```vue ``` ### 下划线 通过 `underline` 设置下划线的显示策略。 Example source: src/link/__demos__/link-underline.vue ```vue ``` ### 禁用状态 禁用状态下不会触发导航或点击事件。 Example source: src/link/__demos__/link-disabled.vue ```vue ``` ### 悬浮态底色 两端均支持 `hoverable`(默认 `false`):开启后增加内边距与悬浮/按下底色,不影响下划线策略。键盘聚焦使用 `:focus-visible` 显示焦点轮廓,无需开启 hoverable。 Example source: src/link/__demos__/hoverable.vue ```vue ``` 两端 Link 主体、Props、主样式和测试采用独立同源复制;仅组件前缀、本地图标与主题 token 适配不同,不共享核心或实例。 禁用或加载时移除 href/target/rel,禁止导航和 click,并退出 Tab 顺序(即使传入 tabindex)。普通状态原样透传原生属性。加载图标优先于 icon 插槽;动态图标插槽会随渲染更新。 ## 内容与展示 ### 图标 通过 `icon` 设置带图标的链接,设置为 `true` 时候显示默认图标。 Example source: src/link/__demos__/link-icon.vue ```vue ``` ## 交互与控制 ### 加载中状态 通过设置 `loading` 可以让链接处于加载中状态。处于加载中状态的链接不会触发点击事件。 Example source: src/link/__demos__/link-loading.vue ```vue ``` ## API ### 原生链接与手动加载 导航请提供 href。禁用或加载时,原本有 href 的链接保留 link 角色,移除导航属性并退出 Tab 顺序。download、hreflang、referrerpolicy 和 ARIA 等原生属性直接透传。loading 优先于 icon 插槽。click 是 MouseEvent 通知事件,遵守 Vue 的 once 语义,不根据监听器返回的 Promise 管理 loading;没有导航目标的业务操作使用 Button。 加载示例首次激活时由业务准备报告,完成后再次激活交给浏览器原生下载;卸载时取消准备任务。 ### `` Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | `size` | 文字、图标与加载图标的五档尺寸 | 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' | 'md' | | `href` | 原生链接地址 | string | - | | `target` | 原生打开目标 | string | - | | `rel` | 原生链接关系 | string | - | | `status` | 链接语义状态 | SemanticStatus | 'default' | | `underline` | 下划线策略 | 'always' \| 'hover' \| 'none' | 'none' | | `hoverable` | 显示带内边距的悬浮/按下底色 | boolean | false | | `icon` | 显示默认前置图标;icon 插槽优先 | boolean | false | | `loading` | 显示加载图标并阻止导航与点击 | boolean | false | | `disabled` | 禁用链接 | boolean | false | ### `` Events | 事件名 | 说明 | 参数 | | ------ | -------------- | ----------------------------- | | click | 点击触发的事件 | `(event: MouseEvent) => void` | ### Slots | 插槽 | 说明 | | --- | --- | | default | 链接内容 | | icon | 自定义图标,loading 时被加载图标替代 | ### 类型定义 组件导出以下类型定义 ```ts import type { LinkProps, LinkSize, LinkUnderline, LinkInstance } from '@cedar-design/ui' ``` ### 样式迁移 内部类名统一为 `c-link--status-*`、`c-link--underline-*`、`c-link--disabled`、`c-link--loading` 和 `c-link__icon`。请迁移旧的单连字符选择器,优先通过 `--c-link-*` CSS 变量定制。焦点支持 `--c-link-focus-width`(2px)、`--c-link-focus-offset`(2px)、`--c-link-focus-color`(currentColor)、`--c-link-focus-opacity`(0.8)。减少动态效果偏好下关闭加载旋转和过渡。 文字配色与 Button 的 text 变体一致:default 使用 content-primary,secondary / tertiary 使用 content-secondary,彩色状态使用对应 content 语义色,禁用和加载使用 content-disabled。两品牌明暗模式均继承这些规则。 尺寸变量:`--c-link-size-xs-font-size`, `--c-link-size-sm-font-size`, `--c-link-size-md-font-size`, `--c-link-size-lg-font-size`, `--c-link-size-xl-font-size`。默认分别为 12 / 13 / 14 / 16 / 18px;md 引用原有 `--c-link-font-size`,图标和加载图标使用 1em。 --- Document: llms/zh-CN/components/list.md # List 最基础的列表展示,可承载文字、列表、图片、段落,常用于后台数据展示页面。 ## 基础示例 ### 基础用法 列表的基本使用方法。可用于承载文字、列表、图片和段落。 Example source: src/list/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 不同尺寸 列表组件提供了三种大小 `sm, md, lg` ,可根据业务需求自行选择。 Example source: src/list/__demos__/size.vue ```vue ``` ## 内容与布局 ### 前缀与后缀 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `bordered` | 外边框 | 自定义内容 | | `data` | 数据,与 item 插槽配合 | 自定义内容 | `list-item` 只提供 `prefix` / 默认内容 / `suffix` 三列布局。头像、标题、操作都由业务自己组合。 Example source: src/list/__demos__/prefix-suffix.vue ```vue ``` ### 自定义内容 主体和两侧插槽都可以放任意内容。分页、栅格请自行组合 `Pagination` / `Grid`。 Example source: src/list/__demos__/actions-layout.vue ```vue ``` 同时提供默认插槽与 `data` 时,默认插槽优先,`item` 插槽不会被调用。`loading` 仅表示整张列表首次加载或刷新;需要滚动分页时请使用 [InfiniteScroll](llms/zh-CN/components/infinite-scroll.md) 组合。 ## 滚动与虚拟列表 ### 容器滚动 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `data` | 数据,与 item 插槽配合 | 容器滚动、无限长列表、虚拟定位 | | `virtual-list-props` | 数据模式虚拟化;default插槽存在时忽略 | 无限长列表、虚拟定位 | | `max-height` | 普通列表最大高度;数字px/CSS长度,0不限 | 容器滚动 | | `scrollbar` | 普通列表自定义滚动条;false使用原生滚动 | 容器滚动 | | `size` | 仅实现 sm/md/lg,不支持 xs/xl | 容器滚动 | | `split` | 头尾及列表项分隔线,与边框独立 | 容器滚动 | Example source: src/list/__demos__/bounded-scroll.vue ```vue ``` ### 无限长列表 通过指定 `virtualListProps` 来开启虚拟列表,在大量数据时获得高性能表现。 在使用虚拟列表时,如果列表元素之间高度变化较大可能导致滚动时视口出现空白区域,可通过调整 `virtualListProps.buffer` 属性解决,[使用方式](vue/docs/faq#%E8%99%9A%E6%8B%9F%E5%88%97%E8%A1%A8%E7%9A%84%E4%BD%BF%E7%94%A8)。 Example source: src/list/__demos__/virtual-list.vue ```vue ``` ### 虚拟定位 示例使用 `Space direction="column"` 将操作区放在列表上方,列表独占可用宽度;`estimatedSize` 是未测量行的估计高度,不要求业务行采用固定高度。 定位优先使用已渲染行的真实边界,行高测量会同步更新虚拟留白。程序滚动触发的渲染保留当前对齐;不同位置的原生滚动、新命令、数据替换、停用或卸载会取消旧补偿。`auto` 对已完整可见行不改变滚动位置和渲染窗口;这不代表持续追踪任意异步行高变化。 Example source: src/list/__demos__/virtual-navigation.vue ```vue ``` ## 生命周期 ### 保留命令与 KeepAlive 生命周期 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `data` | 数据,与 item 插槽配合 | 保留命令与 KeepAlive 生命周期 | | `virtual-list-props` | 数据模式虚拟化;default插槽存在时忽略 | 保留命令与 KeepAlive 生命周期 | Example source: src/list/__demos__/virtual-lifecycle.vue ```vue ``` ## API ### List Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | data | 数据,与 item 插槽配合 | unknown[] | undefined | | size | 仅实现 sm/md/lg,不支持 xs/xl | 'sm' \| 'md' \| 'lg' | md | | bordered | 外边框 | boolean | true | | split | 头尾及列表项分隔线,与边框独立 | boolean | true | | loading | 首次加载/刷新反馈,不管理分页 | boolean | false | | max-height | 普通列表最大高度;数字px/CSS长度,0不限 | number \| string | 0 | | virtual-list-props | 数据模式虚拟化;default插槽存在时忽略 | ListVirtualListProps | undefined | | scrollbar | 普通列表自定义滚动条;false使用原生滚动 | boolean \| ListScrollbarProps | true | 虚拟列表使用独立视口,不额外嵌套自定义滚动条。virtualListProps.height 优先于 maxHeight;均省略时虚拟视口默认 200px。数字/带单位CSS长度受支持,非法或非正 max-height 不限制高度。 ListVirtualListProps 支持 height、threshold、fixedSize、estimatedSize、buffer、itemKey、component。没有废弃的 isStaticItemHeight;data 统一由 List.data 提供。数据量小于或等于 threshold 时渲染全部;非固定高度使用测量值与 estimatedSize 估计,buffer 控制前后预渲染行数。 ListScrollbarProps 支持 type: 'track'|'embed'、outerClass、outerStyle、hide、disableHorizontal、disableVertical。属性作为 JavaScript 对象字段使用 camelCase。 ### Events / Methods - scroll(event: Event):真实滚动事件,一次滚动通知一次。 - scrollIntoView({ index?, key?, align }):虚拟列表定位,index 优先;align 为 top/bottom/auto。auto 在项目已完整可见时不滚动,否则最小滚动使其可见。无效目标、非虚拟模式不操作。 ### Slots List:default(优先于data)、item({ item, index })、header、footer、empty。空态仅无默认插槽、无数据、非加载时渲染。ListItem:prefix、default、suffix,保持列表项语义,不管理按钮/业务交互。 ### 类型 ListProps、ListSize、ListVirtualListProps、ListScrollbarProps、ListExpose、ListSlots、ListEmits、ListInstance、ListItemInstance。 List 与 InfiniteScroll 分工独立:List管理展示与可选虚拟视口;无限分页应组合 InfiniteScroll 的 status/target 交互,不在 List 中重复维护加载状态机。 ## 样式变量 | Token | Default | | --- | --- | | `--c-list-background` | `transparent` | | `--c-list-empty-padding` | `16px` | | `--c-list-empty-color` | `var(--c-list-text-color)` | | `--c-list-loading-padding` | `0px` | | `--c-list-border-width` | `1px` | | `--c-list-border-color` | `var(--c-color-neutral-3)` | | `--c-list-border-radius` | `var(--c-border-radius-md)` | | `--c-list-text-color` | `var(--c-color-text-1)` | | `--c-list-font-size` | `var(--c-font-size-body-3)` | | `--c-list-line-height` | `var(--c-line-height)` | | `--c-list-text-color-header` | `var(--c-color-text-1)` | | `--c-list-font-size-header` | `var(--c-font-size-title-1)` | | `--c-list-font-weight-header` | `var(--c-font-weight-500)` | | `--c-list-line-height-header` | `1.5` | | `--c-list-size-sm-padding-vertical-header` | `var(--c-spacing-4)` | | `--c-list-size-sm-padding-horizontal-header` | `var(--c-spacing-8)` | | `--c-list-size-sm-padding-vertical-item` | `9px` | | `--c-list-size-sm-padding-horizontal-item` | `var(--c-spacing-8)` | | `--c-list-size-md-padding-vertical-header` | `var(--c-spacing-6)` | | `--c-list-size-md-padding-horizontal-header` | `var(--c-spacing-8)` | | `--c-list-size-md-padding-vertical-item` | `13px` | | `--c-list-size-md-padding-horizontal-item` | `var(--c-spacing-8)` | | `--c-list-size-lg-padding-vertical-header` | `var(--c-spacing-7)` | | `--c-list-size-lg-padding-horizontal-header` | `var(--c-spacing-8)` | | `--c-list-size-lg-padding-vertical-item` | `17px` | | `--c-list-size-lg-padding-horizontal-item` | `var(--c-spacing-8)` | | `--c-list-item-prefix-margin-right` | `var(--c-spacing-8)` | | `--c-list-item-suffix-margin-left` | `var(--c-spacing-8)` | | `--c-list-size-sm-padding-vertical-footer` | `var(--c-list-size-sm-padding-vertical-item)` | | `--c-list-size-sm-padding-horizontal-footer` | `var(--c-list-size-sm-padding-horizontal-item)` | | `--c-list-size-md-padding-vertical-footer` | `var(--c-list-size-md-padding-vertical-item)` | | `--c-list-size-md-padding-horizontal-footer` | `var(--c-list-size-md-padding-horizontal-item)` | | `--c-list-size-lg-padding-vertical-footer` | `var(--c-list-size-lg-padding-vertical-item)` | | `--c-list-size-lg-padding-horizontal-footer` | `var(--c-list-size-lg-padding-horizontal-item)` | --- Document: llms/zh-CN/components/loading.md # Loading 用于页面、区块或容器的加载中状态。 ## 基础示例 ### 基础用法 显示加载指示器与提示文字。包裹内容和指令用法见后续示例。 Example source: src/loading/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 加载图形、尺寸与颜色 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `size` | 加载指示器的尺寸;数字表示 px | 加载图形、尺寸与颜色 | | `type` | 加载动画类型 | 加载图形、尺寸与颜色 | | `color` | 加载指示器和提示文案的颜色 | 加载图形、尺寸与颜色 | 对比相同加载状态的图形、尺寸和颜色;容器遮罩与指令用法保持独立。 Example source: src/loading/__demos__/appearance-comparison.vue ```vue ``` ## 布局与排列 ### 包裹内容 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `tip` | 提示文案 | 包裹内容 | | `loading` | 是否为加载中状态(仅在包裹内容时生效) | 包裹内容 | Example source: src/loading/__demos__/wrap.vue ```vue ``` ## 内容与展示 ### 加载指令 两种指令示例分别维护加载状态,控件与宿主卡片通过 `Space direction="column"` 纵向排列;关闭一个不会影响另一个遮罩。 Example source: src/loading/__demos__/directive.vue ```vue ``` ## API ### `` Props | 属性 | 说明 | 类型 | 默认值 | | --------- | -------------------------------------- | --------------------------------------------- | -------- | | type | 加载动画类型 | `circle \| wave \| cube \| rect \| disappear` | `circle` | | size | 加载指示器的尺寸;数字表示 px | `xs \| sm \| md \| lg \| xl \| number` | `md` | | radius | `circle` 类型的半径 | `string \| number` | - | | color | 加载指示器和提示文案的颜色 | `string` | - | | loading | 是否为加载中状态(仅在包裹内容时生效) | `boolean` | `false` | | tip | 提示文案 | `string` | - | | hide-icon | 是否隐藏加载指示器 | `boolean` | `false` | `v-c-loading` 支持布尔值简写,也支持 `{ loading, tip, type, size, radius, color, hideIcon, fullscreen, background }` 配置对象。对象形式中的 `loading` 控制加载状态,其余组件属性与 `Loading` 保持一致。 #### 注册方式 `v-c-loading` 使用 Cedar 内置的 `Loading` 组件渲染指示器。`c-` 前缀可以避免与其他组件库的同名指令冲突,使用前可通过以下任一方式注册。 ```ts // 1. 全量安装:自动注册 Loading 组件和 v-c-loading 指令 import CedarVue from "@cedar-design/ui"; app.use(CedarVue); ``` ```ts // 2. 按需安装 Loading:同时注册组件和指令 import { Loading } from "@cedar-design/ui"; app.use(Loading); ``` ```ts // 3. 只手动注册指令 import { vLoading } from "@cedar-design/ui"; app.directive("c-loading", vLoading); ``` 使用 `CedarResolver()` 时,`unplugin-vue-components` 会自动解析模板中的 `v-c-loading`;`directives: false` 会关闭指令自动解析。 ### `` Slots | 插槽名 | 说明 | | ------- | ---------------------- | | default | 需要展示加载遮罩的内容 | | tip | 自定义提示内容 | | icon | 自定义加载指示器 | `icon` 插槽替换全部内置 `type` 动画;未提供时使用 ConfigProvider 的 `loading` 插槽,再回退到内置动画。`hide-icon=true` 隐藏所有指示器,提示内容仍可显示。 ## 类型定义 组件导出以下类型定义: ```ts import type { LoadingProps } from "@cedar-design/ui"; ``` 加载指令的遮罩会阻止点击默认行为和冒泡,点击遮罩不会触发 Card 或父级的普通 `@click`;关闭加载后恢复正常点击。遮罩不会禁用底层控件的键盘操作,如需完全禁止操作,请同时设置控件的 `disabled`。 ### 覆盖层样式 | 变量 | 说明 | | --- | --- | | `--c-loading-overlay-background` | 指令覆盖层背景色;background 选项可覆盖该值。 | 内容覆盖层类名:`.c-loading__content-overlay`。 指令每次更新都替换完整配置,省略的选项以及布尔值 `true` 使用默认值。加载中修改 `fullscreen` 会在宿主与所属文档的 body 之间迁移遮罩,宿主内容保持原位。多个全屏实例按数量持有滚动锁:关闭局部实例不会解除全屏锁,最后一个全屏实例结束时保留外部原有的锁类。 --- Document: llms/zh-CN/components/map.md # Map ## 基础示例 ### 基础用法 无需登录或配置密钥即可运行。点击按钮更新本地位置模型;未接入 SDK 时显示降级提示并禁用搜索,不请求定位权限。真实地图的选点与搜索需要应用接入 SDK 适配器后再验收。 Example source: src/map/__demos__/basic.vue ```vue ``` ## 内容与展示 ### 特殊说明 地图SDK正在迁移:当前源码未提供原map-core运行时导入;MapService、SearchService、LngLat的类型声明不等于可用依赖,缺任一依赖时初始化会进入降级显示,不代表真实地图初始化成功。恢复正式适配器/第三方生命周期契约前,不将降级渲染测试当地图服务验收。 内部300ms中心更新和500ms选点等待用于抑制程序化moveend反向解析,不是CSS动画完成时长或公开CSS变量;不应通过覆盖视觉duration Token控制它们。真实SDK下的计时取消、停用/卸载、旧回调/异步结果及监听释放尚待独立验证;MapSelect地址回填和定位也不由缺SDK测试覆盖。 Example source: src/map/__demos__/auth.vue ```vue ``` ## 数据与选项 ### 国际地图配置 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `map-type` | 要显示的地图类型。 | 国际地图配置 | | `is-international` | 指示地图是否为谷歌地图。 | 国际地图配置 | 通过 `map-type="google"` 和 `is-international` 配置国际地图;未接入 SDK 时保留同样的降级展示。 Example source: src/map/__demos__/google.vue ```vue ``` [//]: # '### v-model' [//]: # '使用v-model语法,会自动更新值,并且不会丢失类型' [//]: # 'Example source: src/map/__demos__/use-vmodel.vue ```vue ```' ## API ### Map Props | 属性 | 说明 | 类型 | 默认值 | | ----------------------- | -------------------------------------------- | -------------------------------------------- | ---------------- | | model-value(**v-model**) | 地图的初始值,表示所选位置的信息。 | `Object` | - | | default-value | 用来设置默认地图中心点 | `{ [key in valueKeyAlias[keys]]: any }` | - | | driver | `Fetch.genDriiver`的返回值 | `Driver` | `-` | | fetch | `Fetch.genFetch`的返回值 | `CoreService` | `-` | | geocoder-url | geocoderUrl接口路径 | `string` | `-` | | geocoder-handler | 用于处理地图编码服务的响应。 | `(longitude: number, latitude: number)=>{})` | - | | base-path | 地图的基础路径,配置获取地图数据的基础 URL。 | `String` | `'/pe/powerpro'` | | is-international | 指示地图是否为谷歌地图。 | `Boolean` | - | | show-name | 是否展示悬浮框名称 | `boolean` | `false` | | show-locate-me-button | 是否展示定位到当前位置按钮 | `boolean` | `false` | | show-edit-address-button | 是否展示修改地点悬浮按钮 | `boolean` | `false` | | show-map-tips | 是否展示地图上方tips | `boolean` | `false` | | map-type | 要显示的地图类型。 | `'qqmaps'\|'bmapGL'\|'amaps'` | `'amaps'` | | enable-gis-search | 是否启用gis搜索(**开启时`fetch`为必传**) | `boolean` | `false` | | value-key-scope | 一个字符串数组,表示要在地图上显示的值列表。 | `Array` | `valueKeyScope` | | value-key-alias | 一个对象,表示地图键到值的映射关系。 | `Object` | `valueKeyAlias` | ### MapSelect Props | map-style | 直接设置到地图上面的style,可以设置地图的高度。 | `object` | `{ height: '300px'}` | ### Map Events | 事件名 | 说明 | 参数 | | --------------- | -------------------------- | ------------------------- | | change | 当地址发生变化时触发 | `(value: ModelValueType)` | | init | 初始化地图完成时触发 | `(value: ModelValueType)` | | loading:address | 选择地点,地址解析中触发 | `-` | | loaded:address | 选择地点,地址解析完成触发 | `-` | ## 类型定义 ### valueKeyAlias ```ts { longitude: 'longitude', latitude: 'latitude', address: 'address', name: 'name', adcode: 'adcode', city: 'city', countryCode: 'countryCode', country: 'country', } ``` ### valueKeyScope ```ts ;['longitude', 'latitude', 'address', 'name', 'adcode', 'city', 'country', 'countryCode'] ``` ### ModelValueType ModelValueType里面的key取决于valueKeyAlias ```ts interface ModelValueType { adcode?: string city?: string country?: string countryCode?: string address?: string latitude?: number longitude?: number name?: string } ``` 组件导出以下类型定义 ```ts import type { MapProps } from '@cedar-design/ui' ``` --- Document: llms/zh-CN/components/mention.md # Mention 用于在输入中提及某人或某事,常用于发布、聊天或评论功能。 ## 基础示例 ### 基础用法 用于在输入中提及某人或某事,常用于发布、聊天或评论功能。 Example source: src/mention/__demos__/basic.vue ```vue ``` ## 自定义与插槽 ### 自定义触发字符 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | -------- | -------------------- | -------------- | | `data` | 用于自动补全的数据 | 自定义触发字符 | | `prefix` | 触发自动补全的关键字 | 自定义触发字符 | 指定 `prefix` 来自定义触发字符。默认为 `@`,可以自定义为任意字符。 Example source: src/mention/__demos__/prefix.vue ```vue ``` ## 生命周期与边界 ### 镜像重定位生命周期 Example source: src/mention/__demos__/mirror-lifecycle.vue ```vue ``` 样式从当前 textarea 所属窗口读取,旧观察器不能跨停用/激活提交;几何及样式读取返回后再次核对,防止重入卸载。停用/卸载的保留输入、弹层事件和 focus/blur 命令无效;禁用时不接受输入或 focus,活动实例仍允许 blur。公开方法签名、颜色和 CSS 变量不变。Maple 无对应 Mention 运行时,不新增移动端副本。 ## 加载与等待 ### 受控加载 | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | `loading` | 业务显式控制的加载状态 | `boolean` | `false` | 通过 loading 显式展示等待;普通事件返回值不参与加载。before-* 守卫按其契约管理内部等待状态。 Example source: src/mention/__demos__/loading.vue ```vue ``` ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### `` Props | 参数名 | 描述 | 类型 | 默认值 | 版本 | | ------------------------- | -------------------- | ---------------------------------------------------------------------------------------------------------- | :---------: | :----- | | model-value **(v-model)** | 绑定值 | `string` | `-` | | | default-value | 默认值(非受控状态) | `string` | `''` | | | data | 用于自动补全的数据 | `(string \| number \| SelectOptionData \| SelectOptionGroup)[]` / `(query, { signal }) => Array / Promise` | `undefined` | | | prefix | 触发自动补全的关键字 | `string \| string[]` | `'@'` | | | split | 选中项的前后分隔符 | `string` | `' '` | | | type | 输入框或文本域 | `'input' \| 'textarea'` | `'input'` | | | disabled | 是否禁用 | `boolean` | `false` | | | clearable | 是否允许清空输入框 | `boolean` | `false` | 2.23.0 | ### `` Events | 事件名 | 描述 | 参数 | 版本 | | ------ | ------------------------------------------- | ------------------------------------------------------------- | :----- | | change | 值发生改变时触发 | value: `string` | | | search | 动态搜索时触发,2.47.0 版本增加 prefix 参数 | value: `string`
prefix: `string` | | | select | 选择下拉选项时触发 | value: `string \| number \| Record \| undefined` | | | clear | 用户点击清除按钮时触发 | - | 2.23.0 | | focus | 文本框获取焦点时触发 | ev: `FocusEvent` | 2.42.0 | | blur | 文本框失去焦点时触发 | ev: `FocusEvent` | 2.42.0 | ### `` Methods | 方法名 | 描述 | 参数 | 返回值 | 版本 | | ------ | ---------------- | ---- | ------ | :----- | | focus | 使输入框获取焦点 | - | - | 2.24.0 | | blur | 使输入框失去焦点 | - | - | 2.24.0 | ### `` Slots | 插槽名 | 描述 | 参数 | 版本 | | ------ | :------: | ------------------ | :----- | | option | 选项内容 | data: `OptionInfo` | 2.13.0 | ### 类型定义 组件导出以下类型定义 ```ts import type { MentionInstance } from "@cedar-design/ui"; ``` Mention 复用 Input/Textarea 的排版和间距,测量镜像复制原生输入框计算样式。自定义请覆盖对应输入组件变量;不再提供无效的 mention-font-size、mention-line-height 或 mention-padding-*。 ### Form 字段展示与确认 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 ## 配置清空后的值 `empty-value` 指定当前组件已有清空动作的输出;省略时采用该组件默认返回。具体类型以组件 API 为准。它不改变 empty-values 的识别规则,也不改变 Form reset 的初始值。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 候选属性 `data` 支持数组或 `(query, { signal }) => 数组/Promise`。加载、取消、过期结果隔离由组件内部处理,失败触发 load-error。单选/多选分组初始化以空字符串查询,搜索型字段在查询变化时调用;树形字段根数据与原有 load-more 子节点懒加载独立。 input 与 textarea 都显示手动 loading 和当前显式 data 加载函数的等待。等待显示不会隐式禁用编辑;search 通知返回 Promise 不启动任务。旧数据请求不会清理新请求的指示器,load-error 保留原始错误。 --- Document: llms/zh-CN/components/menu.md # Menu 菜单 用于收纳针对当前对象的临时命令,例如更多操作、右键菜单和按钮的附加操作。选择表单数据请使用 Select;选择层级数据请使用 Cascader。 --- ## 基础示例 ### 更多操作 使用默认插槽传入触发元素,通过 `options` 定义命令。菜单开启后会为触发元素添加 `c-menu-open` 类名。 Example source: src/menu/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 禁用状态 Example source: src/menu/__demos__/disabled.vue ```vue ``` ## 选项与层级 ### 分组、子菜单与选项内容 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `options` | 命令树 | 分组、子菜单与选项内容、选中与视觉强调 | | `hide-on-select` | 激活命令后关闭浮层 | 选中与视觉强调 | | `submenu-trigger` | 各级子菜单的展开方式,对所有层级统一生效 | 选中与视觉强调 | 比较平级分组、层级菜单和自定义选项内容。展开子菜单或选择选项,观察各自的数据层级;受控选中与外部定位独立展示。
配置说明与使用限制 #### 选项分组 分组标题与选项左对齐,标题行高 20px、上下各 4px 留白(总高 28px);后续分组额外间隔 8px,首组不添加组间距。 在 `options` 中使用 `{ type: 'group', children }` 分组,不需要额外的分组组件。 #### 多级菜单 带 `children` 的普通选项自动成为子菜单。所有层级的子菜单共用 `submenu-trigger`,默认悬停展开;改成 `'click'` 时同样对所有层级生效,不能逐项配置,避免同一棵菜单里出现两种展开方式。 #### 自定义选项内容 选项的 `label`、`icon`、`extra` 都支持文本、VNode 或接收 `{ option, active, level }` 的渲染函数。需要统一渲染整组数据时,使用 `option-label`、`option-icon`、`option-extra` 作用域插槽。 `active` 只表示当前选项自身是否匹配菜单的选中值。选中子项时,父分支的 `active` 仍为 `false`;后代选中及展开状态只用于组件内部的路径强调,不作为渲染参数公开。根 Menu 使用 `modelValue/defaultValue` 控制选中值、`open/defaultOpen` 控制展开。`MenuOption` 的视觉强调统一使用 `highlight`,不会改变选中值。
Example source: src/menu/__demos__/structure-comparison.vue ```vue ``` ### 选中与视觉强调 对比渲染函数、作用域插槽和手写 MenuOption。父分支可以有选中路径样式,但 active 仍为 false;highlight 也不会把选项变成选中值。 Example source: src/menu/__demos__/active-rendering.vue ```vue ``` ## 触发与定位 ### 右键菜单 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `trigger` | 根菜单触发方式 | 右键菜单、触发方式 | | `options` | 命令树 | 右键菜单、定位策略 | | `align-point` | 按触发时的鼠标坐标定位;打开后保持该位置,再次右键时更新 | 右键菜单 | | `placement` | 浮层相对触发元素的首选方位,默认 bottom;启用默认的 auto-fit-position 时,空间不足会自动翻转并约束到可视区域,不保证最终停在该侧 | 弹出方向 | | `strategy` | 根菜单及全部子菜单的定位策略 | 定位策略 | | `submenu-trigger` | 各级子菜单的展开方式,对所有层级统一生效 | 定位策略 | 在目标区域内点击鼠标右键触发,需要同时设置 `trigger="contextMenu"` 和 `align-point`。菜单固定在本次右键触发的位置,移动鼠标不会改变位置;再次右键时才更新定位点。 Example source: src/menu/__demos__/context-menu.vue ```vue ``` ### 与 SplitButton 组合 SplitButton 已封装按钮与下拉命令菜单的组合,并通过 `MenuOption` 定义附加操作,完整用法见 [SplitButton](llms/zh-CN/components/split-button.md)。 ### 触发方式 Example source: src/menu/__demos__/trigger.vue ```vue ``` ### 弹出方向 Example source: src/menu/__demos__/placement.vue ```vue ``` ### 定位策略 根菜单和各级子菜单响应式使用同一 `strategy`,默认 `absolute`,可选 `fixed`。切换策略不会改变激活值或主动关闭菜单。`popup-container` 独立控制挂载位置;`fixed` 不保证脱离 transform 祖先的包含块。 Example source: src/menu/__demos__/positioning.vue ```vue ``` ### 高度限制 Example source: src/menu/__demos__/popup-height.vue ```vue ``` ## 状态与内容定制 ### 选中值与 select 事件 使用 `v-model` 管理当前激活值。激活命令时先触发 `update:modelValue`,再触发 `select(value, option, event)`;`select` 表示激活菜单项,不表示表单值变化。 Example source: src/menu/__demos__/selection.vue ```vue ``` ### 受控打开状态 Example source: src/menu/__demos__/controlled.vue ```vue ``` ### 页脚 Example source: src/menu/__demos__/footer.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。子级沿阅读方向展开;进入子级与返回父级的左右键跟随当前方向,上下键与首尾定位保持顺序并跳过禁用项。挂载到外部容器的菜单继承来源方向,切换方向不改变选中值。 ## API ### 主值与默认值 使用普通 `v-model`。`modelValue` 表示选中选项的 value;`defaultValue` 仅在创建时初始化非受控值,后续修改不会重置当前状态。显式绑定值优先,初始化不发出 `update:modelValue`。 ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | --- | --- | --- | :---: | | options | 命令树 | `MenuOptionData[]` | `[]` | | field-names | `label/value/children/disabled` 字段映射 | `MenuFieldNames` | `-` | | model-value **(v-model)** | 当前激活值,用于受控高亮 | `MenuValue` | `-` | | open **(v-model)** | 浮层是否可见 | `boolean` | `-` | | default-open | 非受控默认可见状态 | `boolean` | `false` | | trigger | 根菜单触发方式 | `'hover' \| 'click' \| 'focus' \| 'contextMenu'` | `'click'` | | submenu-trigger | 各级子菜单的展开方式,对所有层级统一生效 | `'hover' \| 'click'` | `'hover'` | | placement | 浮层相对触发元素的首选方位,默认 bottom;启用默认的 auto-fit-position 时,空间不足会自动翻转并约束到可视区域,不保证最终停在该侧 | `MenuPlacement` | `'bottom'` | | `strategy` | 根菜单及全部子菜单的定位策略 | `'absolute' \| 'fixed'` | `'absolute'` | | popup-container | 浮层挂载容器 | `string \| HTMLElement \| false` | `-` | | popup-max-height | 默认限制、自定义像素高度或不限高 | `boolean \| number` | `true` | | hide-on-select | 激活命令后关闭浮层 | `boolean` | `true` | | auto-fit-popup-width | 浮层宽度跟随触发器 | `boolean` | `false` | | disabled | 禁用菜单 | `boolean` | `false` | | align-point | 按触发时的鼠标坐标定位;打开后保持该位置,再次右键时更新 | `boolean` | `false` | ### `MenuOptionData` | 字段 | 描述 | 类型 | | --- | --- | --- | | type | 普通命令、分组或分隔线 | `'item' \| 'group' \| 'divider'` | | label | 主内容 | `VNodeChild \| (context) => VNodeChild` | | icon | 前置图标 | `VNodeChild \| (context) => VNodeChild` | | extra | 右侧辅助内容,如快捷键 | `VNodeChild \| (context) => VNodeChild` | | value | 激活命令时传给事件的值 | `any` | | children | 子命令;普通项带 children 时成为子菜单 | `MenuOptionData[]` | | disabled | 禁用当前项及其后代 | `boolean` | | show | 是否渲染 | `boolean` | | ripple | 是否显示点击波纹 | `boolean` | | props | 透传给命令行元素的 HTML 属性 | `HTMLAttributes` | 渲染上下文为 `{ option, active, level }`。`type: 'group'` 只负责视觉分组,不增加子项层级;`type: 'divider'` 不可聚焦或激活。 ### Events | 事件名 | 描述 | 参数 | | --- | --- | --- | | update:model-value | 当前选中值更新请求 | `value: MenuValue` | | open-change | 浮层显示状态更新请求 | `open: boolean` | | select | 用户激活菜单项 | `value, option, event` | ### Slots | 插槽名 | 描述 | 参数 | | --- | --- | --- | | default | 触发元素 | - | | content | 追加手写内容,适合与 `MenuOption` 组合 | - | | footer | 页脚 | - | | option-label | 统一渲染选项主内容 | `{ option, active, level }` | | option-icon | 统一渲染选项图标 | `{ option, active, level }` | | option-extra | 统一渲染选项右侧内容 | `{ option, active, level }` | ### `` 保留给 SplitButton 和少量手写 `content` 场景。Props 包含 `label`、`value`、`disabled`、`ripple`、`highlight`;`label` 渲染函数及 `default`、`icon`、`suffix` 插槽统一接收 `{ option, active, level }`;点击时触发 `click`。`highlight` 只控制视觉强调,不提交选中值。分组和子菜单只通过 `options` 描述,不再导出 `MenuGroup`、`MenuSubmenu`。 ### 实例与键盘 实例提供 `open()`、`close()`、`resize()`、`setReference(reference?)`。根菜单支持上下键、Home/End、Enter;子菜单通过右键进入、左键或 Escape 返回,Escape 每次只关闭最上层并恢复焦点。 样式类、CSS 变量与内部 DOM 标记统一使用 `c-menu-*` / `--c-menu-*` / `data-menu-*`。 ### 状态与时长变量 禁用优先于选中、指针 hover 和键盘焦点。选中后的 hover 使用独立角色,默认继承选中背景;可单独覆盖以增加 hover 反馈。两端的选中背景都直接绘制在选项上。 | Token | Default | | --- | --- | | `--c-menu-option-bg-selected-hover` | `var(--c-menu-option-bg-selected)` | ### 数据身份与触发器切换 可重排的数据项应提供稳定、唯一的 `value`,内部 Vue key 由业务值生成;数字 `0`、字符串 `'0'`、布尔值 `false` 保持不同身份。没有显式 value 的分组、分隔符或展示项按原始选项对象维持渲染身份,不新增公开 key 别名。点击另一个已经因 hover 打开的同级触发按钮,会关闭原先的菜单;点击子菜单内部不会误关父级。 ### 方位语义与配置入口 MenuPlacement 复用 TriggerPlacement 的十二方位值域;属性和类型均表达浮层相对触发器的首选方位。旧 MenuPosition 已删除。 --- Document: llms/zh-CN/components/message.md # Message 全局提示 用于展示轻量级、非模态的全局反馈。Cedar 与 Maple 共享同一套公开契约、队列、计时和命令式服务;两端分别维护源码和端侧外观。 ## 基础示例 ### 基本使用 直接调用 `Message(...)` 创建 `default` 提示。 Example source: src/message/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 消息状态 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `status` | 语义状态 | 外观组合 | | `position` | 消息自身在可视区域中的 top/center/bottom 区域,默认 top;不相对触发元素定位 | 外观组合 | | `closable` | 是否显示关闭按钮 | 外观组合 | | `duration` | 自动关闭时长(ms),`0` 不自动关闭 | 外观组合 | | `variant` | 视觉强调层级 | 外观组合 | 状态统一为 `default / info / success / warning / danger / loading`。函数方法使用 `error`,组件状态使用标准语义 `danger`;普通提示直接调用 `Message(...)`,不提供 `normal` 别名。 Example source: src/message/__demos__/type.vue ```vue ``` ### 视觉变体 视觉变体与 status 独立:neutral 是中性浮层与状态图标;tonal 是低强调状态色底与深色正文;solid 是高强调实色底与配套前景。Cedar 与 Maple 默认均为 neutral;显式 solid / tonal 保持相同视觉语义。default/loading 的 solid 保留深色底,loading 图标仍表达进度。两端导出 MessageVariant,函数调用、setDefaultOptions 和相同 id 更新都支持 variant。 Example source: src/message/__demos__/variant.vue ```vue ``` ### 外观组合 适用于操作结果的即时反馈。调整变体、状态,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。 Example source: src/message/__demos__/appearance-lab.vue ```vue ``` ## 布局与排列 ### 位置 两端均支持 `top / center / bottom`。 Example source: src/message/__demos__/location.vue ```vue ``` ## 内容与展示 ### 显示时长 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `status` | 语义状态 | 组件调用 | | `position` | 消息自身在可视区域中的 top/center/bottom 区域,默认 top;不相对触发元素定位 | 组件调用 | | `closable` | 是否显示关闭按钮 | 组件调用 | | `duration` | 自动关闭时长(ms),`0` 不自动关闭 | 组件调用 | `duration` 单位为毫秒,`0` 表示常驻;`Message.loading(...)` 默认常驻。 展示期限独立于 CSS 进出动效。重启、hover 暂停、清理或卸载使旧计时回调失效,关闭状态在回调执行时再次检查;不会用动效 Token 修改业务展示时长。 KeepAlive 停用取消计时,激活从当前配置完整 duration 重启;停用期间更新、卸载后保留的 restart 不调度。hover 正时长已耗尽时恢复会请求关闭,显式重置为0仍常驻。仅有限正 duration 自动关闭,负数和非有限值不调度。 服务等待真实离场完成再清理和调用 onClosed,不再强制150ms或200ms退出。未挂载就 close/clear 的条目直接清理;此时服务 onClosed 仍报告完成,但组件未产生 open/opened/close 动画事件。业务 duration 与 CSS 过渡时长分开。 减少动效偏好下,独立样式取消根/进出过渡及装饰图标淡入,保留静态定位、颜色和业务展示期限;子图标自身动效仍由Icon规范负责。隔离Less检查不是实际OS验收。 Example source: src/message/__demos__/time.vue ```vue ``` ### 更新已有提示 同一挂载容器和位置内,相同 `id` 更新原实例,不创建重复 DOM。仅当 `resetOnUpdate` 为 `true` 时,更新会重新计算完整显示时长。 Example source: src/message/__demos__/update.vue ```vue ``` ### 悬停暂停 `pauseOnHover` 会保存剩余时间,鼠标离开后从剩余时间继续,而不是重新开始完整时长。 Example source: src/message/__demos__/pause-on-hover.vue ```vue ``` ### 组件调用 声明式组件适合由页面状态控制显示,并支持 `icon`、`action` 插槽和完整开关生命周期。 Example source: src/message/__demos__/component.vue ```vue ``` ## 自定义与插槽 ### 自定义图标 Example source: src/message/__demos__/custom-icon.vue ```vue ``` ## 交互与控制 ### 可关闭 Example source: src/message/__demos__/closable.vue ```vue ``` ### Loading 与多实例 Example source: src/message/__demos__/loading.vue ```vue ``` Example source: src/message/__demos__/multiple.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。内容、图标与关闭按钮间距随阅读方向排列;方向切换不改变消息类型、计时或关闭语义。函数式调用遵循显式配置或文档方向。 ## API ### Props / MessageOptions | 属性 | 说明 | 类型 | 默认值 | | --------------------- | -------------------------------------- | ------------------------------------------------------------ | --------------- | | open / `v-model:open` | 是否显示(组件) | `boolean` | `false` | | id | 队列内唯一标识,相同 id 更新原实例 | `string \| number` | 自动生成 | | status | 语义状态 | `default \| info \| success \| warning \| danger \| loading` | `default` | | variant | 视觉强调层级 | `neutral \| tonal \| solid` | `neutral` | | position | 消息自身在可视区域中的 top/center/bottom 区域,默认 top;不相对触发元素定位 | `top \| center \| bottom` | `top` | | content | 内容 | `MessageContent` | - | | icon | 自定义图标 | `MessageContent` | - | | action | 操作区内容 | `MessageContent` | - | | duration | 自动关闭时长(ms),`0` 不自动关闭 | `number` | `3000` | | showIcon | 是否显示状态图标 | `boolean` | `true` | | closable | 是否显示关闭按钮 | `boolean` | `false` | | pauseOnHover | 悬停时暂停并保存剩余时间 | `boolean` | `false` | | resetOnUpdate | 相同 id 更新时是否重置完整时长 | `boolean` | `false` | | closeButtonAriaLabel | 关闭按钮无障碍名称 | `string` | `Close message` | | popupContainer | 挂载容器;函数调用按容器和位置隔离队列 | `string \| HTMLElement \| false` | `body` | 函数选项另支持 `onOpen / onOpened / onClose / onClosed`,关闭回调接收当前 `id`。 ### 事件 `update:open`、`open`、`opened`、`close`、`closed`;每次开关周期各触发一次。 ### 方法 | 方法 | 说明 | | ------------------------------------------------- | ------------------------ | | `Message(options \| string)` | 打开默认提示 | | `Message.info/success/warning/error/loading(...)` | 打开对应状态提示 | | `Message.clear(position?)` | 清空全部或指定位置的提示 | | `Message.setDefaultOptions(options)` | 设置后续调用的默认值 | | `Message.resetDefaultOptions()` | 恢复默认值 | 返回 `{ close() }`;重复调用 `close()` 不会重复触发关闭生命周期。 ### 插槽 `default`、`icon`、`action`。 ## 公开 CSS 变量 视觉变体与 status 独立:neutral 是中性浮层与状态图标;tonal 是低强调状态色底与深色正文;solid 是高强调实色底与配套前景。Cedar 与 Maple 默认均为 neutral;显式 solid / tonal 保持相同视觉语义。default/loading 的 solid 保留深色底,loading 图标仍表达进度。两端导出 MessageVariant,函数调用、setDefaultOptions 和相同 id 更新都支持 variant。 颜色命名为 `--c-message-{variant}-{status}-{bg|content-color|icon-color|border-color|close-color}`。bg 控制面板底,content-color 控制正文与未单独设色的 action,icon-color 控制状态图标,border-color 控制边线,close-color 控制关闭按钮。自定义背景时需要同时验证三个前景。几何变量保留端侧密度,不要求两端强行同值。变量必须作用于实际 Teleport 容器祖先。 | 变量 | 默认值 | | --- | --- | | `--c-message-neutral-default-bg` | `var(--c-sys-color-surface-overlay)` | | `--c-message-neutral-default-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-neutral-default-icon-color` | `var(--c-sys-color-content-primary)` | | `--c-message-neutral-default-border-color` | `var(--c-sys-color-border-default)` | | `--c-message-neutral-default-close-color` | `var(--c-sys-color-content-secondary)` | | `--c-message-neutral-info-bg` | `var(--c-sys-color-surface-overlay)` | | `--c-message-neutral-info-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-neutral-info-icon-color` | `var(--c-sys-color-content-info)` | | `--c-message-neutral-info-border-color` | `var(--c-sys-color-border-default)` | | `--c-message-neutral-info-close-color` | `var(--c-sys-color-content-secondary)` | | `--c-message-neutral-success-bg` | `var(--c-sys-color-surface-overlay)` | | `--c-message-neutral-success-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-neutral-success-icon-color` | `var(--c-sys-color-content-success)` | | `--c-message-neutral-success-border-color` | `var(--c-sys-color-border-default)` | | `--c-message-neutral-success-close-color` | `var(--c-sys-color-content-secondary)` | | `--c-message-neutral-warning-bg` | `var(--c-sys-color-surface-overlay)` | | `--c-message-neutral-warning-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-neutral-warning-icon-color` | `var(--c-sys-color-content-warning)` | | `--c-message-neutral-warning-border-color` | `var(--c-sys-color-border-default)` | | `--c-message-neutral-warning-close-color` | `var(--c-sys-color-content-secondary)` | | `--c-message-neutral-danger-bg` | `var(--c-sys-color-surface-overlay)` | | `--c-message-neutral-danger-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-neutral-danger-icon-color` | `var(--c-sys-color-content-danger)` | | `--c-message-neutral-danger-border-color` | `var(--c-sys-color-border-default)` | | `--c-message-neutral-danger-close-color` | `var(--c-sys-color-content-secondary)` | | `--c-message-neutral-loading-bg` | `var(--c-sys-color-surface-overlay)` | | `--c-message-neutral-loading-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-neutral-loading-icon-color` | `var(--c-sys-color-content-brand)` | | `--c-message-neutral-loading-border-color` | `var(--c-sys-color-border-default)` | | `--c-message-neutral-loading-close-color` | `var(--c-sys-color-content-secondary)` | | `--c-message-tonal-default-bg` | `var(--c-sys-color-surface-muted)` | | `--c-message-tonal-default-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-default-icon-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-default-border-color` | `transparent` | | `--c-message-tonal-default-close-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-info-bg` | `rgba(var(--c-blue-6), 0.12)` | | `--c-message-tonal-info-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-info-icon-color` | `var(--c-sys-color-content-info)` | | `--c-message-tonal-info-border-color` | `transparent` | | `--c-message-tonal-info-close-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-success-bg` | `var(--c-color-success-light-1)` | | `--c-message-tonal-success-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-success-icon-color` | `var(--c-sys-color-content-success)` | | `--c-message-tonal-success-border-color` | `transparent` | | `--c-message-tonal-success-close-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-warning-bg` | `var(--c-color-warning-light-1)` | | `--c-message-tonal-warning-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-warning-icon-color` | `var(--c-sys-color-content-warning)` | | `--c-message-tonal-warning-border-color` | `transparent` | | `--c-message-tonal-warning-close-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-danger-bg` | `var(--c-color-danger-light-1)` | | `--c-message-tonal-danger-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-danger-icon-color` | `var(--c-sys-color-content-danger)` | | `--c-message-tonal-danger-border-color` | `transparent` | | `--c-message-tonal-danger-close-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-loading-bg` | `var(--c-color-primary-light-1)` | | `--c-message-tonal-loading-content-color` | `var(--c-sys-color-content-primary)` | | `--c-message-tonal-loading-icon-color` | `var(--c-sys-color-content-brand)` | | `--c-message-tonal-loading-border-color` | `transparent` | | `--c-message-tonal-loading-close-color` | `var(--c-sys-color-content-primary)` | | `--c-message-solid-default-bg` | `#333` | | `--c-message-solid-default-content-color` | `var(--c-sys-color-content-on-dark)` | | `--c-message-solid-default-icon-color` | `var(--c-sys-color-content-on-dark)` | | `--c-message-solid-default-border-color` | `transparent` | | `--c-message-solid-default-close-color` | `var(--c-sys-color-content-on-dark)` | | `--c-message-solid-info-bg` | `var(--c-sys-color-status-info)` | | `--c-message-solid-info-content-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-info-icon-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-info-border-color` | `transparent` | | `--c-message-solid-info-close-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-success-bg` | `var(--c-sys-color-status-success)` | | `--c-message-solid-success-content-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-success-icon-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-success-border-color` | `transparent` | | `--c-message-solid-success-close-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-warning-bg` | `var(--c-sys-color-status-warning)` | | `--c-message-solid-warning-content-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-warning-icon-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-warning-border-color` | `transparent` | | `--c-message-solid-warning-close-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-danger-bg` | `var(--c-sys-color-status-danger)` | | `--c-message-solid-danger-content-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-danger-icon-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-danger-border-color` | `transparent` | | `--c-message-solid-danger-close-color` | `var(--c-sys-color-content-on-bright)` | | `--c-message-solid-loading-bg` | `#333` | | `--c-message-solid-loading-content-color` | `var(--c-sys-color-content-on-dark)` | | `--c-message-solid-loading-icon-color` | `var(--c-sys-color-content-on-dark)` | | `--c-message-solid-loading-border-color` | `transparent` | | `--c-message-solid-loading-close-color` | `var(--c-sys-color-content-on-dark)` | | `--c-message-wrapper-margin-top` | `var(--c-spacing-12)` | | `--c-message-wrapper-margin-bottom` | `var(--c-spacing-12)` | | `--c-message-wrapper-padding-horizontal` | `var(--c-spacing-5)` | | `--c-message-z-index` | `var(--c-z-index-message)` | | `--c-message-padding-top` | `var(--c-spacing-5)` | | `--c-message-padding-bottom` | `var(--c-spacing-5)` | | `--c-message-padding-left` | `var(--c-spacing-7)` | | `--c-message-padding-right` | `var(--c-spacing-7)` | | `--c-message-margin-bottom` | `var(--c-spacing-7)` | | `--c-message-border-radius` | `var(--c-border-radius-sm)` | | `--c-message-icon-font-size` | `20px` | | `--c-message-content-font-size` | `var(--c-font-size-body-3)` | | `--c-message-icon-margin-right` | `var(--c-spacing-4)` | | `--c-message-box-shadow` | `var(--c-shadow2-down)` | | `--c-message-border-width` | `1px` | | `--c-message-border-style` | `solid` | | `--c-message-close-icon-font-size` | `12px` | | `--c-message-close-btn-margin-left` | `var(--c-spacing-4)` | | `--c-message-close-icon-hover-size` | `20px` | | `--c-message-close-icon-hover-opacity` | `0.08` | | `--c-message-transition-duration` | `var(--c-transition-duration-1)` | | `--c-message-transition-duration-icon` | `var(--c-transition-duration-4)` | | `--c-message-transition-timing-function` | `var( --c-transition-timing-function-linear )` | | `--c-message-transition-timing-function-icon` | `var( --c-transition-timing-function-overshoot )` | close/closed 通知回调抛错不会保留已关闭项目或空管理器宿主,资源清理独立于通知回调执行。 --- Document: llms/zh-CN/components/nav-menu.md # NavMenu 导航菜单 通过 `options` 定义导航结构,支持纵向展开、横向下拉及横向溢出收纳。子菜单由 `children` 自动产生,也可用 `NavMenu.Item` 定义独立一级入口;无需 SubMenu/ItemGroup 组件。 ### 程序化滚动的生命周期 `scrollTo(key)` 展开路径后等待渲染,再以 nearest 对齐原生定位;返回 `Promise`。连续调用只执行最新仍有效的请求。禁用、options/fieldNames/mode/responsive/折叠配置变化、KeepAlive 停用及卸载使旧请求失效;重新激活后请显式发起新请求,不会重放旧滚动。取消不回滚已经执行的浏览器滚动,不新增 CSS duration Token 或公共取消方法。 NavMenu 有两种清晰的使用方式:导航树使用 `options`,业务筛选等独立入口使用 `NavMenu.Item`。下面先介绍常用导航,再逐步进入层级、响应式和高级定制。 ## 基础示例 ### 基础导航 #### 纵向导航 最常见的侧边导航。通过 `options` 和 `children` 声明层级,使用 `v-model` 获取当前页面。 Example source: src/nav-menu/__demos__/basic.vue ```vue ``` #### 横向导航 用于页面顶部导航。一级菜单横向排列,含有 `children` 的入口通过浮层展示下级菜单。 Example source: src/nav-menu/__demos__/horizontal-sub-menu.vue ```vue ``` ## 外观与布局 ### 外观 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `options` | 导航结构 | 外观 | | `size` | 尺寸 | 外观 | | `mode` | 导航方向 | 外观 | #### 尺寸 NavMenu 支持 `xs`、`sm`、`md`、`lg` 和 `xl` 五档组件尺寸。 Example source: src/nav-menu/__demos__/size.vue ```vue ``` ## 层级与响应式 ### 层级与响应式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `options` | 导航结构 | 层级与响应式 | | `accordion` | 同层只展开一个分支 | 层级与响应式 | | `default-value` | 非受控初始选中值 | 层级与响应式 | | `collapsed` | 折叠状态,支持 v-model:collapsed | 层级与响应式 | | `mode` | 导航方向 | 层级与响应式 | #### 多级菜单与手风琴 `accordion` 让同一层级只展开一个分支;初始选中深层页面时,菜单会自动展开其祖先路径。 Example source: src/nav-menu/__demos__/sub-menu.vue ```vue ``` #### 折叠菜单 适合空间有限的侧边栏。折叠后保留图标,分支改由浮层展开。 Example source: src/nav-menu/__demos__/collapsed.vue ```vue ``` #### 横向溢出收纳 横向空间不足时,末尾菜单自动收入“更多”。可拖动示例容器右下角观察变化。 Example source: src/nav-menu/__demos__/breakpoint.vue ```vue ``` ## 导航入口与业务面板 ### 独立入口与业务面板 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `mode` | 导航方向 | 独立入口与业务面板 | | `active-item` | 受控的具名 NavMenu.Item 激活项,支持 v-model:active-item | 独立入口与业务面板 | `NavMenu.Item` 适合分类、地区和高级筛选等独立入口。它有自己的值和展开状态,不参与导航树的互斥选择。 #### 横向筛选栏 同时展示普通下拉、横向通栏选项和自定义筛选面板,是顶部业务导航的完整示例。 Example source: src/nav-menu/__demos__/items-horizontal.vue ```vue ``` #### 纵向工作台 页面入口负责互斥高亮,项目选择和高级筛选独立管理;全高面板从菜单右侧展开。 Example source: src/nav-menu/__demos__/items-vertical.vue ```vue ``` #### 入口状态与视觉强调 通过插槽直接显示业务 `active` 和面板 `open`。独立入口匹配有效选项时才 active;`highlight` 可以单独覆盖外观。具名入口只在选择叶子项后更新 activeItem,打开面板不会提前激活。 Example source: src/nav-menu/__demos__/entry-state.vue ```vue ``` #### 标题更新策略 Item 的标题默认跟随选中项,也可以通过 `#label` 保持固定标题,或把选中值与显示标题分开管理。高亮状态可以由根菜单统一管理,也可以由每个 Item 独立管理。 ##### 统一激活 为 Item 设置唯一 `name`,再通过根菜单的 `v-model:active-item` 统一保持单选高亮。打开一级入口只展开面板,不会提前激活;选择叶子节点后才更新当前高亮项,每个面板的内部值仍独立保留。确实需要初始高亮时,可以显式设置 `active-item` 或 `default-active-item`。 Example source: src/nav-menu/__demos__/item-label.vue ```vue ``` ##### 独立激活 不设置 `name` 时,每个 Item 根据自己的值独立高亮,适合多个筛选条件同时生效。下例初始同时选中了分类和地区,因此两个入口都会高亮;清空其中一项不会影响另一项。 Example source: src/nav-menu/__demos__/item-label-independent.vue ```vue ``` ## 数据与状态控制 ### 数据与状态控制 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `options` | 导航结构 | 数据与状态控制 | | `model-value` | 当前选中 key,支持 v-model;null 表示无选中 | 数据与状态控制 | | `expanded-keys` | 受控展开分支 | 数据与状态控制 | | `field-names` | key/label/children/disabled 字段映射 | 数据与状态控制 | | `disabled` | 全局禁用选择和用户展开 | 数据与状态控制 | | `default-value` | 非受控初始选中值 | 数据与状态控制 | #### 受控选择与展开 受控属性始终以父级传入值为准。示例可切换是否接受更新请求,以观察选择与展开状态的区别。 Example source: src/nav-menu/__demos__/controlled.vue ```vue ``` Example source: src/nav-menu/__demos__/item-controlled.vue ```vue ``` Example source: src/nav-menu/__demos__/panel-state.vue ```vue ``` #### 业务字段映射 使用 `field-names` 接入不同字段结构,同时展示分组、分隔线、禁用、隐藏和整菜单禁用。 Example source: src/nav-menu/__demos__/field-names.vue ```vue ``` #### 节点内容定制 作用域插槽负责统一定制节点内容,选项本身也可以提供 VNode 或渲染函数。 Example source: src/nav-menu/__demos__/custom-content.vue ```vue ``` ## NavMenu API | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | options | 导航结构 | NavMenuOption[] | [] | | model-value | 当前选中 key,支持 v-model;null 表示无选中 | string / number / null | undefined | | default-value | 非受控初始选中值 | string / number / null | null | | active-item | 受控的具名 NavMenu.Item 激活项,支持 v-model:active-item | string / number / null | undefined | | default-active-item | 非受控的具名 NavMenu.Item 初始激活项 | string / number / null | null | | expanded-keys | 受控展开分支 | (string / number)[] | undefined | | default-expanded-keys | 非受控初始展开分支 | (string / number)[] | [] | | default-expand-all | 初始展开所有分支 | boolean | false | | auto-expand-selected | 纵向非折叠时展开选中项祖先;受控时发出更新请求 | boolean | true | | accordion | 同层只展开一个分支 | boolean | false | | mode | 导航方向 | vertical / horizontal | vertical | | collapsed | 折叠状态,支持 v-model:collapsed | boolean | undefined | | default-collapsed | 非受控初始折叠 | boolean | false | | theme | 主题 | light / dark | 继承 Sider,否则 light | | size | 尺寸 | xs / sm / md / lg / xl | md | | disabled | 全局禁用选择和用户展开 | boolean | false | | field-names | key/label/children/disabled 字段映射 | NavMenuFieldNames | 默认同名 | | responsive | 横向菜单启用更多收纳 | boolean | true | | indent | 每层缩进(px) | number | 24 | | root-indent | 根缩进(px) | number | 12 | | collapsed-width | 折叠宽度(px) | number | 56 | | icon-size | 图标尺寸(px) | number | 20 | | popup-container | 浮层挂载容器,false 为当前位置 | Trigger 对应类型 | 继承 Trigger 定义 | | popup-class | 浮层附加类名 | string / array / object | — | | overflow-label | 更多入口标签 | string | 更多 | | node-props | 节点 DOM 属性和事件;内部选择、禁用和键盘语义保留 | (context) => Record | — | 受控属性以传入值为准;更新事件只是请求。`default-*` 仅初始化,不跟随后续修改。单选值与展开状态相互独立,`showOption` 不会更改选中值。 ### NavMenuOption ```ts interface NavMenuOption { key?: string | number type?: 'item' | 'group' | 'divider' label?: VNodeChild | ((context: NavMenuRenderContext) => VNodeChild) icon?: VNodeChild | ((context: NavMenuRenderContext) => VNodeChild) extra?: VNodeChild | ((context: NavMenuRenderContext) => VNodeChild) children?: NavMenuOption[] disabled?: boolean show?: boolean props?: HTMLAttributes } ``` 普通选项必须提供唯一且稳定的 key(自定义字段时使用映射后的 key);数字 0 是合法 key。group/divider 可省略 key,但动态重排时建议显式提供。重复 key 或普通项缺失 key 会报错,避免选中路径混乱。show=false 的节点及其子树不渲染;禁用分支向下继承禁用。存在 children 的普通项负责展开,叶项负责选择。 ### 事件 | 事件 | 参数 | | --- | --- | | update:model-value | key / null | | update:active-item | name / null | | update:expanded-keys | keys | | update:collapsed | collapsed | | select | key, 原始 option, 原始 Event | ### 插槽 默认插槽用于放置独立的 `CNavMenuItem`。存在默认插槽时,横向菜单使用滚动,`responsive` 不进行更多收纳。 label/icon/extra 渲染函数、同名插槽及 nodeProps 均接收 `{ option, active, expanded, level }`。`active` 只表示当前节点自身匹配 modelValue,祖先路径强调留在内部;`expanded` 表示分支展开,level 从 0 开始。 ### 两端对应关系 两端面板均在首次展开时创建,关闭或切换入口后默认保留挂载,内部草稿和分支展开状态继续保留。设置 `unmount-on-close` 后,在关闭过渡结束时卸载面板;再次展开会重新创建内部组件,但不会清空 Item 自身的选中值。草稿提交、重置和筛选生效时机由业务决定。 根 `close()` 只请求关闭 Item 面板并恢复入口焦点,不改变选中值、active-item 或桌面导航树的 expanded-keys。受控 open 拒绝更新时仍保持展开。没有 options 且没有 content 插槽的入口不展开;异步 options 到达后按当前 open 状态展示。KeepAlive 停用期间隐藏面板并请求关闭,重新激活时仍以受控值为准。 Item 的选中值、展开状态、事件、插槽上下文及 `select/close/setOpen` 方法保持一致。两端根菜单都提供 `close/resize/setActiveItem`。`name` 必须在当前菜单内唯一,动态修改后会释放旧名称;同一次更新允许交换名称或在重排时复用旧名称,以更新完成后的名称检查重复。纵向选项会在初始值、受控值或 options 更新时展开当前值的可用祖先路径;用户仍可手动收起分支。 | 能力 | Cedar | Maple | | --- | --- | --- | | 根菜单 | options 导航树或 Item 入口;默认 vertical | 仅 Item 筛选栏;默认 horizontal | | popup-layout | dropdown(默认)/ full-width / full-height / full | full-width(默认)/ full | | 面板起点 | 当前入口底边 | 整个筛选栏底边;独立 Item 使用自身底边 | | 触发与定位 | trigger / placement | 固定点击向下展开 | | 遮罩与滚动 | 非模态,不锁背景滚动 | 根级 overlay / overlay-closable / lock-scroll / esc-to-close / z-index | | 主题 | theme 可覆盖 | 跟随全局主题,无 theme 属性 | | 导航树专用方法 | showOption / scrollTo / setCollapsed | — | 两端 `NavMenuPopupLayout` 分别导出本端支持的值域;Maple 的 `NavMenuMode` 仅为 horizontal,`options-mode` 仍支持两个方向。入口 default 插槽替换入口内部内容,移动端位于原生按钮中,请使用文本、图标等非交互内容;表单和操作按钮放在 content 插槽。 ### 方法 | 方法 | 说明 | | --- | --- | | close() | 请求关闭所有 Item 面板并恢复入口焦点,不修改导航树展开状态 | | showOption(key?) | 展开指定项的祖先路径,默认当前选中项;不选择 | | scrollTo(key?) | 先展开,再滚动到该项;受控展开需父级接受 | | resize() | 手动重新计算横向溢出 | | setCollapsed(value) | 更新非受控折叠或发出受控更新请求 | | setActiveItem(value) | 更新具名 Item 的非受控激活项或发出受控更新请求 | ### 箭头方向 横向下拉入口收起朝下、展开朝上;纵向内联分支收起朝右、展开朝下;向右弹出的子菜单收起朝右、展开朝左。独立 Item 根据 placement 显示方向,展开后反向。箭头跟随实际 open 状态,受控状态未接受更新时不切换。 ### 键盘 纵向 Up/Down 与横向 Left/Right 移动焦点,Home/End 到首尾;Right 展开纵向分支,Down 打开横向分支;Left 返回父级,弹出层 Escape 关闭当前层并恢复参考项焦点。Enter/空格激活节点。禁用项跳过;输入框保留原生按键。横向缩窄导致当前项进入“更多”时,焦点迁移至更多入口。 ## NavMenu.Item API 标题默认跟随匹配的选中选项。`label` 插槽优先级最高:固定标题可写 ``;手动标题可绑定独立的响应式变量。原 `update-label` 已移除。 `v-model` 保存面板的选中值。插槽 `active` 只表示业务上的当前入口:提供 name 且处于根菜单中时,由根 activeItem 是否等于该 name 决定;独立入口则由主值是否匹配 options 中的普通选项决定(包括 0 和空字符串)。未知值、分组和分隔项不激活独立入口。`highlight` 仅覆盖视觉强调,true 强制强调、false 取消强调,省略时跟随 active;它不改变 active 或主值。打开面板不会激活入口。 `CNavMenuItem`(也可写 `NavMenu.Item`)是自定义一级入口,不参与根菜单普通导航树的 `modelValue`。未提供 `name` 时,Item 根据自己的值独立高亮,适合分类、地区等多个筛选条件同时生效;提供唯一 `name` 后,由根菜单的 `activeItem/defaultActiveItem` 统一保持单选高亮。两种模式都只允许同一时间展开一个 Item 面板,且不会清空其他面板的内部值。普通一级导航仍使用根 NavMenu 的 `options + v-model`。每个入口通过自己的 `options` 定义菜单,或通过 `content` 插槽完全替换面板。默认插槽自定义入口内部内容,`label`、`icon` 插槽局部自定义入口,`option-label`、`option-icon`、`option-extra` 自定义选项。 有默认插槽时,横向菜单使用滚动而不收入“更多”,避免复制包含表单的入口。纯 `options` 菜单继续支持自动溢出收纳。新 Item 不兼容旧的子组件收集协议。同一 NavMenu 下的 Item 面板互斥,点击其他入口会请求关闭已打开的面板;受控 open 需要业务接受 update:open。 | Item 属性 | 说明 | 默认 | | --- | --- | --- | | name | 稳定且唯一的入口标识;提供后由根菜单 activeItem 互斥管理当前入口;视觉覆盖另用 highlight | — | | label | 未选中或选中值未匹配 options 时的入口标题,支持 VNode / 渲染函数 | — | | options / fieldNames | 与 NavMenu 相同的选项和字段映射 | `[]` | | model-value / default-value | 独立受控值 / 初始值,支持字符串、数字和 null | `undefined` / `null` | | highlight | 入口视觉强调覆盖,不改变业务 active 或选中值;省略时跟随 active | — | | hide-on-select | 调用 select 后关闭面板 | `true` | | unmount-on-close | 关闭过渡结束后卸载面板;默认保留首次展开后的内容 | false | | open / default-open | 受控 / 初始面板状态 | `undefined` / `false` | | disabled | 禁用入口(同时遵循父菜单 disabled) | `undefined` | | trigger | Trigger 触发方式 | `click` | | placement | 普通下拉的位置;全高面板使用 right/left 系列时紧贴入口对应边缘 | `bottom-start` | | popup-layout | `dropdown` 普通下拉 / `full-width` 入口下方通栏 / `full-height` 右侧全高 / `full` 入口下方宽高铺满 | `dropdown` | | popup-style | 面板 CSS,可覆盖全高面板宽度、方向和尺寸 | — | | popup-container / popup-class | Trigger 挂载容器及浮层类名 | 跟随父菜单 | | options-mode | 默认选项面板的横向 / 纵向排列 | `vertical` | 所有入口插槽和 `content` 插槽收到 `{ modelValue, selectedOption, active, open, select, close }`。`select(key, event?)` 发出 `update:modelValue` 和 `select(key, option, event)`;自定义面板可以选择 options 外的值,此时 option 为 undefined;独立入口 active 为 false,如需强调可显式设置 highlight。`close()` 关闭并恢复入口焦点。受控值只有父组件接受后才影响标题和业务 active。入口插槽的 active 表示入口状态;label 渲染函数的 active 则表示其上下文 option 自身是否匹配 Item 的主值,未匹配时为 false。`hideOnSelect` 独立于值是否被接受,需手动确认时设为 false。 Item 还发出 `update:open`、入口 `click`,暴露 `select`、`close`、`setOpen` 方法。通栏 / 全高是非模态浮层,不锁定页面滚动或限制焦点;默认挂载到 body,使用自定义容器时需避免祖先 transform 改变 fixed 定位基准。 ## 从旧版本迁移 旧子组件收集协议和状态别名已移除。新的 `NavMenu.Item` 是独立一级入口,与旧 Item 的用法不同。 | 旧用法 | 新用法 | | --- | --- | | 旧 Item / SubMenu / ItemGroup 组件 | 导航树使用 options、children、type=group;自定义一级入口使用新的 NavMenu.Item | | selectedKeys/defaultSelectedKeys 数组 | modelValue/defaultValue 单个 key | | openKeys/defaultOpenKeys | expandedKeys/defaultExpandedKeys | | menu-item-click | select(key, option, event) | | pop / popButton 模式 | vertical + collapsed;横向仍用 horizontal | | 子组件 title/icon 插槽 | 根 label/icon/extra 作用域插槽或 option VNode | | 内置折叠按钮与 breakpoint | 外部按钮控制 collapsed;布局响应式交由容器 | | triggerProps/tooltipProps 全量透传 | 明确的 popupContainer/popupClass 属性 | 所有库内演示、组件导出、全局类型和 resolver 均已迁移。样式改为 BEM `c-nav-menu__*` 与 `c-nav-menu--*`,旧选择器与未使用 token 不再保留。 ## 设计参考 参考工作区 Naive UI 2.44.1 Menu 的 options 树、祖先路径和内容渲染设计;未引入 Naive UI 或 TreeMate 运行时依赖。浮层由本库 Trigger 提供,公开 API 使用 Cedar 命名约定。 ## 样式变量 | 变量 | 默认值 | | --- | --- | | --c-nav-menu-font-size | `var(~'--c-font-size-body-3')` | | --c-nav-menu-border-radius | `var(~'--c-border-radius-sm')` | | --c-nav-menu-light-bg | `var(~'--c-color-bg-2')` | | --c-nav-menu-light-item-bg-hover | `var(~'--c-color-fill-2')` | | --c-nav-menu-light-item-bg-selected | `var(~'--c-color-fill-2')` | | --c-nav-menu-light-item-text-color | `var(~'--c-color-text-2')` | | --c-nav-menu-light-item-text-color-selected | `rgb(var(~'--c-primary-6'))` | | --c-nav-menu-light-item-text-color-disabled | `var(~'--c-color-text-4')` | | --c-nav-menu-dark-bg | `var(~'--c-color-menu-dark-bg')` | | --c-nav-menu-dark-item-bg-hover | `var(~'--c-color-menu-dark-hover')` | | --c-nav-menu-dark-item-bg-selected | `var(~'--c-color-menu-dark-hover')` | | --c-nav-menu-dark-item-text-color | `var(~'--c-color-text-4')` | | --c-nav-menu-dark-item-text-color-selected | `var(~'--c-color-white')` | | --c-nav-menu-dark-item-text-color-disabled | `var(~'--c-color-text-2')` | | --c-nav-menu-row-height | `40px` | | --c-nav-menu-row-height-xs | `28px` | | --c-nav-menu-row-height-sm | `32px` | | --c-nav-menu-row-height-lg | `48px` | | --c-nav-menu-row-height-xl | `56px` | | --c-nav-menu-content-gap | `8px` | | --c-nav-menu-content-padding | `12px` | | --c-nav-menu-icon-size | `20px` | | --c-nav-menu-arrow-size | `12px` | | --c-nav-menu-focus-width | `2px` | | --c-nav-menu-focus-offset | `-2px` | | --c-nav-menu-divider-width | `1px` | | --c-nav-menu-divider-color | `var(--c-color-border-2)` | | --c-nav-menu-popup-min-width | `180px` | | --c-nav-menu-popup-max-height | `320px` | | --c-nav-menu-popup-shadow | `0 6px 24px rgb(0 0 0 / 12%)` | | --c-nav-menu-motion-duration | `150ms` | | --c-nav-menu-panel-width | `min(400px, 100vw)` | `popup-layout="full"` 从入口底边开始,宽度占满视口,高度占满下方剩余视口区域。Maple 同名布局从整个筛选栏底边开始;移动端默认 full-width,桌面端默认 dropdown。 ## 阅读方向与键盘交互 NavMenu 继承最近的原生 `dir` 并支持动态切换。横向菜单的左右键按阅读方向移动焦点;纵向上下键不反转。RTL 下左键展开/进入子级,右键收起/返回父级,LTR 相反;Escape 关闭浮层并返回触发项。 数据菜单的嵌套浮层优先向阅读结束侧展开,空间不足时自动调整,浮层继承来源作用域。显式 `NavMenu.Item` 的物理 `placement` 保持原意。切换方向不会选中菜单或清空筛选值。 --- Document: llms/zh-CN/components/notification.md # Notification 通知提醒框 全局展示通知提醒,将信息及时有效的传达给用户。 ## 基础示例 ### 基本用法 基本用法。 Example source: src/notification/__demos__/basic.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。弹出角落显式命名的 left/right 保持物理侧;图标、内容、关闭与底部动作采用阅读方向。函数式调用应使用明确方向或文档方向,不借用其他应用实例的上下文。 ## API clear 同步释放条目与 ID,随后即使在同一个更新周期重加相同 ID,也会使用独立内部实例和新的完整展示计时;活动 ID 的普通更新仍原位更新。内部实例键不作为公共变量/API 暴露,clear 仍不额外触发业务 onClose。组件样式入口在减少动效下关闭 opacity/左右进入、appear、离开过渡及起始位移,不依赖全局极短时长兜底;静态布局/配色、业务展示期限不变。真实 OS 与浏览器矩阵另行验收。 duration(默认 3000ms,0 持续显示)是业务展示计时,不是 CSS 动效时长。close 每个挂载实例只通知一次,立即取消计时器;离场期间的更新/重复关闭不再安排自动关闭。reset-on-update 只重启活动且未关闭实例的计时。KeepAlive 停用取消计时,重新激活从完整配置时长计时;卸载和已失效回调不会补发 close。列表仍通过实际 TransitionGroup 的离场完成卸载,不按 duration 等待 CSS 动画。现有六项 transition-* Token 控制 opacity/左右进入/离开效果,不改变自动关闭期限;正常消费者覆写检查不等于真实 OS 减少动效验收。 ### `Notification` 全局方法 `Notification` 提供的全局方法,可以通过以下三种方法使用: 1. 通过 `this.$notification` 调用 2. 在 Composition API 中,通过 `getCurrentInstance().appContext.config.globalProperties.$notification` 调用 3. 导入 `Notification`,通过 `Notification` 本身调用 当通过 `import` 方式使用时,组件没有办法获取当前的 Vue Context,如 i18n 或 route 等注入在 AppContext 上的内容无法在内部使用,需要在调用时手动传入 AppContext,或者为组件全局指定 AppContext ```ts import { createApp } from 'vue' import { Notification } from '@cedar-design/ui' const app = createApp(App) Notification._context = app._context ``` ### NotificationMethod | 参数名 | 描述 | 类型 | 默认值 | | ------- | ---------------------- | ------------------------------------------------------------------------------------------------ | :----: | | info | 显示信息提醒框 | `( config: string \| NotificationConfig, appContext?: AppContext ) => NotificationReturn` | `-` | | success | 显示成功提醒框 | `( config: string \| NotificationConfig, appContext?: AppContext ) => NotificationReturn` | `-` | | warning | 显示警告提醒框 | `( config: string \| NotificationConfig, appContext?: AppContext ) => NotificationReturn` | `-` | | error | 显示错误提醒框 | `( config: string \| NotificationConfig, appContext?: AppContext ) => NotificationReturn` | `-` | | remove | 清除对应 `id` 的提醒框 | `(id: string) => void` | `-` | | clear | 清除全部提醒框 | `(position?: NotificationPosition) => void` | `-` | ### NotificationConfig | 参数名 | 描述 | 类型 | 默认值 | 版本 | | ---------------- | --------------------------- | ---------------------------------------------------- | :-----: | :----- | | content | 内容 | `RenderContent` | `-` | | | title | 标题 | `RenderContent` | `-` | | | icon | 图标 | `RenderFunction` | `-` | | | id | 唯一id | `string` | `-` | | | style | 样式 | `CSSProperties` | `-` | | | class | 样式类名 | `ClassName` | `-` | | | position | 通知自身在可视区域中的物理角落,默认 top-right;四角使用上下在前的 kebab-case 拼写 | `'top-left'\|'top-right'\|'bottom-left'\|'bottom-right'` | `top-right` | | | showIcon | 是否显示图标 | `boolean` | `true` | | | closable | 是否可关闭 | `boolean` | `false` | | | duration | 显示的持续时间,单位为 `ms` | `number` | `3000` | | | footer | 底部内容 | `RenderFunction` | `-` | 2.25.0 | | closeIcon | 关闭按钮图标 | `RenderFunction` | `-` | | | closeIconElement | 关闭按钮元素 | `RenderFunction` | `-` | | | onClose | 关闭时的回调函数 | `(id: number \| string) => void` | `-` | | ### NotificationReturn | 参数名 | 描述 | 类型 | 默认值 | | ------ | ------------------ | ------------ | :----: | | close | 关闭当前通知提醒框 | `() => void` | `-` | ### 类型定义 组件导出以下类型定义 ```ts import type { NotificationInstance, NotificationConfig, NotificationReturn } from '@cedar-design/ui' ``` ## 公开 CSS 变量 面板使用 surface-overlay,正文/标题使用 content-primary,关闭按钮使用 content-secondary,边框使用 border-default。状态图标使用可读 content 状态色;info 不再引用品牌填充色,loading 使用 content-brand。颜色变量按状态分组;自定义背景须同时检查内容、图标与关闭按钮。纯文本 action/footer 继承面板正文色;自带样式的插槽内容由业务负责。 wrapper-* 控制列表位置/留白;padding-*、margin-* 控制面板布局;icon-*、title-*、content-* 控制各部分排版;close-* 控制关闭按钮;border-*、box-shadow 控制边框/阴影;transition-* 控制动效;z-index 控制层级。本阶段保留几何与动效默认值。下表列出实际声明,未声明所有历史几何变量均已验证消费。 | 变量 | 默认值 | | --- | --- | | `--c-notification-wrapper-margin-top` | `var(--c-spacing-8)` | | `--c-notification-wrapper-margin-bottom` | `var(--c-spacing-8)` | | `--c-notification-wrapper-margin-left` | `var(--c-spacing-8)` | | `--c-notification-wrapper-margin-right` | `var(--c-spacing-8)` | | `--c-notification-z-index` | `var(--c-z-index-notification)` | | `--c-notification-border-radius` | `var(--c-border-radius-md)` | | `--c-notification-margin-bottom` | `var(--c-spacing-8)` | | `--c-notification-width` | `300px` | | `--c-notification-padding-top` | `var(--c-spacing-8)` | | `--c-notification-padding-bottom` | `var(--c-spacing-8)` | | `--c-notification-padding-left` | `var(--c-spacing-8)` | | `--c-notification-padding-right` | `var(--c-spacing-8)` | | `--c-notification-icon-font-size` | `24px` | | `--c-notification-title-font-size` | `var(--c-font-size-title-1)` | | `--c-notification-title-font-weight` | `var(--c-font-weight-500)` | | `--c-notification-content-font-size` | `var(--c-font-size-body-3)` | | `--c-notification-icon-margin-right` | `var(--c-spacing-7)` | | `--c-notification-title-margin-bottom` | `var(--c-spacing-2)` | | `--c-notification-footer-margin-top` | `var(--c-spacing-7)` | | `--c-notification-box-shadow` | `0 4px 12px rgba(0, 0, 0, 0.15)` | | `--c-notification-border-width` | `1px` | | `--c-notification-border-style` | `solid` | | `--c-notification-close-icon-color` | `var(--c-sys-color-content-secondary)` | | `--c-notification-close-icon-font-size` | `12px` | | `--c-notification-close-icon-top` | `var(--c-spacing-6)` | | `--c-notification-close-icon-right` | `var(--c-spacing-6)` | | `--c-notification-close-icon-hover-size` | `20px` | | `--c-notification-normal-bg` | `var(--c-sys-color-surface-overlay)` | | `--c-notification-normal-icon-color` | `var(--c-sys-color-content-primary)` | | `--c-notification-normal-title-color` | `var(--c-sys-color-content-primary)` | | `--c-notification-normal-content-color` | `var(--c-sys-color-content-primary)` | | `--c-notification-normal-border-color` | `var(--c-sys-color-border-default)` | | `--c-notification-info-bg` | `var(--c-sys-color-surface-overlay)` | | `--c-notification-info-icon-color` | `var(--c-sys-color-content-info)` | | `--c-notification-info-title-color` | `var(--c-sys-color-content-primary)` | | `--c-notification-info-content-color` | `var(--c-sys-color-content-primary)` | | `--c-notification-info-border-color` | `var(--c-sys-color-border-default)` | | `--c-notification-success-bg` | `var(--c-sys-color-surface-overlay)` | | `--c-notification-success-icon-color` | `var(--c-sys-color-content-success)` | | `--c-notification-success-title-color` | `var(--c-sys-color-content-primary)` | | `--c-notification-success-content-color` | `var(--c-sys-color-content-primary)` | | `--c-notification-success-border-color` | `var(--c-sys-color-border-default)` | | `--c-notification-warning-bg` | `var(--c-sys-color-surface-overlay)` | | `--c-notification-warning-icon-color` | `var(--c-sys-color-content-warning)` | | `--c-notification-warning-title-color` | `var(--c-sys-color-content-primary)` | | `--c-notification-warning-content-color` | `var(--c-sys-color-content-primary)` | | `--c-notification-warning-border-color` | `var(--c-sys-color-border-default)` | | `--c-notification-error-bg` | `var(--c-sys-color-surface-overlay)` | | `--c-notification-error-icon-color` | `var(--c-sys-color-content-danger)` | | `--c-notification-error-title-color` | `var(--c-sys-color-content-primary)` | | `--c-notification-error-content-color` | `var(--c-sys-color-content-primary)` | | `--c-notification-error-border-color` | `var(--c-sys-color-border-default)` | | `--c-notification-transition-duration` | `var(--c-transition-duration-2)` | | `--c-notification-transition-duration-enter` | `var(--c-transition-duration-4)` | | `--c-notification-transition-duration-leave` | `var(--c-transition-duration-3)` | | `--c-notification-transition-timing-function` | `var(--c-transition-timing-function-linear)` | | `--c-notification-transition-timing-function-enter` | `var(--c-transition-timing-function-overshoot)` | | `--c-notification-transition-timing-function-leave` | `var(--c-transition-timing-function-standard)` | Teleport 后主题变量按实际 DOM 祖先继承;放在内容内部的变量不会向上传到服务创建的容器。 close/closed 通知回调抛错不会保留已关闭项目或空管理器宿主,资源清理独立于通知回调执行。 --- Document: llms/zh-CN/components/overflow-list.md # OverflowList ## 基础示例 ### 基础用法 折叠列表的基本使用方法。 Example source: src/overflow-list/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 折叠方向 通过 `from` 属性可以设置折叠的方向。 Example source: src/overflow-list/__demos__/from.vue ```vue ``` ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------ | ------------------ | ------------------ | :-----: | | min | 最少展示的元素个数 | `number` | `0` | | margin | 项目间隔 | `number` | `8` | | from | 折叠方向 | `'start' \| 'end'` | `'end'` | ### `` Events | 事件名 | 描述 | 参数 | | ------ | ------------------ | --------------- | | change | 溢出数量改变时触发 | value: `number` | ### `` Slots | 插槽名 | 描述 | 参数 | | -------- | :------: | ---------------- | | overflow | 折叠元素 | number: `number` | ### 类型定义 组件导出以下类型定义 ```ts import type { BadgeInstance } from '@cedar-design/ui' ``` --- Document: llms/zh-CN/components/overlay.md # Overlay 背景层 用于在页面内容上方创建背景层,并可承载需要强调的内容。 ## 基础示例 ### 基本使用 通过 `v-model:open` 控制显示状态。默认点击背景区域或按 Escape 会关闭;点击默认插槽内容不会关闭。 Example source: src/overlay/__demos__/basic.vue ```vue ``` ## API ### Props | 参数 | 说明 | 类型 | 默认值 | | ------------------ | -------------------------------------------- | -------------------------------- | -------- | | `v-model:open` | 是否显示 | `boolean` | `false` | | `default-open` | 非受控模式下是否默认显示 | `boolean` | `false` | | `overlay-closable` | 点击背景区域是否关闭 | `boolean` | `true` | | `lock-scroll` | 是否锁定挂载容器滚动 | `boolean` | `true` | | `unmount-on-close` | 关闭后是否卸载插槽内容 | `boolean` | `true` | | `esc-to-close` | 是否按 Escape 关闭 | `boolean` | `true` | | `popup-container` | Teleport 挂载位置;`false` 表示原地渲染 | `string \| HTMLElement \| false` | `'body'` | | `z-index` | 自定义层级 | `number` | `-` | ### Events | 事件名 | 说明 | 参数 | | ------------- | ------------ | --------------- | | `update:open` | 显示状态变化 | `boolean` | | `open` | 开始打开 | `-` | | `opened` | 打开动画结束 | `-` | | `close` | 开始关闭 | `-` | | `closed` | 关闭动画结束 | `-` | | `click` | 点击背景区域 | `MouseEvent` | | `key-escape` | 按下 Escape | `KeyboardEvent` | ### Slots | 插槽名 | 说明 | | --------- | ---------------- | | `default` | 背景层上方的内容 | ## 公开 CSS 变量 以下为实际 :root 默认值。业务定制优先使用组件变量;内部定位变量不属于公开 API。 | 变量 | 默认值 | 意义与场景 | | --- | --- | --- | | `--c-overlay-background-color` | `var(--c-sys-color-scrim)` | 仅遮罩背景,不影响前景内容透明度 | | `--c-overlay-animation-duration` | `var(--c-sys-motion-duration-slow)` | 组件入退场时长;reduced-motion 可覆盖 | | `--c-overlay-content-z-index` | `var(--c-sys-layer-raised)` | 内容高于遮罩的局部层级 | ### 减少动态效果 内置 CSS 过渡遵循 `prefers-reduced-motion: reduce`。关闭过渡不改变最终显隐、选中/展开状态及事件语义;插槽内自定义动画由应用自行控制。 --- Document: llms/zh-CN/components/page-header.md # PageHeader 页头 返回按钮只派发 `back` 事件,不自动调用路由或浏览器历史。示例通过 Message 显示通知;真实返回目的地由调用方处理。原生按钮支持点击、Enter 和空格。 展示当前页面的标题、上下文和相关操作。API 参照 Naive UI;组件不负责固定定位、背景等业务布局与皮肤能力,可通过 `class` / `style` 实现。 ## 基础示例 ### 基础用法 使用 Card 承载页头、Space 排列操作。桌面端将标题、副标题和右侧“关注”“创建任务”横向展示,点击操作查看消息反馈。 Example source: src/page-header/__demos__/basic.vue ```vue ``` ## 内容与展示 ### 面包屑与透明表面 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `title` | 页头的主标题 | 面包屑与透明表面、完整结构 | | `subtitle` | 页头的次标题 | 面包屑与透明表面、完整结构 | | `show-back` | 是否显示返回按钮 | 完整结构 | 比较面包屑导航和透明背景下的标题层级;完整业务内容另见独立案例。
配置说明与使用限制 #### 页头上方内容 使用 Card 承载页头,通过 `header` 插槽在标题上方展示面包屑,区分页面路径与当前页面信息。 #### 透明底色 页头默认透明。使用 Card 的 `tonal` 变体提供底色,展示页头自然融入外层表面,无需自定义背景样式。
Example source: src/page-header/__demos__/surface-comparison.vue ```vue ``` ### 完整结构 使用 Card 承载页头,通过 Space、Row / Col、Descriptions、Grid、Statistic 和 Divider 组合项目资料、统计和底部信息,无需自定义样式。桌面端标题与操作横向排列,资料和统计随栅格断点换行。 Example source: src/page-header/__demos__/content.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。返回按钮位于阅读起点,默认返回图形在 RTL 下指向右侧。标题、副标题与扩展区沿阅读顺序排列;自定义返回插槽不自动镜像。 ## API ### PageHeader Props | 属性 | 说明 | 类型 | 默认值 | | -------- | ---------------- | --------- | ------- | | show-back | 是否显示返回按钮 | `boolean` | `false` | | title | 页头的主标题 | `string` | `-` | | subtitle | 页头的次标题 | `string` | `-` | | extra | 右侧附加内容 | `string` | `-` | ### PageHeader Events | 事件名 | 说明 | 参数 | | ------ | ------------------ | -------------- | | back | 点击返回按钮时触发 | event: `Event` | ### PageHeader Slots | 插槽名 | 说明 | 参数 | | -------- | -------------- | ---- | | header | 页头上方内容 | - | | back | 自定义返回图标 | - | | avatar | 头像 | - | | title | 主标题 | - | | subtitle | 次标题 | - | | extra | 右侧额外内容 | - | | default | 页头正文内容 | - | | footer | 页头底部内容 | - | ## 类型定义 ```ts import type { PageHeaderProps } from '@cedar-design/ui' ``` ## 同源实现与平台边界 两端各自保存完整源码,不引用公共核心,不共享组件实例或响应式状态;修改时同步维护两份实现。主体、Props、关键样式及配对测试纳入只读源码一致性检查,主题 token 和安装入口各自维护。 返回按钮统一使用原生 button,支持键盘触发并派发 back(MouseEvent)。Cedar 内部类名由 c-page-header-xxx 调整为 c-page-header__xxx;图标资源仍由本库提供。 ### 返回交互变量 `--c-page-header-back-hover-size`(30px)控制反馈圆尺寸,不推动标题布局;`--c-page-header-back-hover-bg`(`var(--c-sys-color-state-hover)`)控制反馈背景。hover 仅应用于支持悬停的精细指针,所有输入模式均保留键盘 focus-visible 反馈。 --- Document: llms/zh-CN/components/pagination.md # Pagination 两端统一 API、交互与演示,支持按容器宽度自适应布局。 ## 基础示例 ### 基础与双向绑定 Example source: src/pagination/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 五档尺寸与阴影 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `total` | 数据总数(必填) | 五档尺寸与阴影、禁用与单页隐藏 | | `show-page-size` | 显示条数选择器 | 五档尺寸与阴影、禁用与单页隐藏 | | `show-jumper` | 完整模式显示独立跳转框;简洁模式已有页码输入 | 五档尺寸与阴影、禁用与单页隐藏 | | `size` | 所有内部控件尺寸 | 五档尺寸与阴影 | | `elevation` | 页码按钮阴影;true 使用 2 级 | 五档尺寸与阴影 | | `disabled` | 禁用所有交互 | 禁用与单页隐藏 | Example source: src/pagination/__demos__/size.vue ```vue ``` ### 禁用与单页隐藏 Example source: src/pagination/__demos__/disabled.vue ```vue ``` ## 分页模式与信息 ### 简洁模式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `total` | 数据总数(必填) | 简洁模式、更多页码与省略跳转、总数、每页条数与跳页 | | `show-total` | 显示总数 | 简洁模式、总数、每页条数与跳页 | | `show-page-size` | 显示条数选择器 | 简洁模式、总数、每页条数与跳页 | | `responsive` | 按容器宽度自动切换简洁模式 | 更多页码与省略跳转、总数、每页条数与跳页 | | `simple` | 显式启用简洁模式 | 简洁模式 | | `default-value` | 非受控初始页码 | 更多页码与省略跳转 | Example source: src/pagination/__demos__/simple.vue ```vue ``` ### 更多页码与省略跳转 Example source: src/pagination/__demos__/more-page-size.vue ```vue ``` ### 总数、每页条数与跳页 比较三种分页附加能力。更改页码或每页条数时观察对应输出,数据总数与自动修正另行说明。 Example source: src/pagination/__demos__/auxiliary-controls-comparison.vue ```vue ``` ## 条数、跳转与按钮 ### 自定义分页按钮与样式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `total` | 数据总数(必填) | 自定义分页按钮与样式 | | `default-value` | 非受控初始页码 | 自定义分页按钮与样式 | | `buffer-size` | 当前页两侧的页码数 | 自定义分页按钮与样式 | | `responsive` | 按容器宽度自动切换简洁模式 | 自定义分页按钮与样式 | | `page-item-style` | 数字页码基础样式 | 自定义分页按钮与样式 | | `active-page-item-style` | 叠加到当前数字页码的样式 | 自定义分页按钮与样式 | Example source: src/pagination/__demos__/custom-page-button.vue ```vue ``` ## 响应式与数据变化 ### 容器宽度与窄屏布局 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `total` | 数据总数(必填) | 容器宽度与窄屏布局、数据变化与自动调整、完整功能交互 | | `show-total` | 显示总数 | 容器宽度与窄屏布局、数据变化与自动调整、完整功能交互 | | `show-page-size` | 显示条数选择器 | 容器宽度与窄屏布局、数据变化与自动调整、完整功能交互 | | `show-jumper` | 完整模式显示独立跳转框;简洁模式已有页码输入 | 容器宽度与窄屏布局、完整功能交互 | | `responsive` | 按容器宽度自动切换简洁模式 | 容器宽度与窄屏布局 | | `auto-adjust` | 条数变化时保留首条位置;总数减少时修正越界页码 | 数据变化与自动调整 | Example source: src/pagination/__demos__/responsive.vue ```vue ``` ### 数据变化与自动调整 Example source: src/pagination/__demos__/auto-adjust.vue ```vue ``` ### 完整功能交互 Example source: src/pagination/__demos__/all.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。页码与上一页/下一页含义保持不变,默认前后图形跟随阅读方向。输入页码、禁用边界和选择不因方向切换而改变;自定义图形插槽由业务决定方向。 ## API 主值使用普通 `v-model`:`modelValue` 表示当前页码,从 1 开始;pageSize 仍独立控制每页条数。`defaultValue` 仅在创建时初始化非受控状态,之后修改不会重置当前值;初始化不触发 `update:modelValue`。提供 `modelValue` 时由父级控制,以受控值为准。 ### Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | total | 数据总数(必填) | `number` | `—` | | model-value | 当前页码,支持 v-model | `number` | `—` | | default-value | 非受控初始页码 | `number` | `1` | | page-size | 每页条数,支持 v-model:page-size | `number` | `—` | | default-page-size | 非受控初始条数 | `number` | `10` | | disabled | 禁用所有交互 | `boolean` | `false` | | hide-on-single-page | 不足两页时隐藏 | `boolean` | `false` | | simple | 显式启用简洁模式 | `boolean` | `false` | | show-total | 显示总数 | `boolean` | `false` | | show-more | 完整模式追加向后跳页按钮 | `boolean` | `false` | | show-jumper | 完整模式显示独立跳转框;简洁模式已有页码输入 | `boolean` | `false` | | show-page-size | 显示条数选择器 | `boolean` | `false` | | page-size-options | 正整数条数选项 | `number[]` | `[10, 20, 30, 40, 50]` | | page-size-props | 可选的条数 Select 受限配置;placement 默认 bottom-start,经 Select.triggerProps 交给 Trigger 自动定位;不能覆盖分页值、选项和尺寸 | `PaginationPageSizeProps` | `—` | | size | 所有内部控件尺寸 | `'xs' / 'sm' / 'md' / 'lg' / 'xl'` | `'md'` | | page-item-style | 数字页码基础样式 | `CSSProperties` | `—` | | active-page-item-style | 叠加到当前数字页码的样式 | `CSSProperties` | `—` | | base-size | 完整模式省略阈值的基础数 | `number` | `6` | | buffer-size | 当前页两侧的页码数 | `number` | `2` | | elevation | 页码按钮阴影;true 使用 2 级 | `boolean / number` | `false` | | responsive | 按容器宽度自动切换简洁模式 | `boolean` | `true` | | compact-breakpoint | 简洁模式的最大容器宽度,单位 px | `number` | `480` | | auto-adjust | 条数变化时保留首条位置;总数减少时修正越界页码 | `boolean` | `true` | ### Events | Event | Description | Arguments | | --- | --- | --- | | update:model-value | 请求更新页码 | `number` | | change | 页码提交变化(与 update:modelValue 成对) | `number` | | update:page-size | 请求更新条数 | `number` | | page-size-change | 条数提交变化(与 update:page-size 成对) | `number` | ### Slots | Slot | Description | Scope | | --- | --- | --- | | total | 总数 | `{ total: number }` | | page-item | 数字页码 | `{ page: number }` | | page-item-step | 上一页、下一页 | `{ type: 'previous' / 'next' }` | | page-item-ellipsis | 省略跳转按钮 | `—` | | jumper-prepend | 独立跳转框前缀 | `—` | | jumper-append | 独立跳转框后缀 | `—` | ### Methods | Method | Description | | --- | --- | ## 行为说明 容器宽度不超过 `compact-breakpoint` 时自动使用简洁模式;桌面侧栏与移动端规则相同。保留总数和条数选择器,辅助控件换行,上一页、下一页按钮跟随 size,不再在窄屏强制放大(默认 36px)。设置 `responsive=false` 保留完整页码,极窄时仅页码列表横向滚动,不撑宽页面。 简洁模式的当前页输入框承担跳转功能,不重复展示独立 jumper。`page-item`、`page-item-ellipsis`、`jumper-prepend`、`jumper-append` 仅在完整模式的对应控件中渲染。 页码按钮支持 Tab、Enter、Space,当前页使用 `aria-current=page`。跳转框使用数字键盘提示,Enter 或失焦提交;空值、非数字、小数不跳转,整数越界限制到有效页码。禁用状态阻止所有提交。 `auto-adjust` 在条数改变时尽量保留原页面首条数据的位置,总数减少时限制到最后一页,零条数据时页码回到 1。受控模式只发出更新请求,显示由父组件决定;父组件同一批更新明确设置 modelValue 时优先遵循该值。 完整模式和简洁模式的“前往”输入框均显示当前页码。点击翻页、外部更新 modelValue 或切换每页条数触发页码调整时同步回显;非法输入恢复为当前页码。 ### PaginationPageSizeProps 每页条数选择器按已选文字与下拉箭头自适应宽度,两者之间仅保留条目间距,切换选项或语言时自动更新。可通过 `--c-pagination-select-width` 自定义宽度。弹出菜单仍按选项内容独立计算宽度。 两端支持相同配置:`disabled?: boolean`、`placement?: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end'`、`popupContainer?: string | HTMLElement | false`、`class?: string`、`style?: CSSProperties`。外层 disabled 优先。默认 placement 为 bottom-start。 此配置不再透传任意 SelectProps/MenuProps。分页值、选项和尺寸分别使用 page-size、page-size-options、size。 ## 类型定义 ```ts import type { PaginationProps, PaginationInstance, PaginationPageSizeProps } from '@cedar-design/ui' ``` ## 样式变量 | Token | Default | | --- | --- | | `--c-pagination-text-color` | `var(--c-color-text-1)` | | `--c-pagination-font-size` | `var(--c-sys-font-size-md)` | | `--c-pagination-gap` | `var(--c-sys-space-5)` | | `--c-pagination-item-gap` | `var(--c-sys-space-2)` | | `--c-pagination-focus-space` | `3px` | | `--c-pagination-size-xs` | `24px` | | `--c-pagination-size-sm` | `28px` | | `--c-pagination-size-md` | `36px` | | `--c-pagination-size-lg` | `44px` | | `--c-pagination-size-xl` | `52px` | | `--c-pagination-item-padding` | `var(--c-sys-space-4)` | | `--c-pagination-item-border-radius` | `var(--c-sys-radius-md)` | | `--c-pagination-icon-size` | `16px` | | `--c-pagination-input-width` | `32px` | | `--c-pagination-select-width` | `max-content` | | `--c-pagination-touch-size` | `44px` | | `--c-pagination-focus-width` | `2px` | | `--c-pagination-focus-offset` | `1px` | | `--c-pagination-focus-color` | `var(--c-color-primary)` | | `--c-pagination-item-background` | `transparent` | | `--c-pagination-hover-background` | `var(--c-color-fill-1)` | | `--c-pagination-active-background` | `var(--c-color-primary-light-1)` | | `--c-pagination-active-color` | `var(--c-color-primary)` | | `--c-pagination-disabled-color` | `var(--c-color-text-4)` | | `--c-pagination-disabled-background` | `var(--c-color-fill-1)` | ### 方位语义与配置入口 普通使用无需配置方位:默认 bottom-start,空间不足时底层 Trigger 自动翻转和约束。pageSizeProps.placement 仅是条数 Select 的受限覆盖入口,链路为 Pagination → Select.triggerProps.placement → Trigger;不是分页器自身位置。 --- Document: llms/zh-CN/components/palette.md # 色板 Palette ### 介绍 Cedar 色阶以 CSS 变量提供,前缀一律 `--c-*`(与 Maple 的 `--mp-*` 同构)。 业务页优先用 [颜色 Color](llms/zh-CN/components/style/color.md) 语义工具类(如 `c-text-1` / `c-fill-2`);需要精细色阶或主题覆盖时再直接引用色阶变量。 完整色阶见 `style/color/css-variables.less`,语义见 `style/theme/css-variables.less`;暗色由 `:root[cedar-theme=dark]` 覆盖。 ### 功能色阶(1–10) 通道值为 `R, G, B`,使用时包一层 `rgb()` / `rgba()`: ```css color: rgb(var(--c-primary-6)); background: rgba(var(--c-primary-6), 0.12); ``` ```html
primary-6
success-6
``` 定制主色示例: ```css :root { --c-brand-6: 0, 190, 190; --c-brand-5: 55, 209, 204; --c-brand-7: 14, 153, 158; } ``` `--c-primary-*` 映射到 `--c-brand-*`,覆盖 brand 色阶即可联动主色。更多见 [主题定制](llms/zh-CN/guide/theme.md)。 ## 基础示例 ### 色阶预览 Example source: src/style/palette/__demos__/colors.vue ```vue ``` --- Document: llms/zh-CN/components/paper.md # Paper 基础表面 Paper 是承载内容的底层表面:背景、圆角、可选边框与阴影。不提供 variant、status、标题或内容结构,不添加默认内边距。需要完整卡片结构时使用 Card;只需要布局时使用 div 或 Space。 适用于自定义面板、表单分区、侧栏底板以及弹层内部表面。Paper 不负责弹层定位、焦点管理,也不会自动赋予按钮语义。交互内容请使用 Button 等语义组件。 ```html 基础边框 边框与阴影独立 ``` ## 基础示例 ### 演示 Example source: src/paper/__demos__/basic.vue ```vue ``` 内置动效遵循 prefers-reduced-motion: reduce:保留内容与状态反馈,关闭装饰性旋转、扫光和波纹。Icon 名称切换跳过等待,并取消尚未结束的切换。Ripple 时长变量只控制 CSS,250ms 生命周期计时未改变,每段视觉时长应不超过 250ms;自定义动画类由调用方负责适配。 ## 交互与控制 ### 动态属性 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `bordered` | 显示边框,与 elevation 独立 | 动态属性 | | `round` | 50% 圆角;宽高相等时为圆形 | 动态属性 | | `radius` | 圆角,显式值优先于 round | 动态属性 | | `elevation` | false 关闭;true 使用 2 级;数字为 0–24 | 动态属性 | | `width` | 宽度 | 动态属性 | | `height` | 高度 | 动态属性 | 边框与阴影独立切换;显式 radius 优先于 round,取消显式值后恢复圆形。Paper 不提供按钮语义,示例在内部使用原生按钮,并由父级统计冒泡的 click。 Example source: src/paper/__demos__/live-properties.vue ```vue ``` ## API ### Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | bordered | 显示边框,与 elevation 独立 | boolean | false | | elevation | false 关闭;true 使用 2 级;数字为 0–24 | boolean / number | false | | ripple | 启用水波效果,不自动赋予按钮语义 | boolean | false | | radius | 圆角,显式值优先于 round | number / string | — | | width | 宽度 | number / string | — | | height | 高度 | number / string | — | | round | 50% 圆角;宽高相等时为圆形 | boolean | false | | inline | 使用 inline-flex | boolean | false | radius、width、height 的数字和数字字符串使用 px,其他字符串按 CSS 长度传递,例如 1rem、50%、calc(100% - 8px)。类名、原生属性和自定义样式透传到根容器。 ### Events | 事件 | 说明 | 参数 | | --- | --- | --- | | click | 点击时触发一次 | MouseEvent | ### Slots | 插槽 | 说明 | | --- | --- | | default | 表面内部内容 | ### 样式变量 | 变量 | 默认值 | | --- | --- | | --c-paper-background | `var(--c-sys-color-surface-default)` | | --c-paper-border-radius | `4px` | | --c-paper-border-width | `1px` | | --c-paper-border-color | `var(--c-sys-color-border-default)` | | --c-paper-transition-duration | `var(--c-sys-motion-duration-slow)` | 内置主题可覆盖背景和圆角。bordered=false 不占边框空间,开启后使用 border-box;固定宽高包含边框。背景、边框和阴影彼此独立。 ### 类型 ```ts import type { PaperProps, PaperInstance } from '@cedar-design/ui' ``` ## 独立同源维护 两端分别保存主体、Props、样式、token 和契约测试,只调整前缀及本地导入;不引用跨库核心,不共享组件实例或状态。 Maple 迁移说明:默认背景改为主题表面色,默认不再显示手形光标;inline 内部类改为 mp-paper--inline。原有尺寸、圆角、阴影与水波 API 保留。 --- Document: llms/zh-CN/components/people-select.md # PeopleSelect 人员选择 `options` 接收人员数组或加载函数,组件内部管理等待、取消与过期结果;`fallback-option` 同步读取独立的响应式回显数据,异步查询完成后更新该数据即可回显。头像由 `avatar` 提供。组件提供可选的电话、聊天图标,拨号、聊天和权限仍由业务实现。 ## 全局默认属性与局部覆盖 ```ts import { PeopleSelect, type PeopleSelectProps } from "@cedar-design/ui"; PeopleSelect.setPropsDefaults({ options: (query, { signal }) => peopleService.search(query, signal), fallbackOption: (id) => personCache.value[id] ?? { value: id, label: id }, showPhone: true, showChat: true, call: (person) => businessPhone.call(person.mobile), chat: (person) => businessChat.open(person.value), } satisfies PeopleSelectProps); ``` ```vue ``` 局部属性优先于全局默认。图标只在阅读态展示;默认 show-phone/show-chat 为 false。启用显示但没有处理函数时,按钮禁用;未选人员、禁用状态也不能触发动作。函数返回 Promise 时按钮自动等待,失败触发 action-error(error, call|chat)。组件不自动打开 tel: 链接,也不包含聊天 SDK。业务需要独立处理读取权限与操作权限时,可覆盖操作区域。 setPropsDefaults 在挂载前配置一次,修改组件定义的默认属性;不是按应用或租户隔离的上下文。SSR 不应逐请求修改,动态页面/租户配置推荐封装业务组件并透传 props。 ## 自定义操作区域 ```vue ``` 操作区域优先级:actions 插槽 → render-actions → 内置电话/聊天按钮。它们均不会触发字段编辑或更改已选人员。 ## 基础示例 ### 完整业务示例 Example source: src/people-select/__demos__/injected-services.vue ```vue ``` ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 | 属性 | 说明 | 默认值 | | ----------------------- | ------------------------------------------------ | ------ | | v-model / default-value | 字符串 ID,null 表示显式清空 | — / '' | | options | 人员数组,或 (query, { signal }) => 数组/Promise | — | | fallback-option | boolean / (id) => PeopleSelectOption | true | | show-avatar | 展示 avatar | true | | show-phone / show-chat | 阅读态电话 / 聊天图标 | false | | call / chat | (person) => void/Promise,由业务实现 | — | | render-actions | ({ person, disabled }) => VNodeChild | — | | is-label / read-pretty | 阅读态,仅解析已选人员,不加载候选 | false | | disabled / readonly | 省略继承表单状态 | — | | empty-value | 清空结果;可指定 null 或返回 null 的函数 | '' | 人员数据为 `{ value: string, label: string, avatar?: string, mobile?: string, disabled?: boolean }`。 signal 可选地传给 fetch 取消过期请求;不是 HTTP 参数,也不会回滚服务器操作。忽略 signal 时,组件仍隔离旧结果。函数结果默认不再本地二次过滤,filter-option 只配置本地匹配策略。 事件:update:model-value、change、clear、search、load-error(error, options)、action-error(error, call|chat)。实例方法:refresh()、focus()、blur()。无独立 request 属性,无需外部 useAsyncData 或专用 provider key。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 `fallback-option` 与候选 options 独立,不返回 Promise、不主动发请求。回显优先使用当前候选项,不存在时读取 fallback;传入 false 关闭未匹配值的回显。 ### 业务请求如何接收取消信号 组件为每次操作创建 AbortController,把 signal 传入加载函数。业务需要逐层透传给请求库。fetch 原生支持 AbortSignal;Axios 0.22+ 支持 signal;ofetch、Ky 会向底层 fetch 传递或合并这个信号。未支持的封装需要把 abort 事件适配到自己的取消方法。取消客户端请求不能回滚服务端已完成的操作。 ```ts async function loadPeople(query, { signal }) { const response = await fetch(`/api/people?q=${encodeURIComponent(query)}`, { signal, }); if (!response.ok) throw new Error("People request failed"); return response.json(); } // Axios: preserve signal through your service wrapper. async function loadWithAxios(query, { signal }) { const { data } = await axios.get("/api/people", { params: { q: query }, signal, }); return data; } // Other fetch wrappers: const loadWithOfetch = (query, { signal }) => ofetch("/api/people", { query: { q: query }, signal }); const loadWithKy = (query, { signal }) => ky.get("/api/people", { searchParams: { q: query }, signal }).json(); ``` [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) · [Axios cancellation](https://axios-http.com/docs/cancellation) · [ofetch](https://github.com/unjs/ofetch) · [Ky](https://github.com/sindresorhus/ky#cancellation) ### 共享字段加载 `loading-mode="line"` 使用 FieldDecorator 的共享加载线;默认模式保留本组件已有的加载展示。加载状态本身不隐式设置 disabled 或 readonly。 --- Document: llms/zh-CN/components/popconfirm.md # Popconfirm 点击元素,弹出气泡式的确认框。 ## 基础示例 ### 基础用法 点击按钮打开确认框;确认或取消后收起。示例只演示确认交互,不执行业务数据删除。 Example source: src/popconfirm/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 确认框类型 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `content` | 内容 | 确认框类型 | | `type` | 气泡确认框的类型 | 确认框类型 | 通过 `type` 属性可以设置确认框类型。 Example source: src/popconfirm/__demos__/type.vue ```vue ``` ## 布局与排列 ### 弹出位置 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `content` | 内容 | 弹出位置 | | `placement` | 浮层相对触发元素的首选方位,默认 top;启用默认的 auto-fit-position 时,空间不足会自动翻转并约束到可视区域,不保证最终停在该侧 | 弹出位置 | `popconfirm` 支持 12 个不同的方位。分别为:`上左` `上` `上右` `下左` `下` `下右` `左上` `左` `左下` `右上` `右` `右下`。 Example source: src/popconfirm/__demos__/placement.vue ```vue ``` ## 内容与展示 ### before 钩子与 done 兼容 `beforeConfirm(done) / beforeCancel(done)` 为统一入口,不新增另一套命名。 只记录日志的同步钩子应显式 return true;同步 undefined 表示仍在等待回调。注意:以前返回 `Promise` 却不调用 done 的异步钩子,现在会在 Promise 完成后放行。 Example source: src/popconfirm/__demos__/guard-protocol.vue ```vue ``` Promise 与 done 共用一次完成状态:`false` / `done(false)` 阻止,`true` / `done()` 允许;Promise<void> 正常完成允许。重复完成只生效一次,异常触发 guard-error,取消或卸载后迟到结果无效。此类关闭/确认回调同步返回 void 时保留原回调协议,等待 done。 守卫统一使用 `(payload, done, context)`:关闭 payload 为 `{ action }`,切换和提交为 `{ value, previousValue }`,Popup 为 `{ reason }`。context 提供 `signal` 和可选原始 `event`。返回 boolean/Promise,或调用 done()/done(false);同步 void 等待 done,Promise<void> 放行。首次完成生效。等待期间自动管理 loading/disabled,取消后旧结果失效,不暴露内部按钮 refs。 ## 自定义与插槽 ### 自定义按钮 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `content` | 内容 | 自定义按钮 | | `confirm-button-text` | 确认按钮的内容 | 自定义按钮 | | `cancel-text` | 取消按钮的内容 | 自定义按钮 | 自定义按钮的文字或图标。 Example source: src/popconfirm/__demos__/custom.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。内容与动作采用逻辑对齐,确认与取消顺序按阅读方向排列;方向切换不触发确认或取消,显式弹出方位仍沿用原有物理/逻辑约定。 ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | --------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | :------: | | content | 内容 | `string` | `-` | | placement | 浮层相对触发元素的首选方位,默认 top;启用默认的 auto-fit-position 时,空间不足会自动翻转并约束到可视区域,不保证最终停在该侧 | `'top' \| 'top-start' \| 'top-end' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left' \| 'left-start' \| 'left-end' \| 'right' \| 'right-start' \| 'right-end'` | `'top'` | | open **(v-model)** | 气泡确认框是否可见 | `boolean` | `-` | | default-open | 气泡确认框默认是否可见(非受控模式) | `boolean` | `false` | | type | 气泡确认框的类型 | `'info' \| 'success' \| 'warning' \| 'error'` | `'info'` | | confirm-button-text | 确认按钮的内容 | `string` | `-` | | cancel-text | 取消按钮的内容 | `string` | `-` | | confirm-button-loading | 确认按钮是否为加载中状态 | `boolean` | `false` | | confirm-button-props | 确认按钮的Props | `ButtonProps` | `-` | | cancel-button-props | 取消按钮的Props | `ButtonProps` | `-` | | content-class | 弹出框内容的类名 | `ClassName` | `-` | | content-style | 弹出框内容的样式 | `CSSProperties` | `-` | | arrow-class | 弹出框箭头的类名 | `ClassName` | `-` | | arrow-style | 弹出框箭头的样式 | `CSSProperties` | `-` | | popup-container | 弹出框的挂载点 | `string \| HTMLElement \| false` | `-` | | `before-confirm` | 返回 boolean/Promise 或调用 done;首次完成生效 | `PopconfirmBeforeConfirm` | — | | `before-cancel` | 返回 boolean/Promise 或调用 done;首次完成生效 | `PopconfirmBeforeConfirm` | — | ### `` Events | 事件名 | 描述 | 参数 | | -------------------- | ------------------------------ | ------------------ | | open-change | 气泡确认框的显隐状态改变时触发 | open: `boolean` | | confirm | 点击确认按钮时触发 | - | | cancel | 点击取消按钮时触发 | - | ### `` Slots | 插槽名 | 描述 | 参数 | | ------- | :--: | ---- | | icon | 图标 | - | | content | 内容 | - | ### 类型定义 组件导出以下类型定义 ```ts import type { PopconfirmInstance } from '@cedar-design/ui' ``` ### 方位语义与配置入口 placement 直接复用 TriggerPlacement / triggerPlacements;旧 TriggerPosition / TRIGGER_POSITIONS 别名已删除,方位值域不变。 ### 守卫等待反馈 before-* 等待期间显示加载反馈并标记 aria-busy;拒绝或失败后恢复,重复提交不再启动同一操作。普通事件返回的 Promise 不参与加载。 --- Document: llms/zh-CN/components/popover.md # Popover 气泡卡片 点击触发元素后展示结构化内容。Popover 可以包含按钮、表单和其他交互元素;纯文字说明使用 Tooltip。 ## 基础示例 ### 基础用法 Example source: src/popover/__demos__/basic.vue ```vue ``` ## 交互与控制 ### 交互内容与状态保留 Popover 默认 `unmount-on-close="false"`,关闭后保留表单草稿。 Example source: src/popover/__demos__/interactive.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`,支持运行时切换与局部覆盖。内容默认对齐阅读起点,弹层继承来源方向;逻辑 start/end 对齐随方向变化,显式 left/right 方位保持物理语义。 ## API Popover 继承 Trigger 的定位、容器、受控状态、关闭策略和公开方法。 | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | title | 标题 | `string` | — | | content | 正文 | `string` | — | | trigger | 触发方式 | `TriggerEvent \| TriggerEvent[]` | `click` | | placement | 浮层相对触发元素的首选方位,默认 bottom;启用默认的 auto-fit-position 时,空间不足会自动翻转并约束到可视区域,不保证最终停在该侧 | `TriggerPlacement` | `bottom` | | show-arrow | 是否显示箭头 | `boolean` | `true` | | popup-offset | 沿方位主轴的距离 | `number` | `10` | | unmount-on-close | 关闭后卸载内容;默认保留交互草稿 | `boolean` | `false` | | close-on-click-reference | 再次点击触发元素时关闭 | `boolean` | `true` | 事件为 `update:open`、`open-change`、`open`、`opened`、`close`、`closed`、`click-outside`。插槽为 `default`、`title` 和 `content`。属性内容与插槽同时存在时插槽优先。 实际面板包含统一的 content/title/body 三层。触发元素通过 `aria-controls`、`aria-expanded` 与面板关联;外部 reference 和 SVG 同样支持。 ## 同源约定 Cedar 与 Maple 独立保存同一份主体、Props、外观映射和结构样式。无样式定位场景直接使用 Trigger;Popover 不提供 `defaultStyle`、`popoverClass` 或 `elevation`,自定义外观使用组件 Token、`content-class` 或 `content-style`。 ## 公开 CSS 变量 以下为实际 :root 默认值。业务定制优先使用组件变量;内部定位变量不属于公开 API。 | 变量 | 默认值 | 意义与场景 | | --- | --- | --- | | `--c-popover-background` | `var(--c-sys-color-surface-overlay)` | 内容与箭头背景 | | `--c-popover-text-color` | `var(--c-sys-color-content-secondary)` | 正文前景 | | `--c-popover-border-color` | `var(--c-sys-color-border-default)` | 内容与箭头边框颜色 | | `--c-popover-border-width` | `1px` | 内容与箭头边框宽度 | | `--c-popover-border-radius` | `var(--c-sys-radius-md)` | 内容圆角 | | `--c-popover-box-shadow` | `var(--c-shadow2-down)` | 内容阴影,保留平台差异 | | `--c-popover-arrow-z-index` | `1` | 箭头在当前浮层内的堆叠层级 | | `--c-popover-padding-horizontal` | `var(--c-sys-space-7)` | 内容横向内边距 | | `--c-popover-padding-vertical` | `var(--c-sys-space-6)` | 内容纵向内边距 | | `--c-popover-font-size` | `var(--c-sys-font-size-md)` | 内容字号 | | `--c-popover-line-height` | `var(--c-line-height)` | 内容行高 | | `--c-popover-title-text-color` | `var(--c-sys-color-content-primary)` | 标题前景 | | `--c-popover-title-font-size` | `var(--c-sys-font-size-lg)` | 标题字号 | | `--c-popover-title-font-weight` | `var(--c-sys-font-weight-medium)` | 标题字重 | | `--c-popover-title-content-gap` | `var(--c-sys-space-2)` | 标题与正文间距 | | `--c-popover-animation-duration` | `var(--c-sys-motion-duration-standard)` | 组件入退场时长;reduced-motion 可覆盖 | Maple 暗色保留圆角 2px,阴影保留平台差异。内容与箭头共享背景/边框变量,不再受 Trigger 样式加载顺序影响。 使用 Teleport 时,变量需放在实际 popup 的作用域中(例如通过 `popup-style`);触发按钮上的变量不会自动继承到浮层。 --- Document: llms/zh-CN/components/progress-group.md # ProgressGroup 分段进度条 将多个数值展示为同一条进度轨中的分段,并提供对应图例。 ## 基础示例 ### 基础用法 `items` 中每项的 `value` 都以 `max` 为基准计算宽度,开启 `show-text` 可展示累计百分比。 Example source: src/progress-group/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 进度组尺寸与颜色 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `items` | 分段数据 | 进度组尺寸与颜色 | | `size` | 进度轨尺寸 | 进度组尺寸与颜色 | | `color` | 分段未指定颜色时使用的默认颜色 | 进度组尺寸与颜色 | | `show-text` | 是否展示累计百分比 | 进度组尺寸与颜色 | 比较同类分段数据的尺寸和颜色覆盖;方向、环形布局、总量溢出与键盘操作另行展示。
配置说明与使用限制 #### 尺寸 通过 `size` 设置进度轨粗细。 #### 颜色与纯进度轨 通过 `color` 统一设置默认颜色,也可以在每个 item 上覆盖;省略所有标签可隐藏图例。
Example source: src/progress-group/__demos__/appearance-comparison.vue ```vue ``` ## 布局与排列 ### 排列方向 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `items` | 分段数据 | 排列方向 | | `show-text` | 是否展示累计百分比 | 排列方向 | | `orientation` | 线形进度轨的横纵朝向,默认 horizontal;仅 mode=line 生效 | 排列方向 | | `size` | 进度轨尺寸 | 排列方向 | `orientation="vertical"` 可展示纵向分段进度条;纵向模式需要容器提供明确高度。 Example source: src/progress-group/__demos__/orientation.vue ```vue ``` ## 内容与展示 ### 环形分段进度 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `mode` | 展示模式 | 环形分段进度 | | `items` | 分段数据 | 环形分段进度 | | `show-text` | 是否展示累计百分比 | 环形分段进度 | | `circle-size` | 环形模式的直径 | 环形分段进度 | | `stroke-width` | 环形模式的轨道宽度 | 环形分段进度 | 设置 `mode="circle"` 展示分段圆环。通过 `circle-size` 控制直径,`stroke-width` 控制环宽,状态内容位于圆心。 Example source: src/progress-group/__demos__/circle.vue ```vue ``` ## 交互与控制 ### 超额数据与键盘提示 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `items` | 分段数据 | 超额数据与键盘提示 | | `max` | 所有分段计算占比时的总值 | 超额数据与键盘提示 | | `tooltip` | 是否启用分段悬浮/聚焦提示 | 超额数据与键盘提示 | | `show-text` | 是否展示累计百分比 | 超额数据与键盘提示 | | `aria-label` | 分组的无障碍名称 | 超额数据与键盘提示 | | `mode` | 展示模式 | 超额数据与键盘提示 | 示例按钮由父级更新 `max`、`items` 和 `tooltip`,同步驱动线形与环形;它们不是组件内置的编辑事件。可切换容量 100/200、清空/恢复数据、关闭/开启提示。关闭提示后分段不再进入 Tab 顺序,清空后不保留提示。鼠标悬浮优先于键盘焦点,离开悬浮段后回到焦点段提示。 Example source: src/progress-group/__demos__/overflow-keyboard.vue ```vue ``` 线形与环形按数据顺序累计裁剪到 max;图例和提示仍保留每项原始占比。例如 70+50 时第二段实际显示 30%,图例仍为 50%。非有限值和负数归零,非法 max 回退 100。Tab 聚焦可见分段展示提示,Escape 关闭;鼠标离开不会关闭仍处于焦点的提示。用 aria-label 为整个分组命名。 size 五档均实现,仅影响线形厚度(2/4/8/12/16px);环形用 circle-size(支持 number/CSS长度)和 stroke-width。累计文本开关为 show-text,自定义插槽为 text,已删除旧布尔 status / status 插槽。 使用 `text` 和 `item-trailing` 插槽自定义累计状态与图例尾部内容。 鼠标悬浮或键盘聚焦分段时会显示提示并加粗当前分段。item 的 `tip` 可覆盖默认文案,`tooltip` 插槽可完全自定义内容。 Example source: src/progress-group/__demos__/slots.vue ```vue ``` ## 阅读方向 横向分段、高亮与提示使用同一逻辑起点;垂直进度仍从上到下,圆环保持原有角度与数据顺序。 ## API ### Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | aria-label | 分组的无障碍名称 | `string` | — | | items | 分段数据 | `ProgressGroupItem[]` | `[]` | | mode | 展示模式 | `'line' \| 'circle'` | `'line'` | | max | 所有分段计算占比时的总值 | `number` | `100` | | show-text | 是否展示累计百分比 | `boolean` | `false` | | size | 进度轨尺寸 | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | | color | 分段未指定颜色时使用的默认颜色 | `string` | `content-brand` | | circle-size | 环形模式的直径 | `number \| string` | `120` | | stroke-width | 环形模式的轨道宽度 | `number` | `8` | | tooltip | 是否启用分段悬浮/聚焦提示 | `boolean` | `true` | | orientation | 线形进度轨的横纵朝向,默认 horizontal;仅 mode=line 生效 | `'horizontal' \| 'vertical'` | `'horizontal'` | ### Item | 属性 | 说明 | 类型 | | --- | --- | --- | | label | 图例名称 | `string` | | value | 分段数值 | `number` | | color | 分段颜色 | `string` | | icon | 图例图标组件 | `Component` | | slot | 自定义插槽名前缀 | `string` | | tip | 自定义提示文案 | `string` | ### Slots | 名称 | 插槽参数 | | --- | --- | | text | `{ percent, value, max }` | | tooltip | `{ item, index, percent }` | | item / item-leading / item-label / item-trailing | `{ item, index, percent }` | ### 样式变量 | 变量 | 默认值 | | --- | --- | | `--c-progress-group-gap` | `var(--c-sys-space-3)` | | `--c-progress-group-item-gap` | `var(--c-sys-space-2)` | | `--c-progress-group-dot-size` | `var(--c-sys-space-4)` | | `--c-progress-group-radius` | `9999px` | | `--c-progress-group-track-color` | `var(--c-sys-color-state-hover)` | | `--c-progress-group-text-color` | `var(--c-sys-color-content-primary)` | | `--c-progress-group-muted-color` | `var(--c-sys-color-content-secondary)` | | `--c-progress-group-font-size` | `var(--c-sys-font-size-sm)` | | `--c-progress-group-tooltip-bg` | `var(--c-sys-color-surface-tooltip)` | | `--c-progress-group-tooltip-color` | `var(--c-sys-color-content-on-dark)` | 图形标记默认使用 system content-brand。颜色优先级:item.color → 组件 color → 默认值。自定义颜色需自行验证对比度;几何 Token 保留平台差异。 ### Geometry and motion variables Built-in effects respect `prefers-reduced-motion: reduce`. Track thickness applies to both horizontal and vertical layouts; circle geometry remains prop-driven. | Token | Default | | --- | --- | | `--c-progress-group-transition-duration` | `var(--c-sys-motion-duration-standard)` | | `--c-progress-group-tooltip-duration` | `var(--c-sys-motion-duration-fast)` | | `--c-progress-group-tooltip-max-width` | `240px` | | `--c-progress-group-tooltip-padding` | `5px var(--c-sys-space-4)` | | `--c-progress-group-tooltip-radius` | `var(--c-sys-radius-md)` | | `--c-progress-group-tooltip-font-size` | `var(--c-sys-font-size-xs)` | | `--c-progress-group-tooltip-line-height` | `1.4` | | `--c-progress-group-tooltip-offset` | `var(--c-sys-space-4)` | | `--c-progress-group-text-font-weight` | `var(--c-sys-font-weight-medium)` | | `--c-progress-group-size-xs-thickness` | `2px` | | `--c-progress-group-size-sm-thickness` | `4px` | | `--c-progress-group-size-md-thickness` | `8px` | | `--c-progress-group-size-lg-thickness` | `12px` | | `--c-progress-group-size-xl-thickness` | `16px` | --- Document: llms/zh-CN/components/progress.md # Progress 进度条 展示确定或不确定任务进度。两端主体、API 与样式为独立同源代码。 ## 基础示例 ### 基础用法 Example source: src/progress/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 进度尺寸与状态 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `size` | 五档预设或自定义长度;线形厚度、环形直径 | 进度尺寸与状态 | | `percent` | 0–100 百分比,保留小数;支持十进制数字字符串,非法值归零,越界裁剪 | 进度尺寸与状态 | | `mode` | 线形或环形 | 进度尺寸与状态 | | `stroke-width` | 覆盖轨道厚度,数字按 px,字符串支持 CSS 长度 | 进度尺寸与状态 | | `status` | default/primary/secondary/tertiary/info/success/warning/danger;default 确定进度达到 100 时推导 success | 进度尺寸与状态 | 在相同进度范围内比较尺寸和状态色;环形、分段和不确定进度保留独立模型。 Example source: src/progress/__demos__/appearance-comparison.vue ```vue ``` ## 内容与展示 ### 环形进度 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `percent` | 0–100 百分比,保留小数;支持十进制数字字符串,非法值归零,越界裁剪 | 环形进度、分段进度、不确定进度与动画 | | `mode` | 线形或环形 | 环形进度、不确定进度与动画、渐变、起点、隐藏轨道与文本 | | `status` | default/primary/secondary/tertiary/info/success/warning/danger;default 确定进度达到 100 时推导 success | 环形进度、分段进度 | | `steps` | 仅线形的分段数,向下取整并限制为 0–1000;不确定模式忽略 | 分段进度 | | `size` | 五档预设或自定义长度;线形厚度、环形直径 | 分段进度 | | `indeterminate` | 不确定进度;省略 aria-valuenow,不自动推导成功 | 不确定进度与动画 | Example source: src/progress/__demos__/circle.vue ```vue ``` ### 分段进度 Example source: src/progress/__demos__/step.vue ```vue ``` ### 不确定进度与动画 Example source: src/progress/__demos__/loop.vue ```vue ``` ### 渐变、起点、隐藏轨道与文本 Example source: src/progress/__demos__/advanced.vue ```vue ``` ## 阅读方向 线性进度从阅读起点增长,活动与不确定进度动画沿阅读方向运动。百分比、数值和圆环角度不反转,减少动态效果的设置仍生效。 ## API ### Props | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | mode | 线形或环形 | `line \| circle` | `line` | | percent | 0–100 百分比,保留小数;支持十进制数字字符串,非法值归零,越界裁剪 | `number \| string` | `0` | | size | 五档预设或自定义长度;线形厚度、环形直径 | `ProgressSize` | `md` | | stroke-width | 覆盖轨道厚度,数字按 px,字符串支持 CSS 长度 | `number \| string` | 随 size | | steps | 仅线形的分段数,向下取整并限制为 0–1000;不确定模式忽略 | `number` | `0` | | status | default/primary/secondary/tertiary/info/success/warning/danger;default 确定进度达到 100 时推导 success | `ProgressStatus` | `default` | | color | 进度颜色或渐变 stop 映射,优先于 status | `string \| Record` | — | | track-color | 背景轨道颜色 | `string` | — | | buffer-color | 线形剩余轨道装饰色/渐变,不代表独立缓冲百分比 | `ProgressColor` | — | | track | 显示背景轨道;false 同时隐藏缓冲装饰层 | `boolean` | `true` | | show-text | 显示文本;xs 环形隐藏文本避免溢出 | `boolean` | `true` | | text-class | 文本容器类名 | `string` | — | | rotate | 环形起点从十二点顺时针旋转的角度 | `number` | `0` | | animation | 确定线形进度扫光动画,不应用于 steps | `boolean` | `false` | | indeterminate | 不确定进度;省略 aria-valuenow,不自动推导成功 | `boolean` | `false` | ### 尺寸语义 | size | xs | sm | md | lg | xl | | --- | --- | --- | --- | --- | --- | | 线形厚度 / 环形默认描边 (px) | 2 | 3 | 4 | 6 | 8 | | 环形直径 (px) | 16 | 48 | 64 | 80 | 96 | `size=12` / `size="12"` 表示 12px;`size="2rem"`、`"50%"`、`"calc(100% - 2px)"` 保留 CSS 长度。自定义线形 size 控制厚度,自定义环形 size 控制直径;stroke-width 始终优先控制厚度。非正数或非法长度回退 md。环形百分比直径需要父容器有明确宽度。五档均实际实现,xs 环形不显示文本。Cedar 未传 size 时继承 ConfigProvider,Maple 未传时默认 md。 ### Slots | 插槽 | 参数 | 说明 | | --- | --- | --- | | text | `{ percent: number }` | 优先级高于 default | | default | `{ percent: number }` | 自定义显示文本 | 不确定进度默认显示省略号,可用 text 插槽提供业务文案。组件本身不操作值、无更新事件;请提供 `aria-label` 标识业务任务。所有内置动画尊重系统减少动态效果设置。 ### 类型定义 导出 `ProgressProps`、`ProgressInstance`、`ProgressSize`、`ProgressMode`、`ProgressStatus`、`ProgressColor` 和运行时 `progressProps`。 ## 样式变量 | 变量 | 默认值 | | --- | --- | | `--c-progress-font-size` | `var(--c-sys-font-size-sm)` | | `--c-progress-text-color` | `var(--c-sys-color-content-secondary)` | | `--c-progress-track-color` | `var(--c-sys-color-state-hover)` | | `--c-progress-default-color` | `var(--c-sys-color-content-brand)` | | `--c-progress-primary-color` | `var(--c-sys-color-content-brand)` | | `--c-progress-secondary-color` | `var(--c-sys-color-content-secondary)` | | `--c-progress-tertiary-color` | `var(--c-sys-color-content-tertiary)` | | `--c-progress-info-color` | `var(--c-sys-color-content-info)` | | `--c-progress-success-color` | `var(--c-sys-color-content-success)` | | `--c-progress-warning-color` | `var(--c-sys-color-content-warning)` | | `--c-progress-danger-color` | `var(--c-sys-color-content-danger)` | | `--c-progress-line-border-radius` | `9999px` | | `--c-progress-text-gap` | `var(--c-sys-space-4)` | | `--c-progress-steps-gap` | `var(--c-sys-space-2)` | | `--c-progress-transition-duration` | `var(--c-sys-motion-duration-standard)` | | `--c-progress-animation-duration` | `1.5s` | 环形确定进度的 success/danger 默认显示完成/失败图标(包括 xs);text 插槽可覆盖,ARIA 数值始终保留。 --- Document: llms/zh-CN/components/radio.md # Radio 在一组相关且互斥数据中,用户仅能选择一个选项。 分组示例覆盖父级接受/拒绝更新、只读和异步选项回显;移除选项不会清空业务值。示例外层 Space 的纵向布局使用 `direction="column"`,与选择组自身的 `orientation="vertical"` 分开理解。 ## 阅读方向 单选组继承来源 dir。RTL 的左右方向键按可见方向移动,跳过禁用项;上下键、Home/End 保持逻辑顺序。普通与按钮式单选组均保留单一 Tab 入口,方向切换不修改已选业务值。 ## 基础示例 ### 基本使用 单选框的基本用法。 Example source: src/radio/__demos__/basic.vue ```vue ``` ## 分组与布局 ### 单选组声明方式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ---------- | ------------------------------- | ------------------------------------------------ | | `value` | 选项的`value` | 单选组声明方式、单选框组方向、按钮类型的单选框组 | | `disabled` | 是否禁用;未设置时继承表单/分组 | 单选组声明方式、布局 | 比较子项与 options 声明,选择不同项观察组值;自定义字段与异步数据仍单独展示。
配置说明与使用限制 #### 单选框组 通过`RadioGroup`组件展示单选框组 #### 单选框组选项 `RadioGroup`通过`options`属性设置子元素
Example source: src/radio/__demos__/group-declaration-comparison.vue ```vue ``` ### 单选框组方向 通过设置`orientation="vertical"`可以展示竖直的单选框组。 Example source: src/radio/__demos__/group-direction.vue ```vue ``` ### 按钮类型的单选框组 通过指定`variant="button"`,可以显示按钮类型的单选框组。 Example source: src/radio/__demos__/button-type.vue ```vue ``` ### 布局 使用`RadioGroup`传入`Radio`配合`Grid`组件实现灵活布局。 Example source: src/radio/__demos__/grid-layout.vue ```vue ``` ### 分组状态与只读 `model-value !== undefined` 表示受控,父级不回写时保留原值;`default-value` 只初始化非受控值。分组内只由 Group 发出 `update:model-value → change(value, event?)`,并通知 FormItem 一次,子项不重复发值变化事件。 原生输入的选中值、ARIA 状态和选中样式与模型保持一致。受控分组拒绝选择时,同时恢复原选中项和被点击项;标签、Enter 和空格激活各只提出一次更新。 Group 的 `disabled`、`readonly`、`error` 未设置时继承表单,显式 `false` 可以覆盖表单;子项不能绕过 Group 的禁用或只读限制。 Example source: src/radio/__demos__/group-state.vue ```vue ``` ### 按钮尺寸 两端均支持 `variant="button"`。RadioGroup 的 `size` 支持 `xs / sm / md / lg / xl`,只调整按钮高度;普通圆形 Radio 不随 size 缩放。未设置时继承表单/全局尺寸,最终默认为 md。Group 的 variant 优先于子项。 Example source: src/radio/__demos__/button-sizes.vue ```vue ``` ## 选项与值模型 ### 独立值模型与方法 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | ------------------------------- | ---------------------- | | `default-value` | 非受控初始值 | 独立值模型与方法、受控 | | `value` | 选项的`value` | 独立值模型与方法 | | `readonly` | 是否只读;未设置时继承表单/分组 | 独立值模型与方法 | | `disabled` | 是否禁用;未设置时继承表单/分组 | 独立值模型与方法 | Radio 的值为 string / number / boolean 或 null,null 表示未选中;重复点击已选项不会取消,父级可写 null 清空。 两端统一使用 `default-value` 初始化非受控值;受控提议被拒绝时保持原值。用户选择按 `update:model-value → change(value, event?)` 通知,命令式调用的 event 为 undefined。 提供 `select()`、`focus(options?)`、`blur()`。禁用禁止选择和聚焦,只读允许聚焦、禁止改值。Enter 按下与空格释放激活当前控件,长按不重复激活,失焦/停用会取消待处理的空格操作。 Example source: src/radio/__demos__/control-value.vue ```vue ``` ### 选项数据与标签 两端均支持原始值或对象选项。`field-names` 映射 `label/value/disabled/readonly/indeterminate`;只读选项允许聚焦但不能改值,Checkbox 的半选仅用于展示。 `label` 插槽接收 `{ data, checked }`,优先于标签渲染函数 `(data, checked) => VNodeChild`。data 为保留业务字段的归一化副本,不修改输入对象;未提供标签时显示值的文字。 显式传入 `options` 时替代默认插槽,包括 `[]`;不传时使用默认插槽。选项值限字符串、有限数字或布尔值;缺失/非法值及同类型重复值被忽略(保留第一项)。`false`、`0`、`''` 和 `'0'` 是不同选项。异步选项变更不反向修改模型。 RadioGroup 默认 `null`,表示未选中;外部写入 `null` 清空。`''` 是有效选项,不再作为空状态标记。 Example source: src/radio/__demos__/option-data.vue ```vue ``` ### 受控 通过`v-model`(`model-value`)属性控制是否选中 Example source: src/radio/__demos__/controlled.vue ```vue ``` ## 交互与键盘 ### 交互状态切换 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ---------- | ------------------------------- | ------------ | | `value` | 选项的`value` | 交互状态切换 | | `disabled` | 是否禁用;未设置时继承表单/分组 | 交互状态切换 | | `readonly` | 是否只读;未设置时继承表单/分组 | 交互状态切换 | | `error` | 错误态;未设置时继承表单/分组 | 交互状态切换 | 适用于互斥选项。调整禁用、只读、错误反馈,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。 Example source: src/radio/__demos__/state-lab.vue ```vue ``` ### 键盘导航 Tab 进入已选项(没有已选项时进入第一个可用项);方向键循环,Home / End 跳到首尾,跳过禁用项。只读项可聚焦但不改变值。导航仅作用于当前分组,不拦截面板内其他按钮的键盘事件。 Example source: src/radio/__demos__/keyboard-navigation.vue ```vue ``` ## 控件与内容定制 ### 原生控件与自定义图标 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ---------- | ------------------------------- | ---------------------------------- | | `value` | 选项的`value` | 原生控件与自定义图标、自定义单选框 | | `readonly` | 是否只读;未设置时继承表单/分组 | 原生控件与自定义图标 | 两端均使用原生 radio input。Group 的 name 供原生表单提交,子项可覆盖。aria-label/input-attrs 作用于 input;组件管理的 type、checked、disabled、tabindex 不允许覆盖。图标插槽仅替换图标;#radio 替换全部可见内容,使用时须提供可访问名称。 Example source: src/radio/__demos__/native-control.vue ```vue ``` ### 自定义单选框 使用 #radio 插槽自定义单选框的展示。 Example source: src/radio/__demos__/custom-radio.vue ```vue ``` ## 异步选项 ### 异步选项 开启“手动返回”后使用真实本地Promise,不走默认定时器。连续加载两次,分别按新旧或旧新顺序返回:只有当前请求版本可替换选项、结束加载。移除选项使在途版本失效但保留业务选值;旧任务仍可手动返回。Applied/Ignored/Pending显示应用、忽略及等待数,加载/返回不增加用户变更次数。版本保护和等待清理由示例业务加载器负责,不代表Radio自动解决网络竞争,也不访问外部服务。 选项载入、移除和外部值更新均不会反向触发值变化;未载入的已选值不会自动清理。重复选择当前值不再触发 change,false、0、空字符串按实际值比较。 示例以 800ms 本地延迟模拟加载。等待期间可设为设备 A 或清空选择,选项到达后按最新模型反显;这些外部操作不会增加用户变更次数。加载中移除选项会取消待完成任务,避免旧选项重新显示。 等待期间仍可用方向键选择已加载的选项;同值选项重新加载后保留当前焦点。加载提示保持稳定节点,避免提示显隐导致分组重新挂载;重复激活当前值不会增加 change 次数。 Example source: src/radio/__demos__/async-options.vue ```vue ``` ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 `ChoiceValue = string | number | boolean`;`CheckboxModel = boolean | ChoiceValue[]`;`RadioModel = ChoiceValue | null`。 ### Radio Props | 属性 | 说明 | 类型 | 默认值 | | --------------------- | ------------------------------- | ------------------------- | --------- | | model-value (v-model) | 受控值 | ChoiceValue \| null | undefined | | default-value | 非受控初始值 | ChoiceValue \| null | null | | value | 选项的`value` | `string\|number\|boolean` | `true` | | variant | 单选的类型 | `'radio'\|'button'` | `'radio'` | | disabled | 是否禁用;未设置时继承表单/分组 | boolean | undefined | | readonly | 是否只读;未设置时继承表单/分组 | boolean | undefined | | error | 错误态;未设置时继承表单/分组 | boolean | undefined | ### Radio Events | 事件名 | 说明 | 参数 | | ------------------ | -------- | --------------------------------- | | update:model-value | 提议新值 | value: ChoiceValue | | change | 值变化 | value: ChoiceValue, event?: Event | | focus | 聚焦 | event: FocusEvent | | blur | 失焦 | event: FocusEvent | ### Radio Methods | 方法 | 参数 | 返回值 | | ------ | ---------------------- | ------ | | select | - | void | | focus | options?: FocusOptions | void | | blur | - | void | ### Radio Slots | 插槽名 | 说明 | 参数 | | ------ | ------------ | ---------------------------------------- | | radio | 自定义单选框 | `checked:boolean`
`disabled:boolean` | ### RadioGroup Props | 属性 | 说明 | 类型 | 默认值 | | --------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -------------- | | model-value (v-model) | 受控值 | RadioModel | undefined | | default-value | 非受控初始值 | RadioModel | null | | variant | 单选框组的类型 | `'radio'\|'button'` | `'radio'` | | size | 单选框组的尺寸 | `'xs'\|'sm'\|'md'\|'lg'\|'xl'` | `-` | | options | 选项;传入时替代默认插槽 | Array> / `(query, { signal }) => Array / Promise` | `undefined` | | orientation | 单选组内选项的横纵排列,默认 horizontal;不表示文字阅读方向 | `'horizontal'\|'vertical'` | `'horizontal'` | | disabled | 是否禁用;未设置时继承表单/分组 | boolean | undefined | | readonly | 是否只读;未设置时继承表单/分组 | boolean | undefined | | error | 错误态;未设置时继承表单/分组 | boolean | undefined | | field-names | 选项字段映射 | ChoiceFieldNames | undefined | | aria-label | 分组的无障碍名称 | string | '' | ### RadioGroup Events | 事件名 | 说明 | 参数 | | ------------------ | --------------------------- | ---------------------------------------------- | | update:model-value | 提议新值 | value: string \| number \| boolean | | change | 值变化,只由 Group 通知一次 | value: string \| number \| boolean, ev?: Event | ### RadioGroup Slots | 插槽名 | 说明 | 参数 | | ------ | ------------- | ---------------------------------------- | | radio | 自定义单选框 | `checked:boolean`
`disabled:boolean` | | label | radio文案内容 | `data: RadioOption, checked: boolean` | ### RadioOption | 字段 | 说明 | 类型 | | -------- | -------------- | ----------------------------------------------------------------- | | value | 选项标识 | ChoiceValue | | label | 标签或渲染函数 | VNodeChild \| (data: RadioOption, checked: boolean) => VNodeChild | | disabled | 禁用 | boolean | | readonly | 只读 | boolean | ## 类型定义 组件导出以下类型定义 ```ts import type { RadioProps } from "@cedar-design/ui"; ``` ### ChoiceFieldNames `{ label?: string; value?: string; disabled?: string; readonly?: string; indeterminate?: string }` 公开导出类型:`RadioOption`、`ChoiceFieldNames`。 ### 原生属性与外观补齐 | 组件 | 属性 | 说明 | 类型 | 默认值 | | ------------------ | ------------------------------- | ------------------------------------------ | ------------------- | --------- | | Radio / RadioGroup | name | 原生字段名,子项覆盖分组 | string | undefined | | Radio | aria-label | 原生控件的无障碍名称 | string | undefined | | Radio | input-attrs | 原生 input 属性 | InputHTMLAttributes | undefined | | Radio | checked-color / unchecked-color | 实例选中/未选中色;错误/禁用状态优先 | string | undefined | | Radio | icon-size | 图标长度,number 为 px;string 为 CSS 长度 | number \| string | undefined | | Radio | ripple | 触控水波纹 | boolean | true | ### 图标与默认插槽 checked-icon、unchecked-icon 在两端都可用。default 接收 { checked, disabled };radio 接收 { checked, disabled }。click 只发出一次原始 MouseEvent;disabled 不发 click,只读可发 click,但不改变值。 ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 候选属性 `options` 支持数组或 `(query, { signal }) => 数组/Promise`。加载、取消、过期结果隔离由组件内部处理,失败触发 load-error。单选/多选分组初始化以空字符串查询,搜索型字段在查询变化时调用;树形字段根数据与原有 load-more 子节点懒加载独立。 --- Document: llms/zh-CN/components/rate.md # Rate 用于评分或打星的组件。 ## 基础示例 ### 基础用法 评分组件基本用法。 Example source: src/rate/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 只读模式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | ---------------------------------------- | ---------- | | `default-value` | 非受控初值,只初始化一次 | 只读模式 | | `readonly` | 只读且可聚焦;缺省继承表单 | 只读模式 | | `color` | 选中颜色,或按每个图标分值的递增阈值映射 | 自定义颜色 | 通过设置 `readonly` 属性让评分组件为只读状态。 Example source: src/rate/__demos__/readonly.vue ```vue ``` ### 自定义颜色 通过 color 可以自定义颜色。另外可以通过对象形式自定义不同分值时的颜色。 Example source: src/rate/__demos__/color.vue ```vue ``` ## 内容与展示 ### 尺寸与符号 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | ------------------------------------------------- | -------------------------------- | | `default-value` | 非受控初值,只初始化一次 | 尺寸与符号、半选、评分总数与清除 | | `allow-half` | 半分步长 | 尺寸与符号、半选 | | `grading` | 固定五级表情评分,优先于插槽和图标 | 尺寸与符号、笑脸分级 | | `size` | 图标尺寸;数字/数字字符串为 px,带单位为 CSS 长度 | 尺寸与符号 | | `aria-label` | 评分的业务无障碍名称 | 尺寸与符号 | | `gap` | 图标间距;数字/数字字符串为 px,带单位为 CSS 长度 | 尺寸与符号 | Example source: src/rate/__demos__/sizes-and-symbols.vue ```vue ``` ### 半选 指定 `allow-half` 来开启半选。 Example source: src/rate/__demos__/half.vue ```vue ``` ### 评分总数与清除 比较评分上限和重复选择时的清除行为;半星精度、键盘输入与受控值保持独立。
配置说明与使用限制 #### 支持清除 通过设置 `clearable` 来允许清除评分。 #### 任意长度的评分 通过指定 `count` 来指定任意长度的评分组件。
Example source: src/rate/__demos__/value-rules-comparison.vue ```vue ``` ### 笑脸分级 通过 `grading` 使用笑脸分级。 Example source: src/rate/__demos__/grading.vue ```vue ``` ## 自定义与插槽 ### 自定义评分字符 可以将星星替换为其他字符,比如表情、字母,数字,字体图标甚至中文。 Example source: src/rate/__demos__/character.vue ```vue ``` ## 交互与控制 ### 交互状态切换 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | -------------------------------------- | ------------------------ | | `disabled` | 禁用;缺省继承表单,显式 false 覆盖 | 交互状态切换、键盘与状态 | | `readonly` | 只读且可聚焦;缺省继承表单 | 交互状态切换、键盘与状态 | | `allow-half` | 半分步长 | 键盘与状态 | | `clearable` | 重复点击当前分数清空;键盘边界不会清空 | 键盘与状态 | | `aria-label` | 评分的业务无障碍名称 | 键盘与状态 | | `default-value` | 非受控初值,只初始化一次 | 键盘与状态 | 适用于评分反馈。调整禁用、只读,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。 Example source: src/rate/__demos__/state-lab.vue ```vue ``` ### 键盘与状态 Example source: src/rate/__demos__/keyboard.vue ```vue ``` ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### Props | 属性 | 说明 | 类型 | 默认值 | | -------------- | ------------------------------------------------- | -------------------------------- | ---------- | | model-value | 受控评分,配合 v-model;外部更新不发事件 | number | undefined | | default-value | 非受控初值,只初始化一次 | number | 0 | | count | 正有限数向下取整;非法值回退 5 | number \| string | 5 | | allow-half | 半分步长 | boolean | false | | clearable | 重复点击当前分数清空;键盘边界不会清空 | boolean | false | | grading | 固定五级表情评分,优先于插槽和图标 | boolean | false | | disabled | 禁用;缺省继承表单,显式 false 覆盖 | boolean | undefined | | readonly | 只读且可聚焦;缺省继承表单 | boolean | undefined | | aria-label | 评分的业务无障碍名称 | string | undefined | | size | 图标尺寸;数字/数字字符串为 px,带单位为 CSS 长度 | number \| string | 样式默认值 | | gap | 图标间距;数字/数字字符串为 px,带单位为 CSS 长度 | number \| string | 样式默认值 | | color | 选中颜色,或按每个图标分值的递增阈值映射 | string \| Record | undefined | | empty-color | 未选中颜色 | string | undefined | | disabled-color | 禁用时覆盖选中/未选中颜色 | string | undefined | | icon | 选中图标 | string \| Component | 星形 | | half-icon | 半选图标 | string \| Component | 半星 | | empty-icon | 未选中图标 | string \| Component | 空星 | | ripple | 点击水波纹 | boolean | true | size/gap 不接受 xs/sm/md/lg/xl 档位;省略、非法或非正数保留样式默认值。CSS var/calc/min/max/clamp 长度可用。评分按 1 或 0.5 步长归一至 0~count;非有限评分显示 0,不反向改写外部值。 ### Events | 事件 | 参数 | 说明 | | ------------------ | ------------- | ----------------------------------------- | | update:model-value | value: number | 用户产生新值 | | change | value: number | 新值确认;相同值不重复通知 | | hover-change | value: number | 鼠标预览改变;离开/失焦/禁用/只读重置为 0 | ### Slots | 插槽 | 参数 | 说明 | | --------- | ------------------------ | ---------------------------------------------- | | character | { index, value, active } | index 从 0 开始,value 从 1 开始;替换评分符号 | 优先级:grading > character > icon/half-icon/empty-icon > 默认图标。字符串图标需要全局注册;组件值无需注册。 ### Methods focus() 聚焦评分,blur() 移除焦点。只读仍可聚焦,禁用移出 Tab 序列。方向键增减、Home 清零、End 满分;子控件键盘事件和 Alt/Ctrl/Meta 组合键不被接管。触屏点击与鼠标点击遵循相同半选、清空规则。 ### 类型定义 导出 RateProps、RateColor、RateIcon、RateInstance、RateExpose、RateEmits、RateCharacterSlotProps。 ### 样式变量 | Token | Default | | ------------------------------------- | ---------------------------------------------- | | `--c-rate-disabled-color` | `var(--c-sys-color-content-disabled)` | | `--c-rate-error-color` | `var(--c-sys-color-content-danger)` | | `--c-rate-active-scale` | `1.2` | | `--c-rate-focus-color` | `var(--c-sys-color-content-brand)` | | `--c-rate-focus-width` | `2px` | | `--c-rate-focus-offset` | `2px` | | `--c-rate-size` | `var(--c-font-size-title-3)` | | `--c-rate-gap` | `var(--c-spacing-4)` | | `--c-rate-min-height` | `var(--c-size-md)` | | `--c-rate-action-padding` | `0px` | | `--c-rate-empty-color` | `var(--c-color-fill-3)` | | `--c-rate-active-color` | `rgb(var(--c-gold-6))` | | `--c-rate-transition-duration` | `var(--c-transition-duration-2)` | | `--c-rate-scale-duration` | `var(--c-transition-duration-4)` | | `--c-rate-transition-timing-function` | `var(--c-transition-timing-function-standard)` | 两端公开 Token 后缀及含义一致;Cedar 保留金色星形和紧凑间距,Maple 保留主色星形与触控内边距,默认值差异已登记主题契约。源码各自维护,不共享运行时。 `transition-duration` 控制 hover/颜色过渡,`scale-duration` 控制选中动画,`transition-timing-function` 控制缓动。低动态偏好下关闭非必要动画;`size` / `gap` Prop 会覆盖当前实例的对应 Token。 ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 ## 配置清空后的值 `empty-value` 指定当前组件已有清空动作的输出;省略时采用该组件默认返回。具体类型以组件 API 为准。它不改变 empty-values 的识别规则,也不改变 Form reset 的初始值。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 --- Document: llms/zh-CN/components/resize-box.md # ResizeBox ## 基础示例 ### 基础用法 `ResizeBox` 伸缩框组件的基础使用。通过设置 `directions`,可以指定四条边中的哪几条边可以进行伸缩。 Example source: src/resize-box/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 在布局中使用 [Layout](react/components/ResizeBox) 组件中集成了 `ResizeBox` 组件,可以在 Layout 中使用可伸缩的侧边栏。 Example source: src/resize-box/__demos__/layout.vue ```vue ``` ## 交互与控制 ### 受控的高宽 `ResizeBox` 的 `width` 和 `height` 都支持 `v-model`。 Example source: src/resize-box/__demos__/controlled.vue ```vue ``` ### 定制伸缩杆内容 可通过插槽 `resize-trigger` 定制各个方向的伸缩杆的内容。 Example source: src/resize-box/__demos__/custom-triggers.vue ```vue ``` ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | -------------------- | ------------------------------------------ | -------------------------------------------- | :---------: | | width **(v-model)** | 宽度 | `number` | `-` | | height **(v-model)** | 高度 | `number` | `-` | | component | 伸缩框的 html 标签 | `string` | `'div'` | | directions | 启用尺寸调整手柄的边,默认仅 right;可选 top/right/bottom/left,可组合;不是鼠标移动方向,也不是浮层方位 | `('left' \| 'right' \| 'top' \| 'bottom')[]` | `['right']` | ### `` Events | 事件名 | 描述 | 参数 | | ------------ | -------------- | -------------------------------------------------------------- | | moving-start | 拖拽开始时触发 | ev: `MouseEvent` | | moving | 拖拽时触发 | size: `{ width: number; height: number; }`
ev: `MouseEvent` | | moving-end | 拖拽结束时触发 | ev: `MouseEvent` | ### `` Slots | 插槽名 | 描述 | 参数 | | ------------------- | :----------: | --------------------------------------------------- | | resize-trigger | 伸缩杆的内容 | direction: `'left' \| 'right' \| 'top' \| 'bottom'` | | resize-trigger-icon | 伸缩杆的图标 | direction: `'left' \| 'right' \| 'top' \| 'bottom'` | ### 类型定义 组件导出以下类型定义 ```ts import type { ResizeBoxInstance } from '@cedar-design/ui' ``` ### 方位语义与配置入口 directions 指启用调整手柄的边,保留现有名称;默认仅右边,可组合多边。它不是 orientation 横纵轴,也不是 placement 弹层方位。从零设计时 edges 更直接,但本次未进行 API 改名。 ## 阅读方向与交互 ResizeBox 的 `directions` 使用物理边:left 始终在左、right 始终在右,RTL 不交换手柄,也不反转宽高含义。左手柄向左、右手柄向右增大宽度;上手柄向上、下手柄向下增大高度,尺寸下限为 0。 手柄可聚焦并使用对应轴的方向键,步长 10px,Shift 为 50px;支持鼠标和触摸指针。文字继承原生阅读方向。方向切换、移除活动手柄、组件停用或卸载会释放手势监听和临时光标。 --- Document: llms/zh-CN/components/result.md # Result 用于反馈一系列操作任务的处理结果,当有重要操作需告知用户处理结果,且反馈内容较为复杂时使用。 ## 基础示例 ### 基础用法 Next status 循环六种本地结果状态并更新标题/图形,Reset status 恢复 info;按钮不发请求或导航。Result 只展示传入的 status,不根据标题文字推断成功/失败。 展示结果状态。 Example source: src/result/__demos__/basic.vue ```vue ``` ## 内容与展示 ### 成功、警告与失败 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `status` | 结果页显示的状态 | 成功、警告与失败、HTTP 结果状态对比、完整功能 | | `title` | 标题内容 | 成功、警告与失败、完整功能 | | `subtitle` | 子标题内容 | HTTP 结果状态对比 | 对比语义状态如何影响图形、标题和操作区;HTTP 状态与自定义图形另行展示。
配置说明与使用限制 #### 成功状态 展示成功状态。 #### 警告状态 展示警告状态。 #### 错误状态 展示错误状态。
Example source: src/result/__demos__/status-comparison.vue ```vue ``` ### HTTP 结果状态对比 比较无权限、资源不存在和服务器错误的内容层级,按业务恢复路径选择操作文案。
配置说明与使用限制 #### HTTP状态码 403 没有当前页面的访问权限。 #### HTTP状态码 404 页面未找到 #### HTTP状态码 500 通常表示服务器错误
Example source: src/result/__demos__/http-status-comparison.vue ```vue ``` ### 完整功能 完整功能 Example source: src/result/__demos__/all.vue ```vue ``` ## 自定义与插槽 ### 自定义状态 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `title` | 标题内容 | 自定义状态 | | `subtitle` | 子标题内容 | 自定义状态 | 自定义状态。需要传入指定的图标 Example source: src/result/__demos__/custom.vue ```vue ``` ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | -------- | ---------------- | -------------------------------------------------------------------------------- | :------: | | status | 结果页显示的状态 | `'info' \| 'success' \| 'warning' \| 'danger' \| 'question' \| 'empty' \| '403' \| '404' \| '500'` | `'info'` | | title | 标题内容 | `string` | `-` | | subtitle | 子标题内容 | `string` | `-` | | image-size | 状态图形尺寸,数字表示 px | `string \| number` | `-` | | animation | 是否启用状态图形动画 | `boolean` | `true` | ### `` Slots | 插槽名 | 描述 | 参数 | 版本 | | -------- | :------: | ---- | :---- | | icon | 自定义状态图形 | `{ size?: string }` | | | title | 标题 | - | | | subtitle | 副标题 | - | | | extra | 操作区 | - | 2.8.0 | | default | 默认插槽 | - | 2.8.0 | ### 类型定义 组件导出以下类型定义 ```ts import type { ResultInstance } from '@cedar-design/ui' ``` --- Document: llms/zh-CN/components/ripple.md # Ripple 水波指令 在元素上添加点击、触摸或键盘水波效果。指令主体与 Maple 独立复制同源,不共享实例或运行时;本地包依赖、命名空间与 Token 默认值独立维护。 ## 基础示例 ### 基本使用 支持触摸、鼠标主键和宿主 Enter/Space;鼠标从实际按下位置扩散,在所属 document 松开或窗口失焦时释放。忽略非主键与触摸产生的兼容鼠标事件;缺少 sourceCapabilities 时采用触摸后 800ms 去重窗口。键盘从中心扩散,请使用原生按钮。移动模拟站的点击不等同真实触屏验收。 Example source: src/ripple/__demos__/basic.vue ```vue ``` ## 选项 | 选项 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | color | 水波颜色 | `string` | `currentColor` | | disabled | 禁止产生水波,并取消待执行动画 | `boolean` | `false` | 使用 `v-ripple="{ color, disabled }"`。组件卸载会取消动画与定时器并移除事件监听;键盘状态由每个元素独立维护。 ## 样式 直接注册指令时,引入 `@cedar-design/ui/ripple/style`;运行时代码不导入 CSS,以支持 SSR 包导入。样式名使用 `--c-ripple-*`,声明见 `style/token.less`。主题默认值无需强行与移动端同值,动画规则与消费协议保持一致。 | 变量 | 默认值 | 职责 | | --- | --- | --- | | --c-ripple-color | currentColor | 波纹背景;color 选项优先 | | --c-ripple-cubic-bezier | cubic-bezier(0.68, 0.01, 0.62, 0.6) | transform 扩散曲线 | | --c-ripple-expand-duration | 200ms | transform 扩散时长 | | --c-ripple-fade-duration | 140ms | opacity 显现/消退时长,线性 | 变量设置在实际指令宿主,由波纹继承;以上默认值目前两端一致。250ms 分别为节点创建后的最小展示和开始淡出后的最小移除等待,不是视觉时长或总生命周期。运行时读取实际波纹的 computed transition duration/delay;淡出等待创建+250ms 或激活+扩散时长的较晚者,删除等待 max(250ms, 消退时长)。长时长覆写不再截断,0ms/无样式仍保留清理下限。reduce 隐藏装饰波纹;扩散在创建/激活、消退在开始淡出时采样,不保证任意中途 CSS 改动或 animation。 重复释放只排队一次;禁用/卸载清理所属定时器与直接子波纹,不误删嵌套实例。文档事件绑定/移除使用挂载时 ownerDocument,不承诺跨文档搬迁自动重绑。仅本宿主 Enter/Space 与对应 keyup 或 blur 参与;指令不为普通 div 提供按钮语义、可访问名称或点击业务能力。真实触摸设备/OS 偏好另行验收。 --- Document: llms/zh-CN/components/row.md # Row 24 栏 Flex 栅格。Row 管理间距与对齐,Col 管理列宽、偏移、排序与响应式配置。需要 CSS Grid 折叠与后缀时使用 Grid。 > **布局怎么选** > > - Grid + GridItem:适合表单分栏、卡片网格,需要统一列宽、跨列、响应式列数或折叠行与后缀时使用。 > - Row + Col:适合 24 栏 Flex 布局,需要水平/垂直对齐、控制换行、固定宽度与自适应宽度组合,或响应式排序时使用。Row 控制整行,Col 控制列宽、偏移和排序。 > - Space:适合按钮、标签、文字等简单排列,只需要间距、方向和对齐时使用;更自由的宽度分配可使用原生 Flex。 ## 基础示例 ### 24 栏基础布局 Example source: src/row/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 双向间距与响应式间距 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `gutter` | 间距:数值、响应式对象或 [水平, 垂直] | 双向间距与响应式间距、水平与垂直对齐、换行与普通容器模式 | | `justify` | 水平对齐 | 水平与垂直对齐、布局与对齐 | | `align` | 垂直对齐 | 水平与垂直对齐、布局与对齐 | | `wrap` | 是否换行 | 换行与普通容器模式 | | `div` | Row 与 Col 均作为普通容器,移除全部布局样式 | 换行与普通容器模式 | Example source: src/row/__demos__/gutter.vue ```vue ``` ### 水平与垂直对齐 Example source: src/row/__demos__/alignment.vue ```vue ``` ### 换行与普通容器模式 Example source: src/row/__demos__/wrap.vue ```vue ``` ### 嵌套与间距隔离 Example source: src/row/__demos__/nested.vue ```vue ``` ### 布局与对齐 适用于row。调整交叉轴对齐、主轴分配,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。 Example source: src/row/__demos__/layout-lab.vue ```vue ``` ## API ### Props | 属性 | 说明 | Type | Default | | --- | --- | --- | --- | | gutter | 间距:数值、响应式对象或 [水平, 垂直] | `RowGutter` | `0` | | justify | 水平对齐 | `start / center / end / space-around / space-between` | `start` | | align | 垂直对齐 | `start / center / end / stretch` | `start` | | wrap | 是否换行 | `boolean` | `true` | | div | Row 与 Col 均作为普通容器,移除全部布局样式 | `boolean` | `false` | ### Events | Event | Description | | --- | --- | | click | 原生 MouseEvent,每次点击一次 | ### Slots | Slot | Description | | --- | --- | | default | 布局内容 | ### Methods | Method | Description | | --- | --- | 换行示例分别切换换行与普通 `div` 模式。普通模式移除 Row 布局样式及子 Col 间距;间距示例区分水平与垂直间距。Row 使用 Flex,不依赖 CSS Grid。 ## 响应式与可访问性 断点基于浏览器视口:xs 为基础值,sm ≥576、md ≥768、lg ≥992、xl ≥1200、xxl ≥1600px;从最大匹配断点向下取已配置值。SSR 首屏使用 xs,挂载后响应视口;Grid 折叠和动态排序在挂载后计算。组件为布局容器,不增加键盘快捷键;内容语义及可聚焦元素由调用者提供。没有公开方法和专用主题 Token。 ## 导入 Grid 仅包含 Grid.Item;Row、Col 是独立组件,拥有独立源码、样式、菜单、文档和 Demo。已移除 Grid.Row/Grid.Col、Grid 入口的 Row/Col 转导出以及 GridRowInstance/GridColInstance。请从库根入口或独立 row/col 入口导入;安装 Grid 不再自动注册 Row/Col。 --- Document: llms/zh-CN/components/scheduler.md # Scheduler 日程调度 原生 Vue 日程调度组件。资源是可选关联,可表示人员、设备、会议室,也可完全不使用。内置 Cedar 编辑器与资源筛选,日期计算、重叠布局、分配和校验独立于 Vue。现有 Calendar 继续负责轻量日期展示与选择。 | 目标 | 从这里开始 | | --- | --- | | 只展示或编辑日期与时间 | 基础用法,不关联资源的计划 | | 给人员或设备排期 | 资源视图与分配 | | 加载后端日程、保存修改 | 按范围远程加载,保存与自定义 | | 设置休假、重复与可用时间 | 日历体验与可用时间,重复日程与日历数据 | | 大规模排期、事务和完整业务 | 大规模资源、批量操作、最后的业务组合示例 | ## 基础示例 ### 基础用法 先从一个日程开始:切换日/周/月视图,点击空白时间创建日程,点击已有日程编辑。只需 v-model 和初始日期,不需要准备资源、远程接口或保存钩子。 Example source: src/scheduler/__demos__/basic.vue ```vue ``` ## 阅读方向 继承页面、局部容器或 ConfigProvider 的 `dir`,可沿用文档导航的 LTR/RTL 按钮实时切换。月/周/资源列和横向时间轴从阅读起点排列;纵向时间仍从上向下。切换方向保留日期、日程数据、选择和横向阅读距离,并取消正在进行的拖动或拉伸。 小时级资源时间线支持日程移动和开始/结束两端拉伸,遵守 `snapDuration`、只读状态、里程碑和日程的 `resizable` 限制。时间轴缩放保留可视时间区域中心的日期;资源标签固定在阅读起点,虚拟行与表头同步滚动。 默认重叠布局使用逻辑起点;自定义 `eventLayout` 返回的 `left` 保持屏幕物理左侧语义,由调用方按业务需要提供几何位置。日期、时区、依赖关系和资源顺序不会因 RTL 而反转。 ## 视图与布局 ### 布局分组与自定义宽度 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-date` | 初始定位日期 | 布局分组与自定义宽度、不关联资源的计划、资源周计划 | | `default-mode` | 非受控默认视图 | 布局分组与自定义宽度、资源时间线、隐藏周末与指定星期 | | `resources` | 当前可见资源行/列及本地选项,不要求全量目录 | 资源周计划、资源时间线、现在时间线 | | `start-hour` | 时间网格起始小时,0–23 | 布局分组与自定义宽度、现在时间线、重叠日程错位叠放 | | `end-hour` | 时间网格结束小时,必须大于起始,最多 24 | 布局分组与自定义宽度、现在时间线、重叠日程错位叠放 | | `modes` | 允许切换的视图 | 不关联资源的计划、隐藏周末与指定星期、现在时间线 | 固定时长日程可设置 `resizable: false`,隐藏拉伸手柄但保留移动;它不限制应用通过表单或接口重新设置时间,最终时长仍由业务保存规则校验。 `layoutGroupId` 只用于日、周、资源日程时间网格的横向布局:同一日期和资源列内,同组时间相接或重叠的块共享列、宽度和聚焦层级;有空隙时分为独立布局单元。每个块保留自己的起止时间,分组不触发联动编辑、批量拖拽或保存。完全重合的同组块会互相遮挡,业务可拆分组或使用自定义详情。月、全天、议程和资源时间线不使用此字段。 `event-layout` 保留 `stack` / `columns`,也可传入 `(item: Readonly) => { left, width }`。回调只定制横向几何,数值为单列宽度的 0–1 比例,必须满足 `left >= 0`、`width > 0`、`left + width <= 1`;非法结果回退默认叠放。纵向位置由时间决定,自定义布局支持聚焦前置。相同布局单元应返回相同几何,回调应保持纯函数,不修改 `item.event`。 Example source: src/scheduler/__demos__/layout-groups.vue ```vue ``` 组件只认识日程、资源、时间和通用展示属性。出勤单、任务类型、休息状态、业务权限、表单和服务端 DTO 映射放在 Demo/应用中,通过 `metadata`、插槽、`before-change`、`before-transaction` 接入。复制日程不继承 `layoutGroupId`,避免意外加入原布局组。 本次 API 调整:移除 Event/Template 的 `taskId`,改为 `metadata.taskId`;`createSchedulerTaskEvents`、`SchedulerTask`、`SchedulerTaskAssignment` 移至 Demo,不再从核心导出。`layoutGroupId` 不是任务 ID 的替代字段,只在需要分组布局时由应用映射。 ### 不关联资源的计划 只管理日期与时间,不需要准备人员列表;没有资源、查询回调或关联 ID 时,侧栏和编辑器自动隐藏资源选择。 Example source: src/scheduler/__demos__/without-resources.vue ```vue ``` ### 资源周计划 在基础日历上增加资源列表,观察同一份日程的资源关联。再继续查看多人分配和远程目录。 Example source: src/scheduler/__demos__/resource-week.vue ```vue ``` ### 资源时间线 按资源显示一周排期,按占用日期展示日程,跨天日程连续展示,同一天的日程分层排列;精确时分请看资源日程视图。拖放到日期格保留原开始时分。 Example source: src/scheduler/__demos__/timeline.vue ```vue ``` ### 隐藏周末与指定星期 Example source: src/scheduler/__demos__/hidden-days.vue ```vue ``` `hidden-days` 接受星期数组,`0` 表示周日,`6` 表示周六;默认 `[]`,例如 `[0, 6]` 显示工作周。作用于周、月和议程视图,月表头与列数同步缩减,`first-day-of-week` 决定星期顺序。重复星期只计算一次。非法星期或隐藏全部七天会触发 Vue prop 校验警告,组件回退显示全部日期。 这是展示过滤:不会修改日程、重复规则、排期权限或完整的 `range-change` 查询范围;导航仍按原周/月跨度。跨隐藏日期的任务在可见日期上显示,持续时长不压缩;拖动使用目标格子的实际日期。更改隐藏配置会取消当前拖动预览。隐藏日期仍参与容量/冲突校验,表单和外部命令仍可排期;需要禁止预约请使用工作时间或禁用时段。 单日、资源日程和资源时间线目前保留原来的完整日期/时间轴。纯核心 `getSchedulerVisibleDays(range, hiddenDays)` 返回独立的可见日期数组,非法隐藏配置或范围会抛出 `RangeError`。 ### 现在时间线 时间网格的日期头与全天行共同固定,纵向滚动时保持可见;今天的日期头高亮。启用 `show-now-indicator` 后,时间轴同时显示与红线对齐的当前时间文字,红线处于卡片上方。 Example source: src/scheduler/__demos__/now-indicator.vue ```vue ``` 设置 `show-now-indicator` 在日、周和资源日程中显示当前本地时间标线,默认关闭。只在当天列且当前时间位于 `[start-hour, end-hour)` 内显示;资源日程中的当天资源列各显示一条。月、议程和资源时间线暂不显示。 标线每 30 秒刷新,浏览器标签页隐藏时暂停计时,返回时立即刷新;关闭功能、切换不支持的视图或卸载后停止计时。服务端渲染不读取实时钟、不启动计时器,客户端挂载后显示。标线不会拦截鼠标或触摸操作,提供“当前时间”的可访问名称,但不会持续播报。 纯核心 `getSchedulerNowPosition(now, day, startHour = 0, endHour = 24)` 返回本地时间在网格中的百分比;不在当天/时间范围或输入无效时返回 `undefined`。该函数不读取系统时间,与现有本地时间布局保持一致;不代表已实现任意 IANA 显示时区。 可通过 `--c-scheduler-now-color`、`--c-scheduler-now-width`、`--c-scheduler-now-z-index` 调整标线样式。 ### 时间线缩放与资源分组 小时刻度显示定位日,天刻度显示一周。切换刻度保留定位日期,上一页/下一页跟随刻度按日或按周导航。资源分组仅影响时间线展示,不修改日程分配。 Example source: src/scheduler/__demos__/timeline-groups.vue ```vue ``` | 属性 | 说明 | 默认值 | | ------------------------------------- | --------------------------------------------------------- | -------- | | scale / default-scale | `hour` 或 `day`,支持 `v-model:scale` | `day` | | virtual-list-props | 资源时间线虚拟列表配置 `SchedulerVirtualListProps` | — | | resource-group-dimensions | 交叉分组维度顺序,资源时间线有效 | [] | | resource-group-by | `(resource: SchedulerResource) => string`,返回稳定分组键 | — | | expanded-keys / default-expanded-keys | 展开的分组键,支持 `v-model:expanded-keys` | 全部展开 | 资源较多时可先折叠不关注的分组。小时刻度按真实经过小时构建,夏令时切换日可能有 23 或 25 个小时;表头带时区缩写用于辨别重复小时。当前运行环境时区仍决定显示日期。 ### 重叠日程错位叠放 Example source: src/scheduler/__demos__/stacked-events.vue ```vue ``` 周视图默认使用 `event-layout="stack"`:重叠组按并发列数等分卡片起点,每张卡片延伸到该日期列的最右侧。例如 3 张同时重叠的日程,起点分别为 0%、33.33%、66.67%,宽度分别为 100%、66.67%、33.33%。单击前置并直接打开详情,Tab 聚焦同样前置,Enter 打开详情;焦点离开卡片后恢复原层级。非重叠日程仍单击打开,多选模式仍单击选择。 可通过 `event-layout="columns"` 恢复旧并排布局。日与资源日程默认并排,也可显式启用 stack;全天、月历、时间线布局不受影响。设置 `overlap-event-limit` 后,一个相连重叠组超过该数量时隐藏后续列并显示“还有 N 项”,点击 Popover 查看该组全部日程;省略时不收敛。选择 Popover 项继续触发正常详情,筛选、数据和冲突校验不受影响。 前置仅改变焦点层级,不修改数组、选中模型或事件时间。只读允许查看,disabled 阻止查看操作。布局方式与 `allow-overlap` 的业务冲突校验相互独立。 ## 资源与任务分配 ### 多人分配 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-date` | 初始定位日期 | 多人分配、交叉分组:站下展开人员、多资源维度:站与人 | | `default-mode` | 非受控默认视图 | 多人分配、交叉分组:站下展开人员、多资源维度:站与人 | | `resources` | 当前可见资源行/列及本地选项,不要求全量目录 | 多人分配、交叉分组:站下展开人员、多资源维度:站与人 | | `resource-dimensions` | 维度定义 `{ id, label }[]` | 交叉分组:站下展开人员、多资源维度:站与人、独立任务分配 | | `resource-filters` | 跨维度组合筛选,支持 v-model:resource-filters | 交叉分组:站下展开人员、多资源维度:站与人、大量资源与虚拟滚动 | | `show-assignment-details` | 编辑资源占用量与角色 | 独立任务分配、占用量与资源负载 | 一条日程可关联多人。拖到另一人员列时只替换拖出列的人员,其他参与者保留;时间变更影响这条日程的所有参与者。需要每个人独立时间时,创建不同 id 的日程,在 `metadata.taskId` 中保存关联。 Example source: src/scheduler/__demos__/resources.vue ```vue ``` ### 交叉分组:站下展开人员 Example source: src/scheduler/__demos__/resource-cross-groups.vue ```vue ``` 资源时间线设置 `:resource-group-dimensions="['station', 'person']"`,按站分组并在每站下面展示人员行;顺序反转后按人分组。支持两个以上维度,最后一个维度作为行,前面的资源路径作为分组。此设置优先于 `resource-group-by` 和 `resource-dimension`,其他视图继续使用原有单维度轴。 - 行是筛选后各维度资源的笛卡尔积,包含空排期组合,便于直接新建任务。缺少任一维度资源时没有组合行;不满足完整组合的任务可在日程列表或单维度视图中查看。 - 点击组合行自动填入各维度真实资源 ID。`cell-click` 提供 `resourceIds`,组合行的 `resourceId` 为 undefined;展示行键不会进入日程数据。 - 一个任务关联多人或多站时显示在全部匹配组合中,底层仍只有一条任务。拖动修改整条任务的时间,并将来源行的资源替换为目标行资源,其他参与者保留;调整时长不改变资源。它不表示把共享任务拆成独立分配关系。 - 所有资源的容量、工作时间和禁用状态共同约束操作,筛选隐藏的任务仍参与保存校验。空白格可用时间提示同时考虑各维度;容量在提交时校验。 - 复用 `expanded-keys` 控制折叠。分组键为父资源 ID 数组的 `JSON.stringify`,例如 `'["station:north"]'`,不依赖显示名称。`resource-header` 插槽的 `resource` 是末级真实资源,`resources` 为完整资源路径。 - 空数组默认关闭;重复、少于两个或未声明的维度配置回退到普通资源行。纯函数 `createSchedulerResourceRows(resources, dimensionIds)` 对少于两个、重复或空维度 ID 抛出 RangeError,并返回 `SchedulerResourceRow[]`;`moveSchedulerResourceRow(ids, from, to)` 只计算资源替换,可独立于 Vue 使用。 组合行可通过 `virtual-list-props` 开启虚拟滚动,不自动截断组合目录;极大目录应先通过维度筛选缩小范围。资源目录以传入的 `resources` 为准;远程选择结果需由业务合并到资源目录后才生成新行。 ### 多资源维度:站与人 Example source: src/scheduler/__demos__/resource-dimensions.vue ```vue ``` 通过 `resource-dimensions` 定义资源维度,例如 `[{ id: 'station', label: '站' }, { id: 'person', label: '人' }]`,每个资源使用 `dimensionId` 归属一个维度。维度 ID 应非空且唯一;资源 ID 必须在全部维度之间唯一,可使用 `station:north`、`person:lin` 这样的业务前缀。同一日程继续使用一份 `resourceIds`,可同时关联多个站、多个人,所有关联资源共同参与可用时间、容量和冲突校验。 ```ts const resources = [ { id: "station:north", label: "北站", dimensionId: "station", capacity: 2 }, { id: "person:lin", label: "小林", dimensionId: "person", capacity: 1 }, ]; const event = { id: "inspection", title: "北站巡检", start: "2026-09-22T09:00:00", end: "2026-09-22T10:00:00", resourceIds: ["station:north", "person:lin"], }; const resourceFilters = { station: ["station:north"], person: ["person:lin"] }; ``` - **同维度“或”、跨维度“且”**:选多个站和多个人时,日程需匹配任一所选站,并匹配任一所选人。空数组或缺省维度不限制该维度;共享日程按 ID 保持一份数据。 - `v-model:resource-filters` 控制筛选,`default-resource-filters` 提供非受控初值;侧栏每个维度独立多选,更新一个维度保留其他维度。 - `v-model:resource-dimension` 决定资源日程/时间线的列或行,`default-resource-dimension` 提供初值,默认空字符串显示所有维度资源。切换展示维度不修改日程和其他筛选。 - 编辑器按维度选择。更新“人”保留原“站”及尚未解析的资源 ID;未归入已配置维度的现有关联显示在“其他资源”。筛选不会自动成为新日程的默认分配;从资源格新建只预填该格资源。 - 拖动到同维度另一资源,只替换对应资源,其他维度关联保持;跨维度资源间拖动被阻止。过滤不会减少事务校验数据:被筛掉的日程仍可导致人员冲突或容量不足。 纯核心工具:`filterSchedulerEventsByResources(events, resources, filters)` 返回匹配事件数组(事件对象保留原引用,不修改输入);`setSchedulerResourceDimension(resourceIds, dimensionId, selectedIds, resources)` 返回替换一个维度后的独立 ID 数组,其他维度和未知 ID 保留,新选择的 ID 必须存在且归属该维度。 远程查询 `requestResources` 新增可选 `dimensionId`,每个维度独立查询/分页/取消;服务端应按维度查询并在返回资源上提供 `dimensionId`。客户端还会过滤不属于该维度的候选。`resolveResources` 仍按全局 ID 回显,返回维度后自动参与分组。未知资源在解析完成前不能满足维度筛选,不会被猜测归类;筛选键不会因暂时缺少目录记录而被隐式忽略。 未配置 `resource-dimensions` 时原有单组资源筛选和编辑继续工作。完整日程范围仍由原来的加载接口提供;这些筛选是本地展示条件,服务端保存仍应校验全部相关数据。 ### 独立任务分配 Example source: src/scheduler/__demos__/independent-assignments.vue ```vue ``` Demo 内的 `createSchedulerTaskEvents(task, assignments)` 适配器将独立的站/人分配转换为共享 `metadata.taskId` 的不同日程块,各块可有不同时间、资源及占用量。分配 ID 在一个任务内唯一,生成事件 ID 为 `JSON.stringify([task.id, assignment.id])`。多个资源共享同一时间块时仍使用单个 Event;两种语义由业务明确选择,不自动拆分共享事件。 ### 占用量与资源负载 Example source: src/scheduler/__demos__/assignment-load.vue ```vue ``` Event 新增 `resourceDetails?: Record`,以 `resourceIds` 为唯一资源关联来源;详情仅补充已关联资源的占用量和角色。units 是有限非负数,省略为 1,支持 0.5;0 表示不占容量。未关联 ID 的详情不参与负载。复制深拷贝详情,同维度拖动携带来源详情,目标已关联时保留目标原详情。 `show-assignment-details` 在内置编辑器显示占用量和角色,`show-resource-load` 在资源时间线表头显示当前日期范围的峰值负载/容量、峰值占用条和范围利用率。利用率分母为完整可见范围的经过分钟数 × 容量,不仅限于工作时间;容量为零或未配置时不计算百分比。`getSchedulerResourceSummary` 同时返回 peakLoad、unitMinutes 与 utilization。峰值包含筛选隐藏的已加载日程,超载标红;服务端仍需检查未加载数据。 `rule-policy` 可分别配置 capacity、unavailable、conflict 为 `allow | warn | block`,默认 block。warn 在成功提交后显示警告并触发 `rule-warning`(SchedulerError[]);allow 忽略该类规则。conflict 仍以 `allow-overlap=false` 为启用前提。无效配置、无效事件、只读、禁用资源和过期版本不能降级为提醒;保存钩子仍可否决。灰色背景始终表示可用时间约束,即使其提交策略为提醒。 ### 大量资源与虚拟滚动 Example source: src/scheduler/__demos__/virtual-resources.vue ```vue ``` 设置 `:virtual-list-props="{ height: 480, estimatedSize: 80, buffer: 10 }"` 开启资源时间线虚拟滚动,配置命名与 Table、Select 一致。普通资源行和交叉分组均可使用;未配置时保持完整渲染。分组标题与资源行一起进入滚动窗口,顶部时间刻度跟随横向滚动。 | 配置 | 说明 | 默认值 | | ------------- | ---------------------------------------------------------- | -------------------------------------------- | | height | 视口高度,数字为 px,也支持 CSS 高度字符串 | `var(--c-scheduler-virtual-height)`(480px) | | estimatedSize | 未测量行的预估高度,正数 px;实际高度按内容测量 | 80 | | buffer | 预渲染窗口参数,正整数;内部列表最多挂载约 `buffer × 3` 项 | 10 | 行布局按需计算并缓存;滚动不改变事件数据或真实资源 ID。筛选、分组展开、日程内容或刻度变化后重置测量缓存,按原可见行键恢复行内偏移与横向位置;原行消失时回退到邻近有效行。更高的视口或更紧凑的行高应增大 `buffer`,确保窗口能够覆盖视口。 资源时间线指针手势由 Scheduler 持有,源卡片卸载后仍可继续;靠近容器边缘会自动滚动并重新计算目标。Escape、失焦、取消和卸载清理手势。虚拟滚动减少 DOM 和布局计算,组合资源目录仍在内存中生成;极大规模的笛卡尔积仍需先筛选或在业务侧限制目录范围。 边缘自动横滚会改变指针下的实际时间格,因此拖动时即使指针横坐标不变,也可能同时更改资源与开始时间;保存后可打开详情核对,或使用撤销/重做恢复。此资源时间线的紧凑卡片支持移动,不显示时间网格的起止拉伸手柄;调整时长可通过详情编辑。非首屏空白格新建使用实际组合行的资源,取消草稿不增加日程。 撤销/重做恢复的是日程数据,不会强制滚动到历史日程的位置。若恢复后的卡片不在当前视口内,先滚动使其可见,再点击查看详情;也可以聚焦日程按钮后使用 Enter 打开。 ## 工作时间与容量 ### 周期与指定日期可用时段 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-date` | 初始定位日期 | 周期与指定日期可用时段、维护禁用时段、资源并发容量 | | `default-mode` | 非受控默认视图 | 周期与指定日期可用时段、维护禁用时段、资源并发容量 | | `resources` | 当前可见资源行/列及本地选项,不要求全量目录 | 周期与指定日期可用时段、维护禁用时段、资源并发容量 | | `resource-label` | 资源字段名称,如设备、会议室 | 周期与指定日期可用时段、维护禁用时段 | | `allow-overlap` | 允许同资源时间重叠 | 周期与指定日期可用时段 | 对照工作日规则与指定日期覆盖;在允许和禁止的时段分别尝试创建或编辑任务,观察完整时长的校验边界。
配置说明与使用限制 #### 指定日期工作时间 `date-working-hours` 接受 `SchedulerDateWorkingHours[]`,每项包含本地日期 `date: "YYYY-MM-DD"`、`intervals: { startMinute, endMinute }[]` 和可选 `resourceIds`。分钟范围为 0–1440,结束必须晚于开始;可配置多个时段,空 `intervals` 关闭当天。 优先级为:资源指定日期 > 公共指定日期 > 资源每周规则 > 公共每周规则。指定日期替换当天的周规则,可开放原本关闭的补班日;未匹配的日期沿用每周规则。相同日期不能重复配置公共规则或同一资源,可将分段时段合并到一条规则。非法日期、分钟或重复作用域会使校验返回 `invalid-config`。 全天日程跳过小时限制;维护和企业日历产生的 `disabled-ranges` 始终有效。多人日程必须满足每个人的规则。规则切换不会自动修改已有任务,保存、拖动和跨日期编辑均按完整日程校验;异步保存期间规则变化会拒绝旧结果。 纯逻辑调用:`getSchedulerAvailabilityIssues(event, { workingHours, dateWorkingHours, disabledRanges })`,无需 Vue 或 DOM。
Example source: src/scheduler/__demos__/working-hours-comparison.vue ```vue ``` ### 维护禁用时段 Example source: src/scheduler/__demos__/maintenance.vue ```vue ``` | 属性 | 类型 | 说明 | | ------------------ | ----------------------------- | ------------------------------------------------------ | | date-working-hours | `SchedulerDateWorkingHours[]` | 指定日期时段覆盖,默认 `[]`;详见上文优先级 | | working-hours | `SchedulerWorkingHours[]` | 未传不限制,空数组禁止定时日程;按运行环境本地周历解释 | | disabled-ranges | `SchedulerDisabledRange[]` | 维护、停用等绝对时间区间,默认空数组 | ```ts import type { SchedulerWorkingHours, SchedulerDisabledRange, } from "@cedar-design/ui"; const workingHours: SchedulerWorkingHours[] = [ { daysOfWeek: [1, 2, 3, 4, 5], startMinute: 540, endMinute: 720 }, { daysOfWeek: [1, 2, 3, 4, 5], startMinute: 780, endMinute: 1080 }, ]; const disabledRanges: SchedulerDisabledRange[] = [ { id: "maintenance", start: "2026-09-09T10:00:00", end: "2026-09-09T12:00:00", resourceIds: ["equipment-a"], label: "定期维护", }, ]; ``` 工作时间的起止分钟为当天 0–1440,结束必须晚于开始;跨午夜请拆成两天配置。多个窗口取并集,可以表达午休。存在某资源专用工作窗口时,该资源使用专用周计划覆盖全局周计划;没有适用规则的资源不受限制。多人共享日程必须同时满足每个资源的规则。 禁用区间采用 `[start, end)`,首尾相接不冲突。未指定或空 `resourceIds` 表示全局。全天日程作为日期事项不校验工作小时,但仍校验维护区间。未排期任务和删除不受可用时间规则限制。现有数据仍正常展示,更新时重新校验。 日/周时间网格及小时资源时间线以灰色标记含不可用部分的单元格,可悬停查看提示。格子仍能打开编辑器以调整时间;日/月汇总格不表达整天可用性。规则失败触发 `change-error`,错误码为 `unavailable`;错误的 `issues` 给出资源 ID、维护区间 ID、标签或 `invalid-config`。校验先于 `before-change`,失败不会调用保存钩子。异步等待期间规则变化会以 `stale` 拒绝旧提案。 纯核心入口导出 `getSchedulerAvailabilityIssues(event, options)`,应用可在预检查或服务端复用。时区采用当前运行环境,前后端必须统一日期语义;数据库仍应原子校验实际资源占用。 ### 资源并发容量 时间线示例可把容量降至1后,将样品甲移出与样品乙的重叠时段,再拖入冲突区观察容量拒绝;拒绝保留原排期,下一次合法移动仍可保存。结束恰等于另一项开始的相邻区间不重叠。当前资源时间线卡片没有拉伸手柄,不能把移动路径当作水平拉伸验收;持按取消、触屏和其他视图需分别验证。 Example source: src/scheduler/__demos__/resource-capacity.vue ```vue ``` 资源可设置 `capacity`,表示非负安全整数的并发日程上限;省略表示不限制,`0` 表示不能安排定时或全天日程。每条已排期日程对每个关联资源默认占用 1 份,可通过 resourceDetails.units 调整,重复的资源 ID 只计一次;未排期任务不占容量。相邻的 `[start, end)` 日程不重叠。多人任务需同时满足所有关联资源的容量。 默认允许重叠时,显式容量仍生效;`allow-overlap="false"` 更严格,继续禁止任何资源冲突。维护和工作时间校验也继续生效。新建、编辑、拖动、批量事务、撤销重做均校验最终排期;超额返回 `SchedulerError.code === 'capacity'`,`capacityIssues` 提供 `resourceId/start/end/load/capacity/eventIds/exceeded`。纯删除允许释放容量,外部降低容量不会自动修改已有日程。 - `getSchedulerResourceLoad(events, resource, range?)` 返回有占用的分段负载,`range` 可裁剪统计范围;同一时段事件集合变化时分段,未配置容量的资源也可统计。 - `getSchedulerCapacityIssues(event, events, resources)` 按 ID 替换候选日程,只检查候选时间和关联资源,返回超额时段。两项工具均可从 `@cedar-design/ui/scheduler/core` 导入,无 Vue/DOM 依赖。 容量使用已知资源目录(包括远程回显)和当前已加载日程。未知资源无法推断容量,未加载日程也不会被计入;服务端应在保存事务中校验完整数据和并发版本。`resourceDetails` 补充占用量,`resourceIds` 仍是唯一分配来源。网格的灰色时段仍表示工作时间/维护,负载由纯工具输出,可通过资源表头插槽和 Cedar 组件展示。 ## 重复日程与日历 ### 重复日程与本次例外 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-mode` | 非受控默认视图 | 重复日程与本次例外、每月、每年重复、企业休假与补班日历 | | `default-date` | 初始定位日期 | 重复日程与本次例外、企业休假与补班日历、修改本次及以后 | | `model-value` | 日程数据,支持 v-model;传入时受控 | 每月、每年重复、修改本次及以后、RRULE、时区与夏令时 | | `readonly` | 可查看和导航,不能修改 | 每月、每年重复、修改本次及以后、RRULE、时区与夏令时 | | `resources` | 当前可见资源行/列及本地选项,不要求全量目录 | 重复日程与本次例外 | | `date` | 定位日期,支持 v-model:date | 每月、每年重复 | Example source: src/scheduler/__demos__/recurring-events.vue ```vue ``` 系列与例外由业务保存,`expandSchedulerRecurrences` 按可见范围生成普通日程,传给现有 `v-model`。本例将编辑、拖动、拉伸和删除映射为“仅本次”的例外,新建仍是独立日程。“恢复全部例外”会撤销本例中的本次修改与取消;调整规则会清除本例的例外,不代表库替业务迁移系列。 ```ts import { expandSchedulerRecurrences, setSchedulerRecurrenceException, } from "@cedar-design/ui/scheduler/core"; import type { SchedulerRecurringEvent, SchedulerRecurrenceException, } from "@cedar-design/ui/scheduler/core"; const series: SchedulerRecurringEvent[] = [ { event: { id: "sync", title: "项目同步", start: "2026-09-07T09:00:00", end: "2026-09-07T10:00:00", }, rule: { frequency: "weekly", interval: 1, daysOfWeek: [1, 3, 5], count: 12, }, }, ]; let exceptions: SchedulerRecurrenceException[] = []; const occurrences = expandSchedulerRecurrences( series, { start: new Date("2026-09-07T00:00:00"), end: new Date("2026-09-14T00:00:00"), }, { exceptions }, ); // 保存完整的替换日程;省略第三个参数表示取消本次。 exceptions = setSchedulerRecurrenceException(exceptions, occurrences[0], { ...occurrences[0], title: "仅修改本次标题", }); ``` | 类型 / 方法 | 说明 | | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | SchedulerRecurringEvent | `{ event, rule }`;event 为已排期的系列起点,id 是系列唯一标识 | | SchedulerRecurrenceRule | frequency 为 daily / weekly / monthly / yearly;interval 默认 1;weekly 的 daysOfWeek 默认起点星期,0 表示周日;一周从周一开始 | | count / until | count 为原规则总发生次数(取消仍占次数);until 为包含的最晚开始时间;同时配置则先到者结束 | | SchedulerOccurrence | 普通日程加 seriesId、originalStart(全天为日期字符串,定时为 ISO 时间点字符串);生成的 id 是不透明实例标识,不应解析或自行拼接 | | SchedulerRecurrenceException | `{ seriesId, originalStart, event? }`;event 省略表示取消;提供时必须保持排期 | | expandSchedulerRecurrences(series, range, options?) | 返回与范围相交的完整实例,按开始时间排序;options 可传 exceptions、maxOccurrences(默认 10000)、maxIterations(默认 100000) | | setSchedulerRecurrenceException(exceptions, occurrence, replacement?) | 不修改输入,返回替换该实例例外后的新数组 | 开始日期只作为下界:每周所选星期不含起点星期时,第一次是之后的第一个匹配日。count 不会因为翻页或取消重新计数。until 表示时间点;日期字符串代表当地零点,定时会议若要包含当天需传入相应开始时刻。 全天系列保留日期字符串与日历天数;定时系列在运行环境本地日历上重复,保持原始时分及实际经过时长。夏令时不存在的时刻遵循 JavaScript Date 的归一化,随后日期恢复起点时分。本轮不支持任意 IANA 时区或完整 RRULE;前后端须统一时区,不能依赖实例 ID 跨时区不变。 例外始终引用原始发生时间,移动后仍可继续修改同一次。移出当前窗口的实例不再显示,移入窗口的例外正常出现。孤立例外或已不属于当前规则的发生时间不会生成实例;修改系列规则时,业务须明确保留、迁移或清理策略。 展开函数遇到非法规则、重复标识或计算/数量上限会抛错,不返回截断数据。上限针对一次展开调用的全部系列;长期系列会从起点扫描,较大数据建议由服务端按范围展开,并配合上方远程加载器处理错误。 本例不启用本地撤销历史;恢复例外是系列层操作。接入后端时由 `before-transaction` 原子保存系列/例外变更,再接受 `v-model` 提案。“本次及以后”拆分见下方示例;全系列冲突检查、专用整系列编辑尚未提供,当前窗口的冲突检查不能代替全系列校验。 ### 每月、每年重复 Example source: src/scheduler/__demos__/calendar-recurrence.vue ```vue ``` 月/年规则继续使用 `SchedulerRecurrenceRule`,共享单次例外、次数、截止时间及“本次及以后”拆分。 | 字段 | 说明 | | ----------- | ------------------------------------------------------------------------------------------------ | | frequency | monthly / yearly;interval 分别按起点月份 / 年份计数 | | dayOfMonth | 1–31,或 -1 表示最后一天;默认起点日期 | | weekOfMonth | 1–5 或 -1(最后一个);从当月符合 daysOfWeek 的日期集合中选择第几个匹配日 | | daysOfWeek | 月/年规则须搭配 weekOfMonth;默认起点星期;0 周日到 6 周六 | | monthOfYear | 仅 yearly,1–12;默认起点月份 | | overflow | skip(默认)跳过不存在的日期,last-day 落到月底;只用于数字日期规则,不能与 weekOfMonth 同时使用 | ```ts import type { SchedulerRecurrenceRule } from "@cedar-design/ui/scheduler/core"; const rules = [ { frequency: "monthly", dayOfMonth: 31, overflow: "skip" }, { frequency: "monthly", dayOfMonth: -1 }, { frequency: "monthly", weekOfMonth: -1, daysOfWeek: [1, 2, 3, 4, 5] }, { frequency: "monthly", weekOfMonth: 2, daysOfWeek: [1] }, { frequency: "yearly", monthOfYear: 2, dayOfMonth: 29, overflow: "last-day" }, ] satisfies SchedulerRecurrenceRule[]; ``` 每月 31 日默认跳过二月、四月等月份;落到月底时,之后有 31 日的月份会恢复到 31 日。每年 2 月 29 日同理,遵循公历闰年规则。第五个星期一不存在时直接跳过;被跳过的日期不消耗 count,取消例外仍消耗原次数。 `weekOfMonth` 选择的是整个星期集合中的第 N 个匹配日:`daysOfWeek: [1]` 配合 2 是第二个星期一;`[1,2,3,4,5]` 配合 -1 是最后一个周一至周五日期。后者不包含法定节假日、调休或企业工作日历。数字日期和星期顺序规则不能混用。 展开只从系列起点开始,不补出起点之前的匹配日。分拆继承规则时会固化原始月日/星期默认值,避免从二月 28 日拆分后把“31 日落到月底”改成“每月 28 日”。仍使用运行环境本地时区与计算上限,不承诺完整 RRULE 或任意 IANA 时区。 ### 企业休假与补班日历 Example source: src/scheduler/__demos__/business-calendar.vue ```vue ``` `SchedulerBusinessCalendar` 共用“常规工作星期 + 指定日期覆盖”的数据模型;不内置官方节假日。上方纯星期示例继续保持原语义,需要企业日历时显式传入 businessCalendar。 ```ts import { isSchedulerWorkingDate, getSchedulerCalendarDisabledRanges, } from "@cedar-design/ui/scheduler/core"; import type { SchedulerBusinessCalendar, SchedulerRecurrenceRule, } from "@cedar-design/ui/scheduler/core"; const businessCalendar: SchedulerBusinessCalendar = { workingDays: [1, 2, 3, 4, 5], overrides: [ { date: "2026-02-27", working: false, label: "模拟企业休假" }, { date: "2026-02-28", working: true, label: "模拟补班" }, ], }; const rule: SchedulerRecurrenceRule = { frequency: "monthly", weekOfMonth: -1, businessCalendar, }; isSchedulerWorkingDate("2026-02-28", businessCalendar); // true ``` | API / 字段 | 说明 | | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | | workingDays | 0 周日至 6 周六,默认周一至周五;空数组表示没有常规工作日 | | overrides | `{ date: 'YYYY-MM-DD', working: boolean, label?: string }[]`;指定日期优先于星期,重复或非法日期会抛错 | | rule.businessCalendar | 仅 monthly / yearly 搭配 weekOfMonth;按实际工作日选择第 N 个或最后一个,不能同时传 daysOfWeek | | isSchedulerWorkingDate(date, calendar) | 查询指定本地日期是否工作 | | getSchedulerCalendarDisabledRanges(calendar, range, maxDays?) | 把范围内的非工作日期转换为现有 disabledRanges;默认最多扫描 3660 天,超出抛错 | 日期范围遵循 `[start, end)`,输出是相交的完整非工作日区间,不裁剪日期两端。将结果绑定 `disabled-ranges` 后,原有拖动、编辑、批量操作会复用可用时间校验。多日任务中的任意休息日也会被拦截。 工作日期和每日小时分别约束:补班日不会自动覆盖 `working-hours` 中禁止周末的配置。本例把每日 09:00–18:00 应用到全部星期,再由工作日历决定哪些日期开放。额外的维护禁用区间仍然有效,补班不解除维护。现有预约不会因切换日历而自动移动或删除,再次编辑时重新校验。 可见范围生成的禁用区间只保证该范围;demo 还在 `before-transaction` 中为提案完整时间段生成区间,避免编辑至视图外漏校验。生产接口仍需按完整资源、时区、权限和版本做服务端校验。日历没有配置的日期继续按 workingDays 判断,因此业务需提供所需年份的休假/补班数据。 修改工作日历可能改变“最后工作日”的原始发生时间,已有例外不能自动迁移;请沿用系列规则变更的显式清理或迁移策略。本轮不包含地区节假日下载、调休规则推算、按资源选择多个企业日历或工作小时的日期级覆盖。 ### 修改本次及以后 Example source: src/scheduler/__demos__/recurrence-following.vue ```vue ``` `splitSchedulerRecurrence` 生成系列层提案,不直接修改日历或调用服务端。示例使用外部 Cedar Dialog 选择“仅本次 / 本次及以后”,将系列与例外一起保存成功后再发布到日历。模拟保存失败会保留原数据与表单。 ```ts import { splitSchedulerRecurrence } from "@cedar-design/ui/scheduler/core"; const proposal = splitSchedulerRecurrence( series, exceptions, selectedOccurrence, { nextEvent: { ...editedOccurrence, id: "new-series-id" }, exceptionPolicy: "discard", // 明确清除本次及以后的例外;默认 reject }, ); // 先原子保存 proposal.series / proposal.exceptions,再更新业务状态。 // proposal.removedExceptions 可用于展示清除内容或审计。 ``` | 选项 / 返回值 | 说明 | | ------------------- | ---------------------------------------------------------------------------------------------------------- | | nextEvent | 新系列的完整已排期起点,id 必须与全部已有系列不同;省略表示取消本次及以后 | | rule | 可选完整新规则;省略继承原频率、间隔、星期、截止时间,并扣除之前已发生的次数;传入时完整替换,包括终止条件 | | exceptionPolicy | reject(默认)保护后续例外,discard 明确清除;不会自动把旧例外映射到新系列 | | maxIterations | 校验扫描上限,默认 100000;超出抛错,不返回部分提案 | | series / exceptions | 可一起原子保存的新系列与保留例外,不修改输入 | | removedExceptions | 本次及以后被清除的例外副本 | 切分点用 `originalStart`,即使某次会议已经被移到其他日期,也不会改变它在系列里的位置。之前的系列和实例 ID 保持不变;后续实例获得新系列 ID。此前发生但移动到未来的例外继续保留,未来发生但移动到过去的例外仍属于后续范围。 从第一次拆分会直接替换原系列;取消第一次及以后会删除整个系列。默认继承规则时,取消记录仍占原始次数;until 保持原截止时间。如果更改起点日期,新起点必须匹配继承或显式传入的新规则。需要改变星期、次数或截止时间时,请传完整 rule;不传 count / until 的新规则会持续重复。 本例默认保护已有例外,选择“清除后续例外”后才允许删除它们。该选择同样适用于取消后续安排。完整 RRULE、自动迁移后续例外、跨时区系列和多人并发版本合并不包含在此 API 中。服务端仍需检查版本、权限与所有后续冲突,并原子保存整个提案;仅检查当前可见窗口不足以确认系列有效。 ### RRULE、时区与夏令时 Example source: src/scheduler/__demos__/zoned-recurrence.vue ```vue ``` 高级引擎从 `@cedar-design/ui/scheduler/adapters` 导入,使用 [rrule](https://github.com/jkbrzt/rrule) 解析 RFC RRULE 字段、使用 [Temporal polyfill](https://github.com/js-temporal/temporal-polyfill) 转换 IANA 时区,未替换轻量 core 重复规则。 `expandSchedulerRRule({event, rule, timeZone?}, range, options?)` 接受定时种子和单个 RRULE 值(可带 RRULE: 前缀),DTSTART 由 event.start 唯一决定,不能在 rule 中再次指定。支持 BYDAY、BYSETPOS 等规则;options 提供 excludeDates/includeDates(真实时间点)、maxOccurrences、maxIterations。超出预算抛错,不静默截断。生成稳定的 seriesId/originalStart,供业务保存例外。 `schedulerZonedDate(localDateTime, timeZone, disambiguation?)` 将当地时间转换为 Date;不存在或重复时间默认 reject,可明确选择 earlier、later、compatible。`formatSchedulerZonedDate` 格式化真实时间点。RRULE 保持指定地区当地时刻、持续时间保持实际毫秒数。当前组件网格仍采用运行环境本地时间;时区 demo 通过卡片格式化展示指定时区,不将本地网格宣称为完整的多时区编辑器。 ## 编辑与交互 ### 拖拽虚影与实时拉伸 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-date` | 初始定位日期 | 拖拽虚影与实时拉伸、复制日程、自定义卡片拖入新增 | | `default-mode` | 非受控默认视图 | 拖拽虚影与实时拉伸、复制日程、自定义日程与只读 | | `resources` | 当前可见资源行/列及本地选项,不要求全量目录 | 拖拽虚影与实时拉伸、复制日程、自定义卡片拖入新增 | | `before-change` | 返回 false 取消;异步拦截、保存接口 | 自定义日程与只读、自定义新建 / 编辑表单、完全自定义弹窗 / 页面 | | `resource-label` | 资源字段名称,如设备、会议室 | 拖拽虚影与实时拉伸 | | `start-hour` | 时间网格起始小时,0–23 | 拖拽虚影与实时拉伸 | 拖拽与拉伸预览不显示额外的虚线框,保留日程自身的主题样式、半透明反馈和动态尺寸变化。移动时鼠标旁显示紧凑的标题/时间摘要,不复制完整自定义卡片;摘要限制在屏幕边缘内,日历中的落点预览即时跟随吸附位置,按 Escape 取消且不保存。 时间格在普通悬停、拖拽及拉伸期间均不显示悬停背景,键盘焦点提示不受影响。 标题可留空:内置编辑器、自定义编辑器的 `save` 和实例 `change` 在保存时会将空标题或纯空格标题补为“无主题”(英文环境为 `Untitled`),然后再进行校验和调用 `before-change`。独立核心函数仍要求传入有效标题。 移动日程时显示保留标题、自定义插槽内容和主题色的半透明虚影,目标位置显示吸附预览及预计起止时间。日/周/资源日程视图的定时日程支持上边缘调整开始、下边缘调整结束;按 `step` 吸附,最短时长为一个步长。预览不改变原数据,松手后仍经过校验和 `before-change`,失败保留原值。 同一资源列内只移动时间时,保持原有 `resourceIds` 及其顺序;跨资源移动才替换来源资源,其他参与资源保持关联。 按 Escape、取消指针、窗口失焦或交互被禁用会撤销预览;动画遵循系统减少动态效果设置。月、全天行和资源时间线支持移动预览,精确起止拉伸仅在定时时间网格提供。 开始新的指针手势会取消残留的旧手势;自定义卡片内部阻止松手事件冒泡也不会导致其他日程跟随拉伸。拖拽只提交当前日程的数据,多资源列中的同一日程(相同 `id`)会同步显示;保存后若产生时间重叠,卡片会按重叠布局重新分列。 Example source: src/scheduler/__demos__/drag-feedback.vue ```vue ``` 下方“已提交日程”直接展示 v-model 的起止时间与资源 ID,便于核对只修改目标日程;预览不是提交值。可使用“重置日程”恢复两个独立 ID 的初始场景。 ### 复制日程 Example source: src/scheduler/__demos__/duplicate-events.vue ```vue ``` 详情中的“复制日程”使用当前已保存日程创建新草稿,未保存的表单修改不会带入。副本保持标题、日期、时长、全天状态、资源、描述、颜色、`metadata`,生成新 ID;取消不创建数据。定时、全天、未排期均支持。保存仍经过工作时间、维护、容量、冲突和保存钩子,成功后可以撤销重做。 示例中的“下一次副本保存失败”只拒绝下一次提交,并自动复位;失败时抽屉保留草稿,可直接点击保存重试,不需要先关闭抽屉操作外部开关。此开关仅模拟本地保存,不是组件属性。 保存被容量、可用时间或业务钩子拒绝时,编辑器保留草稿与错误以便修正重试;点击取消关闭编辑器后清除该次错误,不在日历外层残留过期提示,已保存模型不变。 实例方法 `duplicateEvent(id): boolean` 用于打开复制草稿;返回 `true` 只表示草稿已打开或编辑请求已发出,**不表示已保存**。日程不存在、只读或组件正在加载/保存、禁用时返回 `false`。`editable=false` 时发送 `editor-request`,其 `action='create'`、`source='duplicate'`。自定义 `editor` 插槽可调用 `duplicate()`;新建模式下该动作无效。 纯核心 `duplicateSchedulerEvent(event, newId)` 从 `@cedar-design/ui/scheduler/core` 导出,返回脱离原数据的标准 `SchedulerEvent`,不修改源数据,也不执行保存。调用者负责 ID 在数据集中的唯一性;空 ID、与源相同 ID、非法或只读源日程会抛错。复制重复实例不会保留 `seriesId/originalStart`,会成为独立普通日程。标准 `metadata` 会浅复制;未声明的对象扩展字段不会自动复制,需要应用在提交前按自身规则添加。 ### 单击日程直接弹窗 Example source: src/scheduler/__demos__/event-dialog.vue ```vue ``` 通过 `editable=false` 与 `editor-request` 接入内部 Dialog,单击堆叠卡片即可编辑;新建也使用同一窗口。取消不提交,保存调用 Scheduler 的 `change`,复用只读、冲突与保存钩子校验。 ### Popover 摘要与高级编辑 Example source: src/scheduler/__demos__/event-popover.vue ```vue ``` 通过 `event` 插槽放置受控 Popover,以日程卡片为锚点;`editor-request` 打开对应摘要。同一 Popover 模式也处理点击空白单元格新增:锚定该单元格,填写名称后可直接创建;“高级编辑”携带当前草稿打开完整 Dialog。工具栏“新建日程”等非单元格入口仍直接打开窗口,拖入和复制也不按单元格点击处理。只读时提供“查看完整详情”;点击外部、Escape、切换日期或开始指针操作关闭摘要。示例站点与负责人为演示字段,可替换为业务资源数据。 摘要锚定整张日程卡片:依次尝试右侧顶部、左侧顶部、右侧底部、左侧底部对齐;两侧够宽但上下都放不下时,尽量保留侧边并贴视口边界。两侧太窄则尝试卡片上方或下方,最终位置限制在视口内,保留 8px 边距。弹层默认宽 360px,超宽自动收窄,超高内部滚动;跟随页面/容器滚动、窗口和可视视口尺寸变化重新定位。 两个示例共享编辑实现,包含日期、标题、说明、删除、取消和失败重试。无需新增 Scheduler 公共 API,也可按相同方式接入业务弹窗。 日程的 `color` 用作文字、前景和图案颜色;`accentColor` 单独设置可操作日程左侧的强调线,省略时跟随 `color`;`backgroundColor` 设置卡片底色,`backgroundPattern` 可选 `solid`、`diagonal-stripes`、`dots`、`crosshatch`。全局只读、禁用、日程只读或当前不可拖拽时,卡片不显示左侧操作强调线。图案使用语义枚举,便于不同业务类型保持一致。 业务类型不是 Scheduler 的内置枚举。应用可把 `typeId` 等信息放入 `metadata`,再在自定义编辑器中映射为标题建议、外观和权限;Scheduler 不读取这些内容,只在新建、编辑、拖动和复制过程中保留一层独立副本。 ### 自定义卡片拖入新增 左侧卡片通过 `sidebar-extra` 插槽自定义,不需要提前写入日程数据。绑定原生 `dragstart` 到 `startDrag(template, $event)`,`dragend` 到 `cancelDrag`。 拖入日/周/资源时间格识别准确时刻和目标资源;月格与全天行生成一天的全天日程;资源时间线识别日期和资源,以 `start-hour` 为开始时间。议程视图没有拖入目标。 落下后打开内置编辑弹层,确认才新增,取消不保存,模板可重复使用。`duration` 为正数分钟,省略时使用 `step`;全天落点忽略分钟时长。目标资源优先于模板的 `resourceIds`。 只读、禁用、加载、提交中或内置编辑器已打开时不可拖入。`editable=false` 时拖入改为触发 `editor-request`,交由外部页面确认。保存复用 `before-change`、冲突校验和受控更新逻辑。此示例使用桌面原生拖拽,触屏及键盘用户仍可用工具栏新增入口。 Example source: src/scheduler/__demos__/custom-cards.vue ```vue ``` ### 自定义日程与只读 插槽提供展示内容;外层已经是可聚焦按钮,插槽内避免嵌套交互控件。只读仍能打开详情。 Example source: src/scheduler/__demos__/custom-event.vue ```vue ``` ### 自定义新建 / 编辑表单 `editor` 插槽替换内置 Drawer 的内容,`action` 区分 `create` / `edit`。`event` 是隔离草稿,可修改其字段;`save(event)` 提交完整日程,`save()` 提交当前自定义草稿。不得修改草稿 ID。二者都保留校验和 `before-change`,成功才自动关闭;取消不会写入数据。 `error` 是结构化 SchedulerError,`errorMessage` 是当前语言的显示文案,包含内置字段校验或保存失败。自定义内容负责显示错误并根据 `readonly` / `pending` 禁用控件。`save` 是触发提交的动作,不返回成功 Promise;需要等待结果请使用实例 `change()`。`remove()` 和 `duplicate()` 在新建模式下无效。 Example source: src/scheduler/__demos__/custom-editor.vue ```vue ``` ### 完全自定义弹窗 / 页面 设置 `editable=false` 后,工具栏新增、空白格点击、卡片拖入和已有日程点击统一通过 `editor-request` 交给业务方。组件不打开内置 Drawer,也不自动保存。`request.event` 已带生成的 ID、日期/时间和资源;`source` 标明来源,`readonly` 用于只读详情。 Example source: src/scheduler/__demos__/external-editor.vue ```vue ``` 示例中的“下一次模拟接口提交失败”只拒绝一次保存或删除,随后自动复位;失败时 Dialog 保留草稿,保存可直接再次确认,删除可再次点击删除,无需关闭窗口操作外部开关。取消则丢弃未保存草稿。 业务方可以使用 Dialog、独立路由或其他表单。确认时调用 `change({ type: request.action === 'create' ? 'create' : 'update', event })`,等待返回 `true` 后关闭;返回 `false` 时保留表单,可监听 `change-error` 显示错误。删除已有日程使用 `type: 'remove'`。 只绑定 `editor-request` 来打开外部表单,不要再通过 `cell-click` / `event-click` 打开一次。内置编辑模式不触发 `editor-request`。工具栏和拖入不是格子点击,不触发 `cell-click`。 外部页面自己管理取消、重复打开、提交中禁止关闭、卸载后的响应和编辑快照/版本。示例拒绝覆盖已打开的窗口,并在提交前比对打开时的数据;Scheduler 的 `change()` 只检查提交过程中的并发变化,不代替业务页面打开期间的版本校验。真正跨路由的表单还需自行持久化草稿并对接服务端,不能在 Scheduler 卸载后继续调用旧实例。 ### 多选、批量操作与撤销重做 Example source: src/scheduler/__demos__/batch-history.vue ```vue ``` ### 原子事务交换 Example source: src/scheduler/__demos__/atomic-swap.vue ```vue ``` ### 批量与事务约定 | 属性 | 说明 | 默认值 | | ------------------------------------- | ----------------------------------------------------------- | ------ | | selectable | 展示多选模式开关;开启模式后点击卡片切换选中,暂停卡片拖拽 | false | | selected-keys / default-selected-keys | 选中日程 ID,支持 `v-model:selected-keys`;共享日程只计一次 | 空数组 | | history | 开启本地撤销/重做,展示工具栏 | false | | history-limit | 最多保留历史条数,正整数 | 20 | | before-transaction | 一次性校验或保存整笔事务;返回 false 取消,异常保留数据 | — | | 实例方法 | 说明 | | ---------------------------------------- | ------------------------------------------------------------------- | | `transaction(changes): Promise` | 原子提交多条 create/update/remove/move/resize;每个 ID 只能出现一次 | | `undo(): Promise` | 撤销最近一次已接受变更,重新经过规则与保存钩子 | | `redo(): Promise` | 重做最近一次撤销 | | `canUndo` / `canRedo` | 当前是否允许撤销/重做 | 新增 `transaction(value, context)` 与 `transaction-error(error, context)` 事件;context 包含 `action`(change/undo/redo)、`changes`、`previousValue` 和 `value`。原单条 `change` / `change-error` 事件仅在事务含一条变更时触发,多条变更不会逐条触发这些事件。 **保存钩子约定:**设置 `before-transaction` 后,它统一接管单条、批量、撤销和重做,替代 `before-change`,避免同一操作保存两次。只有 `before-change` 的旧应用保持单条行为;执行多条事务会明确返回 `transaction-hook-required`,请迁移到一次性的原子保存接口。前端原子提交不能替代后端数据库事务。 ```ts import type { SchedulerBeforeTransaction } from "@cedar-design/ui"; const beforeTransaction: SchedulerBeforeTransaction = async (context) => { // 在这里向业务后端提交整个 context.changes;失败抛错或返回 false。 // 后端应对整批变更校验版本、权限和最终资源占用,再原子保存。 }; ``` 批量后移保留本地时分;包含未排期任务时整批拒绝,避免静默遗漏。添加资源为追加去重,不替换其他参与人。只读成员、禁用资源、工作时间和维护冲突均会阻止整批操作。 受控模式中,父组件接受对应 `update:model-value` 后才记录历史;若父组件不接受,撤销不可用。父组件接受的数据若与提案不同(例如服务端重写字段),视为外部更新并清空本地历史。其他外部数据更新也会清空历史,避免覆盖别人或后端的修改。规则变更不会清空历史,但撤销必须通过当前规则。关闭 history 清空历史,新的成功变更清空重做分支。历史只属于当前组件实例,不是多人协作版本历史。 ### 拖选、吸附间隔与月历更多日程 Example source: src/scheduler/__demos__/interaction-completion.vue ```vue ``` `drag-to-create` 在日、周、资源日程的空白时段启用指针拖选,支持同一列内向前或向后选择。释放后打开创建表单;Escape、失焦或禁用取消。单击和键盘激活仍可创建日程。 触屏拖动日程、调整起止时间或拖选空白时段需要长按 350ms。长按生效前移动超过 8px 会取消排期手势,把操作留给页面滚动;鼠标仍保持 5px 移动阈值,无需等待。粗指针设备上的上下缩放热区扩大到至少 14px,视觉线条尺寸不变。 焦点位于日程、时间单元格、月视图日期或“还有 N 项”入口时,方向键会按屏幕中的上下左右位置移动到最近的可用日历控件。Enter/Space 沿用 Cedar Button 的原生激活行为;禁用项和不可见项会被跳过。导航只在日历内容区生效,不接管工具栏、编辑器及表单输入。关闭内置编辑器后焦点返回原触发控件;若该日程已删除或视图已变化,则定位到原位置附近的可用日历控件,最终回退到 Scheduler 容器。 `slot-duration` 控制网格分钟数,`snap-duration` 控制指针吸附,`default-duration` 控制单击新建时长,均省略时回退旧 `step`。例如 60 / 15 / 45 表示一小时格、15 分钟吸附、45 分钟默认任务。拖选使用选择区间;外部模板的 duration 优先。指针拖动时间线也按吸附间隔定位;吸附以当前单元格真实开始时间为锚点。 月视图默认每天直接显示 3 条日程,固定单元格高度;超出时显示“还有 N 项”。点击后使用 Cedar Popover 展示当天全部日程,选择其中一项可进入详情。`month-event-limit` 可调整直接展示数量;隐藏周末仍沿用真实日期。 ### 依赖、里程碑与时间线缩放 Example source: src/scheduler/__demos__/advanced-planning.vue ```vue ``` `dependencies` 为 `{id, fromId, toId, type?, lag?}[]`,支持 finish-to-start(默认)、start-to-start、finish-to-finish、start-to-finish,lag 为实际经过分钟数,可为负。纯函数 `getSchedulerDependencyIssues` 返回无效配置、缺失端点、循环和时间顺序问题;提交使用最终事务状态校验,失败返回 dependency 错误。尚未排期的端点不检查时间顺序。删除事件前需先移除相关依赖。 资源时间线为当前已挂载的两端绘制依赖连线;虚拟列表中一端不在视口时不绘制。此功能不会自动重排其他任务。`milestone: true` 表示定时零时长里程碑,必须 start=end,不支持全天或未排期;以 ◆ 显示,不占容量,可移动而不能拉伸。 `zoom/default-zoom/update:zoom` 控制 0.5–4 倍时间线缩放,工具栏提供放大缩小;以当前视口中心的时间为锚调整横向位置。`show-date-header` 默认开启日期分组表头。资源名称在横向滚动时固定。 ## 异步加载与保存 ### 异步目录、分页与 ID 回显 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `default-mode` | 非受控默认视图 | 异步目录、分页与 ID 回显、按范围远程加载、异步保存 | | `resources` | 当前可见资源行/列及本地选项,不要求全量目录 | 异步目录、分页与 ID 回显、异步保存 | | `before-change` | 返回 false 取消;异步拦截、保存接口 | 异步目录、分页与 ID 回显、异步保存 | | `default-date` | 初始定位日期 | 异步目录、分页与 ID 回显、异步保存 | | `resource-label` | 资源字段名称,如设备、会议室 | 异步目录、分页与 ID 回显 | | `request-resources` | 按关键词和游标查询候选资源 | 异步目录、分页与 ID 回显 | 示例可切换设备接口和人员接口。仅提供当前 4 条可见资源,而已有日程关联第 12 条,通过 `resolve-resources` 单独回显。打开资源下拉框后远程搜索、滚动或点击加载更多;搜索结果不会添加资源视图的行/列。可模拟搜索与回显失败,查看 ID 保留及重试。 示例状态文案按当前请求更新:回显或搜索失败后,成功重试会清除旧失败提示;切换设备/人员接口会重置示例反馈。失败和重试都不会将资源显示名称写进日程,关联仍只存稳定 ID。 Example source: src/scheduler/__demos__/async-resources.vue ```vue ``` 日程只保存 `resourceIds`;`id` 是稳定标识,`label` 是显示名称。业务层把 `userId/displayName`、`deviceId/deviceName` 等接口字段映射为 `{ id, label }`。不要把名称当 ID,也不要为了回显把全量目录放进 `resources`。 | 数据入口 | 职责 | | ----------------- | ------------------------------------------------------------------- | | resources | 当前资源视图的行/列及本地候选项,可以是部分目录;同 ID 时优先于缓存 | | request-resources | 远程搜索与游标分页,返回候选项,不修改可见行/列 | | resolve-resources | 根据已有 ID 批量加载名称,不依赖当前搜索页 | | before-change | 对接服务端有效性、权限、全量冲突与保存校验 | ```ts import type { SchedulerRequestResources, SchedulerResolveResources, } from "@cedar-design/ui"; const requestResources: SchedulerRequestResources = async ({ query, cursor, signal, }) => { const params = new URLSearchParams({ query }); if (cursor !== undefined) params.set("cursor", cursor); const response = await fetch(`/api/devices?${params}`, { signal }); if (!response.ok) throw new Error("设备查询失败"); const page = await response.json(); return { items: page.items.map((item) => ({ id: String(item.deviceId), label: item.deviceName, })), nextCursor: page.nextCursor, // 没有下一页时省略;游标使用非空字符串 }; }; const resolveResources: SchedulerResolveResources = async (ids, { signal }) => { const response = await fetch("/api/devices/by-ids", { method: "POST", signal, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ids }), }); if (!response.ok) throw new Error("设备回显失败"); const items = await response.json(); return items.map((item) => ({ id: String(item.deviceId), label: item.deviceName, })); }; ``` 同一实例缓存回显结果,并合并请求中的重复 ID;不在实例之间共用数据。搜索更换关键词会取消旧请求,即使接口未响应取消信号也忽略过期结果。切换 `resolve-resources` 回调会清空回显缓存;切换租户/目录建议给 Scheduler 设置不同 `key`,隔离搜索结果、缓存和编辑草稿。 回显查不到或失败时保留原 ID 并用 ID 显示,不会清空日程关联或禁止保存。失败触发 `resource-error`;可通过提示按钮或重新打开选择器重试。远程请求只影响资源控件的加载状态,不锁住整个日程。 当前未加载的资源不等于无效资源。已知 `disabled` 的资源不能新增分配,已有关联可保留/移除;保存期间新增分配的资源变为禁用会阻止保存,但目录翻页、补全名称不会使保存过期。`allow-overlap=false` 仅检查已加载日程,全量冲突和权限必须由服务端校验。 ### 按范围远程加载 Example source: src/scheduler/__demos__/remote-events.vue ```vue ``` `useSchedulerDataSource` 独立负责加载,不改变 Scheduler 的 `v-model` 数据所有权。将 `range-change` 写入范围 ref,将返回的 `events` 绑定到组件。需要避免在加载中或失败后编辑时,由业务设置 `readonly="loading || !!error"`;整块占位可在外层使用 Loading。 ```ts import { ref } from "vue"; import { useSchedulerDataSource } from "@cedar-design/ui"; import type { SchedulerRange } from "@cedar-design/ui"; const range = ref(); const { events, loading, error, refresh } = useSchedulerDataSource({ range, requestEvents: async ({ start, end, resourceIds, signal }) => { const params = new URLSearchParams({ start: start.toISOString(), end: end.toISOString(), resourceIds: resourceIds.join(","), }); const response = await fetch(`/api/events?${params}`, { signal }); if (!response.ok) throw new Error("加载失败"); return response.json(); }, }); ``` | 选项 | 说明 | | --------------- | ----------------------------------------------------------------------------------------------------- | | requestEvents | 查询函数或其 ref,接收 start、end、resourceIds、AbortSignal,返回日程数组或 Promise;切换函数清空缓存 | | range | 范围、ref 或 getter;undefined 暂停并清空当前数据 | | resourceIds | 可选数组、ref 或 getter;去重排序后作为查询条件,空数组表示不限资源 | | enabled | 可选 boolean、ref 或 getter,默认 true;false 取消加载并清空当前数据 | | cacheTime | 缓存有效毫秒数,默认 30000,0 禁用 | | maxCacheEntries | LRU 缓存条数上限,默认 20,0 禁用 | 返回 `events`(可写 ref)、`loading`、`error`、`loadedRange`(最后成功发布的范围)、`refresh()`(绕过当前缓存并返回成功与否)、`cancel()`(保留已发布数据,终止当前请求)、`invalidate()`(仅清空全部缓存)。在组件 setup 或 effectScope 中调用;SSR 不自动请求。 范围为 `[start, end)`:接口应返回与范围相交的完整日程,不截断跨日事件,不返回仅第一页。资源筛选条件由业务同步传入;组件内部资源筛选不会自动改变加载器条件。未排期任务可由业务接口额外包含在返回数组中。 切换范围会清空旧窗口并取消旧请求,即使接口忽略 AbortSignal,过期响应也不会覆盖最新结果。失败通过 `error` 暴露,点击刷新重试。查询结果会整体校验,重复 ID 或无效日程不会部分发布。缓存以精确范围和资源条件区分;通过 `v-model` 替换或响应式原位编辑会取消在途加载并清空缓存。Date 的原生 set 方法不会触发 Vue 响应式,请替换日期值。 加载器不执行保存。继续使用 `before-transaction` 向服务端提交 `context.changes`;不要将当前窗口的 `context.value` 当作全库替换。全局冲突、权限及原子保存由服务端校验。切换窗口属于外部数据更新,会使组件本地撤销历史失效。 ### 异步保存 before-change 返回 false 取消,抛错或拒绝 Promise 会触发 change-error 并保留原数据。期间组件禁止重复变更。如果外部数据或权限变化,旧提案失效。服务端仍需原子校验权限、版本和资源冲突。 Example source: src/scheduler/__demos__/async-change.vue ```vue ``` 示例只使用本地 600ms 模拟保存。“下一次模拟保存失败”仅失败一次后自动复位,可在保留草稿的编辑器中直接重试。“父组件接受更新”关闭后,验证通过仍只是提案,下方模型明细和卡片保持已保存值;取消编辑也不写入。卸载、停用或重置清理示例请求计时器。 ## 业务组合与集成 ### 设备排期与工单 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `resources` | 当前可见资源行/列及本地选项,不要求全量目录 | 设备排期与工单、出勤详情、打卡与关单、任务日历组合工作台 | | `default-mode` | 非受控默认视图 | 设备排期与工单、外部日历、模拟协同、ICS 与打印、出勤详情、打卡与关单 | | `default-date` | 初始定位日期 | 设备排期与工单、外部日历、模拟协同、ICS 与打印、出勤详情、打卡与关单 | | `editable` | 启用内置编辑器;false 通过 editor-request 接管 | 出勤详情、打卡与关单、任务日历组合工作台 | | `start-hour` | 时间网格起始小时,0–23 | 出勤详情、打卡与关单、任务日历组合工作台 | | `end-hour` | 时间网格结束小时,必须大于起始,最多 24 | 出勤详情、打卡与关单、任务日历组合工作台 | 相同资源 API 用于设备,无人员字段依赖。示例包括工单拖入、双设备联合占用、全天维护、只读日程及本地重叠校验。`resource-label` 自定义显示名称,不改变存储字段。 Example source: src/scheduler/__demos__/equipment.vue ```vue ``` ### 外部日历、模拟协同、ICS 与打印 Example source: src/scheduler/__demos__/calendar-integration.vue ```vue ``` `SchedulerCalendarProvider` 定义 load(range, signal)、commit(changes, expectedRevision, origin?) 与可选 subscribe。`createSchedulerMemoryProvider` 为离线示例实现:校验递增版本、发布分离快照、可注销订阅。真实服务需实现认证、持久化、权限与完整业务校验。示例用 origin 忽略自己的回声,外部更新仍触发 Scheduler 的过期保护;内部事务用本地单调版本检测等待期间数据变化。 `exportSchedulerICalendar(events, {stamp, name?})` 导出 UTC 定时事件和 DATE 全天事件,正确转义文本并按 UTF-8 75 字节折行;未排期事件明确拒绝。`importSchedulerICalendar(text, {timeZone?, disambiguation?})` 返回普通 events 与 RRULE 种子 series;要求 UID/DTSTART/DTEND。支持 UTC/IANA TZID/指定时区的浮动时间。全天 RRULE、自定义 VTIMEZONE、RECURRENCE-ID、RDATE/EXDATE/EXRULE、DURATION 及重复 UID 会明确拒绝,交由专用提供方适配,避免导入后语义丢失。 `createSchedulerPrintHtml(events, options?)` 返回独立可打印 HTML,含完整转义、重复表头及跨页设置。调用方决定打开、保存或打印;示例的打印按钮只打印此文档。 ### 出勤详情、打卡与关单 Example source: src/scheduler/__demos__/task-calendar-details.vue ```vue ``` 点击日程先打开 Popover 摘要,再通过“高级详情”查看工单、任务技能、人员、设备、标准工时、来源和打卡记录。页面用 `metadata.attendanceOrderId` 查询完整业务对象;关单后保留业务对象中的计划时间,只把 Scheduler Event 映射为实际打卡时间和只读外观。完成、休息和来源都是 Demo 业务配置。 ### 任务日历组合工作台 Example source: src/scheduler/__demos__/task-calendar-workbench.vue ```vue ``` [打开宽屏工作台](llms/zh-CN/examples/task-calendar.md)。所有日期以打开页面时的本周一和今天动态生成,包含本周/下周、逾期/临期、已关闭记录与工作日轮休。 工作台将出勤单、任务、打卡保存为独立业务 DTO,再通过 `workbench-model.ts` 投影为 SchedulerEvent:一个任务一块,同单连续任务共享 `layoutGroupId`;同时勾选人员与设备时,各生成稳定视图 ID,点击/悬停关联高亮。跨天与全天单按出勤单投影到全天区。对象色、闭单白蒙版、休息斜纹和边框都由 Demo 映射,不添加组件业务状态。 人员/设备与待办分别使用 Cedar Tree,来源搜索固定在顶部。父节点勾选由 Tree 提供,重复资源条目的选中状态由资源 ID 同步;站点快捷按钮支持再次反选。待办按设备或选中人员负责的站点聚合,逾期优先、截止日期较早优先。待办可拖空白建单、拖到已有可编辑任务块合并,也可在详情中加入已勾选任务。一次打包限制同一设备。移出任务在保存后回池,最后一项移出后解散出勤单;取消或保存失败均不修改已保存数据。 详情支持按标准工时计算计划结束、查看工单、任务 hover/focus 显示该设备打卡并定位最近记录、关联已有打卡或手动补录后关单。已关闭、休息和查看者都不可编辑。时间重叠、每日超过 8 小时及超截止日只提示;技能、数据完整性、权限和版本冲突拒绝保存。拖动期间的截止日背景通过 `column-background` 插槽显示,空白仍允许落入。 保存使用独立内存 Mock API,`重新加载` 读取该 API 当前数据,刷新浏览器会重建 Mock。`提交数据` 可查看真实提交给 Mock 的业务 DTO,未把视图投影数组当成后端主表。移动通过 `before-change` 异步准备、`change` 成功后版本比较并提交,取消或过期手势不写入服务端;表单直接调用同一业务 API。保存失败保留草稿和勾选。生产接入只替换 API,不需要修改 Scheduler。 交互取舍:详情统一用 Dialog;全天表单允许填写日期范围;任务级实际打卡时间尚无独立来源时,闭单后的任务块按标准工时比例分布在整单真实打卡区间,详情保留原始记录。原生拖放合并的目标为任务卡片内容区,键盘操作使用“加入已勾选任务”;不向核心增加出勤单 drop-target 协议。 ## API ### `` Props | 属性 | 说明 | 类型 | 默认值 | | -------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------- | ------------ | | model-value | 日程数据,支持 v-model;传入时受控 | SchedulerEvent[] | — | | preview-event | 尚未保存的新增日程占位,只参与视觉展示 | SchedulerEvent | — | | default-value | 非受控初始数据 | SchedulerEvent[] | [] | | mode | 当前视图,支持 v-model:mode | SchedulerMode | — | | default-mode | 非受控默认视图 | SchedulerMode | week | | date | 定位日期,支持 v-model:date | Date / string / number | — | | default-date | 初始定位日期 | Date / string / number | 当前日期 | | resource-dimensions | 维度定义 `{ id, label }[]` | SchedulerResourceDimension[] | [] | | resource-filters | 跨维度组合筛选,支持 v-model:resource-filters | SchedulerResourceFilters | — | | default-resource-filters | 非受控筛选初值 | SchedulerResourceFilters | {} | | resource-dimension | 资源行/列展示维度,空字符串显示全部 | string | — | | default-resource-dimension | 非受控展示维度初值 | string | '' | | resources | 当前可见资源行/列及本地选项,不要求全量目录 | SchedulerResource[] | [] | | resource-label | 资源字段名称,如设备、会议室 | string | 语言包“资源” | | request-resources | 按关键词和游标查询候选资源 | SchedulerRequestResources | — | | resolve-resources | 按 ID 批量补全名称 | SchedulerResolveResources | — | | modes | 允许切换的视图 | SchedulerMode[] | 全部六种 | | first-day-of-week | 周起始,0 周日至 6 周六 | number | 1 | | start-hour | 时间网格起始小时,0–23 | number | 8 | | end-hour | 时间网格结束小时,必须大于起始,最多 24 | number | 20 | | initial-scroll-minute | 时间网格首次显示时定位的当天分钟数,后续保留用户滚动位置 | number | — | | step | 时间格及吸附分钟,正整数且整除 60 | number | 30 | | slot-duration | 网格分钟数,正整数 | number | step | | snap-duration | 指针吸附分钟数,正整数 | number | step | | default-duration | 单击新建默认分钟数,正整数 | number | step | | drag-to-create | 日/周/资源日程空白时段拖选 | boolean | false | | month-event-limit | 月视图每日直接展示上限,超出通过 Popover 查看 | number | 3 | | overlap-event-limit | 时间网格重叠组直接展示上限,超出通过 Popover 查看 | number | — | | zoom / default-zoom | 时间线缩放,0.5–4 | number | 1 | | show-date-header | 时间线日期分层表头 | boolean | true | | show-assignment-details | 编辑资源占用量与角色 | boolean | false | | show-resource-load | 资源峰值、容量及范围利用率 | boolean | false | | rule-policy | capacity/unavailable/conflict 的 allow/warn/block 策略 | SchedulerRulePolicy | {}(block) | | dependencies | 任务依赖关系 | SchedulerDependency[] | [] | | event-layout | 时间网格布局 stack / columns / 几何回调;默认周视图 stack、其他 columns | SchedulerEventLayout | 按视图 | | readonly | 可查看和导航,不能修改 | boolean | false | | disabled | 禁用交互 | boolean | false | | hidden-days | 周、月、议程隐藏指定星期,0–6,不可全部隐藏 | number[] | [] | | show-now-indicator | 日、周、资源日程显示当前本地时间标线 | boolean | false | | show-sidebar | 显示筛选和未排期列表 | boolean | true | | allow-overlap | 允许同资源时间重叠 | boolean | true | | editable | 启用内置编辑器;false 通过 editor-request 接管 | boolean | true | | before-change | 返回 false 取消;异步拦截、保存接口 | SchedulerBeforeChange / SchedulerBeforeChange[] | — | mode 为 `day | week | month | agenda | resource-day | resource-timeline`。agenda 与资源时间线按周导航。超出时间网格小时范围的日程仍可在月/议程/时间线查看。 model-value 受控时,组件只提出新值,由父组件接受后更新界面;不会在接口失败后先移动再回滚。组件不修改输入数组或对象。before-change 得到分离副本,修改副本不会修改提交值。 ### `` Events | 事件 | 说明 | 参数 | | ------------------------ | ---------------------------------------------------------------- | ------------------------------------ | | update:model-value | 提出新主值 | SchedulerEvent[] | | update:resourceFilters | 维度组合筛选变更,受控时等待父组件接受 | SchedulerResourceFilters | | update:resourceDimension | 资源行/列展示维度变更 | string | | update:mode | 视图切换 | SchedulerMode | | update:zoom | 时间线缩放值变化 | number | | rule-warning | 提案通过时的提醒型规则问题 | SchedulerError[] | | update:date | 定位日期变更 | Date | | change | 校验和钩子完成;受控时表示已提出通过的值 | value, SchedulerChangeContext | | change-error | 校验、冲突、保存或过期提案错误 | error, SchedulerChange | | event-click | 激活日程(传出副本);叠放重叠项同样通过单击或 Enter,多选不触发 | SchedulerEvent | | cell-click | 点击空白时段 | SchedulerCell | | range-change | 首次与实际可见日期范围变化 | SchedulerRange | | resource-error | 资源搜索或回显失败,不修改日程数据 | error, SchedulerResourceErrorContext | | editor-request | 仅 editable=false:请求外部新建或查看/编辑 | SchedulerEditorRequest | ### `` Slots | 插槽 | 参数 | 说明 | | ----------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | | event | { event } | 日程按钮内容 | | sidebar | { startDrag, cancelDrag, disabled, unscheduled } | 替换整个侧栏;适合业务资源树与待排任务池,show-sidebar=false 时不显示 | | sidebar-extra | { startDrag, cancelDrag, disabled } | 默认侧栏顶部自定义内容;startDrag(template: SchedulerEventTemplate, event: DragEvent),show-sidebar=false 时不显示 | | resource-header | { resource?, resources?, date } | 资源标题或日期标题 | | toolbar | { date, mode, navigate, create } | 替换工具栏;navigate(-1/1) 切换范围,create() 走工具栏新增流程 | | column-background | { date, resource? } | 日/周/资源日程列背景,不接管指针;用于业务软提示、热力背景等 | | toolbar-extra | { date, mode } | 工具栏扩展 | | editor | SchedulerEditorSlotProps | 自定义抽屉内容:action、event、error、errorMessage、save、remove、close、readonly、pending | | empty | — | 空状态 | ### 实例方法 | 方法 | 说明 | | ---------------------------------- | -------------------------------------------------------------- | | `change(change): Promise` | 执行 create/update/remove/move/resize,复用全部校验与钩子 | | duplicateEvent(id: string) | 打开独立复制草稿或发出自定义创建请求,返回 boolean,不自动保存 | | goToDate(date: Date) | 定位日期;遵循受控模型 | ## 类型定义 ```ts import type { SchedulerProps, SchedulerInstance, SchedulerMode, SchedulerEvent, SchedulerResource, SchedulerChange, SchedulerChangeContext, SchedulerBeforeChange, SchedulerEventTemplate, SchedulerRequestResources, SchedulerResolveResources, SchedulerResourcePage, SchedulerResourceQuery, SchedulerResourceErrorContext, SchedulerEditorRequest, SchedulerEditorAction, SchedulerEditorSlotProps, } from "@cedar-design/ui"; interface SchedulerEvent { id: string; title: string; start?: Date | string | number; end?: Date | string | number; allDay?: boolean; resourceIds?: string[]; resourceDetails?: Record; milestone?: boolean; layoutGroupId?: string; description?: string; color?: string; accentColor?: string; backgroundColor?: string; backgroundPattern?: "solid" | "diagonal-stripes" | "dots" | "crosshatch"; metadata?: Record; readonly?: boolean; resizable?: boolean; // false 禁用时间网格拉伸,仍可移动/查看 } type SchedulerEventTemplate = Pick< SchedulerEvent, | "title" | "description" | "color" | "accentColor" | "backgroundColor" | "backgroundPattern" | "metadata" | "resourceIds" > & { duration?: number; // 正数分钟,默认 default-duration 或 step }; interface SchedulerResource { id: string; dimensionId?: string; label: string; color?: string; disabled?: boolean; capacity?: number; // 非负安全整数,省略不限制并发日程数 } interface SchedulerResourceQuery { dimensionId?: string; query: string; cursor?: string; signal: AbortSignal; } interface SchedulerResourcePage { items: SchedulerResource[]; nextCursor?: string; } type SchedulerRequestResources = ( query: SchedulerResourceQuery, ) => SchedulerResourcePage | Promise; type SchedulerResolveResources = ( ids: string[], context: { signal: AbortSignal }, ) => SchedulerResource[] | Promise; type SchedulerResourceErrorContext = | { type: "search"; query: string; cursor?: string } | { type: "resolve"; ids: string[] }; type SchedulerEditorAction = "create" | "edit"; type SchedulerEditorRequest = { event: SchedulerEvent; readonly: boolean } & ( | { action: "create"; source: "toolbar" | "cell" | "drop" } | { action: "edit"; source: "event" } ); interface SchedulerEditorSlotProps { action: SchedulerEditorAction; event: SchedulerEvent; error?: SchedulerError; errorMessage?: string; readonly: boolean; pending: boolean; save: (event?: SchedulerEvent) => void; remove: () => void; close: () => void; } ``` 每条日程 id 必须唯一。start/end 同时省略表示未排期;否则 end 必须晚于 start;定时 milestone 例外,要求 start=end。所有区间为 `[start, end)`,前后相邻不冲突。allDay 为 true 时使用 `YYYY-MM-DD` 字符串,end 是不包含的结束日期(一天事项如 9 月 9 日至 9 月 10 日)。 当前按运行环境本地时区显示,定时日程建议传 ISO 时间点;没有任意 IANA 显示时区的承诺。跨时区 RRULE、ICS 与版本同步从独立 adapters 入口提供,真实外部账号连接需业务实现;虚拟资源行通过 virtual-list-props 配置。本地历史撤销与按范围远程加载见上方示例。指针拖拽支持移动与拉伸,Escape 取消;键盘与触屏也可通过编辑表单完成排期/分配修改。资源选项的 disabled 禁止新增分配与拖入,已存在的关联可保留或移除。 ## 独立核心 源码 `src/scheduler/core` 不导入 Vue、DOM 或外部日历库,可单独测试及后续提取为 scheduler-core 包。发布后可直接使用纯核心子入口,避免导入组件运行时: ```ts import { applySchedulerChange, getSchedulerConflicts, layoutSchedulerEvents, } from "@cedar-design/ui/scheduler/core"; ``` 其余日期与时间线工具也从该入口导出。核心提供计算与不可变变更,不承担网络、权限认证或数据库事务。 ### 样式变量 所有变量集中于 `style/token.less`,支持亮暗主题覆盖。 | 变量名 | 默认值 | | -------------------------------- | ------------------------------ | | --c-scheduler-background | var(--c-color-bg-2) | | --c-scheduler-color | var(--c-color-text-1) | | --c-scheduler-border-color | var(--c-color-border) | | --c-scheduler-sidebar-width | 220px | | --c-scheduler-slot-height | 36px | | --c-scheduler-column-min-width | 120px | | --c-scheduler-max-height | 720px | | --c-scheduler-event-color | rgb(var(--c-primary-6)) | | --c-scheduler-event-accent-color | var(--c-scheduler-event-color) | | --c-scheduler-event-background | var(--c-color-primary-light-1) | | --c-scheduler-lane-height | 38px | | --c-scheduler-ghost-opacity | 0.75 | | --c-scheduler-preview-opacity | 0.85 | | --c-scheduler-preview-duration | 100ms | | --c-scheduler-ghost-z-index | 2000 | ### 守卫等待反馈 before-* 等待期间显示加载反馈并标记 aria-busy;拒绝或失败后恢复,重复提交不再启动同一操作。普通事件返回的 Promise 不参与加载。 --- Document: llms/zh-CN/components/scrollbar.md # Scrollbar ## 基础示例 ### 基础用法 滚动条组件基本用法。scrollbar 的默认插槽需要唯一的子元素。 Example source: src/scrollbar/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 滚动条类型 设置 `type` 属性改变滚动条类型,`track` 类型会显示滚动条轨道。 Example source: src/scrollbar/__demos__/type.vue ```vue ``` ## 生命周期与边界 ### Thumb drag lifecycle / 滑块拖动生命周期 方向、max、thumbSize、ratio的有效值变化取消当前手势;仅替换等值data对象不取消连续拖动。最终偏移仍由父级新测量/setOffset结算。几何读取与响应式写入后重新核对会话,防止同步卸载后绑定或通知。停用/卸载保留按下/轨道点击/setOffset入口无效且不preventDefault;非左键不启动/跳转。当前setOffset夹取、拖动期间忽略外部setOffset和轨道一thumb-size步进保持。没有Pointer/touch拖动协议迁移或原生滚动回滚承诺。 Example source: src/scrollbar/__demos__/thumb-lifecycle.vue ```vue ``` ### Scrollbar consumer lifecycle / 滚动条消费者生命周期 scrollTo(0,0)/单轴0是合法坐标,不用真值判断;恢复零位置也同步thumb,不保留上次偏移。水平测量使用水平比例(旧代码误用了垂直比例)。零/无效视口用有限、非负thumb数据,不显示该零尺寸轴;正常最小thumb20px与track15px布局策略不变。禁用/隐藏轴的旧thumb命令无效,但禁用条不等于禁止内容或公开原生滚动。对象选项直接透传、不模拟JS动画;公开方法签名/样式变量不变。 Example source: src/scrollbar/__demos__/lifecycle.vue ```vue ``` ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ----------- | ---------- | ----------------------- | :-------: | | type | 类型 | `'track' \| 'embed'` | `'embed'` | | outer-class | 外层的类名 | `string\|object\|array` | `-` | | outer-style | 外层的样式 | `StyleValue` | `-` | ### `` Events | 事件名 | 描述 | 参数 | | ------ | ---------- | ---- | | scroll | 滚动时触发 | - | ### `` Methods | 方法名 | 描述 | 参数 | 返回值 | 版本 | | ---------- | -------- | ---------------------------------------------------------------- | ------ | :----- | | scrollTo | 滚动 | options: `number \| {left?: number;top?: number}`
y: `number` | - | | | scrollTop | 纵向滚动 | top: `number` | - | 2.40.0 | | scrollLeft | 横向滚动 | left: `number` | - | 2.40.0 | ### 类型定义 组件导出以下类型定义 ```ts import type { ScrollbarBoxInstance } from '@cedar-design/ui' ``` --- Document: llms/zh-CN/components/search.md # Search 搜索组件,支持基础搜索、按钮搜索、字段搜索和受控的最近搜索记录。组件内部不持久化搜索历史;开发者可以根据 `search` 事件返回的 `recentSearches` 自行缓存到本地、服务端或状态管理中,再通过 `recent-searches` 回传给组件。 先看关键词与提交,再看字段模型,最后接入受控历史和自定义展示。组件不发业务请求,外部在 search 事件中处理异步任务并控制 loading。 ## 基础示例 ### 基础用法 输入关键词后按 Enter 提交;本例只展示一个关键词和提交结果。字段模型与历史记录在后续独立案例中说明。 Example source: src/search/__demos__/basic.vue ```vue ``` ## 数据与选项 ### 搜索按钮 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ----------------- | -------------------- | ------------------------------------------ | | `placeholder` | 占位符 | 搜索按钮、带下拉字段选择、本地缓存搜索历史 | | `search-button` | 是否显示公共搜索按钮 | 搜索按钮、带下拉字段选择 | | `recent-searches` | 受控搜索历史 | 带下拉字段选择、本地缓存搜索历史 | | `button-text` | 公共搜索按钮文字 | 搜索按钮 | | `fields` | 搜索字段可选项 | 带下拉字段选择 | | `select-style` | 字段选择器样式 | 带下拉字段选择 | 点击按钮提交与按 Enter 使用相同的 search 事件。 Example source: src/search/__demos__/search-button.vue ```vue ``` ### 带下拉字段选择 Example source: src/search/__demos__/with-fields.vue ```vue ``` ### 本地缓存搜索历史 Example source: src/search/__demos__/local-storage.vue ```vue ``` ## 自定义与插槽 ### 历史展示与插槽 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ----------------- | ------------------------------------------------- | -------------- | | `edit-mode` | 搜索编辑方式:direct 为直接搜索,popup 为弹层搜索 | 历史展示与插槽 | | `recent-searches` | 受控搜索历史 | 历史展示与插槽 | | `label` | 搜索框左侧文本 | 历史展示与插槽 | | `placeholder` | 占位符 | 历史展示与插槽 | | `clearable` | 是否可清除 | 历史展示与插槽 | | `show-action` | 是否显示操作按钮 | 历史展示与插槽 | Example source: src/search/__demos__/presentation.vue ```vue ``` ## 交互与控制 ### 交互状态切换 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | -------------------------------- | -------------------- | | `placeholder` | 占位符 | 交互状态切换、加载中 | | `loading` | 是否处于加载状态;加载时禁止提交 | 交互状态切换、加载中 | | `readonly` | 是否只读 | 交互状态切换、加载中 | | `search-button` | 是否显示公共搜索按钮 | 加载中、受控字段模型 | | `disabled` | 是否禁用 | 交互状态切换 | | `default-value` | 非受控默认关键词 | 加载中 | 适用于关键词输入与搜索提交。调整禁用、只读,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。 Example source: src/search/__demos__/state-lab.vue ```vue ``` ### 加载中 Example source: src/search/__demos__/loading.vue ```vue ``` ### 受控字段模型 Example source: src/search/__demos__/controlled-fields.vue ```vue ``` ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### 属性 | 参数 | 说明 | 类型 | 默认值 | | -------------------------- | ------------------------------------------------- | ------------------------- | -------------------------- | | `v-model` | 搜索关键词 | _string_ | `-` | | `default-value` | 非受控默认关键词 | _string_ | `''` | | `v-model:model-field` | 当前搜索字段 | _string_ | `-` | | `default-field` | 非受控默认字段 | _string_ | `-` | | `v-model:model` | 字段搜索模式下按字段写入的对象 | _Record_ | `-` | | `fields` | 搜索字段可选项 | _SearchField[]_ | `[]` | | `select-style` | 字段选择器样式 | _StyleValue_ | `-` | | `recent-searches` | 受控搜索历史 | _string[]_ | `[]` | | `max-search-history-count` | 生成下一份历史时保留的最大数量 | _number_ | `5` | | `edit-mode` | 搜索编辑方式:direct 为直接搜索,popup 为弹层搜索 | `'direct' \| 'popup'` | `'direct'` | | `search-button` | 是否显示公共搜索按钮 | _boolean_ | `false` | | `button-text` | 公共搜索按钮文字 | _string_ | `-` | | `button-props` | 公共搜索按钮属性 | _ButtonProps_ | `-` | | `loading` | 是否处于加载状态;加载时禁止提交 | _boolean_ | `false` | | `clearable` | 是否可清除 | _boolean_ | `false` | | `variant` | 输入框风格,可选 `filled` `outline` `standard` | _string_ | `outline` | | `size` | 输入尺寸,继承 Form / ConfigProvider | `xs / sm / md / lg / xl` | `md` | | `placeholder` | 占位符 | _string_ | `-` | | `disabled` | 是否禁用 | _boolean_ | `false` | | `readonly` | 是否只读 | _boolean_ | `false` | | `label` | 搜索框左侧文本 | _string_ | `-` | | `shape` | 内层搜索框形状,可选 `round` `square` | _string_ | `square` | | `background` | 外层背景色 | _string_ | `-` | | `input-background` | 内层搜索框背景色 | _string_ | `-` | | `show-action` | 是否显示操作按钮 | _boolean_ | `false` | | `action-text` | 操作按钮文字 | `string` | 跟随全局语言与 action-type | | `action-type` | 操作类型,可选 `cancel` `search` | _string_ | `cancel` | | `search-icon` | 搜索图标名称 | _string_ | `magnify` | | `max-length` | 最大长度 | _string \| number_ | `-` | | `enterkeyhint` | 虚拟键盘回车键提示 | _string_ | `search` | ### 事件 | 事件名 | 说明 | 回调参数 | | ------------------- | ---------------------------------------- | ------------------------------------ | | `update:modelValue` | 关键词更新时触发 | `value: string` | | `update:modelField` | 字段更新时触发 | `field: string` | | `update:model` | 字段表单更新时触发 | `model: Record` | | `input` | 输入期间触发 | `value: string, event: Event` | | `change` | 失焦、Enter 提交或切换字段时触发 | `value: string, event: Event` | | `clear` | 清除时触发 | `event: Event` | | `search` | 点击图标/按钮、按 Enter 或选择历史时触发 | `result: SearchResult, event: Event` | | `focus` | 聚焦时触发 | `event: FocusEvent` | | `blur` | 失焦时触发 | `event: FocusEvent` | | `cancel` | 点击移动端取消按钮时触发 | `event: Event` | ### 插槽 | 名称 | 说明 | 参数 | | ---------------- | ------------------------------------ | ----------- | | `prefix` | 输入框前缀;提供后将替换默认搜索图标 | `-` | | `suffix` | 输入框后缀 | `-` | | `clear-icon` | 清除图标 | `{ clear }` | | `button-default` | 公共搜索按钮内容 | `-` | | `button-icon` | 公共搜索按钮图标 | `-` | | `label` | 左侧标签 | `-` | | `action` | 操作按钮内容 | `-` | ### 方法 | 方法名 | 说明 | 参数 | 返回值 | | ------- | ---- | ---- | ------ | | `focus` | 聚焦 | `-` | `-` | | `blur` | 失焦 | `-` | `-` | ### SearchField | 参数 | 说明 | 类型 | | ------------- | ------------------------------------------ | -------- | | `label` | 字段文案 | _string_ | | `value` | 字段值 | _string_ | | `placeholder` | 字段占位符,优先于 Search 的 `placeholder` | _string_ | ### SearchResult | 参数 | 说明 | 类型 | | ---------------- | -------------- | -------------------------------------- | | `modelField` | 搜索字段 | _string \| undefined_ | | `modelValue` | 原始搜索关键词 | _string_ | | `model` | 字段表单对象 | _Record \| undefined_ | | `recentSearches` | 下一份搜索历史 | _string[]_ | 输入事件约定:编辑时先 `input`、再 `update:modelValue`;失焦提交仅在值变化时触发 `change`。清空依次触发 `clear → input → update:modelValue → change`,各一次,同时只更新一次搜索字段模型,不自动执行搜索。 输入事件先于模型更新。Enter 会等待 Input 提交及受控模型回填后生成搜索结果;父级拒绝 trim 提议时,搜索仍使用实际受控值。清空按 clear → input → update:modelValue → change 通知,不自动执行搜索。 ## 受控模型协议 值优先级为 `modelValue` > `model[当前字段]` > 非受控 `defaultValue`。传入 `model` 且存在当前字段时,缺失/null 字段显示空字符串;同时绑定多个模型时,应在父级保持它们一致。`modelField` 优先于 `defaultField` 和第一项字段;受控值不会被内部强制覆盖。 `model` **不会被原地修改**。每次逻辑更新发出一份 `update:model` 新对象,清空已声明的其他字段、保留未声明属性;请使用 `v-model:model` 或显式接受提议。字段切换只产生一次 `update:modelField → update:modelValue → update:model → change`。父级可拒绝提议,Enter、按钮、历史项搜索均等待一轮更新后读取实际接受的字段、关键词和模型。 历史不按输入过滤,也不内部持久化;`search` 返回的新历史统一 trim、去空、去重并截取最大数量。空关键词不添加记录,非有限/负数最大数量按 0 处理。清空不执行搜索;取消提议空字符串并发出 cancel/change,不提交搜索。 输入编辑发出 `input → update:modelValue`;提交值变化时才发出 `change`。清空为 `clear → input → update:modelValue → change`,仅一次。只读、禁用、loading 会阻止搜索/取消/历史/字段操作;禁用和只读可继承 Form / FormItem / InputGroup。失活或卸载会取消未完成的异步搜索。 ### 跨端边界 双方控制器、公开 API 和历史内容独立同源。两端默认 `presentation=inline`;Cedar 默认 `shape=square`,Maple 默认 `shape=round`;显式开启后分别使用本地 Drawer / Popup,不共享实例。Cedar 保留 InputGroup,Maple 保留移动搜索条布局和触控间距。Input 支持 `xs/sm/md/lg/xl`,外层条高度/间距仍由 Search token 控制,并非整个条随 size 等比例缩放。 ### 公开类型 `SearchPresentation`、`SearchProps`, `SearchEmits`, `SearchSlots`, `SearchExpose`, `SearchField`, `SearchResult`. ### Input 属性透传 显式支持 `modelModifiers`、`type`、`ariaLabel`、`placeholder`、`maxLength`、`readonly`、`disabled`、`autofocus`、`enterkeyhint`、`textColor`、`focusColor`、`blurColor`、`size`、`variant`、`clearable`、`inputAttrs`、`error`。`inputAttrs` 将原生 name/autocomplete/ARIA 等属性传给外侧和全屏内输入框;`error` 可覆盖继承的错误状态。搜索、弹层取消和弹层标签沿用全局多语言系统。取消、字段、历史程序更新各通知一次 Form change,原生编辑沿用 Input 事件链。 ## 配置清空后的值 `empty-value` 指定当前组件已有清空动作的输出;省略时采用该组件默认返回。具体类型以组件 API 为准。它不改变 empty-values 的识别规则,也不改变 Form reset 的初始值。 ### 共享字段加载 `loading-mode="line"` 使用 FieldDecorator 的共享加载线;默认模式保留本组件已有的加载展示。加载状态本身不隐式设置 disabled 或 readonly。 --- Document: llms/zh-CN/components/segmented.md # Segmented 分段控制器 用于在少数互斥选项之间快速切换。 ## 基础示例 ### 基础用法 Example source: src/segmented/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 分段尺寸与禁用状态 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `size` | 尺寸 | 分段尺寸与禁用状态 | | `options` | 选项列表 | 分段尺寸与禁用状态 | | `disabled` | 禁用 | 分段尺寸与禁用状态 | | `default-value` | 非受控默认值 | 分段尺寸与禁用状态 | 比较不同尺寸的密度与禁用选项的行为;受控值和块级布局保持独立。 Example source: src/segmented/__demos__/appearance-state-comparison.vue ```vue ``` ## 布局与排列 ### 块级撑满 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `block` | 撑满父宽度 | 块级撑满 | | `options` | 选项列表 | 块级撑满 | Example source: src/segmented/__demos__/block.vue ```vue ``` ## 交互与控制 ### 受控 Example source: src/segmented/__demos__/controlled.vue ```vue ``` ## 可访问性 - 根节点使用 `role="radiogroup"`,选项为原生 `radio`,支持键盘切换。 - 可通过 `name` 绑定表单字段名。 - 整体禁用时设置 `aria-disabled`。 ## API ### Segmented Props | 参数 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | model-value / v-model | 当前值 | `string \| number` | — | | default-value | 非受控默认值 | `string \| number` | — | | options | 选项列表 | `(string \| number \| SegmentedOption)[]` | `[]` | | size | 尺寸 | `xs \| sm \| md \| lg \| xl` | `md` | | disabled | 禁用 | `boolean` | `false` | | block | 撑满父宽度 | `boolean` | `false` | | orientation | 分段选项的横纵排列,默认 horizontal;不表示文字阅读方向 | `horizontal \| vertical` | `horizontal` | | name | 原生 name | `string` | — | ### SegmentedOption | 字段 | 说明 | 类型 | | --- | --- | --- | | label | 文案 | `string \| () => VNodeChild` | | value | 值 | `string \| number` | | disabled | 禁用该项 | `boolean` | ### Segmented Events | 事件名 | 说明 | 参数 | | --- | --- | --- | | change | 值变化 | `(value, event)` | | update:model-value | v-model | `(value)` | ### Segmented Slots | 插槽名 | 说明 | 参数 | | --- | --- | --- | | label | 自定义选项内容 | `{ data: SegmentedOption }` | --- Document: llms/zh-CN/components/select.md # Select 多选时,`inline` 下拉只显示选项;已选内容、单项移除和清空由输入框承担。确认式编辑面板保留“已选/清空”,选择为草稿,确认后提交。 当用户需要从一组同类数据中选择一个或多个时,可以使用下拉选择器,点击后选择对应项。 ## 阅读方向 选择框继承来源 `dir`;独立使用时默认按阅读起点对齐,在 FormItem 内继续继承其 content-align。显式 left/right 保持物理对齐;标签保持业务数组顺序,空搜索时 Backspace 删除最后一个可关闭值。下拉与选择面板携带来源方向,自定义 popup-container 不覆盖该方向。 ## 基础示例 ### 基础用法 点击展开选项,选中后回填并收起;清除后可重新选择。本例只演示单选。 Example source: src/select/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 外观配置对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------- | --------------------------------------------------- | ------------------------------ | | `options` | 原始值、对象、分组均支持;三种展示使用同一数据源 | 外观配置对比、表单控件尺寸对照 | | `clearable` | 允许清除,保留禁用的已选项 | 外观配置对比、表单控件尺寸对照 | | `size` | 完整支持 xs、sm、md、lg、xl,未设置时继承分组与表单 | 表单控件尺寸对照 | | `variant` | filled、outline、standard;未设置时继承 InputGroup | 表单控件尺寸对照 | | `placeholder` | 占位文本 | 表单控件尺寸对照 | | `multiple` | 多选;默认启用搜索 | 表单控件尺寸对照 | 选择一个对比维度后,同屏展示它的全部可选值;其余配置和内容保持一致。可切换其他配置检查组合效果;输入类预览共享一个值。
配置说明与使用限制 #### 变体 设置`variant="outline"`开启变体模式,常用于沉浸式使用。 #### 选择框大小 支持 xs、sm、md、lg、xl 五档尺寸。未设置时依次继承 InputGroup、FormItem、ConfigProvider,最终默认 md。 #### 外观组合 适用于选项数据明确的单选输入。调整变体、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。
Example source: src/select/__demos__/appearance-lab.vue ```vue ``` ### 表单控件尺寸对照 切换五档 size 和三种字段变体,比较 Input、Button、Select、日期时间及其他单行表单控件的高度。Button 在这里固定使用 outline。DatePicker/TimePicker 是面板,此处使用带输入框的 Date/Time 字段。示例同时展示有值、可清空、标签删除与长标签多选;Select/Cascader 设置 tag-nowrap 时保持同档高度,长标签文字省略、删除图标保留;标签行可横向滚动,清空按钮和箭头固定在外侧。被省略的标签正文支持悬停、键盘聚焦或点按查看完整文字,点外部或按 Esc 关闭,不改变选中值。可清空后恢复选中值重复比较。多行文本和允许换行的多选内容按内容撑高。 Example source: src/field-decorator/__demos__/control-sizes.vue ```vue ``` ## 选择模式与选项 ### 多选选择器 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------- | ------------------------------------------------ | ------------------------------------ | | `placeholder` | 占位文本 | 多选选择器、同名选项、分组 | | `multiple` | 多选;默认启用搜索 | 多选选择器、同名选项、分组 | | `clearable` | 允许清除,保留禁用的已选项 | 多选选择器、同名选项、子组件选项组合 | | `filterable` | 开启搜索,可设置 retainInputValue | 同名选项、子组件选项组合 | | `options` | 原始值、对象、分组均支持;三种展示使用同一数据源 | 同名选项、分组间距 | | `scrollbar` | Menu / List 滚动条配置 | 多选选择器 | 通过设置 multiple ,可以让选择器支持多选。此外通过 max-tag-count 可以设置最多显示的标签个数。 Example source: src/select/__demos__/multiple.vue ```vue ``` ### 同名选项 标签展示允许同名,但每个选项的值必须唯一。删除第二个“设备”只移除 ID 2,不会误删 ID 1;搜索文字与已选值分别管理。 Example source: src/select/__demos__/same-label.vue ```vue ``` ### 分组 使用 optgroup 组件添加分组选项。 Example source: src/select/__demos__/optgroup.vue ```vue ``` ### 分组间距 Example source: src/select/__demos__/group-spacing.vue ```vue ``` ### 管理已选项 确认式多选编辑面板顶部提供已选数量与清空。Cedar 在列表上方显示可删除标签;Maple 点击数量查看已选明细,支持逐项移除并返回可选项。popup/popover 与 dialog 共用该内容。移除和清空先修改草稿,关闭取消会恢复原值,确认后才提交;禁用项保留,异步确认期间禁用操作。面板的清空入口独立于字段清空图标。 ### 子组件选项组合 Example source: src/select/__demos__/options-review.vue ```vue ``` ### 允许创建 通过设置 creatable ,让选择器可以创建选项中不存在的条目。 Example source: src/select/__demos__/allow-create.vue ```vue ``` ### 回退选项 使用 fallback-option 自定义选项中不存在的值,默认会在输入框中展示不存在的选项值。可能用于选项还没有获取完,或者远程搜索时选项改变了。 Example source: src/select/__demos__/fallback-option.vue ```vue ``` ## 搜索与过滤 ### 允许搜索 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ---------------- | ------------------------------------------------ | ------------------------------------ | | `placeholder` | 占位文本 | 允许搜索、搜索匹配规则、下拉菜单滚动 | | `options` | 原始值、对象、分组均支持;三种展示使用同一数据源 | 允许搜索、搜索匹配规则、虚拟列表 | | `filterable` | 开启搜索,可设置 retainInputValue | 允许搜索、搜索匹配规则 | | `loading` | 加载状态;禁止选择和确认 | 允许搜索 | | `multiple` | 多选;默认启用搜索 | 允许搜索 | | `case-sensitive` | 内置本地过滤是否区分大小写,自定义过滤函数优先 | 搜索匹配规则 | 通过设置 filterable ,可以让选择器支持对选项的搜索,配合 filter-option 可以自定义搜索。 Example source: src/select/__demos__/filterable.vue ```vue ``` ### 搜索匹配规则 `case-sensitive` 默认 false,只控制内置本地匹配是否区分大小写;自定义过滤函数优先。远程结果可设置 `:filter-option="false"`,不再执行本地筛选。 同时匹配 value 和 label 可直接配置 `:search-fields="['value', 'label']"`;下面的示例不再需要自定义过滤函数。 Example source: src/select/__demos__/search-matching.vue ```vue ``` ### 下拉菜单滚动 可以通过`dropdown-scroll`监听下拉菜单的滚动事件,或者通过`dropdown-reach-bottom`监听下拉菜单滚动到底部的事件 Example source: src/select/__demos__/dropdown-scroll.vue ```vue ``` ### 虚拟列表 虚拟列表的使用方法 Example source: src/select/__demos__/virtual-list.vue ```vue ``` 选项分组与 Menu 使用一致的间距逻辑:标题行高 20px,上下各 4px 留白(总高 28px);后续分组前额外留 8px,首组不添加组间距。标题与选项文字左对齐;AutoComplete 的标题缩进跟随其选项水平 padding 配置。 ## 内容与下拉定制 ### 已选 Tag 样式 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------- | ------------------------------------------------ | --------------------------------------------- | | `placeholder` | 占位文本 | 已选 Tag 样式、下拉菜单的页头、下拉菜单的页脚 | | `multiple` | 多选;默认启用搜索 | 已选 Tag 样式、下拉菜单的页头、复杂插槽组合 | | `options` | 原始值、对象、分组均支持;三种展示使用同一数据源 | 已选 Tag 样式、复杂插槽组合 | | `filterable` | 开启搜索,可设置 retainInputValue | 下拉菜单的页脚、复杂插槽组合 | | `clearable` | 允许清除,保留禁用的已选项 | 复杂插槽组合 | 多选时,已选项在选择框中以 Tag 展示。通过选项上的 `tagProps`(或 `` 的 `tag-props`)可以把属性透传给 [Tag](llms/zh-CN/components/tag.md),用来改颜色、状态、变体等。Tag 没有单独的最大宽度属性,需要截断长文本时传入 `nowrap: true`,并用 `style.maxWidth` 限制宽度。 Example source: src/select/__demos__/tag-props.vue ```vue ``` ### 下拉菜单的页头 自定义下拉菜单的页头 Example source: src/select/__demos__/custom-header.vue ```vue ``` ### 下拉菜单的页脚 自定义下拉菜单的页脚 Example source: src/select/__demos__/custom-footer.vue ```vue ``` ### 自定义选择框展示内容 通过`#label`插槽可以自定义选择框展示内容。 Example source: src/select/__demos__/custom-label.vue ```vue ``` ### 复杂插槽组合 Example source: src/select/__demos__/slots-review.vue ```vue ``` ## 值模型与联动 ### 候选高亮与表单数据流 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | | `options` | 原始值、对象、分组均支持;三种展示使用同一数据源 | 候选高亮与表单数据流、联动选择框、空值识别与清空输出 | | `clearable` | 允许清除,保留禁用的已选项 | 空值识别与清空输出、交互状态对比 | | `edit-mode` | 字段展示;未指定时继承 FormItem/Form | 候选高亮与表单数据流 | | `default-active-first-option` | 打开选项列表时,无有效选中项则默认激活首个可用候选;仅高亮,不更新 modelValue 或触发 change。已有有效选中项优先激活该项 | 候选高亮与表单数据流 | | `placeholder` | 占位文本 | 候选高亮与表单数据流 | | `empty-value` | 清空输出覆盖;多选返回数组,保留不可清除项 | 空值识别与清空输出 | 初始 `form.city` 为 `undefined`。打开面板只激活候选行,不触发 `update:modelValue` 或 `change`,表单仍为空。inline 点击选项或按 Enter 后提交;click 在面板内选择只是草稿,确认后才提交,取消不改变表单。两个示例分别显示已提交值、更新次数和真实事件日志;日志按最新在前排列。 Example source: src/select/__demos__/selection-data-flow.vue ```vue ``` ### 联动选择框 展示联动选择框的实现方法 Example source: src/select/__demos__/linkage.vue ```vue ``` ### 自定义字段名 可以通过`field-names`属性定义`options`中数据的格式 ### 空值识别与清空输出 本例把空字符串保留为合法的“全部”选项,清空按钮返回 null。先观察“全部”已选,再点击清空;两种状态在模型输出中分别是空字符串和 null。搜索框删空不会删除已选值。下方另列多选清空返回 []、单选用工厂明确返回 undefined 的情况,分别显示模型值。 Example source: src/select/__demos__/empty-value.vue ```vue ``` ### 交互状态对比 在同一实例上切换禁用、只读和错误状态后再操作控件,比较可编辑性和交互反馈。恢复开关位于目标控件外;错误外观本身不会执行校验。
配置说明与使用限制 #### 交互状态切换 适用于选项数据明确的单选输入。调整禁用、只读、错误反馈,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。
Example source: src/select/__demos__/state-lab.vue ```vue ``` ## 异步数据与搜索 ### 加载中 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | ------------------------------------------------ | ---------------------------------------------------------------------- | | `loading` | 加载状态;禁止选择和确认 | 加载中、远程搜索、异步设备与 ID 回显 | | `options` | 原始值、对象、分组均支持;三种展示使用同一数据源 | 远程搜索、异步设备与 ID 回显、共用异步数据源(进阶可选) | | `placeholder` | 占位文本 | 加载中、远程搜索、异步设备与 ID 回显 | | `filterable` | 开启搜索,可设置 retainInputValue | 异步设备与 ID 回显、共用异步数据源(进阶可选)、函数属性:初始化与搜索 | | `multiple` | 多选;默认启用搜索 | 远程搜索、异步设备与 ID 回显 | | `filter-option` | false 关闭本地过滤;函数接收搜索词和原始选项 | 远程搜索 | 切换加载状态,对比默认指示器与底部加载线。加载期间保留已选值,暂停选择与确认;关闭加载后恢复。 Example source: src/select/__demos__/loading.vue ```vue ``` ### 远程搜索 使用 search 事件进行远程搜索,并改变选项。 Example source: src/select/__demos__/search.vue ```vue ``` ### 异步设备与 ID 回显 Example source: src/select/__demos__/async-devices.vue ```vue ``` 主体、控制器、选项算法与样式在两端独立维护;展示方式继承 Form/Item。完整对比示例集中在 Form 文档。 未设置 disabled / error 时继承表单状态;显式 false 可以覆盖继承值。FieldDecorator 和 SelectionField 不重复注入表单上下文,focus / blur 由 Select 向表单分发一次。 ### 共用异步数据源(进阶可选) 常规使用给 options 直接传入加载函数,组件内部负责异步状态。只有需要多个组件共享同一份结果、或组合不同控件时,才在业务层选用公开 useAsyncData;这不是组件的必需接入步骤。options/data 同时支持数组和加载函数,组件不解析业务响应。 Example source: src/select/__demos__/async-source.vue ```vue ``` ### 函数属性:初始化与搜索 Example source: src/select/__demos__/async-data.vue ```vue ``` ## 配置与生命周期 ### 透传配置边界与优先级 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | | `options` | 原始值、对象、分组均支持;三种展示使用同一数据源 | 透传配置边界与优先级、交互调度生命周期、复制与编辑 | | `edit-mode` | 字段展示;未指定时继承 FormItem/Form | 透传配置边界与优先级、复制与编辑 | | `trigger-props` | 可选的下拉浮层 Trigger 配置;placement 默认 bottom-start,空间不足时自动调整;字段拥有展开状态,不提供顶层 placement | 透传配置边界与优先级 | | `open-trigger-target` | 打开面板的点击区域;field 为整个字段,icon 仅右侧选择按钮。不影响键盘展开及受控 open。 | 复制与编辑 | | `filterable` | 开启搜索,可设置 retainInputValue | 复制与编辑 | 建议使用 `SelectTriggerOptions` 声明 trigger-props。open/defaultOpen、disabled 和展开更新归 Select 管理。popup-container 顶层明确传入时优先(包括 false),否则回退 triggerProps.popupContainer。其他属性保持现有顺序:Trigger 默认配置 → 顶层 auto-fit-popup-width / unmount-on-close → trigger-props;因此旧嵌套配置仍可覆盖后两项。此兼容阶段不改为“顶层永远优先”。内部展开监听继续执行,通知使用 Select 事件。 本次仅新增可主动选用的专用类型,不收窄已发布的宽属性类型,不增加运行时过滤、不改变覆盖顺序;旧业务写法继续可编译。若直接使用旧宽属性,内部托管字段仍可能通过类型检查,但不代表能控制内部状态。 ```ts import type { SelectTriggerOptions } from "@cedar-design/ui"; ``` Example source: src/select/__demos__/passthrough-options.vue ```vue ``` ### 交互调度生命周期 Example source: src/select/__demos__/scheduler-lifecycle.vue ```vue ``` ### 复制与编辑 open-trigger-target="icon" 时,输入区可以编辑或复制,只有右侧选择按钮响应点击打开。关闭手输或搜索后,已有文本仍可复制。 Example source: src/select/__demos__/open-trigger-target.vue ```vue ``` ### 共享字段加载 `loading` 控制共享字段加载状态;`loading-mode` 为 `default`(指示器)或 `line`(底部不定进度线),默认 `default`。渲染统一由 FieldDecorator 负责;Select 原有 loading 语义仍会暂停选择和确认,允许搜索。 ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 单选和多选的已选行右侧均显示主色对勾;仅候选高亮时不显示对勾。click/dblclick 编辑面板内的对勾表示当前草稿选择,确认后才提交表单;禁用已选项保持禁用外观。 ### 清空值与 1.x 兼容性 `SelectValue` 包含 `undefined`。默认单选清空发出 `''`;当前候选中有 `value: ''` 时发出 `undefined`,用于区分清空与选中空字符串选项。此已发布行为保持不变,`change` 和 `update:modelValue` 均使用 `SelectValue` 类型。 `empty-value` 指定清空输出;省略时保留原有默认值。单选可使用 `() => undefined` 明确返回 undefined;多选应返回符合模型形状的数组。存在不可清除的禁用选中项时,优先保留这些项,不执行清空覆盖。受控模式仍需父级接受更新。 根入口与组件入口均导出 `SelectValue`、`SelectEmptyValue`。 ### Select 属性 分别使用 `v-model`、`v-model:open` 和 `v-model:input-value` 控制选中值、展开状态和搜索词。单选清空为 `''`,多选为 `[]`;Select 存在真实空字符串选项时,清空值为 `undefined`。 | 属性 | 说明 | 类型 | 默认值 | | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ---------------------------- | | `open-trigger-target` | 打开面板的点击区域;field 为整个字段,icon 仅右侧选择按钮。不影响键盘展开及受控 open。 | `'field' \| 'icon'` | `'field'` | | `model-value / default-value` | 受控值 / 非受控初始值 | `Value` | `单选 '',多选 []` | | `open / default-open` | 受控展开 / 默认展开 | `boolean` | `undefined / false` | | `input-value / default-input-value` | 搜索文本,独立于选中值 | `string` | `undefined / ''` | | `multiple` | 多选;默认启用搜索 | `boolean` | `false` | | `size` | 完整支持 xs、sm、md、lg、xl,未设置时继承分组与表单 | `ComponentSize` | `md` | | `variant` | filled、outline、standard;未设置时继承 InputGroup | `FormControlVariant` | `filled` | | `disabled / readonly / error` | 未设置时继承表单;显式 false 可覆盖 | `boolean` | `undefined` | | `placeholder` | 占位文本 | `string` | `—` | | `hint / line` | 浮动提示 / standard 变体下划线 | `boolean` | `true` | | `text-color / focus-color / blur-color` | 字段颜色 | `string` | `—` | | `loading` | 加载状态;禁止选择和确认 | `boolean` | `false` | | `loading-mode` | 加载布局:默认指示器或底部加载线 | `default / line` | `default` | | `show-tags` | 多选值以标签展示;false 改用分隔文本 | `boolean` | `true` | | `separator` | show-tags=false 时的多选分隔符 | `string` | `,` | | `text-align` | 文字对齐 left / center / right;未设置时继承 FormItem 的 content-align,独立使用默认阅读起点 start | `'left' \| 'center' \| 'right'` | `-` | | `max-tag-count` | 标签数量上限,0 不限制 | `number` | `0` | | `tag-nowrap` | 标签单行显示;长文字省略、删除图标保留,标签行可横向滚动;悬停、聚焦或点按省略正文查看全文 | `boolean` | `false` | | `popup-container` | 选择器、元素、返回元素的函数或 false(原地渲染) | `PopupContainer` | `—` | | `trigger-props` | 可选的下拉浮层 Trigger 配置;placement 默认 bottom-start,空间不足时自动调整;字段拥有展开状态,不提供顶层 placement | `TriggerProps` | `—` | | `virtual-list-props` | Menu / List 的虚拟列表参数 | `VirtualListProps` | `—` | | `search-delay` | search 事件防抖时长(毫秒) | `number` | `500` | | `format-label` | 格式化已选标签;VNode 使用 label 插槽 | `function` | `—` | | `clearable` | 允许清除,保留禁用的已选项 | `boolean` | `true` | | `empty-value` | 清空输出覆盖;多选返回数组,保留不可清除项 | `SelectEmptyValue` | `undefined` | | `options` | 原始值、对象、分组均支持;三种展示使用同一数据源 | `SelectOption[]` / `(query, { signal }) => Array / Promise` | `undefined` | | `field-names` | value、label、disabled、tagProps、render 字段映射;对象值须有唯一标识字段 | `SelectFieldNames` | `—` | | `filterable` | 开启搜索,可设置 retainInputValue | `boolean 或 { retainInputValue?: boolean }` | `单选 false / 多选 true` | | case-sensitive | 内置本地过滤是否区分大小写,自定义过滤函数优先 | boolean | false | | `filter-option` | false 关闭本地过滤;函数接收搜索词和原始选项 | `boolean 或 (input, option) => boolean` | 自动:数组开启,加载函数关闭 | | `creatable` | 允许创建不存在的选项 | `boolean` | `false` | | `fallback-option` | 异步选项未到达时反显值,或返回完整回退选项 | `boolean 或 (value) => SelectOptionData` | `true` | | `show-extra-options` | 菜单中展示回退/创建选项 | `boolean` | `true` | | `limit` | 多选数量上限,0 不限制 | `number` | `0` | | `auto-fit-popup-width` | Menu 与字段等宽 | `boolean` | `true` | | `default-active-first-option` | 打开选项列表时,无有效选中项则默认激活首个可用候选;仅高亮,不更新 modelValue 或触发 change。已有有效选中项优先激活该项 | `boolean` | `true` | | `unmount-on-close` | 关闭 Menu 后销毁内容 | `boolean` | `false` | | `scrollbar` | Menu / List 滚动条配置 | `boolean 或 ScrollbarProps` | `true` | | `show-header-on-empty / show-footer-on-empty` | 空状态仍展示 header / footer | `boolean` | `false` | | `edit-mode` | 字段展示;未指定时继承 FormItem/Form | `direct / click / dblclick` | `direct` | | `before-commit` | 确认校验后可等待的保存拦截钩子 | `(value, context) => void / false / Promise` | — | ### 事件与方法 - `update:modelValue`、`change(value)`:提交时触发,编辑草稿不触发。 - `update:open`、`open-change(open)`:请求改变展开状态。 - `update:inputValue`、`input-value-change(text)`、`search(text)`:搜索状态。 - `focus(event)`、`blur(event)`、`clear(event)`:原生字段事件;只有字段所有者通知 Form。 - 方法:`focus()`、`blur()`。 Select 还提供 `remove(value)`、`exceed-limit(value, event)`、`dropdown-scroll(event)`、`dropdown-reach-bottom(event)`。 ### 插槽与选项数据 使用 `label({ data })` 自定义已选标签,`selected` 替换整个已选区域。还支持 `prefix`、`suffix`、`clear-icon({ clear })`、`arrow-icon`、`loading-icon`、`search-icon`、`empty`、`option({ data })`。 选项 `label` 是用于搜索的纯文本;自定义选项内容使用 `render` 或 `option` 插槽,自定义反显使用 `format-label` 或 `label` 插槽。以 value 而非 label 识别选项。选项的 `disabled` 禁止选择和删除,`tagProps` 可定制已选标签。 Select 还支持 `header`、`footer`、`trigger` 和默认插槽中的 `Option / Optgroup`。Option 属性为 `value`、`label`、`disabled`、`tagProps`、`index`;默认插槽提供 `selected`。分组数据为 `{ isGroup: true, label, options }`。所有编辑展示共用相同选项模型;read 插槽可自定义阅读内容。 单选和多选选项统一使用 popup-option-padding-horizontal。组件没有隐式搜索高亮 DOM;自定义选项插槽负责其高亮片段样式。已删除无效的 multi-popup-option-padding-horizontal 与 popup-option-highlight-* 变量。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 ### Option Props | 属性 | 说明 | 类型 | 默认值 | | --------- | ------------------------------------- | ------------------------------------------------------ | --------- | | value | 选项值,未传时取 label 或默认插槽文本 | string \| number \| boolean \| Record | undefined | | label | 搜索与已选标签使用的文本 | string | undefined | | disabled | 禁止选择与移除 | boolean | false | | tag-props | 已选标签属性 | TagProps | undefined | | index | 手动指定选项顺序 | number | undefined | ### Option Slots | 插槽 | 说明 | 参数 | | ------- | -------------- | --------------------- | | default | 自定义选项内容 | { selected: boolean } | | icon | 选项图标 | - | | suffix | 选项后缀 | - | ### Optgroup Props | 属性 | 说明 | 类型 | 默认值 | | ----- | -------- | ------ | --------- | | label | 分组标题 | string | undefined | ### Optgroup Slots | 插槽 | 说明 | 参数 | | ------- | ---------------------- | ---- | | label | 自定义分组标题 | - | | default | 分组下的 Option 子组件 | - | ### Select Slots | 插槽 | 说明 | 参数 | | ------------ | ------------------------ | --------------- | | default | Option / Optgroup 子组件 | - | | option | 自定义选项内容 | { data } | | label | 自定义已选标签 | { data } | | selected | 替换整个已选区域 | - | | header | 菜单页头 | - | | footer | 菜单页脚 | - | | trigger | 自定义选择器触发器 | - | | prefix | 字段前缀 | - | | suffix | 字段后缀 | - | | clear-icon | 自定义清空操作 | { clear } | | arrow-icon | 下拉箭头 | - | | search-icon | 搜索图标 | - | | loading-icon | 加载图标 | - | | empty | 无选项内容 | - | | read | 阅读展示 | { value, text } | ### Select Events | 事件 | 说明 | 参数 | | --------------------- | ------------ | ------------ | | update:model-value | 更新绑定值 | value | | change | 提交选择 | value | | update:open | 请求展开状态 | open | | open-change | 展开状态改变 | open | | update:input-value | 更新搜索文本 | text | | input-value-change | 搜索文本改变 | text | | search | 搜索通知 | text | | focus | 字段获得焦点 | event | | blur | 字段失去焦点 | event | | clear | 清空选择 | event | | remove | 移除已选项 | value | | exceed-limit | 超过多选上限 | value, event | | dropdown-scroll | 菜单滚动 | event | | dropdown-reach-bottom | 菜单滚到底部 | event | ### Select Methods | 方法 | 说明 | 参数 | | ----- | ---------------- | ---- | | focus | 聚焦实际字段 | - | | blur | 移出实际字段焦点 | - | ### 选中对勾样式变量 | 变量 | 默认值 | | ------------------------------------- | ----------------------------------- | | `--c-select-popup-option-check-color` | `var(--c-sys-color-action-primary)` | | `--c-select-popup-option-check-size` | `var(--c-sys-font-size-md)` | | `--c-select-popup-option-check-gap` | `var(--c-sys-space-4)` | ### 公开类型入口 根入口和组件入口均导出 `SelectEmits`、`SelectSlots`、`SelectExpose`,与 Props、Instance 配套。Emits 为从运行时事件声明推导的参数元组映射;Expose 包含 focus/blur。 ### 内置搜索字段配置 `searchFields` / `search-fields` 是只读 `('label' | 'value')[]`,默认 `['label']`;多字段为 OR 匹配,大小写默认不敏感。配置 `['value', 'label']` 可同时搜索编码和名称,fieldNames 将语义字段映射到业务字段;空数组对非空查询不匹配任何项。value 采用字符串比较,不做对象深层搜索,对象值或拼音等复杂规则仍用自定义回调。自定义回调优先并自行决定大小写;远程结果使用原有关闭本地过滤协议。Cascader 保留路径语义,会检查路径各节点的配置字段。 ## 函数属性加载候选 直接传 options(query, { signal }),无需调用 useAsyncData。options 继续接收数组,显式数组(包括 [])优先。组件内部管理 loading、旧结果隔离与请求取消;load-error 通知失败,实例 refresh() 重试。业务函数可只接收 query,忽略第二参数。 filterable 表示允许输入搜索词。filterOption 只控制本地候选匹配,从不发请求。使用 options 加载函数时默认不再二次过滤远程结果;仅传数组时默认启用本地匹配。业务通常无需设置 filter-option。 ```vue ``` `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 守卫统一使用 `(payload, done, context)`:关闭 payload 为 `{ action }`,切换和提交为 `{ value, previousValue }`,Popup 为 `{ reason }`。context 提供 `signal` 和可选原始 `event`。返回 boolean/Promise,或调用 done()/done(false);同步 void 等待 done,Promise<void> 放行。首次完成生效。等待期间自动管理 loading/disabled,取消后旧结果失效,不暴露内部按钮 refs。 --- Document: llms/zh-CN/components/skeleton.md # Skeleton 将加载中的数据用灰色占位。 ## 基础示例 ### 基础用法 Example source: src/skeleton/__demos__/basic.vue ```vue ``` ## 内容与展示 ### 骨架内容形态对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `title` | 是否显示标题占位 | 骨架内容形态对比、动画 | | `loading` | 是否展示骨架屏(加载中状态) | 骨架内容形态对比、全屏模式 | | `avatar` | 是否显示头像占位 | 骨架内容形态对比、动画 | | `rows` | 段落行数 | 骨架内容形态对比 | | `rows-width` | 每行宽度 | 骨架内容形态对比 | | `card` | 是否显示卡片占位 | 骨架内容形态对比 | 比较标题/文本行与头像/卡片形态,按最终内容轮廓选择占位布局;动画和全屏加载另行展示。 Example source: src/skeleton/__demos__/content-comparison.vue ```vue ``` ### 动画 Example source: src/skeleton/__demos__/animation.vue ```vue ``` ### 全屏模式 点击后展示两秒再恢复,这是示例中的定时逻辑;组件本身不请求数据,也不会自动结束加载。实际业务应由请求结果控制 `loading`。 Example source: src/skeleton/__demos__/fullscreen.vue ```vue ``` ## 自定义与插槽 ### 自定义模板 通过 `template` 插槽组合 `SkeletonLine` 和 `SkeletonShape`。 Example source: src/skeleton/__demos__/custom-template.vue ```vue ``` ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------------------ | ---------------------------- | ------------------------- | :-----: | | loading | 是否展示骨架屏(加载中状态) | `boolean` | `true` | | animation | 是否开启骨架屏动画 | `boolean` | `true` | | title | 是否显示标题占位 | `boolean` | `false` | | avatar | 是否显示头像占位 | `boolean` | `false` | | card | 是否显示卡片占位 | `boolean` | `false` | | rows | 段落行数 | `number \| string` | `3` | | rows-width | 每行宽度 | `Array` | `[]` | | title-width | `50%` | `number \| string` | `-` | | avatar-size | `34px` | `number \| string` | `-` | | card-height | `160px` | `number \| string` | `-` | | fullscreen | 是否使用全屏占位 | `boolean` | `false` | | fullscreen-z-index | 全屏占位层级 | `number \| string` | `100` | ### `` Slots | 插槽名 | 描述 | | -------- | -------------------- | | default | 加载完成后的真实内容 | | template | 自定义加载占位模板 | ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------------ | ---------------- | ------------------------- | :----: | | rows | 展示的行数 | `number` | `1` | | widths | 线型骨架的宽度 | `Array` | `[]` | | line-height | 线型骨架的行高 | `number` | `20` | | line-spacing | 线型骨架的行间距 | `number` | `15` | ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------ | -------------- | ---------------------- | :--------: | | shape | 图形骨架的形状 | `'square' \| 'circle'` | `'square'` | | size | 图形骨架的大小 | `'sm' \| 'md' \| 'lg'` | `'md'` | ### 类型定义 组件导出以下类型定义 ```ts import type { SkeletonInstance, SkeletonLineProps, SkeletonShapeProps, } from "@cedar-design/ui"; ``` ## 同源实现与平台边界 两端各自保存完整源码,不引用公共核心,不共享组件实例或响应式状态;修改时同步维护两份实现。主体、Props、关键样式及配对测试纳入只读源码一致性检查,主题 token 和安装入口各自维护。 Skeleton、SkeletonLine、SkeletonShape 均采用独立复制的源码;各库骨架主题和尺寸 token 独立维护。 ### 受管默认值 | Token | Default | | --- | --- | | `--c-skeleton-content-padding` | `var(--c-sys-space-6)` | | `--c-skeleton-card-border-radius` | `var(--c-sys-radius-md)` | | `--c-skeleton-card-margin-bottom` | `var(--c-sys-space-6)` | | `--c-skeleton-card-background-color` | `var(--c-sys-color-state-hover)` | | `--c-skeleton-animation-background` | `linear-gradient(90deg, transparent, var(--c-sys-color-surface-default), transparent)` | | `--c-skeleton-avatar-border-radius` | `50%` | | `--c-skeleton-avatar-margin-right` | `var(--c-sys-space-6)` | | `--c-skeleton-avatar-background-color` | `var(--c-sys-color-state-hover)` | | `--c-skeleton-title-border-radius` | `10px` | | `--c-skeleton-title-background-color` | `var(--c-sys-color-state-hover)` | | `--c-skeleton-row-height` | `12px` | | `--c-skeleton-row-border-radius` | `10px` | | `--c-skeleton-row-margin-top` | `10px` | | `--c-skeleton-shape-size-sm` | `36px` | | `--c-skeleton-shape-size-md` | `48px` | | `--c-skeleton-shape-size-lg` | `60px` | | `--c-skeleton-shape-border-radius` | `var(--c-sys-radius-md)` | ### 动效变量 | Token | Default | | --- | --- | | `--c-skeleton-animation-duration` | `1s` | | `--c-skeleton-transition-duration` | `var(--c-sys-motion-duration-slow)` | 内置动效遵循 prefers-reduced-motion: reduce:保留内容与状态反馈,关闭装饰性旋转、扫光和波纹。Icon 名称切换跳过等待,并取消尚未结束的切换。Ripple 时长变量只控制 CSS,250ms 生命周期计时未改变,每段视觉时长应不超过 250ms;自定义动画类由调用方负责适配。 --- Document: llms/zh-CN/components/slider.md # Slider 滑块 在有限数值范围内选择单值或区间。 ## 基础示例 ### 基础用法 Example source: src/slider/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 垂直方向 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | -------------- | --------------------------------------------------------- | -------- | | `orientation` | 滑块轨道与操作的横纵轴向,默认 horizontal;不表示增减方向 | 垂直方向 | | `aria-label` | 可访问名称;范围可分别传入两个名称 | 垂直方向 | | `range` | 两个固定低/高端,不可交叉;初始倒序自动排序 | 垂直方向 | | `show-tooltip` | true悬浮/聚焦/拖动显示;false隐藏;always常驻 | 垂直方向 | 父容器提供 300px 高度,单值与范围分别回写。上移增大、下移减小;范围两端仍不能交叉。没有独立 reverse 属性。 Example source: src/slider/__demos__/vertical.vue ```vue ``` ## 内容与展示 ### 触控提示与定制 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | -------------- | --------------------------------------------- | -------------- | | `show-tooltip` | true悬浮/聚焦/拖动显示;false隐藏;always常驻 | 触控提示与定制 | | `aria-label` | 可访问名称;范围可分别传入两个名称 | 触控提示与定制 | Example source: src/slider/__demos__/touch-and-labels.vue ```vue ``` ## 交互与控制 ### 交互状态切换 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ------------ | ---------------------------------------------------- | -------------------------------------- | | `aria-label` | 可访问名称;范围可分别传入两个名称 | 刻度、标记和数字输入、受控与非交叉范围 | | `range` | 两个固定低/高端,不可交叉;初始倒序自动排序 | 刻度、标记和数字输入、受控与非交叉范围 | | `step` | 正有限步长,非法值回退1,按min对齐;max端点可达 | 刻度、标记和数字输入 | | `marks` | 有限范围内位置到文本的映射 | 刻度、标记和数字输入 | | `show-ticks` | 按step显示刻度,过密时省略,最多1000个 | 刻度、标记和数字输入 | | `show-input` | 显示InputNumber;Enter或失焦提交,使用同一归一化规则 | 刻度、标记和数字输入 | 适用于连续区间内的数值调整。调整禁用、只读、错误反馈,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。 Example source: src/slider/__demos__/state-lab.vue ```vue ``` ### 刻度、标记和数字输入 Example source: src/slider/__demos__/keyboard-input.vue ```vue ``` ### 受控与非交叉范围 Example source: src/slider/__demos__/controlled-range.vue ```vue ``` ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### Props | 属性 | 说明 | 类型 | 默认值 | | ---------------------------------------- | ------------------------------------------------------------- | -------------------------------- | ------------ | | model-value | 受控值;range 使用二元组 | `SliderValue` | — | | default-value | 非受控初始值 | `SliderValue` | `0` | | min / max | 有限边界,数字字符串可用;非法值回退 0/100;max<=min 不可交互 | `number \| string` | `0 / 100` | | step | 正有限步长,非法值回退1,按min对齐;max端点可达 | `number \| string` | `1` | | range | 两个固定低/高端,不可交叉;初始倒序自动排序 | `boolean` | `false` | | orientation | 滑块轨道与操作的横纵轴向,默认 horizontal;不表示增减方向 | `horizontal \| vertical` | `horizontal` | | disabled / readonly / error | 未传时继承FormItem/Form适用状态;只读可聚焦但不可改值 | `boolean` | 继承 | | show-ticks | 按step显示刻度,过密时省略,最多1000个 | `boolean` | `false` | | marks | 有限范围内位置到文本的映射 | `Record` | — | | show-input | 显示InputNumber;Enter或失焦提交,使用同一归一化规则 | `boolean` | `false` | | show-tooltip | true悬浮/聚焦/拖动显示;false隐藏;always常驻 | `boolean \| 'always'` | `true` | | format-tooltip | 提示与aria-valuetext格式化 | `(value:number)=>string\|number` | 原值 | | aria-label | 可访问名称;范围可分别传入两个名称 | `string \| [string,string]` | — | | active-color / track-color / thumb-color | 轨道激活色/背景色/拇指底色 | `string` | CSS变量 | | label-color / label-text-color | 提示背景/文字色 | `string` | CSS变量 | | track-height / thumb-size | 轨道厚度/拇指直径,数字px或CSS长度;非法值保留主题默认 | `number \| string` | CSS变量 | ### 行为与键盘 方向键按step增加/减少,PageUp/PageDown为10步,Home/End到可用端点。范围的ARIA min/max随另一个拇指变化;重合时向左/下点击可分开低端,向右/上可分开高端。拇指内业务交互元素的键盘事件不被接管。只读保留焦点与提示,禁用不进入Tab顺序。 Pointer Events统一鼠标、触控、笔;pointerup提交最后坐标,pointercancel/丢失capture结束最近提议。禁用、卸载、KeepAlive失活会清理监听与capture且不继续发值事件。横向允许页面纵向滚动,纵向允许横向滚动。 受控模式只有父级回写才能改变显示;模型归一化不自动emit。change/update:model-value只报告不同提议,end携带最终提议,不保证父级接受。键盘及数字输入每次操作各有start/end;拖动是一组start/end。InputNumber内部不重复触发Form验证。已移除旧label-visible,直接使用show-tooltip,无兼容别名。 ### Events | 事件 | 参数 | 含义 | | ------------------ | ------------- | ---------------------------- | | update:model-value | `SliderValue` | 请求更新 | | change | `SliderValue` | 不同数值提议,与模型事件配对 | | start | — | 交互开始 | | end | `SliderValue` | 交互结束的最终提议 | ### Slots / Methods button插槽收到`{ currentValue:number,index:number }`;自定义内容不移除键盘、ARIA与提示。focus(index=0)按显示顺序聚焦拇指,blur()移出焦点。 导出SliderProps、SliderValue、SliderOrientation、SliderTooltipFormatter、SliderTooltipVisibility、SliderEmits、SliderSlots、SliderExpose、SliderInstance和运行时sliderProps。两端主体/样式独立复制;仅安装和Form接线使用各库独立实现。 ### 样式变量 | 变量 | 默认值 | | -------------------------------- | -------------------------------------- | | `--c-slider-active-color` | `var(--c-sys-color-content-brand)` | | `--c-slider-track-color` | `var(--c-sys-color-state-hover)` | | `--c-slider-thumb-color` | `var(--c-sys-color-surface-default)` | | `--c-slider-thumb-border-color` | `var(--c-sys-color-content-brand)` | | `--c-slider-text-color` | `var(--c-sys-color-content-secondary)` | | `--c-slider-tooltip-background` | `var(--c-sys-color-surface-tooltip)` | | `--c-slider-tooltip-color` | `var(--c-sys-color-content-on-dark)` | | `--c-slider-error-color` | `var(--c-sys-color-content-danger)` | | `--c-slider-disabled-color` | `var(--c-sys-color-content-disabled)` | | `--c-slider-track-height` | `4px` | | `--c-slider-thumb-size` | `16px` | | `--c-slider-control-height` | `var(--c-sys-control-height-md)` | | `--c-slider-font-size` | `var(--c-sys-font-size-sm)` | | `--c-slider-gap` | `var(--c-sys-space-4)` | | `--c-slider-radius` | `var(--c-sys-radius-md)` | | `--c-slider-transition-duration` | `var(--c-sys-motion-duration-fast)` | | `--c-slider-input-width` | `80px` | ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 --- Document: llms/zh-CN/components/space.md # Space 通过 flex gap 设置子元素间距,每个有效子节点外包裹一个 item 容器,支持 Fragment 展开与分隔符。 ## 基础示例 ### 基础用法 Example source: src/space/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 尺寸 内置 xs / sm / md / lg / xl 五档,默认 md;支持数字、CSS 长度和 [行间距, 列间距],具体值见下方同源约定。 Example source: src/space/__demos__/size.vue ```vue ``` ## 布局与排列 ### 垂直间距 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `direction` | 子元素的行列排列顺序,默认 row;column 表示按列排列,不使用 horizontal/vertical | 垂直间距、对齐、布局与对齐 | | `align` | 交叉轴排列方式 可选值为 `flex-start` `flex-end` `center` `stretch` `baseline`,未传时根据 `direction` 推断(`row` → `center`,`column` → `stretch`) | 对齐、布局与对齐 | | `wrap` | 是否超出换行 | 环绕、分隔符 | | `size` | 间距,可选值为 `xs` `sm` `md` `lg` `xl` 或 `[rowGap, columnGap]` (支持长度单位和简写方式) | 分隔符、布局与对齐 | | `justify` | 主轴排列方式 可选值为 `flex-start` `flex-end` `center` `space-around` `space-between` `space-evenly` | 布局与对齐 | 可以设置垂直方向排列的间距。 Example source: src/space/__demos__/vertical.vue ```vue ``` ### 对齐 内置多种对齐方式,分别为 `flex-start` `center` `flex-end` `stretch` `baseline`。未传入时:`row` 默认为 `center`,`column` 默认为 `stretch`。 Example source: src/space/__demos__/align.vue ```vue ``` ### 环绕 默认不换行;显式设置 wrap 后允许超出换行。gap 只作用于子项之间,不增加容器外围间距。 Example source: src/space/__demos__/wrap.vue ```vue ``` ### 分隔符 为相邻子元素设置分隔符。 Example source: src/space/__demos__/split.vue ```vue ``` ### 布局与对齐 适用于space。调整排列方向、交叉轴对齐、主轴分配,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。 Example source: src/space/__demos__/layout-lab.vue ```vue ``` ### 分隔换行与内容状态 输入草稿后切换换行、方向或顺序。分隔符跟随前一项,可出现在行尾,不会独占一行。 Example source: src/space/__demos__/split-wrapping.vue ```vue ``` ## 交互与控制 ### 动态布局 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `wrap` | 是否超出换行 | 动态布局 | | `size` | 间距,可选值为 `xs` `sm` `md` `lg` `xl` 或 `[rowGap, columnGap]` (支持长度单位和简写方式) | 动态布局 | | `direction` | 子元素的行列排列顺序,默认 row;column 表示按列排列,不使用 horizontal/vertical | 动态布局 | 切换方向、列间距和换行,添加/删除子项;行间距固定8px,列间距在8px/24px间切换。方向不会交换两个gap的几何轴含义。窄容器内未换行时可横向滚动。 Example source: src/space/__demos__/interactive-layout.vue ```vue ``` ## 阅读方向 继承最近的 `dir="ltr|rtl"`。`direction="row"` 沿阅读顺序排列,`column` 保持从上到下;justify/align 的 flex-start、flex-end 跟随对应 flex 轴。`size=[rowGap,columnGap]` 始终分别表示行间距、列间距,不因 RTL 交换。换行与 split 插槽沿内容顺序排列,方向切换不反转数据或重建有稳定 key 的子节点。 ## API ### 子节点与尺寸边界 带 key 的 Fragment 分组重排时保留局部子项身份。纯空白、空文本、注释和空 Fragment 不生成间距项;有意义的文字、数字 0 和空元素保留。空的 split 内容也不生成分隔项。 wrap 与 split 组合时,分隔符跟随前一项,可以出现在行尾;不承诺隐藏每行边缘的分隔符。单项宽度超出可用行宽时仍可能溢出。未开启 wrap 时,保持原有 Flex gap 与 justify 分配规则。切换布局不会重建内容节点。 block 将容器切换为 flex / inline-flex;align=stretch 拉伸内部 item 包装层,不保证其中的控件填满。需要撑满时使用子控件的 block 或 width:100%。 非法 size 结构、负数/非有限数字、非二元组数组会回退 md,并在开发环境提示。数组项为长度,不接受预设名。仍支持 CSS var/calc 表达式,具体 CSS 语法与解析值由浏览器处理。 ### Space Props ### 属性 | 参数 | 说明 | 类型 | 默认值 | | --------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | ---------------------- | | direction | 子元素的行列排列顺序,默认 row;column 表示按列排列,不使用 horizontal/vertical | _string_ | `row` | | justify | 主轴排列方式 可选值为 `flex-start` `flex-end` `center` `space-around` `space-between` `space-evenly` | _string_ | `flex-start` | | align | 交叉轴排列方式 可选值为 `flex-start` `flex-end` `center` `stretch` `baseline`,未传时根据 `direction` 推断(`row` → `center`,`column` → `stretch`) | _string_ | `-` | | size | 间距,可选值为 `xs` `sm` `md` `lg` `xl` 或 `[rowGap, columnGap]` (支持长度单位和简写方式) | _string \| number \| [string \| number, string \| number]_ | `md` | | wrap | 是否超出换行 | _boolean_ | `false` | | block | 容器使用 flex(false 使用 inline-flex) | _boolean_ | `true` | ### 插槽 | 插槽名 | 说明 | 参数 | | --------- | ---------- | ---- | | `default` | Space 内容 | `-` | | `split` | 分隔符 | `-` | ### 类型定义 ```ts import type { SpaceProps, SpaceSize, SpaceDirection, SpaceAlign, SpaceJustify, SpaceInternalSize, SpaceInstance } from '@cedar-design/ui' ``` ### 样式变量 | 变量名 | 默认值 | | --- | --- | | `--c-space-size-xs-row-gap` | `var(--c-sys-space-2)` | | `--c-space-size-xs-column-gap` | `var(--c-sys-space-2)` | | `--c-space-size-sm-row-gap` | `var(--c-sys-space-4)` | | `--c-space-size-sm-column-gap` | `var(--c-sys-space-3)` | | `--c-space-size-md-row-gap` | `var(--c-sys-space-5)` | | `--c-space-size-md-column-gap` | `var(--c-sys-space-4)` | | `--c-space-size-lg-row-gap` | `var(--c-sys-space-6)` | | `--c-space-size-lg-column-gap` | `var(--c-sys-space-5)` | | `--c-space-size-xl-row-gap` | `var(--c-sys-space-8)` | | `--c-space-size-xl-column-gap` | `var(--c-sys-space-6)` | ## 同源实现与平台边界 两端各自保存完整源码,不引用公共核心,不共享组件实例或响应式状态;修改时同步维护两份实现。主体、Props、子节点展开、主样式、尺寸 token 和配对测试纳入只读一致性检查。仅安装入口与命名空间各自适配。 两端默认均为 `size="md"`、`wrap=false`、`block=true`、`direction="row"`。未传 align 时,row 为 center、column 为 stretch。Maple 原来依赖默认换行的用法请显式添加 `wrap`。 `size` 支持全部五档预设、number(px)、数字字符串(px)、CSS 长度或表达式(例如 1rem、var(--gap))以及二元组 `[rowGap, columnGap]`。数组始终先行后列,direction 切换不会交换它们;数组项为长度,不支持预设名。预设 [行, 列]:xs=[4,4]、sm=[8,6]、md=[12,8]、lg=[16,12]、xl=[24,16] px,两端一致,仍可通过 CSS 变量覆盖。 --- Document: llms/zh-CN/components/split-button.md 禁用的分段复用 Button 禁用配色并关闭交互反馈;整体禁用同时移除组阴影,仅禁用菜单按钮会阻止菜单打开并关闭非受控的已打开菜单。 # SplitButton 分裂按钮 将一个主操作与一组相关菜单操作组合在同一个按钮组中。 示例统一使用两端都支持的 `Message.info(...)`。默认选择菜单项后关闭;仅“浮层与连续选择”设置 `hide-on-select=false`,保留菜单并显示选择反馈。箭头通过 icon 插槽显示,两段默认继承相同的 variant、status 和自定义颜色,图标布局不改变配色。 两端示例场景及交互逻辑保持一致,分别维护代码副本;仅组件前缀、包名和文档语言接入不同。 ## 基础示例 ### 基础用法 主按钮执行发布,右侧按钮展开菜单;菜单项提供稳定的 value,并展示无权限的禁用项。 Example source: src/split-button/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 视觉变体 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `variant` | 按钮组变体 | 视觉变体 | | `disabled` | 是否禁用整个分裂按钮 | 禁用状态 | | `button-props` | 主按钮属性 | 禁用状态 | | `trigger-button-props` | 菜单触发按钮属性 | 禁用状态 | | `placement` | 浮层相对触发元素的首选方位,默认 bottom;启用默认的 auto-fit-position 时,空间不足会自动翻转并约束到可视区域,不保证最终停在该侧 | 外观配置对比 | 统一展示 default、outline、tonal、text 四种变体。 Example source: src/split-button/__demos__/variants.vue ```vue ``` ### 禁用状态 对比整体禁用、仅主按钮禁用、仅菜单按钮禁用。整体 disabled 优先,子按钮的 disabled: false 不能解除整体禁用。 Example source: src/split-button/__demos__/disabled.vue ```vue ``` ### 外观配置对比 选择一个对比维度后,同屏展示它的全部可选值;其余配置和内容保持一致。可切换其他配置检查组合效果;输入类预览共享一个值。
配置说明与使用限制 #### 五档尺寸 支持 xs、sm、md、lg、xl 五档尺寸,默认 md;窄屏自动换行。 #### 外观组合 适用于主操作和附加菜单。调整状态、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。
Example source: src/split-button/__demos__/appearance-lab.vue ```vue ``` ## 内容与展示 ### 浮层与连续选择 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `placement` | 浮层相对触发元素的首选方位,默认 bottom;启用默认的 auto-fit-position 时,空间不足会自动翻转并约束到可视区域,不保证最终停在该侧 | 浮层与连续选择 | | `offset-y` | 屏幕垂直偏移,数字为 px,字符串按长度转换 | 浮层与连续选择 | | `popup-max-height` | 菜单最大高度 | 浮层与连续选择 | | `hide-on-select` | 选择菜单项后是否关闭菜单 | 浮层与连续选择 | 演示 bottom-start、8px 纵向偏移和 160px 最大高度。hide-on-select=false 支持连续选择,页面显示最近选中的 value。 Example source: src/split-button/__demos__/popup.vue ```vue ``` ## 自定义与插槽 ### 自定义图标 使用 icon 插槽中的 open 状态旋转箭头,两端使用相同图标。 Example source: src/split-button/__demos__/custom-icon.vue ```vue ``` ## 交互与控制 ### 受控展开 外部控制按钮使用 `@click.stop`,避免同一次点击冒泡到 document 后被判定为菜单外部点击。菜单触发器及正常的点击外部关闭逻辑不受影响。 使用 v-model:open 双向控制菜单;外部按钮、菜单触发器和选中关闭会同步更新状态。 Example source: src/split-button/__demos__/controlled.vue ```vue ``` ## 异步与动态数据 ### 异步操作 click 是普通事件通知,支持 async 回调;loading 由业务状态控制,建议在 finally 中恢复。事件监听器的 Promise 不会自动驱动加载。禁用/加载链接移除有效 href。 Example source: src/split-button/__demos__/async-action.vue ```vue ``` ## 阅读方向 主按钮位于阅读起点,菜单按钮位于阅读终点;LTR/RTL 切换不交换业务动作或额外触发选择。Enter/Space 保留原生按钮行为,菜单按钮支持上下键打开菜单并跳过禁用项,Home/End 定位首尾,Enter 选择,Escape 关闭并归还焦点。弹层继承触发按钮来源方向,start/end 对齐随方向变化,显式 left/right 保持物理侧。自定义向下图形不额外镜像。 ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | -------------------- | ----------------------------------------- | ------------------------------------------------ | :-------: | | open **(v-model)** | 菜单是否打开 | `boolean` | `-` | | default-open | 菜单默认是否打开(非受控模式) | `boolean` | `false` | | disabled | 是否禁用整个分裂按钮 | `boolean` | `false` | | status | 按钮组主题色 | `SemanticStatus` | `default` | | variant | 按钮组变体 | `ButtonVariant` | `default` | | size | 按钮组尺寸 | `ComponentSize` | `md` | | color | 自定义背景色 | `string` | `''` | | text-color | 自定义文字色 | `string` | `''` | | elevation | 按钮组海拔阴影 | `boolean \| number` | `true` | | button-props | 主按钮属性 | `Partial` | `-` | | trigger-button-props | 菜单触发按钮属性 | `Partial` | `-` | | trigger | 菜单触发方式 | `'hover' \| 'click' \| 'focus' \| 'contextMenu'` | `click` | | placement | 浮层相对触发元素的首选方位,默认 bottom;启用默认的 auto-fit-position 时,空间不足会自动翻转并约束到可视区域,不保证最终停在该侧 | `MenuPlacement`(标准十二方位) | `bottom` | | popup-container | 菜单挂载容器 | `PopupContainer` | `-` | | popup-max-height | 菜单最大高度 | `boolean \| number` | `true` | | popup-class | 菜单浮层类名 | `string \| array \| object` | `-` | | offset-x | 屏幕水平偏移,数字为 px,字符串按长度转换 | `string \| number` | `0` | | offset-y | 屏幕垂直偏移,数字为 px,字符串按长度转换 | `string \| number` | `0` | | hide-on-select | 选择菜单项后是否关闭菜单 | `boolean` | `true` | ### `` Events | 事件名 | 描述 | 参数 | | ----------- | -------------------------- | -------------------- | | update:open | 菜单打开状态请求更新时触发 | open: `boolean` | | open-change | 菜单打开状态变化时触发 | open: `boolean` | | click | 点击主按钮时触发 | event: `MouseEvent` | | select | 选择菜单项时触发 | value, option, event | ### `` Slots | 插槽名 | 描述 | 参数 | | ------- | ---------------- | --------------- | | default | 主按钮内容 | - | | icon | 菜单触发按钮图标 | open: `boolean` | | content | 菜单内容 | - | ### 实例方法 | 方法 | 说明 | | -------- | -------------------------- | | open() | 请求展开菜单;禁用时不展开 | | close() | 请求关闭菜单 | | resize() | 重新计算菜单位置 | 受控 `open` 只发出更新请求,需由调用方更新。主按钮点击正常冒泡,不打开菜单。 `click` 与 Button 一样是普通事件通知;不会等待监听器的返回值。异步操作由业务通过 `button-props.loading` 控制主按钮加载。 两端主体、Props、样式依赖入口及契约测试独立同源复制;Cedar 菜单定位由 Menu 适配,不共享实例或运行时。 ## 类型定义 ```ts import type { SplitButtonInstance, SplitButtonProps } from '@cedar-design/ui' ``` ### 方位语义与配置入口 菜单方位通过内部 Menu 的 placement 传递给 Trigger,使用 MenuPlacement 类型,不新增第二个定位入口。 --- Document: llms/zh-CN/components/split.md # Split 将面板分割成两部分。 ## 基础示例 ### 基础用法 将一个面板分割成两个可以调整宽度或高度的两部分。用`orientation`控制分割方向。 Example source: src/split/__demos__/basic.vue ```vue ``` ## 布局与排列 ### 面板分割嵌套 面板分割可以嵌套使用。 Example source: src/split/__demos__/nested.vue ```vue ``` ## API ### `` Props | 参数名 | 描述 | 类型 | 默认值 | | ------------------ | ----------------------------------------------------------------- | ---------------------------- | :------------: | | component | 分割框的 html 标签 | `string` | `'div'` | | orientation | 两个面板的排列轴向,默认 horizontal 表示左右面板;此时分割手柄自身为竖直 | `'horizontal' \| 'vertical'` | `'horizontal'` | | size **(v-model)** | 分割的大小,可以是 0~1 代表百分比,或具体数值的像素,如 300px | `number\|string` | `-` | | default-size | 默认分割的大小,可以是 0~1 代表百分比,或具体数值的像素,如 300px | `number\|string` | `0.5` | | min | 最小阈值,可以是 0~1 代表百分比,或具体数值的像素,如 300px | `number\|string` | `-` | | max | 最大阈值,可以是 0~1 代表百分比,或具体数值的像素,如 300px | `number\|string` | `-` | | disabled | 是否禁用 | `boolean` | `false` | ### `` Events | 事件名 | 描述 | 参数 | | ---------- | ---------------- | ---- | | move-start | 开始拖拽之前触发 | - | | moving | 拖拽时触发 | - | | move-end | 拖拽结束之后触发 | - | ### `` Slots | 插槽名 | 描述 | 参数 | | ------------------- | :--------------: | ---- | | first | 第一个面板的内容 | - | | resize-trigger | 伸缩杆的内容 | - | | resize-trigger-icon | 伸缩杆的图标 | - | | second | 第二个面板的内容 | - | ### 类型定义 组件导出以下类型定义 ```ts import type { SplitInstance } from '@cedar-design/ui' ``` `--c-split-trigger-size-icon-wrapper`(默认6px)控制分隔手柄粗细:竖直手柄为宽度,水平手柄为高度;不改变沿面板方向的100%长度。 ## 阅读方向与交互 Split 继承最近的原生 `dir`,横向第一个面板位于阅读起点。`size/defaultSize/min/max` 始终描述第一个面板,RTL 不会将尺寸变成 `1-size`,数字比例与 px 字符串保持原有单位。 横向 RTL 拖动时向左增大第一个面板;纵向仍向下增大。分隔条可聚焦,左右键按屏幕方向移动,纵向使用上下键,步长 10px,Shift 为 50px;Home/End 到达最小/最大边界。鼠标、触摸指针共用同一尺寸计算。切换方向、朝向、禁用或卸载会取消进行中的拖动并恢复原来的光标。方向切换本身不触发尺寸更新。 --- Document: llms/zh-CN/components/statistic.md # Statistic 统计数值 突出展示某个或某组数字、带描述的统计类数据。 ## 基础示例 ### 基础用法 通过 `title` 展示描述,通过 `value` 展示数值。`value` 支持数字或字符串。 Example source: src/statistic/__demos__/basic.vue ```vue ``` ## 内容与展示 ### 等宽数字 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `title` | 数值展示的标题 | 等宽数字、额外信息、数值动画 | | `value` | 数值展示的值 | 等宽数字、额外信息、数值动画 | | `suffix` | 数值后缀 | 等宽数字 | | `value-style` | 自定义显示值的样式 | 等宽数字 | | `tabular-nums` | 是否使用等宽数字,避免数值变化时宽度跳动 | 等宽数字 | | `prefix` | 数值前缀 | 额外信息 | 开启 `tabular-nums` 后,每个数字字符占用相同宽度,适合数值频繁变化或纵向对齐的场景。下面的数值始终保持四位,请观察右侧竖线:比例数字切换时竖线会左右跳动,等宽数字的竖线则保持稳定。 Example source: src/statistic/__demos__/tabular-nums.vue ```vue ``` ### 额外信息 通过 `extra` 或 `extra` 插槽在数值下方展示补充说明。 Example source: src/statistic/__demos__/extra.vue ```vue ``` ### 数值动画 通过 `animation` 开启数值滚动动画,可用 `start` 控制播放时机。 本例 Start 将父级 `start` 从 `false` 改为 `true`,从 `value-from` 播放到目标值;重复点击不会重播。`start=false` 暂停,随后切回 `true` 会从 `value-from` 重新播放,不是从暂停位置继续。需要可重播按钮时,由父级先设为 `false`,等待一次 Vue 更新后再设为 `true`。 Example source: src/statistic/__demos__/animation.vue ```vue ``` ### 倒计时 `Countdown` 是独立组件,模板中使用 ``。完整用法见 [Countdown 倒计时](llms/zh-CN/components/countdown.md)。 Example source: src/countdown/__demos__/statistic.vue ```vue ``` ## 自定义与插槽 ### 前缀 / 后缀 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `title` | 数值展示的标题 | 前缀 / 后缀、自定义数值 | | `suffix` | 数值后缀 | 前缀 / 后缀、自定义数值 | | `value` | 数值展示的值 | 前缀 / 后缀 | | `prefix` | 数值前缀 | 前缀 / 后缀 | | `show-group-separator` | 是否展示进位分隔符(数字模式使用) | 前缀 / 后缀 | | `precision` | 小数保留位数(数字模式使用) | 前缀 / 后缀 | 通过 `prefix` / `suffix` 或同名插槽为数值添加单位、货币符号或趋势图标。 Example source: src/statistic/__demos__/prefix-suffix.vue ```vue ``` ### 自定义数值 未传入 `value` 时,可用默认插槽自定义数值内容。例如嵌入 `CountTo` 实现滚动数字。 Example source: src/statistic/__demos__/count-to.vue ```vue ``` ## API ### `` Props | 属性 | 说明 | 类型 | 默认值 | | ---------------------- | -------------------------------------------------------------- | ------------------------- | ------------ | | `title` | 数值展示的标题 | `string` | - | | `value` | 数值展示的值 | `number \| string \| Date` | - | | `prefix` | 数值前缀 | `string` | - | | `suffix` | 数值后缀 | `string` | - | | `format` | 数值展示的格式(日期模式使用) | `string` | `'HH:mm:ss'` | | `extra` | 额外的显示内容 | `string` | - | | `start` | 是否开始动画 | `boolean` | `true` | | `precision` | 小数保留位数(数字模式使用) | `number` | `0` | | `separator` | 进位分隔符(数字模式使用) | `string` | - | | `show-group-separator` | 是否展示进位分隔符(数字模式使用) | `boolean` | `false` | | `tabular-nums` | 是否使用等宽数字,避免数值变化时宽度跳动 | `boolean` | `false` | | `animation` | 是否开启动画 | `boolean` | `false` | | `animation-duration` | 动画的过渡时间 | `number` | `2000` | | `value-from` | 动画的起始值 | `number` | - | | `placeholder` | 提示文字(当 `value` 为 `undefined` 且未使用默认插槽时显示) | `string` | - | | `value-style` | 自定义显示值的样式 | `CSSProperties` | - | ### `` Slots | 插槽名 | 说明 | 参数 | | --------- | ---------------------------------------- | ---- | | `default` | 自定义数值内容,未传入 `value` 时生效 | `-` | | `title` | 标题 | `-` | | `prefix` | 前缀 | `-` | | `suffix` | 后缀 | `-` | | `extra` | 额外内容 | `-` | ### 类型定义 组件导出以下类型定义 ```ts import type { StatisticProps } from '@cedar-design/ui' ``` ### 样式变量 | 变量名 | 默认值 | | --- | --- | | `--c-statistic-title-color` | `var(--c-sys-color-content-secondary)` | | `--c-statistic-title-font-size` | `var(--c-font-size-body-3)` | | `--c-statistic-title-margin-bottom` | `var(--c-spacing-4)` | | `--c-statistic-value-color` | `var(--c-sys-color-content-primary)` | | `--c-statistic-value-font-size` | `26px` | | `--c-statistic-value-font-weight` | `var(--c-font-weight-500)` | | `--c-statistic-decimal-font-size` | `inherit` | | `--c-statistic-prefix-color` | `var(--c-sys-color-content-secondary)` | | `--c-statistic-prefix-font-size` | `14px` | | `--c-statistic-prefix-spacing` | `var(--c-spacing-1)` | | `--c-statistic-suffix-color` | `var(--c-sys-color-content-secondary)` | | `--c-statistic-suffix-font-size` | `14px` | | `--c-statistic-suffix-spacing` | `var(--c-spacing-1)` | | `--c-statistic-extra-color` | `var(--c-sys-color-content-secondary)` | | `--c-statistic-extra-font-size` | `var(--c-font-size-body-3)` | | `--c-statistic-extra-margin-top` | `var(--c-spacing-4)` | ## 同源实现与平台边界 两端各自保存完整源码,不引用公共核心,不共享组件实例或响应式状态;修改时同步维护两份实现。主体、Props、关键样式及配对测试纳入只读源码一致性检查,主题 token 和安装入口各自维护。 默认插槽动态出现/消失时同步切换占位文字;动画在卸载及 KeepAlive 停用时暂停。 --- Document: llms/zh-CN/components/steps.md # Steps 明示任务流程和当前完成程度,引导用户按照步骤完成任务。 ## 基础示例 ### 基础用法 基础用法。 Example source: src/steps/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 外观组合 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `type` | 步骤条的类型 | 类型与状态对比 | | `status` | 当前步骤状态 | 类型与状态对比 | | `changeable` | 是否可以点击切换步骤 | 类型与状态对比 | 适用于多步骤流程的当前状态。调整状态、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。 Example source: src/steps/__demos__/appearance-lab.vue ```vue ``` ### 类型与状态对比 四种类型共享当前步骤和状态。先点击步骤或选择 1–3,再切换 wait、process、finish、error,观察 default、arrow、dot、navigation 同步更新;status 改变当前节点的语义状态,不改变步骤序号。标题与描述按页面语言显示,方便在手机宽度内对比。
配置说明与使用限制 #### 四种外观类型 `type` 当前有 `default`(编号)、`arrow`(箭头)、`dot`(圆点)、`navigation`(导航)四种外观;`status` 独立表示流程状态。箭头和导航类型仅支持水平方向。切换当前步骤或点击步骤,对比相同进度下的外观。现有 `type` 保持兼容。 #### 步骤错误 通过设置`status="error"`来展示错误状态。 #### 箭头步骤条 通过设置`type="arrow"`,可以使用箭头类型的步骤条,**注意**,仅支持水平步骤条。 #### 点状步骤条 通过设置`type="dot"`,可以使用点状类型的步骤条。此模式没有small尺寸 #### 导航步骤条 通过设置`type="navigation"`,可以使用导航类型的步骤条。
Example source: src/steps/__demos__/types.vue ```vue ``` ## 布局与排列 ### 内容放置位置 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `status` | 当前步骤状态 | 内容放置位置、竖直步骤条 | | `content-placement` | 正文相对步骤节点的方位,可选 right 或 bottom,默认 right;dot 类型按横纵轴推导,navigation 固定 right | 内容放置位置 | | `orientation` | 步骤流程的横纵轴向,默认 horizontal;arrow 和 navigation 类型固定横向 | 竖直步骤条 | 通过设置 `content-placement` 可以改变内容相对节点的位置,可选 `right`(默认)和 `bottom`。 Example source: src/steps/__demos__/content-placement.vue ```vue ``` ### 竖直步骤条 竖直方向的步骤条。 Example source: src/steps/__demos__/vertical.vue ```vue ``` ## 内容与展示 ### 描述信息 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `status` | 当前步骤状态 | 描述信息、隐藏连接线 | | `show-line` | 是否显示连接线 | 隐藏连接线 | 通过设置 `description` 属性,可以在每个步骤下方添加描述信息。 Example source: src/steps/__demos__/description.vue ```vue ``` ### 隐藏连接线 通过设置`show-line="false"`可以使用无连接线模式。 Example source: src/steps/__demos__/line-less.vue ```vue ``` ## 自定义与插槽 ### 自定义图标 通过`#icon`插槽可以自定义节点图标 Example source: src/steps/__demos__/custom-icon.vue ```vue ``` ## 交互与控制 ### 可切换步骤条 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `changeable` | 是否可以点击切换步骤 | 可切换步骤条 | | `status` | 当前步骤状态 | 可切换步骤条 | 设置`changeable`开启点击切换步骤。 Example source: src/steps/__demos__/changeable.vue ```vue ``` ## API 主值使用普通 `v-model`:`modelValue` 表示当前步骤序号,从 1 开始。`defaultValue` 仅在创建时初始化非受控状态,之后修改不会重置当前值;初始化不触发 `update:modelValue`。提供 `modelValue` 时由父级控制,以受控值为准。 ### Steps Props | 属性 | 说明 | 类型 | 默认值 | | -------------------- | ------------------------ | ----------------------------------------------------- | -------------- | | type | 步骤条的类型 | `'default'` \| `'arrow'` \| `'dot'` \| `'navigation'` | `'default'` | | orientation | 步骤流程的横纵轴向,默认 horizontal;arrow 和 navigation 类型固定横向 | `'horizontal'` \| `'vertical'` | `'horizontal'` | | content-placement | 正文相对步骤节点的方位,可选 right 或 bottom,默认 right;dot 类型按横纵轴推导,navigation 固定 right | `'right'` \| `'bottom'` | `'right'` | | model-value(**v-model**) | 当前步骤数 | `number` | `-` | | default-value | 默认的步骤数(非受控状态) | `number` | `1` | | status | 当前步骤状态 | `'wait'` \| `'process'` \| `'finish'` \| `'error'` | `'process'` | | show-line | 是否显示连接线 | `boolean` | `true` | | size | 步骤条尺寸 | `'sm'` \| `'md'` | `'md'` | | changeable | 是否可以点击切换步骤 | `boolean` | `false` | ### Steps Events | 事件名 | 说明 | 参数 | | ------------------- | ------------------------------ | ---------------------------- | | change | 步骤数发生改变时触发(需开启 `changeable`) | current:`number`
previous:`number`
ev:`Event` | | update:modelValue | `v-model` 同步 | step:`number` | ### Steps Slots | 插槽名 | 说明 | | ----------- | ------------ | | default | 步骤内容 | | finish-icon | 完成状态图标 | | error-icon | 错误状态图标 | ### Step Props | 属性 | 说明 | 类型 | 默认值 | | ----------- | ------------ | -------------------------------------------------- | ------- | | title | 步骤的标题 | `string` | `-` | | description | 步骤的描述 | `string` | `-` | | status | 步骤的状态 | `'wait'` \| `'process'` \| `'finish'` \| `'error'` | `-` | | disabled | 是否禁用步骤 | `boolean` | `false` | ### Step Slots | 插槽名 | 说明 | 参数 | | ----------- | ---- | --------------------------------- | | default | 标题 | `index`、`status`、`active`、`disabled` | | title | 标题 | `index`、`status`、`active`、`disabled` | | node | 节点 | `index`、`status`、`active`、`disabled` | | icon | 图标 | `index`、`status`、`active`、`disabled` | | description | 描述 | `index`、`status`、`active`、`disabled` | ## 类型定义 组件导出以下类型定义 ```ts import type { StepsProps, StepProps, StepsType, StepStatus, StepsSize, StepsContentPlacement, StepsInstance, StepsStepInstance, } from '@cedar-design/ui' ``` ## 同源实现与平台边界 两端各自保存完整源码,不引用公共核心,不共享组件实例或响应式状态;修改时同步维护两份实现。主体、Props、关键样式及配对测试纳入只读源码一致性检查,主题 token 和安装入口各自维护。 Steps 和 Step 的主体、Props、上下文协议与样式同源复制;注入 Symbol 分别定义在各库,不跨库共享。保留四种 type 和原有状态/事件契约。 `active` 只表示当前步骤序号(从 1 开始)是否对应 modelValue;与 status(wait/process/finish/error)分开。当前步骤即使为 error,active 仍为 true;焦点、悬停不会改变 active。 ### 方位语义与配置入口 content-placement 统一的是方位词汇和拼写,不要求所有组件开放相同集合。Steps 仅实现 right/bottom;dot 和 navigation 类型有各自推导规则,不为统一添加尚未实现的方位。 ## 阅读方向与键盘交互 Steps 继承最近的 `dir="ltr"` 或 `dir="rtl"`,支持运行时切换。横向步骤、连接线和方向箭头随阅读方向排列,纵向步骤仍从上到下;序号、进度值和自定义图标内容保持原意。 `changeable` 开启时,左右键按当前阅读方向移动焦点,纵向使用上下键;Home/End 聚焦首尾可用步骤,禁用项会被跳过。Enter/Space 确认步骤;移动焦点和切换方向不会触发进度更新。 --- Document: llms/zh-CN/components/style-provider.md # StyleProvider 样式定制 两端独立同源,API、安装、默认值设置和运行逻辑一致;仅平台标识与本地导入不同。 ## 基础示例 ### 基础用法 Example source: src/style-provider/__demos__/basic.vue ```vue ``` 按钮只切换本例外层 `section` 的局部变量:关闭时文字继承父级颜色,内层 coral 覆盖和外部文字不变;再次切换恢复 teal。该 Demo 不调用全局 `setStyleVars`,不能用它验证全局主题注入、替换或清理。 局部变量按 DOM 继承,嵌套 Provider 可覆盖父级变量;传入 `null` 清除本层覆盖(仍会继承父级)。通过 `popupContainer` 移到 Provider 外的节点不继承局部变量。组件式调用不修改全局主题属性。 局部组件定制优先设置实际 component 变量;只改 palette/system 变量,不会自动重算从根节点继承的组件别名。需要局部联动时在本层显式重声明相关映射;这不是自动完整主题重建。弹层变量放在真实挂载宿主。详见[Design Token 与 CSS 变量分层](llms/zh-CN/guide/design-tokens.md)。 ## 全局调用 ```ts import { StyleProvider, Themes } from '@cedar-design/ui' StyleProvider.setStyleVars(Themes.default.dark) StyleProvider.setStyleVars(Themes.maple.light) StyleProvider.setStyleVars(null) ``` 每次调用替换上次注入,不累计合并。与当前基础样式一致的变量不重复写入。 `dark` 设置 `html[cedar-theme="dark"]`;`light` 移除该属性。未提供 color-scheme 时保留现有主题属性;`null` 移除本库注入和主题属性,不影响另一库。SSR 中函数调用无副作用。 变量支持完整 CSS 名称,也支持驼峰(如 `cColorScheme`);不会自动补充库前缀。推荐完整 `--c-*` 名称。 ## 安装与默认值 ```ts import { StyleProvider } from '@cedar-design/ui' app.use(StyleProvider) StyleProvider.setPropsDefaults({ tag: 'section', styleVars: () => ({ '--c-demo-color': 'teal' }), }) ``` 在应用初始化、挂载组件之前设置默认值,不追溯更新已挂载实例;显式 Props 优先。对象形式会为每个实例复制变量对象,也支持工厂和 `null`。默认配置仅属于本库,不跨库共享。 安装固定注册 `CStyleProvider`,不修改应用全局配置;自定义别名使用 `app.component('MyStyleProvider', StyleProvider)`。 ## API | 属性 | 说明 | 类型 | 默认值 | | --- | --- | --- | --- | | `style-vars` | 局部变量,null 清空本层覆盖 | `Record \| null` | `{}` | | `tag` | 包裹标签 | `string` | `div` | 默认插槽为组件内容,无事件。 ## 类型定义 导出 `StyleVars`、`StyleProviderProps`、`StyleProviderDefaults`、`StyleProviderInstance`;运行时只以 `StyleProvider` 作为公开组件入口,另导出 `styleProviderProps` 和供 resolver 使用的 `_StyleProviderComponent`。 本组件不声明专属主题 token;变量值为字符串,数字尺寸请写成带单位的字符串。 --- Document: llms/zh-CN/components/style/atomic-css.md # 原子化 CSS Cedar 提供两套能力: | 能力 | 包 / 入口 | 何时用 | | ---------------- | -------------------------------------------------------- | -------------------------------- | | 固定工具类 `c-*` | `@cedar-design/ui` 的 `style/utilities/index.less` | 不接 Uno/TW 时使用 | | Uno / TW preset | `@cedar-design/preset-unocss` / `@cedar-design/preset-tailwindcss` | 使用带 `c-` 前缀的完整原子化体系 | Preset **不是组件**,是构建期配置:装好后即可写 `c-flex`、`c-p-16`、`c-bg-primary`、`c-text-md` 等。主题切换(暗色 / StyleProvider)只改 CSS 变量,类名不变。日常分类速查见 [常用写法](llms/zh-CN/components/style/atomic-usage.md)。 Maple 也提供 UnoCSS / Tailwind CSS preset。`mp-` 是否生效取决于生成器配置,详见下方“Maple 对应配置”。 > 下方 Demo 用与 Preset 等价的 CSS(`var(--c-*)`)做视觉预览;真实项目中这些类由 Uno / Tailwind 生成。 ## 基础示例 ### 新手示例 UnoCSS 和 Tailwind **二选一配置**,但组件里的类名完全相同。可以先复制下面这张卡片,再逐个调整类名观察效果: ```vue ``` 读法很简单:`c-` 是 Cedar 前缀;`flex` 是布局;`p/px/py/gap` 是间距;`bg/text/border` 是颜色;`rounded` 是圆角;`hover:` 是交互状态。 Example source: src/style/atomic-css/__demos__/starter.vue ```vue ``` ### 与固定工具类的分工 Example source: src/style/atomic-css/__demos__/overview.vue ```vue ``` --- ## 颜色、文字与间距 ### 颜色 Color 主题色 key 使用无前缀语义名,最终生成的 utility 统一带 `c-` 前缀。 | Theme key | CSS 变量 | 背景 | 文字 | 边框颜色 | | ---------- | -------------------- | --------------- | ----------------- | ------------------ | | `body` | `--c-color-body` | `c-bg-body` | — | — | | `primary` | `--c-color-primary` | `c-bg-primary` | `c-text-primary` | `c-border-primary` | | `info` | `--c-color-info` | `c-bg-info` | `c-text-info` | `c-border-info` | | `success` | `--c-color-success` | `c-bg-success` | `c-text-success` | `c-border-success` | | `warning` | `--c-color-warning` | `c-bg-warning` | `c-text-warning` | `c-border-warning` | | `danger` | `--c-color-danger` | `c-bg-danger` | `c-text-danger` | `c-border-danger` | | `disabled` | `--c-color-disabled` | `c-bg-disabled` | `c-text-disabled` | — | 颜色类只设置对应的颜色属性。比如 `c-border-primary` 只设置 `border-color`,需要和边框宽度类一起使用: ```html
primary border
danger border
``` 常见组合方式: ```html
primary
hover
responsive
``` UnoCSS / Tailwind 只扫描源码中完整出现的类名。不要用 `c-bg-${status}` 动态拼接;必须动态选择时,使用完整类名映射或生成器的 safelist。 Example source: src/style/atomic-css/__demos__/colors.vue ```vue ``` ### 字号 Font size | 档位 | CSS 变量 | Uno / Tailwind 类名 | | ---- | ------------------ | ------------------- | | xs | `--c-font-size-xs` | `c-text-xs` | | sm | `--c-font-size-sm` | `c-text-sm` | | md | `--c-font-size-md` | `c-text-md` | | lg | `--c-font-size-lg` | `c-text-lg` | > 两套引擎使用同一套类名。不要与固定工具类语义色 `c-text-1…4` 混淆。 Example source: src/style/atomic-css/__demos__/font-size.vue ```vue ``` ### 间距 Spacing 间距与宽高数值直接对应像素:`1 = 1px`。例如 `c-p-8` 为 8px、`c-mt-16` 为 16px、`c-h-10` 为 10px; 百分比用 `c-w-full` / `c-h-full` 或 `c-w-1/2`。方向写法与 Uno / Tailwind 一致。 | 类型 | 示例 | | -------------- | ------------------------------------------------- | | margin | `c-m-16` `c-mt-16` `c-mx-8` `c-my-24` | | padding | `c-p-16` `c-pt-16` `c-px-8` `c-py-24` | | gap | `c-gap-8` `c-gap-x-16` `c-gap-y-24` | | auto | `c-m-auto` `c-ml-auto` | | width / height | `c-w-10` `c-h-10` `c-w-full` `c-h-auto` `c-w-1/2` | Example source: src/style/atomic-css/__demos__/spacing.vue ```vue ``` ## 响应式与组合 ### 断点 Breakpoints / Screens 两边数值一致(框架惯例,**不加** `c-` 前缀): | 断点 | 宽度 | | ---- | ------ | | `sm` | 768px | | `md` | 992px | | `lg` | 1200px | | `xl` | 1920px | 写法示例:`sm:c-bg-info` `md:c-bg-warning` `lg:c-bg-danger` `xl:c-bg-success` Example source: src/style/atomic-css/__demos__/breakpoints.vue ```vue ``` ### 组合示例 ```html ``` Example source: src/style/atomic-css/__demos__/combined.vue ```vue ``` --- ## UnoCSS ### 安装 ```shell pnpm add -D @cedar-design/preset-unocss unocss ``` ### 配置 ```js // uno.config.ts import { defineConfig } from "unocss"; import { presetCedar } from "@cedar-design/preset-unocss"; export default defineConfig({ presets: [presetCedar()], }); ``` 可选参数:`presetCedar({ colors, fontSize, breakpoints })`,设为 `false` 可关闭某一块。 ### 需已加载主题变量 ```js import "@cedar-design/ui/dist/index.css"; // 或自行引入含 --c-* 的主题样式 ``` --- ## Tailwind CSS ### 安装 ```shell pnpm add -D @cedar-design/preset-tailwindcss tailwindcss ``` ### Tailwind v3 ```js // tailwind.config.js import { presetCedar } from "@cedar-design/preset-tailwindcss"; export default { content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}"], presets: [presetCedar()], }; ``` ### Tailwind v4 ```js // tailwind.config.js import { presetCedar } from "@cedar-design/preset-tailwindcss"; export default { presets: [presetCedar()], }; ``` ```css /* src/style.css */ @import "tailwindcss"; @config '../tailwind.config.js'; ``` --- 完整分类(Flex / 间距 / 尺寸 / 溢出 / 圆角等)见 [常用写法](llms/zh-CN/components/style/atomic-usage.md)。下面只列 preset 挂到 Cedar token 上的那几项。 ## 可选配置 ```js presetCedar({ colors: true, // 或 false / 覆盖部分 key fontSize: true, // 设为 false 可关闭,也可传自定义 fontSize map // Uno: breakpoints: true, // TW: // screens: true, }); ``` ### 自定义主题映射 `colors` 和 `fontSize` 可覆盖部分默认值,未传入的 key 保持默认映射: ```js presetCedar({ colors: { primary: "var(--app-color-brand)", danger: "var(--app-color-error)", }, fontSize: { md: "15px", }, }); ``` 设为 `false` 会关闭 Cedar 对应的主题映射。生成器自身的默认 utility 仍可能存在,但不再绑定 Cedar CSS 变量。 --- ## Maple 对应配置 Maple 的 UnoCSS preset 已内置带 `mp-` 前缀的 `presetUno`: ```js import { defineConfig } from "unocss"; import { presetMaple } from "@nio-pow/maple-preset-unocss"; export default defineConfig({ presets: [presetMaple()], }); ``` UnoCSS 和 Tailwind CSS 两套 Maple preset 均生成 `mp-bg-primary`、`mp-text-primary`、`mp-border mp-border-primary` 等类,不提供无前缀别名。 Tailwind 的 `prefix` 是全局配置,同一个 Tailwind 实例不适合同时加载使用不同前缀的 Cedar 与 Maple preset。 --- ## 注意 - Preset 包含框架提供的完整原子类,全部使用 `c-` 前缀,如 `c-flex`、`c-p-16`。 - 类名必须以 `c-` 开头(如 `c-bg-primary`),不提供无前缀别名。 - UnoCSS 与 Tailwind CSS 二选一,不要在同一应用中同时启用两套生成器。 - Cedar 与 Maple 使用了同名 theme key。即使 UnoCSS 可配置不同 utility 前缀,也应避免在同一个配置中直接合并两套 theme;否则同名颜色可能按 preset 顺序相互覆盖。 --- Document: llms/zh-CN/components/style/atomic-usage.md # 常用写法 这一页按场景整理带 `c-` 前缀的原子类。布局、间距、尺寸等类由 UnoCSS 或 Tailwind preset 在构建期生成,**不是 UI 包默认附带的全部工具类**;安装配置见 [原子化 CSS](llms/zh-CN/components/style/atomic-css.md)。 下方 Demo 使用局部等价 CSS 展示效果,不要求文档读者先安装生成器。源码里的演示类只用于展示;业务中使用表格列出的 preset 类。 ## 基础示例 ### 布局与组合 | 场景 | 类名示例 | | --- | --- | | 横向排列 | `c-flex c-items-center c-justify-between` | | 纵向排列 | `c-flex c-flex-col` | | 换行 | `c-flex c-flex-wrap` | | 间隔 | `c-gap-12` | Example source: src/style/atomic-css/__demos__/combined.vue ```vue ``` ## 间距与响应式 ### 内外间距 `p` / `m` 表示内 / 外间距,`x` / `y` 表示水平 / 垂直双轴,`t/r/b/l` 表示单侧。例如 `c-p-16`、`c-px-8`、`c-mt-16`。 Example source: src/style/atomic-css/__demos__/spacing.vue ```vue ``` ### 响应式布局 `sm:`、`md:`、`lg:`、`xl:` 在对应视口断点应用类;容器宽度与 viewport 不是同一概念。 Example source: src/style/atomic-css/__demos__/breakpoints.vue ```vue ``` ## 颜色与文字 ### 语义颜色与字号 业务优先使用语义颜色,不在组件中硬编码品牌色。固定颜色工具类与 preset 类的能力范围不同,见 [颜色 Color](llms/zh-CN/components/style/color.md) 与 [Utilities 总览](llms/zh-CN/components/style/utilities.md)。 Example source: src/style/atomic-css/__demos__/colors.vue ```vue ``` Example source: src/style/atomic-css/__demos__/font-size.vue ```vue ``` --- Document: llms/zh-CN/components/style/color.md # 颜色 Color 语义色工具类带库前缀:Cedar `c-*`,Maple `mp-*`(变量 `--c-*` / `--mp-*`)。 完整色阶与语义变量见 [色板 Palette](llms/zh-CN/components/palette.md)。 - 业务页用类名(`c-text-1`);主题覆盖 / 组件 token 用变量(`--c-color-text-1`) - 点击 Class 可快捷复制 - 不做无前缀别名、不做向后兼容 ### 类名规则 | 类名 | 变量 | | --------------------------------------- | ------------------------------------------------------------------------- | | `c-text-1` … `c-text-4` | `var(--c-color-text-1)` … `var(--c-color-text-4)` | | `c-fill-1` … `c-fill-4` | `var(--c-color-fill-1)` … `var(--c-color-fill-4)` | | `c-color-border-1` … `c-color-border-4` | `var(--c-color-border-1)` … `var(--c-color-border-4)` | | `c-bg-0` / `c-bg-1` / `c-bg-2` | `var(--c-color-bg-white)` / `var(--c-color-bg-1)` / `var(--c-color-bg-2)` | ## 基础示例 ### 填充颜色 Fill Example source: src/style/color/__demos__/fill.vue ```vue ``` ## 颜色应用 ### 边框颜色 Border Example source: src/style/color/__demos__/border.vue ```vue ``` ### 文字颜色 Text Example source: src/style/color/__demos__/text.vue ```vue ``` ### 背景颜色 Background Example source: src/style/color/__demos__/background.vue ```vue ``` --- Document: llms/zh-CN/components/style/elevation.md # 海拔 Elevation Material 式海拔阴影 `c-elevation--0` … `c-elevation--24`,表现元素立体层次。 Maple 对应:`mp-elevation--0` … `mp-elevation--24`(独立引入 `elevation.css`)。 ## 基础示例 ### 类名 Example source: src/style/elevation/__demos__/class.vue ```vue ``` ## 阴影组合 ### 示例 Demo Example source: src/style/elevation/__demos__/demo.vue ```vue ``` --- Document: llms/zh-CN/components/style/typography.md # 字体排版 Typography 样式工具类,用来设置文本与排版相关属性(Cedar PC 扩展;Maple 侧栏保留同名入口,能力见 Maple Typography 说明页)。 - 点击 Class 可快捷复制 - Properties 表示该 Class 设置的属性值 - Effective CSS 表示该 Class 最终生效的 CSS 属性 ## 基础示例 ### 字阶 Example source: src/style/typography/__demos__/font.vue ```vue ``` ## 字号与字形 ### 字号 Example source: src/style/typography/__demos__/font-size.vue ```vue ``` ### 字族 Example source: src/style/typography/__demos__/font-family.vue ```vue ``` ### 字重 Example source: src/style/typography/__demos__/font-weight.vue ```vue ``` ## 对齐与行高 ### 文本对齐 Example source: src/style/typography/__demos__/text-align.vue ```vue ``` ### 行高 Example source: src/style/typography/__demos__/line-height.vue ```vue ``` --- Document: llms/zh-CN/components/style/utilities.md # Utilities 工具类总览 Cedar / Maple 语义与结构一致,**类名必须带库前缀**(`c-` / `mp-`),变量分别为 `--c-*` / `--mp-*`,避免两端混用撞名。 不做无前缀别名,不做向后兼容。 | | Cedar | Maple | | ------------- | -------------------------------------------------------- | -------------------------------------------------------------------- | | 类名 | `c-text-1`、`c-mt-16` | `mp-text-1`、`mp-mt-16` | | 形态 | 固定 Utilities + Uno/TW preset | 独立 Utilities + Uno/TW preset | | Token | `--c-*` | `--mp-*` | | 暗色 | 只改 token,类名不变 | 同左 | | 原子化 preset | `@cedar-design/preset-unocss` / `@cedar-design/preset-tailwindcss` | `@maple-design/preset-unocss` / `@maple-design/preset-tailwindcss` | 完整规范见 [Utility 工具类规范](llms/zh-CN/practices/utility-spec.md)。色阶变量(`--c-red-1…10` 等)见 [Palette](llms/zh-CN/components/palette.md),不进默认工具包。 ## 基础示例 ### 快速预览 Example source: src/style/utilities/__demos__/overview.vue ```vue ``` ### 分册 | 页面 | 内容 | | ---------------------------------------------------- | -------------------------------------------- | | [颜色 Color](llms/zh-CN/components/style/color.md) | 文字 / 填充 / 边框 / 背景层级 | | [常用写法](llms/zh-CN/components/style/atomic-usage.md) | Flex / 间距 / 尺寸 / 溢出 / 圆角等日常原子类 | | [海拔 Elevation](llms/zh-CN/components/style/elevation.md) | `c-elevation--0` … `--24` | | [字体排版 Typography](llms/zh-CN/components/style/typography.md) | PC 排版工具包 | | [原子化 CSS](llms/zh-CN/components/style/atomic-css.md) | Uno / TW 安装与配置 | --- Document: llms/zh-CN/components/switch.md # Switch 与 Maple 使用相同场景、参数和交互顺序;示例源码仅替换组件前缀,主题与站点外壳各自保留。 ## 阅读方向 开关继承来源 dir:未选中手柄位于阅读起点,选中后向阅读终点移动。Space/Enter 仍表示切换;方向变化本身不改变业务值,禁用、只读和 loading 时不提交切换。 ## 基础示例 ### 双向绑定与默认值 Example source: src/switch/__demos__/basic.vue ```vue ``` ## 外观与状态 ### 外观配置对比 选择一个对比维度后,同屏展示它的全部可选值;其余配置和内容保持一致。可切换其他配置检查组合效果;输入类预览共享一个值。
配置说明与使用限制 #### 外观组合 适用于即时生效的开关设置。调整变体、尺寸,用相同数据观察变化。内容保持一致,便于比较不同设置的实际效果。
Example source: src/switch/__demos__/appearance-lab.vue ```vue ``` ## 自定义与插槽 ### 自定义颜色 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | ----------------- | -------------- | ---------------------- | | `variant` | 造型 | 自定义文字、自定义图标 | | `checked-color` | 选中轨道颜色 | 自定义颜色 | | `unchecked-color` | 未选中轨道颜色 | 自定义颜色 | | `checked-text` | 选中文案 | 自定义文字 | | `unchecked-text` | 未选中文案 | 自定义文字 | | `ripple` | 点击波纹 | 水波与滑块阴影 | Example source: src/switch/__demos__/custom-color.vue ```vue ``` ### 自定义文字 Example source: src/switch/__demos__/custom-text.vue ```vue ``` ### 自定义图标 Example source: src/switch/__demos__/custom-icon.vue ```vue ``` ### 水波与滑块阴影 Example source: src/switch/__demos__/custom.vue ```vue ``` ## 交互与控制 ### 交互状态对比 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --------------- | --------------------------------------------------------- | -------------- | | `disabled` | 禁用;表单禁用也阻止交互 | 交互状态对比 | | `readonly` | 只读;仍可聚焦与通知 click,不切换 | 交互状态对比 | | `variant` | 造型 | 加载中 | | `loading` | 加载中;禁止 click 和切换 | 加载中 | | `default-value` | 非受控初始实际值,仅创建时读取;省略时使用 uncheckedValue | 加载中 | | `size` | 尺寸档位;省略时见跨端说明 | 焦点与事件顺序 | 在同一实例上切换禁用、只读和错误状态后再操作控件,比较可编辑性和交互反馈。恢复开关位于目标控件外;错误外观本身不会执行校验。
配置说明与使用限制 #### 交互状态切换 适用于即时生效的开关设置。调整禁用、只读,用相同数据观察变化。控制区始终可用,可以随时恢复编辑;错误外观本身不会触发表单校验。
Example source: src/switch/__demos__/state-lab.vue ```vue ``` ### 加载中 Example source: src/switch/__demos__/loading.vue ```vue ``` ### 焦点与事件顺序 Example source: src/switch/__demos__/events.vue ```vue ``` ### 自定义值与事件 Example source: src/switch/__demos__/custom-value.vue ```vue ``` ## 异步与动态数据 ### 异步允许、阻止与异常 Example source: src/switch/__demos__/switch-interception.vue ```vue ``` ## API ### 空值识别与阅读空文案 `empty-values` 用于空值识别,`empty-value` 保留原清空输出;`empty-text` 仅在 `read-pretty` 空内容下展示,默认 `'-'`,字段 > FormItem > Form,自定义 read 插槽优先。显式配置 empty-values 后,内置 required 接入该策略,自定义校验仍收到原值。详见[统一说明](llms/zh-CN/guide/empty-values.md)。 | 参数 | 类型 | 缺省与范围 | | ------------ | ------------------ | ----------------------------------------------------- | | empty-values | readonly unknown[] | 字段 > FormItem > Form > 组件族默认;完整覆盖,不合并 | | empty-text | string | 字段 > FormItem > Form > '-';显式 '' 有效 | 以上是字段展示层 API;纯面板不因此新增阅读模式。Form 与 FormItem 提供继承配置。empty-value 的现有类型与默认输出仍按该组件原 API 执行。 ### 主值与默认值 使用普通 `v-model`。`modelValue` 表示开关的实际值,类型与 checkedValue/uncheckedValue 一致;`defaultValue` 仅在创建时初始化非受控值,后续修改不会重置当前状态。显式绑定值优先,初始化不发出 `update:modelValue`。 ### Props | Prop | 含义 | 类型 | 默认值 | | ---------------- | ------------------------------------------------------------ | -------------------------------------------------------------------- | --------- | | model-value | 受控值;省略时内部管理 | string / number / boolean | undefined | | default-value | 非受控初始实际值,仅创建时读取;省略时使用 uncheckedValue | string / number / boolean | undefined | | clearable | 弹出编辑时显示清空操作 | boolean | false | | empty-value | 清空后提交的值,可传值或工厂函数 | SwitchValue \| null \| (() => SwitchValue \| null) | undefined | | edit-mode | 编辑模式;未设置时继承 FormItem/Form,平台值域见编辑模式说明 | FieldEditMode | undefined | | read-pretty | 纯阅读展示,独立于 readonly | boolean | undefined | | before-commit | 编辑层保存前的可取消拦截器 | BeforeFieldCommit | undefined | | open | 编辑层受控打开状态 | boolean | undefined | | default-open | 编辑层非受控初始状态 | boolean | false | | popup-container | 编辑层挂载容器 | PopupContainer | undefined | | checked-value | 选中值 | string / number / boolean | true | | unchecked-value | 未选中值 | string / number / boolean | false | | variant | 造型 | circle / round / line / tonal | circle | | size | 尺寸档位;省略时见跨端说明 | sm / md / lg | undefined | | disabled | 禁用;表单禁用也阻止交互 | boolean | undefined | | readonly | 只读;仍可聚焦与通知 click,不切换 | boolean | undefined | | loading | 加载中;禁止 click 和切换 | boolean | false | | before-change | 切换拦截器,不是事件 | (payload, done, context) => boolean / void / Promise | — | | checked-text | 选中文案 | string | — | | unchecked-text | 未选中文案 | string | — | | checked-color | 选中轨道颜色 | string | — | | unchecked-color | 未选中轨道颜色 | string | — | | loading-color | 加载图标颜色 | string | — | | ripple | 点击波纹 | boolean | true | | handle-elevation | 滑块阴影,true 等级 2,数字取整数并限制 0~24 | boolean / number | true | before-change 返回 false、抛错或拒绝 Promise 均取消切换;其他正常完成允许切换。等待 Promise 或 done 期间自动 loading,重复输入被阻止。 等待期间卸载、KeepAlive 停用、值被外部更新、禁用/只读/loading 状态改变时,旧结果失效。 受控模式仅发送更新请求;父级更新 model-value 后才改变选中状态。省略 model-value 时使用内部状态。 ### Events | 事件 | 参数与时机 | | ------------------ | ---------------------------------------------------- | | click | (event: Event),允许点击时,拦截前 | | update:model-value | (nextValue: SwitchValue),允许切换后,先于 change | | change | (nextValue: SwitchValue, event: Event),每次提交一次 | | focus | (event: FocusEvent),获得焦点 | | blur | (event: FocusEvent),失去焦点 | 支持 Enter、Space;按键长按重复不重复切换。disabled/loading 不触发 click 或值变化;readonly 可通知 click,但不执行拦截器。 外部 model-value 更新不会额外触发 change。 ### Slots | 插槽 | 说明 | 参数 | | -------------- | ---------------------------------------------------- | ---- | | checked | 选中文案,优先于 checked-text;line 与 sm 不展示 | — | | unchecked | 未选中文案,优先于 unchecked-text;line 与 sm 不展示 | — | | checked-icon | 选中滑块图标,loading 时被加载图标替代 | — | | unchecked-icon | 未选中滑块图标,loading 时被加载图标替代 | — | ### Methods 无公开方法。 ### 跨端说明 组件属性、事件参数和插槽一致。Cedar 省略 size 时继承表单/全局尺寸(xs/sm 映射 sm,lg/xl 映射 lg);Maple 回退 md。两端的 disabled / readonly 均按字段 > FormItem > Form 继承,显式 false 覆盖父级;表单集成由各端适配。 ### 类型 SwitchProps、SwitchVariant、SwitchSize、SwitchValue、SwitchBeforeChange、SwitchInstance 均由根入口及组件入口导出。 ### 样式变量 | Token(Cedar 使用 --c-,Maple 使用 --mp-) | 默认值 | | --------------------------------------------------------- | ----------------------------------- | | --c-switch-width / height / handle-size | 40px / 24px / 16px | | --c-switch-size-sm-scale / size-lg-scale | .8 / 1.2 | | --c-switch-tonal-width / tonal-height / tonal-handle-size | 52px / 32px / 24px | | --c-switch-line-height / line-handle-size | 12px / 20px | | --c-switch-hit-area | 0px,点击区域向外扩展量,不改变布局 | | --c-switch-track-background / track-active-background | 中性色 / 主题色 | | --c-switch-handle-background / handle-color | 白色 / 主题色 | | --c-switch-disabled-opacity | .5 | | --c-switch-round-radius / gap | 4px / 4px | 完整可调变量见 style/token.less;旧版各端 Switch 几何 token 不保证保留。 ## 迁移 Maple standard → line;不传 variant 现在使用 circle。两端统一四变体,不将 standard 保留为别名。 移除 lazy-change;before-change 从 (value, change) 回调改为返回值/Promise,应用不再手动调用 change。 Maple change 补齐第二个原始事件参数;checked-color/unchecked-color 统一控制轨道,滑块颜色通过 token 定制。 ### 颜色变量与 tonal 前景迁移 | 变量后缀(--c-switch-) | system 默认角色 | 职责 | | ----------------------- | ----------------- | ---------------------------------------- | | track-background | content-secondary | 普通未选中实心轨道 | | track-active-background | content-brand | 选中轨道及键盘焦点环 | | track-error-background | content-danger | 可交互错误轨道及 tonal 错误边框 | | handle-background | surface-default | 普通/选中/错误滑块底色 | | handle-color | content-brand | 普通/选中/错误滑块图标色 | | text-color | surface-default | 实心轨道上的文字色 | | checked-text-color | switch-text-color | 选中轨道文字;错误态仍遵循原有前景优先级 | | tonal-track-background | surface-muted | tonal 未选中轨道底色 | | tonal-border-color | content-secondary | tonal 未选中边框及滑块底色 | | tonal-text-color | content-secondary | 新增:tonal 未选中轨道文字 | | tonal-handle-color | surface-default | 新增:tonal 未选中滑块图标 | 默认值引用对应 system 角色,例如 var(--c-sys-color-content-secondary)。tonal 未选中时使用 tonal-text-color / tonal-handle-color;需要全变体定制时请同时覆盖普通和 tonal 前景。可交互错误态使用普通文字/滑块配对,disabled / loading 抑制错误色。自定义轨道颜色需自行验证前景对比。阴影、尺寸及动效不在本批颜色契约中。 ### 主题名与造型名 当前主题入口为 Themes.default.light / dark 与 Themes.maple.light / dark。Switch 的 tonal 是造型,不是主题;公开变体与八项专用变量统一使用 tonal 命名,不保留旧名称别名。 ### 动效变量 内置动效遵循 `prefers-reduced-motion: reduce`;减少动效不会阻止加载状态或关闭事件更新。 | Token | Default | | ----------------------------- | ------- | | `--c-switch-loading-duration` | `1s` | ### Form 字段展示与确认 本组件支持 `edit-mode`,字段 > FormItem > Form 逐层继承;未指定时为 `direct`,保留原有交互。支持值:`direct / click / dblclick`。非 direct 编辑模式通过字段值入口打开编辑面板,并维护单份草稿;确认后才更新 v-model,取消、重置或启用 readPretty 时丢弃草稿。 Cedar 使用 edit-mode="click" / "dblclick" 在字段附近打开编辑浮层,Enter/F2 也可进入;取消/Escape 丢弃草稿,确认后提交。readPretty 为独立阅读属性,与 readonly、disabled 分开。 `before-commit(value, { previousValue, signal })` 可拦截弹层保存;FormItem 先校验候选值,失败保持编辑。`open / default-open / update:open` 控制编辑层。`#read="{ value, text }"` 可自定义阅读内容。集中示例见 Form 的“各类字段统一展示”。 `read-pretty` 为独立布尔属性,与 `readonly`、`disabled` 同级;字段 > FormItem > Form 继承,显式 `false` 覆盖父级。默认 `false`。纯阅读不显示编辑器。 ### 表单状态继承 省略 `disabled` / `readonly` 时依次继承 FormItem、Form;显式 `false` 覆盖父级。等待 `beforeChange` 时,父级变为禁用或只读会使此次切换失效,迟到结果不再改值。表单外省略时仍表现为 false。 ## 表单 disabled 的继承 disabled 默认 undefined 表示继承,有效状态按 local ?? FormItem ?? Form ?? false 解析。显式 false 不会被吞掉,可以让一个字段保持可用,其他未指定字段仍跟随 Form。Form disabled 仍是整张表单的默认策略,不是禁止所有子项覆盖的强制锁。 `empty-value` 可显式设为 `null`(或 `() => null`),清空时原样提交 null;省略时保留组件原默认值。界面把 null 显示为空,不会把普通输入的空字符串自动转成 null。支持弹出编辑的字段中,清空先修改草稿,确认后提交,取消则保留原值。 ```vue ``` ```ts const beforeChange = (next, done) => { canChange(next).then((allowed) => done(allowed)); }; ``` 守卫统一使用 `(payload, done, context)`:关闭 payload 为 `{ action }`,切换和提交为 `{ value, previousValue }`,Popup 为 `{ reason }`。context 提供 `signal` 和可选原始 `event`。返回 boolean/Promise,或调用 done()/done(false);同步 void 等待 done,Promise<void> 放行。首次完成生效。等待期间自动管理 loading/disabled,取消后旧结果失效,不暴露内部按钮 refs。 ### 守卫等待反馈 before-* 等待期间显示加载反馈并标记 aria-busy;拒绝或失败后恢复,重复提交不再启动同一操作。普通事件返回的 Promise 不参与加载。 --- Document: llms/zh-CN/components/table-column-manager.md # TableColumnManager 表格列管理 双栏列管理内容组件:左侧搜索勾选,右侧拖拽排序 / 冻结 / 删除。 - 默认自带抽屉容器(`v-model:open`),确认后通过 `confirm` 事件回写 `columns`。 - 传入 `inline` 可只渲染内联面板,用于放入自定义弹窗 / 容器。 - 与 Table **解耦**:Table 只提供 `v-model:columns`、`extra-column`、`#header-cell-actions` 等扩展点;列管理 UI / 算法由外部组合。 ## 基础示例 ### 基础用法 组件自身渲染抽屉;弹窗场景使用 `inline` 内联面板放入 `c-dialog`。 Example source: src/table-column-manager/__demos__/basic.vue ```vue ``` ## Table 组合与持久化 ### 与 Table 组合:不分组 #### 本组配置对照 | 配置 | 作用 | 相关示例 | | --- | --- | --- | | `open` | 抽屉是否可见(`v-model:open`) | 按钮切换抽屉 / 弹窗 | | `columns` | 当前表格列,确认时拼回完整列定义 | 按钮切换抽屉 / 弹窗 | | `options` | 左侧列定义 | 按钮切换抽屉 / 弹窗 | | `drawer-title` | 抽屉标题 | 按钮切换抽屉 / 弹窗 | | `inline` | 是否只渲染内联面板(不渲染抽屉) | 按钮切换抽屉 / 弹窗 | 普通数组形式的 `columnDefinitions`,覆盖必选列、左右冻结、列宽调整、插槽、重命名和表头快捷操作。 Example source: src/table-column-manager/__demos__/with-table-ungrouped.vue ```vue