# Card UI(高层规范) ## 1. 背景与目标 当前卡片页(Home/情绪卡片滑动页)右上角需要提供两个入口: - **切换主题**:在「风景」与「颜色」两种主题间切换 - **个人主页**:以弹窗形式打开个人主页(样式与主题弹窗一致的弹窗体系) 本需求聚焦 **UI 视觉统一** 与 **交互逻辑收敛**,让用户在卡片页可以快速切换主题、进入个人主页设置与通用入口。 ### 目标 - **右上角双按钮**:两个圆形图标按钮常驻卡片页右上角 - **主题弹窗**:可选择「风景 / 颜色」两种主题,并即时生效 - **个人主页弹窗**:点击进入个人主页弹窗(与主题弹窗同一套弹窗/遮罩/圆角规范) - **资源统一**:图标资源使用 `client/assets/images/home/`(`theme.svg`、`my.svg`) ### 非目标(本阶段不做) - 不引入复杂的主题系统(如多套配色、动态主题下载、远端配置等) - 不做账号体系/登录注册(个人主页弹窗仅作为本地个人中心入口与设置集合) - 不做完整的卡片滑动动效重构(仅限卡片页头部与相关弹窗/局部逻辑优化) ## 2. 范围与交付物 ### 范围 - 卡片页(Home)头部 UI:右上角两个圆形 icon 按钮 - 主题弹窗:展示两种主题选项(风景/颜色)并支持选择 - 个人主页弹窗:展示个人信息与快捷入口(以弹窗呈现) - 主题状态:本地持久化 + 启动后读取 + 在卡片页即时反映 ### 交付物 - 卡片页头部 UI 更新(两按钮替换/补齐) - 主题弹窗与个人主页弹窗的 UI 与交互逻辑(共用弹窗规范) - 主题选择的本地存储 key 约定与读写逻辑 - (可选)补充 i18n key(按钮无文本,但弹窗标题/选项文案需多语言) ## 3. 视觉与交互需求 ### 3.1 右上角按钮(主题 / 我的) - **位置**:卡片页右上角,两个按钮水平排列,间距 8–12(按视觉微调) - **形状**:圆形按钮,背景为浅色圆底(与现有 UI 风格一致),点击区域需足够大(建议 `hitSlop >= 10`) - **图标**: - 主题:`client/assets/images/home/theme.svg` - 我的:`client/assets/images/home/my.svg` - **点击反馈**:按平台规范(透明度/水波纹)即可 ### 3.2 主题弹窗 - **打开方式**:点击右上角「主题」按钮打开 - **样式**:与现有弹窗体系一致(遮罩 + 圆角容器),可做底部弹窗或中间弹窗,需与设计稿一致 - **内容**: - 标题:主题 - 选项: - 风景(预览图/缩略图) - 颜色(预览图/缩略图) - 当前选中项需有明显高亮(描边/勾选/阴影等,按设计稿) - **交互**: - 点击选项即切换主题并立即生效 - 点击遮罩或关闭按钮关闭弹窗 ### 3.3 个人主页弹窗(我的) - **打开方式**:点击右上角「我的」按钮打开 - **样式**:与主题弹窗同一套弹窗规范(遮罩、圆角、关闭按钮/手势) - **内容建议(以现有设计为准)**: - 顶部区域:头像/插画 + 用户昵称(本地默认名或 onboarding 的 name) - 快捷卡片:我的喜欢、小组件(或其他产品定义入口) - 通用列表:每日提醒、隐私政策、使用条款、语言 - **交互**: - 列表项点击进入对应页面/二级弹窗(实现阶段在 plan/tasks 中细化) - 关闭方式同主题弹窗 ## 4. 主题逻辑与状态管理 ### 4.1 主题类型 - `scenery`:风景主题(以图片/风景背景为主) - `color`:颜色主题(以纯色/渐变色块为主) ### 4.2 持久化 Key(建议) - `ui.theme.mode`: `'scenery' | 'color'` ### 4.3 生效范围(建议) - 最低要求:卡片页背景/卡片背景/主题弹窗预览在切换后 **立即更新** - 可扩展:全局统一(如 Settings/我的页)在后续版本做全局 Theme Provider ## 5. 验收标准 - 卡片页右上角展示两个圆形图标按钮,点击热区合理 - 点击主题按钮: - 打开主题弹窗,显示「风景/颜色」两项 - 切换后立即生效并持久化,重新进入 App 仍保持上次选择 - 点击我的按钮: - 打开个人主页弹窗 - 弹窗样式(遮罩/圆角/关闭)与主题弹窗一致 - 图标资源从 `client/assets/images/home/` 加载,显示清晰无拉伸 ## 6. 风险与注意事项 - **SVG 兼容**:需要确认当前项目 SVG 渲染方案(如 `react-native-svg` / `expo` 方案),避免不同平台显示差异 - **路由与弹窗体系**:若使用 `expo-router` 的 `Stack` modal,需要统一交互(遮罩、圆角、返回手势)以匹配设计 - **多语言**:弹窗标题、列表项文案需走 i18n(`zh-CN/en/es/pt/zh-TW`)