# 进度条动画配置文档

> 文件路径：`apps/miniprogram/miniprogram/pages/task-list/`

---

## 概览

进度条动画由两段独立动画组成，通过 `animation-delay` 精确衔接，形成「高光扫过 → 点燃火花」的连续叙事效果。

```
┌──────────────────┐  SHINE_SPARK_GAP  ┌──────────────────┐  SPARK_SHINE_GAP  ┌──────────────────┐
│   高光从左扫到右   │ ────────────────▶ │   火花爆发消散    │ ────────────────▶ │   高光（下一循环）  │
│   SHINE_DUR(s)   │                   │   SPARK_DUR(s)   │                   │                  │
└──────────────────┘                   └──────────────────┘                   └──────────────────┘
```

**核心机制**：两段动画共享同一 `animation-duration`（totalDur），火花通过负值 `animation-delay` 在循环内偏移到正确时刻。`@keyframes` 只描述各自行为，**修改时间轴参数永远不需要改 CSS 百分比**。

---

## 第一层：时间轴参数

**位置**：`task-list.ts` 文件顶部常量区

```ts
const SHINE_DUR       = 1.6   // 秒
const SPARK_DUR       = 1.4   // 秒
const SHINE_SPARK_GAP = -200  // 毫秒
const SPARK_SHINE_GAP = 400   // 毫秒
```

| 参数 | 类型 | 说明 |
|------|------|------|
| `SHINE_DUR` | 秒（正数） | 高光从进度条**左端**扫到**右端**的时长。值越小扫得越快。 |
| `SPARK_DUR` | 秒（正数） | 火花从**爆发**到**完全消散**的时长。值越大火花飞得越慢。 |
| `SHINE_SPARK_GAP` | 毫秒（正/负） | 高光结束 → 火花开始的偏移。**正数** = 高光结束后停顿再爆发；**负数** = 高光尚未结束，火花提前爆发（产生重叠的点燃感）。 |
| `SPARK_SHINE_GAP` | 毫秒（正/负） | 火花消散后 → 下次高光从左端启动的延迟。**正数** = 停顿一段时间后重新开始；**负数** = 火花尚未消散，高光已从左端出发（自然流畅衔接）。 |

> ✅ **修改这四个常量后，不需要改任何 CSS**，totalDur 和 sparkDelayCss 由 `calcAnimTimeline()` 自动计算并注入 WXML style。

### 总循环时长计算公式

```
totalDur = SHINE_DUR + SHINE_SPARK_GAP/1000 + SPARK_DUR + SPARK_SHINE_GAP/1000
```

当前默认值：`1.6 + (-0.2) + 1.4 + 0.4 = 3.2 秒`

---

## 第二层：高光外观

**位置**：`task-list.wxss` → `.tier-shine` 选择器顶部

```css
.tier-shine {
  --shine-width:   50%;           /* 光束宽度 */
  --shine-opacity: 1.0;           /* 峰值亮度 */
  --shine-color:   255, 255, 255; /* RGB 颜色 */
}
```

| 变量 | 默认值 | 说明 |
|------|--------|------|
| `--shine-width` | `50%` | 光束宽度，相对于进度条填充区域。越大光晕越宽，`30%` 偏细锐，`80%` 偏宽柔。 |
| `--shine-opacity` | `1.0` | 光束中心峰值亮度，范围 `0~1`。`0.5` = 半透明柔光，`1.0` = 最亮。 |
| `--shine-color` | `255, 255, 255` | 光束颜色，RGB 三通道逗号分隔。`255,220,100` = 暖黄；`255,180,80` = 橙；`200,230,255` = 冷白蓝。 |

---

## 第三层：火花外观

**位置**：`task-list.wxss` → `.tier-edge-glow` 选择器顶部

```css
.tier-edge-glow {
  --spark-scale:  0.7;    /* 整体缩放 */
  --spark-pole-h: 30rpx;  /* 光柱高度 */
}
```

| 变量 | 默认值 | 说明 |
|------|--------|------|
| `--spark-scale` | `0.7` | **整体缩放比**，同时等比缩放：光柱尺寸 + 全部粒子大小 + 飞射距离。`0.5` = 缩小一半，`1.0` = 原始大小，`2.0` = 放大一倍。 |
| `--spark-pole-h` | `30rpx` | 光柱（白色竖线）高度，宽度自动 = 高度 / 2。调大使光柱更醒目。 |

---

## 火花粒子参数

6 粒火花固定写在 `task-list.wxss`，各自方向/颜色/大小不同。如需微调单个粒子，直接修改对应的 `.spark-N` 和 `@keyframes sparkN`。

| 粒子 | 颜色 | 方向 | 大小 | 爆发时刻 |
|------|------|------|------|----------|
| `spark-1` | 亮白 `#ffffff` | 右上 | 10×10rpx | 8%（较早）|
| `spark-2` | 橙色 `#fb923c` | 右下 | 12×12rpx | 12% |
| `spark-3` | 黄色 `#fde68a` | 正上 | 8×8rpx | 6%（最早）|
| `spark-4` | 红橙 `#ef4444` | 右斜上（带旋转） | 16×6rpx | 10% |
| `spark-5` | 黄白 `#fbbf24` | 正右 | 10×10rpx | 5%（最早）|
| `spark-6` | 淡橙 `#fed7aa` | 右下斜 | 14×14rpx | 15%（最晚）|

> 爆发时刻百分比 = 粒子自身 `@keyframes` 内的时刻，与总循环时长无关。

---

## 进度末端位置逻辑

火花始终显示在进度条末端，位置由 `perfData.clampedSparkPct` 控制：

```ts
clampedSparkPct = Math.max(0, Math.min(100, filledPct))
```

| 场景 | 火星位置 |
|------|----------|
| 0h（未开始） | 进度条**最左端**（0%）|
| 任意进行中 | 对应进度处 |
| 220h（满档） | 进度条**最右端**（100%）|

---

## 快速调参示例

### 想要「高光快、火花慢」
```ts
const SHINE_DUR       = 0.8   // 高光加速
const SPARK_DUR       = 2.0   // 火花放慢
const SHINE_SPARK_GAP = 0     // 高光结束立即爆发
const SPARK_SHINE_GAP = 600   // 火花消散后停顿
```

### 想要「高光和火花完全重叠」
```ts
const SHINE_DUR       = 1.6
const SPARK_DUR       = 1.4
const SHINE_SPARK_GAP = -800  // 高光还差 0.8s 结束时，火花就开始了
const SPARK_SHINE_GAP = -600  // 火花还差 0.6s 消散时，高光已从左端出发
```

### 想要「更大更明显的火花」
```css
/* task-list.wxss → .tier-edge-glow */
--spark-scale:  1.4;    /* 放大到原来的 2 倍 */
--spark-pole-h: 50rpx;  /* 光柱更高 */
```
