悄悄话改为广场信息流置顶笔记(首页不放);?wh=1 直接盖上星空页、关掉回广场;v26110608

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
deploy
2026-11-07 01:52:11 +00:00
parent 884732c0a9
commit aee7371535
7 changed files with 98 additions and 97 deletions

View File

@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) -->
<script src="../js/login-gate.js?v=26110607"></script>
<script src="../js/login-gate.js?v=26110608"></script>
<script src="../js/ugc.js?v=26110464" data-guard></script>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
@@ -66,31 +66,30 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
.qf{position:relative;display:block;width:calc(100% - 24px);height:148px;margin:2px 12px 0;border-radius:20px;overflow:hidden;text-align:left;
background:radial-gradient(120% 140% at 82% 100%,#3B3A86 0%,#252A63 38%,#161B3F 75%);box-shadow:0 12px 26px -14px rgba(30,30,90,.7)}
.qf:active{transform:scale(.985)}
/* 11-07 孕妈悄悄话条(祈福树横幅下面):和首页广场模块底部那条同款夜空细条;点了回首页直接打开星空页(首页 ?wh=1) */
.whs{position:relative;display:flex;align-items:center;gap:10px;width:calc(100% - 24px);margin:10px 12px 0;padding:10px 12px 10px 10px;border:0;border-radius:16px;overflow:hidden;text-align:left;font:inherit;color:#fff;
background:linear-gradient(100deg,#2A2550 0%,#3E2F5E 60%,#53365F 100%);box-shadow:0 6px 16px -8px rgba(52,36,92,.55)}
.whs:active{transform:scale(.985)}
.whs-sky{position:absolute;inset:0;pointer-events:none;overflow:hidden}
.whs-sky i{position:absolute;width:5px;height:5px;margin:-2.5px 0 0 -2.5px;opacity:.85;filter:drop-shadow(0 0 1.5px rgba(255,255,255,.6));
background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M10 .5C10.9 7.4 12.6 9.1 19.5 10 12.6 10.9 10.9 12.6 10 19.5 9.1 12.6 7.4 10.9.5 10 7.4 9.1 9.1 7.4 10 .5Z' fill='%23FFFFFF'/%3E%3C/svg%3E") center/contain no-repeat;animation:whsTw 2.6s ease-in-out infinite}
@keyframes whsTw{0%,100%{opacity:.9;transform:scale(1)}50%{opacity:.2;transform:scale(.55)}}
.whs-mt{position:absolute;top:-4px;left:62%;width:96px;height:2px;border-radius:2px;opacity:0;transform-origin:0 50%;
background:linear-gradient(90deg,#fff,rgba(255,255,255,.75) 30%,rgba(255,255,255,0));box-shadow:0 0 8px 1px rgba(255,255,255,.8);animation:whsMt 7s linear infinite 1.5s}
.whs-mt.m2{left:92%;width:70px;animation-duration:11s;animation-delay:5.2s}
@keyframes whsMt{0%{opacity:0;transform:translate(0,0) rotate(-24deg)}1.5%{opacity:1}9%{opacity:0;transform:translate(-150px,68px) rotate(-24deg)}100%{opacity:0;transform:translate(-150px,68px) rotate(-24deg)}}
@media (prefers-reduced-motion:reduce){.whs-sky i,.whs-mt{animation:none}}
.whs-ico,.whs-tx,.whs-go{position:relative;z-index:1}
.whs-ico{flex:none;display:grid;place-items:center;width:32px;height:32px;border-radius:10px;background:rgba(255,255,255,.12);color:#FFD9A8}
.whs-ico svg{width:18px;height:18px}
.whs-tx{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.whs-tx small{font-size:11px;font-weight:600;letter-spacing:1px;color:rgba(255,255,255,.6)}
.whs-tp{display:flex;align-items:center;gap:6px;min-width:0}
.whs-tp 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}
.whs-tp b{font-size:15px;font-weight:900;letter-spacing:.5px;color:#FFE7C7;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.whs-rl{font-size:12.5px;font-weight:500;color:rgba(255,244,232,.78);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:opacity .26s,transform .26s}
.whs-rl.out{opacity:0;transform:translateY(5px)}
.whs-go{flex:none;display:flex;align-items:center;gap:2px;font-size:12px;font-weight:700;color:#FFE2B8}
.whs-go .ic{width:13px;height:13px}
/* 11-07 置顶笔记「孕妈悄悄话」(用户:首页不放,在广场内容里发一条置顶笔记,点了进星空页):
右列第一张,样子是一张笔记卡 —— 封面换成夜空(星星一闪一闪 + 偶尔一道流星)+ 本周话题大字 + 一句轮播的悄悄话 */
.nc.pin .pcv{position:relative;height:calc(var(--cw, 175px) * 1.25);overflow:hidden;color:#fff;
background:radial-gradient(120% 70% at 85% 0%,#5A3B72 0%,transparent 60%),radial-gradient(90% 60% at 0% 100%,#4A2C55 0%,transparent 70%),linear-gradient(180deg,#191634 0%,#241D44 55%,#2F2148 100%)}
.pcv .psk{position:absolute;inset:0;pointer-events:none}
.pcv .psk i{position:absolute;width:6px;height:6px;margin:-3px 0 0 -3px;opacity:.85;filter:drop-shadow(0 0 2px rgba(255,255,255,.7));
background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M10 .5C10.9 7.4 12.6 9.1 19.5 10 12.6 10.9 10.9 12.6 10 19.5 9.1 12.6 7.4 10.9.5 10 7.4 9.1 9.1 7.4 10 .5Z' fill='%23FFFFFF'/%3E%3C/svg%3E") center/contain no-repeat;animation:pTw 2.6s ease-in-out infinite}
.pcv .psk i.b{width:11px;height:11px;margin:-5.5px 0 0 -5.5px;opacity:1;filter:drop-shadow(0 0 4px rgba(255,255,255,.9))}
@keyframes pTw{0%,100%{opacity:.9;transform:scale(1)}50%{opacity:.2;transform:scale(.55)}}
.pcv .pmt{position:absolute;top:8%;left:78%;width:80px;height:2px;border-radius:2px;opacity:0;transform-origin:0 50%;
background:linear-gradient(90deg,#fff,rgba(255,255,255,.7) 30%,rgba(255,255,255,0));box-shadow:0 0 8px 1px rgba(255,255,255,.8);animation:pMt 6s linear infinite 1.2s}
.pcv .pmt::before{content:"";position:absolute;left:-2px;top:-1.5px;width:5px;height:5px;border-radius:50%;background:#fff;box-shadow:0 0 6px 2px #fff}
.pcv .pmt.m2{top:30%;left:96%;width:60px;animation-duration:9s;animation-delay:4.2s}
@keyframes pMt{0%{opacity:0;transform:translate(0,0) rotate(-28deg)}2%{opacity:1}12%{opacity:0;transform:translate(-130px,70px) rotate(-28deg)}100%{opacity:0;transform:translate(-130px,70px) rotate(-28deg)}}
@media (prefers-reduced-motion:reduce){.pcv .psk i,.pcv .pmt{animation:none}}
.pcv .ptop{position:absolute;left:8px;top:8px;z-index:1;height:19px;padding:0 7px;border-radius:6px;background:linear-gradient(120deg,#FFE2B8,#FFB98F);color:#4A2E1E;font-size:10.5px;font-style:normal;font-weight:900;line-height:19px;letter-spacing:.5px}
.pcv .pbig{position:absolute;left:12px;right:12px;bottom:40px;z-index:1}
.pcv .pbig small{display:block;font-size:10.5px;font-weight:700;letter-spacing:1px;color:rgba(255,231,199,.75)}
.pcv .pbig b{display:block;margin-top:4px;font-size:19px;font-weight:900;line-height:1.3;letter-spacing:.5px;color:#FFE7C7;text-shadow:0 2px 10px rgba(20,10,40,.6)}
.pcv .pq{position:absolute;left:12px;right:12px;bottom:12px;z-index:1;margin:0;font-size:11.5px;color:rgba(255,244,232,.8);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:opacity .26s,transform .26s}
.pcv .pq.out{opacity:0;transform:translateY(5px)}
.nb .ntg.k-whs{background:#F0EBFA;color:#7A5BB8}
.nc.pin .nf .pav{flex:none;display:grid;place-items:center;width:18px;height:18px;border-radius:50%;background:linear-gradient(135deg,#3E2F5E,#6B4AA8);color:#FFE2B8;font-size:10px;font-style:normal}
.nc.pin .nf .pgo{margin-left:auto;flex:none;font-size:11px;font-weight:800;color:#7A5BB8}
.qf-st{position:absolute;inset:0;pointer-events:none;opacity:.9;
background-image:radial-gradient(1.4px 1.4px at 12% 20%,#fff,transparent),radial-gradient(1px 1px at 28% 70%,#fff,transparent),radial-gradient(1.2px 1.2px at 46% 14%,#FFE9B0,transparent),
radial-gradient(1px 1px at 54% 82%,#fff,transparent),radial-gradient(1.5px 1.5px at 62% 30%,#fff,transparent),radial-gradient(1px 1px at 8% 88%,#FFE9B0,transparent),radial-gradient(1.2px 1.2px at 40% 46%,#fff,transparent);
@@ -956,7 +955,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
<div id="sheet" role="dialog" aria-modal="true"><i class="sg"></i><div class="sbd" id="sbd"></div></div>
<div class="toast" id="toast"></div>
<script src="../js/wh-themes.js?v=26110607"></script> <!-- 11-07 悄悄话每周话题(与首页共用) -->
<script src="../js/wh-themes.js?v=26110608"></script> <!-- 11-07 悄悄话每周话题(与首页共用) -->
<script src="topics.js?v=26110487"></script>
<script src="data.js?v=26110487"></script>
<script src="feed.js?v=26110487"></script>
@@ -1198,48 +1197,40 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
'<span class="qf-fly" aria-hidden="true"><i>福</i><i>安</i><i>福</i><i>康</i></span>' +
'<span class="qf-tx"><small><i></i>宝宝祈福树</small><b><i>#</i>为宝宝挂一张福牌<i>#</i></b><em>集齐五福,愿宝宝平平安安</em>' +
'<span class="qf-go">去祈福<svg class="ic"><use href="#i-right"/></svg></span></span></button>';
} /* 11-07 用户:「悄悄话算孕期广场的话题性质」→ 祈福树横幅下面放一条悄悄话夜空细条(同首页广场模块底部那条)。
数据同首页:GET /whisper?openid=&week=(孕周取首页写的 mmbox.gcwk.v1);拉不到 / 没孕周 / 已退出登录 → 不显示,不造内容。
星空全屏页只在首页有 → 点了回首页带 ?wh=1,首页数据回来自动打开。 */
} /* 11-07 用户:「首页就不放了,在内容页里放,发一个笔记置顶,点击就进到这个页面」→ 「全部」信息流右列第一张置顶笔记卡。
有孕周(首页写的 mmbox.gcwk.v1,≥4 周、没生)且没退出登录才出;数据同首页 GET /whisper?openid=&week=,回来后卡里轮播真实的悄悄话,
拉不到就只显示话题,不造内容。星空全屏页在首页 → 点了跳首页带 ?wh=1,首页直接打开星空页,关掉回到这里。 */
var PIN_WK = (function () { try { var g = JSON.parse(localStorage.getItem('mmbox.gcwk.v1') || 'null'); return g && !g.pp && g.w ? +g.w : 0; } catch (e) { return 0; } })();
var PIN_ON = PIN_WK >= 4 && !(window.mbGate && window.mbGate.out);
var WHD = null, whRi = 0, whT = null;
function whHTML() {
if (!WHD) return '';
var th = (WHD.theme && WHD.theme.name) ? WHD.theme : (window.MB_WH_THEME ? window.MB_WH_THEME() : null);
var l = (WHD.list || []).filter(function (x) { return !x.mine; });
var nm = WHD.week ? WHD.week + '周孕妈悄悄话' : '孕妈悄悄话';
var sky = [[50,12,6,-1.2,2.4],[60,30,4,-.3,2],[73,15,5,-2.4,2.8],[93,13,4,-3.1,2.2],[21,90,4,-3.7,2.6],[45,88,5,-1.6,3.2],[73,80,4,-2.2,2.6],[89,88,5,-.8,3]]
.map(function (k) { return '<i style="left:' + k[0] + '%;top:' + k[1] + '%;width:' + k[2] + 'px;height:' + k[2] + 'px;animation-delay:' + k[3] + 's;animation-duration:' + k[4] + 's"></i>'; }).join('');
return '<button type="button" class="whs" id="whsGo" aria-label="打开' + esc(nm) + (th ? ',本周话题:' + esc(th.name) : '') + '">' +
'<span class="whs-sky" aria-hidden="true">' + sky + '<b class="whs-mt"></b><b class="whs-mt m2"></b></span>' +
'<span class="whs-ico" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M5 18.5V7.8A2.8 2.8 0 017.8 5h8.4A2.8 2.8 0 0119 7.8v5.4a2.8 2.8 0 01-2.8 2.8H9.2z" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linejoin="round"/><path d="M9 10.5h6" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"/></svg></span>' +
'<span class="whs-tx"><small>' + esc(nm) + '</small>' +
(th ? '<span class="whs-tp"><em>本周话题</em><b>' + esc(th.name) + '</b></span>' : '') +
'<span class="whs-rl" id="whsRl">' + (l.length ? '“' + esc(l[0].text) + '”' : '') + '</span></span>' +
'<span class="whs-go">' + (th ? '去说一句' : '去看看') + '<svg class="ic"><use href="#i-right"/></svg></span></button>';
function pinHTML() {
var th = (WHD && WHD.theme && WHD.theme.name) ? WHD.theme : (window.MB_WH_THEME ? window.MB_WH_THEME() : null);
var l = WHD ? (WHD.list || []).filter(function (x) { return !x.mine; }) : [];
var sky = [[14,14,0,-1.2,2.4],[38,8,0,-.3,2],[62,20,1,-2.4,2.8],[86,12,0,-3.1,2.2],[24,34,1,-3.7,2.6],[50,40,0,-1.6,3.2],[80,32,0,-2.2,2.6],[10,52,0,-.8,3],[70,50,1,-1.9,2.4],[90,58,0,-2.8,3]]
.map(function (k) { return '<i' + (k[2] ? ' class="b"' : '') + ' style="left:' + k[0] + '%;top:' + k[1] + '%;animation-delay:' + k[3] + 's;animation-duration:' + k[4] + 's"></i>'; }).join('');
return '<button type="button" class="nc pin" id="whPin" aria-label="置顶:孕妈悄悄话' + (th ? ',本周话题' + esc(th.name) : '') + '"><div class="cvw"><div class="pcv">' +
'<span class="psk" aria-hidden="true">' + sky + '<b class="pmt"></b><b class="pmt m2"></b></span><i class="ptop">置顶</i>' +
'<div class="pbig"><small>' + (th ? '本周话题' : '孕妈悄悄话') + '</small><b>' + esc(th ? th.name : '说给宝宝听的悄悄话') + '</b></div>' +
'<p class="pq" id="pinRl">' + (l.length ? '“' + esc(l[0].text) + '”' : '点一颗星星,听听她们说了什么') + '</p></div></div>' +
'<div class="nb"><h3>每一颗星星,都是一位孕妈的一句话</h3><span class="ntg k-whs">#孕妈悄悄话</span>' +
'<div class="nf"><i class="pav" aria-hidden="true">✦</i><span class="nm">' + PIN_WK + '周孕妈悄悄话</span><span class="pgo">去看看 ›</span></div></div></button>';
}
function whRoll() {
clearInterval(whT); whRi = 0;
var l = WHD ? (WHD.list || []).filter(function (x) { return !x.mine; }) : [];
var el = document.getElementById('pinRl'), l = WHD ? (WHD.list || []).filter(function (x) { return !x.mine; }) : [];
if (!el || !l.length) return;
el.textContent = '“' + l[0].text + '”';
if (l.length < 2) return;
whT = setInterval(function () {
var el = document.getElementById('whsRl'); if (!el || document.hidden) return;
whRi = (whRi + 1) % l.length; el.classList.add('out');
setTimeout(function () { el.textContent = '“' + l[whRi].text + '”'; el.classList.remove('out'); }, 260);
var e2 = document.getElementById('pinRl'); if (!e2) { clearInterval(whT); return; } if (document.hidden) return;
whRi = (whRi + 1) % l.length; e2.classList.add('out');
setTimeout(function () { e2.textContent = '“' + l[whRi].text + '”'; e2.classList.remove('out'); }, 260);
}, 4000);
}
function whFill() {
var slot = document.getElementById('whSlot'); if (!slot) return;
slot.innerHTML = whHTML(); whRoll();
}
(function whFetch() {
var g = null; try { g = JSON.parse(localStorage.getItem('mmbox.gcwk.v1') || 'null'); } catch (e) {}
var w = g && !g.pp && g.w ? +g.w : 0;
if (w < 4 || (window.mbGate && window.mbGate.out)) return;
fetch('/api/mp/public/mama-box/whisper?openid=' + encodeURIComponent(OPENID || '') + '&week=' + w)
if (PIN_ON) fetch('/api/mp/public/mama-box/whisper?openid=' + encodeURIComponent(OPENID || '') + '&week=' + PIN_WK)
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (j) { var r = j && j.code === 200 && j.result; if (r && r.show && (r.list || []).length) { WHD = r; whFill(); } })
.then(function (j) { var r = j && j.code === 200 && j.result; if (r && r.show && (r.list || []).length) { WHD = r; whRoll(); } })
.catch(function () {});
})();
/* 分类小 banner:家庭婚姻 / 职场 / 经验 点了 = 参与本类最热话题(投稿规则弹层);测一测 点了 = 进最热的那个测试 */
var CBN = {
@@ -1649,7 +1640,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
/* 11-05 用户:「职场那些标签和上面的话题整合到一个里面,感觉有点乱」→ 选方案 A:「全部」下去掉「热门话题」整块,
标签作为唯一入口(末尾加「全部话题 ›」);选中标签时标签下露出这一类的 2~3 个热门话题(用户同意);投稿奖励一行挪到「大家在聊」上面。
话题本身不变:投稿选话题、帖子卡上的 #话题#、话题详情页照旧。分类视图(catF)仍是原来的热门话题列表。 */
el.innerHTML = qifuHTML() + '<div id="whSlot">' + whHTML() + '</div>' +
el.innerHTML = qifuHTML() +
'<div class="rww"><button type="button" class="rwl" data-rule="1"><svg class="ic"><use href="#i-gift"/></svg><span>投稿被选中得 ' + REWARD + '</span><b>怎么参与 ›</b></button></div>';
fh.className = 'shtg';
fh.innerHTML = '<div class="sh"><h2>大家在聊</h2><small>孕妈们的分享</small></div>' +
@@ -1728,7 +1719,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
11-03 用户:「笔记里测一测减少一些,已经有测一测模块了」→ 原来第 3 位起每 8 张插 1 张(约 20 张),改成第 6 位起每 30 张插 1 张、最多 3 张 */
var csq = CS_MIX.concat(byHot(TM).map(function (x) { return x.id; }).filter(function (id) { return CS_MIX.indexOf(id) < 0; }));
list.forEach(function (n, k) { if (k >= 6 && (k - 6) % 30 === 0 && ci < 3) { var tid = csq[ci++ % csq.length]; if (TMBY[tid]) mixed.push({ test: TMBY[tid] }); } mixed.push(n); });
list = [{ mine: 1 }].concat(mixed);
list = [{ mine: 1 }].concat(PIN_ON ? [{ pin: 1 }] : [], mixed); /* 11-07 置顶笔记「孕妈悄悄话」 */
}
/* 11-03 用户:切分类有点卡。原来每张卡塞进列里再 offsetHeight 量高,每量一次整页重排;85 张卡在中端机上卡 0.5 秒以上,正好卡在滑入动画中间。
现在:帖子卡高度直接算(封面 = 列宽 × 比例,底部 = 标题 1/2 行 + 作者行,和 .nc 样式对应),只有「我的投稿 / 收藏 / 测试卡」这几种
@@ -1740,6 +1731,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
list.forEach(function (n) {
if (n.mine) specials.push(myCardHTML(), favCardHTML());
else if (n.test) specials.push(testCardHTML(n.test, dn));
else if (n.pin) specials.push(pinHTML());
});
var spH = [];
if (specials.length) {
@@ -1754,6 +1746,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
function add(html, c, h) { out[c].push(anim(html, k2++)); hs[c] += h + 8; }
list.forEach(function (n) {
if (n.mine) { add(specials[si], 0, spH[si++]); add(specials[si], 0, spH[si++]); return; }
if (n.pin) { add(specials[si], 1, spH[si++]); lastTx[1] = false; return; } /* 右列第一张 */
if (n.test) { var tc0 = hs[0] <= hs[1] ? 0 : 1; add(specials[si], tc0, spH[si++]); lastTx[tc0] = false; return; }
nk++;
var c = hs[0] <= hs[1] ? 0 : 1, sty = !lastTx[c] && n.photo ? (txN[c]++ % 2 ? 'tg' : 'ov') : '';
@@ -1761,6 +1754,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
var r = n.ratio; if (n.photo && sty === 'ov') r = Math.max(r, 1.33); else if (n.photo && sty === 'tg') r = Math.max(r, 1.2);
add(cardHTML(n, !cur, sty), c, estH(n, r));
});
if (PIN_ON) setTimeout(whRoll, 0);
var FIRST = 14, gen = renderFeed.gen = (renderFeed.gen || 0) + 1;
cols[0].innerHTML = out[0].slice(0, FIRST).join(''); cols[1].innerHTML = out[1].slice(0, FIRST).join('');
if (out[0].length > FIRST || out[1].length > FIRST) setTimeout(function () {
@@ -1885,7 +1879,6 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
$('#more').addEventListener('click', function (e) { if (e.target.closest('[data-t]')) { haptic(); selectTopic(''); } });
$('#head').addEventListener('click', function (e) {
if (e.target.closest('#qfBanner')) { goQifu(); return; }
if (e.target.closest('#whsGo')) { haptic(); var q = new URLSearchParams(location.search); ['t', 'n', 'c'].forEach(function (k) { q.delete(k); }); q.set('wh', '1'); location.href = '../?' + q + location.hash; return; }
var cb = e.target.closest('.cbn[data-test], .csv-i[data-test]'); if (cb) { haptic(); location.href = ceshiURL(cb.dataset.test, true); return; }
var dc = e.target.closest('#csvGo'); if (dc) { csdRoll(dc); return; }
var j = e.target.closest('[data-join]'); if (j) { haptic(); openRule(j.dataset.join); return; }
@@ -1955,6 +1948,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
}, true);
$('#wf').addEventListener('click', function (e) {
if (e.target.closest('[data-mine]')) { haptic(); location.href = mineURL(); return; }
if (e.target.closest('#whPin')) { haptic(); var q = new URLSearchParams(location.search); ['t', 'n', 'c'].forEach(function (k) { q.delete(k); }); q.set('wh', '1'); location.href = '../?' + q + location.hash; return; }
if (e.target.closest('[data-fav]')) { haptic(); openFav(false); return; }
var ts = e.target.closest('[data-test]');
if (ts) { haptic(); location.href = ceshiURL(ts.dataset.test, catF === 'ceshi'); return; }

View File

@@ -9,16 +9,16 @@
<title>兜爸心选 · 孕育陪伴</title>
<!-- 11-04 UGC 总开关(孕妈广场 + 测一测,后台 /box_bm/plaza 顶部切换),见 js/ugc.js -->
<script src="js/ugc.js?v=26110487"></script>
<!-- V:26110607 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<!-- V:26110608 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<link rel="stylesheet" href="mama-box.css">
<link rel="stylesheet" href="night.css?v=26110607">
<link rel="stylesheet" href="night.css?v=26110608">
<!-- 11-04 用户:「顶部图片上的倒计时先删除掉」→ 不加载 hero-cd.css / hero-cd.js(文件留着,加回这两行即恢复),头图回到原样式 -->
<!-- 夜晚模式:首屏绘制前就按上次的选择加 class,避免先白后黑闪一下(开关在首页右上角 #nightBtn,逻辑见 app.js) -->
<script>try{if(localStorage.getItem('mmbox.night.v1')==='1'){document.documentElement.classList.add('night');document.querySelector('meta[name=theme-color]').content='#2A2340'}}catch(e){}</script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<!-- 共享助手:授权/跳商城/位置上报(分享卡片同步,见 docs/h5-auth-standard.md 第四节) -->
<script src="/common/wx-auth.js?v=26102601"></script>
<script src="js/login-gate.js?v=26110607"></script>
<script src="js/login-gate.js?v=26110608"></script>
<!-- 11-05 用户:「消消乐的推广 banner 图,不要有外面白色的边框」→ 去掉 .game-promo 外层白底(mama-box.css 里和其他模块共用一条白底规则,这里单独盖掉;夜间同) -->
<style>.game-promo,html.night .game-promo{background:none!important;box-shadow:none!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important}
/* 11-05 用户:「消消乐 banner 左右要顶到两边,跟上下模块的距离再缩小几个像素,保持协调一致」→ 去掉外层内边距:左右和其他模块一样贴满(0~屏宽),上下只留模块间统一的 16px 缝(原来多出 8px);圆角跟其他模块一致 26px;同日三改:用户嫌圆角太大 → 16px */
@@ -569,7 +569,13 @@ html.night .rs-pan .rp-card{background:rgba(255,255,255,.06);border-color:rgba(2
<!-- 2026-10-02 二改(用户:「此刻有一点点乱……悄悄话点进去,前端一个很简洁、轻量化的入口,
点进去是整个悄悄话的大页面,设计炫酷一点、有创意、视觉有冲击力」):
首页只留一条入口(一句轮播的悄悄话 + 条数),横滑纸条带挪进全屏页 #whPage。 -->
<!-- 悄悄话入口 #whWall 2026-11-07 挪到孕妈广场模块 #gcHome 底部(用户:「它算孕期广场的话题性质」) -->
<button class="wh-entry hide" id="whWall" type="button" aria-label="打开同孕周悄悄话">
<!-- 2026-10-02 用户:「入口那一小条里要有星空,星星一闪一闪,再划过几个流星,不要太多」 -->
<span class="we-sky" aria-hidden="true"><i class="tw" style="left:50%;top:12%;width:6px;height:6px;animation-delay:-1.2s;animation-duration:2.4s"></i><i style="left:60%;top:30%;width:4px;height:4px;animation-delay:-0.3s;animation-duration:2.0s"></i><i class="tw" style="left:73%;top:15%;width:5px;height:5px;animation-delay:-2.4s;animation-duration:2.8s"></i><i class="tw" style="left:93%;top:13%;width:4px;height:4px;animation-delay:-3.1s;animation-duration:2.2s"></i><i class="tw" style="left:21%;top:90%;width:4px;height:4px;animation-delay:-3.7s;animation-duration:2.6s"></i><i class="tw" style="left:45%;top:88%;width:5px;height:5px;animation-delay:-1.6s;animation-duration:3.2s"></i><i style="left:73%;top:80%;width:4px;height:4px;animation-delay:-2.2s;animation-duration:2.6s"></i><i class="tw" style="left:89%;top:88%;width:5px;height:5px;animation-delay:-0.8s;animation-duration:3.0s"></i><b class="we-mt"></b><b class="we-mt m2"></b></span>
<span class="we-ico" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M5 18.5V7.8A2.8 2.8 0 017.8 5h8.4A2.8 2.8 0 0119 7.8v5.4a2.8 2.8 0 01-2.8 2.8H9.2z" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linejoin="round"/><path d="M9 10.5h6" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"/></svg></span>
<span class="we-txt"><b id="weName">孕妈悄悄话</b><span class="we-topic"><em>本周话题</em><strong id="weTopic"></strong></span><span class="we-roll" id="weRoll"></span></span>
<span class="we-go" id="weGo"></span>
</button>
</div>
</section>
@@ -612,20 +618,10 @@ html.night .rs-pan .rp-card{background:rgba(255,255,255,.06);border-color:rgba(2
</div>
<div class="gch-who"><span class="gch-avs" id="gchAvs" aria-hidden="true"></span><span id="gchCnt"></span></div>
<div class="gch-row gb" id="gchRow"></div>
<!-- 2026-11-07 用户:悄悄话算广场的话题性质 → 从「此刻」(11-03 起整块藏着)挪进来,放在话题卡下面收尾;
跟着 #gcHome 一起受 UGC 总开关管。点开还是原来的星空全屏页 #whPage。 -->
<button class="wh-entry hide" id="whWall" type="button" aria-label="打开同孕周悄悄话">
<!-- 2026-10-02 用户:「入口那一小条里要有星空,星星一闪一闪,再划过几个流星,不要太多」 -->
<span class="we-sky" aria-hidden="true"><i class="tw" style="left:50%;top:12%;width:6px;height:6px;animation-delay:-1.2s;animation-duration:2.4s"></i><i style="left:60%;top:30%;width:4px;height:4px;animation-delay:-0.3s;animation-duration:2.0s"></i><i class="tw" style="left:73%;top:15%;width:5px;height:5px;animation-delay:-2.4s;animation-duration:2.8s"></i><i class="tw" style="left:93%;top:13%;width:4px;height:4px;animation-delay:-3.1s;animation-duration:2.2s"></i><i class="tw" style="left:21%;top:90%;width:4px;height:4px;animation-delay:-3.7s;animation-duration:2.6s"></i><i class="tw" style="left:45%;top:88%;width:5px;height:5px;animation-delay:-1.6s;animation-duration:3.2s"></i><i style="left:73%;top:80%;width:4px;height:4px;animation-delay:-2.2s;animation-duration:2.6s"></i><i class="tw" style="left:89%;top:88%;width:5px;height:5px;animation-delay:-0.8s;animation-duration:3.0s"></i><b class="we-mt"></b><b class="we-mt m2"></b></span>
<span class="we-ico" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M5 18.5V7.8A2.8 2.8 0 017.8 5h8.4A2.8 2.8 0 0119 7.8v5.4a2.8 2.8 0 01-2.8 2.8H9.2z" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linejoin="round"/><path d="M9 10.5h6" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"/></svg></span>
<span class="we-txt"><b id="weName">孕妈悄悄话</b><span class="we-topic"><em>本周话题</em><strong id="weTopic"></strong></span><span class="we-roll" id="weRoll"></span></span>
<span class="we-go" id="weGo"></span>
</button>
<style>
#homeBody>section.gc-home{--gt:255,120,150}
.gc-home{margin:16px -26px 0;padding:16px 26px 16px;border-radius:26px;position:relative;z-index:0;background-color:#fff}
.gc-home.hide{display:none}
#gcHome .wh-entry{margin-top:14px}
.gch-head{display:flex;align-items:center;gap:8px}
/* 11-01 第四版:四块分类(家庭/婚姻/职场/母婴)放不进标题行 → 分类单独占第二行,五段等宽 */
.gch-head{flex-wrap:wrap;row-gap:10px}
@@ -2682,7 +2678,7 @@ html.night .rs-pan .rp-card{background:rgba(255,255,255,.06);border-color:rgba(2
<script src="js/zodiac-art.js"></script>
<script src="guangchang/topics.js?v=26110487"></script>
<script src="js/ava-pool.js?v=26110487"></script> <!-- 11-05 装饰头像分配表(各模块互不重复) -->
<script src="js/wh-themes.js?v=26110607"></script>
<script src="js/wh-themes.js?v=26110608"></script>
<script src="js/app.js"></script>
<script src="js/kit.js?v=26110605"></script>
<!-- 11-05 用户:孕期百问加上跟趣味小测试一样的底部 Tab(孕期百问 / 记一下 / 返回首页)。挂在 #detailQA 里,面板关着时跟着滑出屏外;
@@ -2707,7 +2703,7 @@ html.night .rs-pan .rp-card{background:rgba(255,255,255,.06);border-color:rgba(2
if (gchDone || !window.__mbUgc) return; gchDone = true;
var m = location.search.match(/[?&]gcv=([1-6])(?:&|$)/);
if (!m) window.__gcDefault = 1;
var n = m ? m[1] : '6', l = document.createElement('link'), s = document.createElement('script'), q = m ? Date.now() : 'v=26110607';
var n = m ? m[1] : '6', l = document.createElement('link'), s = document.createElement('script'), q = m ? Date.now() : 'v=26110487';
var dir = n === '4' || n === '6' ? 'js/gch/' : 'demo/gch/'; /* 11-03 上正式:定稿 V6(含它套的 V4)并进 js/gch/,其余效果稿仍在 demo/ */
l.rel = 'stylesheet'; l.href = dir + 'v' + n + '.css?' + q;
s.src = dir + 'v' + n + '.js?' + q;

View File

@@ -3,7 +3,7 @@
(function () {
'use strict';
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
var VER = '26110607';
var VER = '26110608';
const $ = (s, c) => (c || document).querySelector(s);
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
@@ -4806,6 +4806,7 @@
function closePage() {
stopAll();
drawer(false);
if (fromPlaza) { fromPlaza = false; history.back(); return; } /* 从广场置顶笔记来的:回广场 */
page.classList.remove('show');
page.setAttribute('aria-hidden', 'true');
}
@@ -4826,7 +4827,7 @@
.then(r => (r.ok ? r.json() : null))
.then(j => {
const r = j && j.code === 200 && j.result;
if (!r || !r.show || !(r.list || []).length) { data = null; show(false); return; }
if (!r || !r.show || !(r.list || []).length) { data = null; show(false); autoFail(); return; }
data = r;
const ns = r.list.map(x => x.id + ':' + x.hugs + (x.hugged ? 'h' : '')).join('|');
if (ns !== sig) {
@@ -4838,14 +4839,31 @@
show(true);
if (autoOpen) { autoOpen = false; openPage(); }
})
.catch(() => { if (!silent) show(false); });
.catch(() => { if (!silent) show(false); autoFail(); });
}
/* 2026-11-07 孕妈广场页的悄悄话条点了跳回首页带 ?wh=1 → 数据回来直接打开星空页;参数用完就去掉,刷新不再弹 */
let autoOpen = /[?&]wh=1(?:&|$)/.test(location.search);
if (autoOpen && history.replaceState) {
/* 2026-11-07 孕妈广场信息流的置顶笔记「孕妈悄悄话」点了跳到首页带 ?wh=1 → 直接打开星空页:
· 星空页先空着盖上来(不露首页),孕周取广场也在用的 mmbox.gcwk.v1,马上拉数据,不等「此刻」;
· 参数用完就去掉,刷新不再弹;从广场来的,关掉星空页 = 浏览器返回,回到广场;
· 拉不到 → 提示一句再回广场。 */
let autoOpen = /[?&]wh=1(?:&|$)/.test(location.search), fromPlaza = false;
if (autoOpen) {
fromPlaza = /\/guangchang\//.test(document.referrer || '') && history.length > 1;
if (history.replaceState) {
const q = new URLSearchParams(location.search); q.delete('wh');
history.replaceState(history.state, '', location.pathname + (q.toString() ? '?' + q : '') + location.hash);
}
page.classList.add('show');
page.setAttribute('aria-hidden', 'false');
let gw = 0;
try { const g = JSON.parse(localStorage.getItem('mmbox.gcwk.v1') || 'null'); gw = g && !g.pp && g.w ? +g.w : 0; } catch (e) {}
if (gw >= 4) setTimeout(() => load(gw), 0); else setTimeout(autoFail, 0);
}
function autoFail() {
if (!autoOpen) return;
autoOpen = false;
toast('悄悄话暂时打不开,稍后再试');
setTimeout(closePage, 1500);
}
whLoad = w => load(w, w === wk); /* 同一孕周的重拉(「此刻」每 60 秒一次)按静默刷新走:失败不收入口 */
setInterval(() => { if (wk && !document.hidden && !busy) load(wk, true); }, 300000);

View File

@@ -40,7 +40,6 @@
}
sec.className = sec.className.replace(/\bgv\d\b/g, '') + ' gv4';
var wh = document.getElementById('whWall'); /* 11-07 悄悄话入口挂在本块里(app.js 拿着这个节点)→ 重画前摘下来,画完放回底部 */
sec.innerHTML =
'<div class="g4-head"><h2 class="g4-title"><span>孕妈广场</span></h2>' +
/* 11-03 用户:首页孕妈广场右上角的分类(全部 / 家庭婚姻 / 职场 / 经验)取消,换一句小 slogan */
@@ -54,7 +53,6 @@
'<div class="g4-rail"><span class="g4-pg"><b>1</b><i>/8</i></span></div></div>' +
'<div class="g4-tags"></div>' +
'<div class="g4-foot"><button type="button" class="g4-all">进孕妈广场 ›</button><span class="g4-mark">效果稿 V4</span></div>';
if (wh) sec.insertBefore(wh, sec.querySelector('.g4-foot'));
sec.classList.remove('hide');
var deck = sec.querySelector('.g4-deck'), pgB = sec.querySelector('.g4-pg b'), pgI = sec.querySelector('.g4-pg i'), tags = sec.querySelector('.g4-tags');

View File

@@ -233,7 +233,3 @@ html.night #gcHome.gv4.gv6 .g6-avs img{border:1px solid #2F2737}
#gcHome.gv4.gv6 .g6-list .g6-meta.g6-sw .g6-au{justify-self:end;max-width:100%}
/* 11-05 用户:「孕妈的精彩故事」标题和下面第一篇之间稍微拉开一点 → 2→8px */
#gcHome.gv4.gv6 .g6-mh{margin-bottom:8px}
/* 11-07 悄悄话夜空条(#whWall,app.js 渲染)挂在本块最底下收尾 */
#gcHome.gv4 .wh-entry{margin-top:14px}
#gcHome.gv4 .wh-entry.hide{display:none}

View File

@@ -8,7 +8,7 @@
if (!sec) return;
var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/gch/v4.css?v=26110464';
document.head.appendChild(l);
var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110607';
var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110464';
s.onload = function () { if (sec.querySelector('.g4-foot')) merge(); else sec.addEventListener('gc4-ready', merge, { once: true }); }; /* v4 要先拉 feed.js 才渲染 */
document.body.appendChild(s);
@@ -69,7 +69,6 @@
/* 11-02 用户:「太多了,只放两个测一测」→ 3 个小列表撤掉(topic/yali、yinshi、zhunbei 页面保留,先不挂入口);
位置从卡堆下面挪到「其他妈妈也在搜」下面 */
sec.insertBefore(box, foot);
var wh = document.getElementById('whWall'); if (wh) sec.insertBefore(wh, foot); /* 11-07 悄悄话条留在整块最底下收尾 */
/* 11-03 用户:首页「孕期百宝箱」已有「趣味小测试」入口 → 这里两张测一测卡不要了(加 ?qzcard=1 还能看回) */
if (/[?&]qzcard=1(?:&|$)/.test(location.search)) sec.insertBefore(qz, foot);
var list = box.querySelector('.g6-list'), all = box.querySelector('.g6-all');

View File

@@ -64,7 +64,7 @@
/* 11-04 微信转发图:每个专题一张 assets/share/t/<slug>.jpg(核心词大字 + logo),见 js/share-card.js */
if (SLUG) (function () { var s = document.createElement('script'); s.src = '../../js/share-card.js?v=26110464'; s.onload = function () { window.mbShare('../../assets/share/t/' + SLUG + '.jpg'); }; document.head.appendChild(s); })();
/* 11-07 退出登录后只看不写(js/login-gate.js):点赞、评论、发图都弹「登录后才能使用」 */
if (!window.mbGate) (function () { var s = document.createElement('script'); s.src = '../../js/login-gate.js?v=26110607'; document.head.appendChild(s); })();
if (!window.mbGate) (function () { var s = document.createElement('script'); s.src = '../../js/login-gate.js?v=26110608'; document.head.appendChild(s); })();
var SK = 'mmbox.tp.v1', UK = (function () { var m = ((location.hash || '') + '&' + (location.search || '')).match(/[#?&]openid=([^&]*)/); return m ? decodeURIComponent(m[1]) : '_guest'; })();
function loadMe() { try { var a = JSON.parse(localStorage.getItem(SK) || '{}') || {}; var m = a[UK] || {}; m.cm = m.cm || {}; m.lk = m.lk || {}; return { a: a, m: m }; } catch (e) { return { a: {}, m: { cm: {}, lk: {} } }; } }
function saveMe(st) { try { st.a[UK] = st.m; localStorage.setItem(SK, JSON.stringify(st.a)); } catch (e) {} }