Commit Graph

3 Commits

Author SHA1 Message Date
6fc8099b33 跨端: feat(日历): today 不许跨调用残留(常驻 pane 跨零点);扫描口径去注释+去字符串现在就定
pi 2026-09-14 骨架前最后两条。

1. **`today` 必须"显示时求值"**:顶层是「通信 / 日历 / 联系人」三个平级 pane,日历**常驻**,
   而 `today` 是唯一随时间变的输入。建页取一次 ⇒ 跨午夜后标记停在昨天,**判据全绿**
   (模型没错,是喂进去的值过期了)—— 与 `Calendar.ts` 防的"上次渲染残留"同一件事,
   只是残留在**调用侧**。
   · 纯逻辑侧判据(新增第 10 条):连续两次不同输入各自独立(不许跨调用残留)、
     推进一天后值必须变、**不传就不许有今天**(不许内部兜底取系统时间 —— 那正是"取一次"的写法);
   · 调用侧义务(pane 变可见时重算,不许只在 aboutToAppear)进余额:
     `calendar-today-recompute`(kind=scope),到期前提写明"骨架写完后立刻"。

2. **`code()` 去注释、不去字符串**:任何只是**提到**被禁写法的字符串会被自己判红。
   两条路("报错文案不引被禁模式" vs "只在表达式位置匹配")现在就定,选后者:
   先**整段去掉字符串字面量**再匹配 —— "提到"不再误红,"真的用它取日期键"照样红。
   副作用写在旁边(正则近似、非解析器;转义/跨行模板处理不干净 ⇒ 是采样不是完备性证明),
   并写明:**出现同族误红时不许"再改一次扫描口径"把判据往宽里挪**。
2026-09-14 17:44:52 +08:00
13e8671d03 跨端: feat(P6): 表头与网格共用同一个 startOfWeek;"今天"的调用侧入可跑判据;禁用 toISOString 取日期键
pi 2026-09-14 两条,都赶在页面骨架之前定下来。

1. **唯一分叉点必须同时喂两处**:整月网格有两个地方依赖"周从哪天开始" ——
   空格数(`leadingBlanks`)**与表头第一格**。表头若在页面里硬编码,就是**第二个分叉**:
   格子全对、**表头整体错一列**,而原有 6 条判据一条都不会红(它们只看网格)。
   新增 `weekdayLabels(startOfWeek)`(顺序只从这一个参数出)+ **交叉核对判据**:
   把"1 号落在第几列"与"那一列的表头字"对上(6 个月份 × 2 种起始)。

2. **"今天"的调用侧**:`today` 入参化让纯逻辑侧干净了,代价是**唯一还能错的地方搬到了调用侧**
   —— 而它正好是纯逻辑判据够不着的。`toISOString()` 是 UTC 口径:UTC+8 的清晨会给**昨天**,
   "今天"就标到上一格,且在本机跑 UTC 的环境里**永远测不出来**。
   新增 `isoOfLocal(now)`(本地年月日手工补零)+ `isoAtOffset(now, 分钟)`(与前者同源但不依赖进程时区,
   好让三种偏移**可以真跑**)。判据钉住:UTC+8 / UTC-7 / UTC 三种偏移的日期、
   **两种取法在 UTC+8 清晨必须不同**(把陷阱本身钉死)、以及本机两条取法自洽。

3. 附带一条**未来时**的判据:鸿蒙树里不许出现 `toISOString().slice(0,10)` 取日期键
   (登记值 0 ⇒ 页面骨架写错时立刻红,报错写"正确修法 = isoOfLocal"与"最常见的错误修法 = 改期望值")。
   它第一次跑就抓到了 `model/Calendar.ts` 里**解释这个陷阱的注释** —— 所以改扫 `code()`
   (去注释后的代码):规则管代码,注释是文档。
2026-09-14 17:43:09 +08:00
e94e4dcd39 跨端: feat(P6): 日历纯逻辑 model/Calendar.ts + 6 条可跑判据(第 1 步的逻辑那一半,不需要设备) 2026-09-14 17:41:43 +08:00