diff --git a/js/app.js b/js/app.js
index 77fecad..66f5ef4 100644
--- a/js/app.js
+++ b/js/app.js
@@ -3,7 +3,7 @@
(function () {
'use strict';
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
- var VER = '26092207';
+ var VER = '26092210';
const $ = (s, c) => (c || document).querySelector(s);
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
@@ -45,10 +45,12 @@
/* ---------- 全局状态 ---------- */
const state = {
screen: 'home',
- kickToday: 3,
+ kickToday: 0, /* ⚠️ 原为演示值 3:访客态/接口失败时它会直接落到首页数胎动卡上,
+ 现已改 0 且 HTML 默认渲染 '--'(真实值由 __applyRecords 写) */
kickQuick: 1,
todayCount: 4,
- favCount: 18,
+ favCount: 0, /* ⚠️ 原为演示值 18(与屏幕上的星标数不符);
+ 启动时按 DOM 里 .star.is-on 的实际个数回填,见「珍贵时刻收藏」那段 */
resCat: 'all',
resKey: 'book',
resFav: [], // 已收藏的资源 key,数组顺序即收藏顺序
@@ -505,6 +507,12 @@
});
/* ================= 珍贵时刻收藏 ================= */
+ /* ⚠️ 计数不能写死(原来 #favCount=18、state.favCount=18,而屏幕上点亮的星标只有 6 个,
+ 数字与内容对不上)。启动时按 DOM 里 `.star.is-on` 的**实际个数**回填,
+ 点星标时再 ±1 —— 这样标签上的数永远等于卡上看得见的收藏。
+ (档案页不是首屏,用户看不到"先 0 再回填"的中间态。) */
+ state.favCount = $$('.star.is-on').length;
+ (function () { const fc = $('#favCount'); if (fc) fc.textContent = state.favCount; })();
$$('.star').forEach(st => st.addEventListener('click', e => {
e.stopPropagation();
const on = st.classList.toggle('is-on');
@@ -1006,6 +1014,15 @@
}
/* 把 state 里的孕期信息刷到「我的」孕期卡 + 首页头部 + 档案页顶部 */
+ /* 成长数据面板的空态开关(CSS 见 mama-box.css 的 .data-empty 段):
+ 未建档 / 产后 = 面板里那些数字(58.2kg、日均胎动 31 次、双顶径 6.1cm、体重曲线)
+ **一个都没有接口数据源**,对这类用户是纯假数据 → 整块隐藏改显示引导。
+ ⚠️ 有真实孕周的用户仍看演示值:这是与「AI 小结演示文案」同一批的遗留,
+ 要一起清得先有数据源,别只在这里删。 */
+ function setGrowthDataEmpty(on) {
+ const p = $('.seg-panel[data-panel="data"]');
+ if (p) p.classList.toggle('is-empty', !!on);
+ }
function syncPregnancy() {
/* ---- 产后态:宝宝已出生 → 一律不显示孕周数字(2026-09-22) ----
⚠️ 必须放在 pregEmpty 之前:产后返回体的 week 也是 null,
@@ -1060,6 +1077,12 @@
const gwt = $('#genWeekTag'); if (gwt) gwt.textContent = '产后';
$$('[data-ga]').forEach(n => { n.textContent = '--'; });
$$('[data-wk]').forEach(n => { n.textContent = '--'; });
+ /* ⚠️ #calNext(首页「孕检日历」卡)**没有 data-wk / data-ga 钩子**,上面两条循环抓不到它。
+ 而 init 早已按内置默认(孕 27 周)把它写成「9月29日」这类演示日期,
+ 产后分支之后没人再改 → 会以假日期留在首页。这里显式归占位。
+ (2026-09-22 新用户实测:孕检日历 9月29日 / 孕期体重 58.2kg 两处漏网。) */
+ const _cnPost = $('#calNext'); if (_cnPost) _cnPost.textContent = '--';
+ setGrowthDataEmpty(true); /* 产后同样没有这些数据的来源,别留演示数字 */
syncBabyWords();
return;
}
@@ -1105,13 +1128,30 @@
不保留 HTML 里的演示默认值(孕27周/9月15日…) */
$$('[data-ga]').forEach(n => { n.textContent = '--'; });
$$('[data-wk]').forEach(n => { n.textContent = '--'; });
+ /* ⚠️ 上面注释里的「孕检日历」**并不被那两条循环覆盖**:#calNext 没有 data-wk / data-ga
+ 属性,选择器抓不到。而 init 早已按内置默认(孕 27 周)把它写成「9月29日」,
+ 且 applyRemoteProfile 在 pregEmpty 时提前 return —— 于是新用户首页上
+ 只剩这一个孕周派生的假日期(2026-09-22 实测)。这里显式归占位。 */
+ const _cn = $('#calNext'); if (_cn) _cn.textContent = '--';
+ setGrowthDataEmpty(true);
const _t = new Date();
$('#noteWhen').textContent = mdTxt(_t);
syncBabyWords();
- hideLetterCard();
+ /* ⚠️ 这里**不能** hideLetterCard()(2026-09-22 修「红点有、首页卡没有」):
+ 本分支(未建档)原来顺手把来信卡收起了,理由是「applyLaixinReminder 里也判 pregEmpty」
+ —— 那个理由**是错的**:applyLaixinReminder 明确故意不看 pregEmpty(见它的注释),
+ 来信卡与红点的唯一 owner 是 syncLaixinReminder → applyLaixinReminder。
+ 两边规则打架的后果是一个**竞态**:
+ · laixin 先回来(快)→ 红点亮 + 卡显示;
+ · /profile 后回来(它可能要先打上游用户中心,常见更慢)→ 走到这里 → 只把卡藏了。
+ 而 hideLetterCard() **不动 #tabBadge** → 最终「红点在、卡没有」,与「红点说有新信、
+ 卡里什么都没有」那类自相矛盾的屏完全一致(定时复现:profile 延迟 1.5s 必现;
+ 同时返回则正常。卡里的文案已经写好、只是被 .hide 盖住,正是「先显示后藏掉」的痕迹)。
+ 卡在 HTML 里**默认就是 .hide + .no-letter**,不需要谁来收;让它只由 laixin 结果决定。 */
return;
}
const week = state.week, day = state.day, name = state.babyName;
+ setGrowthDataEmpty(false); /* 有真实孕周了:恢复面板(数据源接入前仍是演示值,见函数注释) */
const _tl2 = document.querySelector('.today-line');
if (_tl2) _tl2.style.display = '';
const days = week * 7 + day; // 一起生活了多少天
@@ -2756,7 +2796,8 @@
state.due = null; state.week = null; state.day = null;
state.babyName = ''; state.userName = '';
syncPregnancy(); /* 占位 + 隐藏脚印时间轴 */
- /* 首页来信卡归 laixin(applyLaixinReminder 里也判 pregEmpty/无身份),这里直接收起 */
+ /* 首页来信卡归 laixin(红点与卡都由 syncLaixinReminder 一处落,见它的无 openid 早退分支),
+ 这里直接收起是**兜底**:访客态不该出现任何「你有新信」的暗示。 */
hideLetterCard();
return;
}
diff --git a/mama-box.css b/mama-box.css
index 5482971..8d02686 100644
--- a/mama-box.css
+++ b/mama-box.css
@@ -1021,6 +1021,13 @@ a.skip:focus{left:16px;top:16px}
.seg-panel.is-active{display:block;animation:fadeUp .38s var(--ease)}
@keyframes fadeUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
+/* 成长数据空态(未建档):.is-empty 由 syncPregnancy 的 pregEmpty 分支挂上。
+ 演示数字(体重 58.2kg / 日均胎动 31 次 / 双顶径 6.1cm / 体重曲线…)全部无接口数据源,
+ 对未建档用户是纯假数据,整块隐藏改显示引导;健康态下这层完全不参与,原型观感不变。 */
+.data-empty{display:none;font-size:13px;color:var(--ink-2);line-height:1.9;text-align:center;padding:26px 18px;background:#fff;border-radius:22px;box-shadow:var(--sh)}
+.seg-panel[data-panel="data"].is-empty .data-demo{display:none}
+.seg-panel[data-panel="data"].is-empty .data-empty{display:block}
+
/* 时光轴 */
.tl-card{background:#fff;border-radius:22px;padding:20px 18px 6px;box-shadow:var(--sh)}
.tl-item{position:relative;padding:0 0 24px 22px}