悄悄话留言改半屏面板(最高 2/3,留出星空)+ 说一句下面加入口、「全部」也开面板;留言可回复;星星划走后再冒出来;100 条留言重写成大白话 (v26110618)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -1053,7 +1053,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
|
||||
var CMD = null, CMERR = false;
|
||||
/* 头像编码:数字 = av/NNNN.webp(旧代码头像);'av:c012' = av/c012.webp(卡通/可爱卡通);'/…' = 站内绝对路径(内置头像库 /_bridge/avatars/);其余 = assets/img/mom/xxx.jpg */
|
||||
var avP = function (a) { return typeof a === 'number' ? 'av/' + ('000' + a).slice(-4) + '.webp' : a.indexOf('av:') === 0 ? 'av/' + a.slice(3) + '.webp' : a.charAt(0) === '/' ? a : '../assets/img/mom/' + a + '.jpg'; };
|
||||
fetch('cm.json?v=26110612').then(function (r) { return r.json(); }).then(function (j) {
|
||||
fetch('cm.json?v=26110618').then(function (r) { return r.json(); }).then(function (j) {
|
||||
CMD = j; if (openId && NBY[openId]) { renderComments(NBY[openId]); syncBar(NBY[openId]); }
|
||||
}).catch(function () { CMERR = true; if (openId && NBY[openId]) renderComments(NBY[openId]); });
|
||||
function commentsOf(n) {
|
||||
@@ -1234,7 +1234,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
|
||||
function pinCoverHTML(th, l, sky, big) {
|
||||
return '<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>' + (th ? (th.lines || [th.name]).map(esc).join('<br>') : '说给宝宝听的悄悄话') + '</b></div>' +
|
||||
'<p class="pq" id="' + (big ? 'pinRl2' : 'pinRl') + '">' + (l.length ? '“' + esc(l[0].text) + '”' : '点一颗星星,听听她们说了什么') + '</p>' +
|
||||
'<p class="pq" id="' + (big ? 'pinRl2' : 'pinRl') + '">' + (l.length ? '“' + esc(l[0].text) + '”' : '点一颗星星,看看她说了啥') + '</p>' +
|
||||
(big ? '<button type="button" class="pstar" data-star="1">去星空看看<svg class="ic" style="width:14px;height:14px"><use href="#i-right"/></svg></button>' : '') + '</div>';
|
||||
}
|
||||
function pinHTML() {
|
||||
@@ -1242,7 +1242,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
|
||||
var l = WHD ? (WHD.list || []).filter(function (x) { return !x.mine; }) : [];
|
||||
var sky = pinSky();
|
||||
return '<button type="button" class="nc pin" id="whPin" data-id="' + PIN_ID + '" aria-label="置顶:孕妈悄悄话' + (th ? ',本周话题' + esc(th.name) : '') + '"><div class="cvw">' + pinCoverHTML(th, l, sky) + '</div>' +
|
||||
'<div class="nb"><h3>每一颗星星,都是一位孕妈的一句话</h3><span class="ntg k-whs">#孕妈悄悄话</span>' +
|
||||
'<div class="nb"><h3>每颗星星,都是一个妈妈说的话</h3><span class="ntg k-whs">#孕妈悄悄话</span>' +
|
||||
'<div class="nf"><i class="pav" aria-hidden="true"><svg viewBox="0 0 20 20" width="10" height="10"><path 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="currentColor"/></svg></i><span class="nm">孕妈悄悄话</span><span class="pgo">去看看 ›</span></div></div></button>';
|
||||
}
|
||||
var PIN_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]];
|
||||
@@ -2112,7 +2112,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
|
||||
$('#dnm').textContent = '孕妈悄悄话';
|
||||
$('#dst').textContent = th ? '本周话题 · ' + th.name : '';
|
||||
$('#dsc').innerHTML = '<div class="dcv">' + pinCoverHTML(th, l, pinSky(), true) + '</div>' +
|
||||
'<div class="dbody"><h2>每一颗星星,都是一位孕妈的一句话</h2><div class="tx">' +
|
||||
'<div class="dbody"><h2>每颗星星,都是一个妈妈说的话</h2><div class="tx">' +
|
||||
'<p>这周的话题是「' + esc(th ? th.name : '说给宝宝听的悄悄话') + '」。' + esc(th && th.tip ? th.tip + '。' : '') + '</p>' +
|
||||
'<p>在下面留言区写一句,审核通过后大家都能看到。点赞多的悄悄话会挂上星空,变成一颗星星,同孕周的妈妈点一下,就能看到它像流星一样划过。</p>' +
|
||||
'<p>一天最多说 3 句,每一句都会被认真对待。</p></div>' +
|
||||
@@ -2560,7 +2560,7 @@ html.night .gtg button.on{background:#F2725B;border-color:#F2725B;color:#fff}
|
||||
/* 11-04 微信转发图:跟着地址走 —— ?n= 笔记(g/<id>.jpg,真实投稿用广场图)、?t= 话题(g/t-<id>.jpg)、?c=ceshi 测试列表、其余广场首页;见 js/share-card.js */
|
||||
if (window.mbShareWatch) window.mbShareWatch(function () {
|
||||
var q = new URLSearchParams(location.search), n = NBY[q.get('n')], t = TBY[q.get('t')];
|
||||
if (n && n.pin) return ['../assets/share/g/home.jpg', '孕妈悄悄话|每一颗星星,都是一位孕妈对宝宝说的一句话']; /* 11-07 置顶笔记暂用广场首页图 */
|
||||
if (n && n.pin) return ['../assets/share/g/home.jpg', '孕妈悄悄话|每颗星星,都是一个妈妈想对宝宝说的话']; /* 11-07 置顶笔记暂用广场首页图 */
|
||||
if (n) return n.real ? ['../assets/share/g/home.jpg', n.title] : ['../assets/share/g/' + n.id + '.jpg', n.title];
|
||||
if (t) return ['../assets/share/g/t-' + t.id + '.jpg', '#' + t.name + '#'];
|
||||
if (q.get('c') === 'ceshi') return ['../assets/share/g/ceshi.jpg', '趣味小测试|30 个孕育小测试,1 分钟测出你是哪种孕妈'];
|
||||
|
||||
10
index.html
10
index.html
@@ -9,17 +9,17 @@
|
||||
<title>兜爸心选 · 孕育陪伴</title>
|
||||
<!-- 11-04 UGC 总开关(孕妈广场 + 测一测,后台 /box_bm/plaza 顶部切换),见 js/ugc.js -->
|
||||
<script src="js/ugc.js?v=26110487"></script>
|
||||
<!-- V:26110616 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
||||
<!-- V:26110618 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
||||
<link rel="stylesheet" href="mama-box.css">
|
||||
<link rel="stylesheet" href="night.css?v=26110608">
|
||||
<link rel="stylesheet" href="js/wh-cm.css?v=26110616">
|
||||
<link rel="stylesheet" href="js/wh-cm.css?v=26110618">
|
||||
<!-- 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=26110616"></script>
|
||||
<script src="js/login-gate.js?v=26110618"></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 */
|
||||
@@ -2476,7 +2476,7 @@ html.night .rs-pan .rp-card{background:rgba(255,255,255,.06);border-color:rgba(2
|
||||
<button class="whv-all" id="whvAll" type="button">全部</button>
|
||||
</header>
|
||||
<div class="wsk-title" id="wskTitle"></div>
|
||||
<p class="wsk-tip" id="wskTip"><i></i>点一下小星星,听听她们说了什么</p>
|
||||
<p class="wsk-tip" id="wskTip"><i></i>点一下星星,看看她说了啥</p>
|
||||
<div class="wsk-done" id="wskDone"><p>星星都落下来啦<br><span>她们的话,你都听到了</span></p><button type="button" id="wskBack">让星星回来</button></div>
|
||||
<div class="wsc" id="wsc" aria-live="polite"></div>
|
||||
<h2 class="sr-only" id="whpTitle">同孕周悄悄话</h2>
|
||||
@@ -2680,7 +2680,7 @@ html.night .rs-pan .rp-card{background:rgba(255,255,255,.06);border-color:rgba(2
|
||||
<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=26110609"></script>
|
||||
<script src="js/wh-cm.js?v=26110617" defer></script>
|
||||
<script src="js/wh-cm.js?v=26110618" defer></script>
|
||||
<script src="js/app.js"></script>
|
||||
<script src="js/kit.js?v=26110605"></script>
|
||||
<!-- 11-05 用户:孕期百问加上跟趣味小测试一样的底部 Tab(孕期百问 / 记一下 / 返回首页)。挂在 #detailQA 里,面板关着时跟着滑出屏外;
|
||||
|
||||
29
js/app.js
29
js/app.js
@@ -3,7 +3,7 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
|
||||
var VER = '26110616';
|
||||
var VER = '26110618';
|
||||
const $ = (s, c) => (c || document).querySelector(s);
|
||||
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
|
||||
|
||||
@@ -4565,6 +4565,7 @@
|
||||
m.el.remove();
|
||||
m.btn.classList.remove('flare', 'gone');
|
||||
m.btn.classList.add('used');
|
||||
reborn(m.btn);
|
||||
mts.delete(m.i);
|
||||
if (done) paintCard(m.it, m.i);
|
||||
checkDone();
|
||||
@@ -4575,8 +4576,20 @@
|
||||
· 声音用 WebAudio 现合成,不加载音频文件:点星 = 一声随机五声音阶的「叮」(连点几颗像在弹琴),
|
||||
唰出去 = 一道由低到高的风声;右上角喇叭可关,记在本地。 */
|
||||
function checkDone() {
|
||||
const all = $$('.wsk-st', page);
|
||||
$('#wskDone').classList.toggle('show', all.length > 0 && all.every(b => b.classList.contains('used')) && !mts.size);
|
||||
/* 11-07 用户:点完不要整片星空都空掉 —— 星星会再冒出来(reborn),「星星都落下来啦」不再出现 */
|
||||
$('#wskDone').classList.remove('show');
|
||||
}
|
||||
/* 11-07 用户:「星星跑掉了,过一会儿还有其他星星出来,相当于其他妈妈说的话能出来,而不是都点完之后整个星空就不能点了」
|
||||
划走的星 8~16 秒后换个位置重新亮起来(同一句话;整片夜空一直有星可点) */
|
||||
function reborn(btn) {
|
||||
setTimeout(() => {
|
||||
if (!btn.isConnected || !btn.classList.contains('used')) return;
|
||||
btn.style.left = (36 + Math.random() * 58).toFixed(1) + '%';
|
||||
btn.style.top = (21 + Math.random() * 38).toFixed(1) + '%';
|
||||
btn.classList.remove('used', 'cur', 'flare', 'gone');
|
||||
btn.classList.add('born');
|
||||
setTimeout(() => btn.classList.remove('born'), 1500);
|
||||
}, 8000 + Math.random() * 8000);
|
||||
}
|
||||
const SND = 'mmbox.whsnd.v1';
|
||||
let actx = null, sndOn = true;
|
||||
@@ -4686,7 +4699,7 @@
|
||||
const btn = $('.wsk-st[data-go="' + i + '"]', page);
|
||||
if (!btn) { paintCard(it, i); return; }
|
||||
btn.classList.add('cur');
|
||||
if (RM) { btn.classList.add('used'); paintCard(it, i); checkDone(); return; }
|
||||
if (RM) { btn.classList.add('used'); reborn(btn); paintCard(it, i); checkDone(); return; }
|
||||
const pr = page.getBoundingClientRect(), br = btn.getBoundingClientRect();
|
||||
const x0 = br.left + br.width / 2 - pr.left, y0 = br.top + br.height / 2 - pr.top;
|
||||
/* 瞄准左下(屏幕左边外、六成高处):越靠左起步角度越陡,保证在屏幕里拖得够长 */
|
||||
@@ -4768,7 +4781,7 @@
|
||||
/* 2026-10-02 用户:「每个星星都是孕妈的一句话,类似这个感觉,替换掉今晚多少句悄悄话」→ 标题不再报条数 */
|
||||
/* 2026-10-02 用户:上半部分文字太占地方、挡住星星 → 标题收成一行,话题做成一行小胶囊;副标题去掉,话题说明挪进写悄悄话弹窗 */
|
||||
const th = theme();
|
||||
$('#wskTitle').innerHTML = '<div class="wsk-t">每一颗星星,都是<b>一位孕妈</b>的一句话</div>' +
|
||||
$('#wskTitle').innerHTML = '<div class="wsk-t">每颗星星,都是<b>一个妈妈</b>说的话</div>' +
|
||||
(th ? '<div class="wsk-topic"><em>本周话题</em><b>' + esc(th.name) + '</b></div>' : '<p>' + (night ? '今晚' : '今天') + ',她们和你一样在等宝宝来</p>');
|
||||
$('#whSay').firstElementChild.textContent = th && th.say ? th.say : '说一句悄悄话';
|
||||
paintDeco();
|
||||
@@ -4776,7 +4789,7 @@
|
||||
paintList(l);
|
||||
if (cur && list()[cur - 1]) $$('.wsk-st[data-go="' + cur + '"]', page).forEach(x => x.classList.add('cur'));
|
||||
$('#whpLeft').textContent = !data ? '' : !oid() || !data.canPost ? '填好预产期,就能说一句' :
|
||||
window.MBWhCm ? '说的话先审核再公开,攒够 ' + MBWhCm.starLikes() + ' 个赞就挂上星星' : /* 11-07 悄悄话第 2 步:说一句 = 发进下面的留言区 */
|
||||
window.MBWhCm ? '先审核再公开,被赞 ' + MBWhCm.starLikes() + ' 次就变成星星' : /* 11-07 悄悄话第 2 步:说一句 = 发进下面的留言区 */
|
||||
data.left ? '今天还能说 ' + data.left + ' 句' : '今天的 3 句说完啦,明天再来';
|
||||
}
|
||||
function drawer(on) {
|
||||
@@ -4928,7 +4941,7 @@
|
||||
ta.placeholder = th && th.ph ? th.ph : '今天想对谁说点什么?';
|
||||
$('#whPresets').innerHTML = ((th && th.presets && th.presets.length) ? th.presets : (data.presets || [])).map(t => '<button class="wh-pre" type="button">' + esc(t) + '</button>').join('');
|
||||
$('#whLeft').textContent = window.MBWhCm ? '' : '今天还能说 ' + data.left + ' 句';
|
||||
if (window.MBWhCm) { $('#whMLead').textContent = '发出后先审核,通过了会出现在星空下面的留言区;攒够 ' + MBWhCm.starLikes() + ' 个赞,就会挂到星空上,同孕期的妈妈都能点到。'; }
|
||||
if (window.MBWhCm) { $('#whMLead').textContent = '发出去先审核,通过了大家就能在留言里看到。被赞够 ' + MBWhCm.starLikes() + ' 次,它会变成天上的一颗星星,同孕周的妈妈都点得到。'; }
|
||||
openModal('modalWhisper');
|
||||
});
|
||||
$('#whPresets').addEventListener('click', e => {
|
||||
@@ -4949,7 +4962,7 @@
|
||||
/* 11-07 悄悄话第 2 步(用户定):星空页「说一句」并入留言区 —— 发成置顶笔记下的留言(先审后发),赞够门槛自动挂星 */
|
||||
if (window.MBWhCm) {
|
||||
MBWhCm.post(t, data.week)
|
||||
.then(m => { if (m) { toast(m); return; } closeModal(); toast('发出去啦,审核通过后会出现在留言区'); })
|
||||
.then(m => { if (m) { toast(m); return; } closeModal(); toast('发出去了,审核通过后大家就能看到'); })
|
||||
.then(() => { busy = false; btn.disabled = false; btn.textContent = '悄悄发出'; });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -108,11 +108,11 @@
|
||||
var REC = ['taidong', 'yunqitizhong', 'yun', 'yunqixuetang', 'gongsuopinlv', 'taierguzhong', 'chanjianrili', 'bushui']
|
||||
.map(function (t) { return '#htGrid .tg[data-tool="' + t + '"]'; }).join(',');
|
||||
var SEL = {
|
||||
home: REC + ',#vitals .vt-it,.tab-fab,.fab,.fab-w,#htEdit,.tg-add,#homeExchMod,#meExchCard,#meExchGo,#meExchOrders,#bbBanner,[data-modal="modalProfile"],[data-modal="modalWhisper"],#bfMe,.preg-card,#whSay,[data-hug],[data-wcl]',
|
||||
home: REC + ',#vitals .vt-it,.tab-fab,.fab,.fab-w,#htEdit,.tg-add,#homeExchMod,#meExchCard,#meExchGo,#meExchOrders,#bbBanner,[data-modal="modalProfile"],[data-modal="modalWhisper"],#bfMe,.preg-card,#whSay,[data-hug],[data-wcl],[data-wrp],#wcsSend',
|
||||
plaza: '#blk,#bfv,#csend,#cpic,#cemo,#cpOk,[data-like],[data-cl],[data-rk],#cmgo,[data-write],[data-mywrite],#tabRec',
|
||||
topic: '.tc-lk,.tc-go,.tc-in .pic-b,.tc-in .emo-b'
|
||||
};
|
||||
var IN = { plaza: '#cin', topic: '.tc-in textarea' };
|
||||
var IN = { home: '#wcsIn', plaza: '#cin', topic: '.tc-in textarea' };
|
||||
function page() {
|
||||
if (document.getElementById('homeBody')) return 'home';
|
||||
if (document.getElementById('wf')) return 'plaza';
|
||||
|
||||
85
js/wh-cm.css
85
js/wh-cm.css
@@ -1,19 +1,41 @@
|
||||
/* 星空页 · 妈妈们的留言(2026-11-07,js/wh-cm.js):深靛紫玻璃,跟星空一个色系,不用白底 */
|
||||
.wcm{position:absolute;inset:0;z-index:4;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:none;-webkit-overflow-scrolling:touch}
|
||||
.wcm::-webkit-scrollbar{display:none}
|
||||
.wcm-sp{height:calc(100% - 158px - env(safe-area-inset-bottom))}
|
||||
.wcm-in{position:relative;min-height:calc(100% - 60px);padding-bottom:calc(24px + env(safe-area-inset-bottom));
|
||||
background:linear-gradient(180deg,rgba(28,22,52,0) 0,rgba(28,22,52,.9) 56px,rgba(26,20,48,.97) 150px,#1E1838 100%)}
|
||||
.wcm .whp-bar{position:relative;left:auto;right:auto;bottom:auto;padding:22px 24px 4px;background:none}
|
||||
.wcm-hd{display:flex;align-items:baseline;gap:8px;margin:14px 18px 6px;color:#F4ECFF}
|
||||
.wcm-hd b{font-size:15px;font-weight:800;letter-spacing:1px}
|
||||
.wcm-hd span{font-size:12px;color:rgba(232,222,255,.5)}
|
||||
.wcm-up{margin-left:auto;font-style:normal;font-size:11.5px;color:rgba(255,214,170,.75);transition:opacity .3s}
|
||||
.wcm-up::after{content:"";display:inline-block;width:6px;height:6px;margin-left:5px;border:solid currentColor;border-width:1.5px 0 0 1.5px;transform:translateY(1px) rotate(45deg)}
|
||||
.wcm.up .wcm-up{opacity:0}
|
||||
.wcm-ls{padding:0 12px}
|
||||
.wcm-e{margin:18px 0;text-align:center;font-size:12.5px;color:rgba(232,222,255,.45)}
|
||||
.wcm-it{display:flex;gap:10px;margin-top:8px;padding:12px 10px 12px 12px;border-radius:16px;
|
||||
/* 星空页 · 妈妈们的留言(2026-11-07,js/wh-cm.js)
|
||||
二改:从「整页上滑盖住星空」改成半屏面板 —— 最高 68%,上面始终露出星空;深靛紫玻璃,跟星空一个色系 */
|
||||
|
||||
/* 入口:「说一句」下面一条 */
|
||||
.wcm-go{display:flex;align-items:center;gap:8px;width:100%;margin:10px 0 0;height:44px;padding:0 14px 0 10px;border:0;border-radius:14px;font:inherit;color:#F4ECFF;text-align:left;
|
||||
background:linear-gradient(135deg,rgba(255,255,255,.12),rgba(255,255,255,.05));box-shadow:inset 0 0 0 1px rgba(255,255,255,.12)}
|
||||
.wcm-go:active{transform:scale(.985)}
|
||||
.wcm-go-av{display:flex;flex:none}
|
||||
.wcm-go-av img{width:24px;height:24px;border-radius:50%;object-fit:cover;box-shadow:0 0 0 1.5px #2A1F48;background:#3A2F5E}
|
||||
.wcm-go-av img+img{margin-left:-7px}
|
||||
.wcm-go-t{flex:1;min-width:0;font-size:14px;font-weight:700}
|
||||
.wcm-go-t em{margin-left:6px;font-style:normal;font-size:12px;font-weight:400;color:rgba(232,222,255,.55)}
|
||||
.wcm-go-up{flex:none;width:8px;height:8px;margin-top:4px;border:solid #FFD9B8;border-width:2px 0 0 2px;transform:rotate(45deg);animation:wcmUp 1.6s ease-in-out infinite}
|
||||
@keyframes wcmUp{50%{transform:translateY(-3px) rotate(45deg)}}
|
||||
.wh-page .whp-left{margin-top:7px}
|
||||
/* 入口占了一行,流星内容卡往上让一让 */
|
||||
.wh-page .wsc{bottom:calc(150px + env(safe-area-inset-bottom))}
|
||||
/* 原来的「全部」抽屉不用了 */
|
||||
.wh-page .whd{display:none}
|
||||
|
||||
/* 半屏面板 */
|
||||
.wcs{position:absolute;inset:0;z-index:8;background:rgba(10,6,24,0);visibility:hidden;transition:background .3s,visibility .3s}
|
||||
.wcs.show{visibility:visible;background:rgba(10,6,24,.32)}
|
||||
.wcs-p{position:absolute;left:0;right:0;bottom:0;height:68%;display:flex;flex-direction:column;border-radius:22px 22px 0 0;color:#F4ECFF;
|
||||
background:linear-gradient(#2A1F48,#1E1634);box-shadow:0 -10px 40px rgba(0,0,0,.4);transform:translateY(110%);transition:transform .35s cubic-bezier(.2,.8,.2,1)}
|
||||
.wcs-hd{flex:none;padding:8px 0 6px;touch-action:none}
|
||||
.wcs-grab{display:block;width:38px;height:4px;margin:0 auto 8px;border-radius:2px;background:rgba(255,255,255,.28)}
|
||||
.wcs-tt{display:flex;align-items:baseline;gap:8px;padding:0 16px 0 18px}
|
||||
.wcs-tt b{font-size:16px;font-weight:800;letter-spacing:.5px}
|
||||
.wcs-tt span{font-size:12px;color:rgba(232,222,255,.5)}
|
||||
.wcs-x{margin-left:auto;align-self:center;display:grid;place-items:center;width:28px;height:28px;border:0;border-radius:50%;background:rgba(255,255,255,.1);color:#fff}
|
||||
.wcm-tb{display:flex;align-items:center;gap:6px;margin:10px 18px 2px}
|
||||
.wcm-tb button{height:26px;padding:0 12px;border-radius:99px;border:0;background:rgba(255,255,255,.07);color:rgba(232,222,255,.62);font:inherit;font-size:12.5px}
|
||||
.wcm-tb button.on{background:linear-gradient(135deg,rgba(255,214,170,.92),rgba(255,170,160,.92));color:#3A2312;font-weight:800}
|
||||
.wcm-rule{margin-left:auto;font-size:11px;color:rgba(232,222,255,.42)}
|
||||
.wcs-ls{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:0 12px 14px}
|
||||
.wcm-e{margin:24px 0;text-align:center;font-size:12.5px;color:rgba(232,222,255,.45)}
|
||||
.wcm-it{display:flex;gap:10px;margin-top:8px;padding:12px 10px 10px 12px;border-radius:16px;
|
||||
background:linear-gradient(140deg,rgba(255,255,255,.075),rgba(255,255,255,.03));box-shadow:inset 0 0 0 1px rgba(255,255,255,.07)}
|
||||
.wcm-av{flex:none;width:32px;height:32px;border-radius:50%;object-fit:cover;background:#3A2F5E;box-shadow:0 0 0 1.5px rgba(255,220,180,.35)}
|
||||
.wcm-bd{flex:1;min-width:0}
|
||||
@@ -25,22 +47,29 @@
|
||||
.wcm-rp p{margin:0;font-size:12.5px;line-height:1.55;color:rgba(242,236,250,.78)}
|
||||
.wcm-rp p+p{margin-top:4px}
|
||||
.wcm-rp b{font-weight:700;color:#C9B8FF}
|
||||
.wcm-rp p.me b:first-child{color:#FFD9B8}
|
||||
.wcm-re{margin-top:6px;padding:2px 0;border:0;background:none;font:inherit;font-size:12px;color:rgba(232,222,255,.5)}
|
||||
.wcm-star{display:inline-flex;align-items:center;gap:4px;margin:6px 0 0;padding:2px 8px 2px 6px;border-radius:99px;font-size:11px;font-weight:700;color:#FFE2B8;
|
||||
background:linear-gradient(135deg,rgba(122,79,214,.55),rgba(90,59,170,.35));box-shadow:0 0 10px rgba(255,214,170,.25)}
|
||||
.wcm-star svg{width:10px;height:10px;fill:currentColor}
|
||||
.wcm-lk{flex:none;align-self:flex-start;display:flex;flex-direction:column;align-items:center;gap:1px;min-width:32px;padding:2px 0;border:0;background:none;font:inherit;color:rgba(232,222,255,.5)}
|
||||
.wcm-lk svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;transition:transform .2s}
|
||||
.wcm-lk span{font-size:11px}
|
||||
.wcm-lk.on{color:#FF8FA6}.wcm-lk.on svg{fill:currentColor;transform:scale(1.12)}
|
||||
.wcm-more{display:block;margin:14px auto 0;height:34px;padding:0 22px;border-radius:99px;border:1px solid rgba(255,220,180,.35);background:rgba(255,255,255,.05);color:#FFD9B8;font:inherit;font-size:13px}
|
||||
.wcm-more[hidden]{display:none}
|
||||
/* 内容卡 / 落完提示往上让一让,别被留言面板顶住 */
|
||||
.wh-page .wsc{bottom:calc(172px + env(safe-area-inset-bottom))}
|
||||
/* 11-07 第 2 步:最热 / 最新 / 同孕周 + 挂星标记 */
|
||||
.wcm-tb{display:flex;align-items:center;gap:6px;margin:0 18px 4px}
|
||||
.wcm-tb button{height:26px;padding:0 12px;border-radius:99px;border:0;background:rgba(255,255,255,.07);color:rgba(232,222,255,.62);font:inherit;font-size:12.5px}
|
||||
.wcm-tb button.on{background:linear-gradient(135deg,rgba(255,214,170,.92),rgba(255,170,160,.92));color:#3A2312;font-weight:800}
|
||||
.wcm-rule{margin-left:auto;font-size:11px;color:rgba(232,222,255,.42)}
|
||||
.wcm-star{display:inline-flex;align-items:center;gap:4px;margin:6px 0 0;padding:2px 8px 2px 6px;border-radius:99px;font-size:11px;font-weight:700;color:#FFE2B8;
|
||||
background:linear-gradient(135deg,rgba(122,79,214,.55),rgba(90,59,170,.35));box-shadow:0 0 10px rgba(255,214,170,.25)}
|
||||
.wcm-star svg{width:10px;height:10px;fill:currentColor}
|
||||
.wcm-lk.me{opacity:.7}
|
||||
.wcm-lk.pop svg{animation:wcmPop .45s ease}
|
||||
@keyframes wcmPop{40%{transform:scale(1.45)}100%{transform:scale(1.12)}}
|
||||
.wcm-more{display:block;margin:14px auto 0;height:34px;padding:0 22px;border-radius:99px;border:1px solid rgba(255,220,180,.35);background:rgba(255,255,255,.05);color:#FFD9B8;font:inherit;font-size:13px}
|
||||
.wcm-more[hidden]{display:none}
|
||||
/* 底部输入框:发新留言 / 回复某一楼 */
|
||||
.wcs-in{flex:none;display:flex;align-items:center;gap:8px;padding:8px 12px calc(8px + env(safe-area-inset-bottom));border-top:1px solid rgba(255,255,255,.08);background:#1E1634}
|
||||
.wcs-to{flex:none;max-width:7em;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:12px;color:#FFD9B8}
|
||||
.wcs-to[hidden]{display:none}
|
||||
.wcs-in input{flex:1;min-width:0;height:36px;padding:0 14px;border:0;border-radius:99px;background:rgba(255,255,255,.09);color:#fff;font:inherit;font-size:14px;outline:none}
|
||||
.wcs-in input::placeholder{color:rgba(232,222,255,.4)}
|
||||
.wcs-in button{flex:none;height:34px;padding:0 14px;border:0;border-radius:99px;background:linear-gradient(135deg,#FFD6AA,#FFAAA0);color:#3A2312;font:inherit;font-size:13.5px;font-weight:800}
|
||||
.wcs-in button:disabled{opacity:.5}
|
||||
|
||||
/* 星星点完会再冒出来(app.js reborn) */
|
||||
.wsk-st.born i{animation:wskBorn 1.4s ease-out both}
|
||||
@keyframes wskBorn{0%{opacity:0;transform:scale(.2)}60%{opacity:1;transform:scale(1.35)}100%{opacity:1;transform:none}}
|
||||
|
||||
280
js/wh-cm.js
280
js/wh-cm.js
@@ -1,28 +1,43 @@
|
||||
/* 星空页 · 妈妈们的留言(2026-11-07 用户:广场点「孕妈悄悄话」直接进星空页,留言自带在「说一句悄悄话」下面,
|
||||
样式跟星空搭,不要白底)。
|
||||
· 版式:#wcm 盖满星空页、自己滚动;上面一段透明垫高,下面是留言面板,
|
||||
把原来的 .whp-bar(说一句悄悄话)挪进面板顶上,往上滑留言就盖上来。
|
||||
/* 星空页 · 妈妈们的留言(2026-11-07)
|
||||
· 二改(用户:「往下滑评论就挡住整个背景,不好;改成点『全部』那种半弹窗,最多拉到 2/3,一定留出一块星空;
|
||||
首页要有个明显入口,别只放右上角『全部』」):
|
||||
「说一句」按钮下面一条入口 → 半屏面板(先开到半屏,拖把手 / 往上划能拉到 2/3,再往上就不动了;往下拖关掉)。
|
||||
面板里自己滚动看全部留言。右上角「全部」也打开这个面板(原来那个只列悄悄话的抽屉不用了)。
|
||||
· 数据:广场置顶笔记 wh-<话题 from> 的评论 = cm.json 模拟(AGENTS.md 12c,不得挂星)+ /plaza/comments 已审核通过的真实评论
|
||||
+ 我自己发的(含审核中)。进星空页才拉 cm.json(600K+,gzip 后小很多;版本号跟广场 index.html 引的一致,共用缓存)。
|
||||
· 11-07 第 2 步:真实留言的赞走服务端(POST /plaza/comment/like,每人每条一次、不能赞自己),赞够 starLikes(后台可改,先 3)
|
||||
自动挂到星空,挂上的标「已挂上星星」;模拟留言的赞只记本机 mmbox.whcm.v1(模拟的永远不挂星)。
|
||||
最热 / 最新 / 同孕周 三种看法;星空页「说一句」发的话也进这里(window.MBWhCm.post,app.js 调),先审后发。 */
|
||||
+ 我自己发的(含审核中)。打开星空页才拉 cm.json(版本号跟广场 index.html 引的一致,共用缓存)。
|
||||
· 真实留言的赞走服务端(POST /plaza/comment/like,每人每条一次、不能赞自己),赞够 starLikes(后台可改,先 3)自动挂星;
|
||||
模拟留言的赞只记本机 mmbox.whcm.v1。最热 / 最新 / 同孕周 三种看法。
|
||||
· 三改(用户:「我不能给别人的留言回复」):点留言上的「回复」→ 底部输入框回复那一楼(先审后发);
|
||||
底部输入框不点「回复」时就是发一条新留言。楼的 key 同广场:模拟 = wh-xxx#序号,真实 = r:<id>。
|
||||
· 星空页「说一句」发的话也进这里(window.MBWhCm.post,app.js 调)。 */
|
||||
(function () {
|
||||
var page = document.getElementById('whPage'), bar = page && page.querySelector('.whp-bar');
|
||||
if (!page || !bar || !window.MB_WH_THEME) return;
|
||||
var TH = MB_WH_THEME(), PID = 'wh-' + TH.from.replace(/-/g, '');
|
||||
var esc = function (s) { return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]; }); };
|
||||
var m = ((location.hash || '') + '&').match(/[#&]openid=([^&]*)/), OID = m ? decodeURIComponent(m[1]) : '';
|
||||
var HEART = '<svg viewBox="0 0 24 24"><path d="M12 20.5s-7.5-4.6-7.5-10.2A4.3 4.3 0 0112 7.6a4.3 4.3 0 017.5 2.7c0 5.6-7.5 10.2-7.5 10.2z"/></svg>';
|
||||
|
||||
var box = document.createElement('div');
|
||||
box.className = 'wcm'; box.id = 'wcm';
|
||||
box.innerHTML = '<div class="wcm-sp" aria-hidden="true"></div><div class="wcm-in"><div class="wcm-hd"><b>妈妈们的留言</b><span id="wcmN"></span><i class="wcm-up">上滑看看</i></div>' +
|
||||
/* 入口:「说一句」下面一条,带几个头像 + 条数,看得出能点 */
|
||||
var go = document.createElement('button');
|
||||
go.type = 'button'; go.className = 'wcm-go'; go.id = 'wcmGo';
|
||||
go.innerHTML = '<span class="wcm-go-av" id="wcmGoAv"></span><span class="wcm-go-t">看看大家说了啥<em id="wcmGoN"></em></span><i class="wcm-go-up" aria-hidden="true"></i>';
|
||||
bar.appendChild(go);
|
||||
|
||||
/* 半屏面板 */
|
||||
var sh = document.createElement('div');
|
||||
sh.className = 'wcs'; sh.id = 'wcs'; sh.setAttribute('aria-hidden', 'true');
|
||||
sh.innerHTML = '<div class="wcs-p" role="dialog" aria-label="妈妈们的留言">' +
|
||||
'<div class="wcs-hd"><i class="wcs-grab" aria-hidden="true"></i><div class="wcs-tt"><b>妈妈们的留言</b><span id="wcmN"></span>' +
|
||||
'<button type="button" class="wcs-x" aria-label="收起"><svg viewBox="0 0 24 24" width="14" height="14"><path d="M6 6l12 12M18 6L6 18" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"/></svg></button></div>' +
|
||||
'<div class="wcm-tb" role="tablist"><button type="button" class="on" data-wso="hot">最热</button><button type="button" data-wso="new">最新</button><button type="button" data-wso="wk">同孕周</button>' +
|
||||
'<span class="wcm-rule" id="wcmRule"></span></div>' +
|
||||
'<div class="wcm-ls" id="wcmLs"><p class="wcm-e">留言加载中…</p></div><button type="button" class="wcm-more" id="wcmMore" hidden>再看看</button></div>';
|
||||
box.querySelector('.wcm-in').insertBefore(bar, box.querySelector('.wcm-hd'));
|
||||
page.appendChild(box);
|
||||
var ls = box.querySelector('#wcmLs'), more = box.querySelector('#wcmMore');
|
||||
'<span class="wcm-rule" id="wcmRule"></span></div></div>' +
|
||||
'<div class="wcs-ls" id="wcsLs"><div id="wcmLs"><p class="wcm-e">留言加载中…</p></div><button type="button" class="wcm-more" id="wcmMore" hidden>再看看</button></div>' +
|
||||
'<div class="wcs-in"><span class="wcs-to" id="wcsTo" hidden></span><input id="wcsIn" type="text" maxlength="200" enterkeyhint="send" placeholder="说点什么…"><button type="button" id="wcsSend">发送</button></div>' +
|
||||
'</div>';
|
||||
page.appendChild(sh);
|
||||
var P = sh.querySelector('.wcs-p'), lsBox = sh.querySelector('#wcsLs'), ls = sh.querySelector('#wcmLs'), more = sh.querySelector('#wcmMore');
|
||||
var inp = sh.querySelector('#wcsIn'), toEl = sh.querySelector('#wcsTo'), sendB = sh.querySelector('#wcsSend');
|
||||
|
||||
var LK = 'mmbox.whcm.v1', LIKE = {};
|
||||
try { LIKE = JSON.parse(localStorage.getItem(LK) || '{}') || {}; } catch (e) {}
|
||||
@@ -34,37 +49,46 @@
|
||||
if (d < 86400) return Math.round(d / 3600) + ' 小时前';
|
||||
var t = new Date(ts + 8 * 3600e3); return (t.getUTCMonth() + 1) + '-' + t.getUTCDate();
|
||||
};
|
||||
var tT;
|
||||
function toast(t) { var x = document.getElementById('toast'); if (!x) return; x.textContent = t; x.classList.add('show'); clearTimeout(tT); tT = setTimeout(function () { x.classList.remove('show'); }, 1800); }
|
||||
|
||||
var SIM = null, REAL = null, ALL = [], shown = 0, loading = false, SORT = 'hot', STAR_N = 3;
|
||||
/* ---------- 数据 ---------- */
|
||||
var SIM = null, REAL = null, RREP = [], ALL = [], shown = 0, loading = false, SORT = 'hot', STAR_N = 3;
|
||||
var top = function (c) { return !c.parent; };
|
||||
function realOf(c) {
|
||||
return { key: 'r:' + c.id, id: c.id, real: 1, n: c.nickname || '孕妈', av: c.avatar || 'assets/img/mom/k01.jpg', s: c.stage, t: c.text,
|
||||
likes: c.likes || 0, liked: !!c.liked, star: !!c.star, ts: c.at, r: [] };
|
||||
}
|
||||
function repOf(c, me) { return { p: c.parent, n: me ? '我' : (c.nickname || '孕妈'), me: me, to: c.parentName, t: c.text, ts: c.at, st: me ? c.status : '' }; }
|
||||
function load() {
|
||||
if (loading || SIM) return; loading = true;
|
||||
fetch('guangchang/cm.json?v=26110612').then(function (r) { return r.json(); }).then(function (j) {
|
||||
var P = j.p;
|
||||
fetch('guangchang/cm.json?v=26110618').then(function (r) { return r.json(); }).then(function (j) {
|
||||
var PP = j.p;
|
||||
SIM = (j.c[PID] || []).map(function (c, k) {
|
||||
var p = P[c[0]];
|
||||
return { key: 's' + k, n: p[0], av: avP(p[1]), s: p[2], t: c[1], likes: c[2],
|
||||
r: c[3].map(function (x) { var q = x[0] < 0 ? null : P[x[0]]; return { n: q ? q[0] : '孕妈悄悄话', t: x[1] }; }) };
|
||||
var p = PP[c[0]];
|
||||
return { key: PID + '#' + k, n: p[0], av: avP(p[1]), s: p[2], t: c[1], likes: c[2],
|
||||
r: c[3].map(function (x) { var q = x[0] < 0 ? null : PP[x[0]]; return { n: q ? q[0] : '孕妈悄悄话', t: x[1] }; }) };
|
||||
});
|
||||
build();
|
||||
build(); paintGo();
|
||||
}).catch(function () { SIM = []; build(); });
|
||||
fetch('/api/mp/public/mama-box/plaza/comments?kind=post&target=' + encodeURIComponent(PID) + (OID ? '&openid=' + encodeURIComponent(OID) : ''))
|
||||
fetchReal();
|
||||
}
|
||||
function fetchReal() {
|
||||
return fetch('/api/mp/public/mama-box/plaza/comments?kind=post&target=' + encodeURIComponent(PID) + (OID ? '&openid=' + encodeURIComponent(OID) : ''))
|
||||
.then(function (r) { return r.json(); }).then(function (j) {
|
||||
var R = j && j.code === 200 && j.result || {};
|
||||
if (R.starLikes) STAR_N = R.starLikes;
|
||||
REAL = (R.list || []).filter(top).map(realOf).concat((R.mine || []).filter(function (c) { return top(c) && c.status !== 'rejected'; }).map(function (c) {
|
||||
var o = realOf(c); o.n = '我'; o.me = 1; o.st = c.status; return o; }));
|
||||
build();
|
||||
}).catch(function () { REAL = []; build(); });
|
||||
var mine = (R.mine || []).filter(function (c) { return c.status !== 'rejected'; });
|
||||
REAL = (R.list || []).filter(top).map(realOf).concat(mine.filter(top).map(function (c) { var o = realOf(c); o.n = '我'; o.me = 1; o.st = c.status; return o; }));
|
||||
RREP = (R.list || []).filter(function (c) { return !top(c); }).map(function (c) { return repOf(c, 0); })
|
||||
.concat(mine.filter(function (c) { return !top(c); }).map(function (c) { return repOf(c, 1); }));
|
||||
build(); paintGo();
|
||||
}).catch(function () { if (!REAL) { REAL = []; build(); } });
|
||||
}
|
||||
var top = function (c) { return !c.parent; };
|
||||
function realOf(c) {
|
||||
return { key: 'r' + c.id, id: c.id, real: 1, n: c.nickname || '孕妈', av: c.avatar || 'assets/img/mom/k01.jpg', s: c.stage, t: c.text,
|
||||
likes: c.likes || 0, liked: !!c.liked, star: !!c.star, ts: c.at, r: [] };
|
||||
}
|
||||
var wkOf = function (c) { var m = /孕\s*(\d+)\s*周/.exec(c.s || ''); return m ? +m[1] : 0; };
|
||||
var wkOf = function (c) { var x = /孕\s*(\d+)\s*周/.exec(c.s || ''); return x ? +x[1] : 0; };
|
||||
var likesOf = function (c) { return c.real ? c.likes : c.likes + (LIKE[c.key] ? 1 : 0); };
|
||||
var likedOf = function (c) { return c.real ? c.liked : !!LIKE[c.key]; };
|
||||
/* 最热:赞多的在前(挂了星的真实留言再往前提);最新:真实留言按时间,模拟的接在后面;同孕周:和我差 ±1 周的,按最热 */
|
||||
/* 最热:挂了星的在前,再按赞;最新:真实留言按时间,模拟的接在后面;同孕周:和我差 ±1 周的,按最热。我自己发的永远在最上面 */
|
||||
function sorted() {
|
||||
var mine = REAL.filter(function (c) { return c.me; }), rest = REAL.filter(function (c) { return !c.me; }).concat(SIM);
|
||||
var hot = function (a, b) { return (!!b.star - !!a.star) || (likesOf(b) - likesOf(a)); };
|
||||
@@ -76,37 +100,64 @@
|
||||
} else rest.sort(hot);
|
||||
return mine.sort(function (a, b) { return b.ts - a.ts; }).concat(rest);
|
||||
}
|
||||
function total() { return (REAL ? REAL.length : 0) + (SIM ? SIM.length : 0); }
|
||||
function paintGo() {
|
||||
var n = total();
|
||||
document.getElementById('wcmGoN').textContent = n ? n + ' 条' : '';
|
||||
var av = (SIM || []).slice(0, 3).map(function (c) { return '<img src="' + esc(c.av) + '" alt="">'; }).join('');
|
||||
document.getElementById('wcmGoAv').innerHTML = av;
|
||||
}
|
||||
function build() {
|
||||
if (!SIM || !REAL) return;
|
||||
ALL = sorted(); shown = 0; ls.innerHTML = '';
|
||||
document.getElementById('wcmN').textContent = (REAL.length + SIM.length) ? (REAL.length + SIM.length) + ' 条' : '';
|
||||
document.getElementById('wcmRule').textContent = '赞够 ' + STAR_N + ' 个挂上星星';
|
||||
document.getElementById('wcmN').textContent = total() ? total() + ' 条' : '';
|
||||
document.getElementById('wcmRule').textContent = '被赞 ' + STAR_N + ' 次就变成星星';
|
||||
if (!ALL.length) {
|
||||
ls.innerHTML = '<p class="wcm-e">' + (SORT === 'wk' ? (window.MB_WH_WEEK ? '同孕周的妈妈还没留言,说一句吧' : '填好预产期,就能看同孕周妈妈的留言') : '还没有留言') + '</p>';
|
||||
ls.innerHTML = '<p class="wcm-e">' + (SORT === 'wk' ? (window.MB_WH_WEEK ? '同孕周的妈妈还没留言,你先说一句吧' : '填好预产期,就能看同孕周妈妈说了啥') : '还没有人留言') + '</p>';
|
||||
more.hidden = true; return;
|
||||
}
|
||||
add(20);
|
||||
}
|
||||
function repsOf(c) {
|
||||
var x = c.r.slice();
|
||||
RREP.forEach(function (r) { if (r.p === c.key) x.push(r); });
|
||||
return x;
|
||||
}
|
||||
function item(c) {
|
||||
var on = likedOf(c);
|
||||
return '<div class="wcm-it"><img class="wcm-av" src="' + esc(c.av) + '" alt="" loading="lazy" onerror="this.style.visibility=\'hidden\'">' +
|
||||
var on = likedOf(c), rp = repsOf(c);
|
||||
return '<div class="wcm-it" data-k="' + esc(c.key) + '"><img class="wcm-av" src="' + esc(c.av) + '" alt="" loading="lazy" onerror="this.style.visibility=\'hidden\'">' +
|
||||
'<div class="wcm-bd"><p class="wcm-nm"><b>' + esc(c.n) + '</b>' + (c.s ? '<span>' + esc(c.s) + '</span>' : '') + (c.ts ? '<span>' + ago(c.ts) + '</span>' : '') + '</p>' +
|
||||
'<p class="wcm-tx">' + esc(c.t) + '</p>' + (c.st === 'pending' ? '<p class="wcm-st">审核中 · 通过后大家才能看到</p>' : '') +
|
||||
(c.star ? '<p class="wcm-star"><svg viewBox="0 0 20 20"><path 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"/></svg>已挂上星星</p>' : '') +
|
||||
(c.r.length ? '<div class="wcm-rp">' + c.r.map(function (x) { return '<p><b>' + esc(x.n) + '</b>:' + esc(x.t) + '</p>'; }).join('') + '</div>' : '') + '</div>' +
|
||||
(c.me ? '<span class="wcm-lk me"><svg viewBox="0 0 24 24"><path d="M12 20.5s-7.5-4.6-7.5-10.2A4.3 4.3 0 0112 7.6a4.3 4.3 0 017.5 2.7c0 5.6-7.5 10.2-7.5 10.2z"/></svg><span>' + fmt(likesOf(c)) + '</span></span></div>' :
|
||||
'<button type="button" class="wcm-lk' + (on ? ' on' : '') + '" data-wcl="' + esc(c.key) + '" aria-label="赞"><svg viewBox="0 0 24 24"><path d="M12 20.5s-7.5-4.6-7.5-10.2A4.3 4.3 0 0112 7.6a4.3 4.3 0 017.5 2.7c0 5.6-7.5 10.2-7.5 10.2z"/></svg><span>' + fmt(likesOf(c)) + '</span></button></div>');
|
||||
'<p class="wcm-tx">' + esc(c.t) + '</p>' + (c.st === 'pending' ? '<p class="wcm-st">审核中,通过了大家才看得到</p>' : '') +
|
||||
(c.star ? '<p class="wcm-star"><svg viewBox="0 0 20 20"><path 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"/></svg>已经变成星星了</p>' : '') +
|
||||
(rp.length ? '<div class="wcm-rp">' + rp.map(function (x) {
|
||||
return '<p' + (x.me ? ' class="me"' : '') + '><b>' + esc(x.n) + '</b>' + (x.to && x.to !== c.n ? ' 回复 <b>' + esc(x.to) + '</b>' : '') + ':' + esc(x.t) +
|
||||
(x.st === 'pending' ? '<span class="wcm-st">(审核中)</span>' : '') + '</p>';
|
||||
}).join('') + '</div>' : '') +
|
||||
(c.me ? '' : '<button type="button" class="wcm-re" data-wrp="' + esc(c.key) + '">回复</button>') + '</div>' +
|
||||
(c.me ? '<span class="wcm-lk me">' + HEART + '<span>' + fmt(likesOf(c)) + '</span></span></div>' :
|
||||
'<button type="button" class="wcm-lk' + (on ? ' on' : '') + '" data-wcl="' + esc(c.key) + '" aria-label="赞">' + HEART + '<span>' + fmt(likesOf(c)) + '</span></button></div>');
|
||||
}
|
||||
function add(k) {
|
||||
ls.insertAdjacentHTML('beforeend', ALL.slice(shown, shown + k).map(item).join(''));
|
||||
shown = Math.min(ALL.length, shown + k); more.hidden = shown >= ALL.length;
|
||||
}
|
||||
function rerender(c) { var el = ls.querySelector('.wcm-it[data-k="' + CSS.escape(c.key) + '"]'); if (el) el.outerHTML = item(c); }
|
||||
more.addEventListener('click', function () { add(30); });
|
||||
/* 用首页同一个 #toast(app.js 的 toast 在闭包里拿不到,这里照它的写法) */
|
||||
var tT;
|
||||
function toast(t) { var x = document.getElementById('toast'); if (!x) return; x.textContent = t; x.classList.add('show'); clearTimeout(tT); tT = setTimeout(function () { x.classList.remove('show'); }, 1800); }
|
||||
|
||||
/* ---------- 点赞 / 回复 ---------- */
|
||||
function paintLk(b, c) { var on = likedOf(c); b.classList.toggle('on', on); b.querySelector('span').textContent = fmt(likesOf(c)); }
|
||||
var REPLY = null;
|
||||
function setReply(c) {
|
||||
REPLY = c;
|
||||
toEl.hidden = !c; toEl.textContent = c ? '回复 ' + c.n : '';
|
||||
inp.placeholder = c ? '回复 ' + c.n + '…' : '说点什么…';
|
||||
}
|
||||
ls.addEventListener('click', function (e) {
|
||||
var r = e.target.closest('[data-wrp]');
|
||||
if (r) {
|
||||
var rc = ALL.filter(function (x) { return x.key === r.dataset.wrp; })[0]; if (!rc) return;
|
||||
setReply(rc); snap('full'); inp.focus(); return;
|
||||
}
|
||||
var b = e.target.closest('[data-wcl]'); if (!b) return;
|
||||
var k = b.dataset.wcl, c = ALL.filter(function (x) { return x.key === k; })[0]; if (!c) return;
|
||||
if (!c.real) {
|
||||
@@ -121,49 +172,118 @@
|
||||
c.liked = true; c.likes++; paintLk(b, c); b.classList.add('pop'); setTimeout(function () { b.classList.remove('pop'); }, 500);
|
||||
if (navigator.vibrate) navigator.vibrate(8);
|
||||
fetch('/api/mp/public/mama-box/plaza/comment/like?openid=' + encodeURIComponent(OID) + '&id=' + encodeURIComponent(c.id), { method: 'POST' })
|
||||
.then(function (r) { return r.json(); }).then(function (j) {
|
||||
.then(function (x) { return x.json(); }).then(function (j) {
|
||||
if (!j || j.code !== 200) throw j;
|
||||
c.likes = j.result.likes; var was = c.star; c.star = !!j.result.star; paintLk(b, c);
|
||||
if (c.star && !was) { toast('这句被赞够 ' + STAR_N + ' 次,挂上星星啦'); var it = b.closest('.wcm-it'); if (it) it.outerHTML = item(c); }
|
||||
if (c.star && !was) { toast('被赞够 ' + STAR_N + ' 次,这句变成星星啦'); rerender(c); }
|
||||
}).catch(function (j) { c.liked = false; c.likes--; paintLk(b, c); toast((j && j.message) || '网络不太好,再点一次试试'); });
|
||||
});
|
||||
box.querySelector('.wcm-tb').addEventListener('click', function (e) {
|
||||
sh.querySelector('.wcm-tb').addEventListener('click', function (e) {
|
||||
var b = e.target.closest('[data-wso]'); if (!b || b.dataset.wso === SORT) return;
|
||||
SORT = b.dataset.wso;
|
||||
[].forEach.call(this.querySelectorAll('[data-wso]'), function (x) { x.classList.toggle('on', x === b); });
|
||||
build();
|
||||
build(); lsBox.scrollTop = 0;
|
||||
});
|
||||
|
||||
function post(text, week, reply) {
|
||||
if (!OID) return Promise.resolve('登录后就能留言啦');
|
||||
var body = { kind: 'post', target: PID, title: '孕妈悄悄话 · ' + TH.name, text: text, stage: week ? '孕 ' + week + ' 周' : '' };
|
||||
if (reply) { body.parent = reply.key; body.parentName = reply.n; }
|
||||
return fetch('/api/mp/public/mama-box/plaza/comment?openid=' + encodeURIComponent(OID), {
|
||||
method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body)
|
||||
}).then(function (r) { return r.json(); }).then(function (j) {
|
||||
if (!j || j.code !== 200 || !j.result) return (j && j.message) || '没发出去,再试一次';
|
||||
if (reply) { RREP.push(repOf(j.result, 1)); rerender(reply); }
|
||||
else {
|
||||
var o = realOf(j.result); o.n = '我'; o.me = 1; o.st = j.result.status;
|
||||
REAL = [o].concat(REAL || []);
|
||||
if (SIM) { build(); lsBox.scrollTop = 0; }
|
||||
paintGo();
|
||||
}
|
||||
return null;
|
||||
}).catch(function () { return '网络不太好,再试一次'; });
|
||||
}
|
||||
var busy = false;
|
||||
function send() {
|
||||
var t = inp.value.trim();
|
||||
if (t.length < 2) { toast('多写一两个字吧'); return; }
|
||||
if (busy) return; busy = true; sendB.disabled = true;
|
||||
post(t, +window.MB_WH_WEEK || 0, REPLY).then(function (msg) {
|
||||
busy = false; sendB.disabled = false;
|
||||
if (msg) { toast(msg); return; }
|
||||
inp.value = ''; inp.blur(); setReply(null);
|
||||
toast('发出去了,审核通过后大家就能看到');
|
||||
});
|
||||
}
|
||||
sendB.addEventListener('click', send);
|
||||
inp.addEventListener('keydown', function (e) { if (e.key === 'Enter') { e.preventDefault(); send(); } });
|
||||
|
||||
/* ---------- 半屏面板:开 / 关 / 拖 ----------
|
||||
面板高 = 星空页 68%(上面至少留 1/3 星空);half = 露出 50%,full = 露出 68%,再往上拉不动;往下拖过一半关掉 */
|
||||
var state = 'closed';
|
||||
function ph() { return page.clientHeight; }
|
||||
function H() { return P.offsetHeight; }
|
||||
function offFor(s) { return s === 'full' ? 0 : s === 'half' ? Math.max(0, H() - ph() * .5) : H() + 20; }
|
||||
function setY(y, anim) { P.style.transition = anim ? '' : 'none'; P.style.transform = 'translateY(' + y + 'px)'; }
|
||||
function snap(s) {
|
||||
state = s;
|
||||
sh.classList.toggle('show', s !== 'closed');
|
||||
sh.setAttribute('aria-hidden', s === 'closed' ? 'true' : 'false');
|
||||
setY(offFor(s), true);
|
||||
if (s === 'closed') { inp.blur(); setReply(null); }
|
||||
}
|
||||
function open() { load(); snap('half'); }
|
||||
go.addEventListener('click', open);
|
||||
sh.querySelector('.wcs-x').addEventListener('click', function () { snap('closed'); });
|
||||
sh.addEventListener('click', function (e) { if (e.target === sh) snap('closed'); });
|
||||
/* 右上角「全部」也开这个面板(原来那个只列悄悄话的抽屉不再用) */
|
||||
var all = document.getElementById('whvAll');
|
||||
if (all) all.addEventListener('click', function (e) { e.stopImmediatePropagation(); open(); }, true);
|
||||
/* 入口上往上划也能拉开 */
|
||||
var gy = null;
|
||||
go.addEventListener('touchstart', function (e) { gy = e.touches[0].clientY; }, { passive: true });
|
||||
go.addEventListener('touchmove', function (e) { if (gy != null && gy - e.touches[0].clientY > 24) { gy = null; open(); } }, { passive: true });
|
||||
/* 拖:抓把手 / 标题拖;列表在顶上时往下拖 = 拖面板;半屏时在列表上往上划 = 先把面板拉满 */
|
||||
var d0 = null;
|
||||
P.addEventListener('touchstart', function (e) {
|
||||
if (e.touches.length !== 1 || e.target.closest('.wcs-in')) return;
|
||||
d0 = { y: e.touches[0].clientY, base: offFor(state), hd: !!e.target.closest('.wcs-hd'), drag: false, t: Date.now() };
|
||||
}, { passive: true });
|
||||
P.addEventListener('touchmove', function (e) {
|
||||
if (!d0) return;
|
||||
var dy = e.touches[0].clientY - d0.y;
|
||||
if (!d0.drag) {
|
||||
if (Math.abs(dy) < 6) return;
|
||||
var canDown = dy > 0 && (d0.hd || lsBox.scrollTop <= 0);
|
||||
var canUp = dy < 0 && (d0.hd || state === 'half');
|
||||
if (!canDown && !canUp) { d0 = null; return; }
|
||||
d0.drag = true;
|
||||
}
|
||||
if (e.cancelable) e.preventDefault();
|
||||
setY(Math.min(H() + 20, Math.max(0, d0.base + dy)), false);
|
||||
}, { passive: false });
|
||||
P.addEventListener('touchend', function (e) {
|
||||
if (!d0) return;
|
||||
var dd = d0; d0 = null;
|
||||
if (!dd.drag) return;
|
||||
var dy = e.changedTouches[0].clientY - dd.y, y = dd.base + dy, v = dy / Math.max(1, Date.now() - dd.t);
|
||||
if (v > .6 || y > H() - ph() * .25) snap('closed');
|
||||
else if (v < -.4 || y < offFor('half') / 2) snap('full');
|
||||
else snap('half');
|
||||
});
|
||||
|
||||
/* 关掉星空页时面板一起收 */
|
||||
new MutationObserver(function () {
|
||||
if (page.classList.contains('show')) load(); else snap('closed');
|
||||
}).observe(page, { attributes: true, attributeFilter: ['class'] });
|
||||
if (page.classList.contains('show')) load();
|
||||
|
||||
/* 星空页「说一句」→ 发成留言(app.js 的 #whSend 调)。返回 Promise:resolve(null) = 成功,resolve('提示') = 没发出去 */
|
||||
window.MBWhCm = {
|
||||
starLikes: function () { return STAR_N; },
|
||||
post: function (text, week) {
|
||||
if (!OID) return Promise.resolve('登录后就能说一句啦');
|
||||
return fetch('/api/mp/public/mama-box/plaza/comment?openid=' + encodeURIComponent(OID), {
|
||||
method: 'POST', headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ kind: 'post', target: PID, title: '孕妈悄悄话 · ' + TH.name, text: text, stage: week ? '孕 ' + week + ' 周' : '' })
|
||||
}).then(function (r) { return r.json(); }).then(function (j) {
|
||||
if (!j || j.code !== 200 || !j.result) return (j && j.message) || '没发出去,再试一次';
|
||||
var o = realOf(j.result); o.n = '我'; o.me = 1; o.st = j.result.status;
|
||||
REAL = [o].concat(REAL || []);
|
||||
if (SIM) { build(); box.scrollTo({ top: box.querySelector('.wcm-hd').offsetTop + box.querySelector('.wcm-sp').offsetHeight - 80, behavior: 'smooth' }); }
|
||||
return null;
|
||||
}).catch(function () { return '网络不太好,再试一次'; });
|
||||
}
|
||||
return post(text, week, null).then(function (msg) { if (!msg) setTimeout(function () { snap('half'); }, 400); return msg; });
|
||||
},
|
||||
open: open
|
||||
};
|
||||
/* 11-07 用户:页面滑不动 —— 原来垫高层 pointer-events:none,手机上按在星空上滑,滚动不归 #wcm。
|
||||
现在整层都接触摸(按哪都能滑),点在垫高层上就把点击转给底下的星星 / 顶栏按钮 / 内容卡 */
|
||||
var sp = box.querySelector('.wcm-sp');
|
||||
sp.addEventListener('click', function (e) {
|
||||
box.style.pointerEvents = 'none';
|
||||
var el = document.elementFromPoint(e.clientX, e.clientY);
|
||||
box.style.pointerEvents = '';
|
||||
if (el && el !== sp && page.contains(el)) el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, clientX: e.clientX, clientY: e.clientY }));
|
||||
});
|
||||
/* 上滑过半:面板压暗星空的那层渐变加深,「上滑看看」收起 */
|
||||
box.addEventListener('scroll', function () { box.classList.toggle('up', box.scrollTop > 40); }, { passive: true });
|
||||
/* 进星空页才拉数据;关掉回到顶部 */
|
||||
new MutationObserver(function () {
|
||||
if (page.classList.contains('show')) load(); else { box.scrollTop = 0; box.classList.remove('up'); }
|
||||
}).observe(page, { attributes: true, attributeFilter: ['class'] });
|
||||
if (page.classList.contains('show')) load();
|
||||
})();
|
||||
|
||||
@@ -1,100 +1,100 @@
|
||||
豆豆,妈妈不求你多聪明,就希望你吃饭香、睡觉沉,别像我一样失眠
|
||||
宝宝你慢慢长,不着急,妈妈的肚子还能再撑撑||这句看哭了,我也想说不着急
|
||||
今天产检医生说你头朝下了,乖得很,就这样保持住哈
|
||||
你爸天天晚上对着肚子念三字经,你要是嫌吵就踢他一下,妈妈批准了||哈哈哈我家那位念的是英语单词||我家放的是相声
|
||||
小橘子,你出来以后先别哭,让妈妈好好看你一眼
|
||||
糖糖,等你来了,妈妈带你去看外婆家门口那棵柿子树,秋天可甜了
|
||||
今天你打嗝打了二十分钟,一跳一跳的,妈妈手放上去数着,数着数着就笑了
|
||||
不管你是男孩女孩,妈妈都已经把你的小衣服洗了三遍了||洗三遍太有画面了,我也是洗完又晒又叠
|
||||
希望你以后胆子大一点,敢举手回答问题,妈妈小时候一直不敢
|
||||
宝宝,谢谢你一直很稳,妈妈前三个月吐得昏天黑地也没怪过你
|
||||
你爸为了你戒烟了,这事他坚持了五个月,出来记得夸他
|
||||
小核桃,妈妈怕疼,但为了见你,不怕了
|
||||
等你会说话了,第一句叫爸爸也行,妈妈不跟他抢||嘴上说不抢,到时候肯定偷偷教叫妈妈哈哈
|
||||
每天晚上十点你准时开始动,跟上班打卡一样,以后作息也这么规律就好了
|
||||
宝宝,妈妈的预产期在冬天,你出来记得多穿点,咱家暖气不太好
|
||||
希望你健健康康的,别的都是附加题
|
||||
今天去买了一辆小推车,你爸推着在店里转了三圈,比你还兴奋
|
||||
你外婆已经给你织了第四件毛衣了,再不出来她要织到你上小学的了||外婆的爱都在毛衣里了
|
||||
宝宝,以后想哭就哭,妈妈不会说你不坚强
|
||||
安安,名字是你爸翻了一晚上字典定的,平平安安就够了
|
||||
今天B超看到你在吃手,小拳头塞嘴里,妈妈截图存了十几张
|
||||
妈妈以前挺爱熬夜的,为了你现在十一点前就睡了,你出来可别让我前功尽弃
|
||||
想跟你说,你来的时机刚刚好,不早也不晚
|
||||
等你长大了,想学什么就学什么,学钢琴学画画还是踢球,妈妈都送你去||踢球好,我家打算报游泳
|
||||
希望你遇到喜欢的人,也被人好好喜欢
|
||||
宝宝你最近踢得有点狠,妈妈的肋骨说它想请假
|
||||
小米粒,你是妈妈去年许的愿,今年就来了
|
||||
你在肚子里听到的第一首歌是妈妈跑调唱的小星星,出来别嫌弃||跑调的小星星最好听了
|
||||
今天孕检糖耐过了!为了你妈妈喝那瓶糖水差点吐出来
|
||||
不管以后成绩怎么样,回家都有热饭吃
|
||||
宝宝,妈妈和爸爸偶尔会吵架,但我们都很爱你,也很爱彼此
|
||||
等你出生的那天,爸爸说要请全公司喝奶茶
|
||||
希望你比妈妈勇敢一点,比爸爸细心一点
|
||||
妈妈第一次感觉到你动的时候,以为是肚子饿了,后来才知道是你在打招呼||哈哈我也是,还以为是肠子在动
|
||||
宝宝,你奶奶天天问你什么时候来,比我还急
|
||||
今天下雨,妈妈在窗边坐了一下午,摸着肚子跟你聊天,好像也不孤单了
|
||||
小名我们想了一个月,最后还是叫你团子,因为B超上你圆滚滚的
|
||||
以后不想上学的时候可以跟妈妈说,妈妈也不想上班,咱俩一起赖一天
|
||||
你爸给你装了个小床,装了拆拆了装,说是螺丝方向不对
|
||||
宝宝,愿你这辈子遇到的都是好人,遇到坏人也能全身而退
|
||||
妈妈怀你之前很怕疼,抽个血都要闭眼,现在一周扎两次手指测血糖都习惯了||控糖的姐妹抱一个,我也在扎
|
||||
希望你以后有一两个能聊到半夜的好朋友
|
||||
你外公说等你出来要教你下象棋,他已经把棋盘擦得锃亮了
|
||||
宝宝,妈妈腿肿得穿不进鞋了,但想到你就觉得挺值的
|
||||
你知道吗,妈妈怀上你那天,正好是爸爸生日
|
||||
慢慢来,妈妈等你,等多久都行
|
||||
宝宝,你今天特别安静,妈妈有点慌,喝了杯冰水你就动了,下次别这么吓我||冰水法我也试过,屡试不爽
|
||||
等你学会走路了,咱们去公园喂鸽子
|
||||
你爸说你像我,我说你像他,等你出来给我们评评理
|
||||
今天给你买了第一双袜子,比妈妈的大拇指还小
|
||||
希望你饿了就吃,困了就睡,不开心了就说
|
||||
宝宝,妈妈最近总是忍不住吃辣,你出来要是爱吃辣别怪我
|
||||
你是我们家第一个小孩,全家都排着队等你
|
||||
今天爸爸隔着肚子跟你说晚安,你踢了他脸一下,他高兴了一晚上||这个画面太好笑了,我家那位也被踢过
|
||||
小葡萄,你现在应该有一个哈密瓜那么大了吧,妈妈每周都在查
|
||||
愿你以后不用为钱发愁,但也知道钱来得不容易
|
||||
宝宝,妈妈不是完美的妈妈,但会一直学
|
||||
今天产检排了三个小时队,你在肚子里一直翻身,好像也等得不耐烦了
|
||||
等你长大了,妈妈把这段时间写的日记给你看
|
||||
你奶奶说我肚子尖,是男孩;外婆说我爱吃酸,是女孩,你自己说吧||老人们的玄学哈哈,我家也吵过
|
||||
宝宝,妈妈希望你一生都能睡个好觉
|
||||
妈妈怀你的时候换了工作,新工作的同事都特别照顾我,你出来要谢谢阿姨们
|
||||
你的小衣服都是表姐家哥哥穿过的,旧是旧了点,但都是软的
|
||||
希望你以后善良,但别太好说话
|
||||
宝宝,妈妈今天又在网上看了两个小时的待产包清单,还是觉得没买全||待产包永远买不全,我已经放弃了
|
||||
等你来了,家里的猫要让位了,它还不知道
|
||||
你在肚子里的每一天,妈妈都觉得特别神奇
|
||||
今天你外婆打电话,第一句不问我,问你乖不乖
|
||||
宝宝,以后摔倒了自己先试试爬起来,爬不起来妈妈就在旁边
|
||||
希望你喜欢看书,妈妈已经给你攒了一书架的绘本
|
||||
你爸学了换尿布,拿玩偶练了好几天,手法比我还熟
|
||||
小土豆,你是妈妈这辈子收到的最好的礼物
|
||||
宝宝,等你出生正好赶上过年,红包妈妈先帮你收着||红包妈妈帮你保管这句我熟
|
||||
妈妈晚上翻身要分三步,你出来以后妈妈要睡一个大字
|
||||
希望你永远有退路,累了就回家
|
||||
今天去拍了孕妇照,摄影师说你在肚子里很配合
|
||||
宝宝,你会有一个很爱哭的爸爸,到时候产房外面他肯定第一个哭
|
||||
妈妈想让你知道,你不需要做任何事情来证明自己值得被爱
|
||||
你外婆说你出来以后她来带,你爸说他请陪产假,我看他们要打起来
|
||||
宝宝,以后别学妈妈挑食,青菜要吃
|
||||
希望你有自己的爱好,一辈子都不觉得无聊
|
||||
今天在电梯里一个阿姨摸着我肚子说是个有福气的宝宝,妈妈信了
|
||||
小星星,你每天晚上动的时候,妈妈就当你在跟我说悄悄话
|
||||
妈妈第一次听到你心跳的时候,在医院走廊里哭了||我听到的时候也是,像小火车一样
|
||||
宝宝,世界有时候不太温柔,但家里永远是
|
||||
你爸已经开始研究哪个学区好了,我说孩子还没出来呢
|
||||
希望你出生那天是个晴天
|
||||
宝宝,等你长大了,记得常回家吃饭,不用带东西
|
||||
今天你踢到妈妈的膀胱,妈妈一晚上跑了五趟厕所
|
||||
等你会跑了,妈妈陪你放风筝,妈妈小时候一直没放起来过
|
||||
你是妈妈的软肋,也是盔甲||这句好戳
|
||||
宝宝,妈妈已经在想你第一次叫妈妈是什么声音了
|
||||
希望你以后不管多大,都有人叫你宝宝
|
||||
今天又是数胎动的一天,十二次,达标,奖励自己一个鸡腿
|
||||
宝宝,你来了以后,妈妈就是妈妈了,但也还是我自己
|
||||
等你满月,我们一家三口拍张照片,挂在客厅最中间
|
||||
你知道吗,你还没出生,就已经有这么多人爱你了
|
||||
宝宝,妈妈手机相册里一半是你的B超单,另一半是给你看的小衣服
|
||||
今天爸爸第一次摸到你踢,他愣了好几秒,然后说你劲儿真大||男人第一次摸到胎动的表情真的绝了
|
||||
希望你以后也会遇到一个像你爸爸这样,半夜起来给妈妈揉腿的人
|
||||
宝宝,你半夜两点踢得最欢,妈妈白天上班全靠咖啡……哦不对,现在只能喝热水||同,两点准时开工,比闹钟还准
|
||||
今天产检排了三个小时队,你在里面倒是睡得挺香,一动不动,吓得我差点去挂急诊
|
||||
你爸今天第一次摸到你踢他,愣了半天说了句“真有人啊”||哈哈哈我老公也是这反应
|
||||
跟你商量个事,出来以后晚上能不能让妈妈睡满四个小时,就四个
|
||||
糖耐那瓶糖水真难喝,妈妈为了你一口闷了,抽了三次血,你可得争气长好
|
||||
这周开始腰疼得翻不了身,每次翻身都得喊你爸推一把,你出来记得谢谢他
|
||||
妈妈今天又没忍住吃了半个西瓜,血糖还好没超,下回少吃点,咱俩说好了||我也是管不住嘴,测完才敢松口气
|
||||
你外婆从老家寄了一箱小衣服,全是她拿旧秋衣改的,说软和,纯棉的
|
||||
宝宝,你出来别像你爸那么挑食,青菜也要吃
|
||||
今天在地铁上有人给我让座了,第一次,有点不好意思,但是真的谢谢她
|
||||
妈妈最近腿肿得穿不上鞋,你爸给买了双大一码的拖鞋,丑但是舒服
|
||||
你在肚子里打嗝,一跳一跳的,妈妈手放上去数了二十多下才停
|
||||
等你出来,先带你去打疫苗,别怪妈妈,打完给你喂奶||第一针真的心疼,但是得打
|
||||
这个月花了快两千块给你买东西,你爸说比给他买的多十倍,他没说错
|
||||
跟你说个秘密,妈妈偷偷把你的B超照片设成手机屏保了,同事都看见了
|
||||
医生说你偏小一周,妈妈这几天每顿都多吃一个鸡蛋,你争口气长长肉||我家也偏小,多吃牛肉,下次产检就追上了
|
||||
宝宝,妈妈怕疼,打算打无痛,你别嫌我娇气
|
||||
你爸已经练了一个月换尿布了,拿洋娃娃练的,现在一分钟能换好
|
||||
今天收拾待产包,发现产褥垫买少了,又下单了两包,你来之前都能到
|
||||
前三个月吐得太凶,掉了六斤,现在终于能吃下一碗饭了,谢谢你放过妈妈
|
||||
妈妈晚上睡不着就在网上看别人家的宝宝,看完更想见你了
|
||||
你奶奶说你是男孩,你外婆说是女孩,她俩打赌一顿火锅,你看着办||我家也赌了,赌注是一只金镯子哈哈
|
||||
今天胎心监护半天不达标,护士让我吃块巧克力,你一下子就动起来了,原来你也爱吃甜的
|
||||
宝宝,你的小床到了,你爸装了一晚上,多出来两颗螺丝,不知道哪的
|
||||
出来以后想哭就哭,妈妈不会说你不坚强,大人也天天想哭
|
||||
四维看到你的小脸了,鼻子像你爸,嘴巴像我,还行,挺好看
|
||||
你出生那个月正好过年,红包妈妈先替你存着,长大给你||红包存起来+1,我准备给宝宝开个账户
|
||||
妈妈产假还剩一百二十八天,每天都掰着手指头算,想多陪你几天
|
||||
今天在楼下慢慢走了四十分钟,医生说多走走好生,你也配合一下
|
||||
跟你说,你爸为了你把烟戒了,五个月了,一根没抽,出来记得夸他
|
||||
小家伙,你最近踢的位置越来越低了,是不是想出来看看了
|
||||
妈妈今天给你洗了第一批衣服,晾了一阳台,邻居阿姨问是不是快生了
|
||||
宝宝,名字还没定好,你爸起的都太土,妈妈起的他说太文艺,你出来自己挑||我家也是吵了三个月,最后抓阄定的
|
||||
孕期长了十八斤,医生说刚刚好,妈妈信了,你也信
|
||||
今天你一直不怎么动,妈妈喝了口冰水,你立马踢了一脚,好的我知道了
|
||||
宝宝,你出来以后,妈妈不逼你上一堆兴趣班,喜欢哪个学哪个
|
||||
半夜腿抽筋疼醒了,你爸迷迷糊糊爬起来给我掰脚,掰完他又睡着了
|
||||
今天产检前面排了四十多个人,妈妈揣着你站了一上午||产检那天真的累,记得带个小板凳
|
||||
你外公不会用微信,今天专门学了视频通话,说等你出来要天天看你
|
||||
妈妈最近记性特别差,钥匙放冰箱里了,你爸说是你把我的脑子借走了
|
||||
宝宝,你出来以后,妈妈争取不在朋友圈天天晒你,争取||争取两个字太真实了哈哈
|
||||
宝宝,等你出来,咱家那只猫会不会吃醋,妈妈有点担心
|
||||
今天产检一切正常,出了医院门妈妈就去吃了一碗牛肉面,加了两个蛋
|
||||
你最近动得少了点,妈妈每天晚饭后躺着数你,数够十下才放心
|
||||
跟你说,你的第一套衣服是妈妈在拼多多抢的,九块九,质量还不错
|
||||
你爸说等你出来要教你打游戏,妈妈已经驳回了,至少等你上小学||驳回得好,我家那位已经在挑游戏机了
|
||||
宝宝,妈妈的预产期是二月,那时候冷,你出来记得多穿点
|
||||
今天上班开会坐了两个小时,你在里面踢了我一个半小时,是在提意见吗
|
||||
妈妈不求你多聪明,吃饭香、睡觉沉就行,别像我一样天天失眠
|
||||
上班的时候你在里面一拱一拱的,像小鱼吐泡泡,妈妈在工位上偷偷笑了半天
|
||||
你奶奶已经把月子餐菜单写好了,三十天不重样,妈妈有点感动也有点怕
|
||||
宝宝,等你会走路了,咱们一起去楼下喂鸽子
|
||||
妈妈今天去拍了孕妇照,肚子太大,摄影师说是近期拍过最圆的一个||孕妇照一定要拍,以后翻出来很有意思
|
||||
你爸天天晚上对着肚子讲故事,讲的是三国,讲到赤壁了,你有意见就踢他
|
||||
宝宝,你出来的时候,妈妈第一件事想看看你手指脚趾全不全,然后再哭
|
||||
今天走路快了点,肚子发紧,吓得我赶紧坐下,以后不赶了,慢慢来
|
||||
跟你说,妈妈怀你之前一顿能吃两碗米饭,现在吃半碗就顶到胃了,你挤着我了
|
||||
你小姨给你买了一个会唱歌的摇铃,她自己先玩了一下午
|
||||
宝宝,妈妈最近老想吃酸的,你爸说酸儿辣女,妈妈说科学不是这么讲的
|
||||
今天在医院看到一个刚出生的宝宝,皱巴巴的红红的,妈妈想你出来也是这样吧
|
||||
你出生后,妈妈打算母乳喂到一岁,能不能做到不知道,尽力
|
||||
宝宝,你爸偷偷在网上查怎么给宝宝剪指甲,被我看到了,他说是工作需要
|
||||
妈妈今天把家里所有的插座都装了保护盖,虽然你还要好久才会爬
|
||||
待产包已经收好放门口了,妈妈出门前都要看一眼||我直接放车后备箱了,省得到时候手忙脚乱
|
||||
你出来以后,妈妈想带你回老家住一段,那边空气好,有大院子
|
||||
今天你踢到妈妈膀胱了,在超市里差点没憋住,跑了好远找厕所
|
||||
宝宝,你爸给你存了一个奶粉钱的账户,每个月自动扣,他说这是他的仪式感
|
||||
妈妈想好了,你出生那天的报纸要买一份留着,虽然现在没人看报纸了
|
||||
今天胎位查了,你头朝下了,乖,就这样别动了||我家还是臀位,在做膝胸卧位,求转
|
||||
跟你说,你外婆说她生我的时候疼了一天一夜,妈妈听完更想打无痛了
|
||||
你爸已经开始学做月子餐了,第一道鲫鱼汤做糊了,第二道还行
|
||||
宝宝,咱家的小区门口有个滑滑梯,等你会走了带你去,排队的小朋友挺多
|
||||
今天晚上又被你踢醒,看了眼手机,三点十二,你这作息以后可怎么办||三点的我也在,一起数羊
|
||||
宝宝,妈妈给你挑了个儿科医生,听说看病很仔细,以后有事就找她
|
||||
婆婆今天送来一只老母鸡,说给我补补,其实是给你补补,妈妈心里明白
|
||||
你出来以后要是爱哭,妈妈就抱着你在客厅转圈,转多少圈都行||我家已经买了个摇椅,替我转
|
||||
今天第一次给你读绘本,读的是好饿的毛毛虫,妈妈自己读得挺开心
|
||||
宝宝,你的小名定了叫豆豆,大名还在吵,先叫着豆豆吧||豆豆好可爱,我家叫团团
|
||||
妈妈的肚子上长纹了,涂了油也没用,算了,这是你住过的证明||说得好,我也不涂了
|
||||
你出生后,妈妈打算请三个月育儿嫂,钱是贵了点,但妈妈想睡觉
|
||||
今天公司同事凑钱给你买了个婴儿背带,妈妈收到的时候差点哭了
|
||||
宝宝,你爸说等你满月要摆两桌,妈妈说一桌就够,你说呢
|
||||
妈妈今天忘了数胎动,晚上补数了一个小时,你倒是给面子,动了好多下
|
||||
你最近长得快,妈妈的肚皮每天都在变,衣服又小了一号
|
||||
跟你说,妈妈小时候怕打针,长大了怀你打了十几针,现在一点都不怕了
|
||||
宝宝,出来以后夏天带你去海边,妈妈还没带过小孩去海边,咱俩一起学
|
||||
今天医生说羊水有点少,让我多喝水,妈妈今天喝了三大杯,你在里面泡着舒服点
|
||||
你爸今天给你挑了一个婴儿车,在店里推来推去试了半天,店员都笑了
|
||||
宝宝,你出生前妈妈想再去吃一次火锅,微辣的,就一次||吃!微辣问题不大,我上周刚吃
|
||||
妈妈最近总梦到你,梦里你会说话,喊我妈,醒了还想再睡回去
|
||||
你知道吗,妈妈为了你学会了用吸奶器,还没用上,先看了十几个视频
|
||||
今天你在肚子里翻了个大身,整个肚子都歪到一边去了,你爸说像外星人
|
||||
宝宝,你来之前妈妈挺爱熬夜的,现在十一点前就睡,你出来别让我前功尽弃
|
||||
跟你说个事,你爸已经在家族群里提前发了你的照片,B超的,大家都说像他
|
||||
妈妈不知道能不能当个好妈妈,但会尽力,不会的就学
|
||||
今天给你的小衣服挨个剪了标签,怕扎你,剪了一个多小时
|
||||
宝宝,你出来那天,妈妈希望是个晴天,你爸说下雨也行,反正都高兴
|
||||
等你长大了,妈妈给你讲你在肚子里的事,你肯定不信你那时候这么能踢
|
||||
今天孕检尿蛋白有点高,医生让我复查,妈妈有点慌,你在里面好好的就行||别太慌,我上次也是,复查就正常了
|
||||
宝宝,妈妈给你攒了一箱绘本,都是二手买的,九成新,你别嫌弃
|
||||
|
||||
Reference in New Issue
Block a user