## ADDED Requirements ### Requirement: 统一弹窗组件提供底部弹出式容器 系统 SHALL 提供统一的弹窗组件 `PopupContainer`,支持底部弹出式布局,用于展示表单、列表、详情等内容。 #### Scenario: 基础弹窗展示 - **WHEN** 用户触发弹窗打开 - **THEN** 系统显示底部弹出的弹窗容器,带有圆角和关闭按钮 - **THEN** 弹窗高度可配置(默认 80%) #### Scenario: 弹窗头部固定内容可滚动 - **WHEN** 弹窗内容超出可视区域 - **THEN** 弹窗头部保持固定,内容区域可滚动 - **THEN** 底部页脚(如有)保持固定不可滚动 ### Requirement: 统一弹窗组件支持标题和副标题 系统 SHALL 允许配置弹窗的标题和副标题,副标题用于显示统计信息或辅助说明。 #### Scenario: 显示标题和副标题 - **WHEN** 弹窗配置了标题和副标题 - **THEN** 标题显示在弹窗头部,字体大小 16px,加粗 - **THEN** 副标题显示在标题下方,字体大小 14px,居中显示 #### Scenario: 无副标题时的头部布局 - **WHEN** 弹窗只配置了标题,未配置副标题 - **THEN** 标题居中显示 - **THEN** 如果有操作按钮,操作按钮显示在标题右侧 ### Requirement: 统一弹窗组件支持头部操作按钮插槽 系统 SHALL 提供 `header-actions` 插槽,允许在弹窗头部插入自定义操作按钮。 #### Scenario: 插入头部操作按钮 - **WHEN** 父组件使用 `header-actions` 插槽 - **THEN** 操作按钮显示在弹窗头部的合适位置(有副标题时在右侧,无副标题时与标题同行右侧) ### Requirement: 统一弹窗组件支持底部固定页脚 系统 SHALL 提供固定底部的页脚区域,用于放置确认、取消等操作按钮。 #### Scenario: 显示底部页脚 - **WHEN** 父组件使用 `footer` 插槽 - **THEN** 页脚固定显示在弹窗底部,内容区域可滚动 - **THEN** 页脚区域有上边框分隔,背景色与头部一致 ### Requirement: 统一弹窗组件支持双向绑定 系统 SHALL 使用 `v-model:show` 或 `v-model` 控制弹窗的显示/隐藏状态。 #### Scenario: 通过 v-model 控制弹窗显示 - **WHEN** 父组件修改 v-model 绑定的值为 true - **THEN** 弹窗打开并显示内容 - **WHEN** 用户点击关闭按钮或弹窗外部区域 - **THEN** 弹窗关闭,v-model 绑定的值更新为 false ### Requirement: 统一弹窗组件支持关闭按钮配置 系统 SHALL 允许通过 `closeable` prop 配置是否显示关闭按钮。 #### Scenario: 禁用关闭按钮 - **WHEN** closeable 设置为 false - **THEN** 弹窗不显示关闭按钮 - **THEN** 用户只能通过 v-model 关闭弹窗或点击弹窗外部区域 ### Requirement: 统一弹窗组件支持点击外部关闭 系统 SHALL 支持点击弹窗外部区域关闭弹窗(继承自 Vant UI 的 van-popup)。 #### Scenario: 点击外部区域关闭 - **WHEN** 用户点击弹窗外部区域 - **THEN** 弹窗关闭,v-model 绑定的值更新为 false ### Requirement: 统一弹窗组件支持表单验证场景 系统 SHALL 支持在弹窗内容区域放置表单,并提供表单验证功能。 #### Scenario: 表单弹窗提交 - **WHEN** 用户填写表单并点击页脚的提交按钮 - **THEN** 父组件可以访问表单数据进行验证和提交 - **THEN** 验证失败时,弹窗保持打开状态 ### Requirement: 统一弹窗组件使用 Vant UI 主题变量 系统 SHALL 使用 Vant UI 的 CSS 变量(如 `--van-text-color`、`--van-border-color`、`--van-background` 等)保持与现有设计系统一致。 #### Scenario: 主题适配 - **WHEN** 应用切换主题(深色/浅色) - **THEN** 弹窗组件自动适配主题颜色 ### Requirement: 统一弹窗组件支持 teleport 到 body 系统 SHALL 将弹窗挂载到 `body` 元素,避免被父组件的样式或层级影响。 #### Scenario: 弹窗层级正确 - **WHEN** 弹窗在嵌套组件中打开 - **THEN** 弹窗正确显示在最顶层,不被父组件的 z-index 影响