# 方案1 深色版本 双端参考说明（优先弹窗定稿）

## 1. 核心流程

| 阶段 | 规则 |
| --- | --- |
| 点击“是” | 立即触发较强震感；本次经期范围内格子先变白 white_A，并在选中开始日显示黄色开始 icon；随后弹出记经期必填弹窗。此时不开始血流动画。 |
| 弹窗确定 | 展开下方当天记录列表，同时开始播放日历血流动画。 |
| 弹窗取消/点击“否” | 不记录、不播放血流、不触发额外强震感，恢复未记录态。 |
| 血流播放中 | 日历表格禁用，不能切换其他日期；下方当天记录列表可操作。 |
| 血流完成 | 弹出分析弹泡；分析弹泡出现后，本次记录完成，恢复日期选择和操作。 |

## 2. 颜色规则

| 对象 | 规则 |
| --- | --- |
| 白底中间态 | 点击“是”后、必填弹窗弹出前，本次经期范围内格子变白 white_A，并显示黄色开始 icon。 |
| 历史日/今天文字 | #FF4D88。 |
| 未来日文字 | #FFCADB。 |
| 血液液面 | #FF4D88。 |
| 文字反白 | 血液覆盖文字时覆盖部分变白，未覆盖部分保持原粉色。 |
| 最终定格-历史日/今天 | 格子 #FF4D88，文字 #FFFFFF。 |
| 最终定格-未来日 | 格子 #FFD6E4，文字 #FFFFFF。 |

## 3. 血量比例

不提供 1 天模型。2-7 天按对应比例播放；8 天以上前 7 天逐格播放，第 8 天及以后统一 5% 液面反馈，最后一起冲满 100%。跨月经期按整段真实周期计算，不按当前日历视图截断。

| 天数 | 比例 |
| --- | --- |
| 2 | [60, 100] |
| 3 | [60, 90, 40] |
| 4 | [50, 90, 60, 30] |
| 5 | [40, 80, 60, 30, 20] |
| 6 | [35, 80, 65, 40, 22, 12] |
| 7 | [30, 60, 85, 65, 40, 24, 15] |
| 8+ | [30, 60, 85, 65, 40, 24, 15, 5, 5, 5...] |

## 4. 动效参数

| 参数 | 值 |
| --- | --- |
| 单格时长 | duration = 125 + level * 5.3 |
| 100% 单格参考 | 655ms |
| 白底中间态停留 | 115ms |
| 重叠比例 | 0.35 |
| 最小启动间隔 | 118ms |
| 统一冲满等待 | 170ms |
| 统一冲满时长 | 360ms |
| 目标总时长 | 5 天约 1.9s；15 天约 2.4s；整体不超过 2.5s |

## 5. 震感

点击“是”需要较强震感。iOS 建议使用 UIImpactFeedbackGenerator(style: .heavy)，Android 使用系统允许的强震感能力。点击“否”或取消不触发额外强震感；iOS 可保留系统控件默认反馈，Android 不调用震动。

## 6. 打断与降级

血流播放中，日历表格禁用，下方当天记录列表可操作。若页面触发不可见中断，例如切换 tab、进入二级页、退后台、锁屏等，不续播半截动画；回来后按接口最终结果展示成功最终态或失败回滚态。低性能或 Reduce Motion 可降级关闭水波纹，保留高度、文字反白和最终定格。
