diff --git a/index.html b/index.html
index 7f5396e..b67ad55 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
diff --git a/js/app.js b/js/app.js
index 5e64c11..e0f691e 100644
--- a/js/app.js
+++ b/js/app.js
@@ -3,7 +3,7 @@
(function () {
'use strict';
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
- var VER = '26100198';
+ var VER = '26100199';
const $ = (s, c) => (c || document).querySelector(s);
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
@@ -3340,6 +3340,26 @@
const oid = () => hashParam('openid');
const list = () => (data && data.list) || [];
+ /* ---------- 每周话题(2026-10-02 用户:「一周一个主题,要么大家也不知道说什么」)----------
+ 一条 = 从 from(北京时间那周的周一)起生效,直到下一条的 from;所以表里永远取「from ≤ 今天」的最后一条,
+ 没配新话题时沿用上一周的,不会空着。换话题 = 往表尾追加一条。
+ 后端将来若在 /whisper 返回 theme(同结构),以后端为准。
+ presets 只是「不知道说什么?点一句」的示范句,发出去时不在服务端预设库里 → 照常走微信内容安全审核。 */
+ const WH_THEMES = [
+ { from: '2026-09-28', name: '对宝宝说的话',
+ tip: '把想对 TA 说的话,悄悄放进星空',
+ say: '对宝宝说一句悄悄话', ph: '宝宝,妈妈想对你说……',
+ presets: ['宝宝,妈妈每天都在数着日子等你', '你踢我的时候,是在跟妈妈打招呼吗', '不管你长什么样,妈妈都一样爱你',
+ '慢慢长,不着急,妈妈在这儿等你', '等你出来,带你去看海', '爸爸天天对着肚子讲话,你听到了吗'] },
+ ];
+ function theme() {
+ if (data && data.theme && data.theme.name) return data.theme;
+ const d = new Date(Date.now() + 8 * 3600e3).toISOString().slice(0, 10);
+ let t = null;
+ WH_THEMES.forEach(x => { if (x.from <= d) t = x; });
+ return t;
+ }
+
/* ---------- 首页入口:一句轮播 ---------- */
function roll() {
const l = list().filter(x => !x.mine);
@@ -3354,10 +3374,13 @@
/* 用户:「同孕周悄悄话改成 30 周孕妈悄悄话」—— 周数跟着她自己的孕周走 */
const nm = data && data.week ? data.week + '周孕妈悄悄话' : '孕妈悄悄话';
$('#weName').textContent = nm;
- entry.setAttribute('aria-label', '打开' + nm);
+ const th = theme();
+ $('#weTopic').textContent = th ? th.name : '';
+ entry.classList.toggle('has-topic', !!th);
+ entry.setAttribute('aria-label', '打开' + nm + (th ? ',本周话题:' + th.name : ''));
$('#weRoll').textContent = l.length ? '“' + l[0].text + '”' : '';
ri = 0;
- $('#weGo').innerHTML = '去看看
';
+ $('#weGo').innerHTML = (th ? '去说一句' : '去看看') + '
';
clearInterval(rollT);
if (l.length > 1) rollT = setInterval(() => { if (!document.hidden && !page.classList.contains('show')) roll(); }, 4000);
}
@@ -3645,6 +3668,9 @@
$('#whpTag').textContent = data ? '孕 ' + data.week + ' 周 · 前后一周的妈妈' : '';
/* 2026-10-02 用户:「每个星星都是孕妈的一句话,类似这个感觉,替换掉今晚多少句悄悄话」→ 标题不再报条数 */
$('#wskTitle').innerHTML = '
每一颗星星,
都是一位孕妈的一句话
' + (night ? '今晚' : '今天') + ',她们和你一样在等宝宝来
';
+ const th = theme();
+ if (th) $('#wskTitle').insertAdjacentHTML('beforeend', '
本周话题' + esc(th.name) + '' + esc(th.tip || '') + '
');
+ $('#whSay').firstElementChild.textContent = th && th.say ? th.say : '说一句悄悄话';
paintDeco();
paintSky(l);
paintList(l);
@@ -3766,7 +3792,12 @@
ta.value = '';
ta.maxLength = data.maxLen || 40;
cnt();
- $('#whPresets').innerHTML = (data.presets || []).map(t => '
').join('');
+ const th = theme();
+ $('#whMTitle').textContent = th && th.say ? th.say : '说一句悄悄话';
+ $('#whMTopic').textContent = th ? '本周话题:' + th.name : '';
+ $('#whMTopic').style.display = th ? '' : 'none';
+ ta.placeholder = th && th.ph ? th.ph : '今天想对谁说点什么?';
+ $('#whPresets').innerHTML = ((th && th.presets && th.presets.length) ? th.presets : (data.presets || [])).map(t => '
').join('');
$('#whLeft').textContent = '今天还能说 ' + data.left + ' 句';
openModal('modalWhisper');
});
diff --git a/mama-box.css b/mama-box.css
index e3bcfdf..87a823b 100644
--- a/mama-box.css
+++ b/mama-box.css
@@ -4204,3 +4204,23 @@ a.skip:focus{left:16px;top:16px}
@media (prefers-reduced-motion:reduce){#tabLetter.has-new .t-ico{animation:none}}
/* 档案的小脚丫:脚趾圆点在脚掌外面,选中时不反白、跟主体同色 */
.tab[data-tab="archive"].is-active .t-svg .td{fill:currentColor}
+
+/* ================= 悄悄话 · 每周话题(2026-10-02)=================
+ 首页入口三行:小字「30周孕妈悄悄话」/ 本周话题(金色小签 + 话题名)/ 一句轮播;右边「去说一句」。
+ 全屏页标题下一张话题签;「说一句」弹窗顶上一行话题。话题表在 app.js WH_THEMES。 */
+.we-topic{display:none;align-items:center;gap:6px;min-width:0}
+.wh-entry.has-topic .we-topic{display:flex}
+.we-topic em{flex:none;font-style:normal;font-size:10px;font-weight:800;letter-spacing:.5px;color:#4A2E1E;
+ background:linear-gradient(120deg,#FFE2B8,#FFB98F);padding:1px 6px;border-radius:5px;line-height:15px}
+.we-topic strong{font-size:15px;font-weight:900;letter-spacing:.5px;color:#FFE7C7;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
+.wh-entry.has-topic .we-txt{gap:3px}
+.wh-entry.has-topic .we-roll{font-size:12.5px;font-weight:500;color:rgba(255,244,232,.78)}
+.wh-entry.has-topic .we-go{color:#FFE2B8;font-weight:700}
+
+.wsk-topic{display:inline-flex;flex-wrap:wrap;align-items:center;justify-content:flex-start;gap:4px 8px;margin-top:12px;padding:8px 14px;
+ border-radius:14px;background:rgba(255,255,255,.08);box-shadow:inset 0 0 0 1px rgba(255,226,184,.25)}
+.wsk-topic em{font-style:normal;font-size:11px;font-weight:800;color:#4A2E1E;background:linear-gradient(120deg,#FFE2B8,#FFB98F);padding:1px 7px;border-radius:6px}
+.wsk-topic b{font-size:16px;font-weight:900;color:#FFE7C7;letter-spacing:1px}
+.wsk-topic span{flex-basis:100%;font-size:12px;color:rgba(255,255,255,.6);letter-spacing:.5px}
+
+.wh-m-topic{margin:0 0 6px;font-size:13px;font-weight:800;color:#C2667A}