refactor(来信): 彻底删除内置来信屏及全部功能代码,来信整体由第三方 laixin 承接(v26092006)

「宝宝来信」功能已全部由第三方应用 laixin(mp.yizhezhe.com/laixin/)承接,
mama-box 只保留两个入口/提醒,二者逻辑一行未改:
· 底 tab「宝宝来信」#tabLetter → openLetterApp() 跳 laixin
· 首页提醒卡 #homeLetter + 底 tab 红点 #tabBadge → syncLaixinReminder()/applyLaixinReminder()
  (读 /api/mp/public/laixin/unread)

删除的界面:#screen-letter(来信列表屏)、#detailLetter(来信详情)、
#detailCard(来信分享卡)、#fabWrite(写回信钮)、#modalReply(回信弹窗)。

删除的代码:LETTERS 数据与 stampLetters/renderLetters/filterLetters/buildThread/
renderLetterDetail/openLetter/curLetter/kidText/kidEl、本地延迟投递队列全套
(store/pending、deliverDue、deliverBabyReply、deliverVoiceLetter、语音信)、
syncLetterCounts、信箱头像换图 pickBabyAvatar、回信提交、applyRemoteLetters
(H5 从此不再请求 box_app 的 /mama-box/letters)、滑动 order 里的 letter、
go() 里 #fabWrite 的开关、state.{unread,letterFilter,curLetter,replyCount,babyAvatar}
以及随之无调用方的 fillBaby()。

保留(删前逐个 grep 确认仍有调用方):babyWord()、backAt()(stampAiLogs 在用)、
el()(档案海报在用)、.segmented(档案页在用)、.letter-card(首页提醒卡在用)、
档案页「珍贵时刻」里仅以文案提及来信的装饰卡。

CSS:删掉来信专用规则块与随之失效的变量(--font-round 等);净变化 -2396/+93 行。
This commit is contained in:
2026-09-20 02:45:48 +08:00
parent 0f0af3533d
commit 31d153b513
3 changed files with 94 additions and 2401 deletions

View File

@@ -7,7 +7,7 @@
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>兜爸心选 · 孕育陪伴</title>
<!-- V:26092005 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<!-- V:26092006 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<link rel="stylesheet" href="mama-box.css">
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<!-- 共享助手:授权/跳商城/位置上报(分享卡片同步,见 docs/h5-auth-standard.md 第四节) -->
@@ -28,15 +28,15 @@
</button>
<button class="tab" id="tabLetter">
<!-- ⚠️ 2026-09-19(9.19 需求第 2 条):这枚 tab 从「兜爸心选」商城入口改回「宝宝来信」。
与第九批那次改动**方向相反**,但落点不同:这次不是切回内置来信屏,
而是跳**第三方「宝宝来信」H5**(mp.yizhezhe.com/laixin/)。
⚠️ 因此依旧**不挂 data-tab**:它不参与 go() 的 tab 高亮切换,也不切 #screen-letter。
2026-09-20:内置来信屏(#screen-letter)及其全部功能代码已删除 ——
来信功能整体由第三方 H5 承接,这枚 tab 是进「宝宝来信」的入口,
落点 = **第三方「宝宝来信」H5**(mp.yizhezhe.com/laixin/)。
⚠️ 因此依旧**不挂 data-tab**:它不参与 go() 的 tab 高亮切换。
点了走 jumpApp()(同页 location.href + query 带 openid/unionid),
与其它 H5 应用(宫格、工具卡)完全一致 —— 见 app.js 的 #tabLetter 绑定。
⚠️ 内置来信屏 #screen-letter **仍在**(swipe 的 order 里,左右滑动还能进),
它的未读数(box_app /letters)与这枚 tab 的角标**不是同一套数**:
角标 owner 是 laixin 的 /laixin/unread,见 syncLaixinBadge()。
⚠️ 红点 #tabBadge 挂在这枚 tab 上(第九批曾挪到「首页」,现已挪回)。 -->
⚠️ 红点 #tabBadge 也挂在这枚 tab 上,数据源是 laixin 的
/api/mp/public/laixin/unread,owner 只有 syncLaixinReminder() 一处
(第九批曾把红点挪到「首页」,现已挪回)。 -->
<span class="t-ico ic-letter"></span><span class="t-badge" id="tabBadge"></span><span class="t-txt">宝宝来信</span>
</button>
<button class="tab" data-tab="me">
@@ -64,7 +64,7 @@
⚠️ 它现在是 .hero-top 的**孩子**,而 .hero-top 是四个页面共用的
display:flex + justify-content:space-between —— 第二个孩子会被
space-between 甩到最右边去。这里**不动父级的对齐方式**
(动了会连着挪「我的 / 来信 / 档案」三页右上角的按钮组),
(动了会连着挪「我的 / 档案」两页右上角的按钮组),
改用 .hero-slogan{margin-right:auto} 把富余空间吃掉,让它贴着品牌字排。
这跟 .hero-actions{margin-left:auto} 是同一个路子,全站一致。
@@ -131,7 +131,7 @@
⚠️ 别把这里的 .hide / .no-letter 去掉,去掉就退回闪烁版。
⚠️ 这张卡 2026-09-20 之前读的是 box_app 自己的 /mama-box/letters(多数用户 0 封),
而底 tab 早已跳 laixin —— 两套数据导致「红点说有新信、卡里什么都没有」。
改数据源就是修这个,**别再把它接回 LETTERS**(内置来信屏仍在,但不再往首页推卡)。 -->
改数据源就是修这个,**别再把它接回本地信件数据**(内置来信屏已整体删除,这张卡只认 laixin)。 -->
<button class="letter-card ripple hide" id="homeLetter">
<span class="lc-envwrap"><img class="lc-env" src="assets/img/02cf420f0d07.png" alt="" aria-hidden="true"></span>
<div class="lc-body">
@@ -145,7 +145,7 @@
</div>
</button>
<!-- id 是给 pushLatestToHome() 用的:来信卡收起来时它挂 .no-letter,
<!-- 来信卡收起来时由 hideLetterCard() / applyLaixinReminder() 给 #homeBody 挂 .no-letter,
把下面第一块(.tool-dock)的上间距补回来。
⚠️ 2026-09-20:它**默认就带 .no-letter**(与 #homeLetter 默认带 .hide 配套,
首屏按「没有来信卡」排版,避免数据回来时布局跳一下)。
@@ -470,7 +470,7 @@
<button class="seg-btn is-active" data-seg="data">成长数据</button>
<button class="seg-btn" data-seg="timeline">时光轴</button>
<!-- 收藏数原本在下面那行 sec-title 里,那行整条删了,
数字搬到标签上(和来信页「未读 1」同一种写法),#favCount 仍由 JS 更新 -->
数字搬到标签上(和分段控件里其它计数同一种写法),#favCount 仍由 JS 更新 -->
<button class="seg-btn" data-seg="moment">珍贵时刻 <i id="favCount">18</i></button>
</div>
@@ -662,88 +662,6 @@
</div>
</section>
<section class="screen" id="screen-letter" data-screen="letter">
<div class="page-hero">
<!-- 这里原来有一整条 .hero-top,里面就一个搜索图标。删掉了:
一共 24 封信,下面那排「全部 / 未读 / 我的回信 / 已收藏」已经够翻,
再放个搜索框只是把首页的样式抄过来,没人会在这儿搜。
搜索本身还在(首页和资源库还挂着 data-search="1"),只是来信不进这个门。 -->
<!-- ===== 信封上盖(本批新增)=====
用户原话:「宝宝来信上面的头部也稍微变换一下,做的稍微有一点设计感。
现在有点太平了。可以把这个页面做成类似一个信封的那种感觉,试试呢?」
整块橘色头部当信封的正面,这一笔画出从两个上角折下来的盖子,
尖端落在下面那排筛选标签的上沿 —— 那条压暗的横条正好像一道封口。
为什么用 SVG,而不是 CSS 三角形或 clip-path:
· 边框三角(border-left/right-width)**不接受百分比**。要么写 vw
—— 桌面预览时 100vw 是整个窗口,比 430px 的 .phone 宽得多,
尖端会跑到屏幕外;要么写死 px —— 写死就贴不住两个上角。
· clip-path 在老 X5 内核上有掉档风险,一旦不认就是**整块实白**
盖住页头,属于「坏掉了还看不出为什么」那一类。
· SVG 是**标记**,smoke 能直接 querySelector 到它并检查坐标;
写成 CSS 的话只能拿正则去比对样式表文本,钉不住形状。
preserveAspectRatio="none" 让 100×100 的 viewBox 非等比拉满盒子,
所以坐标里的 50 就是「横向正中」,不用管屏幕多宽 —— 尺寸交给 CSS。
⚠️ 两个图形上的 fill 都不能省:全局有一条 svg{fill:currentColor},
省掉就会继承成页头的白字色,变成一整块实白糊住标题。 -->
<svg class="env-flap" viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true">
<polygon points="0,0 100,0 50,100" fill="#fff" opacity=".10"/>
<path d="M0 0 50 100 100 0" fill="none" stroke="#fff" stroke-opacity=".26"
stroke-width="1.5" vector-effect="non-scaling-stroke"/>
</svg>
<div class="hero-info">
<div>
<!-- 这两句里的「宝宝」由 syncBabyWords() 换成用户填的小名,
标记里写的只是没填小名时的兜底文案 -->
<h1 class="hero-h1" id="ltHeroH1">宝宝写给你的信</h1>
<!-- 未读数不在这里说了——下面那排标签上就写着「未读 1」,
两者上下紧挨,重复一遍只会让人多读一次 -->
<p class="hero-p">共 <span id="letterTotal">24</span> 封</p>
<p class="hero-p sub" id="ltHeroSub">每周宝宝都会悄悄给你写一封</p>
</div>
<!-- 扁平化信封:纯矢量,与首页来信卡的信封同一套造型语言 -->
<svg class="env-art" viewBox="0 0 64 48" width="72" height="54" aria-hidden="true">
<rect x="1.5" y="1.5" width="61" height="45" rx="8" fill="#fff" opacity=".96"/>
<path d="M1.5 9.5 32 28 62.5 9.5" fill="none" stroke="#F4593C" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1.5 38.5 22 24M62.5 38.5 42 24" fill="none" stroke="#FBB7A6" stroke-width="3" stroke-linecap="round"/>
<circle cx="52" cy="11" r="7.5" fill="#F4593C"/>
<path d="M52 7.4c1.6-2 4.6-.9 4.6 1.3 0 1.9-2.4 3.6-4.6 5.3-2.2-1.7-4.6-3.4-4.6-5.3 0-2.2 3-3.3 4.6-1.3z" fill="#fff"/>
</svg>
</div>
<!-- 筛选标签收进橘色头部,和标题连成一块。
原先它下面还压着一张「最新那封信」的大卡,而那张卡画的就是
列表第一条——同一封信在一屏里出现两次,删掉了。 -->
<div class="segmented" id="letterSeg">
<span class="seg-thumb" id="letterThumb"></span>
<button class="seg-btn is-active" data-lseg="all">全部</button>
<button class="seg-btn" data-lseg="unread">未读 <i id="unreadNum">1</i></button>
<button class="seg-btn" data-lseg="reply">我的回信</button>
<button class="seg-btn" data-lseg="fav">已收藏</button>
</div>
</div>
<div class="page-body">
<!-- 列表全部由 renderLetters() 生成:每封信是一个 .lthread,
妈妈的回信和宝宝的再回复都作为 .lt-sub 挂在这封信下面,
一眼就能看出「这条回信是回给哪封来信的」 -->
<div class="letter-list" id="letterList"></div>
<!-- 空数据双态:未完善资料 → 引导去完善(完善后才有来信);
已完善但真没数据 → 普通"还没有内容"。由 renderLetters 按档案状态切换 -->
<div class="empty-tip" id="letterEmpty">
<div id="letterEmptyGuide" class="empty-guide" style="display:none">
<div class="eg-emoji">💌</div>
<p class="eg-t">宝宝还不知道预产期,没法给你写信</p>
<p class="eg-s">先完善孕期信息,宝宝就会开始给你写信啦</p>
<button class="eg-btn" id="letterGoOnboard">去完善资料</button>
</div>
<span id="letterEmptyPlain">这里还没有内容</span>
</div>
</div>
</section>
<section class="screen" id="screen-me" data-screen="me">
<div class="me-top">
<div class="hero-top">
@@ -1068,75 +986,6 @@
<!-- ================= 详情页(右滑入) ================= -->
<section class="detail" id="detailLetter">
<div class="detail-bar">
<button class="dt-back" data-detail="close">‹</button>
<!-- 兜底文案:renderLetterDetail() 会把它改写成「小汤圆来信」。
⚠️ 这个写死的值必须和 JS 那句同口径 —— 漏改会在详情页打开的那一帧
闪一下旧文案。上一批这里短暂叫过「宝宝的消息」,本批随整条线退回「来信」。 -->
<span class="dt-title" id="dlBarTitle">宝宝来信</span>
<button class="dt-star" id="dtStar">☆</button>
</div>
<div class="detail-body">
<!-- 极简信纸:整张卡就是一页白信纸,抬头和正文之间不再有色块或撕口分层。
层次全靠字号和留白拉开 —— 上面一行小字交代「什么时候写的」,
中间大标题,底下一道手绘波浪线收住,再往下才是正文。
(原来是暖色抬头块 + 圆邮戳 + 齿孔撕口 + 大引号,元素太多,
每一样都在抢正文的注意力。) -->
<article class="dl-letter">
<header class="dl-head">
<p class="dl-eyebrow">
<span id="dlWeek">孕 24 周 +3 天</span>
<i aria-hidden="true"></i>
<span id="dlDate">2024年9月3日 08:00</span>
</p>
<h1 id="dlTitle">今天我翻了个身</h1>
<!-- 手绘波浪线:一条 path 走三段 S 曲线,比直线多一点手写的松弛感 -->
<svg class="dl-wave" viewBox="0 0 120 9" aria-hidden="true" preserveAspectRatio="none">
<path d="M2 5.6C13 1.9 24 8.4 35 5.1S57 1.6 68 5.4 90 8.6 102 4.6c5-1.7 10-2.2 16-1.4"
fill="none" stroke="#F3A88C" stroke-width="2.3" stroke-linecap="round"/>
</svg>
<!-- 带语音的信,语音条就紧跟在标题下面,不再甩到正文后面 -->
<div id="dlVoice"></div>
</header>
<div class="dl-body">
<div class="dl-text" id="dlText"></div>
</div>
</article>
<!-- 这封信下面的往来:妈妈的回信 + 宝宝的再回复,全部就地展开 -->
<div class="dl-thread" id="dlThread"></div>
<!-- 两颗并排:生成图片、回信。
这里原来还有一颗收藏键,撤了 —— 右上角 #dtStar 已经是这封信的收藏开关,
同一个页面里两个入口管同一件事,状态还得两头同步,没有好处。 -->
<div class="dl-actions">
<!-- ⚠️ 这颗原来是只有图标的 52×52 方钮(一个「卡片飞出去」的转发符号),
没人看得懂那是干什么的 —— 转发这个动作在不同 app 里图标各画各的,
脱离了熟悉的语境就是一个纯抽象图形。改成图标 + 「生成图片」四个字,
说的是这颗键真正做的事(做一张图),不是它背后的技术动作(分享)。
图标同步换成「画框里一张图」,和分享卡面板顶上那枚 .pst-ico 是同一个。 -->
<button class="dl-btn ghost ico-txt has-ico" id="dlCard">
<svg class="btn-ico" viewBox="0 0 24 24" width="17" height="17" aria-hidden="true">
<path d="M4.6 6.4h14.8v11.2H4.6z" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"/>
<path d="M4.6 14.4l3.6-3.1 3.2 2.7 2.7-2.2 4.3 3.7" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"/>
<circle cx="9" cy="9.7" r="1.2" fill="none" stroke="currentColor" stroke-width="1.5"/>
</svg>
<span>生成图片</span>
</button>
<!-- 原来是 ✍️ emoji(各系统都渲染成一只带阴影的实体小手),换成和站内其它
图标同一套的线性扁平笔。文字单独包一层 #dlReplyTxt:syncBabyWords()
要按小名改这行字,继续写 button.textContent 会把 svg 一起抹掉 -->
<button class="dl-btn main has-ico" id="dlReply">
<svg class="btn-ico" viewBox="0 0 24 24" width="17" height="17" aria-hidden="true">
<path d="M16.4 3.8a2.2 2.2 0 0 1 3.1 3.1L9.2 17.2l-4.1 1 1-4.1z" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"/>
<path d="M14.7 5.5l3.1 3.1" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/>
</svg>
<span id="dlReplyTxt">给宝宝回信</span>
</button>
</div>
</div>
</section>
<!-- ================= AI 小结 内容页 ================= -->
<section class="detail" id="detailAI">
<div class="detail-bar">
@@ -1370,8 +1219,8 @@
<p class="pst-tip" id="pstTip">图片已生成。在微信里也可以长按上面这张图,直接保存或转发。</p>
</div>
<div class="rd-cta pst-cta" id="pstCta">
<!-- data-export 是委托用的:来信分享卡那个面板底下也是这三颗,
两边共用 app.js 里同一段保存/分享/打印逻辑。id 还留着,
<!-- data-export 是委托用的:这三颗按钮不逐个绑监听,统一走 app.js 的
$$('[data-export]') 委托 → exportAct。id 还留着,
renderPoster() 要按「本周/完整」换这两颗的主次样式。 -->
<button class="dl-btn ghost" id="pstPrint" data-export="print">打印</button>
<button class="dl-btn ghost" id="pstSave" data-export="save">保存图片</button>
@@ -1379,49 +1228,6 @@
</div>
</section>
<!-- ================= 来信分享卡 =================
把单独一封信做成一张能发朋友圈的图。和上面的档案海报是两个壳,不是一个壳两种模式 ——
档案那边的 posterData() 里写死了预产期、体重、睡眠这些东西,
共用一个渲染器就等于把「哪些字段不能上卡」交给一串 if 去把关,迟早漏。
这边的 cardData() 是白名单,从源头上只挑得出小名 / 孕周 / 月日 / 信的正文。
没有「打印」那颗:这张卡是发出去的,不是印出来的。
所以 @media print 那段照旧只认 #detailPoster,不用动。 -->
<section class="detail" id="detailCard">
<div class="detail-bar">
<button class="dt-back" data-detail="close">‹</button>
<span class="dt-title" id="cdBar">分享卡</span>
</div>
<div class="detail-body">
<div class="pst-hero">
<span class="pst-ico" aria-hidden="true">
<svg viewBox="0 0 24 24" width="24" height="24">
<path d="M4.5 6.5h15v13h-15z" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"/>
<path d="M4.5 15.5l4-3.5 3.5 3 3-2.5 4.5 4" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"/>
<circle cx="9.2" cy="10.2" r="1.3" fill="none" stroke="currentColor" stroke-width="1.6"/>
</svg>
</span>
<div class="pst-h-txt">
<h2 class="pst-h-title" id="cdName">这封信的分享卡</h2>
<p class="pst-lead" id="cdLead">生成一张可以直接发出去的图。</p>
</div>
</div>
<!-- 三颗样式胶囊:信纸 / 成长足迹 / 比大小。空的,由 js 里的 CARD_TPL 注册表
建出来 —— 样式表和 DOM 只留一处真相,加第四套只改数组不改这里。
这排下面原来还有一排「说明卡上印了什么」的信息胶囊(小名/孕周/日期/成图),
那排撤了没有恢复:两排长得差不多的标签叠在一起,面板就成了标签墙。
卡上有什么,由 #cdLead 一句话说清楚。 -->
<div class="pst-tpl" id="cdTpl" role="tablist" aria-label="分享卡样式"></div>
<div class="pst-pages" id="cdPages"></div>
<p class="pst-tip" id="cdTip"></p>
</div>
<div class="rd-cta pst-cta">
<!-- 复用 #detailPoster 那三颗按钮背后的同一段逻辑,靠 data-export 委托 -->
<button class="dl-btn ghost" data-export="save">保存图片</button>
<button class="dl-btn main" data-export="share">分享朋友圈</button>
</div>
</section>
<!-- ================= 设置与服务 二级页 =================
隐私与权限 / 帮助与反馈 / 关于兜爸心选 三项共用这一个壳,
内容由 js 里的 SETTINGS 表渲染进 #stBody,避免写四份几乎一样的结构 -->
@@ -1489,18 +1295,17 @@
<!-- ================= 搜索层 ================= -->
<section class="search-layer" id="searchLayer">
<div class="sl-bar">
<!-- ⚠️ 占位符里列的是三个可搜的东西,其中一个就是底 tab 那一栏。
tab 叫什么这里就得写什么,否则搜索框在教用户去搜一个界面上不存在的词。
上一批 tab 改叫「消息」时这里跟着改过,本批退回「来信」。等字数替换,宽度不用重算。
<!-- ⚠️ 占位符里列的是可搜的东西。来信已整块移出本站(第三方 H5),
别再把它写回这句 —— 搜索框不该教用户搜一个界面上不存在的东西。
⚠️ 这句是 placeholder **属性**,不是文字节点 —— 只扫 textContent 的检查
抓不到它,上一批就是这么漏的。改口时别忘了它。 -->
<div class="sl-input"><span>🔍</span><input id="searchInput" placeholder="搜索档案、来信、记录……"></div>
抓不到它,改口时别忘了它。 -->
<div class="sl-input"><span>🔍</span><input id="searchInput" placeholder="搜索档案、记录……"></div>
<button class="sl-cancel" data-search="close">取消</button>
</div>
<div class="sl-body">
<div class="sl-sec">最近搜索</div>
<div class="chips-row wrap">
<button class="chip">第一次胎动</button><button class="chip">大排畸</button><button class="chip">体重</button><button class="chip">胎心</button><button class="chip">宝宝来信</button>
<button class="chip">第一次胎动</button><button class="chip">大排畸</button><button class="chip">体重</button><button class="chip">胎心</button>
</div>
<div class="sl-sec">大家都在搜</div>
<div class="sl-hot">
@@ -1512,17 +1317,9 @@
</div>
</section>
<!-- 同上:来信页这颗悬浮按钮上的 ✍️ 也换成同一枚扁平笔,两处别一个实体一个线性 -->
<button class="fab-write ripple" id="fabWrite">
<svg class="btn-ico" viewBox="0 0 24 24" width="17" height="17" aria-hidden="true">
<path d="M16.4 3.8a2.2 2.2 0 0 1 3.1 3.1L9.2 17.2l-4.1 1 1-4.1z" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"/>
<path d="M14.7 5.5l3.1 3.1" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/>
</svg>
<span>写回信</span>
</button>
<!-- ================= 通用弹窗(回信 / 孕期信息) ================= -->
<!-- ================= 通用弹窗(往期小结 / 企业微信 / 我的资料) ================= -->
<div class="modal-scrim" id="modalScrim"></div>
<!-- ================= 往期小结 =================
@@ -1550,30 +1347,6 @@
</button>
</section>
<section class="modal" id="modalReply" role="dialog" aria-modal="true" aria-labelledby="modalReplyTitle">
<div class="modal-head">
<h3 id="modalReplyTitle">给宝宝回信</h3>
<button class="modal-x" data-modal="close" aria-label="关闭">
<svg viewBox="0 0 24 24" width="15" height="15" aria-hidden="true">
<path d="M6 6l12 12M18 6L6 18" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"/>
</svg>
</button>
</div>
<!-- 明确标出这封回信是回给哪封来信的,回信也会挂到那封信下面 -->
<p class="modal-lead">回给《<b id="replyOn">今天我翻了个身</b>》 —— 写点什么给 <b id="replyTo">小汤圆</b> 吧。</p>
<textarea class="modal-ta" id="replyText" rows="6" maxlength="500" placeholder="宝宝,妈妈今天……"></textarea>
<div class="modal-tags">
<button class="mtag" data-fill="宝宝,今天妈妈感受到你踢了好多下,是不是在跟妈妈打招呼呀?">今天的胎动</button>
<button class="mtag" data-fill="宝宝,妈妈今天去做了产检,医生说你长得很好,妈妈就放心啦。">产检记录</button>
<button class="mtag" data-fill="宝宝,妈妈想对你说:谢谢你选择妈妈,我们一起慢慢长大。">悄悄话</button>
</div>
<div class="modal-foot">
<span class="modal-count"><b id="replyCount">0</b>/500</span>
<button class="dl-btn ghost" data-modal="close">取消</button>
<button class="dl-btn main" id="replySend">寄给宝宝</button>
</div>
</section>
<!-- ================= 百度网盘领取(已下线) =================
⚠️ 2026-09-19(9.19 需求 1.2 + 需求方确认):资料改由企业微信顾问**直接发放**,
H5 不再发网盘链接和提取码 —— 原来这个 #modalPan 弹窗、js 里的 PAN/PAN_DEFAULT
@@ -1726,7 +1499,7 @@
</div>
<div class="fld">
<span>宝宝性别</span>
<!-- 选了性别,宝宝来信/回信会换成对应的口吻与落款 -->
<!-- 性别会随档案一起保存(PUT /profile 的 babySex 字段)。 -->
<div class="pick-row" id="pgSex">
<button type="button" class="pick is-active" data-sex="unknown">还不知道</button>
<button type="button" class="pick" data-sex="boy">男孩</button>