feat(首页卡): 5 张工具卡改读 box_app 封装的真实数据(接口优先、失败回退本地)(v26092213)

数据源:GET /api/mp/public/mama-box/tool-cards(box_app 封装数胎动平台的 app-cards,
H5 不直连上游、不持有 token)。此前这 5 张卡各自为政:数胎动读本地 records(mama-box 早就不自记
胎动,常年 0)、体重恒 `--`、孕检日历本地按预产期推算、数宫缩显本地孕周、胎儿估重静态文案。

- 新增 applyRemoteCards() / applyRemoteCardsFetch():按 `slot` 落 DOM
  (kick→#kickTodayHome、fweight/curve→.mc-sub、weight→#weightVal、cal→#calNext);
  上游字符串一律 textContent,**绝不用 innerHTML**(同 footprint 的写法)。
- 优先级 = **接口优先、失败回退本地**。两个来源并行返回、先后不定,所以用 cardsOwned 旗子定序,
  而不是赌顺序:#kickTodayHome 让位给卡片接口;#calNext 让位(卡片接口与孕检日历应用同一套排期,
  还支持"改过预约日以预约日为准");curve 卡写值后**摘掉 data-wk**,否则 syncStaticDates 的
  [data-wk] 循环会把它覆盖回孕周。
- 卡片点击与名称仍以 App 表为准(MINI_APP_MAP + APP_BY_ID,AGENTS §4.4);接口的 appId/path 仅诊断
  (上游 app_id 是 URL slug,与 identifier 刻意不同)。
- 版式:固定高度 bento 只留一个状态位 → `.bento .mc-sub` 单行省略;数宫缩那列文本宽仅 ≈73px,
  有数据时改显紧凑 value(「4分12秒」,否则上游 text「最近间隔 4分12秒」会被省略掉数字);
  孕检日历放宽到两行(过期未记时上游给「待补记 9月26日」,一行会把日期省掉)。
- 新增 `.mc-extra`:只有 kick / weight 两张有富余竖空间,用来放上游 sub
  (「2 段 · 最近 13:00」/「较孕前 +11.7 kg · 9月22日」);fweight/cal/curve 是固定高度、放不下第二行,
  注释写明要加得先重排 .bento 那笔高度账(158+10+64=232)。
- warn → `.is-warn` 标红(新增 --alert token):胎动偏低 / 宫缩达临产阈值 / 产检过期未记。
- 体重卡:有值时写 value + 小字 unit(不会出现「-- kg」),无值保持中性 `--`。

本地验证(无头浏览器 + 桩后端):接口成功 → kick=12(覆盖本地 records 的 3)、weight=58.7kg +
「较孕前…」、cal=9月26日、curve=4分12秒、kick 标红、无 JS 异常;接口 ok=false → 全部回退本地
(kick=3 / weight=-- / curve 恢复 data-wk),页面不变空。
This commit is contained in:
2026-09-22 23:01:51 +08:00
parent 06f76b4df4
commit d1fff2c248
3 changed files with 139 additions and 12 deletions

View File

@@ -14,6 +14,7 @@
--muted:#72665E;
--line:#EFE7E1;
--green:#6E9A56;
--alert:#D2402A; /* 卡片 warn 标红(胎动偏低/宫缩达阈值/产检过期) */
--purple:#8B6FE0;
--blue:#4E85C7;
/* ---- 「妈妈」这个身份的颜色 ----
@@ -541,6 +542,26 @@ a.skip:focus{left:16px;top:16px}
.mc-art.big{position:static;width:74px;display:block;margin:2px auto 6px}
.mc-big{font-size:22px;font-weight:800;margin-top:2px}
.mc-big small{font-size:13px;font-weight:700}
/* 卡片第二行(上游 sub 的落点):只有 kick / weight 两张卡有富余空间 —— 其余三张是
固定高度(fweight 64 / cal 88 / curve 80)且列很窄(≈73px 文本宽),放不下第二行;
要显示它们的 sub,得先重排 .bento 那笔高度账(158+10+64=232),别硬塞。
:empty 时整行不占位,所以没数据时卡面与改动前完全一致。 */
/* 工具卡的状态行:固定高度 bento 只留了**一个**状态位,而上游的 text 可能比卡宽
(数宫缩卡那列文本宽只有 ≈73px,上游给「最近间隔 4分12秒」)→ 一律单行省略,别撑破卡面。
⚠️ 只作用于 .bento 里的卡,别外溢到页面其它 .mc-sub。 */
.bento .mc-sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.35}
/* 孕检日历卡略高(88px,扣掉内边距与标题还剩 ≈36px),允许两行 ——
上游过期未记时给「待补记 · 9月26日」,一行放不下会把日期省略掉,那就丢了关键信息。 */
.mini-card.cal .mc-sub{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.mc-extra{font-size:11px;color:var(--muted);margin-top:3px;line-height:1.35;
display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.mc-extra:empty{display:none}
/* 上游 warn(胎动偏低 / 宫缩达到临产阈值 / 产检已过期未记):数字与文案一起标红。
颜色另起 --alert,不复用 --brand-dk:品牌深橘在这套暖底上读起来只是"强调",不像告警。 */
.mini-card.is-warn .mc-sub,.mini-card.is-warn .mc-sub b,
.mini-card.is-warn .mc-big,.mini-card.is-warn .mc-big small,
.mini-card.is-warn .mc-extra{color:var(--alert)}
/* 四张工具卡的渐变跨度收窄到原来的一半左右:
渐变落差太大时整块颜色被拉花,模块边界反而看不清 */
.mini-card.kick{background:linear-gradient(150deg,#FFE2D6,#FFD7CA);height:158px}