后端 box_app 新增 /api/mp/public/mama-box/feedback(POST/GET)与管理端 /api/mama-box/feedbacks Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4532 lines
348 KiB
CSS
4532 lines
348 KiB
CSS
|
||
/* ============ 妈妈盒子 · H5 ============ */
|
||
:root{
|
||
--brand:#F4593C;
|
||
--brand-lt:#FF7C5C;
|
||
--brand-dk:#E04A2E;
|
||
/* 设计稿 hero 是「越往下越浅」的暖橘(顶 #FC7A60 → 底 #FAAE9B),
|
||
之前写成了越往下越深,气泡插画一放上去边缘就发暗,这里按取样值改回来 */
|
||
--grad:linear-gradient(150deg,#E85D41 0%,#EC6A4A 45%,#EF7B55 75%,#F0906C 100%);
|
||
--bg:#F8F3EF;
|
||
--card:#fff;
|
||
--ink:#2B2320;
|
||
--ink-2:#6B615B;
|
||
--muted:#72665E;
|
||
--line:#EFE7E1;
|
||
--green:#6E9A56;
|
||
--alert:#D2402A; /* 卡片 warn 标红(胎动偏低/宫缩达阈值/产检过期) */
|
||
--purple:#8B6FE0;
|
||
--blue:#4E85C7;
|
||
/* ---- 「妈妈」这个身份的颜色 ----
|
||
本批从蓝(--blue #4E85C7)换成绿。用户原话:
|
||
「妈妈回信那个背景色,现在不是浅蓝吗?可以变成偏绿色一点。」
|
||
⚠️ 为什么另起一个变量、而不是把 --blue 的值直接改成绿:
|
||
--blue 是**调色板**里的颜色名,把叫 blue 的变量填成绿色,
|
||
以后每个读到它的人都会被骗一次。--mom 是**语义**变量(谁的颜色),
|
||
换色时只动它,调色板保持诚实。
|
||
⚠️ 内置来信屏删除后,回信气泡那套浅绿底(原来的 --mom-bg-1/2)已一并下线;
|
||
这个变量现在只剩 .sec-title.c-blue::before(绿色竖色条)一个消费者。 */
|
||
--mom:#3F7551;
|
||
--r-lg:24px;
|
||
--r-md:18px;
|
||
--r-sm:12px;
|
||
--sh:0 8px 24px rgba(188,120,96,.10);
|
||
--sh-lg:0 14px 40px rgba(180,110,86,.16);
|
||
/* ---- 工具区背后的「妈妈」大字水印 ----
|
||
首页工具区(.tool-dock)的白底上躺着两个很大、很粗、很淡的「妈妈」,
|
||
压在内容底下。它不是纹理,是一枚印章:下半截整个沉在工具卡背后,
|
||
露出来的上面六成刚好够人一眼认出「哦,是妈妈两个字」。
|
||
|
||
⚠️ **全站只有这一枚。** 上一稿三块白底各放一枚,被否了 ——
|
||
三枚同样的字顺着首页排下来,本身又成了一种重复。一枚是印章,三枚是底纹。
|
||
别再往 .today-line / .shelf 上加回去;尺寸怎么定的见 .wm 那条规则。
|
||
|
||
⚠️ 这块地方已经推翻过两版底纹,两版都是被同一句话否掉的:
|
||
第一批「脚丫/星/云/爱心 四种图案散铺」→「太碎了,页面看着特别乱。」
|
||
第二批「等距波点,列距 36px」 →「那个小碎点看着还是太乱。」
|
||
两版的毛病是同一个:**满屏都是小东西**。小东西一多,眼睛就要挨个去认,
|
||
认的过程就是分心的过程。第三版索性反过来 —— 整块地方只放**一个**大东西,
|
||
大到不必去认,扫一眼就过去了。
|
||
**想再往这三块白底上撒任何细碎图案之前,先回头读这三行。**
|
||
|
||
⚠️ 为什么是 DOM 里一个 <span>,不是接着用 background-image:
|
||
前两版走的是 --pat 内联 SVG 背景(这一批已整个删掉)。换成大字之后,
|
||
SVG 背景那条路要靠 <text> 渲染中文 —— 而背景图里的 SVG 拿不到页面的
|
||
字体栈,只能听系统的;万一那台机器在这个渲染上下文里没有中文字体,
|
||
结果是**静悄悄什么都不显示**,页面看着和没做过一样。
|
||
这块地方已经被否两次了,再来一次「用户什么都没看见」太贵。
|
||
DOM 里的普通文字走的是 body 那套字体栈,不会有这种失败方式。
|
||
|
||
⚠️ 颜色别顺手调深。12px 的灰字(--muted #A79C95)在纯白上对比度是 2.68,
|
||
压到 #F9F3EE 上掉到 2.44,再深一档 #F7EFE8 就只剩 2.36。
|
||
水印和前两版底纹不是一回事 —— 它是一大片实心色,**正压在**
|
||
.dock-note 那行小灰字底下,不像波点只是零星擦过去。
|
||
另一头是:大面积本来就比小图案显眼得多,所以颜色可以、也应该
|
||
比波点那版更淡。深浅只改这一个变量。 */
|
||
--wm-color:#F9F3EE;
|
||
--wm-size:132px;
|
||
--tabh:78px; /* 悬浮药丸 58px + 底部留白 14px + 余量 */
|
||
--ease:cubic-bezier(.32,.72,0,1);
|
||
/* 宝宝写的字:挑系统自带里最「歪歪扭扭」的手写/卡通体。
|
||
翩翩体(HanziPen SC)是 iOS/macOS 自带的儿童手写体,笔画有粗细起伏、
|
||
字面故意不方正,最像小朋友写的;手札体(Hannotate)次之;
|
||
Windows 退到华文彩云/幼圆;一路兜底到圆体,绝不掉进宋体。
|
||
⚠️ 内置来信屏删除后,这个变量现在只剩首页 slogan(.hero-slogan)在用。 */
|
||
--font-kid:"HanziPen SC","翩翩体-简","HanziPen TC","Hannotate SC","手札体-简",
|
||
"Yuanti SC",YouYuan,"幼圆","Hiragino Maru Gothic ProN",
|
||
"PingFang SC","Microsoft YaHei",sans-serif;
|
||
}
|
||
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
|
||
html,body{height:100%}
|
||
body{
|
||
font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Segoe UI",Roboto,sans-serif;
|
||
background:#E8DED6;color:var(--ink);-webkit-font-smoothing:antialiased;
|
||
display:flex;align-items:center;justify-content:center;overflow:hidden;
|
||
}
|
||
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer;text-align:left}
|
||
svg{fill:currentColor}
|
||
b{font-weight:700}
|
||
em{font-style:normal}
|
||
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
|
||
|
||
/* ---------- 无障碍 / 触控 / 动效(WK 审计补齐) ---------- */
|
||
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;text-size-adjust:100%}
|
||
html,body,button,a,input,textarea,select{-webkit-touch-callout:none;touch-action:manipulation}
|
||
button,a,input,textarea,select,summary,[tabindex]{transition:box-shadow .15s ease}
|
||
:focus{outline:none}
|
||
:focus-visible{outline:3px solid rgba(244,89,60,.55);outline-offset:2px;border-radius:6px}
|
||
.modal,.sheet,.search-layer,.scrim{overscroll-behavior:contain}
|
||
a.skip{position:absolute;left:-9999px;top:auto;z-index:2000;background:var(--brand);color:#fff;padding:10px 16px;border-radius:10px;font-weight:700}
|
||
a.skip:focus{left:16px;top:16px}
|
||
/* 橙渐变上的白字:加深对比 + 轻微投影提可读性 */
|
||
.page-hero,.me-top,.home-hero,.hero-main,.week-num,.hd-card,.lc-title,.lc-prev{text-shadow:0 1px 3px rgba(120,30,10,.28)}
|
||
@media (prefers-reduced-motion:reduce){
|
||
*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}
|
||
}
|
||
|
||
/* ---------- 手机外框 ---------- */
|
||
.phone{
|
||
position:relative;width:430px;height:932px;max-height:100vh;
|
||
background:var(--bg);overflow:hidden;
|
||
border-radius:46px;box-shadow:0 40px 90px rgba(120,70,50,.28),0 0 0 11px #16110f,0 0 0 13px #2e2724;
|
||
}
|
||
@media (max-width:520px),(max-height:940px){
|
||
.phone{width:100vw;height:100vh;height:100dvh;max-height:none;border-radius:0;box-shadow:none}
|
||
}
|
||
|
||
/* ---------- 屏幕容器 ---------- */
|
||
.screens{position:absolute;inset:0}
|
||
.screen{
|
||
position:absolute;inset:0;overflow-y:auto;overflow-x:hidden;
|
||
-webkit-overflow-scrolling:touch;background:var(--bg);
|
||
padding-bottom:calc(var(--tabh) + env(safe-area-inset-bottom) + 24px);
|
||
opacity:0;visibility:hidden;transform:scale(.985);
|
||
transition:opacity .28s ease,transform .32s var(--ease),visibility .28s;
|
||
}
|
||
.screen::-webkit-scrollbar{display:none}
|
||
.screen.is-active{opacity:1;visibility:visible;transform:none;z-index:2}
|
||
|
||
/* ============ 通用 ============ */
|
||
.icon-btn{width:32px;height:32px;border-radius:50%;display:grid;place-items:center;position:relative;color:#fff;transition:transform .18s,background .2s}
|
||
.icon-btn.glass{background:rgba(255,255,255,.2);backdrop-filter:blur(8px)}
|
||
.icon-btn.plain{background:none;font-size:20px}
|
||
.icon-btn:active{transform:scale(.9)}
|
||
/* .icon-btn.has-dot 已删:全站唯一的使用者是首页右上角那个消息圆钮,钮没了规则也没人用 */
|
||
.chev{font-style:normal;color:#C9BFB8;font-size:19px;line-height:1}
|
||
|
||
/* 模块主标题:前面加一根竖色条做修饰,并把上间距从 26 拉到 36,
|
||
让相邻模块之间有明显的呼吸感,用户一眼能看出这是几个独立模块 */
|
||
.sec-title{
|
||
font-size:17.5px;font-weight:800;letter-spacing:-.2px;margin:36px 0 14px;
|
||
display:flex;align-items:center;gap:8px;
|
||
}
|
||
.sec-title::before{
|
||
content:"";flex:0 0 auto;width:4px;height:18px;border-radius:3px;
|
||
background:var(--brand);box-shadow:0 2px 6px rgba(244,89,60,.35);
|
||
}
|
||
.sec-title.c-green::before{background:var(--green);box-shadow:0 2px 6px rgba(110,154,86,.35)}
|
||
.sec-title.c-purple::before{background:var(--purple);box-shadow:0 2px 6px rgba(139,111,224,.35)}
|
||
.sec-title.c-blue::before{background:var(--mom);box-shadow:0 2px 6px rgba(63,117,81,.35)}
|
||
/* 标题后面挂的「(必填)」。目前只有「我的 → 孕期信息」一处在用。
|
||
⚠️ 用 --brand 不用 --muted:这是一句**要求**不是附注,灰掉就没人填了。
|
||
⚠️ letter-spacing 显式归 0 —— .sec-title 自己带 -.2px,那是给 17.5px 大字收紧用的,
|
||
12px 的小字再收会把括号和字挤在一起。
|
||
⚠️ 不设 margin-left:靠 .sec-title 的 gap:8 拉开;.sec-more 那条 margin-left:auto
|
||
会把「编辑 ›」推到最右,中间的空档全归它。 */
|
||
.sec-req{flex:0 0 auto;font-size:12px;font-weight:600;color:var(--brand);letter-spacing:0}
|
||
.sec-more{margin-left:auto;font-size:13px;color:var(--muted);font-weight:500;white-space:nowrap}
|
||
.sec-more:active{opacity:.5}
|
||
/* 这里原来还有一条 .sec-sub(挂在 .sec-title 底下的一句灰色说明)。
|
||
全站只有首页那四处在用,首页换骨架之后四句说明各自搬进了模块内部
|
||
(.dock-note / .tl-h-note / .ab-foot i / .sh-note),这条就成了死规则,删掉。
|
||
⚠️ .sec-title 本身不能删 —— 「我的」页还有两处在用。 */
|
||
|
||
.ripple{position:relative;overflow:hidden;transition:transform .16s var(--ease)}
|
||
.ripple:active{transform:scale(.975)}
|
||
.rp{position:absolute;border-radius:50%;background:rgba(244,89,60,.16);transform:translate(-50%,-50%) scale(0);animation:rp .55s ease-out forwards;pointer-events:none}
|
||
@keyframes rp{to{transform:translate(-50%,-50%) scale(1);opacity:0}}
|
||
|
||
.chips-row{display:flex;gap:9px;margin-bottom:14px;overflow-x:auto;padding-bottom:2px}
|
||
.chips-row.wrap{flex-wrap:wrap;overflow:visible}
|
||
.chips-row::-webkit-scrollbar{display:none}
|
||
.chip{
|
||
flex:0 0 auto;padding:8px 17px;border-radius:20px;background:#fff;
|
||
font-size:14px;font-weight:600;color:var(--ink-2);border:1px solid var(--line);
|
||
transition:background .22s var(--ease),color .22s var(--ease),border-color .22s var(--ease);
|
||
}
|
||
.chip.is-active{background:var(--brand);color:#fff;border-color:var(--brand);box-shadow:0 5px 14px rgba(244,89,60,.3)}
|
||
.chip:active{transform:scale(.94)}
|
||
/* 「收藏」不是分类,用金色星号和左边那几个分类 chip 拉开一点区别 */
|
||
.chip-fav{color:#B8912C}
|
||
.chip-fav.is-active{color:#fff;background:var(--brand);border-color:var(--brand)}
|
||
|
||
/* ============ 首页 · Hero ============
|
||
全部坐标取自设计稿 ______v25(857px 宽 = 428.5pt @2x),CSS px = 设计 px ÷ 2:
|
||
品牌「妈妈盒子」 x33 y27..58 → left 16.5 top 13.5 ≈21px
|
||
(设计稿右上角还有个消息圆钮 x762.7..827.3 y20.7..86,已删,见 index.html)
|
||
进度环 圆心(202,188) 外径158 描边8 → left 61.5 top 54.5 79×79 描边4
|
||
「+3天」 x293..338 y187..205 → left 146.5 top 93.5 ≈13px
|
||
天数文案 x67 y297..314 → left 33.5 top 148.5 ≈15px
|
||
气泡宝宝插画 x424..810 y46..348 → right 23 top 23 193×151
|
||
hero 橙色区底缘:中部 ≈y420(210) 两侧 ≈y340(170) → 椭圆下沿 44px
|
||
⚠️ 上面这些是**设计稿**的数,不是现在的实现值。设计稿里没有 slogan,
|
||
加进去之后品牌字以下整列都下移了,实际纵向排布以 .home-hero 里那笔账为准。 */
|
||
/* 2026-10-04 头图背景换成 assets/img/6a268e7269b7.jpg:原 25 周静帧去掉羊水囊、宝宝、脐带后的空背景(AI 补底,1560×750,
|
||
摆法同旧图:图高 = 橙区高、右对齐,屏宽 ≤520 都铺得满,再宽露底色 #dc8569)。
|
||
羊水囊 + 宝宝整体都在 .hero-baby 里,按孕周换(js/hero-fx.js)。
|
||
上面叠一层很淡的暖色左深右透渐变,只为让左边白字(孕周环、天数卡)再稳一点。
|
||
形状(高度、底部椭圆弧)不变。 */
|
||
.home-hero{
|
||
position:relative;color:#fff;overflow:hidden;
|
||
background:
|
||
linear-gradient(90deg,rgba(150,55,35,.20) 0%,rgba(150,55,35,.07) 38%,rgba(150,55,35,0) 58%),
|
||
url(assets/img/6a268e7269b7.jpg) right center/auto 100% no-repeat,
|
||
#dc8569;
|
||
padding:env(safe-area-inset-top) 15px 0 16px;
|
||
/* 设计稿橙区 210px。但设计稿里气泡下缘是被白卡盖住的,
|
||
现在气泡补全成整圆(高 189.5),橙区必须够高才不会被 overflow:hidden 切掉。
|
||
|
||
── 现在是 250:slogan 挪到品牌字右边之后重算的 ──
|
||
这一竖列是一笔连着的账,橙区高度是账的**结果**,不是可以随手调的数字:
|
||
hero-top 10 + 32 → 42 品牌字 + slogan 并排的那一排
|
||
hero-main 28 + 79 → 149 孕周环
|
||
hero-days 17 + 52 → 218 天数玻璃卡
|
||
letter-card 橙区底 −16 → 234 「宝宝来信」卡顶
|
||
卡顶 234 − 卡底 218 = 16px 安全间隙(旧版 13,同一个量级)。
|
||
|
||
⚠️ 橙区**没能**跟着 slogan 一起缩回 236,是被气泡拖住的:
|
||
slogan 从「独占两行」变成「和品牌字同一行」,本来省出 32px。
|
||
但同一行意味着字底落到 y=34,而气泡圆顶原来就在 y=26 ——
|
||
字会直接压在气泡上。(量过 hero-art.png 的 alpha:那是实心硬边整圆,
|
||
α≥8 和 α≥220 的左缘只差 1px,没有可以压上去的透明薄边。)
|
||
于是气泡整体下移 26→40,下缘跟着从 215.5 走到 229.5,
|
||
而下缘必须留在「宝宝来信」卡顶之上(旧版留 4.5px,这里同样留 4.5):
|
||
229.5 + 4.5 = 234 = 卡顶 = 橙区高 − 16 → 橙区至少 250。
|
||
省下的 32px 里只有 2px 能还给橙区(252→250),
|
||
另外 30px 退回给中间两处空隙(hero-main 10→28、hero-days 8→17),
|
||
也就是回到没有 slogan 那一版的疏密感。
|
||
⚠️ 动 slogan 的字号/行高、动气泡的 top、动上面任一个 margin,
|
||
都要把这四行连同上面这段气泡账一起重算。 */
|
||
height:calc(250px + env(safe-area-inset-top));
|
||
border-radius:0 0 50% 50% / 0 0 44px 44px;
|
||
}
|
||
.hero-top{position:relative;z-index:3;display:flex;align-items:center;justify-content:space-between;height:32px;margin-top:10px}
|
||
.hero-brand{font-size:21px;font-weight:800;letter-spacing:.5px;line-height:1}
|
||
.hero-brand{margin:0;display:flex}
|
||
/* LOGO 高 30(10-01 用户嫌 40 太大、不协调,缩到 30),比 .hero-top 的 32 矮,居中放,这一排的竖向账(见 .home-hero 注释)不动。
|
||
投影和头图白字的 text-shadow 同色系,压在浅色羊水囊光晕上也看得清。 */
|
||
.hero-logo{display:block;height:30px;width:auto;margin:0;filter:drop-shadow(0 1px 3px rgba(120,30,10,.28))}
|
||
/* slogan 对齐 LOGO 的中文那一行(中文在上、拼音在下,整块中线偏低)。用 relative 挪,不进布局,气泡那笔账不受影响 */
|
||
.home-hero .hero-slogan{position:relative;top:-2px}
|
||
/* 三个二级页的左上角标题已删除,这一排只剩右侧按钮。
|
||
.hero-top 是 space-between 且与首页共用(首页左边还有「妈妈盒子」),
|
||
所以不能改父级对齐,只能让按钮组自己靠右 */
|
||
.hero-actions{display:flex;gap:8px;margin-left:auto}
|
||
|
||
/* 品牌字**右边**的 slogan(以前是它下面的两行,这一批挪上来了)。
|
||
|
||
⚠️ margin-right:auto 是这条规则的关键,不是随手加的间距。
|
||
父级 .hero-top 是 space-between 且四页共用,不能动它的对齐;
|
||
auto 边距把那一排的富余空间全吃掉,第二个孩子就不会被甩到最右边,
|
||
而是紧贴着品牌字排。删了它,slogan 会跑到屏幕右上角、压在气泡上。
|
||
(同一个路子见上面的 .hero-actions{margin-left:auto}。)
|
||
|
||
⚠️ nowrap 必须留着。CJK 可以在任意两字之间换行,一旦允许浏览器自己挑,
|
||
10 个字会折成两行 —— 而这一排是写死的 height:32,第二行会直接溢出,
|
||
并且横着压到气泡上(气泡只让开了一行的高度,见 .home-hero 那笔账)。
|
||
|
||
⚠️ 字号 13 / 行高 16 都写死成 px,不是倍数:橙区那笔竖列账和
|
||
「字底 y=34 < 气泡顶 y=40」这条净空都是按这两个数算的。
|
||
|
||
字体走 --font-kid(翩翩体 / 手札体那套手写体)—— 用户要「不要那种规规矩矩的
|
||
字体」。这套字体栈全站共用一份(原先来信正文也用它),不新写几乎一样的第二套:
|
||
两套栈只要有一套漏了某个平台,就会出现「同一台机器上两处手写体长得不一样」,
|
||
而这种漂移没人会去对。手写体笔画细,白字压在橙色渐变上容易发虚,
|
||
所以 font-weight 提到 700、opacity 给到 .92(比旧版 .88 实一点)。 */
|
||
.hero-slogan{position:relative;z-index:3;margin:0 auto 0 9px;
|
||
font-family:var(--font-kid);
|
||
font-size:13px;line-height:16px;font-weight:700;letter-spacing:.3px;
|
||
opacity:.92;white-space:nowrap}
|
||
|
||
/* margin-top 曾被 slogan 压到 10,slogan 挪到品牌字右边后退回 28
|
||
(比原始的 24 还多 4,是气泡下移之后腾出来要填的空)。
|
||
见 .home-hero 里那笔竖列账 —— 这个数不是独立的,改它要连着改橙区高度。 */
|
||
.hero-main{position:relative;z-index:3;display:flex;align-items:flex-start;gap:6px;margin:28px 0 0 45.5px}
|
||
.week-ring{position:relative;width:79px;height:79px;flex:0 0 auto;border-radius:50%;background:rgba(255,255,255,.07)}
|
||
.ring-svg{width:100%;height:100%;transform:rotate(-90deg);display:block}
|
||
.ring-bg{fill:none;stroke:rgba(255,255,255,.26);stroke-width:6}
|
||
.ring-fg{fill:none;stroke:#fff;stroke-width:6;stroke-linecap:round;stroke-dasharray:1000;stroke-dashoffset:1000;transition:stroke-dashoffset 1.4s var(--ease)}
|
||
.week-num{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center}
|
||
.week-num b{font-size:38px;font-weight:800;line-height:1;letter-spacing:-1px}
|
||
.week-num span{font-size:12px;opacity:.92;margin-top:3px}
|
||
.week-plus{font-size:13px;font-weight:600;opacity:.95;margin-top:37px}
|
||
/* 首页 hero 主插画:取自设计稿像素。设计稿里气泡下缘被白卡遮住,
|
||
已按拟合圆(设计坐标 圆心 620.1,246.3 半径 187.4)补全为整圆,
|
||
378px 图 → 189.5 CSS px。
|
||
|
||
⚠️ top 由 26 改成 40,是被 slogan 逼的,不是调构图。
|
||
slogan 挪到品牌字右边之后,字底落在 y=34;气泡圆顶原来就在 y=26,
|
||
白字会直接盖在气泡上。解过这张 PNG 的 alpha 通道确认过:
|
||
这幅画就是**实心整圆、边缘是硬的**(α≥8 与 α≥220 的左缘只差 1px),
|
||
没有可以让字压上去的透明薄边,所以只能整幅往下让。
|
||
下移之后圆心 (屏宽−25−94.75, 134.75)、下缘 40+189.5=229.5,
|
||
必须留在「宝宝来信」卡顶(234)之上 —— 这就是橙区高必须 ≥250 的来源。
|
||
改 top 前先读 .home-hero 里那笔竖列账。 */
|
||
/* 会动的宝宝(2026-10-04 起按孕周 9 个阶段):每阶段 = 羊水囊 + 宝宝的整幅方图,囊壁约占图宽 86%,
|
||
GIF 480×480、48 帧 × 80ms,静图是同一首帧。原 25 周那颗囊的摆位:宽高 .8453H,圆心距右 .42665H、距顶 .5H(H = 橙区高),
|
||
其它阶段围绕同一圆心按 --k 缩放。羽化遮罩 84%→100% 把方块边化进空背景。 */
|
||
/* 2026-10-04:孕囊大小跟着宝宝变 —— --k 是相对原 25 周那颗囊的倍数(JS 按孕周阶段写,见 js/hero-fx.js STAGES)。
|
||
圆心固定在原来那颗囊的圆心(距右 .42665H、距顶 .5H),只改直径,所以小囊会往圆心收、大囊往四周撑。 */
|
||
/* 2026-10-04 用户:「右侧小宝宝太大」—— 全阶段统一 ×.82(--s),圆心不动 */
|
||
.hero-baby{--H:calc(250px + env(safe-area-inset-top));--k:1;--s:.82;--d:calc(var(--H) * .8453 * var(--k) * var(--s));
|
||
position:absolute;z-index:2;
|
||
top:calc(var(--H) * .5 - var(--d) / 2);
|
||
right:calc(var(--H) * .42665 - var(--d) / 2);
|
||
width:var(--d);height:var(--d);
|
||
transition:width .9s ease,height .9s ease,top .9s ease,right .9s ease;
|
||
pointer-events:none;user-select:none}
|
||
.hero-kid{position:absolute;inset:0;width:100%;height:100%;
|
||
object-fit:cover;background:transparent;opacity:0;transition:opacity .8s ease;
|
||
-webkit-mask-image:radial-gradient(closest-side,#000 84%,transparent 100%);
|
||
mask-image:radial-gradient(closest-side,#000 84%,transparent 100%)}
|
||
.hero-kid.is-on{opacity:1}
|
||
/* 阳光 + 水波:整块橙区一张画布,加色混合,叠在宝宝上、文字下 */
|
||
.hero-fx{position:absolute;z-index:2;left:0;top:0;width:100%;height:100%;pointer-events:none;mix-blend-mode:screen;opacity:0;transition:opacity 1.2s ease}
|
||
.hero-fx.is-on{opacity:1}
|
||
/* 系统开了「减少动态效果」就全部停下:只留静图,光效不画 */
|
||
@media (prefers-reduced-motion:reduce){
|
||
#heroKid,.hero-fx{display:none}
|
||
}
|
||
|
||
/* 天数文案:一张毛玻璃小卡,不再是裸字浮在橙底上。
|
||
⚠️ 这块的高度是有硬预算的,改字号前先算一遍:
|
||
橙区固定 250px,而「宝宝来信」卡 margin-top:-16 → 卡顶落在 y=234,
|
||
且它横跨 x 75..324,和这张小卡(x 17.5..~158)左半边是重叠的。
|
||
往上推:hero-top 42 + hero-main(28+79) = 149,本块 margin-top 17 → 顶在 166。
|
||
所以卡身高度必须 ≤ 68px 才留得出安全间隙。
|
||
行高全部写死成 px 而不是倍数,就是为了让这笔账可算、不随字体变。
|
||
当前:padding 7+8 + who 16 + gap 1 + tail 20 = 52 → 底边 218,离 234 还有 16px。
|
||
(margin-top 曾为 slogan 压到 8,slogan 挪走后退回 17,见 .home-hero 里的竖列账) */
|
||
.hero-days{position:relative;z-index:3;margin:17px 0 0;padding-left:17.5px;max-width:196px}
|
||
.hd-card{display:inline-flex;flex-direction:column;gap:1px;padding:7px 13px 8px;border-radius:16px;
|
||
background:rgba(255,255,255,.17);border:1px solid rgba(255,255,255,.3);
|
||
box-shadow:0 6px 18px rgba(163,60,38,.13);
|
||
-webkit-backdrop-filter:blur(12px) saturate(1.25);backdrop-filter:blur(12px) saturate(1.25)}
|
||
/* 不支持 backdrop-filter 的机器上,半透明白会发灰、字浮不起来,
|
||
把底色调实一点把对比度补回来 */
|
||
@supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
|
||
.hd-card{background:rgba(255,255,255,.26)}
|
||
}
|
||
/* gap 从 5px 改成 0,那 5px 挪到 .hd-heart 的 margin-right 上:
|
||
现在这一行是「♥ 小名 + 在妈妈肚子里」,小名和后半句必须**贴着**,
|
||
留着 gap:5px 会在中间豁开一道缝,读起来像两个词。 */
|
||
.hd-who{display:flex;align-items:center;gap:0;font-size:13px;font-weight:700;opacity:.95;line-height:16px;min-width:0}
|
||
/* ⚠️ 小名那格是 maxlength="12"。12 字 ×14px = 168px,加上 ♥ 和「在妈妈肚子里」
|
||
远超 .hero-days 的 max-width:196px。这一行是 flex(默认不换行),
|
||
不给截断就会直接溢出到旁边的插画上。
|
||
截断的优先级放在**小名**上而不是后半句:小名被截成「小汤圆宝宝…」还认得出,
|
||
后半句被截掉则整句话不成话。 */
|
||
.hd-who b{font-size:14px;font-weight:800;letter-spacing:.2px;
|
||
min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
/* 后半句不参与压缩,永远完整 */
|
||
.hd-where{flex:0 0 auto}
|
||
.hd-heart{flex:0 0 auto;display:block;margin-right:5px}
|
||
/* 整体 nowrap:这张卡就是按这一行的宽度定的,断行会把数字甩下去 */
|
||
.hd-tail{white-space:nowrap;font-size:12.5px;opacity:.88;line-height:20px}
|
||
.hd-tail b{font-size:17px;font-weight:800;letter-spacing:-.3px;opacity:1;margin:0 1px}
|
||
|
||
/* ===== 头部左侧 2026-10-01 改版:倒计时胶囊 / 大孕周 / 水果进度条 / 玻璃卡(结构与竖向账见 index.html .hero-pane 注释)=====
|
||
旧的 .hero-main / .week-ring / .hero-days 已不在页面上,相关规则保留无害。 */
|
||
.hero-pane{position:relative;z-index:3;display:flex;flex-direction:column;align-items:flex-start;
|
||
width:172px;margin:12px 0 0 8px;text-shadow:0 1px 3px rgba(120,30,10,.28)}
|
||
.hi-due{display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 10px 0 8px;border-radius:999px;
|
||
font-size:11.5px;font-weight:700;white-space:nowrap;
|
||
background:linear-gradient(90deg,rgba(255,255,255,.28),rgba(255,255,255,.12));border:1px solid rgba(255,255,255,.35)}
|
||
.hi-due b{font-size:13.5px;font-weight:900;margin:0 1px;color:#FFF3C4}
|
||
.hi-heart{flex:0 0 auto;display:block;animation:hiBeat 1.6s ease-in-out infinite}
|
||
@keyframes hiBeat{0%,40%,100%{transform:scale(1)}20%{transform:scale(1.25)}30%{transform:scale(.95)}}
|
||
.hi-week{display:flex;align-items:flex-end;height:50px;margin-top:6px}
|
||
.hi-week b{font-size:54px;font-weight:900;line-height:46px;letter-spacing:-2px;font-variant-numeric:tabular-nums}
|
||
.hi-unit{display:flex;flex-direction:column;justify-content:flex-end;margin:0 0 3px 5px;line-height:1}
|
||
.hi-unit em{font-style:normal;font-size:17px;font-weight:800}
|
||
.hi-unit span{margin-top:3px;font-size:12px;font-weight:700;opacity:.92}
|
||
.hi-prog{display:flex;align-items:center;gap:8px;width:100%;height:16px;margin-top:8px}
|
||
.hi-bar{position:relative;flex:1;height:6px;border-radius:3px;background:rgba(255,255,255,.28)}
|
||
.hi-fill{position:absolute;left:0;top:0;bottom:0;width:0;border-radius:3px;
|
||
background:linear-gradient(90deg,rgba(255,255,255,.7),#fff);box-shadow:0 0 8px rgba(255,255,255,.55);
|
||
transition:width 1.4s var(--ease)}
|
||
.hi-knob{position:absolute;right:-9px;top:50%;width:18px;height:18px;margin-top:-9px;border-radius:50%;
|
||
display:grid;place-items:center;font-size:12px;line-height:1;text-shadow:none;
|
||
background:#fff;box-shadow:0 2px 6px rgba(150,50,30,.3);animation:hiBob 2.4s ease-in-out infinite}
|
||
.hi-knob:empty{display:none}
|
||
@keyframes hiBob{0%,100%{transform:translateY(0)}50%{transform:translateY(-2px)}}
|
||
.hi-size{flex:0 0 auto;font-size:11.5px;font-weight:700;opacity:.95;white-space:nowrap}
|
||
.hi-size:empty{display:none}
|
||
.hero-pane .hd-card{margin-top:10px;padding:7px 12px 8px}
|
||
.hero-pane .hd-who{font-size:12.5px}
|
||
.hero-pane .hd-who b{font-size:13.5px;margin-right:1px}
|
||
/* 产后:「已出生」三个字当主角太宽,收一号;单位留空 */
|
||
.hero-pane.is-born .hi-week b{font-size:40px;letter-spacing:0}
|
||
@media (prefers-reduced-motion:reduce){.hi-heart,.hi-knob{animation:none}.hi-fill{transition:none}}
|
||
/* 2026-10-01 二次调整(用户:「LOGO 下边、小孩左边太拥挤」):四层减成三层,留白拉开。
|
||
去掉底下那张「晓晓在妈妈肚子里 / 已经生活了 N 天」玻璃卡 —— 223 天 = 31 周 +6 天,和大数字是同一件事说两遍,
|
||
还多一个边框。DOM 保留(JS 照写 heroWho/heroDays,产后态也不用改),只是不显示。
|
||
剩下:倒计时胶囊 → 大孕周 → 水果进度条,整组往下放一点、间距加大,竖向落在 LOGO 和「宝宝来信」卡之间的中段。 */
|
||
.hero-pane{margin-top:20px}
|
||
.hero-pane .hd-card{display:none}
|
||
.hi-week{margin-top:12px}
|
||
.hi-prog{margin-top:14px}
|
||
|
||
/* 「宝宝来信」卡:设计稿 x150..648 → left 75 · 宽 249 · 高 80。
|
||
气泡补全成整圆后下缘到 215.5,卡顶必须 ≥215.5 才不会再压住宝宝,
|
||
故上移量由 34.5 改为 16(橙区 252 − 16 = 卡顶 236)。
|
||
橙区因 slogan 从 236 加到 252 之后,卡顶跟着从 220 落到 236,
|
||
离气泡下缘 215.5 更远了,这一条只会更安全,不用动。 */
|
||
.letter-card{
|
||
position:relative;z-index:6;display:flex;align-items:center;gap:9px;
|
||
width:249px;height:80px;margin:-16px 0 0 75px;
|
||
background:rgba(255,255,255,.92);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
|
||
border-radius:20px;padding:0 12px 0 13.5px;box-shadow:0 10px 26px rgba(150,60,40,.16);
|
||
}
|
||
/* 没有未读时整张收起来(hideLetterCard() 挂的类)。
|
||
这个库里没有全局 .hide,都是逐个元素声明的(.moment.hide / .rl-gift.hide 同一个路子)。 */
|
||
.letter-card.hide{display:none}
|
||
/* 信封外面包一层,只为了给「有新回信」的小红点一个定位参照 */
|
||
.lc-envwrap{position:relative;flex:0 0 auto;line-height:0}
|
||
.lc-env{width:64px;height:auto;display:block;filter:drop-shadow(0 4px 8px rgba(200,90,70,.22))}
|
||
.letter-card.has-new .lc-envwrap::after{
|
||
content:"";position:absolute;top:2px;right:-1px;width:10px;height:10px;border-radius:50%;
|
||
background:var(--brand);box-shadow:0 0 0 2.5px #fff;animation:newPulse 1.6s var(--ease) infinite;
|
||
}
|
||
@keyframes newPulse{0%,100%{transform:scale(1)}50%{transform:scale(1.28)}}
|
||
/* 卡内正文固定三行:标题 / 摘要 / 去看看。overflow:hidden 兜底,
|
||
哪行文案再长也不会挤出第四行 */
|
||
.lc-body{min-width:0;flex:1;overflow:hidden}
|
||
.lc-title{font-size:16px;font-weight:800;color:var(--ink);line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
.lc-desc{font-size:11.5px;color:var(--ink-2);margin:4px 0 5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
/* 尖括号必须跟文字同行:宝宝回信后这行会变长,之前它会被挤到下一行单独站着 */
|
||
.lc-link{display:flex;align-items:center;gap:3px;font-size:12.5px;font-weight:700;color:var(--brand);white-space:nowrap}
|
||
.lc-link span{min-width:0;overflow:hidden;text-overflow:ellipsis}
|
||
.lc-link i{flex:0 0 auto;font-style:normal}
|
||
|
||
/* ============ 首页 · body ============ */
|
||
.home-body{padding:0 26px}
|
||
/* ⚠️ 这两条原来挂在 .sec-title 上。首页不再有 .sec-title 了,选择器必须跟着换到
|
||
新的第一块 .tool-dock —— 忘了换不会报错,只会静默失效(来信卡收起来时
|
||
头图底下那 64px 的洞补不回来),所以 smoke 里专门钉了一条。 */
|
||
/* 这两条写成「谁是第一块就给谁」:2026-09-30 曾在工具区前加过「孕期每日小打卡」,
|
||
同日按用户要求删掉,第一块又回到 .tool-dock。 */
|
||
.home-body>:first-child{margin-top:21px}
|
||
/* 来信卡收起来时,它原本占的 64px 流高(margin-top:-16 + height:80)没了,
|
||
只剩这 21px 顶着一大片橙色头图,太挤。补到 30px。
|
||
走类名而不是 :has(),老一点的移动端浏览器上 :has() 不一定有。 */
|
||
.home-body.no-letter>:first-child{margin-top:30px}
|
||
.page-body{padding:0 18px;margin-top:-46px;position:relative;z-index:5}
|
||
.page-body.no-top{margin-top:8px}
|
||
|
||
/* ============ 首页三大块的公共外壳 ============ */
|
||
/* 上一稿这三块各造了一种底:米色托盘 / 没有容器 / 白气泡 + 糖果卡,
|
||
四种表面语言堆在一屏里,结果就是「不规矩」。
|
||
这一稿收敛成一条规矩:**结构可以各不相同,表面必须一模一样**。
|
||
三块统一是「白色通栏色块」—— 左右各吃掉 .home-body 的 26px 内边距顶到屏幕边缘,
|
||
块与块之间露出米色页底当缝。结构上的差别(宫格 / 时间线 / 横向卡带)一点没动,
|
||
变化留在骨架里,表面不掺和,这样才是既不单调又不乱。
|
||
颜色只允许出现在小构件上:工具图标块、书封、时间线圆点、AI 气泡、各种胶囊。
|
||
|
||
⚠️ padding 左右必须正好等于 26,抵回负外边距,里面的内容才和页面其余部分对齐 ——
|
||
对齐的是内容,出血的是底色,这两件事要分开。
|
||
⚠️ 三块的圆角、底色、左右内边距改成在这里一处定义。以后要调,改这一条,
|
||
别再回到各自的规则里单独写,那正是上一稿乱掉的原因。 */
|
||
.tool-dock,.game-promo,.preg-tips,.today-line,.shelf{
|
||
margin:0 -26px;padding:16px 26px 18px;border-radius:26px;
|
||
background-color:#fff;
|
||
/* ⚠️ 这两条是一对,缺一不可,而且必须一起看:
|
||
它们让每一块自己成为一个**层叠上下文**,好让块里那枚 .wm(大字水印)
|
||
用 z-index:-1 停在「白底之上、内容之下」这一层。
|
||
position:relative 单写不够 —— z-index 是 auto 时不建层叠上下文,
|
||
-1 就会一路掉到这块白底的**后面**去,水印整个消失。
|
||
所以这里的 z-index:0 看着像句废话,其实是水印能不能显示的开关。 */
|
||
position:relative;z-index:0;
|
||
}
|
||
/* 块间距。给后两块,第一块的上间距另有规则(来信卡收放要用)。
|
||
⚠️ 这是**块与块之间**的缝。某一块自己内部觉得挤,要调的是那块的 padding,
|
||
不是这里 —— 改这里会把三块的关系一起改掉。 */
|
||
.tool-dock,.game-promo,.preg-tips,.today-line,.shelf{margin-top:16px}
|
||
|
||
/* ===== 后两块的暖色渐变底(本批新增)=====
|
||
用户原话:「在那个宝宝的今日脚印那块,稍微给背景它加一点渐变」
|
||
「本周孕育指南的也是……但不用加那么重」
|
||
—— 所以两块同一套形状、不同强度;.tool-dock **保持纯白**,用户没提,
|
||
而且它背后压着那枚「妈妈」大字水印,底色一动水印的浓淡就得重调。
|
||
|
||
⚠️⚠️ 角度必须是 90deg,而且左边 32% 必须保持**纯白**。这不是审美选择,
|
||
是被「今日脚印」那条时间线的实现方式逼出来的硬约束:
|
||
时间线是一条 1.5px 的竖线(.today-line::before),线上那些圆点靠
|
||
**一圈不透明的外壳底色**把线「咬断」,一共四处,全部写死 #fff:
|
||
.tl-h-dot box-shadow 0 0 0 3.5px #fff … 0 0 0 8px #fff(还负责盖住线头)
|
||
.st-dot box-shadow 0 0 0 3px #fff
|
||
.ab-dot box-shadow 0 0 0 3px #fff
|
||
.ai-bubble::after background:#fff(把最后一个点以下那截线擦掉)
|
||
这四处全都钉在竖线那一列(--tl-x ≈ 63.5px,算上光晕最远到 x≈76px)。
|
||
底色一旦在那一列变成暖色,这四处就成了四块**白斑**压在暖底上 ——
|
||
而且是「看着像渲染没刷新」的那种,不是「颜色不好看」。
|
||
90deg 的渐变颜色**只跟 x 有关、与 y 和卡高无关**,才给得出一句
|
||
可验证的保证:x < 32% 之内恒为 #fff。斜着走(比如 150deg)就不行 ——
|
||
同一列的顶部和底部会落在渐变的不同位置,卡一变高约束就悄悄破了。
|
||
余量账(最窄的 320 屏,外壳出血后宽 336px):
|
||
白区 = 336 × 32% = 107.5px,光晕最远 76px,余 31.5px。
|
||
屏越宽白区越宽(390 屏 130px),320 是最紧的一档,够。
|
||
⚠️ 要改角度或起止位置,先把上面四处 #fff 一起解决掉,否则一定出白斑。
|
||
|
||
⚠️ .shelf 那块**没有**这个约束(它的书卡各自带不透明底色,叠压头像描的边
|
||
走 --sb-bg,都不依赖外壳)。这里仍写成同样的 32% 白区,纯粹是为了让上下
|
||
相邻的两块「渐变从同一个位置开始」—— 起点不齐会看着像没对齐的意外。
|
||
别把它当成 .shelf 自己的技术要求。
|
||
|
||
⚠️ 用 background-image 而不是 background 简写:简写会把上面那条公共规则里的
|
||
background-color:#fff 一起清掉,渐变要是哪天被覆盖或不支持,就直接透出
|
||
页面的米色底了。分开写,白底始终在最下面兜着。 */
|
||
.today-line{
|
||
background-image:
|
||
/* 右上角一点柔光,让它不只是「从左到右变暖」。放在 x=96%,
|
||
离竖线那一列(x≈63.5px)远得很,不参与上面那笔账。 */
|
||
radial-gradient(130px 90px at 96% 3%, rgba(255,206,178,.30), rgba(255,206,178,0) 72%),
|
||
linear-gradient(90deg,#fff 0%,#fff 32%,#FFF9F4 64%,#FFF2E7 100%);
|
||
}
|
||
/* 「不用加那么重」:同样的 90deg、同样的 32% 白区,终点浅一半
|
||
(#FFF8F3 之于 #FFF2E7),也不加那道柔光。 */
|
||
.shelf{
|
||
background-image:linear-gradient(90deg,#fff 0%,#fff 32%,#FFFCFA 64%,#FFF8F3 100%);
|
||
}
|
||
|
||
/* 大字水印「兜爸」(2026-10-01 用户要求由「妈妈」改成品牌名;下面「动手的是妈妈」那段是改之前的取字理由,留作历史)。**全站只有一枚,在工具区(.tool-dock)。**
|
||
|
||
⚠️ 上一稿是三块各放一枚,被否了:「今日成长脚印和本周孕育指南那两个去掉,
|
||
只保留工具那个。」三枚同样的字顺着首页排下来,本身又成了一种重复 ——
|
||
一枚是印章,三枚是底纹,而底纹这个方向已经翻过两次车了。
|
||
**别再往 .today-line / .shelf 上加回去。**
|
||
|
||
⚠️ 它和标题是一对:标题写着「小汤圆的孕育工具」(跟着小名走),
|
||
水印压在后面写着「妈妈」。工具是给宝宝用的,动手的是妈妈。
|
||
所以水印这两个字**不跟小名变**,它本来就不是在说宝宝。
|
||
|
||
尺寸和位置是按「露出多少」倒推的,不是随手填的:
|
||
· 工具区从块顶到宫格之间只有约 75px 是透空的(16 内边距 + 抬头行 + 说明行),
|
||
往下整片都被不透明的工具卡铺满(.mini-card 是实心渐变底)。
|
||
· 132px 的字,字面高约 113px,于是**露出上面六成,下面四成沉到卡片背后** ——
|
||
「可以被数胎动、孕期体重那些卡挡住,只保留露出部分就行」,说的就是这个。
|
||
· 再往大调会好看,但露出的比例会跟着掉;掉到一半以下时,「妈妈」两个字
|
||
只剩上半截,就认不出来了。调 --wm-size 之前先想清楚这笔交换。
|
||
|
||
⚠️ letter-spacing 用 em 不用 px:跟着字号缩放,改 --wm-size 时不用再回来改这行。
|
||
负值是要的 —— 两个字挨紧才像一枚印章,松开就散成两个字了。
|
||
⚠️ pointer-events:none:工具卡整张都是可点区域,水印绝不能吃掉点击。
|
||
z-index:-1 本来也轮不到它接事件,但这行是白纸黑字的保险。 */
|
||
.wm{
|
||
position:absolute;top:0;right:16px;z-index:-1;
|
||
font-size:var(--wm-size);font-weight:900;line-height:1;letter-spacing:-.04em;
|
||
color:var(--wm-color);
|
||
pointer-events:none;user-select:none;-webkit-user-select:none;
|
||
}
|
||
/* 水印比抬头那条透空带高,得有人把它裁在圆角里,否则字面顶部会从块的
|
||
上边缘冒出去,糊在头图底下。裁在这块自己身上就够 —— 只有它有水印。
|
||
(宫格四周有 26px 内边距,工具卡的投影够不到边缘,裁掉不了任何东西。) */
|
||
.tool-dock{overflow:hidden}
|
||
|
||
/* 三块的抬头用同一套字号和间距。上一稿我给三个「更多」入口做了三种样子
|
||
(白胶囊 / 灰字 / 灰字),毫无理由地不一致 —— 同一层级的东西就该长一样。
|
||
⚠️ .dock-all 原来是白底胶囊,托盘变白之后白底压白底会直接消失,
|
||
顺手一起并进这条统一规则里了。 */
|
||
.dock-title,.tl-h-title,.sh-title{font-size:16.5px;font-weight:800;letter-spacing:-.2px}
|
||
.dock-all,.tl-h-all,.sh-all{
|
||
margin-left:auto;flex:0 0 auto;white-space:nowrap;
|
||
font-size:12px;font-weight:600;color:var(--muted);
|
||
}
|
||
.dock-all:active,.tl-h-all:active,.sh-all:active{opacity:.5}
|
||
/* 三块的说明也用同一套。上一稿 .dock-note 是半透明白 chip、另两条是灰字,
|
||
同样是没道理的三选一 —— chip 那个样子是为了在深色托盘上读得清,
|
||
底一变白,chip 的白底就没意义了,统一回灰字最干净。 */
|
||
.dock-note,.sh-note,.tl-h-note{font-size:12px;color:var(--muted);line-height:1.5}
|
||
|
||
/* ============ 宝宝消消乐 · 推广入口(2026-09-30)============
|
||
糖果色渐变大卡:左边名字 + 一句玩法 + 「开始玩」胶囊,右边 3×3 小棋盘循环演示「三连消除」,
|
||
角上三颗星星闪烁。整张卡是一个按钮。动效在 prefers-reduced-motion 下关掉。 */
|
||
.game-promo.hide{display:none}
|
||
.gp-card{position:relative;display:flex;align-items:center;gap:10px;width:100%;overflow:hidden;
|
||
border:0;border-radius:22px;padding:16px 14px 16px 18px;text-align:left;font:inherit;color:#fff;
|
||
background:linear-gradient(125deg,#FF8FA3 0%,#FFB07C 55%,#FFD36E 100%);
|
||
box-shadow:0 10px 24px rgba(255,130,120,.28)}
|
||
.gp-card::before{content:"";position:absolute;left:-40px;bottom:-60px;width:160px;height:160px;border-radius:50%;
|
||
background:rgba(255,255,255,.16)}
|
||
.gp-card:active{transform:scale(.98)}
|
||
.gp-new{position:absolute;left:0;top:0;font-size:10.5px;font-weight:800;color:#E4476A;background:#FFF3C4;
|
||
border-radius:0 0 12px 0;padding:3px 10px 3px 12px;letter-spacing:.5px}
|
||
.gp-text{position:relative;flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-start;padding-top:8px}
|
||
.gp-name{font-size:21px;font-weight:900;letter-spacing:.5px;text-shadow:0 2px 0 rgba(214,86,86,.35)}
|
||
.gp-sub{margin-top:5px;font-size:12px;line-height:1.55;color:rgba(255,255,255,.95)}
|
||
.gp-cta{margin-top:10px;display:inline-flex;align-items:center;gap:3px;border-radius:999px;padding:6px 14px;
|
||
font-size:13px;font-weight:800;color:#E4476A;background:#fff;box-shadow:0 4px 10px rgba(200,70,70,.2);
|
||
animation:gpBeat 2.2s ease-in-out infinite}
|
||
@keyframes gpBeat{0%,70%,100%{transform:scale(1)}80%{transform:scale(1.08)}90%{transform:scale(.97)}}
|
||
.gp-board{position:relative;flex:0 0 auto;display:grid;grid-template-columns:repeat(3,30px);gap:4px;padding:6px;
|
||
border-radius:14px;background:rgba(255,255,255,.35);transform:rotate(4deg)}
|
||
.gp-board i{display:grid;place-items:center;width:30px;height:30px;border-radius:9px;background:#fff;
|
||
font-style:normal;font-size:18px;line-height:1;box-shadow:0 2px 0 rgba(220,120,100,.25);
|
||
transition:transform .35s cubic-bezier(.3,1.6,.5,1),opacity .3s}
|
||
.gp-board i.is-pop{transform:scale(1.3);opacity:0}
|
||
.gp-board i.is-in{animation:gpDrop .45s cubic-bezier(.3,1.5,.5,1)}
|
||
@keyframes gpDrop{from{transform:translateY(-16px);opacity:0}to{transform:none;opacity:1}}
|
||
.gp-board i.is-hint{background:#FFF6D6;box-shadow:0 0 0 2px #FFD36E}
|
||
.gp-spark{position:absolute;color:#fff;font-size:12px;animation:gpTw 1.8s ease-in-out infinite;opacity:0}
|
||
.gp-spark.s1{right:12px;top:8px}.gp-spark.s2{right:120px;top:14px;animation-delay:.6s;font-size:9px}
|
||
.gp-spark.s3{right:16px;bottom:10px;animation-delay:1.2s;font-size:10px}
|
||
@keyframes gpTw{0%,100%{opacity:0;transform:scale(.6)}50%{opacity:1;transform:scale(1)}}
|
||
@media (prefers-reduced-motion:reduce){.gp-cta,.gp-spark{animation:none}.gp-spark{opacity:.8}}
|
||
|
||
/* ============ 3D 婴儿房 · 页面上的一道空隙(2026-10-01 三版)============
|
||
这一块**故意没有底色、没有圆角卡片**:它是页面上开的缝,里面是铺在整页背后的房间。
|
||
.nyp-layer 的 height / transform 由 JS 按 .screen 可视区每帧写入(见 app.js nurseryInit),这里别再给它写 top/transform。
|
||
::after = 上下模块压在房间上的阴影,要盖在图层之上、按钮之下。 */
|
||
.ny-peek{position:relative;margin:16px -26px 0;height:340px;overflow:hidden;background:#E6EEF3}
|
||
.nyp-layer{position:absolute;left:0;top:0;width:100%;height:812px;will-change:transform;
|
||
display:flex;align-items:center;justify-content:center;background:#E6EEF3}
|
||
.nyp-layer img{display:block;width:88%;max-width:420px;height:auto;margin-top:-40px}
|
||
/* 2026-10-01h:封面改成满幅远景(天空/远山/田野铺满整张图),不再是「纯色底上一栋房子」→ 图铺满缝宽、不羽化,
|
||
左右下沿不会再露底色;底色只在图片加载前兜底,取图顶天色 */
|
||
.nyp-layer img{width:100%;max-width:none;margin-top:30px}
|
||
/* 上下沿融进页面底色(2026-10-01 用户反馈:和上面孕期小知识、下面今日脚印「衔接得有点硬」):
|
||
原来是两道向内的阴影 = 一条硬切口;改成上下各一段 --bg → 透明 的渐隐,房子像从页面里慢慢浮出来、再沉回去。 */
|
||
.ny-peek::after{content:"";position:absolute;inset:0;pointer-events:none;z-index:1;
|
||
background:linear-gradient(var(--bg) 0,rgba(248,243,239,.82) 18px,rgba(248,243,239,0) 78px),
|
||
linear-gradient(0deg,var(--bg) 0,rgba(248,243,239,.85) 14px,rgba(248,243,239,0) 64px)}
|
||
.nyp-chip{position:absolute;left:26px;top:16px;z-index:2;font-size:11px;font-weight:800;color:#E0708A;letter-spacing:.3px;
|
||
background:rgba(255,255,255,.86);border-radius:999px;padding:3px 10px;box-shadow:0 2px 8px rgba(224,112,138,.15)}
|
||
.nyp-bar{position:absolute;left:18px;right:18px;bottom:16px;z-index:2;display:flex;align-items:center;gap:10px;
|
||
padding:10px 10px 10px 14px;border-radius:18px;background:rgba(255,255,255,.82);
|
||
-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:0 6px 18px rgba(160,90,90,.16)}
|
||
.nyp-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
|
||
.nyp-txt b{font-size:15px;font-weight:900;color:#5A3E37;letter-spacing:.3px}
|
||
.nyp-txt span{font-size:11.5px;color:#8A6C63;line-height:1.4}
|
||
.nyp-txt span em{font-style:normal;color:#E0708A;font-weight:900}
|
||
.nyp-btn{flex:0 0 auto;display:inline-flex;align-items:center;gap:3px;border:0;border-radius:999px;padding:8px 14px;font:inherit;
|
||
font-size:13px;font-weight:800;color:#fff;background:linear-gradient(135deg,#F9B4C1,#F18DA2);box-shadow:0 4px 10px rgba(224,112,138,.32);
|
||
animation:nypNudge 2.8s ease-in-out infinite}
|
||
.nyp-btn:active{transform:scale(.96)}
|
||
@keyframes nypNudge{0%,80%,100%{transform:translateX(0)}86%{transform:translateX(3px)}92%{transform:translateX(0)}}
|
||
/* 夜间:JS 换成开灯版图,底色跟着换成图边的 #2C3350 */
|
||
.ny-peek.is-night,.ny-peek.is-night .nyp-layer{background:#2D3559}
|
||
/* 夜间:浅底色渐隐进深色夜景容易发灰,渐隐段收短一半,像夜里从门缝透出来 */
|
||
.ny-peek.is-night::after{background:linear-gradient(var(--bg) 0,rgba(248,243,239,.6) 10px,rgba(248,243,239,0) 40px),
|
||
linear-gradient(0deg,var(--bg) 0,rgba(248,243,239,.6) 8px,rgba(248,243,239,0) 34px)}
|
||
.ny-peek.is-night .nyp-bar{background:rgba(30,36,60,.78)}
|
||
.ny-peek.is-night .nyp-txt b{color:#FFF3F5}
|
||
.ny-peek.is-night .nyp-txt span{color:#D9C5D0}
|
||
.ny-peek.is-night .nyp-txt span em{color:#FFB3C3}
|
||
@media (prefers-reduced-motion:reduce){.nyp-btn{animation:none}}
|
||
|
||
/* ============ 孕期小知识(2026-09-30)============
|
||
外壳是公共白色通栏。里面三层:
|
||
① .pt-today 今日小知识大卡:暖粉渐变 + 右上角一颗慢慢浮动的「宝宝大小」emoji(本周水果);
|
||
底部 7 个圆点是本周第 1–7 天,今天实心、以前可回看、以后锁着。
|
||
② .pt-grid 四张马卡龙色小卡:宝宝 / 妈妈 / 饮食 / 注意,进入视口时依次浮上来。
|
||
③ .pt-foot 一行免责小字。
|
||
动效全部在 prefers-reduced-motion 下关掉。 */
|
||
.preg-tips.hide{display:none}
|
||
.pt-head{display:flex;align-items:baseline;gap:8px;margin-bottom:10px}
|
||
.pt-title{font-size:16.5px;font-weight:800;letter-spacing:-.2px}
|
||
.pt-when{margin-left:auto;font-size:12px;font-weight:700;color:var(--brand);
|
||
background:#FFF0EA;border-radius:999px;padding:3px 10px}
|
||
.pt-today{position:relative;overflow:hidden;border-radius:20px;padding:14px 16px 12px;
|
||
background:linear-gradient(135deg,#FFE9E1 0%,#FFF1E6 55%,#FFF7EE 100%)}
|
||
.pt-today::after{content:"";position:absolute;right:-30px;top:-40px;width:130px;height:130px;border-radius:50%;
|
||
background:radial-gradient(circle,rgba(255,255,255,.75),rgba(255,255,255,0) 70%);pointer-events:none}
|
||
.pt-float{position:absolute;right:14px;top:10px;font-size:34px;line-height:1;z-index:1;
|
||
animation:ptFloat 3.6s ease-in-out infinite;filter:drop-shadow(0 4px 6px rgba(200,110,80,.18))}
|
||
@keyframes ptFloat{0%,100%{transform:translateY(0) rotate(-4deg)}50%{transform:translateY(-6px) rotate(4deg)}}
|
||
.pt-badge{display:inline-block;font-size:11px;font-weight:700;color:#fff;border-radius:999px;padding:2px 9px;
|
||
background:linear-gradient(90deg,#F4593C,#FF8A66)}
|
||
.pt-body{min-height:88px;padding-right:44px}
|
||
.pt-body.is-in{animation:ptIn .42s var(--ease)}
|
||
@keyframes ptIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
|
||
.pt-t{margin-top:8px;font-size:16px;font-weight:800;color:#5A2E22;letter-spacing:-.2px}
|
||
.pt-d{margin-top:5px;font-size:13px;line-height:1.65;color:#6B4B40}
|
||
.pt-days{display:flex;justify-content:space-between;margin-top:10px;padding-top:10px;border-top:1px dashed rgba(224,74,46,.18)}
|
||
.pt-day{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;gap:3px;
|
||
background:none;border:0;padding:0;font:inherit;color:#B08A7C}
|
||
.pt-day i{display:block;width:26px;height:26px;border-radius:50%;line-height:26px;text-align:center;
|
||
font-style:normal;font-size:11.5px;font-weight:700;background:rgba(255,255,255,.75);color:#C07A64;
|
||
transition:transform .2s var(--ease),background .2s}
|
||
.pt-day span{font-size:10px}
|
||
.pt-day.is-past i{background:#fff;color:#E0725A}
|
||
.pt-day.is-today i{background:linear-gradient(135deg,#F4593C,#FF8A66);color:#fff;
|
||
box-shadow:0 0 0 3px rgba(244,89,60,.18);animation:ptPulse 2.4s ease-in-out infinite}
|
||
.pt-day.is-today span{color:var(--brand);font-weight:700}
|
||
@keyframes ptPulse{0%,100%{box-shadow:0 0 0 3px rgba(244,89,60,.18)}50%{box-shadow:0 0 0 6px rgba(244,89,60,.06)}}
|
||
.pt-day.is-sel i{transform:scale(1.14)}
|
||
.pt-day.is-sel:not(.is-today) i{background:#FFD9CC;color:#C24A30}
|
||
.pt-day.is-lock i{background:rgba(255,255,255,.45);color:#D9BDB2}
|
||
.pt-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:10px}
|
||
.pt-card{position:relative;border-radius:16px;padding:11px 12px 12px;min-width:0}
|
||
.pt-card b{display:block;font-size:13px;font-weight:800;margin-top:4px}
|
||
.pt-card p{margin:4px 0 0;font-size:12px;line-height:1.55;color:var(--ink-2)}
|
||
.pt-ico{display:inline-grid;place-items:center;width:30px;height:30px;border-radius:10px;background:rgba(255,255,255,.8);font-size:17px}
|
||
.pc-baby{background:linear-gradient(160deg,#FFF1E8,#FFE6DA)} .pc-baby b{color:#C4583C}
|
||
.pc-mom{background:linear-gradient(160deg,#FCEFF5,#F8E1EC)} .pc-mom b{color:#B3547E}
|
||
.pc-eat{background:linear-gradient(160deg,#EFF7EA,#E3F0DB)} .pc-eat b{color:#4F7F3E}
|
||
.pc-care{background:linear-gradient(160deg,#EEF3FB,#E1EAF7)} .pc-care b{color:#4A6FA6}
|
||
/* 进入视口依次浮上来(JS 给 .pt-grid 加 .is-shown;不支持 IntersectionObserver 时直接加) */
|
||
.pt-grid .pt-card{opacity:0;transform:translateY(12px);transition:opacity .5s ease,transform .6s var(--ease)}
|
||
.pt-grid.is-shown .pt-card{opacity:1;transform:none}
|
||
.pt-grid.is-shown .pt-card:nth-child(2){transition-delay:.08s}
|
||
.pt-grid.is-shown .pt-card:nth-child(3){transition-delay:.16s}
|
||
.pt-grid.is-shown .pt-card:nth-child(4){transition-delay:.24s}
|
||
.pt-foot{margin-top:9px;font-size:11px;color:var(--muted);text-align:center}
|
||
|
||
|
||
@media (prefers-reduced-motion:reduce){
|
||
.pt-float,.pt-day.is-today i{animation:none!important}
|
||
.pt-grid .pt-card{opacity:1;transform:none;transition:none}
|
||
}
|
||
|
||
/* ============ 模块一 · 工具 ============ */
|
||
.dock-head{display:flex;align-items:center;gap:8px;margin-bottom:7px}
|
||
/* 说明行仍是 inline-flex:前面那枚小图标要和文字同行居中,
|
||
但不能撑满整行(撑满的话图标会被推到左边很远)。 */
|
||
.dock-note{display:inline-flex;align-items:center;gap:5px;margin-bottom:11px}
|
||
.dock-note svg{flex:0 0 auto;color:var(--brand);opacity:.8}
|
||
|
||
/* Bento */
|
||
/* 卡进了白底容器,各自那圈阴影就没用了 —— 白底上叠浅阴影只会显脏,
|
||
五份糊在一起反而看不出是五张卡。圆角同步收一档,配小一号的画幅。 */
|
||
.tool-dock .mini-card{box-shadow:none;border-radius:18px}
|
||
/* 第三列从 .96fr 提到 1fr(第一列 1.3 补回来):这一列底下新添了「更多工具」,
|
||
四个字加一个 ›,按老比例在 320px 视口下这列只有 71px,减掉内边距剩 55px,
|
||
正好差一点点会顶出去。 */
|
||
.bento{display:grid;grid-template-columns:1.3fr 1fr 1fr;gap:10px}
|
||
.bento-col{display:flex;flex-direction:column;gap:10px}
|
||
.mini-card{position:relative;border-radius:20px;padding:14px;overflow:hidden;box-shadow:var(--sh)}
|
||
.mc-title{font-size:19px;font-weight:800;letter-spacing:-.3px}
|
||
.mc-title.sm{font-size:15px}
|
||
.mc-sub{font-size:12px;color:var(--ink-2);margin-top:3px}
|
||
.mc-btn{display:inline-block;margin-top:12px;background:var(--brand);color:#fff;font-size:13px;font-weight:700;padding:6px 15px;border-radius:14px;box-shadow:0 4px 10px rgba(244,89,60,.3)}
|
||
.mc-art{position:absolute;width:52px;height:auto;right:6px;bottom:2px;filter:drop-shadow(0 5px 10px rgba(160,90,70,.18))}
|
||
.mc-art.big{position:static;width:74px;display:block;margin:2px auto 6px}
|
||
.mc-big{font-size:22px;font-weight:800;margin-top:2px}
|
||
.mc-big small{font-size:13px;font-weight:700}
|
||
/* 卡片第二行(上游 sub 的落点):只有 kick / weight 两张卡有富余空间 —— 其余三张是
|
||
固定高度(fweight 64 / cal 88 / curve 80)且列很窄(≈73px 文本宽),放不下第二行;
|
||
要显示它们的 sub,得先重排 .bento 那笔高度账(158+10+64=232),别硬塞。
|
||
:empty 时整行不占位,所以没数据时卡面与改动前完全一致。 */
|
||
/* 工具卡的状态行:固定高度 bento 只留了**一个**状态位,而上游的 text 可能比卡宽
|
||
(数宫缩卡那列文本宽只有 ≈73px,上游给「最近间隔 4分12秒」)→ 一律单行省略,别撑破卡面。
|
||
⚠️ 只作用于 .bento 里的卡,别外溢到页面其它 .mc-sub。 */
|
||
.bento .mc-sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.35}
|
||
/* 孕检日历卡略高(88px,扣掉内边距与标题还剩 ≈36px),允许两行 ——
|
||
上游过期未记时给「待补记 · 9月26日」,一行放不下会把日期省略掉,那就丢了关键信息。 */
|
||
.mini-card.cal .mc-sub{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
|
||
|
||
.mc-extra{font-size:11px;color:var(--muted);margin-top:3px;line-height:1.35;
|
||
display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
|
||
.mc-extra:empty{display:none}
|
||
/* 上游 warn(胎动偏低 / 宫缩达到临产阈值 / 产检已过期未记):数字与文案一起标红。
|
||
颜色另起 --alert,不复用 --brand-dk:品牌深橘在这套暖底上读起来只是"强调",不像告警。 */
|
||
.mini-card.is-warn .mc-sub,.mini-card.is-warn .mc-sub b,
|
||
.mini-card.is-warn .mc-big,.mini-card.is-warn .mc-big small,
|
||
.mini-card.is-warn .mc-extra{color:var(--alert)}
|
||
/* 四张工具卡的渐变跨度收窄到原来的一半左右:
|
||
渐变落差太大时整块颜色被拉花,模块边界反而看不清 */
|
||
.mini-card.kick{background:linear-gradient(150deg,#FFE2D6,#FFD7CA);height:158px}
|
||
.mini-card.kick .mc-art{width:74px;right:2px;bottom:0}
|
||
/* 胎儿估重(这张卡原来是「胎心记录」,本批换了内容;类名 .heart → .fweight,
|
||
下面那条 .mc-art 跟着改。除类名外,这里的数值一个都没动)。
|
||
版式是「名字 + 状态两行叠着,插画退到右下角」,和 .cal / .curve 同一套 ——
|
||
这一列窄,横排(图标 + 名字 + 右边状态)塞不下,标题会被挤成竖排。
|
||
底色浅蓝不是随手挑的:正上方「数胎动」是粉的,两块粉挨着分不出是两张卡;
|
||
插画又是珊瑚红的(原来是心,现在是表盘指针),压在粉底上糊成一片,浅蓝才托得住。
|
||
内边距上下收到 12(别处是 14):这一格只有 64px 高,
|
||
14 + 名字 20 + 间距 3 + 状态 16 + 14 = 67,会超三个像素。 */
|
||
.mini-card.fweight{background:linear-gradient(150deg,#E7EFFA,#DDE8F8);height:64px;padding:12px 14px}
|
||
.mini-card.weight{background:linear-gradient(160deg,#FFE9E1,#FFDDD3);display:flex;flex-direction:column;justify-content:center;text-align:center}
|
||
.mini-card.weight .mc-title{font-size:16px}
|
||
.mini-card.cal{background:linear-gradient(150deg,#ECF3DE,#E4F0D4);height:88px}
|
||
/* 生长曲线原来是 flex:1,把第三列剩下的高度全吃了(约 134px),
|
||
可它的内容和上面的孕检日历一样多,白撑着。压到 80px,
|
||
省下的 54px 给下面的「更多工具」。
|
||
⚠️ 这三张卡的高度是硬凑的:88 + 10 + 80 + 10 + 44 = 232,
|
||
左边那一列是 158 + 10 + 64 = 232,两列必须一样高,中间那张「孕期体重」
|
||
才不会比别人矮一截。动其中任何一个数,另一列要跟着补回来。
|
||
80 是这套竖排的下限:内边距 28 + 名字 20 + 间距 3 + 状态 16 = 67,再矮就贴边了。 */
|
||
.mini-card.curve{background:linear-gradient(150deg,#ECE5FA,#E5DCF9);height:80px}
|
||
.mini-card.cal .mc-art,.mini-card.curve .mc-art{width:42px;right:6px;bottom:4px}
|
||
/* 这张卡的插画得单独摆一份,不能跟着上面 .cal / .curve 那条走。
|
||
① 尺寸 38 而不是 42:日历、曲线那两张 png 画面里自带内部留白,
|
||
这里的表盘是满幅的圆,同样宽度看着会比它俩大一圈。
|
||
② 位置 right:11 / bottom:10:圆的最宽处顶在画布边缘,.mini-card 又是
|
||
overflow:hidden,按别处的 6 / 4 摆会被圆角啃掉一小块。这两个数当初是
|
||
为那颗同样满幅的心量出来的,换成圆表盘照样成立,所以原样留着。
|
||
③ 滤镜只留 drop-shadow:原来前面还挂着 saturate(.82) brightness(1.04),
|
||
那是专为 q-heart.png 那颗高饱和珊瑚红压色的 —— 它比 app-* 那几张低饱和的
|
||
奶油粉 / 淡紫 / 浅绿都要「喊」。现在这枚表盘是自己画的 SVG,配色一开始
|
||
就落在同一档里,不需要再压;继续挂着反而会把指针洗淡。
|
||
投影值照抄 .mc-art 的原值不动:打光要跟邻居一致。 */
|
||
.mini-card.fweight .mc-art{width:38px;right:11px;bottom:10px;
|
||
filter:drop-shadow(0 5px 10px rgba(160,90,70,.18))}
|
||
/* 2026-09-30 工具卡改版:白字 + 各工具 LOGO 里的图形(取自点进去那个工具页左上角的 LOGO:
|
||
数胎动 .brand-logo、孕期体重 img.brand-logo、孕检日历 .hero-brand i、胎儿估重 .lg、数宫缩 svg.brand-logo)。
|
||
用户要求只留 LOGO 里面的图形、不要外面的圆角方块 / 圆环底,并且要高清:
|
||
数胎动 / 胎儿估重 / 数宫缩的原 LOGO 本身是 SVG,直接删掉底板那一层;
|
||
孕期体重(128px webp)和孕检日历(100px png)原图是小位图、放大就糊,照原图重画成矢量。
|
||
都在 assets/img/*.svg,工具页换 LOGO 时这里要重新取。
|
||
用户随后反馈五个彩色图标「抢、太乱,满屏都是图标」:图标只是装饰,于是统一成
|
||
**白色单色**(原来的彩色细节改用镂空表达),半透明、放大、斜压在右下角并出血到卡边外,
|
||
退成卡面的底纹,让标题和数字当主角。
|
||
卡底色取点进去那个工具页的主色系、饱和度再深一档(各工具页 theme-color / 主色见每行注释),
|
||
这样从卡片点进去颜色是连着的。
|
||
只换皮:上面那笔高度账(158+10+64 / 88+10+80+10+44)和版式一个数没动,
|
||
所以这里只覆盖颜色、字色和插画尺寸。渐变收尾色压得够深,白字在最浅的那一端也读得清。
|
||
「更多工具」仍是灰米出口,不参与。 */
|
||
.bento .mini-card:not(.more){color:#fff}
|
||
.bento .mini-card:not(.more) .mc-title{text-shadow:0 1px 2px rgba(0,0,0,.12)}
|
||
.bento .mini-card:not(.more) .mc-sub{color:rgba(255,255,255,.9)}
|
||
.bento .mini-card:not(.more) .mc-extra{color:rgba(255,255,255,.78)}
|
||
.mini-card.kick{background:linear-gradient(160deg,#EE9B70,#D8683F)} /* 数胎动页:暖杏底 #F7E8DE、橙红 #E2694A */
|
||
.mini-card.weight{background:linear-gradient(160deg,#F49A88,#E4656A)} /* 孕期体重页:桃粉底 #FFE9E1、珊瑚 #F2856D */
|
||
.mini-card.cal{background:linear-gradient(160deg,#94B568,#62893C)} /* 孕检日历页:浅绿底 #EFF4EB、草绿 #86A362 */
|
||
.mini-card.fweight{background:linear-gradient(160deg,#86A5DA,#5472B4)} /* 胎儿估重页:浅蓝底 #E2ECF9、藏青 #3E5488 */
|
||
.mini-card.curve{background:linear-gradient(160deg,#A08DD8,#7560B6)} /* 数宫缩页:淡紫底 #E7E1F3、紫 #7E68BC */
|
||
.bento .mc-btn{background:#fff;color:#C95A36;box-shadow:0 3px 8px rgba(120,50,20,.2)}
|
||
/* 水印式图标:五张统一 18% 白(10-01 用户嫌乍眼,从 28% 降下来、尺寸同时缩到约 8 成)、转 -12°、右下角出血(.mini-card 本身 overflow:hidden 负责裁边)。
|
||
⚠️ 文字层必须压在水印上面:除 .mc-art 外的子元素一律 relative + z-index:1。
|
||
⚠️ 孕期体重那张原来是「图在上、字在下」的竖排,图标改成 absolute 退出文档流后,
|
||
标题和数字靠卡片自身的 flex 居中落在正中,不用另调。 */
|
||
.bento .mini-card:not(.more)>*:not(.mc-art):not(.rp){position:relative;z-index:1}
|
||
.bento .mini-card:not(.more) .mc-art{filter:none;opacity:.18;transform:rotate(-12deg);pointer-events:none}
|
||
.mini-card.kick .mc-art{width:50px;right:-6px;bottom:-8px}
|
||
.mini-card.weight .mc-art.big{position:absolute;width:58px;right:-9px;bottom:-8px;margin:0}
|
||
.mini-card.cal .mc-art,.mini-card.curve .mc-art{width:34px;right:-4px;bottom:-5px}
|
||
.mini-card.fweight .mc-art{width:32px;right:-4px;bottom:-7px}
|
||
/* 告警(胎动偏低 / 宫缩达阈值 / 产检过期):糖果色底上 --alert 红看不清,换成亮黄字 */
|
||
.bento .mini-card.is-warn .mc-sub,.bento .mini-card.is-warn .mc-sub b,
|
||
.bento .mini-card.is-warn .mc-big,.bento .mini-card.is-warn .mc-big small,
|
||
.bento .mini-card.is-warn .mc-extra{color:#FFF08A}
|
||
/* 「更多工具」:通往「记一下」弹层里那十几个工具。
|
||
故意不给糖果色 —— 它不是第六个工具,是个出口。素底 + 一行小字,
|
||
扫过去不会被当成工具卡数进去。
|
||
高度 44 是按手指来的(再矮一点更好看,但这是这一屏唯一通往其余工具的门,
|
||
点不准的代价太大),不是按内容 —— 一行 11.5px 的字只要 16px。 */
|
||
/* ⚠️ 底色必须跟着容器走:容器是白的就用灰米(现在这样),容器要是改成米色底,
|
||
这里得反过来提亮,否则浅底压浅底整张卡会直接消失。 */
|
||
.mini-card.more{background:#EFE7DA;height:44px;display:flex;align-items:center;justify-content:center;gap:3px;padding:0 6px}
|
||
.mc-more-t{font-size:11.5px;font-weight:700;color:#8A7A66;white-space:nowrap}
|
||
.mini-card.more .chev{font-style:normal;font-size:13px;font-weight:700;color:#A3937F;line-height:1}
|
||
|
||
/* 模块二 · 今天的动线 */
|
||
/* 上一版这里是两个独立模块:AI 小结一张渐变卡(左边 4px 色条 + 40px 大引号),
|
||
下面「今日成长脚印」一张白卡装的时间轴。两块都是「米色页面上摆一张卡」,
|
||
和上面的工具、下面的指南是同一种容器语言,四段叠起来才显得那么直筒。
|
||
|
||
这一版合成一条线,容器语言换成「没有容器,只有一条线」:
|
||
.tl-head 起点节点(今天 · 大圆点 · 今日成长脚印 · 查看全部)
|
||
.steps 四条记录(白卡撤了,只剩内容本身)
|
||
.ai-bubble 收尾节点(AI 徽标代替时间 · 圆点 · 一只气泡)
|
||
AI 那句话总结的就是它正上方那四条记录,本来就该挨着,不该隔着一整套抬头分开摆。
|
||
|
||
竖线的画法也换了。原来是每个 .step::before 各画一小段,
|
||
靠 :first-child{top:50%} / :last-child{bottom:50%} 拼出来 ——
|
||
那样只能在 .steps 内部拼,跨不到 .tl-head 和 .ai-bubble 上。
|
||
三条规则全删,改成这里一条从头贯到尾。
|
||
|
||
⚠️ 底色、圆角、左右内边距在上面的「公共外壳」里统一定义,这里只管线和节点。
|
||
——「咬线」的那几圈外圈颜色必须等于这块的底色(现在是 #fff),
|
||
跟着外壳走,外壳改底色这里就得一起改,见下面几处标注。 */
|
||
/* 这一块的几何全部由下面几个变量推出来,别再往下面的规则里写死像素。
|
||
三行(.tl-head / .step / .ai-bubble)必须是同构的三列:
|
||
[ 时间列 --tl-time ][ --tl-gap ][ 圆点 9px ][ --tl-gap ][ 正文 ]
|
||
只要有一列的宽度或间距在某一行上写得不一样,那一行的圆点就会离开竖线。
|
||
⚠️ 之前就是这么错的:.st-time 写的是 width:42px(可被 flex 压缩),
|
||
而 .tl-h-when / .ab-badge 写的是 flex:0 0 42px(不可压缩)。
|
||
320px 视口下 .step 一行内容总宽约 311 > 可用 264,flex 就去压唯一压得动的时间列,
|
||
把它压到约 36px,圆点跟着左移,看上去就是「时间贴到竖线上」。
|
||
现在三处统一 flex:0 0 var(--tl-time),谁都不许缩。 */
|
||
/* 引导占位(今天没有任何足迹时):**沿用 AI 气泡那套语言** —— 左列 + 圆点 + 带尖角的气泡,
|
||
与时间轴共用同一条竖线,不再是一张横跨整块的白卡(用户反馈那样突兀)。
|
||
⚠️ 底色用白(用户指定):所以要**加一圈描边**才看得出气泡边界 ——
|
||
AI 气泡靠暖渐变区分,白气泡压白底只剩阴影会糊成一片。
|
||
⚠️ 尖角用「旋转 45° 的小方块 + 同色描边」,这样描边能跟着拐过去;纯 border 三角做不出描边。 */
|
||
.tl-guide{position:relative;display:flex;align-items:flex-start;gap:var(--tl-gap);
|
||
width:100%;padding:10px var(--tl-pad) 0}
|
||
.tl-guide-bubble{display:block;position:relative;background:#fff;border:1px solid var(--line);
|
||
border-radius:4px 16px 16px 16px;padding:11px 14px 12px}
|
||
.tl-guide-bubble::before{content:"";position:absolute;left:-5px;top:11px;width:9px;height:9px;
|
||
background:#fff;border-left:1px solid var(--line);border-bottom:1px solid var(--line);
|
||
transform:rotate(45deg);border-radius:0 0 0 2px}
|
||
.tl-guide-t{display:block;font-size:15px;font-weight:600;line-height:1.55;color:#403430}
|
||
.tl-guide-s{display:block;font-size:12.5px;color:var(--ink-2);margin-top:4px;line-height:1.6}
|
||
/* 引导里可点的应用芯片(名字来自接口 unused[];identifier 是 box_app 按 App 表 url 路径解析的) */
|
||
.tl-guide-apps{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
|
||
.tl-guide-apps:empty{display:none}
|
||
.tl-chip{font:inherit;font-size:12.5px;font-weight:700;color:var(--brand-dk);
|
||
background:#FFF1EC;border:1px solid #FFDFD5;border-radius:999px;padding:7px 13px;line-height:1}
|
||
.tl-chip.is-plain{color:var(--muted);background:#F6F1ED;border-color:var(--line)}
|
||
/* 接口说这句"需要标红"时(digest.warn)整句变告警色 */
|
||
.today-line.ai-warn .ab-say{color:var(--alert)}
|
||
/* 没有真实事件的当天不显示 AI 气泡:那句话里的次数是**写死的**(见 index.html 的注释),
|
||
今天没记 / 未关联时显示它等于编数据。拿到真实事件(fpApply('rows'))时才摘掉这个类。 */
|
||
.today-line.no-ai .ai-bubble{display:none}
|
||
|
||
.today-line{
|
||
position:relative;
|
||
--tl-time:44px; /* 时间列宽:够放 "13:00" 还余一点 */
|
||
--tl-gap:13px; /* 三列之间的间距。从 10 提到 13,给时间和竖线之间让出空气 */
|
||
--tl-pad:2px; /* 每行自身的左右内边距 */
|
||
--tl-top:22px; /* 这一块的上留白 */
|
||
--tl-bot:24px; /* 这一块的下留白 */
|
||
/* 竖线中心 = 左内边距 + 时间列 + 间距 + 圆点半径(4.5) */
|
||
--tl-x:calc(var(--tl-pad) + var(--tl-time) + var(--tl-gap) + 4.5px);
|
||
/* 正文左缘 = 竖线中心 + 圆点半径 + 间距 */
|
||
--tl-text:calc(var(--tl-x) + 4.5px + var(--tl-gap));
|
||
padding-top:var(--tl-top);padding-bottom:var(--tl-bot);
|
||
}
|
||
/* 一整条,不掐头也不去尾:上端由 .tl-h-dot 的不透明外圈盖掉,
|
||
下端由 .ai-bubble::after 那块底色橡皮擦掉。
|
||
这两处都只依赖各自圆点的位置(我自己定死的),不依赖气泡里文字排了几行 ——
|
||
要是改成算 bottom 的像素值,文案一变或字体一换线就会拖长一截或者短一截。
|
||
⚠️ top/bottom 必须正好等于这一块的上下留白,**不能写 0**。
|
||
绝对定位是相对 padding box 算的,写 0 会让线从留白最顶端画起,
|
||
而 .tl-h-dot 的外圈只盖得住自己周围 12.5px —— 上下各会露出一截悬空的线头。
|
||
用同一组变量绑死,以后调留白线会跟着走。 */
|
||
.today-line::before{content:"";position:absolute;left:calc(var(--tl-x) - .75px);
|
||
top:var(--tl-top);bottom:var(--tl-bot);width:1.5px;background:#F0E2D9}
|
||
|
||
/* 起点节点。三列宽度全部走变量,圆点才落得进竖线。 */
|
||
.tl-head{display:flex;align-items:center;gap:var(--tl-gap);padding:0 var(--tl-pad);position:relative}
|
||
.tl-h-when{flex:0 0 var(--tl-time);font-size:13px;font-weight:700;color:var(--brand)}
|
||
/* 起点点得比途中的记录点更醒目,但**盒子仍然是 9px** —— 大小全靠 box-shadow 往外扩,
|
||
一改 width 就会把圆心推离 --tl-x,线和点就错位了。
|
||
三层 shadow 由外到内:底色 → 品牌色细圈 → 底色。⚠️ 最外层必须是不透明的容器底色(#fff),
|
||
它同时负责把 .tl-head 上方那截线头盖掉;写成半透明或写错色,线头就会露出来。 */
|
||
.tl-h-dot{flex:0 0 auto;width:9px;height:9px;border-radius:50%;background:var(--brand);
|
||
box-shadow:0 0 0 3.5px #fff,0 0 0 5.5px rgba(244,89,60,.30),0 0 0 8px #fff}
|
||
/* ⚠️ 两个标题现在都含用户填的小名,而小名输入框是 maxlength="12"。
|
||
12 个全角字 + 「的孕育工具」= 17 字 ≈ 277px,工具区那行留给标题的位置只有约
|
||
310px —— 塞得下,但只剩 30px 余量,字体或按钮文案一动就会把「所有工具 ›」挤出去。
|
||
与其赌那 30px,不如让标题自己先省略号收尾。.tl-h-title 本来就有这套,
|
||
.dock-title 是这次跟着一起挂上来的。 */
|
||
.tl-h-title,.dock-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
/* 说明缩进到 73px,和下面 .st-txt 的左边缘对齐(2+42+10+9+10),
|
||
看着像是挂在这条线右侧的一句注脚,不是又一行贴边灰字。 */
|
||
.tl-h-note{margin:5px 0 2px var(--tl-text)}
|
||
|
||
/* 它自己不再是一张卡了(背景/阴影/圆角/左右内边距都归外壳管),
|
||
.step 的左边缘因此和 .tl-head / .ai-bubble 对齐,三块共用同一条线。 */
|
||
.steps{padding:2px 0;cursor:pointer}
|
||
.step{display:flex;align-items:center;gap:var(--tl-gap);padding:11px var(--tl-pad);position:relative;font-size:14.5px}
|
||
/* ⚠️ 必须是 flex:0 0(不可压缩),只写 width 会被 flex 压缩 —— 见本块开头那段说明。 */
|
||
.st-time{flex:0 0 var(--tl-time);font-size:13px;color:var(--muted);font-variant-numeric:tabular-nums}
|
||
/* ⚠️ 外圈用来「咬断」竖线,所以它必须是**圆点背后那块底**的颜色 = 外壳的 #fff。 */
|
||
.st-dot{width:9px;height:9px;border-radius:50%;background:var(--brand);z-index:2;box-shadow:0 0 0 3px #fff}
|
||
.st-txt{font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
/* 数据来源标签:做成浅色小胶囊,一眼看出这条记录是哪个孕期工具同步过来的。
|
||
⚠️ 底色要和它贴着的那块底拉开差距 —— 而这一版**外壳底真的变了**,
|
||
上一版注释里假设的那件事发生了,所以这条跟着压深了一档:
|
||
胶囊 #F1E8E1 → #EADDD3,字 #9A8A7E → #8D7C6F
|
||
账(胶囊底 vs 它背后的外壳底,比值越大边界越清楚):
|
||
旧:#F1E8E1 压在纯白上 = 1.209
|
||
本批不改的话:#F1E8E1 压在 #FFF2E7 上 = 1.077 ← 几乎看不见,只剩一行浮着的字
|
||
改完:#EADDD3 压在 #FFF2E7 上 = 1.211 ← 回到旧版的清晰度
|
||
⚠️ 它 margin-left:auto 贴在行的最右端,正好落在渐变**最深的那一头**,
|
||
所以必须按终点色 #FFF2E7 算,按平均色算会算松。
|
||
⚠️ 字色一起压深是为了补回胶囊变深吃掉的那点对比(2.50 → 3.01)。
|
||
这两个值是一对,别只动一个。 */
|
||
.st-from{margin-left:auto;flex:0 0 auto;white-space:nowrap;font-size:11.5px;color:#8D7C6F;
|
||
background:#EADDD3;border-radius:9px;padding:3px 8px;line-height:1.35}
|
||
|
||
/* 收尾节点。三个直接子元素和 .step 同构(42 的左格 + 9 的点 + 剩下的),
|
||
圆点才落在同一条线上。align-items 用 flex-start 而不是 center ——
|
||
气泡是多行的,居中的话点会飘到气泡中腰,看着不像是从这个点说出来的。
|
||
徽标和点的 margin-top 是配着气泡第一行(标签行)算的:
|
||
气泡上内边距 11 + 标签行半高 7 = 18,加上 .ai-bubble 自己的 10 上内边距 = 28。 */
|
||
.ai-bubble{position:relative;display:flex;align-items:flex-start;gap:var(--tl-gap);
|
||
width:100%;text-align:left;padding:10px var(--tl-pad) 0;cursor:pointer}
|
||
.ab-badge{flex:0 0 var(--tl-time);margin-top:12.5px;
|
||
font-size:10.5px;font-weight:800;letter-spacing:.4px;color:var(--brand);line-height:1}
|
||
.ab-dot{flex:0 0 auto;width:9px;height:9px;margin-top:13.5px;border-radius:50%;
|
||
background:var(--brand);z-index:2;box-shadow:0 0 0 3px #fff}
|
||
.ab-body{flex:1;min-width:0}
|
||
/* 一只气泡,不是「又一张卡」:左上角削平 + 一个指回竖线的小尖角,
|
||
语气是「有人在说话」。原来那套左色条 + 40px 大引号不要了 ——
|
||
引号是在给一张卡补语气,有了尖角就不需要了。
|
||
⚠️ 底色沿用上一版 AI 小结卡那道暖渐变,不能用白:外壳已经是白的,
|
||
白气泡压白底就只剩一圈阴影,看不出是「在说话」。
|
||
这也是整块里唯一允许上色的地方 —— 时间线上其余部分都是白底黑字,
|
||
颜色留给「谁在说话」这一件事。 */
|
||
.ab-bubble{display:block;position:relative;background:linear-gradient(135deg,#FDF2E9,#FBE9DE);
|
||
border-radius:4px 16px 16px 16px;padding:11px 14px 12px}
|
||
/* ⚠️ 尖角的颜色要对上气泡渐变在**左上角**的那一端(#FDF2E9),不是取平均色 */
|
||
.ab-bubble::before{content:"";position:absolute;left:-7px;top:12px;width:0;height:0;
|
||
border:6px solid transparent;border-right:7px solid #FDF2E9;border-left:0}
|
||
/* 模块名降级成气泡里的一枚小标签。它和说明、「往期小结 ›」挤在同一行是塞不下的
|
||
(320px 下可用 197,三段要 212),所以标签进气泡、另两段留在落款行。 */
|
||
.ab-tag{display:block;font-size:11px;font-weight:800;letter-spacing:.2px;
|
||
color:var(--brand);opacity:.85;margin-bottom:5px}
|
||
.ab-say{display:block;font-size:15px;font-weight:600;line-height:1.6;color:#403430}
|
||
.ab-say b{color:var(--brand)}
|
||
.ab-foot{display:flex;align-items:center;gap:8px;margin-top:8px;padding-left:2px}
|
||
/* 这里原来还有一条 .ab-foot i(左边那句「AI自动汇总你每日记录」的样式)。
|
||
那句按用户要求删掉了,规则跟着删 —— 不留只被注释引用的死样式。
|
||
下面 em 的 margin-left:auto 是它现在还贴右的原因,别当成冗余清掉。 */
|
||
.ab-foot em{margin-left:auto;flex:0 0 auto;font-style:normal;white-space:nowrap;
|
||
font-size:11.5px;font-weight:700;color:var(--brand)}
|
||
/* 底色橡皮:把圆点以下那截线擦掉,线就停在这个点上,不会从气泡旁边一直拖到模块底。
|
||
top 只跟圆点走(圆心 28 + 半径 4.5 ≈ 32),和气泡有多高无关。
|
||
left/width 刚好盖住 58 那条线,够不着 x≥73 的气泡。
|
||
⚠️ 颜色 = 外壳底色 #fff,跟着外壳走。 */
|
||
.ai-bubble::after{content:"";position:absolute;left:calc(var(--tl-x) - 2.75px);
|
||
top:32px;bottom:0;width:5.5px;background:#fff}
|
||
/* ⚠️ 这两块的圆点是「长在」竖线上的,.ripple 默认的按下缩放会把点从线上拽下来
|
||
(线不跟着缩)。改成压透明度做反馈,涟漪照旧。 */
|
||
.steps,.ai-bubble{transition:opacity .16s var(--ease)}
|
||
.steps:active,.ai-bubble:active{transform:none;opacity:.6}
|
||
|
||
/* 模块三 · 书架卡带 */
|
||
/* 上一版这里是「1 张大卡 + 底下两张小卡」的九宫格式排布,卡都是竖着堆的,
|
||
和上面的工具区在视觉上是同一种东西 —— 一屏里第二次看到「大块 + 两个小块」。
|
||
这一版改成**横向卡带**:三张等宽的卡横着排,滑动查看,右边故意露出下一张的一角。
|
||
竖着滚的页面里插一段横着滑的内容,是打破直筒感最直接的办法,
|
||
而且资源本来就是「一排书」,横着摆比竖着堆更贴合它自己的样子。 */
|
||
/* 抬头和另两块一样:标题 + 右侧灰字入口 + 底下一句说明,字号间距全走公共规则。
|
||
上一稿这里额外加了一条 2px 的「书架横杆」压在标题底下 —— 另两块都没有,
|
||
纯粹是我给这一块单造的花样,正是「乱」的来源之一,去掉。 */
|
||
.shelf-bar{display:flex;align-items:center;gap:8px;margin-bottom:7px}
|
||
.sh-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
.sh-note{margin-bottom:12px}
|
||
|
||
/* 卡带出血到屏幕边缘,和上面的工具托盘用同一招,理由不一样:
|
||
托盘是为了让底色成为一个「区」,这里是为了让卡能滑出屏幕、露出下一张。
|
||
要是卡带停在 26px 栏内,右边缘会硬生生切一刀,看着像没排版好而不是「可以滑」。
|
||
⚠️ padding 左右 = 26 抵回负外边距,第一张卡才和页面其余内容左对齐;
|
||
scroll-padding-left 必须跟着写,否则吸附会把卡吸到屏幕边缘(x=0)而不是 26。 */
|
||
.shelf-rail{
|
||
display:flex;gap:11px;margin:0 -26px;padding:2px 26px 6px;
|
||
overflow-x:auto;scroll-snap-type:x mandatory;scroll-padding-left:26px;
|
||
-webkit-overflow-scrolling:touch;
|
||
}
|
||
.shelf-rail::-webkit-scrollbar{display:none}
|
||
/* 78%:375 宽下卡是 292,右边正好剩 45px 露出下一张的边 —— 够让人知道还能滑,
|
||
又不至于露出半张让人以为是排版错位。用百分比而不是定宽,窄屏上会自己收。
|
||
等高不用写 min-height:flex 容器默认 align-items:stretch,三张自动拉齐到最高的那张,
|
||
再靠 .sb-row{margin-top:auto} 把底行压到卡底。 */
|
||
.shelf-book{
|
||
flex:0 0 78%;scroll-snap-align:start;
|
||
display:flex;flex-direction:column;text-align:left;
|
||
border-radius:20px;padding:14px;
|
||
}
|
||
/* 三张各自的糖果色沿用上一版那三张卡的配色,认得出是同一批东西。
|
||
⚠️ 不带阴影 —— 和 .tool-dock .mini-card 同一个道理:糖果色卡摆在白外壳上,
|
||
本身已经和底分得很开,再加阴影只会显脏。这一屏的规矩是
|
||
「白外壳负责分区,色块负责分内容,阴影一个都不要」。 */
|
||
/* --sb-bg 是这张卡**底部**的颜色(渐变的收尾色)。底行的叠压头像要用它描白边,
|
||
描的必须是所处位置的实际底色,写死 #fff 会在糖果色上留一圈亮边。 */
|
||
.shelf-book.sb-book{background:linear-gradient(150deg,#FFEEE2,#FCE3D3);--sb-bg:#FCE3D3}
|
||
.shelf-book.sb-food{background:linear-gradient(150deg,#EEF5E5,#E2EFD5);--sb-bg:#E2EFD5}
|
||
.shelf-book.sb-music{background:linear-gradient(150deg,#F0EAFB,#E5DBF8);--sb-bg:#E5DBF8}
|
||
/* 封面从「左边一张小图」改成「上面一张大图」,卡才像一本立在架上的书。
|
||
统一按高度 76 缩放:三张原图宽高比不一样(书是竖的,另两个是方图标),
|
||
锁高不锁宽,它们的视觉重量才差不多。margin 左右 auto 是在列向 flex 里做水平居中。 */
|
||
/* ⚠️ 封面必须占一个**固定的框**,而不是按图自身尺寸摆。
|
||
三张原图比例差很远(书是竖的窄长条,另两个是方图标),
|
||
上一稿只锁高度 76、宽度随意,于是三张卡的封面宽窄不一、视觉重量也不一样。
|
||
现在给统一的 width:100% + height:80px + object-fit:contain:
|
||
框一样大,图在框里等比缩放并居中,谁也不变形。 */
|
||
.sb-cover{width:100%;height:80px;display:block;object-fit:contain;margin:0 0 11px;
|
||
filter:drop-shadow(0 8px 15px rgba(180,120,80,.26))}
|
||
/* 标题一行封顶。三张的标题长短不一,放任换行会把下面的简介顶到不同高度。 */
|
||
.sb-title{font-size:15px;font-weight:800;line-height:1.4;letter-spacing:-.2px;
|
||
overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
/* 简介最多两行。现有三条文案在 320px 下都是一行,这里是防以后换了长文案
|
||
把某一张卡撑高、连累另外两张一起变高(卡带是等高的)。 */
|
||
.sb-desc{font-size:12px;color:var(--ink-2);line-height:1.5;margin-top:5px;
|
||
display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
|
||
/* margin-top:auto 把底行压到卡底,三张卡的底行因此始终在同一条水平线上,
|
||
哪怕上面的简介行数不一样。
|
||
gap:7px 是「头像 ↔ 人数」的距离,它俩是同一件事的两半,贴紧念着才连贯;
|
||
「免费」靠自己的 margin-left:auto 甩到最右,不吃这个 gap。 */
|
||
.sb-row{display:flex;align-items:center;gap:7px;margin-top:auto;padding-top:12px}
|
||
/* ⚠️ min-width:0 —— flex 子项默认 min-width:auto,光有 overflow/ellipsis 是不生效的,
|
||
窄屏(320)下这行会顶着「免费」把它挤出卡外。缩要缩在这儿,别缩头像。 */
|
||
.sb-got{font-style:normal;font-size:11px;color:var(--muted);white-space:nowrap;
|
||
overflow:hidden;text-overflow:ellipsis;min-width:0}
|
||
|
||
/* ---- 领取用户的叠压头像 ----
|
||
纯 CSS:assets/ 里没有人像图,为这点装饰新增 6 张图片不划算,
|
||
也会把单文件产物撑大。每个 <i> 是一个圆底,::before 画头、::after 画肩。
|
||
⚠️ 这一行的宽度非常紧,加大任何一个数之前先把账算一遍:
|
||
.shelf-book 是 flex-basis:78%,78% 算的是 .shelf-rail 的**内容盒**
|
||
(= 屏宽 - 52),不是屏宽。卡内可用宽度 = 0.78*(W-52) - 28:
|
||
W=320 → 181px W=375 → 224px W=390 → 236px
|
||
这一行要装:头像叠 + 7 + 人数 + 7 + 「免费」≈41。
|
||
⚠️ 人数那截这一版变长了:旧文案 6 个字 ≈69 → 「12.8 万妈妈已领取」≈88(+19)。
|
||
(这里不照抄旧文案原文:test/smoke.js 有一条「旧写法一处都不剩」的全文 grep,
|
||
跑在**构建产物**上,而 CSS 注释是会被 build.js 原样内联进去的 ——
|
||
在注释里写一遍旧文案,就会把那条 grep 打红。)
|
||
(11px 字号下,汉字按 11px、数字按 5.5px、点和空格按 2.75px 估。)
|
||
于是 = 头像叠 + 143:
|
||
→ 375 给头像的预算 224-143 = 81px,6 个(17px 叠 5px,含 padding-left:5)共 77px,仍放得下;
|
||
→ 320 预算只剩 181-143 = 38px。4 个要 53px、3 个要 46px,都装不下,只有 2 个(34px)行。
|
||
人数才是这行的主角,不能让它吃省略号 —— 按「要砍先砍装饰」,
|
||
窄屏这一版从收成 4 个改成收成 2 个,见文件下方那条媒体查询。 */
|
||
.sb-faces{display:flex;flex:0 0 auto;padding-left:5px}
|
||
.sb-faces i{
|
||
width:17px;height:17px;border-radius:50%;
|
||
margin-left:-5px; /* 一个压一个 */
|
||
position:relative;overflow:hidden;
|
||
/* 用 box-shadow 而不是 border 描白边:border 会吃掉 17px 里的内径,
|
||
把本来就只有 17px 的圆挤小;box-shadow 画在盒子外面,不影响布局。
|
||
白边的作用是把叠在一起的两颗头分开,颜色必须跟卡片底色一致。 */
|
||
box-shadow:0 0 0 1.5px var(--sb-bg,#fff);
|
||
}
|
||
/* 后面的盖住前面的,视觉上像一叠卡片从左往右码过来 */
|
||
.sb-faces i:nth-child(1){background:#F0A18C}
|
||
.sb-faces i:nth-child(2){background:#E9BE7C}
|
||
.sb-faces i:nth-child(3){background:#A9C79C}
|
||
.sb-faces i:nth-child(4){background:#8FB4D8}
|
||
.sb-faces i:nth-child(5){background:#BFA0D8}
|
||
.sb-faces i:nth-child(6){background:#EE9A9A}
|
||
/* 头 + 肩,最简剪影。半透明白而不是纯白:压在糖果色底上太扎眼。 */
|
||
.sb-faces i::before,.sb-faces i::after{
|
||
content:'';position:absolute;left:50%;transform:translateX(-50%);
|
||
background:rgba(255,255,255,.9);
|
||
}
|
||
.sb-faces i::before{top:3px;width:6px;height:6px;border-radius:50%}
|
||
.sb-faces i::after{bottom:-1px;width:11px;height:7px;border-radius:6px 6px 0 0}
|
||
/* 窄屏收成 2 个头像。见上面那笔账:320 宽下卡内只有 181px,
|
||
人数文案改长(+19px)之后,留给头像的预算从 57px 掉到 38px ——
|
||
原来收成 4 个(要 53px)已经不够了,只有 2 个(34px)塞得进去。
|
||
头像是装饰,人数是信息,要砍先砍装饰:宁可少两颗球,
|
||
也不能让「12.8 万妈妈已领取」吃省略号变成「12.8 万妈妈已…」。
|
||
360 是这一叠 6 个能完整放下的最小屏宽,所以断点还是 359。 */
|
||
@media (max-width:359px){
|
||
.sb-faces i:nth-child(n+3){display:none}
|
||
}
|
||
|
||
/* 「免费」甩到最右。文件末尾还有一条全局 .pill-free{margin-left:auto},
|
||
这里显式再写一次:靠一条几百行外的规则来决定这里的排版太脆,
|
||
而且上一版为了不让它靠右,正是在这个位置写了 margin-left:0。
|
||
⚠️ 底色必须写死成不透明白:文件末尾那条 .pill-free 用的是
|
||
rgba(110,154,86,.14)(半透明绿,为详情页的白底列表调的),
|
||
它在本文件里排在下面、同样是单类名,会盖掉上面那条 #E3F0D8。
|
||
半透明绿铺在三张糖果色卡上会各自被染成三种脏色 —— 挪到右边孤零零一颗之后
|
||
尤其明显。白底 + 绿字在粉/绿/紫三张卡上都干净,且三张长一个样。 */
|
||
.sb-row .pill-free{margin-left:auto;flex:0 0 auto;
|
||
background:#fff;color:var(--green);padding:3px 9px;border-radius:8px}
|
||
.pill-free{background:#E3F0D8;color:#5E8646;font-size:11.5px;font-weight:700;padding:3px 10px;border-radius:9px}
|
||
/* .pill-get(橙色「立即领取」胶囊)已删:它只在首页书架第一张卡上用过一次,
|
||
那颗假按钮连同这条规则一起去掉了。领取动作在资源详情页底部的 #rdGet。 */
|
||
.unlock{text-align:center;font-size:12.5px;color:var(--muted);margin:16px 0 4px}
|
||
.unlock a{color:var(--brand);font-weight:600}
|
||
|
||
/* ============ 通用页头(档案) ============ */
|
||
.page-hero{padding:calc(env(safe-area-inset-top) + 16px) 20px 62px;color:#fff;background:var(--grad);position:relative;overflow:hidden}
|
||
.page-hero::after{content:"";position:absolute;width:230px;height:230px;border-radius:50%;background:rgba(255,255,255,.09);top:-70px;right:-60px}
|
||
.hero-info{display:flex;align-items:center;gap:14px;margin-top:20px;position:relative;z-index:2}
|
||
.hero-info>div:first-child{flex:1;min-width:0}
|
||
.hero-h1{font-size:27px;font-weight:800;letter-spacing:-.5px;margin-bottom:9px}
|
||
.hero-p{font-size:13.5px;opacity:.93;line-height:1.6}
|
||
/* 第二行是「查得到就行」的信息,压一档字号和透明度,
|
||
让标题和第一行先被读到,橙区不再是三行齐平的一堵字 */
|
||
.hero-p.sub{font-size:12px;opacity:.72;margin-top:1px}
|
||
/* 档案页那两行左边站着一个「这周宝宝多大了」的 emoji。
|
||
垫一层半透明白底圆盘,emoji 才不会直接糊在橘色上;
|
||
两行文字整体让开一个图标的位置 —— 就是「往右一点点」那个意思。
|
||
min-width:0 是给里面那个文字 div 的,不然长小名会把圆盘挤扁 */
|
||
.ar-lines{display:flex;align-items:center;gap:11px;margin-top:2px}
|
||
.ar-lines>div{min-width:0}
|
||
.ar-size{flex:0 0 auto;width:44px;height:44px;border-radius:50%;
|
||
background:rgba(255,255,255,.2);display:grid;place-items:center;font-size:25px;line-height:1}
|
||
|
||
/* ---------- 档案页 hero(重排过一次) ----------
|
||
.hero-info 是共用的(.page-hero 现在只有档案页在用);
|
||
档案页是自上而下四层,所以只在这里把 flex 关掉,不动共用那条。 */
|
||
.ar-hero{display:block}
|
||
/* 页面名。上一版是 .ar-eyebrow —— 13px、opacity .78 的一行小字,
|
||
为了把字号让给孕周。方向没错,但让过头了:这行是整页唯一出现宝宝小名的地方,
|
||
13px 的半透明白压在橙色渐变上,扫过去根本注意不到。
|
||
这一版不用字号抢(25px 还是归 .ar-week),改用「材质」抢:
|
||
半透明白底 + 一圈亮描边 + 毛玻璃,从橙色里浮起来一层 ——
|
||
字还是小的,但边界一有就跳出来了。
|
||
inline-flex 而不是 block:牌子宽度得跟着小名长短走,
|
||
撑满整行就成了色块,不像牌子。max-width 兜住超长小名。
|
||
gap 用 0 + 图标自己挂 margin:三个 flex item 统一 gap 会把
|
||
「小汤圆」和「的成长档案」也撑开 6px,读起来断成两截。
|
||
h1 默认的加粗和外边距在这里全部自己接管。 */
|
||
.ar-title{
|
||
display:inline-flex;align-items:center;gap:0;max-width:100%;
|
||
margin:0 0 12px;padding:5px 12px 5px 10px;
|
||
border-radius:99px;background:rgba(255,255,255,.18);
|
||
border:1px solid rgba(255,255,255,.3);
|
||
-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
|
||
font-weight:600;letter-spacing:.2px;
|
||
}
|
||
.ar-t-ico{flex:0 0 auto;margin-right:6px;opacity:.9}
|
||
/* 小名是这枚牌子的重点,比后半句大两档半。省略号是给超长小名兜底的 ——
|
||
它是 flex item,不给 min-width:0 就不肯缩,会把牌子顶出屏幕。 */
|
||
.ar-t-name{font-size:15px;font-weight:800;letter-spacing:-.2px;line-height:1.3;
|
||
min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
.ar-t-rest{flex:0 0 auto;font-size:12.5px;opacity:.8;white-space:nowrap}
|
||
/* 孕周接手了原来 .hero-h1 的位置。27px 太挤(右边不再有环,但左边多了 44px 圆盘),
|
||
收到 25px,正好和 .ar-size 的高度配平。 */
|
||
.ar-week{font-size:25px;font-weight:800;letter-spacing:-.5px;line-height:1.2}
|
||
/* 孕程细条。i 的宽度由 JS 现写(syncPregnancy),
|
||
过渡时间和进度环那条对齐,两页切过去动感是一样的。 */
|
||
.ar-prog{margin-top:18px;height:5px;border-radius:99px;background:rgba(255,255,255,.28);overflow:hidden}
|
||
.ar-prog>i{display:block;height:100%;width:0;border-radius:99px;background:#fff;
|
||
transition:width 1.4s var(--ease)}
|
||
.ar-foot{display:flex;justify-content:space-between;margin-top:8px;font-size:11.5px;opacity:.86}
|
||
.ar-foot b{font-weight:800;font-size:12.5px}
|
||
/* 四层竖排比原来「两行文字 + 右边一个环」高了约 34px。
|
||
橙区本来就不小,再长一截就压得下面没地方了,所以把底部留白从 62 收到 44。
|
||
.page-body 的负外边距要跟着改同样的数(-46 → -28),
|
||
这两个数的差值才是「白卡顶边离橙区内容的距离」,一直是 16px,
|
||
只改一边白卡就会爬上去盖住「已陪伴 N 天」那行。 */
|
||
#screen-archive .page-hero{padding-bottom:44px}
|
||
#screen-archive .page-body{margin-top:-28px}
|
||
|
||
/* 自动归档卡 */
|
||
.auto-card{background:#fff;border-radius:22px;padding:18px;box-shadow:var(--sh-lg)}
|
||
/* 标题行左边是「● 正在自动归档」,右边顶着当前周次角标 */
|
||
.ac-head{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:17px;font-weight:800}
|
||
.ac-h-l{display:flex;align-items:center;gap:9px;min-width:0}
|
||
.live-dot{flex:0 0 auto;width:9px;height:9px;border-radius:50%;background:#5EBE6B;position:relative}
|
||
.live-dot::after{content:"";position:absolute;inset:-4px;border-radius:50%;border:2px solid rgba(94,190,107,.5);animation:pulse 1.8s ease-out infinite}
|
||
@keyframes pulse{0%{transform:scale(.7);opacity:1}100%{transform:scale(1.5);opacity:0}}
|
||
/* 统计胶囊现在排在生成入口下面,所以间距从这儿给 */
|
||
.ac-chips{display:flex;gap:7px;flex-wrap:wrap;margin-top:14px}
|
||
.chip-stat{background:#F6F1EC;border-radius:10px;padding:6px 11px;font-size:12px;color:var(--ink-2)}
|
||
.chip-stat b{color:var(--brand)}
|
||
|
||
/* ---- 生成档案入口(周档案 / 完整档案):并入自动归档卡内 ---- */
|
||
.gen-badge{flex:0 0 auto;font-size:11.5px;font-weight:700;color:var(--brand);background:rgba(244,89,60,.1);padding:5px 10px;border-radius:9px}
|
||
/* 上面那句说明段落删掉了,这里自己把上间距补回来 */
|
||
.gen-btns{display:flex;gap:10px;margin-top:15px}
|
||
.gen-btn{
|
||
flex:1;min-width:0;display:flex;align-items:center;gap:10px;text-align:left;
|
||
background:#F7F1EB;border-radius:16px;padding:12px;color:var(--ink);
|
||
}
|
||
.gen-btn svg{flex:0 0 auto;color:var(--brand)}
|
||
.gen-btn span{display:flex;flex-direction:column;gap:3px;min-width:0}
|
||
.gen-btn b{font-size:14px;font-weight:800;line-height:1.35}
|
||
/* 副标题:原先卡片上那句笼统的说明拆到了这里,每个入口自己解释自己 */
|
||
.gen-btn em{font-size:10.5px;color:var(--muted);font-style:normal;font-weight:600;line-height:1.3;white-space:nowrap}
|
||
|
||
/* ---- 档案图片预览 ---- */
|
||
/* 抬头卡:暖色底 + 白底方形图标,先告诉你手里这张是什么 */
|
||
.pst-hero{display:flex;align-items:flex-start;gap:14px;border-radius:22px;padding:18px;margin-bottom:12px;
|
||
background:linear-gradient(140deg,#FFF3EA,#FAE3D6)}
|
||
.pst-ico{flex:0 0 auto;width:46px;height:46px;border-radius:15px;background:#fff;color:var(--brand);
|
||
display:grid;place-items:center;box-shadow:0 6px 14px rgba(196,110,80,.18)}
|
||
.pst-h-txt{min-width:0}
|
||
.pst-h-title{font-size:18px;font-weight:800;color:#3A2C24}
|
||
.pst-lead{font-size:13px;color:#8B6E5E;line-height:1.7;margin:6px 0 0}
|
||
/* 这张图里装了什么:条数、天数、成图尺寸 */
|
||
.pst-chips{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:14px}
|
||
.pst-chip{background:#fff;border-radius:11px;padding:7px 11px;font-size:11.5px;color:var(--ink-2);box-shadow:var(--sh)}
|
||
.pst-chip b{color:var(--brand);font-weight:800;margin-left:3px}
|
||
/* 分享卡的三颗样式胶囊。用站内通用的 .chip,只在这儿管排版。
|
||
320 屏上 .detail-body 内宽 276:三颗 chip 各是 padding 34 + 文字
|
||
(信纸 28 / 成长足迹 56 / 比大小 42)= 62 + 90 + 76 = 228,
|
||
加两道 8px 间距共 244,比 276 富余 32px,不用横滚也不会折行。
|
||
⚠️ 加第四套样式前先按这个算式量一遍,超了就要给这行补 overflow-x:auto。 */
|
||
.pst-tpl{display:flex;gap:8px;margin-bottom:13px}
|
||
/* 完整档案是一页一张 A4,屏幕上就一张张纸往下摞,纸和纸之间留条缝 */
|
||
.pst-pages{display:flex;flex-direction:column;gap:14px}
|
||
/* 白色卡纸把图裱起来,再压一道虚线裁切位,像张待印的样张 */
|
||
.pst-frame{position:relative;padding:10px;border-radius:20px;overflow:hidden;box-shadow:var(--sh-lg);background:#fff;line-height:0}
|
||
.pst-frame::after{content:"";position:absolute;inset:5px;border:1.5px dashed rgba(150,110,88,.2);border-radius:16px;pointer-events:none}
|
||
/* canvas 用 2 倍像素画,这里按容器宽显示 */
|
||
.pst-frame canvas{width:100%;height:auto;display:block;border-radius:12px}
|
||
.pst-tip{font-size:11.5px;color:var(--muted);line-height:1.7;margin:13px 0 0}
|
||
|
||
/* 打印时只留这几张档案图,其它一概不出现在纸上 */
|
||
@media print{
|
||
/* 页边距已经画进画布里了(左边还留了装订边),浏览器不要再套一圈 */
|
||
@page{size:A4;margin:0}
|
||
body *{visibility:hidden}
|
||
#detailPoster,#detailPoster .detail-body,#detailPoster .pst-pages,#detailPoster .pst-frame,#detailPoster canvas{visibility:visible}
|
||
#detailPoster{position:absolute;inset:0;transform:none;overflow:visible;background:#fff}
|
||
#detailPoster .detail-bar,#detailPoster .pst-hero,#detailPoster .pst-chips,#detailPoster .pst-tip,#pstCta{display:none}
|
||
#detailPoster .detail-body{overflow:visible;padding:0}
|
||
/* 卡纸、裁切虚线、纸间缝隙都只是屏幕上的装饰,纸上不要 */
|
||
.pst-pages{display:block;gap:0}
|
||
.pst-frame{box-shadow:none;border-radius:0;padding:0;margin:0}
|
||
.pst-frame::after{display:none}
|
||
.pst-frame canvas{border-radius:0}
|
||
/* 一张画布 = 一张纸。最后一张后面不再断页,否则会多吐一张白纸 */
|
||
#detailPoster .pst-frame{page-break-after:always;break-after:page}
|
||
#detailPoster .pst-frame:last-child{page-break-after:auto;break-after:auto}
|
||
}
|
||
|
||
/* 分段控件 */
|
||
/* 三个分栏各自那行 sec-title 已删(和标签文字重复),
|
||
它原本提供的下间距改由这里给,否则内容会贴着分段控件 */
|
||
.segmented{position:relative;display:flex;background:#EFE7E0;border-radius:20px;padding:5px;margin:22px 0 16px}
|
||
.seg-thumb{position:absolute;top:5px;bottom:5px;left:5px;background:#fff;border-radius:16px;box-shadow:0 3px 10px rgba(150,100,80,.14);transition:transform .38s var(--ease),width .38s var(--ease);z-index:1}
|
||
.seg-btn{position:relative;z-index:2;flex:1;text-align:center;padding:11px 4px;font-size:15px;font-weight:600;color:var(--ink-2);transition:color .25s,font-weight .2s;white-space:nowrap}
|
||
.seg-btn.is-active{color:var(--ink);font-weight:800}
|
||
.seg-btn i{font-style:normal;font-size:12px;color:var(--brand)}
|
||
.seg-panel{display:none}
|
||
.seg-panel.is-active{display:block;animation:fadeUp .38s var(--ease)}
|
||
@keyframes fadeUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
|
||
|
||
/* 成长数据空态(未建档):.is-empty 由 syncPregnancy 的 pregEmpty 分支挂上。
|
||
演示数字(体重 58.2kg / 日均胎动 31 次 / 双顶径 6.1cm / 体重曲线…)全部无接口数据源,
|
||
对未建档用户是纯假数据,整块隐藏改显示引导;健康态下这层完全不参与,原型观感不变。 */
|
||
.data-empty{display:none;font-size:13px;color:var(--ink-2);line-height:1.9;text-align:center;padding:26px 18px;background:#fff;border-radius:22px;box-shadow:var(--sh)}
|
||
.seg-panel[data-panel="data"].is-empty .data-demo{display:none}
|
||
.seg-panel[data-panel="data"].is-empty .data-empty{display:block}
|
||
|
||
/* 时光轴 */
|
||
.tl-card{background:#fff;border-radius:22px;padding:20px 18px 6px;box-shadow:var(--sh)}
|
||
.tl-item{position:relative;padding:0 0 24px 22px}
|
||
.tl-item::before{content:"";position:absolute;left:0;top:5px;width:11px;height:11px;border-radius:50%;background:var(--brand);z-index:2}
|
||
.tl-item::after{content:"";position:absolute;left:5px;top:14px;bottom:-2px;width:1.6px;background:#F6E1D8}
|
||
.tl-item:last-child::after{display:none}
|
||
.tl-date{font-size:12.5px;font-weight:700;color:var(--muted);margin-bottom:7px}
|
||
.tl-item:first-child .tl-date{color:var(--brand)}
|
||
.tl-text{font-size:15.5px;line-height:1.78;color:#39302C}
|
||
.tl-text b{color:var(--brand)}
|
||
.tl-from{display:inline-block;margin-top:9px;background:#F6F1EC;border-radius:8px;padding:5px 10px;font-size:11.5px;color:var(--muted)}
|
||
.tl-item.hide{display:none}
|
||
|
||
/* 成长数据 */
|
||
.stat-row{display:grid;grid-template-columns:repeat(3,1fr);gap:9px}
|
||
.stat-card{background:#fff;border-radius:16px;padding:13px 12px 8px;box-shadow:var(--sh)}
|
||
.sc-label{font-size:12px;color:var(--ink-2)}
|
||
.sc-value{font-size:24px;font-weight:800;letter-spacing:-.6px;margin:5px 0 3px}
|
||
.sc-value small{font-size:12px;font-weight:700}
|
||
.sc-trend{font-size:12px;font-weight:700;color:var(--brand)}
|
||
.sc-trend.ok{color:var(--green)}
|
||
.sc-trend.purple{color:var(--purple)}
|
||
.spark{width:100%;height:auto;margin-top:8px;display:block}
|
||
.spark polyline{stroke-dasharray:300;stroke-dashoffset:300;animation:draw 1.1s .2s var(--ease) forwards}
|
||
@keyframes draw{to{stroke-dashoffset:0}}
|
||
|
||
.chart-card{background:#fff;border-radius:22px;padding:18px;margin-top:12px;box-shadow:var(--sh)}
|
||
.cc-title{font-size:16px;font-weight:800;margin-bottom:14px}
|
||
.chart{width:100%;height:auto;display:block;overflow:visible}
|
||
.chart .grid{stroke:#F2ECE7;stroke-width:1}
|
||
.chart .band{fill:rgba(160,196,130,.24)}
|
||
.chart .area{fill:rgba(244,89,60,.08)}
|
||
.chart .line{fill:none;stroke:var(--brand);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:400;stroke-dashoffset:400;animation:draw 1.3s .15s var(--ease) forwards}
|
||
.chart .pt{fill:#fff;stroke:var(--brand);stroke-width:3}
|
||
.chart .pt.fill{fill:var(--brand);stroke:#fff}
|
||
.cc-x{display:flex;justify-content:space-between;font-size:11.5px;color:var(--muted);margin-top:9px;padding:0 2px}
|
||
.cc-legend{display:flex;gap:18px;margin-top:12px;padding-top:12px;border-top:1px solid var(--line)}
|
||
.lg{font-size:12.5px;color:var(--ink-2);display:flex;align-items:center;gap:6px}
|
||
.lg::before{content:"";width:16px;height:4px;border-radius:2px}
|
||
.lg-line::before{background:var(--brand)}
|
||
.lg-band::before{background:rgba(160,196,130,.5)}
|
||
|
||
.meas-card{background:#fff;border-radius:22px;padding:6px 18px;margin-top:12px;box-shadow:var(--sh)}
|
||
.meas{display:flex;align-items:center;gap:14px;padding:17px 0;border-bottom:1px solid var(--line)}
|
||
.meas:last-child{border:0}
|
||
.m-name{font-size:16px;font-weight:800;flex:0 0 62px}
|
||
.m-bar{flex:1;height:9px;border-radius:5px;background:#E9EFE1;position:relative}
|
||
.m-bar i{position:absolute;left:0;top:0;bottom:0;width:var(--p);background:linear-gradient(90deg,#DCE8CE,#C6DCB0);border-radius:5px}
|
||
.m-bar::after{content:"";position:absolute;left:var(--p,50%);top:50%;width:17px;height:17px;border-radius:50%;background:#fff;border:3px solid var(--brand);transform:translate(-50%,-50%);box-shadow:0 2px 6px rgba(0,0,0,.12)}
|
||
.m-val{text-align:right;flex:0 0 58px}
|
||
.m-val small{font-size:12px}
|
||
.m-val em{display:block;font-size:11.5px;color:var(--muted);font-weight:600;margin-top:2px}
|
||
.m-val{font-size:19px;font-weight:800}
|
||
|
||
/* 珍贵时刻 */
|
||
.moment-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
|
||
.moment{background:#fff;border-radius:18px;overflow:hidden;box-shadow:var(--sh);padding-bottom:12px}
|
||
.mo-art{height:104px;display:grid;place-items:center;position:relative}
|
||
/* 扁平图标统一规格:46px、线宽 2.4、圆角端点;
|
||
.f = 半透明白底(让图形从渐变里浮出来),.s = 描边,.d = 实心点 */
|
||
.mo-art svg{width:46px;height:46px;display:block;color:currentColor}
|
||
.mo-art svg .f{fill:#fff;opacity:.66}
|
||
.mo-art svg .s{fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}
|
||
.mo-art svg .d{fill:currentColor}
|
||
.mo-art.a1{background:linear-gradient(140deg,#EDE7F8,#E3D9F5);color:#6B54BE}
|
||
.mo-art.a2{background:linear-gradient(140deg,#FCE9E4,#FADCD3);color:#D0563F}
|
||
.mo-art.a3{background:linear-gradient(140deg,#E9F2E0,#DDEBD0);color:#5A8A41}
|
||
.mo-art.a4{background:linear-gradient(140deg,#FBEDE4,#F7E0D2);color:#CE6F35}
|
||
.mo-art.a5{background:linear-gradient(140deg,#E2EDF7,#D4E4F4);color:#3C6DA8}
|
||
.mo-art.a6{background:linear-gradient(140deg,#FDEAE0,#FADCCC);color:#C4632F}
|
||
.star{position:absolute;top:8px;right:9px;font-size:17px;color:rgba(255,255,255,.85);text-shadow:0 1px 3px rgba(0,0,0,.15);transition:transform .25s var(--ease),color .2s}
|
||
.star.is-on{color:#FFC93C}
|
||
.star:active{transform:scale(1.35)}
|
||
.mo-title{font-size:14.5px;font-weight:800;margin:11px 12px 5px}
|
||
.mo-meta{font-size:11.5px;color:var(--muted);margin:0 12px 7px}
|
||
.mo-from{display:inline-block;margin:0 12px;background:#F6F1EC;border-radius:7px;padding:4px 8px;font-size:11px;color:var(--muted)}
|
||
.moment.hide{display:none}
|
||
|
||
/* 纪念册 */
|
||
.album-card{display:flex;gap:15px;width:100%;background:linear-gradient(120deg,#FCEDE1,#F9E0D0);border-radius:22px;padding:18px;margin-top:22px;box-shadow:var(--sh)}
|
||
.al-book{flex:0 0 82px;height:110px;border-radius:5px 10px 10px 5px;background:linear-gradient(150deg,#F2795A,#E04E2E);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;color:#fff;box-shadow:0 10px 20px rgba(190,80,50,.32),inset 4px 0 0 rgba(255,255,255,.22)}
|
||
.al-leaf{font-size:28px}
|
||
.al-tag{font-size:11.5px;font-weight:800;text-align:center;line-height:1.35}
|
||
.al-title{font-size:17px;font-weight:800}
|
||
.al-title em{font-size:12.5px;color:var(--brand);margin-left:6px}
|
||
.al-desc{font-size:12.5px;color:var(--ink-2);line-height:1.7;margin:7px 0 11px}
|
||
.al-bar{height:8px;border-radius:4px;background:rgba(255,255,255,.75);overflow:hidden}
|
||
.al-bar i{display:block;height:100%;width:var(--p);background:linear-gradient(90deg,#FF8A68,#F0563A);border-radius:4px}
|
||
.al-meta{font-size:11.5px;color:var(--ink-2);margin-top:8px}
|
||
|
||
/* ============ 我的 ============ */
|
||
.me-top{padding:calc(env(safe-area-inset-top) + 18px) 18px 26px;background:var(--grad);border-radius:0 0 32px 32px;color:#fff;position:relative;overflow:hidden}
|
||
.me-top::after{content:"";position:absolute;width:220px;height:220px;border-radius:50%;background:rgba(255,255,255,.08);top:-80px;right:-60px}
|
||
/* 齿轮按钮直接挂在 .hero-top 上,没有 .hero-actions 包着,
|
||
够不到那条 margin-left:auto,所以这里单独把这一排改成靠右 */
|
||
.me-top .hero-top{margin-bottom:18px;justify-content:flex-end}
|
||
/* 半透明玻璃压在橘色渐变上永远发灰、发脏,文字也只能跟着用白的,读起来累。
|
||
改成一张实心暖白卡:橘色只做底衬,卡内回到正常的深色文字层级,
|
||
和页面下方的 .preg-card / .list-card 是同一种白卡语言。
|
||
── 底纹改成横向,这是第三版,前两版都被同一句话打回来 ──
|
||
⚠️ 用户为这张卡提过**两次**同样的意见(「加一点渐变,不要纯白色」
|
||
「现在纯白色不好看」)。两次我都只是把色标往深里调 ——
|
||
#FFF7F3 → 加个 52% 中间标 → #FFE9DB,两次都没解决。
|
||
**问题从来不在颜色深浅,在暖色铺到的面积。**
|
||
150deg 是斜的:暖色只落在右下那个角,而卡是 ~300×100 的扁盒子,
|
||
对角线方向上「右下角」小得可怜,正中间和左上恒定是白的。
|
||
色标再往深调,只会把那个小角调脏,卡整体照样读作白。
|
||
→ 所以这一版换成 90deg 横向,让暖色从右边**整片**压过来,
|
||
白区收在左边 20%(正好留给头像)。终点 #FFE4D4 其实只比上一版
|
||
#FFE9DB 深一点点,但观感差别很大 —— 差在面积,不在那点色差。
|
||
→ 下次若还嫌白,**别再动色标**,先想面积和方向。
|
||
⚠️ 横向渐变顺带解开了上一版那条「不能再往深里调」的限制:
|
||
当时的顾虑是终点会和 .me-avatar 的底(linear-gradient(140deg,#FFE6DA,#FBCFBF))
|
||
糊在一起。那是 150deg 才有的问题 —— 斜渐变把暖色送到了头像所在的左侧中部。
|
||
现在头像坐在左边 20% 的纯白区里,暖色在它右边,两者根本不相邻。
|
||
⚠️ 白区 20% 是给头像留的,别收窄:.me-avatar 是 66px 宽、左边距 18px,
|
||
在 ~300px 的卡上占到约 28%。白区若缩到 20% 以下,头像右半边会开始
|
||
压在暖色上,那圈 box-shadow 的白边就废了(它就是靠白底才划得出边界的)。
|
||
对比度复核(这次是实算的,见下面那笔更正):底色取渐变终点 #FFE4D4,
|
||
再叠上右上角那团柔光(rgba(255,196,160,.34))算最坏情况:
|
||
--ink #2B2320 11.70:1 ✓ 远超 AA
|
||
--ink-2 #6B615B 4.58:1 ✓ 刚过 AA 4.5(余量很薄,见下)
|
||
--brand #F4593C 2.52:1 ✗ 不过 AA
|
||
⚠️ 上一版这段注释写着「.me-info p b 用 --brand 约 3.3:1」—— **那个数是错的**,
|
||
3.31:1 是 --brand 压在**纯白**上的值,不是压在 #FFE9DB 上的。
|
||
实算:压 #FFE9DB 是 2.83:1,压现在的 #FFE4D4+柔光是 2.52:1。
|
||
也就是说「已连续记录 **42** 天」那个品牌色数字,**在这一版之前就已经不过 AA**,
|
||
不是这次改坏的,但这次又薄了 0.3。没有一并修,是因为改它要动全站品牌色的
|
||
用法(--brand 压浅底到处都是这个量级),不该夹在一次底纹调整里顺手做。
|
||
要修的话:给 .me-info p b 单独配一个压深版品牌色(约 #C9401F 起步才够 4.5)。
|
||
⚠️ --ink-2 那 4.58 只比 4.5 高 0.08,**别再加深终点或加大柔光**:
|
||
终点走到 #FFE0CC、或柔光提到 .42,它就掉到 4.5 以下了(实算 4.44 / 4.45)。 */
|
||
.me-card{display:flex;align-items:center;gap:14px;border-radius:26px;padding:17px 18px;
|
||
background-color:#fff;
|
||
/* 两层:底下一条横向暖色渐变(白区留给左边的头像),
|
||
上面右上角一团柔光,免得整块暖色看着像一条平铺的色带。
|
||
和首页 .today-line 是同一套手法(那边也是 radial 柔光 + 90deg 渐变)。 */
|
||
background-image:
|
||
radial-gradient(128px 92px at 94% 6%, rgba(255,196,160,.34), rgba(255,196,160,0) 72%),
|
||
linear-gradient(90deg,#fff 0%,#fff 20%,#FFF1E6 58%,#FFE4D4 100%);
|
||
color:var(--ink);
|
||
box-shadow:0 14px 32px rgba(140,56,34,.22),0 2px 6px rgba(140,56,34,.10);
|
||
position:relative;z-index:2;overflow:hidden;cursor:pointer;transition:transform .18s var(--ease)}
|
||
.me-card:active{transform:scale(.985)}
|
||
/* 尖括号跟全站 .chev 一个灰度,别再用白色 */
|
||
.me-chev{margin-left:auto;flex:0 0 auto;font-style:normal;font-size:24px;line-height:1;color:#C9BFB8}
|
||
/* 头像底从「白蒙版 + 白描边」换成暖橘底 + 品牌色剪影(与 .pc-ico 同一套配色)。
|
||
⚠️ 外圈本批从 #FFF3EC 改回了纯 #fff。那圈浅橘白光晕本来是照着
|
||
「卡是白的」调的 —— 卡一变暖(终点 #FFE9DB),#FFF3EC 就夹在
|
||
卡色和头像底色中间,三层暖色叠在一起,那道圈等于消失了。
|
||
用纯白才重新和两边都拉开,头像才有一条清楚的边界。
|
||
别跟着卡的渐变把它也调暖,那就白改了。 */
|
||
.me-avatar{width:66px;height:66px;border-radius:50%;
|
||
background:linear-gradient(140deg,#FFE6DA,#FBCFBF);
|
||
display:grid;place-items:center;color:#EE7C5F;border:0;
|
||
box-shadow:0 0 0 3px #fff,0 6px 14px rgba(196,110,80,.20);
|
||
flex:0 0 auto;position:relative}
|
||
/* 上传头像后用 <img> 盖掉默认剪影;没图时 img 不占位 */
|
||
.me-avatar img{display:none;position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:50%}
|
||
.me-avatar.has-img img{display:block}
|
||
.me-avatar.has-img>svg{visibility:hidden}
|
||
/* 白卡上再放白角标会糊掉,所以反过来:品牌色实心 + 白图标,
|
||
外面镶一圈白边,压在头像和卡面的交界处也读得出来 */
|
||
.av-edit{position:absolute;right:-2px;bottom:-2px;width:21px;height:21px;border-radius:50%;
|
||
background:var(--brand);color:#fff;display:grid;place-items:center;
|
||
box-shadow:0 0 0 2px #fff,0 3px 8px rgba(196,80,52,.38)}
|
||
.me-info{flex:1;min-width:0}
|
||
.me-name{font-size:21px;font-weight:800;color:var(--ink);letter-spacing:-.3px}
|
||
/* 原来靠 opacity 压层级,在白底上只会发灰,换成正经的次级文字色 */
|
||
.me-info p{font-size:13px;color:var(--ink-2);line-height:1.5;margin-top:5px}
|
||
.me-info p b{color:var(--brand);font-weight:800}
|
||
/* ⚠️ 这里原来有一条 .me-bio(一句话签名的单行截断)。签名整块已按用户要求删掉,
|
||
这条规则跟着删了 —— DOM 里再没有 .me-bio 这个元素。
|
||
留一条永远选不中东西的规则,下一个人读 CSS 会以为页面上还有这行内容,
|
||
然后跑去 JS 里找是谁把它藏起来了。
|
||
要加回签名,四处一起加:#pfBio 输入框 / #meBio 展示行 / syncBio() / 这条规则。 */
|
||
.sec-title.dark{color:var(--ink)}
|
||
|
||
/* ---- 孕期信息卡 ----
|
||
原来是纯白卡,夹在橘色 .me-top 和下面那张暖橘福利卡中间,自己反倒最没存在感。
|
||
⚠️ 这里**不能**也换成暖橘:一页上两张暖卡挨着,等于谁都没被突出,
|
||
而且福利卡(讲「白送你一件东西」)本就该是全页最跳的那张。
|
||
所以这张必须靠色系和邻居错开,两张卡才各自站得住。
|
||
|
||
配色改到第五版了,把前四版为什么被打回来写清楚,别再走一遍:
|
||
v1 纯白 —— 没存在感
|
||
v2 雾蓝 #F2F7FD→#E6EEF9 —— 打回,原话「颜色不是很好」
|
||
v3 薰衣草紫→藕荷粉 #E7DDFA→#F7E4F0 —— 又打回,原话「需要有设计感一些」
|
||
v4 深靛→紫→玫 #4E3FA8→#7C4FCB→#B0417F —— 打回,原话「那个紫太扎眼了」
|
||
⚠️ 复盘的关键在这里:v2 和 v3 是**同一个错**,我第二次才看出来。
|
||
v2 我归因成「两端色相拉得太近」,于是 v3 把色相从 2° 拉到 61°,
|
||
结果还是被打回 —— 说明色相差不是真正的病根。
|
||
**v2 和 v3 都是「浅色水洗」**:三通道全在 220 以上,
|
||
不管两端离多远,整张卡在手机上都只是一小片淡色,
|
||
而它上面就压着一整条饱和橘色的 .me-top。淡色卡贴在浓色条下面,
|
||
再怎么调色相也只会显得虚。所以 v4 不再在浅色里挑颜色,
|
||
直接换成**深色卡 + 白字**:靠明度对比站住,而不是靠色相。
|
||
v4 深靛→紫→玫 #4E3FA8→#7C4FCB→#B0417F —— 打回,原话「那个紫太扎眼了」
|
||
v4 的深色思路**是对的**(打回的是色相,不是明度),所以 v5 原样保留
|
||
「深色卡 + 白字」,只把紫换成绿:
|
||
v5:墨绿 #1E5A46 → 绿 #2C6B4C → 草绿 #3E6B30,白字。
|
||
· 色相 160.0° / 149.6° / 105.8°,仍全在暖橘带(10°–60°)之外,
|
||
和福利卡错开的原始目的没丢;
|
||
· 首尾跨 54.2°,比 v4 的 77.9° 窄,但**远远大于 v2 死掉时的 2°**,
|
||
渐变看得见就够了;
|
||
· 明度上和上下两张浅色卡彻底分开 —— v4 挣来的那一半没退。
|
||
⚠️ 换色时白字对比度**变好了,不是凑合过**(实测,白 #FFF 压在三个色标上):
|
||
v4 紫 8.08 / 5.47 / 5.37 → 最低 5.37
|
||
v5 绿 8.06 / 6.34 / 6.27 → 最低 6.27
|
||
.pc-sub / .pc-stage 那种 78% 白的副文同理:v4 最低 3.90 → v5 最低 4.54。
|
||
末档特意从更漂亮的 #4A7C3C(白字只有 4.95,**比紫还差**)压深到 #3E6B30,
|
||
就是为了不拿可读性换颜色。改这三个值之前先把这两组数重量一遍。
|
||
⚠️ 别把它调浅回去凑「温柔」。真要调,先想清楚怎么解决
|
||
「淡色卡压在饱和橘条下面显虚」这件事,那是 v2/v3 死掉的地方。
|
||
⚠️ 也别顺手把它调成 --mom 那支绿(#3F7551)。那支是「妈妈这个人」的语义色,
|
||
挪来当一张信息卡的底,等于宣布这张卡属于妈妈 —— 它讲的是宝宝的孕周。
|
||
|
||
⚠️ 换底色必须连带把卡里**所有**彩色件一起换掉,这张卡的坑比别的卡多,
|
||
因为它的零件散在三个地方:
|
||
· 这里(图标底、进度槽、进度条、三段文字、标题、副文)
|
||
· index.html 的 SVG presentation attribute(进度环 + 宝宝,共 4 处)
|
||
· 全局规则里两个**会被继承进来**的颜色 —— 见下面 .chev / .rp 两条
|
||
只改背景会得到「深紫底配浅紫环」,比原来的纯白更难看。 */
|
||
.preg-card{display:block;width:100%;
|
||
/* 两层背景:上层是右上角那点高光,下层才是主渐变。
|
||
⚠️ 用多重背景而不是 ::before 画高光,是为了躲开一个真实的层序坑:
|
||
这张卡带 .ripple(position:relative 但 z-index:auto,**不产生层叠上下文**),
|
||
绝对定位的 ::before 会画在普通流子元素**上面**,高光正好糊住标题;
|
||
改用 z-index:-1 又会穿到祖先背景后面去,还得再补 isolation。
|
||
高光本来就只是背景的一部分,写成背景层这些问题一个都不存在。 */
|
||
background:
|
||
radial-gradient(110px 80px at 86% 6%, rgba(255,255,255,.20), rgba(255,255,255,0) 72%),
|
||
linear-gradient(140deg,#1E5A46 0%,#2C6B4C 46%,#3E6B30 100%);
|
||
border-radius:22px;padding:18px;
|
||
/* 阴影跟着卡片自己的色相走,不用全局那个中性灰 var(--sh):
|
||
深色卡投一片灰影会显脏,投同色系的影才像这张卡「浮」起来。
|
||
⚠️ 这就是「跟着色相走」的代价:换底色时它**必须一起换**。
|
||
本批之前是 rgba(78,63,168,.30)(v4 紫的 rgb),底换成绿而影还是紫的话,
|
||
卡下面会渗出一圈淡紫 —— 在浅色页面上看得见,但很容易当成「本来就有的氛围」。
|
||
下面这个是 v5 首档 #1E5A46 的 rgb。 */
|
||
box-shadow:0 10px 24px rgba(30,90,70,.30)}
|
||
.pc-row{display:flex;align-items:center;gap:13px}
|
||
.pc-ico{width:52px;height:52px;border-radius:15px;background:rgba(255,255,255,.16);display:grid;place-items:center;flex:0 0 auto}
|
||
/* ⚠️ 标题这行原来不写 color,靠继承拿到深墨色。底一换成深色,
|
||
不显式写白就是「深紫底上的深墨字」—— 等于没有字。 */
|
||
.pc-title{font-size:21px;font-weight:800;letter-spacing:-.4px;color:#fff}
|
||
.pc-sub{font-size:12.5px;color:rgba(255,255,255,.78);margin-top:4px}
|
||
.pc-main{flex:1;min-width:0}
|
||
/* ⚠️ 这两条挡的是**继承进来的**全局颜色,是这次换色最容易漏的一处 ——
|
||
它们不在这个模块的代码里,grep「preg」「pc-」一个都搜不到:
|
||
· .chev 全局是 #C9BFB8(浅灰),画在深紫底上基本看不见;
|
||
· .rp(涟漪)全局是 rgba(244,89,60,.16),橘色 16% 铺在深紫上是一团脏影。
|
||
两条都只在这张卡里覆盖,不动全局 —— 别的卡还是浅底,全局值在那儿是对的。 */
|
||
.preg-card .chev{color:rgba(255,255,255,.75)}
|
||
.preg-card .rp{background:rgba(255,255,255,.22)}
|
||
/* 底槽和进度条都改成白的透明度分级:深色卡上再挑一个「更深的紫」当底槽,
|
||
在 9px 高的条子上根本分不出层次 */
|
||
.pc-bar{height:9px;border-radius:5px;background:rgba(255,255,255,.22);margin:16px 0 10px;overflow:hidden}
|
||
.pc-bar i{display:block;height:100%;width:var(--p);background:linear-gradient(90deg,rgba(255,255,255,.85),#fff);border-radius:5px}
|
||
.pc-stage{display:flex;justify-content:space-between;font-size:11.5px;color:rgba(255,255,255,.85)}
|
||
/* 当前段从「换个字色」升级成一颗白药丸:深色卡上只靠白色深浅分主次,
|
||
11.5px 的小字拉不开差距;反白一块才一眼看得出走到哪一段了。
|
||
⚠️ margin 上下各 -3px 抵掉 padding,保证这一行的高度和没药丸时一样 ——
|
||
不然这张卡会因为「当前段」比兄弟高 6px 而整体长高。
|
||
⚠️ .cur 是 syncPregnancy() 按孕周在三段之间**搬来搬去**的,
|
||
药丸可能落在第一段或第三段(贴着卡的左右内边)。space-between
|
||
三段都放得下:早/晚期 3 字≈34.5px、中期「孕中期 · 当前」7 字≈80px,
|
||
加内边距最宽 98px,三段合计 167px < 可用 248px。 */
|
||
/* ⚠️ 药丸里的字色是**卡底渐变的首档**,不是随便一个深色 ——
|
||
白药丸是从卡上「挖」出来的,字色取卡自己的深色才像同一张卡上的东西。
|
||
本批底色换绿,这里跟着从 #4E3FA8 换成 #1E5A46(白底上 8.06:1)。
|
||
漏改的话:绿卡上一颗白药丸、里面躺着一个紫字,这是全卡最后一处紫。 */
|
||
.pc-stage .cur{color:#1E5A46;background:#fff;font-weight:700;
|
||
padding:3px 9px;margin:-3px 0;border-radius:99px}
|
||
|
||
/* ---- 试用装福利卡(企业微信入口)----
|
||
和 .preg-card 同样的大圆角,是「我的」页上第二张真正的卡;
|
||
刻意不长得像下面 .list-card 里那些行 —— 它不是一条设置项。
|
||
底色从纯白换成暖渐变:这张卡现在讲的是「白送你一件东西」,
|
||
跟周围一水儿的白底卡拉开,福利感才立得住。 */
|
||
/* ⚠️ 这一版是**竖向三段**(不是四段,别照旧记忆数):
|
||
.wx-top 角标行(右对齐)/ .wx-body 图文行 / .wx-cta 通栏按钮。
|
||
标题行 .wx-head **不是**卡的直接子元素,它在 .wx-body 的右列 .wx-main 里,
|
||
和价格共用同一条左缘 —— 那是用户要的「放到到手价上边、跟到手价对齐」。
|
||
演化:左右两列 → 三段(标题独占一行)→ 四段(角标再提一行)
|
||
→ 又回到三段(标题行搬进右列)。每一步都是被账或被用户原话逼的。
|
||
⚠️ 两笔账的**分母不一样**,别混用:
|
||
角标行量的是**卡内净宽 248**(320 − 36 − 36);
|
||
标题行量的是**右列 160**(248 − 图 76 − gap 12)。
|
||
拿 248 去算标题行会得出「宽得很,都塞得下」的反结论。
|
||
角标为什么必须自己占一行(按现在的 160 算):
|
||
商品名「可心柔婴儿纸巾」7 × 16 = 112,
|
||
再塞 gap 6 + 「限量福利」角标 60 = 178 > 160 ✗ 差 18px。
|
||
而且这还是 1.0 倍;微信字体滑块最大档 1.35 倍下商品名自己就占 151.2,
|
||
160 里只剩 8.8px,角标连一个字都进不去。
|
||
所以角标只能自己占一行、右对齐 —— 那也正是用户要的「放到右上角」。
|
||
⚠️ .wx-card 的 flex-direction 是 column,**不是** row。
|
||
谁改回 row(或删掉 direction 退回默认),三段会并排挤成一条,
|
||
而且**不报错**,只是难看。smoke 钉了一条。
|
||
⚠️ 也别加 flex-wrap:竖排容器里 wrap 只在高度溢出时生效,在这儿是纯噪声,
|
||
还会让下一个人以为有换行逻辑。 */
|
||
.wx-card{display:flex;flex-direction:column;width:100%;
|
||
background:linear-gradient(135deg,#FFF4EC,#FFE6D9);
|
||
border-radius:22px;padding:16px 18px;box-shadow:var(--sh)}
|
||
|
||
/* ---- 第一段:角标行 ----
|
||
⚠️ 用 justify-content:flex-end 把角标推到右上角,**不是** position:absolute。
|
||
这是硬约束不是风格选择:.wx-card 挂着 .ripple,.ripple 带 overflow:hidden
|
||
(style.css:135),任何骑边(绝对定位 / top 负值)的角标都会被裁掉半截 ——
|
||
用户上一轮说的「限量福利被切了」正是这么来的。
|
||
修法也**不是**给卡加 overflow:visible:那会把涟漪放出圆角卡外。
|
||
走正常流 + 右对齐,物理上就不存在被裁的可能。
|
||
⚠️ 这一行只装角标一件,看着「浪费」了一行高度。别为了省它把角标并进别处:
|
||
角标 4×10.5 + 内边 18 = 60px,塞进现在只有 160px 的右列必然溢出,
|
||
而溢出的表现是商品名被省略号啃掉、且不报错。
|
||
18px 行高换商品名完整可见,这笔划算。 */
|
||
.wx-top{display:flex;justify-content:flex-end;margin-bottom:8px}
|
||
|
||
/* ---- 第二段:图文行(图 + 右列) ----
|
||
⚠️ align-items 必须是 **stretch**,不能是 center。这是用户「左边整个的位置
|
||
都是留给图片」那句话的**全部实现**:只有父容器 stretch,下面 .wx-fig 的
|
||
align-self:stretch 才有效,图片才会长满左列整个高度。
|
||
改回 center 的话图片缩回自己的内容高,左边空出一块,
|
||
而且**不报错、不溢出** —— 只有真机上看得出来。smoke 里有断言钉着这条。
|
||
gap 13 → 12:右列从 147px 加宽到 160px,这 1px 也是凑出来的(见 .wx-main)。 */
|
||
.wx-body{display:flex;align-items:stretch;gap:12px;margin-top:12px}
|
||
/* 商品占位图(现在是内联 SVG 抽纸,待换真图)。
|
||
⚠️ 宽度写死在容器上而不是交给里面的 svg/img 自己撑:换成真实商品图那天,
|
||
图的原始比例不会把这一格顶大、把右边标题挤没。
|
||
⚠️ 但**高度故意不写死**,用 align-self:stretch + min-height:92px:
|
||
stretch 让图跟着右列一起长 —— 这是用户「左边整个的位置都是留给图片」
|
||
那句要求的**实现本身**。父级 .wx-body 必须同时是 align-items:stretch,
|
||
缺一条图就缩回自己的内容高,而且不报错、只在真机上看得出来
|
||
(smoke 里两条都钉着)。
|
||
⚠️ min-height:92 本批起**已经不再起作用**,留着只是个地板。
|
||
标题行改竖排之后右列变高了:
|
||
.wx-head = 20.8(标题 16×1.3) + gap 3 + 14.95(限领 11.5×1.3) = 38.75
|
||
+ gap 5 + 26(价格) + gap 5 + 18.1(副文一行) ≈ **92.9**
|
||
(副文折两行时 ≈ 111)
|
||
92.9 恒大于 92,撑高度的活已经全归 stretch 了。别看到这个数就以为
|
||
它还在管事,也别为了「对齐」把它调成 93 —— 调了没有任何效果。
|
||
88 → 76:这是上一版**横排**标题行留下的数(那时右列要塞 152px 的商品名 + 限领)。
|
||
⚠️ 竖排之后这条约束没了:现在右列最宽的是副文 138px,图理论上能回到 88
|
||
(右列剩 148,仍 ≥ 138)。本批**没有改回去** —— 余量会从 22px 掉到 10px,
|
||
而用户这次并没有说图小了。真要动先把下面 .wx-main 那笔账重算一遍。
|
||
⚠️ background 不能省。里面是**内联 svg**,object-fit 对它**不生效** ——
|
||
生效的是 preserveAspectRatio(默认 xMidYMid meet = contain)。
|
||
64×64 的方图进 76×92 的框会上下各留 8px 空条,露出卡的橙色渐变。
|
||
#FFF1E6 取的是 svg 自己那张 <rect> 的颜色,接缝就看不见了。
|
||
别改成 slice(cover)—— 那会把抽纸盒裁掉头尾。 */
|
||
.wx-fig{flex:0 0 76px;width:76px;align-self:stretch;min-height:92px;
|
||
background:#FFF1E6;line-height:0;border-radius:16px;overflow:hidden}
|
||
.wx-fig>svg,.wx-fig>img{display:block;width:100%;height:100%;object-fit:cover}
|
||
/* 角标本体。⚠️ 它现在住在 .wx-top 里(卡的右上角),**不再**是 .wx-main 的
|
||
第一件。别再给它 align-self:flex-start —— 那是它待在右列时用来「缩成胶囊」的,
|
||
现在父容器是 justify-content:flex-end 的单件行,那条已经没有意义。
|
||
⚠️ 这里**永远**不要出现 position:absolute / top 负值,理由见 .wx-top 上面那段。
|
||
「电商化」这一版给它换成了品牌色斜向渐变 + 稍重的投影:促销角标本来就该比
|
||
正文更跳,但仍克制在一枚小胶囊里,不做成撕裂丝带那种廉价样式。 */
|
||
.wx-badge{font-size:10.5px;font-weight:800;
|
||
color:#fff;background:linear-gradient(135deg,#E86A3E,#D8452F);
|
||
border-radius:9px;padding:3px 9px;
|
||
letter-spacing:.3px;box-shadow:0 2px 6px rgba(216,95,56,.32)}
|
||
/* 图文行的右列:竖排 标题行 / 价格 / 副文。
|
||
⚠️ 本批把 .wx-head(商品名 + 限领)**搬进了这一列**,排在 .wx-price 之前。
|
||
用户的原话是「商品名放到到手价上边,跟到手价那个对齐」——
|
||
同属这一列 = 共用同一条左缘 = 「对齐」。别再把它提回卡的直接子元素。
|
||
⚠️ CTA 和角标仍然**不在**这一列(在卡的直接子元素 / .wx-top),别在这儿找。
|
||
⚠️ 320 屏上这一列是 **160px**:
|
||
320 − 页边距 36 − 卡内边距 36 − 图 76 − 一道 gap 12 = 160
|
||
标题行本批起**竖排**,两件各占一整行、互不抢宽度:
|
||
商品名「可心柔婴儿纸巾」7×16 = 112 ✓ 余 48px
|
||
「限领一份」 4×11.5 = 46 ✓ 余 114px
|
||
价格行「到手价」3×11.5 = 34.5 + gap 5 + 「¥0」≈ 26 ≈ 66 ✓ 余 94px
|
||
副文「加小汤圆的孕育顾问领取」11×12.5 ≈ 138 ✓ 余 22px(允许折两行)
|
||
⚠️ 全列最紧的一行现在是**副文**(138/160,余 22px),不再是标题行。
|
||
上一版标题行横排、只余 8px,微信那个全局字体滑块一调大就把商品名啃成
|
||
「可心柔婴儿纸…」—— 那正是用户本批报的 bug,别把它装回来。
|
||
justify-content:center 保留:右列自己现在就有 92.9px 高、和图基本齐平,
|
||
正常情况下居中不产生位移;它兜的是「以后图被调高」那种情形。 */
|
||
.wx-main{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;gap:5px}
|
||
/* ---- 标题行(住在 .wx-main 里,右列的第一件) ----
|
||
⚠️ 对齐用的是 flex-end(底对齐),**不是** baseline,虽然 baseline 才是
|
||
两段不同字号文字并排的正解。原因是 .wx-title 带 overflow:hidden
|
||
(ellipsis 必须的)—— 按 CSS Inline / Flexbox 的规定,overflow 非 visible
|
||
的块容器**没有可用基线**,浏览器会拿它的 border box 底边合成一条,
|
||
结果就是「限领一份」被顶到标题上方去,看着像上标。
|
||
这个坑不会报错、只在真机上看得出来。
|
||
底对齐的残留误差(字号降了之后重算过):标题 15px/1.3 = 19.5 高,
|
||
基线离底边 (19.5−15)/2 + 0.12×15 ≈ 4.05px;限领 10.5px/1.3 = 13.65 高,
|
||
基线离底边 (13.65−10.5)/2 + 0.12×10.5 ≈ 2.84px。
|
||
两条基线差 ≈ 1.2px —— 肉眼看不出来,比 baseline 塌掉那种错法小一个量级。
|
||
gap 6 → 5:右列 160px 里要塞 105 + 42 = 147,gap 只能给 5 才留得下 8px 余量。
|
||
|
||
==== 本批改成竖排,上面这整段横排的账作废(留着是为了说明为什么不能改回去)====
|
||
用户报「商品名被切成『可心柔婴儿纸…』」。真因不是写错了,是那 8px 余量本身:
|
||
它是按 15px 字号**死算**出来的,而微信有一个全局字体大小滑块,用户一旦调大,
|
||
105px 的商品名当场涨到 130+,8px 余量瞬间蒸发,ellipsis 就啃掉了商品名。
|
||
横排方案的根子问题是「两件抢同一条 160px」,再怎么调字号都只是把临界点往后推。
|
||
竖排之后标题独占整行,商品名可用宽度从 113(160−5−42) 变成 160,
|
||
放大 1.5 倍都还装得下 —— 宽度争抢从根上消失了。
|
||
⚠️ 别改回 flex-direction:row 去「省一行高度」,那等于把这个 bug 装回来。
|
||
⚠️ align-items:flex-start 不能省:默认 stretch 会把两个 span 拉成满列宽,
|
||
「限领一份」的灰底/间距一旦以后加上去就会横贯整列。 */
|
||
.wx-head{display:flex;flex-direction:column;align-items:flex-start;gap:3px;min-width:0}
|
||
/* ---- 标题行的两件 ----
|
||
⚠️ 上一版这两件横排、抢同一条 160px,所以配过一组「伸缩性相反」的规则
|
||
(.wx-title flex:1 1 auto 可压缩,.wx-lim flex:0 0 auto 不可压缩,
|
||
意思是「真溢出时宁可啃商品名,也不让那句话消失」)。
|
||
**本批改竖排之后那组 flex 规则已经全部删掉**:两件各占一整行,
|
||
「谁先被压缩」这个问题根本不存在了。
|
||
⚠️ 别再照着那套旧描述往回加 flex:1 1 auto / flex:0 0 auto ——
|
||
在 column 容器里它们管的是**高度**,加上去只会让这两行开始互相挤压。
|
||
⚠️ min-width:0 保留,配合 max-width:100%。.wx-head 现在是 column flex,
|
||
这两个 span 在交叉轴上仍会被长内容撑出去;两条一起才能保证超长商品名
|
||
在本列内触发 ellipsis,而不是把整张卡顶宽。
|
||
⚠️ 字号 15 → 16。上一版压到 15 是横排时被 160px 挤的(16.5 会当场溢出);
|
||
竖排之后标题独占整行,7 字 × 16 = 112 ≤ 160,还剩 48px ——
|
||
够微信字体滑块放大到 1.42 倍仍不触发省略号。
|
||
没直接回到 16.5 是留一档安全余量:16.5 时只剩 1.38 倍。
|
||
⚠️ ellipsis 三件套(overflow/text-overflow/white-space)保留当兜底。
|
||
现在它基本不该再触发 —— 真触发了说明字号又被谁调大了,去看上面那笔账。 */
|
||
.wx-title{max-width:100%;min-width:0;font-size:16px;font-weight:700;color:var(--ink);
|
||
line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
/* 「限领一份」。本批按用户要求移到商品名**下面独占一行**(原来并排在右侧)。
|
||
它是商品名的附注,不该和商品名一样重,所以仍是小字。
|
||
⚠️ 字号 10.5 → 11.5,和资源库 banner 的 .rlg-lim 对齐。
|
||
这是补一个真实的不一致:用户早先要求两张卡「一模一样」,但上一版
|
||
这边被 160px 逼到 10.5、那边是 11.5 —— 文案逐字相同、**字号却差一档**,
|
||
并排看得出来。竖排腾出宽度后没有理由再小一档了。
|
||
(smoke 那条断言只比对文案字符串,比不出字号差,所以它一直是绿的。)
|
||
⚠️ 文案和 .rlg-lim **必须逐字相同**,smoke 里有断言钉着。改这句就得同时改那句。
|
||
⚠️ 现在这行有整整 160px,「(每人限领一份)」8 字 × 11.5 = 92 也放得下 ——
|
||
但本批**不擅自改回长文案**:用户这次只要求挪位置,没说要改字。
|
||
⚠️ 别把这句合回 .wx-title 凑成一个字符串:合成一个字符串就只剩一个字号,
|
||
「限领」不再是商品名底下那行灰色小字,用户要的那个视觉层级整个没了。
|
||
颜色比 --ink-2(#6B615B) 再淡一档。这里写死不用变量:全站没有 --ink-3,
|
||
var(--ink-3,#…) 那种写法会让人误以为存在这么个变量。 */
|
||
/* ⚠️ 这里**没有** align-self:flex-start,是特意删掉的,别再加回来:
|
||
父级 .wx-head 已经写着 align-items:flex-start,子项上再写一遍是句空话。
|
||
变异测试把它删掉时一条断言都不红 —— 不是断言漏了,是它本来就不产生效果。
|
||
(.rlg-lim 那处一模一样,也一并删了。) */
|
||
.wx-lim{white-space:nowrap;font-size:11.5px;color:#8E827C;line-height:1.3}
|
||
/* ---- 价格行 ----
|
||
这一版「电商化」唯一新增的语义件:一个小号「到手价」+ 一个大号「¥0」。
|
||
⚠️ 只有到手价,**没有划掉的原价**。原价得编一个数字,而这是真实品牌的
|
||
真实商品,划线价属于价格宣称,编一个就是虚假标价。
|
||
「¥0」不是新承诺 —— 它就是这张卡从第一版起写着的「立即免费领取」
|
||
换成电商的排版语言再说一遍。
|
||
⚠️ <i> 必须显式 font-style:normal:浏览器默认样式会把它斜过来,
|
||
中文没有真正的斜体,浏览器只能几何倾斜,糊得厉害。
|
||
这里用 <i>/<b> 而不是两个 <span>,是为了在 HTML 里一眼能分出主次。 */
|
||
/* ⚠️ margin-top 去掉了:.wx-main 现在是 justify-content:center 的竖列,
|
||
价格和副文靠 gap:5px 拉开。留着 margin-top 会和 gap 叠加,把这一列顶偏。
|
||
这里 align-items:baseline 是**安全**的(和 .wx-head 那处相反):
|
||
这两件都是普通行盒,没有 overflow:hidden,基线是真实存在的。 */
|
||
.wx-price{display:flex;align-items:baseline;gap:5px}
|
||
.wx-price>i{font-style:normal;font-size:11.5px;color:var(--ink-2)}
|
||
.wx-price>b{font-size:26px;font-weight:800;color:var(--brand);letter-spacing:-.5px;line-height:1}
|
||
/* ⚠️ 这一行装的是「加<小名>的孕育顾问领取」,而小名那格是 maxlength="12",
|
||
整句能到 20 字上下。
|
||
所以必须是两行截断,不能沿用原来的单行省略 ——
|
||
单行会把后半截(含小名)整个吃掉,而 textContent 不受 CSS 截断影响,
|
||
测试里那条 /小汤圆/ 照样绿,屏幕上却什么都看不见。这是个静默失败。 */
|
||
/* ⚠️ margin-top 同样去掉了,理由和 .wx-price 一样:父列已经有 gap:5px。 */
|
||
.wx-sub{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;
|
||
font-size:12.5px;color:var(--ink-2);line-height:1.45;overflow:hidden}
|
||
/* ---- 第四段:通栏 CTA ----
|
||
用实心按钮而不是一个 › :这张卡要的是「点我」,不是「还有下一层」。
|
||
现在它是 .wx-card 的**直接子元素**,靠 column 容器的 stretch 铺满整卡 248px
|
||
(上一版只占右列 159px)。整卡宽的实心按钮是电商卡的标准收尾。
|
||
⚠️ 别再给它 flex:0 0 100%。那是更早一版配合 .wx-card 的 flex-wrap 用的;
|
||
在 column 容器里 flex-basis 作用于**高度**,会把这条按钮拉成整卡高。
|
||
⚠️ text-align:center 不能省:全局 button{text-align:left}(style.css:80)
|
||
会一路继承下来,不写死的话文字贴在左边,看着像一条被拉长的标签。 */
|
||
.wx-cta{margin-top:13px;text-align:center;font-size:15.5px;font-weight:800;color:#fff;
|
||
background:linear-gradient(135deg,#E86A3E,#D8452F);
|
||
border-radius:14px;padding:12px;letter-spacing:.3px;
|
||
box-shadow:0 4px 12px rgba(216,95,56,.3)}
|
||
|
||
.list-card{background:#fff;border-radius:22px;padding:0 16px;box-shadow:var(--sh)}
|
||
.li{display:flex;align-items:center;gap:13px;width:100%;padding:16px 0;border-bottom:1px solid var(--line)}
|
||
.li:last-child{border:0}
|
||
/* 列表图标已全部换成扁平描边矢量,各自给一个与底色同系的描边色 */
|
||
.li-ico{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;flex:0 0 auto}
|
||
.li-ico.y{background:#F4F0D8;color:#9A8A2E}
|
||
.li-ico.p{background:#EFE9FA;color:#7B5FD4}
|
||
.li-ico.o{background:#FBEDE3;color:#DE7443}
|
||
.li-ico.b{background:#E6EFF8;color:#4478BC}
|
||
.li-ico.r{background:#FBE9E7;color:#C33A2E}
|
||
.li-t{font-size:16.5px;font-weight:700}
|
||
.li-v{margin-left:auto;font-size:13px;color:var(--brand);font-weight:600}
|
||
.li .chev{margin-left:auto}
|
||
.li-v + .chev{margin-left:6px}
|
||
|
||
/* ============ 详情页 ============ */
|
||
.detail{
|
||
position:absolute;inset:0;z-index:80;background:var(--bg);
|
||
transform:translateX(100%);transition:transform .38s var(--ease);
|
||
display:flex;flex-direction:column;
|
||
}
|
||
.detail.show{transform:none;box-shadow:-10px 0 30px rgba(0,0,0,.1)}
|
||
.detail-bar{display:flex;align-items:center;gap:10px;padding:calc(env(safe-area-inset-top) + 14px) 18px 12px;background:rgba(248,243,239,.9);backdrop-filter:blur(14px);border-bottom:1px solid var(--line)}
|
||
.dt-back{font-size:32px;line-height:.7;color:var(--ink);width:34px}
|
||
.dt-title{font-size:17px;font-weight:800}
|
||
.dt-star{margin-left:auto;font-size:23px;color:var(--muted);transition:transform .25s var(--ease)}
|
||
.dt-star.on{color:#FFC93C}
|
||
.dt-star:active{transform:scale(1.3)}
|
||
.detail-body{flex:1;overflow-y:auto;padding:22px 22px 40px}
|
||
.detail-body::-webkit-scrollbar{display:none}
|
||
.dl-btn{flex:1;text-align:center;padding:15px;border-radius:22px;font-size:15.5px;font-weight:700;transition:transform .16s}
|
||
.dl-btn:active{transform:scale(.96)}
|
||
.dl-btn.ghost{background:#fff;color:var(--ink-2);box-shadow:var(--sh)}
|
||
.dl-btn.main{background:var(--brand);color:#fff;box-shadow:0 10px 22px rgba(244,89,60,.34)}
|
||
|
||
.dt-plain{margin-left:auto;line-height:1;color:var(--ink-2);width:30px;height:30px;display:grid;place-items:center}
|
||
.dt-plain:active{opacity:.5}
|
||
.d-sec{display:flex;align-items:center;font-size:16.5px;font-weight:800;color:var(--ink);margin:26px 0 13px}
|
||
.d-sec .sec-more{font-size:12.5px}
|
||
|
||
/* ============ 设置与服务 二级页 ============ */
|
||
.st-lead{font-size:13.5px;line-height:1.75;color:var(--ink-2);margin-bottom:4px}
|
||
.st-card{background:#fff;border-radius:22px;padding:0 16px;box-shadow:var(--sh)}
|
||
.st-card:first-child{margin-top:16px}
|
||
.st-row{display:flex;align-items:center;gap:12px;width:100%;padding:15px 0;border-bottom:1px solid var(--line);position:relative;overflow:hidden}
|
||
.st-row:last-child{border-bottom:0}
|
||
.st-rt{font-size:15.5px;font-weight:700;min-width:0}
|
||
/* 副标题挂在标题下面,em 撑成块级,行内不会把开关挤走 */
|
||
.st-rt em{display:block;font-size:12px;font-weight:500;font-style:normal;color:var(--muted);margin-top:3px;line-height:1.5}
|
||
.st-rv{margin-left:auto;font-size:12.5px;color:var(--muted);flex:0 0 auto;max-width:52%;text-align:right}
|
||
.st-row .chev{margin-left:auto;color:var(--muted)}
|
||
.st-rv + .chev{margin-left:6px}
|
||
/* 注意:不能叫 .st-txt —— 首页「今日成长脚印」的文字已经占了这个名字,
|
||
同名会把 padding 和分隔线漏到首页去,所以这里用 .st-para */
|
||
.st-para{font-size:14px;line-height:1.85;color:var(--ink-2);padding:15px 0;border-bottom:1px solid var(--line)}
|
||
.st-para:last-child{border-bottom:0}
|
||
/* 开关:轨道 40×24,圆点 18,开时右移 16px(40-18-2×3) */
|
||
.st-row.sw{cursor:pointer}
|
||
.sw-track{margin-left:auto;flex:0 0 auto;width:40px;height:24px;border-radius:12px;background:#E2DAD3;position:relative;transition:background .24s var(--ease)}
|
||
.sw-track b{position:absolute;left:3px;top:3px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.2);transition:transform .24s var(--ease)}
|
||
.st-row.sw.on .sw-track{background:var(--brand)}
|
||
.st-row.sw.on .sw-track b{transform:translateX(16px)}
|
||
/* 关于页的品牌头 */
|
||
.st-about{text-align:center;padding:14px 0 22px}
|
||
.st-logo{width:78px;height:78px;margin:0 auto 14px;border-radius:22px;background:linear-gradient(140deg,#FDE3D6,#F9C9B4);display:grid;place-items:center;box-shadow:var(--sh)}
|
||
.st-logo svg{width:46px;height:46px}
|
||
.st-appname{font-size:20px;font-weight:800;letter-spacing:-.3px}
|
||
.st-ver{font-size:12.5px;color:var(--muted);margin-top:6px}
|
||
|
||
/* ============ AI 小结详情 ============
|
||
页面节奏:深 → 浅 → 线。
|
||
① 今日卡是全页唯一的深色块,一进来眼睛就落在它上面;
|
||
② 三条建议是白卡,靠左侧分类色条区分主题;
|
||
③ 往期是一条时间轴,弱化成背景信息。
|
||
原来三段都是同一种白卡罗列,谁也不比谁重要,所以看着散。 */
|
||
.ai-body{background:linear-gradient(180deg,#FFF6F1 0%,var(--bg) 240px)}
|
||
|
||
/* ---- ① 今日卡 ---- */
|
||
.ai-today{position:relative;overflow:hidden;border-radius:26px;padding:20px 20px 6px;
|
||
background:linear-gradient(145deg,#4A3A34 0%,#6B4A3C 55%,#8A5340 100%);
|
||
box-shadow:0 18px 34px rgba(90,58,44,.3)}
|
||
/* 两团柔光,让深色底不至于死板;纯 CSS,不额外加图 */
|
||
.ai-glow{position:absolute;width:190px;height:190px;border-radius:50%;pointer-events:none;
|
||
background:radial-gradient(circle,rgba(255,166,120,.5),transparent 70%);top:-96px;right:-54px}
|
||
.ai-glow.b{width:150px;height:150px;background:radial-gradient(circle,rgba(255,255,255,.16),transparent 70%);
|
||
top:auto;right:auto;bottom:-72px;left:-40px}
|
||
.ai-t-top{position:relative;display:flex;align-items:center;gap:8px}
|
||
.ai-week{font-size:12.5px;font-weight:800;color:#FFD9C4;background:rgba(255,255,255,.14);
|
||
padding:5px 10px;border-radius:8px}
|
||
.ai-date{margin-left:auto;font-size:12px;color:rgba(255,255,255,.62)}
|
||
/* 今日状态:一枚小圆点 + 两个字,替掉原来那个撑场面的大引号 */
|
||
.ai-mood{position:relative;display:inline-flex;align-items:center;gap:6px;margin-top:16px;
|
||
font-size:12.5px;font-weight:800;color:#FFC9A8;letter-spacing:1px}
|
||
.ai-mood::before{content:"";width:7px;height:7px;border-radius:50%;background:#7BD3A0;
|
||
box-shadow:0 0 0 4px rgba(123,211,160,.22)}
|
||
.ai-hero-txt{position:relative;font-size:19px;font-weight:700;line-height:1.75;color:#fff;
|
||
margin:9px 0 0;letter-spacing:.2px}
|
||
.ai-stats{position:relative;display:flex;margin-top:18px}
|
||
.ai-st{flex:1;text-align:center;padding:14px 4px 16px;position:relative}
|
||
/* 竖分隔线用伪元素,比 border 好控制:首列不画,避免左边多一道 */
|
||
.ai-st+.ai-st::before{content:"";position:absolute;left:0;top:16px;bottom:18px;width:1px;
|
||
background:rgba(255,255,255,.16)}
|
||
.ai-st b{display:block;font-size:20px;font-weight:800;color:#fff;letter-spacing:-.3px}
|
||
.ai-st span{display:block;font-size:11.5px;color:rgba(255,255,255,.6);margin-top:5px}
|
||
/* 和昨天比的涨跌,只是补充信息,做得很轻 */
|
||
.ai-st em{display:inline-block;font-style:normal;font-size:10.5px;font-weight:700;margin-left:4px;
|
||
color:#8FDCB0;vertical-align:2px}
|
||
.ai-st em.dn{color:#FFB59B}
|
||
.ai-st em.eq{color:rgba(255,255,255,.45)}
|
||
|
||
/* ---- 段落小标题:序号 + 标题 + 一条延伸到底的细线 ---- */
|
||
.ai-sec{display:flex;align-items:center;gap:9px;margin:26px 0 13px}
|
||
.ai-sec-n{font-size:11px;font-weight:800;color:var(--brand);background:rgba(244,89,60,.1);
|
||
padding:3px 7px;border-radius:6px;letter-spacing:.5px}
|
||
.ai-sec h3{font-size:16px;font-weight:800;color:var(--ink);letter-spacing:.2px}
|
||
.ai-sec-line{flex:1;height:1px;background:linear-gradient(90deg,rgba(0,0,0,.09),transparent)}
|
||
|
||
/* ---- ② 三条建议:每张卡一个主题色 ---- */
|
||
.ai-tips{display:flex;flex-direction:column;gap:11px}
|
||
.ai-tip{position:relative;overflow:hidden;background:#fff;border-radius:18px;
|
||
padding:15px 17px 16px 19px;box-shadow:var(--sh)}
|
||
/* 左边一道竖色条,四张卡换四种颜色,扫一眼就知道在讲哪方面 */
|
||
.ai-tip::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--c)}
|
||
/* 右上角一个巨大的浅色序号,纯装饰,撑住卡片右侧的空 */
|
||
.at-n{position:absolute;top:-8px;right:10px;font-size:52px;font-weight:800;line-height:1;
|
||
color:var(--c);opacity:.09;pointer-events:none;user-select:none}
|
||
.ai-tip.c-p{--c:#F2795A}
|
||
.ai-tip.c-g{--c:#5AB98C}
|
||
.ai-tip.c-b{--c:#5E93D8}
|
||
.ai-tip.c-y{--c:#E0A63C}
|
||
.ai-tip.c-r{--c:#D9739B}
|
||
.at-cat{display:inline-block;font-size:11px;font-weight:800;color:var(--c);
|
||
background:color-mix(in srgb,var(--c) 12%,#fff);padding:4px 9px;border-radius:7px;letter-spacing:.5px}
|
||
/* color-mix 不支持的老浏览器上,上一行整条声明会被丢弃、底色变透明,
|
||
所以先垫一层带透明度的同色底作为兜底 */
|
||
@supports not (background:color-mix(in srgb,red 10%,#fff)){
|
||
.at-cat{background:rgba(0,0,0,.05)}
|
||
}
|
||
.at-head{font-size:15.5px;font-weight:800;line-height:1.6;color:var(--ink);margin:10px 0 5px;
|
||
padding-right:24px}
|
||
.at-txt{font-size:13.5px;line-height:1.75;color:var(--ink-2)}
|
||
|
||
/* ---- ③ 往期:一条竖线串起来的时间轴 ---- */
|
||
.ai-logs{position:relative;display:flex;flex-direction:column;gap:8px;padding-left:22px}
|
||
.ai-logs::before{content:"";position:absolute;left:5px;top:16px;bottom:16px;width:2px;
|
||
border-radius:2px;background:linear-gradient(180deg,#F6D8C8,rgba(246,216,200,0))}
|
||
.ai-log{position:relative;display:block;width:100%;text-align:left;background:#fff;
|
||
border-radius:16px;padding:13px 15px;box-shadow:var(--sh)}
|
||
.al-dot{position:absolute;left:-21px;top:19px;width:9px;height:9px;border-radius:50%;
|
||
background:#fff;border:2px solid #EFC7B4;transition:.2s}
|
||
/* 原来点一条会把它标成 .is-on(当前正在看的那天)。现在点了是弹窗,
|
||
看完就关,不存在「停留在某一天」,高亮改成按下去的一瞬间 */
|
||
.ai-log:active{background:#FFF6F1;box-shadow:0 8px 18px rgba(214,120,86,.16)}
|
||
.ai-log:active .al-dot{border-color:var(--brand);background:var(--brand);
|
||
box-shadow:0 0 0 4px rgba(244,89,60,.15)}
|
||
.al-date{font-size:13.5px;font-weight:700;color:var(--ink)}
|
||
.al-week{font-size:11.5px;color:var(--brand);margin-left:8px;font-weight:600}
|
||
.al-txt{display:block;font-size:12.5px;color:var(--muted);margin-top:5px;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
|
||
/* ============ 资源列表 / 资源内容 ============ */
|
||
/* ---- 试用装福利 banner ----
|
||
和「我的」页那张 .wx-card 同一件事、同一套暖色、结构也一样
|
||
(标题行 / 图文行 / 通栏 CTA 三段竖排),但仍然**不复用**它的类:
|
||
两边的尺寸账不同(图 68×60 vs 88×88、字号各小一档、页边距也不一样),
|
||
共用一个类只会逼出一堆 .detail-body .wx-card{...} 的覆盖规则。
|
||
⚠️ 两套类名各自独立,所以**改一边要记得改另一边** —— 角标裁切这个 bug
|
||
当初就是只在这边被发现、那边照抄了同样的写法又犯一次。
|
||
⚠️ 布局同 .wx-card:**竖向三段** —— .rlg-head 标题行 / .rlg-body 图文行
|
||
/ .rlg-cta 通栏按钮。所以 flex-direction 是 column,不是 row。
|
||
⚠️ 320 屏上的宽度账(**这一版重算过**):
|
||
卡内净宽 = 320 − 页边距 44(.detail-body 左右各 22)− 卡内边距 28 = 248,
|
||
和「我的」页那张卡一样宽(那边是 320 − 36 − 36)。两边数字撞在一起是巧合,
|
||
别当成一个可以共享的常量。
|
||
标题行(本批起**竖排**,跟 .wx-card 同步,两件各占一整行):
|
||
「可心柔婴儿纸巾」7 × 16 = 112 ≤ 248 ✓ 余 136px
|
||
「限领一份」 4 × 11.5 = 46 ≤ 248 ✓ 余 202px
|
||
图文行右列 = 248 − 图 68 − gap 10 = 170px:
|
||
角标「福利」2 × 10 + 内边 16 = 36 ✓
|
||
价格行「到手价」3 × 11 = 33 + gap 5 + 「¥0」19px 两个半角 ≈ 21 → 59 ✓
|
||
副文「加小汤圆的孕育顾问领取」11 × 12 = 132 ✓(且允许折两行)
|
||
CTA 通栏 248px(上一版只有 170px)。
|
||
⚠️ 为什么当初要拆成「标题行升到卡的直接子元素」这个结构:更早那一版是
|
||
左右两列、标题挤在 170px 的右列里,横排的商品名 + 限领要 218px,放不下。
|
||
标题行升上来拿到通栏 248px 才排得开。
|
||
⚠️ 本批标题行又从横排改成了竖排(跟 .wx-card 同步,理由见那边),
|
||
于是 218px 那笔账作废了 —— 但**结构不要退回去**:退回右列之后
|
||
商品名只剩 170px,和「我的」页那张的 160px 一样会被字体滑块顶爆。
|
||
⚠️ 尺度刻意比 .wx-card 小一号(图不放大到 88、字号各降一档):
|
||
那边四周是空的,这条 banner 下面紧跟着 128 条资源列表,
|
||
照搬那边的尺寸会把资源列表整个顶出首屏。 */
|
||
.rl-gift{display:flex;flex-direction:column;width:100%;text-align:left;
|
||
background:linear-gradient(135deg,#FFF4EC,#FFE2D2);
|
||
border-radius:20px;padding:12px 14px;margin:0 0 14px;box-shadow:var(--sh)}
|
||
/* ⚠️ 用逐元素的 .rl-gift.hide,不引入全局 .hide,更不用 hidden 属性:
|
||
全项目零处使用 hidden,而 .letter-card.hide / .moment.hide 这套
|
||
逐元素写法是既有惯例,跟着走。
|
||
(测试里两条都断言:既查 .hide 类,也查算出来的 display —— jsdom
|
||
自带 [hidden]{display:none},光量 display 的话用 hidden 属性
|
||
也能蒙混过关。) */
|
||
.rl-gift.hide{display:none}
|
||
/* ⚠️ 和 .wx-badge 同一个故事:上一版是 position:absolute;top:-7px 骑在卡上边缘,
|
||
被 .rl-gift 身上 .ripple 的 overflow:hidden(style.css:135)裁掉一半,
|
||
「福利」两个字只露出下半截。这是**比 .wx-badge 更早**就存在的老问题。
|
||
改成流内标签之后不可能再被裁。别改回绝对定位。 */
|
||
.rlg-badge{align-self:flex-start;font-size:10px;font-weight:700;
|
||
color:#fff;background:var(--brand);border-radius:8px;padding:2px 8px;
|
||
letter-spacing:.5px;box-shadow:0 2px 6px rgba(216,95,56,.28)}
|
||
/* ---- 第一段:标题行 ----
|
||
⚠️ align-items 用 flex-end 不用 baseline,理由和 .wx-head 一模一样:
|
||
.rlg-title 带 overflow:hidden,按规范它没有可用基线,浏览器会拿
|
||
border box 底边合成一条,「(每人限领一份)」会被顶成上标。
|
||
改这条之前先读 .wx-head 上面那段注释。
|
||
|
||
==== 本批同样改成竖排,上面那段 flex-end 的理由随横排一起作废 ====
|
||
这一张其实排得下(248px 通栏,横排余 30px),改它纯粹是为了和「我的」页那张
|
||
保持一致 —— 用户早先要求两张卡「一模一样」,一张横排一张竖排并排看就是两个东西。
|
||
竖排之后也不再有「没有可用基线」那个坑:两件不在同一行,压根不需要对基线。
|
||
⚠️ 别只改一边。这两张卡的标题行是**成对**的,动一张就得动另一张。 */
|
||
.rlg-head{display:flex;flex-direction:column;align-items:flex-start;gap:3px;min-width:0}
|
||
/* ---- 第二段:图文行 ---- */
|
||
.rlg-body{display:flex;align-items:center;gap:10px;margin-top:9px}
|
||
/* 同时管占位的 <svg> 和以后换上的 <img>,换真图时这段不用动 */
|
||
.rlg-fig{flex:0 0 auto;width:68px;height:60px;display:block;border-radius:12px;
|
||
object-fit:cover;background:#FFF9F5}
|
||
/* 图文行的右列:竖向,默认 stretch,所以价格行/副文自动满列宽;
|
||
只有角标 align-self:flex-start 缩成胶囊。
|
||
⚠️ 标题和 CTA 已经不在这一列里了(升到 .rlg-head 和卡的直接子元素)。 */
|
||
.rlg-main{flex:1;min-width:0;display:flex;flex-direction:column}
|
||
/* ⚠️ 竖排之后两件不再抢同一条宽度,「谁先被压缩」这个问题整个消失了。
|
||
ellipsis 三件套留着当兜底,正常不该触发。字号 15 → 16,和 .wx-title 同步。 */
|
||
.rlg-title{max-width:100%;min-width:0;font-size:16px;font-weight:700;color:var(--ink);
|
||
line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
/* 「限领一份」,和「我的」页 .wx-lim 同一句、同样是小字、
|
||
本批起同样排在商品名**下面独占一行**(原来在标题右侧)。
|
||
⚠️ 这两条规则现在字号也一致了(都 11.5)。上一版这边 11.5、那边被挤到 10.5,
|
||
文案逐字相同但字号差一档 —— 那种「几乎一样」比明显不同更难发现。 */
|
||
/* 同 .wx-lim:不写 align-self,父级 .rlg-head 的 align-items:flex-start 已经管了。 */
|
||
.rlg-lim{white-space:nowrap;font-size:11.5px;color:#8E827C;line-height:1.3}
|
||
/* 价格行,和 .wx-price 同构、字号各降一档。同样只有到手价、没有编出来的划线价。
|
||
⚠️ <i> 得显式 font-style:normal,否则浏览器默认样式把中文几何倾斜,糊得厉害。 */
|
||
.rlg-price{display:flex;align-items:baseline;gap:5px;margin-top:6px}
|
||
.rlg-price>i{font-style:normal;font-size:11px;color:var(--ink-2)}
|
||
.rlg-price>b{font-size:19px;font-weight:800;color:var(--brand);letter-spacing:-.5px;line-height:1}
|
||
/* 副标题只讲「怎么领」,**不再兼当 CTA** —— 下面有真按钮了。
|
||
⚠️ 从单行省略改成了两行截断。这行现在由 syncBabyWords() 写入
|
||
「加<小名>的孕育顾问领取」,小名 maxlength="12",整句能到 20 字 ≈ 240px,
|
||
而右列只有 170px —— 再用 nowrap+ellipsis 会把「领取」连同小名一起吃掉,
|
||
偏偏 textContent 查得到,测试还是绿的。和 .wx-sub 栽的是同一个坑。 */
|
||
.rlg-sub{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;
|
||
font-size:12px;color:var(--ink-2);margin-top:5px;line-height:1.45;overflow:hidden}
|
||
/* ---- 第三段:通栏 CTA ----
|
||
⚠️ 和 .wx-cta 同款但字号小一号(这条 banner 整体比「我的」页那张卡矮)。
|
||
⚠️ 现在是 .rl-gift 的直接子元素,靠 column 容器的 stretch 铺满 248px。
|
||
别给它 flex:0 0 100% —— 在 column 容器里 flex-basis 作用于**高度**。
|
||
⚠️ 必须 text-align:center:全局 button{text-align:left} 会继承下来,
|
||
而且 .rl-gift 自己还写了一遍 text-align:left,不覆盖就贴左边。 */
|
||
.rlg-cta{margin-top:11px;text-align:center;font-size:14px;font-weight:700;color:#fff;
|
||
background:var(--brand);border-radius:12px;padding:9px 10px;
|
||
box-shadow:0 4px 10px rgba(216,95,56,.24)}
|
||
|
||
.rl-lead{font-size:13px;color:var(--ink-2);margin:0 0 14px}
|
||
.rl-lead b{color:var(--brand);font-size:15px}
|
||
.res-list{display:flex;flex-direction:column;gap:11px}
|
||
.res-item{display:flex;align-items:center;gap:12px;width:100%;text-align:left;background:#fff;border-radius:18px;padding:11px;box-shadow:var(--sh)}
|
||
.ri-thumb{flex:0 0 auto;width:62px;height:62px;border-radius:14px;display:grid;place-items:center;overflow:hidden}
|
||
.ri-thumb img{width:74%;height:74%;object-fit:contain;display:block}
|
||
.ri-thumb.o{background:#FDEBE2}.ri-thumb.g{background:#E8F1E2}
|
||
.ri-thumb.p{background:#EFE8F6}.ri-thumb.b{background:#E4EDF9}
|
||
.ri-body{min-width:0;flex:1}
|
||
.ri-title{display:block;font-size:15px;font-weight:800;color:var(--ink);line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
.ri-desc{display:block;font-size:12px;color:var(--ink-2);margin:4px 0 7px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||
.ri-row{display:flex;align-items:center;gap:6px}
|
||
.ri-row em{font-style:normal;font-size:11px;line-height:1}
|
||
/* 状态标顶到最右(原来 margin-left:auto 挂在「8 分钟读完」上)。
|
||
⚠️ 2026-09-19:这一格原来还有「已领 ✓」这个状态(.pill-got),
|
||
9.19 需求取消「已领」概念后只剩「免费」,相关样式一并删除。 */
|
||
.pill-free{margin-left:auto}
|
||
.pill-free{background:rgba(110,154,86,.14);color:var(--green);font-weight:700;padding:3.5px 7px;border-radius:6px}
|
||
.ri-cat{background:rgba(244,89,60,.1);color:var(--brand);font-weight:700;padding:3.5px 7px;border-radius:6px}
|
||
/* 适用孕周,顶掉了原来的「几分钟读完」。不给底色 —— 左边已经有一个实心分类标,
|
||
再来一个就成了两个胶囊抢注意力,而它只是补充说明。
|
||
nowrap:「孕24-28周」这种断在中间比溢出还难看 */
|
||
.ri-ga{color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
|
||
/* ---- 已领的资源:整块已删除(2026-09-19) ----
|
||
.pill-got / .ri-got-tick / .res-item.is-got / .chip-got 都随「已领」概念一起删了
|
||
(9.19 需求:资料由顾问在微信里直接发,H5 不再有「立即领取即到手」这个动作)。
|
||
⚠️ .ri-thumb 的 position:relative 曾经挂在这一块里给角标定位用 —— 现在没有角标了,
|
||
也就不需要;若以后要往里放绝对定位元素,记得自己加回来。 */
|
||
|
||
.res-list.slim .ri-thumb{width:50px;height:50px;border-radius:12px}
|
||
.res-list.slim .ri-title{font-size:14px}
|
||
|
||
.rd-cover{height:168px;border-radius:22px;display:grid;place-items:center;background:#FDEBE2;margin-bottom:16px;overflow:hidden}
|
||
.rd-cover.o{background:linear-gradient(135deg,#FDEEE5,#F9DCCC)}
|
||
.rd-cover.g{background:linear-gradient(135deg,#ECF4E6,#DBE9D0)}
|
||
.rd-cover.p{background:linear-gradient(135deg,#F2EBF8,#E4D9F1)}
|
||
.rd-cover.b{background:linear-gradient(135deg,#E8F0FA,#D6E4F5)}
|
||
.rd-cover img{width:132px;height:132px;object-fit:contain;display:block;filter:drop-shadow(0 8px 18px rgba(140,90,70,.2))}
|
||
.rd-cat{display:inline-block;font-size:11.5px;font-weight:700;color:var(--brand);background:rgba(244,89,60,.1);padding:5px 11px;border-radius:8px}
|
||
.rd-title{font-size:24px;font-weight:800;letter-spacing:-.5px;margin:11px 0 7px;line-height:1.3}
|
||
.rd-desc{font-size:13.5px;color:var(--ink-2);margin:0}
|
||
.rd-meta{display:flex;flex-wrap:wrap;gap:7px;margin:14px 0 6px;padding-bottom:18px;border-bottom:1px solid var(--line)}
|
||
.rd-meta span{font-size:11.5px;color:var(--muted);background:#fff;border:1px solid var(--line);padding:5px 10px;border-radius:8px}
|
||
.rd-body h4{font-size:16px;font-weight:800;color:var(--ink);margin:22px 0 9px}
|
||
.rd-body p{font-size:15px;line-height:1.95;color:#4A403A;margin:0}
|
||
/* 「收藏 / 立即领取」吸底浮动:它是 .detail 的直接子元素(不在滚动区里),
|
||
所以正文怎么滑,这条都停在底部。不用 position:fixed —— .detail 自身带
|
||
transform,fixed 会以它为包含块,反而错位。 */
|
||
.rd-cta{
|
||
flex:0 0 auto;display:flex;gap:11px;position:relative;
|
||
padding:12px 22px calc(env(safe-area-inset-bottom) + 14px);
|
||
background:rgba(248,243,239,.94);backdrop-filter:blur(14px);
|
||
border-top:1px solid var(--line);
|
||
}
|
||
/* 上沿渐隐,正文滑到底时不会被硬生生切断 */
|
||
.rd-cta::before{
|
||
content:"";position:absolute;left:0;right:0;bottom:100%;height:22px;pointer-events:none;
|
||
background:linear-gradient(rgba(248,243,239,0),rgba(248,243,239,.94));
|
||
}
|
||
/* ⚠️ 这里原来有一条 .rd-cta .dl-btn.main.got(领过之后按钮变绿)——
|
||
9.19 需求取消「已领」概念后按钮只有一种状态,该条删除。 */
|
||
/* 吸底条已占掉底部空间,滚动区不用再留 40px */
|
||
#detailRes .detail-body,#detailPoster .detail-body{padding-bottom:18px}
|
||
/* 档案预览有三个按钮,挤一点、字小一号 */
|
||
.pst-cta .dl-btn{padding-left:0;padding-right:0;font-size:14px}
|
||
|
||
/* ---- 百度网盘领取弹窗:整块已删除(2026-09-19) ----
|
||
.pan-box / .pan-row / .pan-k / .pan-v / .pan-note 随 #modalPan 一起删
|
||
(9.19 需求:资料由顾问在微信里直接发,H5 不再发网盘链接与提取码)。
|
||
要恢复「H5 自己发链接」,等于把「解锁」概念加回来 —— 先回问需求方。 */
|
||
|
||
/* ---- 加企业微信顾问弹窗 ----
|
||
紧挨着上面的网盘弹窗放:这两个弹窗是同一条领取动线的前后两步
|
||
(先扫码换码,再拿链接)。隔开几百行的话,改动线文案时几乎必然只改到一头。 */
|
||
.wx-qr-box{margin-top:16px;text-align:center}
|
||
/* 这条挂在元素本身(原占位的 <svg>、现在这张真图 <img> 都吃):换图时一个字都不用动。
|
||
⚠️ 别改成 .wx-qr img 或 svg.wx-qr —— 那样一换成 <img> 尺寸就全丢。 */
|
||
.wx-qr{display:block;width:168px;height:168px;margin:0 auto;border-radius:14px;background:#fff}
|
||
.wx-qr-cap{font-size:12px;color:var(--muted);margin-top:10px}
|
||
/* ⚠️ 这里原来有 .wx-code(兑换码输入框)与 .wx-code.is-err(码错标红)——
|
||
9.19 需求删掉输入框后一并删除。 */
|
||
|
||
/* ⚠️ 2026-09-19(9.19 需求 1.2):这里原来是 .wx-err(兑换码红字)以及
|
||
is-done / is-gift / is-gate 三模式的收起规则(把 .wx-form 与 #wxOk 藏起来)。
|
||
兑换码输入框和两颗按钮整个删掉之后,这些规则没有对应元素了,一并删除。
|
||
弹窗现在是单态(只剩标题 + 引导语 + 二维码),唯一出口是右上角 .modal-x。 */
|
||
|
||
/* ============ 记一下 弹层 ============ */
|
||
.scrim{position:absolute;inset:0;background:rgba(50,30,22,.42);backdrop-filter:blur(2px);opacity:0;visibility:hidden;transition:opacity .32s,visibility .32s;z-index:90}
|
||
.scrim.show{opacity:1;visibility:visible}
|
||
.sheet{
|
||
position:absolute;left:0;right:0;bottom:0;z-index:95;max-height:92%;
|
||
background:#FAF5F1;border-radius:28px 28px 0 0;
|
||
display:flex;flex-direction:column;
|
||
transform:translateY(100%);transition:transform .42s var(--ease);
|
||
box-shadow:0 -10px 40px rgba(90,50,35,.2);
|
||
}
|
||
.sheet.show{transform:none}
|
||
.sheet.dragging{transition:none}
|
||
.sheet-grip{padding:10px 0 4px;display:grid;place-items:center;cursor:grab;touch-action:none}
|
||
.sheet-grip span{width:42px;height:5px;border-radius:3px;background:#DCD2CA}
|
||
.sheet-head{display:flex;align-items:flex-start;justify-content:space-between;padding:8px 22px 14px}
|
||
.sheet-head h2{font-size:26px;font-weight:800;letter-spacing:-.5px}
|
||
.sheet-head p{font-size:13px;color:var(--ink-2);margin-top:8px}
|
||
.sheet-close{width:38px;height:38px;border-radius:50%;background:#EEE7E1;display:grid;place-items:center;font-size:15px;color:var(--ink-2);flex:0 0 auto}
|
||
.sheet-close:active{transform:scale(.9)}
|
||
.sheet-scroll{flex:1;overflow-y:auto;padding:0 18px 8px}
|
||
.sheet-scroll::-webkit-scrollbar{display:none}
|
||
/* ⚠️ 临时隐藏开关(2026-09-22):「记一下」弹层里的「今天已使用」快捷区 + 日期/今天已记 那行
|
||
**功能尚未实现**(数据是写死的演示值),产品要求先整体隐藏、代码保留。
|
||
用法:在 index.html 对应元素上挂 .tbd-hide。
|
||
恢复:去掉 index.html 里那三处 .tbd-hide 即可(js/app.js 的 dedupeApps 会自动重新生效)。 */
|
||
.tbd-hide{display:none!important}
|
||
|
||
/* 「今日心情」已删除,只剩 3 个工具,所以是 3 列 */
|
||
.quick-row{display:grid;grid-template-columns:repeat(3,1fr);gap:9px}
|
||
.quick{border-radius:17px;padding:13px 8px;text-align:center;transition:transform .16s}
|
||
.quick:active{transform:scale(.95)}
|
||
.quick.q1{background:#FCE4DA}.quick.q2{background:#FBDDD2}.quick.q3{background:#FCE2DE}
|
||
.q-ico{display:block;width:34px;height:auto;margin:0 auto 7px;object-fit:contain}
|
||
.q-t{display:block;font-size:14px;font-weight:800}
|
||
.q-v{display:block;font-size:12.5px;font-weight:700;color:var(--brand);margin-top:4px}
|
||
.apps-head{display:flex;align-items:center;font-size:15.5px;font-weight:700;color:var(--ink-2);margin:22px 4px 14px}
|
||
.apps-head.first{margin-top:2px}
|
||
.apps-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px 8px}
|
||
.app{display:flex;flex-direction:column;align-items:center;gap:8px;font-size:12.5px;font-weight:600;color:var(--ink-2);transition:transform .16s}
|
||
.app:active{transform:scale(.9)}
|
||
/* 16 宫格磁贴:整块(含圆角底色 + 3D 图标)直接取自设计稿 */
|
||
.a-ico{width:54px;height:54px;display:block;object-fit:contain}
|
||
|
||
|
||
/* ============ 搜索层 ============ */
|
||
.search-layer{position:absolute;inset:0;z-index:85;background:var(--bg);opacity:0;visibility:hidden;transform:translateY(-8px);transition:opacity .28s var(--ease),visibility .28s var(--ease),transform .28s var(--ease)}
|
||
.search-layer.show{opacity:1;visibility:visible;transform:none}
|
||
.sl-bar{display:flex;align-items:center;gap:12px;padding:calc(env(safe-area-inset-top) + 16px) 18px 14px}
|
||
.sl-input{flex:1;display:flex;align-items:center;gap:9px;background:#fff;border-radius:20px;padding:11px 15px;box-shadow:var(--sh)}
|
||
.sl-input input{flex:1;border:0;outline:0;font:inherit;font-size:15px;background:none}
|
||
.sl-cancel{font-size:15px;color:var(--brand);font-weight:600}
|
||
.sl-body{padding:8px 18px}
|
||
.sl-sec{font-size:14px;font-weight:700;color:var(--ink-2);margin:18px 2px 12px}
|
||
.sl-hot .hot{display:flex;align-items:center;gap:12px;width:100%;padding:13px 2px;font-size:15px;border-bottom:1px solid var(--line)}
|
||
.sl-hot .hot i{width:20px;height:20px;border-radius:6px;background:#F0E8E2;color:var(--muted);font-style:normal;font-size:12px;font-weight:700;display:grid;place-items:center}
|
||
.sl-hot .hot:nth-child(1) i{background:var(--brand);color:#fff}
|
||
.sl-hot .hot:nth-child(2) i{background:#F79274;color:#fff}
|
||
.sl-hot .hot:nth-child(3) i{background:#F9B9A5;color:#fff}
|
||
|
||
/* ============ 底部导航 ============ */
|
||
/* 设计稿的导航是一枚「悬浮药丸」(x60..791 / y1902..1988 of 857 → 左30 右32 高43.5)。
|
||
药丸形态与位置保持设计稿,但图标与文字按可读性放大:
|
||
图标 24px · 文字 12.5px · 中心圆钮 44px,药丸高度相应提到 58px。 */
|
||
.tabbar{
|
||
position:absolute;left:26px;right:26px;bottom:calc(14px + env(safe-area-inset-bottom));z-index:60;
|
||
height:58px;border-radius:29px;
|
||
display:flex;align-items:center;padding:0 4px;
|
||
background:rgba(252,249,247,.95);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
|
||
box-shadow:0 10px 30px rgba(150,90,70,.16),0 2px 8px rgba(150,90,70,.08);
|
||
}
|
||
.tab{position:relative;flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;height:100%;color:#A99D95;transition:color .22s}
|
||
.tab.is-active{color:var(--brand)}
|
||
/* 底部导航图标:设计稿原图转成蒙版,用 currentColor 染色,
|
||
未选中 #B3A79F / 选中 var(--brand),形状与设计稿逐像素一致 */
|
||
.t-ico{width:24px;height:24px;display:block;position:relative;transition:transform .28s var(--ease);
|
||
background-color:currentColor;
|
||
-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
|
||
-webkit-mask-position:center;mask-position:center;
|
||
-webkit-mask-size:contain;mask-size:contain}
|
||
.t-ico.ic-home{-webkit-mask-image:url(assets/img/1afd85e578dd.png);mask-image:url(assets/img/1afd85e578dd.png)}
|
||
.t-ico.ic-archive{-webkit-mask-image:url(assets/img/fa7b793b47e8.png);mask-image:url(assets/img/fa7b793b47e8.png)}
|
||
.t-ico.ic-letter{-webkit-mask-image:url(assets/img/949338312a1f.png);mask-image:url(assets/img/949338312a1f.png)}
|
||
/* ⚠️ 2026-09-19(9.19 需求第 2 条):底 tab 从「兜爸心选」改回「宝宝来信」,
|
||
用的是上面 .ic-letter(图标资源一直在,没删过)。原来这条 .ic-shop(购物袋图标)
|
||
已随改名删除 —— 商城入口仍在「我的」页服务卡与首页商城主卡上。
|
||
图标源文件 assets/img/b3253e3c7a83.png 保留在仓库里(不引用的二进制无害),
|
||
哪天要再挂一枚商城 tab,把这条规则抄回来即可。 */
|
||
.t-ico.ic-me{-webkit-mask-image:url(assets/img/0ebc7631fea4.png);mask-image:url(assets/img/0ebc7631fea4.png)}
|
||
.tab.is-active .t-ico{transform:translateY(-2px) scale(1.06)}
|
||
/* nowrap:最长的那条是「兜爸心选」(原「宝宝来信」,同为四个汉字),12.5px ≈ 50px,
|
||
320px 视口下每格 tab ≈ 64px,塞得下。但字号一旦被系统放大就会折行,
|
||
而 tab 是固定高度的,折了会把图标顶出去,所以宁可让它溢出也不折。 */
|
||
.t-txt{font-size:12.5px;font-weight:600;line-height:1.1;letter-spacing:.2px;white-space:nowrap}
|
||
/* 角标移到 .tab 上定位——.t-ico 现在是 mask 元素,子元素会被一并遮罩 */
|
||
.t-badge{display:none;position:absolute;top:9px;left:calc(50% + 8px);width:9px;height:9px;background:#FF3B30;border-radius:50%;border:1.5px solid #FCF9F7}
|
||
.t-badge.show{display:block}
|
||
.tab-fab{position:relative}
|
||
/* 「记一下」中心按钮:整枚圆钮直接取自设计稿像素。
|
||
设计稿中它并不「凸出」药丸,而是与其它图标同处一行、只是更大。 */
|
||
.fab{
|
||
flex:0 0 auto;width:38px;height:38px;border-radius:50%;
|
||
display:grid;place-items:center;
|
||
box-shadow:0 6px 16px rgba(244,89,60,.42);
|
||
transition:transform .3s var(--ease);
|
||
}
|
||
.fab img{width:100%;height:100%;display:block;border-radius:50%;object-fit:cover}
|
||
.tab-fab .t-txt{color:var(--brand)}
|
||
.tab-fab:active .fab{transform:scale(.9) rotate(90deg)}
|
||
/* ⚠️ 这条以前写作 `.sheet.show ~ .tabbar .fab`。本批把 <nav class="tabbar"> 移到了
|
||
.phone 最前面(底部 tab 要尽早渲染,见 index.html 里 nav 上方那段),
|
||
而通用兄弟选择器 `~` 只能向**后**选 —— nav 排到 .sheet 前面之后那条规则
|
||
一次都不会再命中,圆钮就再也不转了。改挂在父级状态类上,与文档顺序无关。
|
||
.sheet-open 由 openSheet/closeSheet 和 .sheet 的 .show 成对切(js/app.js)。 */
|
||
.phone.sheet-open .tabbar .fab{transform:rotate(135deg)}
|
||
|
||
/* ============ 通用弹窗(往期小结 / 企业微信 / 我的资料) ============
|
||
z-index 要高于 detail(80)、search(85)、scrim(90)、sheet(95),
|
||
弹窗要能盖在这些层之上。 */
|
||
.modal-scrim{
|
||
position:absolute;inset:0;z-index:120;background:rgba(50,30,22,.46);backdrop-filter:blur(3px);
|
||
opacity:0;visibility:hidden;transition:opacity .3s,visibility .3s;
|
||
}
|
||
.modal-scrim.show{opacity:1;visibility:visible}
|
||
.modal{
|
||
position:absolute;left:0;right:0;bottom:0;z-index:125;
|
||
background:#FAF5F1;border-radius:28px 28px 0 0;
|
||
padding:22px 22px calc(20px + env(safe-area-inset-bottom));
|
||
box-shadow:0 -10px 40px rgba(90,50,35,.22);
|
||
/* 和 .sheet 一样只靠 transform 移出屏幕,不用 visibility——
|
||
否则 visibility 会打断 transform 过渡,弹窗会「跳」出来 */
|
||
transform:translateY(102%);transition:transform .4s var(--ease);
|
||
max-height:92%;overflow-y:auto;
|
||
}
|
||
.modal::-webkit-scrollbar{display:none}
|
||
.modal.show{transform:none}
|
||
.modal-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
|
||
.modal-head h3{font-size:20px;font-weight:800;letter-spacing:-.3px}
|
||
.modal-x{width:34px;height:34px;border-radius:50%;background:#EEE7E1;display:grid;place-items:center;color:var(--ink-2);flex:0 0 auto}
|
||
.modal-x:active{transform:scale(.9)}
|
||
|
||
/* ---- 往期小结弹窗 ----
|
||
叉挪到内容末尾、居中放大一点:这一屏是一路往下读完的,
|
||
手指最后停在底部,关闭按钮就该在那儿等着 */
|
||
.modal-x-btm{width:44px;height:44px;margin:24px auto 2px;background:#F3ECE6}
|
||
.alog-head{display:flex;align-items:center;gap:9px}
|
||
.alog-week{font-size:12px;font-weight:800;color:var(--brand);background:rgba(244,89,60,.1);border-radius:9px;padding:4px 9px}
|
||
.alog-mood{font-size:12px;font-weight:700;color:var(--ink-2);background:#F3ECE6;border-radius:9px;padding:4px 9px}
|
||
.alog-date{font-size:21px;font-weight:800;letter-spacing:-.3px;margin:12px 0 0}
|
||
.alog-txt{font-size:14.5px;color:var(--ink-2);line-height:1.8;margin:9px 0 0}
|
||
/* .alog-tips 已删(往期不再铺 1/2/3 建议卡),这里的 margin 跟着删。
|
||
.ai-stats 原本长在深色今日卡里,一整套都是白字。搬到浅底弹窗上得翻过来,
|
||
但只能在 .alog-stats 这一层改 —— 今日卡还在用原来那套。
|
||
上边距 14 → 18:它现在是弹窗里最后一块内容,前后都得撑开一点才不局促 */
|
||
.alog-stats{margin-top:18px;background:#FAF5F1;border-radius:18px;padding:2px 0}
|
||
.alog-stats .ai-st+.ai-st::before{background:rgba(120,90,70,.14)}
|
||
.alog-stats .ai-st b{color:var(--ink)}
|
||
.alog-stats .ai-st span{color:var(--muted)}
|
||
.alog-stats .ai-st em{color:#3E9B69}
|
||
.alog-stats .ai-st em.dn{color:#D9603F}
|
||
.alog-stats .ai-st em.eq{color:var(--muted)}
|
||
.modal-lead{font-size:13px;color:var(--ink-2);margin-top:8px;line-height:1.6}
|
||
.modal-lead b{color:var(--brand)}
|
||
/* ⚠️ 这里原来是 .modal-lead .lead-hi(给「全部解锁」四个字加重的 <em>)——
|
||
setLead() 已随三模式删除,该样式一并删除。 */
|
||
|
||
|
||
/* 输入框:必须显式给 font-family,否则 textarea/input 会退回成系统等宽字体 */
|
||
.fld input{
|
||
font-family:inherit;font-size:15px;color:var(--ink);background:#fff;
|
||
border:1.5px solid #EBE1D9;border-radius:16px;width:100%;
|
||
transition:border-color .2s,box-shadow .2s;-webkit-appearance:none;appearance:none;
|
||
}
|
||
.fld input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(244,89,60,.12)}
|
||
.fld{display:block;margin-top:14px}
|
||
.fld>span{display:block;font-size:12.5px;font-weight:700;color:var(--ink-2);margin-bottom:7px}
|
||
.fld input{padding:13px 15px;min-height:50px} /* 统一输入框高度:iOS 的 date 控件原生偏矮,与文本框对齐 */
|
||
.fld-row{display:flex;gap:12px}
|
||
.fld-row .fld{flex:1}
|
||
/* 没填预产期时孕周/额外天数不可编辑:置灰 + 禁用光标,一眼看出得先填上面那格 */
|
||
.fld input:disabled{background:#F0E9E3;color:#B4A79C;-webkit-text-fill-color:#B4A79C;
|
||
border-color:transparent;cursor:not-allowed;opacity:1}
|
||
.fld-hint{font-size:12px;color:var(--muted);margin-top:7px;line-height:1.5}
|
||
/* 性别三选一。用 button 而不是 radio:和弹窗里其它控件的圆角风格统一 */
|
||
.pick-row{display:flex;gap:9px}
|
||
/* 全局 button 被重置成了 text-align:left,这里得显式居中,
|
||
否则「还不知道 / 男孩 / 女孩」都贴在按钮左边 */
|
||
.pick{flex:1;padding:12px 4px;border-radius:15px;background:#fff;font-size:14px;font-weight:700;
|
||
text-align:center;color:var(--ink-2);box-shadow:inset 0 0 0 1.5px var(--line);transition:transform .16s,color .16s,box-shadow .16s}
|
||
.pick:active{transform:scale(.96)}
|
||
.pick.is-active{color:var(--brand);background:#FDECE7;box-shadow:inset 0 0 0 1.8px var(--brand)}
|
||
.modal-foot{display:flex;align-items:center;gap:10px;margin-top:20px}
|
||
.modal-foot .dl-btn{padding:14px}
|
||
|
||
/* ---- 我的资料 · 换头像 ---- */
|
||
.av-pick{text-align:center;padding:20px 0 6px}
|
||
.av-big{width:92px;height:92px;border-radius:50%;margin:0 auto;display:grid;place-items:center;position:relative;
|
||
background:var(--grad);color:#fff;border:3px solid #fff;box-shadow:var(--sh);transition:transform .18s var(--ease)}
|
||
.av-big:active{transform:scale(.94)}
|
||
.av-big>svg{width:50px;height:50px}
|
||
.av-big img{display:none;position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:50%}
|
||
.av-big.has-img img{display:block}
|
||
.av-big.has-img>svg{visibility:hidden}
|
||
.av-cam{position:absolute;right:-2px;bottom:-2px;width:30px;height:30px;border-radius:50%;background:#fff;color:var(--brand);display:grid;place-items:center;box-shadow:0 3px 10px rgba(0,0,0,.18)}
|
||
/* file input 不能 display:none —— 部分安卓 WebView 里隐藏元素的 .click() 不生效,
|
||
所以留在流里但压成 0 尺寸、完全透明 */
|
||
.av-file{position:absolute;width:0;height:0;opacity:0;overflow:hidden;pointer-events:none}
|
||
.av-tip{font-size:12px;color:var(--muted);margin-top:13px}
|
||
/* ⚠️ 「我的资料」这张弹窗本批并进了原「编辑孕期信息」的五个字段
|
||
(小名 / 性别 / 预产期 / 孕周 / 天数),一下长了约 276px。
|
||
.modal 是 max-height:92% + overflow-y:auto,撑爆不会破版 —— 但会把
|
||
「保存」按钮推到折线以下,用户得先滚一下才够得着,那已经是体验问题。
|
||
算下来最窄的 iPhone SE(667 × 92% = 613px)刚好贴线,所以这里把
|
||
**只有这张弹窗**的大头像从 92px 收到 76px,头像块整体省 ~26px。
|
||
收的是头像不是字段:头像在这张弹窗里是配角,92 和 76 都够点;
|
||
而任何一个字段的高度都直接关系到能不能填。
|
||
⚠️ 用 #modalProfile 前缀限定,别改全局 .av-big —— 那条别处也在用。
|
||
⚠️ 图片是 inset:0 铺满的,跟着容器缩,不用另外改 img。 */
|
||
#modalProfile .av-pick{padding:12px 0 4px}
|
||
#modalProfile .av-big{width:76px;height:76px}
|
||
#modalProfile .av-big>svg{width:42px;height:42px}
|
||
#modalProfile .av-tip{margin-top:10px}
|
||
|
||
/* ============ Toast ============ */
|
||
.toast{
|
||
position:absolute;left:50%;bottom:120px;z-index:200;transform:translate(-50%,14px);
|
||
background:rgba(40,26,20,.9);color:#fff;font-size:14px;font-weight:600;
|
||
padding:12px 20px;border-radius:22px;backdrop-filter:blur(10px);
|
||
opacity:0;visibility:hidden;transition:opacity .3s var(--ease),visibility .3s var(--ease);max-width:78%;text-align:center;
|
||
}
|
||
.toast.show{opacity:1;visibility:visible;transform:translate(-50%,0)}
|
||
|
||
/* 数字跳动 */
|
||
.bump{animation:bump .35s var(--ease)}
|
||
@keyframes bump{0%{transform:scale(1)}45%{transform:scale(1.32)}100%{transform:scale(1)}}
|
||
|
||
|
||
/* 弹层「全部孕期工具」:无 logo 应用的字母兜底块(与 .a-ico 同尺寸) */
|
||
.apps-grid .a-ico-letter{display:grid;place-items:center;width:100%;aspect-ratio:1;border-radius:22px;color:#fff;font-size:22px;font-weight:800}
|
||
|
||
/* 弹层宫格限 4 行 × 4 列:超出在宫格内部滚动(不撑长弹层)。
|
||
行高 minmax(92px,auto):图标54 + 间距8 + 两行名称 ≈ 92,行行等高对齐;
|
||
4行 × 92 + 3 × 行距16 = 416px。 */
|
||
#appsGrid{grid-auto-rows:minmax(92px,auto);max-height:416px;overflow-y:auto;-webkit-overflow-scrolling:touch;padding-right:4px;scrollbar-width:thin;scrollbar-color:#E0CFC5 transparent}
|
||
#appsGrid::-webkit-scrollbar{width:4px}
|
||
#appsGrid::-webkit-scrollbar-thumb{background:#E0CFC5;border-radius:2px}
|
||
#appsGrid::-webkit-scrollbar-track{background:transparent}
|
||
|
||
/* 预产期 date 输入的空值占位(原生 date 不支持 placeholder) */
|
||
.fld-date .due-box{position:relative;display:block}
|
||
/* 占位锚定输入框本身并垂直居中 —— 各内核 date 输入框高度不一,锚 label 底部会错位 */
|
||
.fld-date .date-ph{position:absolute;left:16px;top:50%;transform:translateY(-50%);font-size:14px;color:#C9B7AC;pointer-events:none;display:block;line-height:1}
|
||
/* 空值时隐藏原生提示(Chrome 会画 mm/dd/yyyy,与占位叠字):文字透明即隐 */
|
||
.fld-date input.due-empty{color:transparent;-webkit-text-fill-color:transparent}
|
||
|
||
/* 「关于妈妈盒子」页底部版本号 */
|
||
.about-ver{margin-top:24px;padding-bottom:34px;text-align:center;color:#C9BFB8;font-size:11px;letter-spacing:.5px}
|
||
|
||
/* ---- 身份未就绪提示(2026-09-20)----
|
||
宿主没注入 openid 时显示(见 index.html 里那段注释)。绝对定位在 .phone 顶部,
|
||
z-index 高于 tabbar(60)、低于 modal(120+),避免盖住弹窗。 */
|
||
.id-notice{
|
||
position:absolute;left:26px;right:26px;top:calc(10px + env(safe-area-inset-top));z-index:66;
|
||
display:flex;align-items:center;gap:8px;padding:9px 12px;border-radius:14px;
|
||
background:rgba(255,246,232,.97);border:1px solid #F2D8AE;color:#8A5A18;
|
||
box-shadow:0 6px 18px rgba(150,110,60,.16);font-size:12.5px;line-height:1.3;
|
||
}
|
||
.id-notice.hide{display:none}
|
||
.idn-ico{
|
||
flex:0 0 auto;width:18px;height:18px;border-radius:50%;background:#E8A33D;color:#fff;
|
||
font-size:12px;font-weight:800;display:grid;place-items:center;
|
||
}
|
||
.idn-txt{flex:1;min-width:0}
|
||
.idn-retry{
|
||
flex:0 0 auto;border:0;background:#E8A33D;color:#fff;font-weight:700;
|
||
font-size:12px;padding:6px 12px;border-radius:9px;
|
||
}
|
||
.idn-retry:active{transform:scale(.95)}
|
||
|
||
/* =====================================================================
|
||
孕期盲盒 · 首页细横幅(2026-10-01,需求文档 v1.0 三-7)
|
||
一条奶油粉→薰衣草的渐变细卡:左边会晃的礼盒,中间两行字,右边胶囊。
|
||
⚠️ 它是 #homeBody 第一个孩子;隐藏时把首块上间距还给工具托盘(下面两条)。
|
||
动效:礼盒每 3 秒晃一下(只在「有盒子可开」时)+ 一道斜光每 5 秒扫过;减少动态效果时全关。
|
||
===================================================================== */
|
||
.bb-banner{position:relative;display:flex;align-items:center;gap:11px;width:100%;min-height:66px;
|
||
padding:9px 12px 9px 9px;border:1px solid rgba(255,255,255,.9);border-radius:22px;overflow:hidden;
|
||
text-align:left;font:inherit;color:#5A2E22;
|
||
background:linear-gradient(105deg,#FFF0E2 0%,#FFE3E6 55%,#F1E5FF 100%);
|
||
box-shadow:0 10px 24px rgba(226,120,108,.16)}
|
||
.bb-banner.hide{display:none}
|
||
.home-body>.bb-banner.hide+.tool-dock{margin-top:21px}
|
||
.home-body.no-letter>.bb-banner.hide+.tool-dock{margin-top:30px}
|
||
.bb-banner:active{transform:scale(.985)}
|
||
.bb-gift{position:relative;flex:0 0 auto;width:50px;height:50px;border-radius:16px;display:grid;place-items:center;
|
||
background:radial-gradient(circle at 50% 60%,#fff 0,rgba(255,255,255,.55) 55%,rgba(255,255,255,0) 72%)}
|
||
.bb-gift svg{width:44px;height:44px;overflow:visible}
|
||
.bb-banner.is-ready .bb-gift svg{animation:bbWiggle 3s ease-in-out infinite;transform-origin:50% 90%}
|
||
@keyframes bbWiggle{0%,62%,100%{transform:rotate(0) scale(1)}66%{transform:rotate(-10deg) scale(1.06)}
|
||
71%{transform:rotate(9deg) scale(1.08)}76%{transform:rotate(-6deg)}81%{transform:rotate(4deg)}86%{transform:rotate(0)}}
|
||
.bb-badge{position:absolute;left:44px;top:6px;min-width:18px;height:18px;padding:0 5px;border-radius:9px;
|
||
font-size:11px;font-weight:800;line-height:18px;text-align:center;color:#fff;
|
||
background:linear-gradient(135deg,#FF5B6E,#F4593C);box-shadow:0 0 0 2px #fff;animation:bbBadge 1.6s ease-in-out infinite}
|
||
.bb-badge.hide{display:none}
|
||
@keyframes bbBadge{0%,100%{transform:scale(1)}50%{transform:scale(1.15)}}
|
||
.bb-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
|
||
.bb-t{font-size:15.5px;font-weight:800;letter-spacing:-.2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.bb-s{font-size:11.5px;color:#9A6F62;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.bb-s b{color:var(--brand);font-weight:800}
|
||
.bb-cta{flex:0 0 auto;border-radius:999px;padding:7px 13px;font-size:12.5px;font-weight:800;color:#fff;
|
||
background:linear-gradient(135deg,#FF7A5C,#F4593C);box-shadow:0 6px 14px rgba(244,89,60,.3)}
|
||
.bb-banner.is-calm .bb-cta{color:var(--brand);background:#fff;box-shadow:0 3px 10px rgba(226,120,108,.16)}
|
||
.bb-shine{position:absolute;top:-20%;left:-40%;width:28%;height:140%;pointer-events:none;
|
||
background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.75),rgba(255,255,255,0));
|
||
transform:skewX(-20deg);animation:bbShine 5s ease-in-out infinite}
|
||
@keyframes bbShine{0%,70%{left:-40%}100%{left:130%}}
|
||
|
||
/* 礼盒 SVG(横幅和舞台共用一份画法,见 app.js giftSVG):盖子单独一组,开盒时飞起来 */
|
||
.gift .g-lid{transform-box:fill-box;transform-origin:50% 100%}
|
||
.gift .g-body{transform-box:fill-box;transform-origin:50% 100%}
|
||
|
||
/* =====================================================================
|
||
此刻,孕妈们在做什么(2026-10-01,需求文档 v1.0 第二节)
|
||
外壳是首页公共白色通栏。里面三层:
|
||
① 头像叠 + 一个会滚动累加的大数字(进入视口时从 0 数上去,之后每分钟刷新平滑涨)
|
||
② 今日三项:三张浅色小卡,点击进入对应工具
|
||
③ 匿名动态:一行,每 3 秒往上翻一条
|
||
背景两团慢慢漂的柔光 + 左上「此刻」红点呼吸,表达「正在发生」。
|
||
===================================================================== */
|
||
/* 2026-10-01 再改:收进 .tool-dock 底部做轻量条(见 index.html #pulse 注释)。
|
||
不再是独立白卡:浅暖底圆角带,左右不出血,和宫格同宽;字号整体比工具卡小一档,读起来是「附注」不是第二个模块。 */
|
||
.pulse{margin-top:12px;padding:11px 12px 10px;border-radius:18px;background:#FFF6F0}
|
||
.pulse.hide{display:none}
|
||
.pl-head{display:flex;align-items:center;gap:7px;min-width:0}
|
||
.pl-live{flex:0 0 auto;display:inline-flex;align-items:center;gap:4px;font-size:10.5px;font-weight:800;color:#fff;
|
||
background:linear-gradient(135deg,#FF6B57,#F4593C);border-radius:999px;padding:2px 7px 2px 6px}
|
||
.pl-live i{position:relative;width:5px;height:5px;border-radius:50%;background:#fff}
|
||
.pl-live i::after{content:"";position:absolute;inset:-3px;border-radius:50%;border:1.5px solid #fff;animation:plPing 1.6s ease-out infinite}
|
||
@keyframes plPing{from{transform:scale(.6);opacity:1}to{transform:scale(1.9);opacity:0}}
|
||
.pl-title{flex:1;min-width:0;font-size:13px;font-weight:600;color:var(--ink-2);line-height:1.35}
|
||
.pl-title b{font-size:16px;font-weight:900;letter-spacing:-.3px;color:var(--brand);font-variant-numeric:tabular-nums}
|
||
.pl-feed.hide{display:none}
|
||
.pl-feed{position:relative;margin-top:8px;height:26px;overflow:hidden;
|
||
-webkit-mask-image:linear-gradient(180deg,transparent 0,#000 18%,#000 82%,transparent 100%);
|
||
mask-image:linear-gradient(180deg,transparent 0,#000 18%,#000 82%,transparent 100%)}
|
||
.pl-track{will-change:transform}
|
||
.pl-track.is-move{transition:transform .55s var(--ease)}
|
||
.pl-row{display:flex;align-items:center;gap:6px;height:26px;font-size:12px;white-space:nowrap}
|
||
.pl-row .pr-who{flex:0 0 auto;color:var(--muted)}
|
||
.pl-row .pr-do{flex:1;min-width:0;color:var(--ink-2);overflow:hidden;text-overflow:ellipsis}
|
||
.pl-row .pr-do em{font-style:normal;color:var(--brand)}
|
||
|
||
/* =====================================================================
|
||
孕期盲盒 · 详情页(2026-10-01)
|
||
① 舞台:珊瑚→玫瑰渐变 + 缓慢旋转的光芒 + 闪烁星星,礼盒悬浮呼吸;
|
||
点「开启」→ 礼盒越晃越厉害(等接口,最少 1.3 秒)→ 盖子飞起、白光一闪 → 翻卡层。
|
||
② 翻卡层:暗色幕 + 彩纸迸开 + 卡片从背面 3D 翻到正面;闪卡多一层流动的镭射光。
|
||
③ 卡册:按孕早/中/晚期三组,已集的显示插画,可开的在发光,没到的是问号。
|
||
===================================================================== */
|
||
.bx .detail-body{padding:16px 16px 40px}
|
||
.bx-rule-btn{width:auto;font-size:13px;font-weight:700;color:var(--brand)}
|
||
.bx-stage{position:relative;z-index:0;overflow:hidden;border-radius:28px;padding:22px 18px 20px;text-align:center;color:#fff;
|
||
background:linear-gradient(165deg,#FFB08F 0%,#FF8B76 42%,#E9688C 100%);box-shadow:0 16px 36px rgba(233,104,120,.3)}
|
||
.bx-rays{position:absolute;z-index:-1;left:50%;top:46%;width:520px;height:520px;margin:-260px 0 0 -260px;
|
||
background:repeating-conic-gradient(rgba(255,255,255,.16) 0 9deg,rgba(255,255,255,0) 9deg 22.5deg);
|
||
-webkit-mask-image:radial-gradient(circle,#000 0,rgba(0,0,0,.6) 30%,transparent 62%);
|
||
mask-image:radial-gradient(circle,#000 0,rgba(0,0,0,.6) 30%,transparent 62%);
|
||
animation:bxSpin 24s linear infinite}
|
||
@keyframes bxSpin{to{transform:rotate(360deg)}}
|
||
.bx-sp{position:absolute;z-index:-1;color:#FFF3C4;animation:gpTw 2.2s ease-in-out infinite;opacity:0}
|
||
.bx-sp.s1{left:16%;top:30%;font-size:14px}.bx-sp.s2{right:14%;top:24%;font-size:11px;animation-delay:.5s}
|
||
.bx-sp.s3{left:22%;top:62%;font-size:9px;animation-delay:1.1s}.bx-sp.s4{right:20%;top:58%;font-size:13px;animation-delay:1.6s}
|
||
.bx-week{font-size:13px;font-weight:800;letter-spacing:1px;display:inline-block;padding:4px 12px;border-radius:999px;
|
||
background:rgba(255,255,255,.22);backdrop-filter:blur(4px)}
|
||
.bx-hint{margin-top:8px;font-size:18px;font-weight:900;letter-spacing:.2px;text-shadow:0 2px 0 rgba(190,70,80,.25)}
|
||
.bx-box{display:block;margin:6px auto 0;width:168px;height:168px;border:0;background:none;padding:0;
|
||
animation:bxFloat 3.2s ease-in-out infinite}
|
||
.bx-box.hide,.bx-mini.hide,.bx-open.hide{display:none}
|
||
.bx-box svg{width:100%;height:100%;overflow:visible;filter:drop-shadow(0 12px 14px rgba(160,50,60,.28))}
|
||
@keyframes bxFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)}}
|
||
.bx-shadow{display:block;width:96px;height:12px;margin:-8px auto 0;border-radius:50%;background:rgba(120,30,40,.18);
|
||
animation:bxShadow 3.2s ease-in-out infinite}
|
||
@keyframes bxShadow{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(.82);opacity:.7}}
|
||
.bx-stage.is-done .bx-shadow{display:none}
|
||
.bx-stage.is-shaking .bx-box{animation:bxShake .32s ease-in-out infinite}
|
||
.bx-stage.is-shaking .bx-box svg{animation:bxSwell 1.3s ease-in forwards}
|
||
@keyframes bxShake{0%,100%{transform:rotate(0)}25%{transform:rotate(-7deg) translateY(-2px)}75%{transform:rotate(7deg) translateY(-2px)}}
|
||
@keyframes bxSwell{to{transform:scale(1.12)}}
|
||
.bx-stage.is-popping .g-lid{animation:bxLid .5s cubic-bezier(.2,.8,.3,1) forwards}
|
||
.bx-stage.is-popping .g-body{animation:bxBody .5s ease-out forwards}
|
||
@keyframes bxLid{to{transform:translate(18px,-90px) rotate(28deg);opacity:0}}
|
||
@keyframes bxBody{40%{transform:scaleY(.86) scaleX(1.08)}100%{transform:scale(.7);opacity:0}}
|
||
.bx-open{position:relative;margin-top:14px;min-width:178px;border-radius:999px;padding:13px 26px;font-size:16px;font-weight:900;
|
||
letter-spacing:1px;color:#E5503C;background:#fff;box-shadow:0 10px 22px rgba(170,50,50,.25),0 0 0 0 rgba(255,255,255,.6);
|
||
animation:bxCta 2s ease-out infinite}
|
||
.bx-open:active{transform:scale(.96)}
|
||
.bx-open[disabled]{opacity:.85;animation:none}
|
||
@keyframes bxCta{0%{box-shadow:0 10px 22px rgba(170,50,50,.25),0 0 0 0 rgba(255,255,255,.55)}
|
||
80%,100%{box-shadow:0 10px 22px rgba(170,50,50,.25),0 0 0 16px rgba(255,255,255,0)}}
|
||
.bx-stage.is-done .bx-open{animation:none;background:rgba(255,255,255,.95)}
|
||
.bx-misc{margin-top:12px;font-size:12px;color:rgba(255,255,255,.9)}
|
||
.bx-misc:empty{display:none}
|
||
.bx-mini{display:block;margin:12px auto 4px;width:150px;border:0;background:none;padding:0;transform:rotate(-4deg);
|
||
animation:bxFloat 3.6s ease-in-out infinite}
|
||
.bx-mini .cf{transform-origin:top left;width:248px;transform:scale(.605);margin-bottom:-130px;height:330px}
|
||
|
||
.bx-pend{margin-top:14px;padding:13px 14px;border-radius:20px;background:#fff;box-shadow:var(--sh)}
|
||
.bx-pend.hide{display:none}
|
||
.bx-pend-t{font-size:14px;font-weight:800}
|
||
.bx-pend-t b{color:var(--brand)}
|
||
.bx-pend-t em{display:block;margin-top:2px;font-style:normal;font-size:11.5px;font-weight:500;color:var(--muted)}
|
||
.bx-chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:10px}
|
||
.bx-chip{border-radius:999px;padding:6px 12px;font-size:12.5px;font-weight:700;color:#C4553E;background:#FFF0EA;
|
||
border:1.5px solid transparent;transition:all .2s var(--ease)}
|
||
.bx-chip.on{color:#fff;background:linear-gradient(135deg,#FF7A5C,#F4593C);box-shadow:0 4px 10px rgba(244,89,60,.28)}
|
||
|
||
.bx-album{margin-top:16px;padding:16px 14px 6px;border-radius:24px;background:#fff;box-shadow:var(--sh)}
|
||
.bx-ah{display:flex;align-items:baseline}
|
||
.bx-ah h3{font-size:16.5px;font-weight:800}
|
||
.bx-cnt{margin-left:auto;font-size:13px;color:var(--muted)}
|
||
.bx-cnt b{font-size:20px;font-weight:900;color:var(--brand)}
|
||
.bx-prog{margin-top:9px;height:8px;border-radius:4px;background:#F5ECE6;overflow:hidden}
|
||
.bx-prog i{display:block;height:100%;width:0;border-radius:4px;background:linear-gradient(90deg,#FFB08F,#F4593C,#E9688C);
|
||
transition:width 1s var(--ease)}
|
||
.bx-anote{margin-top:7px;font-size:11.5px;color:var(--muted)}
|
||
.bx-anote:empty{display:none}
|
||
.bx-grp{margin-top:14px}
|
||
.bx-gh{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:800;color:var(--ink);margin-bottom:8px}
|
||
.bx-gh i{width:6px;height:6px;border-radius:50%;background:var(--c,#F4593C)}
|
||
.bx-gh span{margin-left:auto;font-size:11.5px;font-weight:600;color:var(--muted)}
|
||
.bx-gh.full span{color:var(--brand)}
|
||
.bx-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:7px}
|
||
.bx-t{position:relative;aspect-ratio:3/4;border-radius:11px;overflow:hidden;border:0;padding:0;font:inherit;
|
||
background:#F7F0EB;display:grid;place-items:center}
|
||
.bx-t .wk{position:absolute;left:0;right:0;bottom:0;text-align:center;padding:10px 0 3px;font-size:10.5px;font-weight:800;color:#fff;
|
||
background:linear-gradient(180deg,rgba(0,0,0,0),rgba(90,40,30,.55))}
|
||
.bx-t img{width:100%;height:100%;object-fit:cover}
|
||
.bx-t .fb{font-size:26px}
|
||
.bx-t.got{box-shadow:0 3px 8px rgba(190,120,96,.18)}
|
||
.bx-t.lock{border:1.5px dashed #EADBD2;color:#C9B4A8;font-size:18px;font-weight:900}
|
||
.bx-t.lock .wk{color:#B9A296;background:none}
|
||
.bx-t.can{background:linear-gradient(160deg,#FFE1D4,#FFC2B6);border:0;animation:bxCan 1.8s ease-in-out infinite}
|
||
.bx-t.can svg{width:30px;height:30px;overflow:visible}
|
||
.bx-t.can .wk{color:#C4553E;background:none}
|
||
@keyframes bxCan{0%,100%{box-shadow:0 0 0 0 rgba(244,89,60,.0)}50%{box-shadow:0 0 0 3px rgba(244,89,60,.35)}}
|
||
.bx-t.flash::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
|
||
box-shadow:inset 0 0 0 2px #FFD66E;
|
||
background:linear-gradient(115deg,transparent 25%,rgba(255,255,255,.65) 45%,rgba(255,200,240,.4) 52%,transparent 70%) 0 0/250% 250%;
|
||
mix-blend-mode:screen;animation:bxHolo 2.6s linear infinite}
|
||
.bx-t .bf{position:absolute;right:3px;top:3px;font-size:9px;font-weight:800;color:#fff;background:rgba(0,0,0,.25);border-radius:5px;padding:0 3px}
|
||
.bx-t.is-new{animation:bxNewT 1s cubic-bezier(.3,1.6,.5,1)}
|
||
@keyframes bxNewT{0%{transform:scale(.4);opacity:0}60%{transform:scale(1.15)}100%{transform:none;opacity:1}}
|
||
|
||
.bx-rules{margin-top:16px;border-radius:20px;background:#fff;box-shadow:var(--sh);overflow:hidden}
|
||
.bx-rules summary{list-style:none;display:flex;align-items:center;padding:14px 16px;font-size:14px;font-weight:800}
|
||
.bx-rules summary::-webkit-details-marker{display:none}
|
||
.bx-rules summary::after{content:"›";margin-left:auto;color:var(--muted);font-size:18px;transition:transform .25s}
|
||
.bx-rules[open] summary::after{transform:rotate(90deg)}
|
||
.bx-rules-b{padding:0 16px 16px;font-size:12.5px;color:var(--ink-2);line-height:1.7}
|
||
.bx-rules-b h4{margin:10px 0 6px;font-size:12.5px;font-weight:800;color:var(--ink)}
|
||
.bx-pr{display:flex;align-items:center;gap:8px;margin:5px 0}
|
||
.bx-pr span{flex:0 0 auto;width:118px;font-size:12px}
|
||
.bx-pr i{flex:1;height:6px;border-radius:3px;background:#F5ECE6;position:relative;overflow:hidden}
|
||
.bx-pr i::after{content:"";position:absolute;left:0;top:0;bottom:0;width:var(--w);border-radius:3px;background:linear-gradient(90deg,#FFB08F,#F4593C)}
|
||
.bx-pr b{flex:0 0 auto;width:34px;text-align:right;font-size:12px;color:var(--brand)}
|
||
.bx-rules-b ul{margin:4px 0 0;padding-left:16px}
|
||
.bx-rules-b .free{margin-top:10px;padding:8px 10px;border-radius:10px;background:#FFF5EF;color:#B5543F;font-weight:700;font-size:12px}
|
||
|
||
/* ---------- 翻卡层 ---------- */
|
||
.bx-reveal{position:absolute;inset:0;z-index:6;display:flex;align-items:flex-start;justify-content:center;overflow-y:auto;
|
||
background:rgba(48,22,26,.82);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
|
||
opacity:0;pointer-events:none;transition:opacity .35s}
|
||
.bx-reveal.show{opacity:1;pointer-events:auto}
|
||
.bx-glow{position:absolute;left:50%;top:260px;width:460px;height:460px;margin:-230px 0 0 -230px;pointer-events:none;
|
||
background:repeating-conic-gradient(rgba(255,214,150,.18) 0 8deg,rgba(255,214,150,0) 8deg 20deg);
|
||
-webkit-mask-image:radial-gradient(circle,#000 0,transparent 65%);mask-image:radial-gradient(circle,#000 0,transparent 65%);
|
||
animation:bxSpin 30s linear infinite;opacity:0;transition:opacity .6s .4s}
|
||
.bx-reveal.show .bx-glow{opacity:1}
|
||
.bx-reveal.is-flash .bx-glow{background:repeating-conic-gradient(rgba(255,150,220,.2) 0 8deg,rgba(150,220,255,.12) 8deg 14deg,rgba(255,240,150,0) 14deg 20deg)}
|
||
.bx-flash{position:absolute;left:50%;top:260px;width:120px;height:120px;margin:-60px 0 0 -60px;border-radius:50%;
|
||
background:radial-gradient(circle,#fff 0,rgba(255,255,255,.8) 40%,rgba(255,255,255,0) 70%);opacity:0;pointer-events:none}
|
||
.bx-reveal.is-burst .bx-flash{animation:bxFlash .8s ease-out}
|
||
@keyframes bxFlash{0%{transform:scale(.2);opacity:1}100%{transform:scale(7);opacity:0}}
|
||
.bx-confetti{position:absolute;left:50%;top:260px;width:0;height:0;pointer-events:none}
|
||
.bx-confetti i{position:absolute;left:0;top:0;width:8px;height:12px;border-radius:2px;background:var(--c);opacity:0;
|
||
animation:bxBurst 1.4s cubic-bezier(.15,.7,.3,1) var(--d) forwards}
|
||
.bx-confetti i.r{border-radius:50%;width:8px;height:8px}
|
||
@keyframes bxBurst{0%{transform:translate(0,0) rotate(0) scale(.6);opacity:1}
|
||
70%{opacity:1}100%{transform:translate(var(--x),var(--y)) rotate(var(--r)) scale(1);opacity:0}}
|
||
.bx-rv-in{position:relative;display:flex;flex-direction:column;align-items:center;width:100%;padding:calc(env(safe-area-inset-top) + 64px) 24px 40px}
|
||
.bx-tag{font-size:14px;font-weight:900;letter-spacing:1px;color:#FFE8B8;opacity:0;transform:translateY(-8px);transition:all .4s .5s}
|
||
.bx-reveal.show .bx-tag{opacity:1;transform:none}
|
||
.bx-reveal.is-flash .bx-tag{background:linear-gradient(90deg,#FFD66E,#FF9AD5,#9ADFFF,#FFD66E) 0 0/300% 100%;
|
||
-webkit-background-clip:text;background-clip:text;color:transparent;font-size:16px;animation:bxHolo 2.4s linear infinite}
|
||
.bx-persp{margin-top:14px;perspective:1100px}
|
||
.bx-card3d{position:relative;width:248px;height:330px;transform-style:preserve-3d;
|
||
transform:rotateY(180deg) scale(.35) translateY(90px);transition:transform 1.05s cubic-bezier(.2,.9,.25,1.12)}
|
||
.bx-card3d.is-flip{transform:rotateY(0) scale(1)}
|
||
.bx-card3d.no-anim{transition:none}
|
||
.bx-face{position:absolute;inset:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;border-radius:20px}
|
||
.bx-back{transform:rotateY(180deg);overflow:hidden;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
|
||
background:radial-gradient(circle at 50% 42%,#FFB08F 0,#F4593C 60%,#D9466E 100%);border:4px solid #FFE3D6;color:#fff}
|
||
.bx-back::before{content:"";position:absolute;inset:10px;border-radius:14px;border:1.5px dashed rgba(255,255,255,.5)}
|
||
.bx-back::after{content:"";position:absolute;inset:0;opacity:.25;
|
||
background:radial-gradient(circle,#fff 1.4px,transparent 1.6px) 0 0/18px 18px}
|
||
.bx-back svg{width:96px;height:96px;overflow:visible}
|
||
.bx-back b{position:relative;z-index:1;font-size:13px;letter-spacing:3px}
|
||
.bx-dev{max-width:290px;margin-top:16px;font-size:13px;line-height:1.7;color:rgba(255,255,255,.88);text-align:center;
|
||
opacity:0;transform:translateY(10px);transition:all .45s}
|
||
.bx-dev:empty{display:none}
|
||
.bx-reveal.is-done .bx-dev{opacity:1;transform:none;transition-delay:.15s}
|
||
.bx-reward{width:100%;max-width:300px;margin-top:14px;opacity:0;transform:translateY(24px) scale(.96);transition:all .5s var(--ease)}
|
||
.bx-reward:empty{display:none}
|
||
.bx-reveal.is-done .bx-reward{opacity:1;transform:none;transition-delay:.3s}
|
||
.bx-rw{position:relative;border-radius:20px;padding:14px 16px 15px;background:#FFFBF6;color:var(--ink);text-align:left;
|
||
box-shadow:0 14px 30px rgba(0,0,0,.25)}
|
||
.bx-rw::before{content:"";position:absolute;left:18px;top:-7px;width:14px;height:14px;transform:rotate(45deg);background:#FFFBF6}
|
||
.bx-rw-h{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:800;color:#C4553E}
|
||
.bx-rw-h i{width:26px;height:26px;border-radius:9px;display:grid;place-items:center;font-style:normal;font-size:15px;
|
||
background:linear-gradient(135deg,#FFE0D2,#FFC8BA)}
|
||
.bx-rw-h em{margin-left:auto;font-style:normal;font-size:10.5px;font-weight:700;color:#B8A094;background:#F6EEE8;border-radius:999px;padding:2px 8px}
|
||
.bx-rw-t{margin-top:9px;font-size:15px;font-weight:800}
|
||
.bx-rw-p{margin-top:5px;font-size:13.5px;line-height:1.75;color:#5E4A42;font-family:var(--font-kid)}
|
||
.bx-keep{margin-top:20px;min-width:200px;border-radius:999px;padding:13px 28px;font-size:15.5px;font-weight:900;color:#fff;
|
||
background:linear-gradient(135deg,#FF7A5C,#F4593C);box-shadow:0 10px 24px rgba(244,89,60,.4);
|
||
opacity:0;transform:translateY(16px);transition:all .45s}
|
||
.bx-reveal.is-done .bx-keep{opacity:1;transform:none;transition-delay:.55s}
|
||
.bx-keep:active{transform:scale(.96)}
|
||
|
||
/* ---------- 宝宝卡正面 ---------- */
|
||
.cf{position:relative;width:248px;height:330px;border-radius:20px;padding:10px;overflow:hidden;background:#FFFDF9;
|
||
box-shadow:0 18px 40px rgba(0,0,0,.28);text-align:left;color:var(--ink)}
|
||
.cf-img{position:relative;width:228px;height:200px;border-radius:14px;overflow:hidden;background:#FFF4EC;display:grid;place-items:center}
|
||
.cf-img img{width:100%;height:100%;object-fit:cover}
|
||
.cf-fb{display:grid;place-items:center;width:100%;height:100%;font-size:86px;
|
||
background:radial-gradient(circle at 50% 45%,#fff 0,#FFEADF 55%,#FFD9CB 100%)}
|
||
.cf-row{display:flex;align-items:baseline;margin-top:10px;padding:0 4px}
|
||
.cf-wk{font-size:13px;font-weight:800;color:var(--muted)}
|
||
.cf-wk b{font-size:24px;font-weight:900;color:var(--brand);margin:0 2px;letter-spacing:-.5px}
|
||
.cf-size{margin-left:auto;font-size:12px;color:var(--ink-2)}
|
||
.cf-size b{color:var(--ink);font-weight:800}
|
||
.cf-say{margin-top:6px;padding:8px 10px;border-radius:12px;background:#FFF3EC;font-size:13px;line-height:1.55;color:#7A4A3B;
|
||
font-family:var(--font-kid);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
|
||
.cf-say:empty{display:none}
|
||
.cf-no{position:absolute;right:16px;top:16px;font-size:10px;font-weight:800;letter-spacing:.5px;color:#fff;
|
||
background:rgba(90,46,34,.35);border-radius:999px;padding:2px 8px;backdrop-filter:blur(2px)}
|
||
.cf-tag{display:none}
|
||
.cf.v-flash{background:linear-gradient(135deg,#FFE7A3,#FFC6E5 35%,#C6E8FF 65%,#FFE7A3);padding:12px}
|
||
.cf.v-flash .cf-img{width:224px;height:196px}
|
||
.cf.v-flash .cf-row,.cf.v-flash .cf-say{position:relative}
|
||
.cf.v-flash .cf-say{background:rgba(255,255,255,.75)}
|
||
.cf.v-flash .cf-tag{display:block;position:absolute;left:16px;top:16px;z-index:2;font-size:11px;font-weight:900;color:#8A5A00;
|
||
background:linear-gradient(90deg,#FFE58A,#FFF6D0,#FFD66E);border-radius:999px;padding:2px 9px;box-shadow:0 2px 6px rgba(160,110,0,.3)}
|
||
.cf-holo{position:absolute;inset:0;pointer-events:none;z-index:1;border-radius:inherit;display:none;
|
||
background:linear-gradient(115deg,transparent 20%,rgba(255,255,255,.7) 38%,rgba(255,170,230,.45) 46%,rgba(150,225,255,.45) 54%,transparent 72%) 0 0/250% 250%;
|
||
mix-blend-mode:soft-light;animation:bxHolo 3s linear infinite}
|
||
.cf.v-flash .cf-holo{display:block}
|
||
@keyframes bxHolo{from{background-position:120% 0}to{background-position:-120% 0}}
|
||
|
||
@media (prefers-reduced-motion:reduce){
|
||
.bb-banner .bb-gift svg,.bb-badge,.bb-shine,.pl-live i::after,.bx-rays,.bx-sp,.bx-box,.bx-shadow,.bx-open,.bx-mini,
|
||
.bx-t.can,.bx-t.flash::after,.bx-glow,.cf-holo{animation:none!important}
|
||
.bb-shine{display:none}
|
||
.bx-card3d{transition-duration:.2s}
|
||
}
|
||
.bx-t .fb{display:grid;place-items:center;width:100%;height:100%;background:radial-gradient(circle at 50% 40%,#fff 0,#FFE6DA 70%)}
|
||
.bx-keep,.bx-open{text-align:center}
|
||
|
||
/* 此刻 · 同孕周(A+B 改版,2026-10-01):人物头像表现「人」,不用应用 logo,和上面工具卡(色块 + logo)拉开。 */
|
||
.pl-row .pr-ava,.pp-avs i{flex:0 0 auto;display:block;border-radius:50%;overflow:hidden;background:#FFE3D3}
|
||
.pl-row .pr-ava{width:18px;height:18px}
|
||
.pr-ava svg,.pp-avs svg{display:block;width:100%;height:100%}
|
||
.pp-avs{flex:0 0 auto;display:flex}
|
||
.pp-avs:empty{display:none}
|
||
.pp-avs i{width:22px;height:22px;margin-left:-7px;border:1.5px solid #FFF6F0}
|
||
.pp-avs i:first-child{margin-left:0}
|
||
.pp-doing.hide{display:none}
|
||
.pp-doing{display:flex;flex-direction:column;margin-top:10px}
|
||
.pp-do{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:13.5px;color:var(--ink-2)}
|
||
.pp-dt{flex:0 0 auto;white-space:nowrap}
|
||
.pp-dt b{font-size:15px;font-weight:900;color:var(--brand);font-variant-numeric:tabular-nums}
|
||
.pp-me{flex:0 0 auto;font:inherit;font-size:12px;font-weight:800;border:0;border-radius:999px;padding:4px 11px;white-space:nowrap}
|
||
.pp-me.todo{color:#fff;background:linear-gradient(135deg,#FF7A5C,#F4593C)}
|
||
.pp-me.todo:active{transform:scale(.95)}
|
||
.pp-me.ok{color:#4E8A43;background:#EAF5E6}
|
||
|
||
/* 孕期小知识 · 压缩版(2026-10-01:标题前带孕周;今日卡、7 天圆点、四张小卡都收紧,四卡改一行横滑) */
|
||
.pt-head{margin-bottom:8px;align-items:center}
|
||
.pt-title{display:flex;align-items:center;gap:6px;font-size:15.5px}
|
||
.pt-wk{display:inline-block;font-size:12.5px;font-weight:800;color:#fff;border-radius:8px;padding:2px 8px;
|
||
background:linear-gradient(135deg,#F4593C,#FF8A66);box-shadow:0 3px 8px rgba(244,89,60,.25);letter-spacing:0}
|
||
.pt-when{font-size:11px;padding:2px 8px}
|
||
.pt-today{padding:11px 14px 9px}
|
||
.pt-float{font-size:28px;top:8px}
|
||
.pt-body{min-height:0;padding-right:36px}
|
||
.pt-t{margin-top:6px;font-size:15px}
|
||
.pt-d{margin-top:3px;font-size:12.5px;line-height:1.6}
|
||
.pt-days{margin-top:8px;padding-top:7px}
|
||
.pt-day{gap:1px}
|
||
.pt-day i{width:22px;height:22px;line-height:22px;font-size:11px}
|
||
.pt-day span{font-size:9.5px}
|
||
.pt-grid{display:flex;gap:8px;margin:8px -26px 0;padding:0 26px 2px;overflow-x:auto;scroll-snap-type:x mandatory;
|
||
-webkit-overflow-scrolling:touch;scrollbar-width:none}
|
||
.pt-grid::-webkit-scrollbar{display:none}
|
||
.pt-card{flex:0 0 152px;scroll-snap-align:start;padding:9px 11px 10px;border-radius:14px;
|
||
display:grid;grid-template-columns:auto 1fr;column-gap:6px;align-items:center}
|
||
.pt-ico{width:24px;height:24px;border-radius:8px;font-size:14px}
|
||
.pt-card b{margin:0;font-size:12.5px}
|
||
.pt-card p{grid-column:1/-1;margin-top:5px;font-size:11.5px;line-height:1.5;
|
||
display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
|
||
.pt-grid .pt-card{transform:translateX(16px)}
|
||
.pt-grid.is-shown .pt-card{transform:none}
|
||
.pt-foot{margin-top:6px;font-size:10.5px}
|
||
.pt-card.is-open p{-webkit-line-clamp:unset;display:block}
|
||
.pt-grid{scroll-padding:0 26px}
|
||
.li.hide{display:none}
|
||
|
||
/* 孕期小知识 · 字号放大(2026-10-01 用户反馈:下面的文字太小看着累)。正文统一 ≥13px,次要信息 ≥11px */
|
||
.pt-when{font-size:12px}
|
||
.pt-t{font-size:16px}
|
||
.pt-d{font-size:14px;line-height:1.7;color:var(--ink-2)}
|
||
.pt-day i{width:24px;height:24px;line-height:24px;font-size:12px}
|
||
.pt-day span{font-size:11px}
|
||
.pt-card{flex-basis:178px;padding:11px 12px 12px}
|
||
.pt-ico{width:26px;height:26px;font-size:15px}
|
||
.pt-card b{font-size:14px}
|
||
.pt-card p{font-size:13px;line-height:1.6;margin-top:6px}
|
||
.pt-foot{font-size:11.5px}
|
||
/* 首页四个入口(2026-10-01 用户要求:首页不放卡片文字,点进详情页):图标 + 标题,一行四个 */
|
||
.pt-chips{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:10px}
|
||
.pt-chip{display:flex;flex-direction:column;align-items:center;gap:5px;padding:11px 2px 10px;border:0;border-radius:14px;
|
||
font:inherit;font-size:12.5px;font-weight:700;min-width:0;cursor:pointer;transition:transform .16s}
|
||
.pt-chip:active{transform:scale(.95)}
|
||
.pt-chip i{font-style:normal;font-size:20px;line-height:1}
|
||
.pt-chip span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.pt-chip.pc-baby span{color:#C4583C}.pt-chip.pc-mom span{color:#B3547E}.pt-chip.pc-eat span{color:#4F7F3E}.pt-chip.pc-care span{color:#4A6FA6}
|
||
|
||
/* 详情页 #detailTips:四张卡竖排、全文不截断 */
|
||
.pt-page{padding:16px 16px 40px}
|
||
.pt-page .pt-grid{display:grid;grid-template-columns:1fr;gap:10px;margin:0;padding:0;overflow:visible;scroll-snap-type:none}
|
||
.pt-page .pt-card{display:block;padding:14px 16px 15px;border-radius:18px;transform:translateY(10px)}
|
||
.pt-page .pt-grid.is-shown .pt-card{transform:none}
|
||
.pt-page .pt-card b{display:inline-block;margin-left:8px;font-size:15px;vertical-align:middle}
|
||
.pt-page .pt-ico{width:30px;height:30px;font-size:17px;vertical-align:middle}
|
||
.pt-page .pt-card p{margin-top:8px;font-size:14.5px;line-height:1.75;display:block;-webkit-line-clamp:unset}
|
||
.pt-page .pt-foot{margin-top:16px;text-align:center}
|
||
/* 详情页 · 本周每日小知识列表 */
|
||
#ptToday{cursor:pointer}
|
||
.pt-sub{margin:22px 2px 10px;font-size:16px;font-weight:800;color:var(--ink)}
|
||
.pt-page .pt-sub:first-child{margin-top:4px}
|
||
.pt-list{display:grid;gap:10px}
|
||
.pt-li{border-radius:18px;padding:13px 16px 14px;background:#fff;box-shadow:var(--sh)}
|
||
.pt-li.is-today{background:linear-gradient(135deg,#FFE9E1 0%,#FFF1E6 55%,#FFF7EE 100%);box-shadow:none}
|
||
.pt-li-tag{display:inline-block;font-size:11.5px;font-weight:800;color:var(--brand);background:#FFF0EA;border-radius:999px;padding:2px 9px}
|
||
.pt-li.is-today .pt-li-tag{color:#fff;background:linear-gradient(135deg,#FF8A5C,#F4593C)}
|
||
.pt-li-t{margin-top:7px;font-size:16px;font-weight:800;color:#5A2E22}
|
||
.pt-li-d{margin-top:4px;font-size:14.5px;line-height:1.75;color:var(--ink-2)}
|
||
.pt-li.is-lock{padding:11px 16px;font-size:13px;color:var(--ink-3,#A99);background:transparent;border:1px dashed #EBD9D0;box-shadow:none;text-align:center}
|
||
.pt-card.is-hit{animation:ptHit 1.2s ease}
|
||
@keyframes ptHit{0%,100%{box-shadow:0 0 0 0 rgba(244,89,60,0)}30%{box-shadow:0 0 0 3px rgba(244,89,60,.35)}}
|
||
|
||
/* ============ 孕期盲盒 · 价值感改造(2026-10-01):下周预告 / 待解锁任务 / 集齐奖励 / 宝宝周记 ============ */
|
||
/* 下周预告:卡片剪影(同一张插画压成纯色)+ 倒计时 */
|
||
.bx-next{display:flex;align-items:center;gap:12px;margin-top:14px;padding:12px 14px;border-radius:20px;background:#fff;box-shadow:var(--sh)}
|
||
.bx-next.hide{display:none}
|
||
.bx-next-img{flex:none;width:46px;height:58px;border-radius:10px;overflow:hidden;background:#F4E9E3;display:grid;place-items:center}
|
||
.bx-next-img img{width:100%;height:100%;object-fit:cover;filter:brightness(0) opacity(.18)}
|
||
.bx-next-img .cf-fb{font-size:24px;filter:grayscale(1) opacity(.35)}
|
||
.bx-next-t{flex:1;min-width:0}
|
||
.bx-next-t b{display:block;font-size:14px;font-weight:800}
|
||
.bx-next-t span{display:block;margin-top:3px;font-size:12px;color:var(--muted)}
|
||
.bx-next-cd{flex:none;text-align:center;padding:6px 10px;border-radius:14px;background:#FFF0EA}
|
||
.bx-next-cd b{display:block;font-size:20px;line-height:1.1;font-weight:900;color:var(--brand);font-variant-numeric:tabular-nums}
|
||
.bx-next-cd span{font-size:10.5px;font-weight:700;color:#C4553E}
|
||
|
||
/* 待解锁 */
|
||
.bx-lock{margin-top:14px;padding:14px;border-radius:20px;background:#fff;box-shadow:var(--sh)}
|
||
.bx-lock.hide{display:none}
|
||
.bx-lock-h{display:flex;gap:10px;align-items:flex-start}
|
||
.bx-lock-ico{flex:none;width:34px;height:34px;border-radius:12px;display:grid;place-items:center;font-size:17px;background:#F3EEFF}
|
||
.bx-lock-h b{font-size:14.5px;font-weight:800}
|
||
.bx-lock-h b em{font-style:normal;color:#7B61D9}
|
||
.bx-lock-h p{margin-top:2px;font-size:12px;color:var(--muted)}
|
||
.bx-chip.lk{color:#6A55B8;background:#F3EEFF}
|
||
.bx-chip.lk.on{color:#fff;background:linear-gradient(135deg,#9A85F0,#7B61D9);box-shadow:0 4px 10px rgba(123,97,217,.28)}
|
||
.bx-tasks{margin-top:12px;display:flex;flex-direction:column;gap:8px}
|
||
.bx-tk{display:flex;align-items:center;gap:10px;padding:10px 10px 10px 11px;border-radius:16px;background:#FAF6F3}
|
||
.bx-tk.is-ready{background:#FFF3EC;box-shadow:inset 0 0 0 1.5px #FFC9B5}
|
||
.bx-tk-i{flex:none;width:32px;height:32px;border-radius:11px;display:grid;place-items:center;font-size:16px;background:#fff}
|
||
.bx-tk-m{flex:1;min-width:0}
|
||
.bx-tk-m b{display:block;font-size:13.5px;font-weight:800}
|
||
.bx-tk-m>span{display:block;margin-top:2px;font-size:11.5px;color:var(--muted)}
|
||
.bx-tk-pr{display:flex;align-items:center;gap:6px;margin-top:5px}
|
||
.bx-tk-p{flex:1;max-width:110px;height:5px;border-radius:3px;background:#EEE3DC;overflow:hidden}
|
||
.bx-tk-p s{display:block;height:100%;border-radius:3px;background:linear-gradient(90deg,#FFB08F,#F4593C)}
|
||
.bx-tk-pr em{font-style:normal;font-size:11px;font-weight:700;color:#C4553E}
|
||
.bx-tk-b{flex:none;border-radius:999px;padding:7px 12px;font-size:12px;font-weight:800;color:#C4553E;background:#fff;box-shadow:inset 0 0 0 1.2px #FFC9B5}
|
||
.bx-tk-b.go{color:#fff;background:linear-gradient(135deg,#FF7A5C,#F4593C);box-shadow:0 4px 10px rgba(244,89,60,.28)}
|
||
.bx-tk-b.done{color:#B9A296;background:none;box-shadow:none}
|
||
.bx-tk-b:disabled{opacity:.6}
|
||
|
||
/* 卡册里的待解锁格子 */
|
||
.bx-t.lockd{background:#F6F2FF;border:1.5px dashed #CFC2F5}
|
||
.bx-t.lockd .li{font-size:17px;line-height:1}
|
||
.bx-t.lockd .wk{color:#7B61D9;background:none}
|
||
|
||
/* 集齐奖励 */
|
||
.bx-goal{margin-top:12px;display:grid;grid-template-columns:1fr 1fr;gap:8px}
|
||
.bx-goal:empty{display:none}
|
||
.bx-gl{padding:10px 11px;border-radius:14px;background:#FAF6F3}
|
||
.bx-gl.all{grid-column:1/-1;background:linear-gradient(135deg,#FFF6E2,#FFEBD9)}
|
||
.bx-gl.got{background:#FFF3EC}
|
||
.bx-gl-h{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 6px}
|
||
.bx-gl-h b{font-size:13px;font-weight:800}
|
||
.bx-gl-h em{font-style:normal;font-size:11.5px;font-weight:700;color:#C98A1E}
|
||
.bx-gl-l,.bx-gl-s{margin-left:auto;font-size:11.5px;color:var(--muted);white-space:nowrap}
|
||
.bx-gl-l b{color:var(--brand);font-size:13px}
|
||
.bx-gl-s{font-weight:800;color:#E07B2E}
|
||
.bx-gl-s.sent{color:#3EA27A}
|
||
.bx-gl-s.off{font-weight:600;color:#B9A296}
|
||
.bx-gl-b{margin-left:auto;border-radius:999px;padding:4px 10px;font-size:11.5px;font-weight:800;color:#fff;background:linear-gradient(135deg,#FF7A5C,#F4593C)}
|
||
.bx-gl-bar{display:block;margin-top:7px;height:5px;border-radius:3px;background:rgba(0,0,0,.06);overflow:hidden}
|
||
.bx-gl-bar s{display:block;height:100%;border-radius:3px;background:linear-gradient(90deg,#FFD36E,#F4593C);transition:width .6s var(--ease)}
|
||
|
||
/* 翻卡层里的宝宝周记 */
|
||
.bx-diary{width:100%;max-width:300px;margin-top:12px;padding:12px 14px;border-radius:18px;background:rgba(255,255,255,.14);text-align:left;
|
||
opacity:0;transform:translateY(16px);transition:all .45s}
|
||
.bx-diary:empty{display:none}
|
||
.bx-reveal.is-done .bx-diary{opacity:1;transform:none;transition-delay:.22s}
|
||
.bx-dy-h{font-size:12px;font-weight:800;color:#FFE3A6;margin-bottom:4px}
|
||
.bx-diary p{font-size:13.5px;line-height:1.7;color:#fff;font-family:var(--font-kid)}
|
||
|
||
/* 集齐庆祝弹层 + 收货表单 */
|
||
.bx-prize{text-align:center}
|
||
.bx-prize-ico{font-size:46px;line-height:1;margin:6px 0 8px}
|
||
.bx-prize h3{font-size:18px;font-weight:900}
|
||
.bx-prize p{margin:8px 4px 4px;font-size:14px;line-height:1.7;color:var(--ink-2)}
|
||
.bx-addr-tip{margin:-2px 0 12px;font-size:13px;line-height:1.6;color:var(--ink-2)}
|
||
/* 集齐奖励:三段一排(每格窄,名称 / 奖励 / 状态竖排),全集独占一行横排 */
|
||
.bx-goal{grid-template-columns:repeat(3,1fr);gap:7px}
|
||
.bx-gl:not(.all) .bx-gl-h{flex-direction:column;align-items:flex-start;gap:2px}
|
||
.bx-gl:not(.all) .bx-gl-l,.bx-gl:not(.all) .bx-gl-s,.bx-gl:not(.all) .bx-gl-b{margin-left:0}
|
||
.bx-gl:not(.all){padding:9px 10px}
|
||
|
||
/* ================= 「我的」页改版(2026-10-01)=================
|
||
配色:头部蜜桃 → 珊瑚柔光渐变(和首页 hero 同一家族);兜豆兑换卡用兑换商城自己的
|
||
奶白 → 粉 + berry(见下),是全页最跳的一张;孕期卡回到白底 + 珊瑚进度(上一版深绿和全站暖色打架);
|
||
心选商城 / 常用服务都是白卡,退到背景里。
|
||
⚠️ 本段写在文件末尾,靠层叠覆盖上面的旧规则(.me-top / .me-card / .preg-card …),
|
||
旧规则的注释讲的是旧版的取舍,看这里为准。 */
|
||
.me-top.me-v2{
|
||
padding:calc(env(safe-area-inset-top) + 14px) 20px 58px;border-radius:0 0 34px 34px;
|
||
background:
|
||
radial-gradient(180px 140px at 8% 0%, rgba(255,170,190,.55), rgba(255,170,190,0) 70%),
|
||
radial-gradient(200px 160px at 100% 85%, rgba(255,206,130,.55), rgba(255,206,130,0) 70%),
|
||
linear-gradient(160deg,#FF9F7E 0%,#F8775A 52%,#EE6248 100%)}
|
||
.me-top.me-v2::after{display:none}
|
||
.mt-glow{position:absolute;border-radius:50%;pointer-events:none}
|
||
.mt-glow.g1{width:210px;height:210px;right:-70px;top:-90px;background:rgba(255,255,255,.12)}
|
||
.mt-glow.g2{width:120px;height:120px;left:-40px;bottom:-60px;background:rgba(255,255,255,.08)}
|
||
.mt-stars{position:absolute;left:96px;top:calc(env(safe-area-inset-top) + 12px);width:150px;height:75px;pointer-events:none}
|
||
.me-top.me-v2 .hero-top{margin-bottom:6px;position:relative;z-index:2}
|
||
.me-v2 .me-card{background:none;box-shadow:none;padding:0 2px;border-radius:0;gap:15px;overflow:visible}
|
||
.me-v2 .me-avatar{width:70px;height:70px;box-shadow:0 0 0 3px rgba(255,255,255,.9),0 8px 18px rgba(150,50,30,.28)}
|
||
.me-v2 .av-edit{background:#fff;color:var(--brand);box-shadow:0 2px 8px rgba(150,50,30,.3)}
|
||
.me-v2 .me-name{color:#fff;font-size:23px;text-shadow:0 1px 6px rgba(150,50,30,.2)}
|
||
.me-tag{display:inline-block;margin-top:6px;padding:3px 10px;border-radius:99px;font-size:12px;font-weight:700;
|
||
color:#fff;background:rgba(255,255,255,.22);box-shadow:inset 0 0 0 1px rgba(255,255,255,.35)}
|
||
.me-tag.hide{display:none}
|
||
.me-v2 .me-info p{color:rgba(255,255,255,.92);margin-top:6px;font-size:12.5px}
|
||
.me-v2 .me-info p b{color:#FFF3B0;font-size:15px}
|
||
.me-v2 .me-chev{color:rgba(255,255,255,.8)}
|
||
|
||
/* 兜豆兑换卡:半压在头部底边上。配色跟兑换商城走(商城侧给的视觉:berry #D9577A / 深 #B83F62,
|
||
点缀金 #FFC857,深棕字 #4A3530,底 #FFF8F1),图标就是商城那颗粉色兜豆(内联,不多一次请求)。 */
|
||
#screen-me .page-body.no-top{margin-top:-40px}
|
||
.bean-card{position:relative;overflow:hidden;width:100%;display:block;text-align:left;
|
||
padding:14px 14px 14px 10px;border-radius:24px;color:#4A3530;
|
||
background:
|
||
radial-gradient(150px 110px at 100% 0%, rgba(255,200,87,.38), rgba(255,200,87,0) 70%),
|
||
linear-gradient(118deg,#FFF8F1 0%,#FFEAF0 55%,#FFD6E2 100%);
|
||
box-shadow:0 14px 30px rgba(184,63,98,.20),inset 0 0 0 1px rgba(255,255,255,.75);transition:transform .18s var(--ease)}
|
||
.bean-card:active{transform:scale(.985)}
|
||
.bc-pattern{position:absolute;inset:0;pointer-events:none;opacity:.55;
|
||
background-image:radial-gradient(circle at 1px 1px, rgba(217,87,122,.28) 1px, transparent 1.4px);background-size:12px 12px;
|
||
-webkit-mask-image:linear-gradient(100deg,transparent 40%,#000 100%);mask-image:linear-gradient(100deg,transparent 40%,#000 100%)}
|
||
.bc-top{display:flex;align-items:center;gap:10px;position:relative}
|
||
.bc-coin{flex:0 0 58px;filter:drop-shadow(0 5px 6px rgba(217,87,122,.25))}
|
||
.bc-coin svg{display:block}
|
||
.bc-main{flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:3px}
|
||
.bc-kick{font-size:10.5px;font-weight:800;color:#fff;background:#D9577A;padding:2px 8px;border-radius:99px;letter-spacing:.5px}
|
||
.bc-title{font-size:19px;font-weight:900;letter-spacing:-.3px;color:#4A3530}
|
||
.bc-sub{font-size:12.5px;font-weight:700;color:#B83F62}
|
||
.bc-cta{flex:0 0 auto;display:flex;align-items:center;gap:2px;padding:9px 13px;border-radius:99px;
|
||
font-size:13.5px;font-weight:800;color:#fff;background:linear-gradient(135deg,#E8708F,#D9577A 60%,#B83F62);
|
||
box-shadow:0 6px 14px rgba(184,63,98,.35)}
|
||
.bc-cta i,.ms-go i,.es-go i{font-style:normal;font-size:16px;line-height:1;margin-left:1px}
|
||
.bc-drop{display:block;position:relative;margin:12px 0 0 4px;padding:10px;border-radius:16px;background:rgba(255,255,255,.72)}
|
||
.bc-drop.hide{display:none}
|
||
.bd-head{display:block;font-size:11.5px;font-weight:800;color:#B83F62;margin-bottom:8px}
|
||
.bd-head::before{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;background:#E8344E;margin-right:6px;vertical-align:1px;
|
||
box-shadow:0 0 0 3px rgba(232,52,78,.18)}
|
||
.bd-goods{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
|
||
.bd-it{display:flex;flex-direction:column;gap:3px;min-width:0}
|
||
.bd-it img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:12px;background:#FFF1F4}
|
||
.bd-nm{font-size:11.5px;color:#4A3530;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.bd-it b{font-size:11.5px;font-weight:900;color:#D9577A}
|
||
|
||
/* 孕期信息卡:白底 + 珊瑚进度 */
|
||
#screen-me .preg-card{color:var(--ink);
|
||
background:radial-gradient(200px 120px at 100% 0%, #FFEDE4, rgba(255,237,228,0) 70%),#fff;
|
||
box-shadow:var(--sh)}
|
||
#screen-me .pc-ico{background:#FFF0EA}
|
||
#screen-me .pc-title{color:var(--ink)}
|
||
#screen-me .pc-sub{color:var(--ink-2)}
|
||
#screen-me .preg-card .chev{color:#C9BFB8}
|
||
#screen-me .preg-card .rp{background:rgba(244,89,60,.1)}
|
||
#screen-me .pc-bar{background:#FBE7DE}
|
||
#screen-me .pc-bar i{background:linear-gradient(90deg,#FFB08F,#F4593C)}
|
||
#screen-me .pc-stage{color:#A0928A}
|
||
#screen-me .pc-stage .cur{color:#fff;background:linear-gradient(135deg,#F7845E,#E85A3C)}
|
||
|
||
/* 心选商城横幅 */
|
||
.mall-strip{width:100%;display:flex;align-items:center;gap:12px;margin-top:14px;padding:14px 16px;border-radius:20px;text-align:left;
|
||
background:#fff;box-shadow:var(--sh)}
|
||
.ms-ico{width:42px;height:42px;border-radius:13px;display:grid;place-items:center;flex:0 0 auto;color:#E8603F;
|
||
background:linear-gradient(140deg,#FFEDE5,#FFD9CA)}
|
||
.ms-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
|
||
.ms-main b{font-size:15.5px;font-weight:800;color:var(--ink)}
|
||
.ms-main span{font-size:12px;color:var(--ink-2)}
|
||
.ms-go{display:flex;align-items:center;font-size:13px;font-weight:700;color:var(--brand)}
|
||
|
||
/* 常用服务四宫格 */
|
||
.svc-grid{display:grid;grid-template-columns:repeat(4,1fr);padding:16px 6px;border-radius:22px;background:#fff;box-shadow:var(--sh)}
|
||
.svc{position:relative;overflow:visible!important;display:flex;flex-direction:column;align-items:center;gap:8px;padding:4px 0}
|
||
.svc.hide{display:none}
|
||
.sv-ico{width:46px;height:46px;border-radius:15px;display:grid;place-items:center}
|
||
.sv-ico.o{background:#FFEFE6;color:#E8703F}
|
||
.sv-ico.p{background:#F1EBFB;color:#7B5FD4}
|
||
.sv-ico.b{background:#E7F0FA;color:#4478BC}
|
||
.sv-t{font-size:12.5px;font-weight:700;color:var(--ink)}
|
||
.sv-badge{position:absolute;top:-6px;left:50%;margin-left:10px;padding:1px 6px;white-space:nowrap;border-radius:99px;font-size:10px;font-weight:800;
|
||
color:#fff;background:var(--brand);box-shadow:0 0 0 2px #fff}
|
||
.sv-badge:empty{display:none}
|
||
.me-logout{display:block;width:100%;margin-top:14px;padding:14px;border-radius:18px;background:#fff;
|
||
font-size:14.5px;font-weight:700;color:#C33A2E;text-align:center;box-shadow:var(--sh)}
|
||
.me-ver{text-align:center;font-size:11.5px;color:#B5A9A1;margin:18px 0 6px}
|
||
|
||
/* 首页 · 兜豆兑换商城入口条(婴儿房下面) */
|
||
.exch-strip{width:100%;display:flex;align-items:center;gap:11px;margin-top:12px;padding:12px 14px;border-radius:20px;text-align:left;
|
||
background:radial-gradient(120px 80px at 100% 0%, rgba(255,200,87,.35), rgba(255,200,87,0) 70%),linear-gradient(118deg,#FFF8F1,#FFEAF0 60%,#FFD6E2);
|
||
box-shadow:0 10px 22px rgba(184,63,98,.16),inset 0 0 0 1px rgba(255,255,255,.75)}
|
||
.es-coin{flex:0 0 auto;filter:drop-shadow(0 3px 4px rgba(217,87,122,.25))}
|
||
.es-coin svg{display:block}
|
||
.es-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
|
||
.es-main b{font-size:15px;font-weight:900;color:#4A3530}
|
||
.es-main span{font-size:12px;font-weight:700;color:#B83F62;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.es-go{flex:0 0 auto;display:flex;align-items:center;padding:7px 12px;border-radius:99px;font-size:13px;font-weight:800;color:#fff;
|
||
background:linear-gradient(135deg,#E8708F,#D9577A 60%,#B83F62);box-shadow:0 5px 12px rgba(184,63,98,.3)}
|
||
|
||
/* ================= 「我的资料」弹窗改版(2026-10-01)=================
|
||
目标:好填。实时结果条在最上面;预产期三种填法;孕周用大号步进按钮,不用敲键盘;
|
||
头像缩进「妈妈」卡和昵称并排;每组一张白卡,读起来是三件事,不是一长串输入框。 */
|
||
.pf-modal{padding-bottom:0}
|
||
.pf-lead{font-size:12.5px;color:var(--ink-2);margin-top:4px}
|
||
.pf-sum{display:flex;align-items:center;gap:12px;margin-top:14px;padding:14px 16px;border-radius:20px;color:#fff;
|
||
background:linear-gradient(135deg,#C9BEB6,#B2A69D);transition:background .3s}
|
||
.pf-sum.is-set{background:radial-gradient(140px 90px at 100% 0%, rgba(255,214,150,.45), rgba(255,214,150,0) 70%),linear-gradient(135deg,#FF9A7A,#F2664A);
|
||
box-shadow:0 10px 22px rgba(240,100,70,.28)}
|
||
.ps-ico{width:40px;height:40px;border-radius:13px;background:rgba(255,255,255,.22);display:grid;place-items:center;flex:0 0 auto}
|
||
.ps-main{display:flex;flex-direction:column;gap:2px;min-width:0}
|
||
.ps-main b{font-size:19px;font-weight:900;letter-spacing:-.3px}
|
||
.ps-main span{font-size:12.5px;opacity:.92}
|
||
.pf-card{margin-top:12px;padding:14px 14px 16px;border-radius:20px;background:#fff;box-shadow:0 4px 14px rgba(160,110,90,.08)}
|
||
.pf-ct{font-size:15px;font-weight:800;color:var(--ink);display:flex;align-items:center;gap:6px}
|
||
.pf-ct em{font-style:normal;font-size:11px;font-weight:800;color:#fff;background:var(--brand);padding:1px 7px;border-radius:99px}
|
||
.seg{display:flex;margin-top:12px;padding:4px;border-radius:14px;background:#F5EEE9}
|
||
.seg-b{flex:1;padding:9px 2px;border-radius:11px;font-size:13px;font-weight:700;color:var(--ink-2);transition:all .2s}
|
||
.seg-b.is-active{background:#fff;color:var(--brand);box-shadow:0 2px 8px rgba(160,90,60,.14)}
|
||
.pg-pane{display:none;margin-top:12px}
|
||
.pg-pane.is-on{display:block}
|
||
.pg-tip{font-size:12px;color:var(--muted);margin-top:8px;line-height:1.5}
|
||
.date-btn{position:relative;display:flex;align-items:center;gap:10px;padding:0 14px;min-height:54px;border-radius:16px;
|
||
background:#FFF6F2;box-shadow:inset 0 0 0 1.5px #F6D6CA;cursor:pointer}
|
||
.date-btn.is-set{background:#FDECE7;box-shadow:inset 0 0 0 1.8px var(--brand)}
|
||
.db-ico{color:var(--brand);display:grid;place-items:center}
|
||
.db-txt{flex:1;font-size:16px;font-weight:700;color:#B4A79C}
|
||
.date-btn.is-set .db-txt{color:var(--ink)}
|
||
/* 原生日期控件整块盖在按钮上、透明:点哪儿都能唤起系统日期选择器 */
|
||
.date-btn input{position:absolute;inset:0;width:100%;height:100%;opacity:0;border:0;padding:0;margin:0;-webkit-appearance:none;appearance:none;cursor:pointer}
|
||
.date-btn input::-webkit-calendar-picker-indicator{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}
|
||
.stp-row{display:flex;gap:10px}
|
||
.stp{flex:1;min-width:0}
|
||
.stp-l{display:block;font-size:12.5px;font-weight:700;color:var(--ink-2);margin-bottom:7px}
|
||
.stp-ctl{display:flex;align-items:center;height:54px;border-radius:16px;background:#FFF6F2;box-shadow:inset 0 0 0 1.5px #F6D6CA;overflow:hidden}
|
||
.stp-b{flex:0 0 44px;height:100%;font-size:22px;font-weight:700;color:var(--brand)}
|
||
.stp-b:active{background:#FBE2D9}
|
||
.stp-ctl input{flex:1;min-width:0;width:100%;height:100%;border:0;background:none;text-align:center;font-size:22px;font-weight:900;color:var(--ink);
|
||
-moz-appearance:textfield;padding:0}
|
||
.stp-ctl input::-webkit-outer-spin-button,.stp-ctl input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
|
||
.stp-ctl input:focus{outline:none}
|
||
.pf-fld{margin-top:12px}
|
||
.nm-chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:9px}
|
||
.nm-c{padding:6px 12px;border-radius:99px;font-size:12.5px;font-weight:700;color:#B4573E;background:#FFF1EB}
|
||
.nm-c:active{transform:scale(.95)}
|
||
.pf-me{display:flex;align-items:flex-end;gap:14px}
|
||
.pf-me .av-pick{padding:0;flex:0 0 auto}
|
||
.pf-me .av-big{width:64px;height:64px}
|
||
.pf-me .av-big>svg{width:36px;height:36px}
|
||
.pf-me .fld{flex:1;margin-top:0}
|
||
.pf-foot{position:sticky;bottom:0;margin:14px -22px 0;padding:12px 22px calc(14px + env(safe-area-inset-bottom));
|
||
background:linear-gradient(rgba(250,245,241,0),#FAF5F1 30%)}
|
||
.pf-foot .dl-btn.ghost{flex:0 0 96px}
|
||
.pf-me .av-cam{width:24px;height:24px;right:-4px;bottom:-4px}
|
||
.pf-me .av-cam svg{width:12px;height:12px}
|
||
|
||
/* 首页 · 兜豆兑好物模块:头部一条 + 横滑商品(2026-10-01 用户:「需要调出几个商品,不能直接是一条信息」) */
|
||
.exch-mod{margin-top:12px;padding:6px 6px 12px;border-radius:24px;
|
||
background:radial-gradient(160px 110px at 100% 0%, rgba(255,200,87,.32), rgba(255,200,87,0) 70%),linear-gradient(160deg,#FFF8F1,#FFEAF0 60%,#FFDCE6);
|
||
box-shadow:0 10px 24px rgba(184,63,98,.14),inset 0 0 0 1px rgba(255,255,255,.75)}
|
||
.exch-mod .exch-strip{margin-top:0;background:none;box-shadow:none;padding:8px 8px 6px}
|
||
.ex-goods{display:flex;gap:9px;overflow-x:auto;padding:6px 8px 2px;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none}
|
||
.ex-goods::-webkit-scrollbar{display:none}
|
||
.ex-goods.hide{display:none}
|
||
.ex-it{flex:0 0 96px;scroll-snap-align:start;display:flex;flex-direction:column;gap:3px;padding:6px 6px 8px;border-radius:16px;background:#fff;
|
||
box-shadow:0 4px 10px rgba(184,63,98,.08);cursor:pointer}
|
||
.ex-it:active{transform:scale(.97)}
|
||
.gi-pic{position:relative;display:block}
|
||
.gi-pic img{display:block;width:100%;aspect-ratio:1;object-fit:cover;border-radius:12px;background:#FFF1F4}
|
||
.gi-badge{position:absolute;left:4px;top:4px;font-style:normal;font-size:10px;font-weight:800;color:#fff;background:#E8344E;padding:1px 6px;border-radius:99px}
|
||
.gi-left{position:absolute;left:4px;right:4px;bottom:4px;text-align:center;font-style:normal;font-size:10px;font-weight:800;color:#fff;
|
||
background:rgba(74,53,48,.62);padding:1px 0;border-radius:8px}
|
||
.ex-it .bd-nm{font-size:12px;color:#4A3530;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}
|
||
.ex-it b{font-size:12px;font-weight:900;color:#D9577A}
|
||
|
||
/* 「我的」页:孕期卡和兜豆卡对调 —— 孕期卡半压在头部底边,阴影加深一点才「浮」得起来 */
|
||
#screen-me .page-body.no-top>.preg-card:first-of-type{box-shadow:0 14px 30px rgba(140,56,34,.18),0 2px 6px rgba(140,56,34,.08)}
|
||
.seg-b{text-align:center;white-space:nowrap}
|
||
.stp-b{width:48px;min-width:48px;display:grid;place-items:center;padding:0}
|
||
.stp-ctl input{width:0}
|
||
|
||
/* ================= 宝宝消消乐卡压矮(2026-10-01 用户:「高度可以降一降」)================= */
|
||
.gp-card{padding:11px 12px 11px 16px;border-radius:20px}
|
||
.gp-text{padding-top:10px}
|
||
.gp-name{font-size:18px}
|
||
.gp-sub{margin-top:3px;font-size:11.5px;line-height:1.45;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
|
||
.gp-cta{margin-top:7px;padding:4px 12px;font-size:12px}
|
||
.gp-board{grid-template-columns:repeat(3,22px);gap:3px;padding:5px;border-radius:12px}
|
||
.gp-board i{width:22px;height:22px;border-radius:7px;font-size:13px}
|
||
.gp-card::before{width:120px;height:120px;bottom:-56px}
|
||
|
||
/* ================= 今日脚印 2026-10-01 改版(.fp2)=================
|
||
一张奶油色的「手账」:撕页日历 + 一左一右的小脚丫沿虚线往下走 + 宝宝写给妈妈的便签。
|
||
⚠️ 写在文件末尾,靠 .today-line.fp2 覆盖上面那套旧的时间轴列宽变量(--tl-*)布局。 */
|
||
.today-line.fp2{padding:16px 16px 16px;
|
||
background-color:#fff;
|
||
background-image:
|
||
radial-gradient(160px 110px at 100% 0%, rgba(255,214,190,.45), rgba(255,214,190,0) 70%),
|
||
radial-gradient(140px 120px at 0% 100%, rgba(255,226,236,.55), rgba(255,226,236,0) 70%),
|
||
linear-gradient(180deg,#FFFCF8,#FFF6EF)}
|
||
.today-line.fp2::before{display:none}
|
||
.fp-head{display:flex;align-items:center;gap:12px}
|
||
.fp-cal{position:relative;flex:0 0 56px;height:60px;border-radius:14px;overflow:hidden;background:#fff;
|
||
box-shadow:0 6px 14px rgba(200,110,80,.16),inset 0 0 0 1px #F6E3DA;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;padding-bottom:6px}
|
||
.fp-cal::before{content:"";position:absolute;left:0;right:0;top:0;height:17px;background:linear-gradient(135deg,#FF8E6E,#F4593C)}
|
||
.fc-ring{position:absolute;top:-3px;left:14px;right:14px;height:9px;
|
||
background:radial-gradient(circle,#fff 2.2px,transparent 2.6px) 0 50%/14px 9px repeat-x}
|
||
.fp-cal b{font-size:23px;font-weight:900;line-height:1;color:#3A2C27;letter-spacing:-.5px;font-variant-numeric:tabular-nums}
|
||
.fp-cal span{font-size:9.5px;font-weight:700;color:#A08C82;margin-top:3px;white-space:nowrap}
|
||
.fp-ht{flex:1;min-width:0}
|
||
.fp2 .tl-h-title{font-size:18px;font-weight:900;color:var(--ink);letter-spacing:-.3px}
|
||
.fp-poem{margin-top:4px;font-size:12px;color:#A57F70;font-family:var(--font-kid);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.fp-all{flex:0 0 auto;align-self:flex-start;margin-top:4px;display:flex;align-items:center;gap:1px;font-size:12.5px;font-weight:700;color:var(--muted)}
|
||
.fp-all i{font-style:normal;font-size:15px;line-height:1}
|
||
|
||
/* 脚印行:左边一只小脚丫(交替左右、交替颜色),沿一条虚线往下;右边一张小卡 */
|
||
.fp2 .fp-steps{position:relative;margin-top:14px;padding:0}
|
||
.fp2 .fp-steps::before{content:"";position:absolute;left:13px;top:16px;bottom:16px;border-left:2px dashed #F3D6CA}
|
||
.fp2 .step{display:flex;align-items:center;gap:10px;padding:5px 0;font-size:14px}
|
||
.fp2 .st-dot{flex:0 0 28px;width:28px;height:28px;border-radius:50%;display:grid;place-items:center;
|
||
background:#FFEDE6;color:#F4704F;box-shadow:0 0 0 3px #FFF8F3;z-index:1}
|
||
.fp2 .step:nth-child(odd) .st-dot svg{transform:scaleX(-1) rotate(-8deg)}
|
||
.fp2 .step:nth-child(even) .st-dot svg{transform:rotate(8deg) translateY(1px)}
|
||
.fp2 .step:nth-child(3n+2) .st-dot{background:#FDE8F0;color:#D9577A}
|
||
.fp2 .step:nth-child(3n) .st-dot{background:#FFF3D6;color:#E0A126}
|
||
.st-card{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px;padding:10px 12px;border-radius:14px;background:rgba(255,255,255,.9);
|
||
box-shadow:0 3px 10px rgba(190,120,95,.08),inset 0 0 0 1px #F7EAE3}
|
||
.fp2 .st-txt{font-size:14.5px;font-weight:700;color:#3A2C27;white-space:normal;line-height:1.45}
|
||
.fp2 .st-txt b{font-size:17px;font-weight:900;color:var(--brand);margin:0 2px;font-variant-numeric:tabular-nums}
|
||
.st-meta{display:flex;align-items:center;gap:6px;min-width:0}
|
||
.fp2 .st-time{flex:0 0 auto;font-size:11.5px;font-weight:700;color:#B09A8F}
|
||
.fp2 .st-from{margin:0;font-size:10.5px;font-weight:700;color:#C0704F;background:#FFF0E8;border-radius:99px;padding:1px 8px}
|
||
.fp2 .st-from:empty{display:none}
|
||
.st-det{font-size:11px;color:#B09A8F;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
|
||
/* 还没脚印:一行小脚丫走过来 + 引导语(童趣字体)+ 带 logo 的应用芯片 */
|
||
.fp2 .fp-guide{display:block;margin-top:14px;padding:14px 14px 16px;border-radius:18px;text-align:center;
|
||
background:rgba(255,255,255,.85);box-shadow:inset 0 0 0 1.5px #F6E1D8;border:0}
|
||
.fp2 .fp-guide::before,.fp2 .fp-guide::after{display:none}
|
||
.fg-walk{display:flex;justify-content:center;align-items:flex-end;gap:12px;height:30px;color:#F6B39D}
|
||
.fg-walk i{display:block;line-height:0}
|
||
.fg-walk i:nth-child(odd){transform:translateY(-8px) scaleX(-1) rotate(-12deg)}
|
||
.fg-walk i:nth-child(even){transform:rotate(12deg)}
|
||
.fg-walk .fw0{opacity:.3}.fg-walk .fw1{opacity:.45}.fg-walk .fw2{opacity:.6}.fg-walk .fw3{opacity:.8}.fg-walk .fw4{color:var(--brand);animation:fpStep 1.6s ease-in-out infinite}
|
||
@keyframes fpStep{0%,100%{transform:rotate(12deg)}50%{transform:rotate(12deg) translateY(-3px) scale(1.12)}}
|
||
.fp2 .tl-guide-t{display:block;margin-top:10px;font-family:var(--font-kid);font-size:16.5px;font-weight:700;line-height:1.55;color:#4A3530}
|
||
.fp2 .tl-guide-s{display:block;margin-top:4px;font-size:12px;color:#A08C82}
|
||
.fp2 .tl-guide-apps{justify-content:center;gap:7px;margin-top:12px}
|
||
.fp2 .tl-chip{display:inline-flex;align-items:center;gap:5px;padding:5px 11px 5px 5px;border-radius:99px;border:0;
|
||
font-size:12.5px;font-weight:700;color:#4A3530;background:#fff;box-shadow:0 2px 8px rgba(190,110,85,.14),inset 0 0 0 1px #F6E1D8}
|
||
.fp2 .tl-chip img{width:20px;height:20px;border-radius:6px;object-fit:cover}
|
||
.fp2 .tl-chip.is-plain{padding-left:11px}
|
||
@media (prefers-reduced-motion:reduce){.fg-walk .fw4{animation:none}}
|
||
|
||
/* 宝宝的便签:信纸横线 + 胶带 + 落款 */
|
||
.fp2 .fp-note{position:relative;display:block;width:100%;margin-top:14px;padding:16px 16px 12px;text-align:left;border-radius:6px 18px 18px 18px;
|
||
overflow:visible;background:#FFFDF7;box-shadow:0 8px 20px rgba(200,120,90,.14),inset 0 0 0 1px #F5E4DA}
|
||
.fp2 .fp-note::after{content:"";position:absolute;left:50%;top:-8px;width:64px;height:16px;margin-left:-32px;transform:rotate(-3deg);
|
||
background:rgba(255,190,160,.55);border-radius:2px;box-shadow:0 1px 2px rgba(0,0,0,.04)}
|
||
.fn-top{display:flex;align-items:center;gap:7px}
|
||
.fp2 .ab-badge{flex:0 0 auto;margin:0;padding:2px 6px;border-radius:6px;font-size:10px;font-weight:900;color:#fff;
|
||
background:linear-gradient(135deg,#FF8E6E,#F4593C);letter-spacing:.5px}
|
||
.fp2 .ab-tag{margin:0;font-size:12.5px;font-weight:800;color:#C0573C;opacity:1}
|
||
.fp2 .ab-say{display:block;margin-top:8px;font-family:var(--font-kid);font-size:16.5px;font-weight:700;line-height:30px;color:#4A3530;
|
||
background-image:repeating-linear-gradient(180deg,transparent 0,transparent 29px,rgba(232,180,160,.38) 29px,rgba(232,180,160,.38) 30px)}
|
||
.fn-foot{display:flex;align-items:center;gap:8px;margin-top:6px}
|
||
.fn-sign{font-family:var(--font-kid);font-size:13px;color:#C0704F}
|
||
.fn-foot em{margin-left:auto;font-style:normal;font-size:12px;font-weight:700;color:var(--brand)}
|
||
.today-line.fp2.no-ai .fp-note{display:none}
|
||
|
||
/* ================= 本周孕育指南 → 孕周专属福利(.shelf.gift2,2026-10-01)=================
|
||
礼盒抬头 + 三张「福利券」:孕周角标、免费印章、撕券虚线(两侧半圆缺口)、底行免费领。 */
|
||
.shelf.gift2{background-image:
|
||
radial-gradient(170px 110px at 100% 0%, rgba(255,200,170,.38), rgba(255,200,170,0) 70%),
|
||
linear-gradient(180deg,#FFFDFB,#FFF7F1)}
|
||
.gb-bar{align-items:center;gap:10px;margin-bottom:12px}
|
||
.gb-gift{flex:0 0 42px;height:42px;border-radius:14px;display:grid;place-items:center;
|
||
background:linear-gradient(145deg,#FFF1E6,#FFE1D2);box-shadow:inset 0 0 0 1px #FBD9C8}
|
||
.gb-gift svg{animation:gbWiggle 3.2s ease-in-out infinite;transform-origin:50% 90%}
|
||
@keyframes gbWiggle{0%,82%,100%{transform:rotate(0)}86%{transform:rotate(-9deg)}90%{transform:rotate(8deg)}94%{transform:rotate(-4deg)}}
|
||
.gb-ht{flex:1;min-width:0}
|
||
.gift2 .sh-title{font-size:18px;font-weight:900;color:var(--ink)}
|
||
.gift2 .sh-title [data-wk]{color:#F4593C}
|
||
.gift2 .sh-note{margin:3px 0 0;font-size:12.5px;color:#A08C82}
|
||
.gift2 .sh-note b{color:#E8344E;font-weight:800}
|
||
.gift2 .sh-all{align-self:flex-start;margin-top:4px}
|
||
|
||
.gift2 .shelf-book{position:relative;overflow:hidden;padding:14px 14px 12px}
|
||
.sb-tag{position:absolute;left:0;top:0;z-index:1;padding:4px 10px 4px 12px;border-radius:20px 0 14px 0;
|
||
font-size:11px;font-weight:800;color:#fff;letter-spacing:.3px;background:linear-gradient(135deg,#FF8E6E,#F4593C)}
|
||
.sb-stamp{position:absolute;right:12px;top:12px;z-index:1;width:44px;height:44px;border-radius:50%;
|
||
display:grid;place-items:center;text-align:center;font-size:11px;font-weight:900;line-height:1.15;color:#E8344E;
|
||
border:2px solid rgba(232,52,78,.75);box-shadow:inset 0 0 0 2px rgba(255,255,255,.7),inset 0 0 0 3.5px rgba(232,52,78,.35);
|
||
background:rgba(255,255,255,.55);transform:rotate(14deg)}
|
||
.gift2 .sb-cover{margin-top:10px}
|
||
/* 撕券线:虚线 + 左右两个半圆缺口(缺口颜色取外壳底色,近白) */
|
||
.gift2 .sb-row{position:relative;margin-top:auto;padding-top:11px;border-top:1.5px dashed rgba(170,110,80,.28)}
|
||
.gift2 .sb-row::before,.gift2 .sb-row::after{content:"";position:absolute;top:-8px;width:15px;height:15px;border-radius:50%;background:#FFFAF6}
|
||
.gift2 .sb-row::before{left:-22px}
|
||
.gift2 .sb-row::after{right:-22px}
|
||
.gift2 .sb-desc{margin-bottom:12px}
|
||
.gift2 .sb-row .pill-free{margin-left:auto;padding:5px 11px;border-radius:99px;font-size:12px;font-weight:800;
|
||
color:#fff;background:linear-gradient(135deg,#FF7A5C,#E8344E);box-shadow:0 4px 10px rgba(232,52,78,.22)}
|
||
.gift2 .unlock{display:block;text-align:center;margin:14px 0 2px;padding:9px 12px;border-radius:14px;
|
||
background:#FFF1E8;color:#8A6A5E;font-size:12.5px}
|
||
.gift2 .unlock b{color:#E8344E;font-size:15px;font-weight:900;margin:0 1px}
|
||
.ul-gift{display:inline-block;vertical-align:-3px;margin-right:5px;width:16px;height:16px;background:no-repeat center/contain url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='3' y='9' width='18' height='12' rx='2.5' fill='%23FF7A5C'/%3E%3Crect x='2' y='7' width='20' height='4.5' rx='2' fill='%23FF9474'/%3E%3Crect x='10.6' y='7' width='2.8' height='14' fill='%23FFD36E'/%3E%3C/svg%3E")}
|
||
@media (prefers-reduced-motion:reduce){.gb-gift svg{animation:none}}
|
||
.gift2 .sb-faces i:nth-child(n+4){display:none}
|
||
.gift2 .sb-row .pill-free{padding:5px 10px}
|
||
.gift2 .unlock a{white-space:nowrap}
|
||
|
||
/* 今日脚印 · 无记录时的两条示例(.is-demo) */
|
||
.fp-demo-t{display:flex;align-items:center;gap:6px;margin:14px 0 -4px;font-size:12.5px;font-weight:700;color:#A57F70}
|
||
.fp-demo-t i{font-style:normal;color:#F4A08A}
|
||
.fp-demo-t em{font-style:normal;margin-left:auto;font-size:10.5px;font-weight:800;color:#C0704F;background:#FFF0E8;border-radius:6px;padding:2px 7px}
|
||
.fp2 .fp-steps.is-demo .step{opacity:.72}
|
||
.fp2 .fp-steps.is-demo .st-card{position:relative;background:rgba(255,255,255,.7);box-shadow:inset 0 0 0 1.5px #F6DDD2;border:0;
|
||
background-image:repeating-linear-gradient(135deg,rgba(255,236,226,.5) 0 6px,transparent 6px 12px)}
|
||
.st-demo{position:absolute;right:8px;top:8px;font-style:normal;font-size:10px;font-weight:800;color:#fff;background:#F4A08A;border-radius:6px;padding:1px 6px}
|
||
.fp2 .fp-steps.is-demo + .fp-guide{margin-top:10px}
|
||
|
||
/* ================= 底部导航 2026-10-01 改版 =================
|
||
白色磨砂药丸 + 选中项一颗暖色胶囊托底(图标+字一起包住,带一点弹跳);
|
||
中间「记一下」升起成一颗带白圈的大圆钮,白圈和药丸同色 → 看着像从药丸里鼓出来的;圆钮外一圈呼吸光环。 */
|
||
.tabbar{left:16px;right:16px;height:62px;border-radius:31px;padding:0 6px;
|
||
background:rgba(255,255,255,.94);
|
||
box-shadow:0 12px 32px rgba(170,90,60,.18),0 2px 6px rgba(170,90,60,.08),inset 0 0 0 1px rgba(255,220,205,.6)}
|
||
.tab{gap:2px;color:#B4A79F;z-index:0}
|
||
.tab::before{content:"";position:absolute;z-index:-1;left:50%;top:50%;width:62px;height:50px;margin:-25px 0 0 -31px;border-radius:20px;
|
||
background:linear-gradient(160deg,#FFF0E8,#FFE0D3);box-shadow:inset 0 0 0 1px rgba(255,190,165,.45);
|
||
opacity:0;transform:scale(.6);transition:opacity .25s,transform .4s cubic-bezier(.3,1.6,.5,1)}
|
||
.tab.is-active::before{opacity:1;transform:scale(1)}
|
||
.tab.is-active{color:#F4593C}
|
||
.tab.is-active .t-ico{transform:translateY(-1px);animation:tabPop .45s cubic-bezier(.3,1.6,.5,1)}
|
||
@keyframes tabPop{0%{transform:scale(.7)}100%{transform:translateY(-1px) scale(1)}}
|
||
.tab.is-active .t-txt{font-weight:800}
|
||
.tab-fab::before{display:none}
|
||
.tab-fab{justify-content:flex-end;padding-bottom:8px}
|
||
.tab-fab .fab{position:absolute;left:50%;top:-22px;width:52px;height:52px;margin-left:-26px;
|
||
border:4px solid #fff;box-sizing:content-box;background:#fff;
|
||
box-shadow:0 -4px 10px rgba(170,90,60,.08),0 8px 18px rgba(244,89,60,.38)}
|
||
.tab-fab .fab::after{content:"";position:absolute;inset:-4px;border-radius:50%;border:2px solid rgba(244,89,60,.45);
|
||
animation:fabHalo 2.4s ease-out infinite;pointer-events:none}
|
||
@keyframes fabHalo{0%{transform:scale(1);opacity:.9}100%{transform:scale(1.35);opacity:0}}
|
||
.tab-fab .t-txt{font-weight:800;color:#F4593C}
|
||
.t-badge{top:6px;left:calc(50% + 9px);border-color:#fff;box-shadow:0 0 0 2px rgba(255,59,48,.18)}
|
||
@media (prefers-reduced-motion:reduce){.tab-fab .fab::after,.tab.is-active .t-ico{animation:none}}
|
||
|
||
/* 首页兜豆兑好物:和其它模块同一套白色外壳(出血 26px、圆角 26、暖色渐变底) */
|
||
.exch-wrap{margin:16px -26px 0;padding:16px 26px 18px;border-radius:26px;position:relative;z-index:0;
|
||
background-color:#fff;background-image:radial-gradient(170px 110px at 100% 0%, rgba(255,214,190,.38), rgba(255,214,190,0) 70%),linear-gradient(180deg,#FFFDFB,#FFF7F3)}
|
||
.exch-wrap .exch-mod{margin-top:0}
|
||
/* 2026-10-01 用户:选中项不要背景圆圈/底色,只靠颜色+加粗+图标弹一下 + 下方小圆点 */
|
||
.tab::before{display:none}
|
||
.tab::after{content:"";position:absolute;left:50%;bottom:6px;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:#F4593C;opacity:0;transform:scale(0);transition:opacity .2s,transform .3s cubic-bezier(.3,1.6,.5,1)}
|
||
.tab.is-active::after{opacity:1;transform:scale(1)}
|
||
.tab-fab::after{display:none}
|
||
|
||
/* ================= 首页底部三模块拉开色相(2026-10-01)=================
|
||
用户:脚印 / 消消乐 / 福利三块都是珊瑚桃色,视觉疲劳。按功能各给一个色系,饱和度和明度保持同一档,
|
||
整页还是暖调、和品牌橙不打架:
|
||
· 今日脚印 = 「成长」薄荷绿(便签保持奶油白,暖色落在宝宝的话上)
|
||
· 宝宝消消乐 = 「糖果」紫(整页唯一的冷色块,游戏感最强,也最跳)
|
||
· 孕周专属福利 = 「礼物」蜂蜜金(金色 = 福利/礼包;「免费领」按钮仍用红,保留紧迫感) */
|
||
|
||
/* —— 今日脚印:薄荷绿 —— */
|
||
.today-line.fp2{background-color:#fff;background-image:
|
||
radial-gradient(180px 120px at 100% 0%, rgba(178,232,208,.55), rgba(178,232,208,0) 70%),
|
||
radial-gradient(150px 120px at 0% 100%, rgba(206,240,226,.6), rgba(206,240,226,0) 70%),
|
||
linear-gradient(180deg,#F8FDFA,#EEF8F3)}
|
||
.fp-cal{box-shadow:0 6px 14px rgba(60,150,115,.16),inset 0 0 0 1px #D8EEE4}
|
||
.fp-cal::before{background:linear-gradient(135deg,#5FCB9F,#2FA57C)}
|
||
.fp-poem{color:#5E9580}
|
||
.fp2 .fp-steps::before{border-left-color:#BFE3D2}
|
||
.fp2 .st-dot{background:#DDF3E9;color:#2FA57C;box-shadow:0 0 0 3px #F3FBF7}
|
||
.fp2 .step:nth-child(3n+2) .st-dot{background:#FDE8F0;color:#D9577A}
|
||
.fp2 .step:nth-child(3n) .st-dot{background:#FFF3D6;color:#E0A126}
|
||
.st-card{box-shadow:0 3px 10px rgba(60,140,110,.08),inset 0 0 0 1px #E1F1E9}
|
||
.fp2 .st-from{color:#2C8E6B;background:#E3F5EC}
|
||
.fp2 .st-txt b{color:#23946C}
|
||
.fp-demo-t{color:#5E9580}.fp-demo-t i{color:#5FCB9F}
|
||
.fp2 .fp-steps.is-demo .st-card{box-shadow:inset 0 0 0 1.5px #CBE8DA;
|
||
background-image:repeating-linear-gradient(135deg,rgba(220,243,232,.6) 0 6px,transparent 6px 12px)}
|
||
.st-demo{background:#7CC9A7}
|
||
.fg-walk{color:#A9DCC4}.fg-walk .fw4{color:#2FA57C}
|
||
.fp2 .fp-guide{box-shadow:inset 0 0 0 1.5px #D3EBDF}
|
||
.fp2 .tl-chip{box-shadow:0 2px 8px rgba(60,140,110,.14),inset 0 0 0 1px #D3EBDF}
|
||
.fp2 .fp-note{box-shadow:0 8px 20px rgba(60,130,100,.13),inset 0 0 0 1px #E6EFE6}
|
||
.fp2 .fp-note::after{background:rgba(130,214,176,.55)}
|
||
.fp2 .ab-badge{background:linear-gradient(135deg,#5FCB9F,#2FA57C)}
|
||
.fp2 .ab-tag{color:#2C8E6B}
|
||
.fn-sign{color:#4E9A7D}.fn-foot em{color:#23946C}
|
||
.fp-all{color:#5E8576}
|
||
|
||
/* —— 宝宝消消乐:糖果紫 —— */
|
||
.gp-card{background:linear-gradient(120deg,#8C7BFF 0%,#B18CFF 52%,#FF9BD0 100%);
|
||
box-shadow:0 10px 24px rgba(130,100,240,.30)}
|
||
.gp-card::after{content:"";position:absolute;right:-30px;top:-50px;width:150px;height:150px;border-radius:50%;
|
||
background:radial-gradient(circle,rgba(255,255,255,.28),rgba(255,255,255,0) 70%);pointer-events:none}
|
||
.gp-name{text-shadow:0 2px 0 rgba(90,60,200,.35)}
|
||
.gp-new{color:#6B4FE0;background:#FFE58A}
|
||
.gp-cta{color:#6B4FE0;box-shadow:0 4px 10px rgba(80,50,190,.25)}
|
||
.gp-board{background:rgba(255,255,255,.28)}
|
||
.gp-board i{box-shadow:0 2px 0 rgba(110,80,210,.28)}
|
||
.gp-board i.is-hint{background:#FFF6D6;box-shadow:0 0 0 2px #FFD36E}
|
||
|
||
/* —— 孕周专属福利:蜂蜜金 —— */
|
||
.shelf.gift2{background-color:#fff;background-image:
|
||
radial-gradient(180px 120px at 100% 0%, rgba(255,214,120,.42), rgba(255,214,120,0) 70%),
|
||
linear-gradient(180deg,#FFFDF5,#FFF7E3)}
|
||
.gb-gift{background:linear-gradient(145deg,#FFF4D2,#FFE7A8);box-shadow:inset 0 0 0 1px #F8DC95}
|
||
.gift2 .sh-title [data-wk]{color:#D88A0B}
|
||
.sb-tag{background:linear-gradient(135deg,#FFC84A,#F29A12);color:#fff;text-shadow:0 1px 1px rgba(160,90,0,.25)}
|
||
.gift2 .sb-row{border-top-color:rgba(200,150,60,.32)}
|
||
.gift2 .sb-row::before,.gift2 .sb-row::after{background:#FFF9EA}
|
||
.gift2 .unlock{background:#FFF0C8;color:#8A6A3A}
|
||
/* 2026-10-01 用户:兜豆兑好物是标题,字放大 */
|
||
.exch-wrap .es-main b{font-size:18px;letter-spacing:-.2px;line-height:1.25}
|
||
.exch-wrap .es-main{gap:3px}
|
||
|
||
/* ================= 盲盒横幅提亮(2026-10-01 用户:颜色和背景融在一起,不突出)=================
|
||
原来奶油粉→薰衣草,和上面橙色大图、米色页面底同一个明度,一眼找不到。
|
||
改成高饱和莓红→紫罗兰的深色条 + 白字 + 金色胶囊:和上面的珊瑚橙拉开色相,又同是暖粉一路,不突兀。 */
|
||
.bb-banner{color:#fff;border:0;
|
||
background:
|
||
radial-gradient(120px 80px at 88% -10%, rgba(255,214,110,.45), rgba(255,214,110,0) 70%),
|
||
linear-gradient(105deg,#FF4F7B 0%,#E0409A 48%,#8B5CF6 100%);
|
||
box-shadow:0 12px 26px rgba(214,64,140,.36),inset 0 0 0 1px rgba(255,255,255,.22)}
|
||
.bb-gift{background:radial-gradient(circle at 50% 58%,rgba(255,255,255,.95) 0,rgba(255,255,255,.55) 52%,rgba(255,255,255,0) 72%)}
|
||
.bb-t{color:#fff;text-shadow:0 1px 2px rgba(120,20,70,.3)}
|
||
.bb-s{color:rgba(255,255,255,.88)}
|
||
.bb-s b{color:#FFE27A}
|
||
.bb-cta,.bb-banner.is-calm .bb-cta{color:#9A2A5E;background:linear-gradient(180deg,#FFE88A,#FFC93C);
|
||
box-shadow:0 5px 12px rgba(120,20,70,.28),inset 0 -2px 0 rgba(210,140,0,.25)}
|
||
.bb-badge{box-shadow:0 0 0 2px #fff}
|
||
.bb-shine{background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.35),rgba(255,255,255,0))}
|
||
/* 2026-10-01 用户:slogan 要「规规矩矩的字体」→ 不用手写体,换系统黑体(苹方/微软雅黑),中等字重、略加字距 */
|
||
.hero-slogan{font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans SC",sans-serif;
|
||
font-size:13px;font-weight:500;letter-spacing:1.2px;opacity:.95}
|
||
|
||
/* ================= 首页「宝宝来信」卡(2026-10-02 二版)=================
|
||
用户:一版的航空斜纹边 + 邮戳 + 信纸横线太乱、和整页不协调。
|
||
二版收敛:白色磨砂卡 + 一圈很淡的粉边,左边信封落在一团浅粉圆底上(未读数气泡挂信封角),
|
||
标题用页面统一的黑体,只留一处品牌色:右侧「读读…›」。 */
|
||
.letter-card{padding:0 12px 0 10px;gap:10px;
|
||
background:linear-gradient(180deg,rgba(255,255,255,.97),rgba(255,248,246,.97));
|
||
box-shadow:0 10px 26px rgba(150,60,40,.15),inset 0 0 0 1px rgba(255,205,200,.55)}
|
||
.lc-envwrap{width:56px;height:56px;border-radius:50%;display:grid;place-items:center;
|
||
background:radial-gradient(circle at 50% 45%,#FFE9EC 0,#FFE1E4 60%,#FFD6DB 100%)}
|
||
.lc-env{width:46px;filter:drop-shadow(0 3px 5px rgba(200,90,90,.2))}
|
||
.letter-card.has-new .lc-env{animation:lcFloat 3.2s ease-in-out infinite}
|
||
@keyframes lcFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-2px)}}
|
||
.letter-card.has-new .lc-envwrap::after{display:none}
|
||
.lc-num{position:absolute;top:-2px;right:-3px;min-width:18px;height:18px;padding:0 5px;border-radius:9px;
|
||
font-size:10.5px;font-weight:800;line-height:18px;text-align:center;color:#fff;font-style:normal;
|
||
background:#F4593C;box-shadow:0 0 0 2px #fff}
|
||
.lc-num:empty{display:none}
|
||
.lc-stamp{display:none}
|
||
.lc-title{font-size:15.5px;font-weight:800;color:var(--ink);text-shadow:none}
|
||
.lc-desc{font-size:11.5px;color:#8A7A72;margin:3px 0 4px}
|
||
.lc-link{font-size:12px;color:var(--brand)}
|
||
@media (prefers-reduced-motion:reduce){.letter-card.has-new .lc-env{animation:none}}
|
||
|
||
/* ================= 去「胶囊雷同」(2026-10-02 用户截图:此刻 / 你今天还没数 / 孕30周 / 今日小知识 / 本周第3天
|
||
全是「彩底圆角胶囊」,一屏看下来同一种视觉、抓不住重点)=================
|
||
原则:一块里只留**一个**实心胶囊 = 真正要点的动作;其余标签降级成纯文字层级(颜色/字重/字号区分),不再加底色。
|
||
· 此刻:红色呼吸点 + 红字,去底色;整条去掉桃色底,改为工具区底部一条细分隔线下的「附注」
|
||
· 你今天还没数:保留实心(全块唯一 CTA)
|
||
· 孕30周:标题前的彩块改成品牌色大号数字「孕30周」+ 细竖线 + 标题
|
||
· 本周第3天:灰色纯文字
|
||
· 今日小知识:卡内角标改成小号字距文字「✦ 今日小知识」
|
||
· 7 天圆点:只有「今天」是实心圆,其余只留数字 */
|
||
.pulse{background:none;border-radius:0;margin-top:14px;padding:12px 2px 2px;border-top:1px solid rgba(200,150,130,.18)}
|
||
.pl-live{background:none;color:#F4593C;padding:0;font-size:12px;gap:6px;letter-spacing:.5px}
|
||
.pl-live i{width:6px;height:6px;background:#F4593C}
|
||
.pl-live i::after{border-color:#F4593C}
|
||
.pl-live::after{content:"";width:1px;height:12px;background:rgba(160,120,100,.3);margin-left:3px}
|
||
|
||
.pt-wk{background:none;box-shadow:none;padding:0;border-radius:0;color:var(--brand);font-size:17px;font-weight:900;letter-spacing:-.3px}
|
||
.pt-title{gap:8px}
|
||
.pt-title .pt-wk::after{content:"";display:inline-block;width:1px;height:14px;margin-left:8px;vertical-align:-1px;background:rgba(160,120,100,.35)}
|
||
.pt-when{background:none;padding:0;color:#A08C82;font-weight:600;font-size:12px}
|
||
|
||
.pt-badge{background:none;padding:0;border-radius:0;color:#E0603F;font-size:11.5px;font-weight:800;letter-spacing:1.5px}
|
||
.pt-badge::before{content:"✦ "}
|
||
|
||
.pt-day i,.pt-day.is-past i,.pt-day.is-lock i{background:none;box-shadow:none}
|
||
.pt-day.is-past i{color:#D0735A}
|
||
.pt-day.is-lock i{color:#D9C2B8}
|
||
.pt-day.is-sel:not(.is-today) i{background:none;color:#C24A30;text-decoration:underline;text-underline-offset:3px}
|
||
.pt-badge{display:inline-flex;align-items:center;gap:6px}
|
||
.pt-badge::before{content:"";width:6px;height:6px;border-radius:1.5px;background:#F4593C;transform:rotate(45deg)}
|
||
|
||
/* ================= 今日脚印 · 今日待办(2026-10-02)=================
|
||
今天一个工具都没用时:一张待办清单,每行 = 空心勾选框 + 一句要做的事(粗)+ 怎么做(细)+ 应用图标 + 「去完成」。 */
|
||
.fp2 .fp-todo{text-align:left;padding:14px 14px 12px}
|
||
.td-head{display:flex;align-items:baseline;gap:8px}
|
||
.td-head b{font-size:15px;font-weight:900;color:var(--ink)}
|
||
.td-cnt{font-size:12px;font-weight:700;color:#2FA57C;font-variant-numeric:tabular-nums}
|
||
.fp2 .td-lead{display:block;margin-top:4px;font-family:inherit;font-size:12.5px;font-weight:500;line-height:1.55;color:#6E8A7E}
|
||
.fp2 .td-list{display:flex;flex-direction:column;gap:0;margin-top:8px}
|
||
.td-row{display:flex;align-items:center;gap:10px;width:100%;padding:10px 0;border:0;background:none;font:inherit;text-align:left;
|
||
border-top:1px dashed rgba(90,160,130,.22)}
|
||
.td-row:first-child{border-top:0}
|
||
.td-box{flex:0 0 18px;width:18px;height:18px;border-radius:6px;border:2px solid #9BD3BA;background:#fff}
|
||
.td-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
|
||
.td-txt b{font-size:14px;font-weight:800;color:#3A2C27}
|
||
.td-txt em{font-style:normal;font-size:11.5px;color:#9A8A82;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.td-ico{flex:0 0 24px;width:24px;height:24px;border-radius:7px;object-fit:cover}
|
||
.td-go{flex:0 0 auto;font-size:12px;font-weight:800;color:#23946C}
|
||
.td-go::after{content:" ›"}
|
||
.td-row:active .td-box{background:#DDF3E9}
|
||
.fp2 .td-foot{display:block;margin-top:6px;padding-top:9px;border-top:1px solid rgba(90,160,130,.15);font-size:11.5px;color:#8FA89D;text-align:center}
|
||
|
||
/* ================= 首页「宝宝来信」卡 三版(2026-10-02 用户:二版太单薄,要简洁但有设计感)=================
|
||
结构:左侧一块玫瑰渐变「封口」色块,信封从色块里探出卡片上沿(有纵深);
|
||
右侧文字三行(标题 + 未读说明 + 读读…);最右一颗实心圆箭头。整卡只用玫瑰一种强调色。 */
|
||
.letter-card{gap:12px;padding:0 12px 0 0;overflow:visible;
|
||
background:#fff;box-shadow:0 14px 30px rgba(170,70,70,.18),0 2px 6px rgba(170,70,70,.06)}
|
||
.lc-envwrap{align-self:stretch;width:74px;height:auto;border-radius:20px 0 0 20px;display:block;position:relative;
|
||
background:linear-gradient(150deg,#FF8DA1 0%,#F25C7A 100%)}
|
||
.lc-envwrap::before{content:"";position:absolute;right:-10px;top:0;bottom:0;width:20px;border-radius:0 50% 50% 0/0 50% 50% 0;
|
||
background:inherit}
|
||
.lc-envwrap::after{content:"";position:absolute;inset:0;border-radius:20px 0 0 20px;pointer-events:none;
|
||
background:radial-gradient(60px 40px at 20% 100%,rgba(255,255,255,.28),rgba(255,255,255,0) 70%)}
|
||
.lc-env{position:absolute;left:8px;top:-14px;width:60px;z-index:1;filter:drop-shadow(0 6px 8px rgba(150,30,60,.3))}
|
||
.letter-card.has-new .lc-env{animation:lcFloat 3.2s ease-in-out infinite}
|
||
@keyframes lcFloat{0%,100%{transform:rotate(-8deg) translateY(0)}50%{transform:rotate(-4deg) translateY(-3px)}}
|
||
.lc-num{top:auto;bottom:8px;left:8px;right:auto;z-index:2;background:#fff;color:#E2456A;box-shadow:0 2px 6px rgba(150,30,60,.25);
|
||
font-size:11px;min-width:20px;height:20px;line-height:20px;border-radius:10px}
|
||
.lc-body{padding-left:6px}
|
||
.lc-title{font-size:16px;font-weight:900;color:var(--ink);letter-spacing:.2px}
|
||
.lc-desc{font-size:11.5px;color:#9A8880;margin:3px 0 3px}
|
||
.lc-link{font-size:12px;font-weight:700;color:#E2456A}
|
||
.lc-link i{display:none}
|
||
.lc-arrow{flex:0 0 30px;width:30px;height:30px;border-radius:50%;display:grid;place-items:center;color:#fff;
|
||
background:linear-gradient(135deg,#FF8DA1,#E2456A);box-shadow:0 5px 12px rgba(226,69,106,.32)}
|
||
@media (prefers-reduced-motion:reduce){.letter-card.has-new .lc-env{animation:none}}
|
||
.lc-envwrap{width:64px}
|
||
.lc-envwrap::before{display:none}
|
||
.lc-env{left:4px;top:-12px;width:56px}
|
||
.letter-card{gap:10px;padding-right:10px}
|
||
.lc-body{padding-left:0}
|
||
.lc-arrow{flex-basis:26px;width:26px;height:26px}
|
||
.lc-arrow svg{width:14px;height:14px}
|
||
.lc-env-v{left:9px;top:-10px;width:48px;height:36px;filter:drop-shadow(0 6px 8px rgba(150,30,60,.28))}
|
||
|
||
/* ================= 此刻 · 陪伴版 + 同周悄悄话(2026-10-02) =================
|
||
头像一排 7 个单独成行;「还没数」改成邀请式文字链;悄悄话是一条横滑的小纸条带,四种淡色轮换。 */
|
||
.pulse .pl-title{white-space:normal}
|
||
.pp-crowd{display:flex;align-items:center;gap:9px;margin-top:9px;min-width:0}
|
||
.pp-crowd .pp-avs i{width:24px;height:24px;margin-left:-8px;border:2px solid #fff;box-shadow:0 1px 3px rgba(120,70,50,.12)}
|
||
.pp-crowd .pp-avs i:first-child{margin-left:0}
|
||
.pp-crowd-t{flex:1;min-width:0;font-size:12.5px;color:var(--muted);line-height:1.35}
|
||
.pp-crowd-t b{font-size:14px;font-weight:800;color:var(--ink-2);font-variant-numeric:tabular-nums}
|
||
.pp-doing{margin-top:8px}
|
||
.pp-me{display:inline-flex;align-items:center;gap:5px;padding:0;background:none;border-radius:0;font-size:13px;font-weight:700}
|
||
.pp-me.todo{color:#E5533A;background:none}
|
||
.pp-me.todo i{display:grid;place-items:center;width:17px;height:17px;border-radius:50%;background:#FFE5DC}
|
||
.pp-me.todo i svg{width:11px;height:11px}
|
||
.pp-me.todo:active{opacity:.7;transform:none}
|
||
.pp-me.ok{color:#4E8A43;background:none;font-weight:600}
|
||
.pp-me.ok svg{width:15px;height:15px}
|
||
|
||
.pulse.has-wh .pl-feed{display:none}
|
||
.wh-wall.hide{display:none}
|
||
.wh-wall{margin-top:13px}
|
||
.wh-head{display:flex;align-items:center;justify-content:space-between;gap:10px}
|
||
.wh-t{font-size:14px;font-weight:800;color:var(--ink);display:flex;align-items:baseline;gap:7px;min-width:0}
|
||
.wh-t em{font-style:normal;font-size:11px;font-weight:500;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.wh-say{flex:0 0 auto;display:inline-flex;align-items:center;gap:4px;font:inherit;font-size:12.5px;font-weight:700;color:#E5533A;
|
||
background:none;border:0;padding:4px 0}
|
||
.wh-say::before{content:"";width:14px;height:14px;background:currentColor;
|
||
-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 12.5l.6-2.6 7-7a1.4 1.4 0 012 2l-7 7z' fill='none' stroke='black' stroke-width='1.6' stroke-linejoin='round'/%3E%3C/svg%3E") center/contain no-repeat;
|
||
mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 12.5l.6-2.6 7-7a1.4 1.4 0 012 2l-7 7z' fill='none' stroke='black' stroke-width='1.6' stroke-linejoin='round'/%3E%3C/svg%3E") center/contain no-repeat}
|
||
.wh-say:active{opacity:.6}
|
||
.wh-strip{display:flex;gap:10px;margin:9px -2px 0;padding:4px 2px 6px;overflow-x:auto;scroll-snap-type:x mandatory;
|
||
-webkit-overflow-scrolling:touch;scrollbar-width:none}
|
||
.wh-strip::-webkit-scrollbar{display:none}
|
||
.wh-card{position:relative;flex:0 0 172px;scroll-snap-align:start;display:flex;flex-direction:column;justify-content:space-between;
|
||
min-height:104px;padding:12px 12px 10px;border-radius:16px 16px 16px 5px;background:#FFF4EE}
|
||
.wh-card.t0{background:#FFF1EC}
|
||
.wh-card.t1{background:#F3F0FF}
|
||
.wh-card.t2{background:#FFF7E6}
|
||
.wh-card.t3{background:#EEF8F2}
|
||
.wh-card.mine{background:#fff;box-shadow:inset 0 0 0 1.5px #FFC9B8}
|
||
.wh-mine{position:absolute;top:-6px;right:10px;font-size:10px;font-weight:700;color:#fff;background:#F4593C;padding:2px 7px;border-radius:6px}
|
||
.wh-txt{font-size:14px;line-height:1.5;color:var(--ink);font-weight:600;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
|
||
.wh-txt::before{content:"“";color:#E8A08C;font-weight:800;margin-right:1px}
|
||
.wh-txt::after{content:"”";color:#E8A08C;font-weight:800;margin-left:1px}
|
||
.wh-meta{display:flex;align-items:center;justify-content:space-between;gap:6px;margin-top:9px;font-size:10.5px;color:var(--muted);white-space:nowrap}
|
||
.wh-hug{display:inline-flex;align-items:center;gap:3px;font:inherit;font-size:11px;font-weight:700;color:#C7837A;
|
||
background:rgba(255,255,255,.8);border:0;border-radius:999px;padding:3px 8px 3px 6px;transition:color .2s,background .2s}
|
||
.wh-hug svg,.wh-got svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2.2}
|
||
.wh-hug b{font-weight:800;font-variant-numeric:tabular-nums}
|
||
.wh-hug b:empty{display:none}
|
||
.wh-hug.on{color:#fff;background:#F4593C}
|
||
.wh-hug.on svg{fill:currentColor}
|
||
.wh-hug.pop svg{animation:whPop .6s var(--ease)}
|
||
@keyframes whPop{0%{transform:scale(1)}30%{transform:scale(1.5)}60%{transform:scale(.9)}100%{transform:scale(1)}}
|
||
.wh-got{display:inline-flex;align-items:center;gap:3px;color:#E5533A;font-weight:600}
|
||
.wh-got svg{fill:#F4593C;stroke:#F4593C}
|
||
.wh-got b{font-weight:800}
|
||
|
||
.wh-m-lead{margin-top:8px;font-size:13px;color:var(--muted);line-height:1.55}
|
||
.wh-ta-box{position:relative;margin-top:14px}
|
||
.wh-ta{display:block;width:100%;box-sizing:border-box;resize:none;font:inherit;font-size:15px;line-height:1.55;color:var(--ink);
|
||
padding:13px 15px 24px;border:1.5px solid #EADFD8;border-radius:16px;background:#fff}
|
||
.wh-ta:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(244,89,60,.12)}
|
||
.wh-cnt{position:absolute;right:12px;bottom:8px;font-size:11px;color:#C9B7AC;font-variant-numeric:tabular-nums}
|
||
.wh-m-sub{margin-top:14px;font-size:12px;font-weight:700;color:var(--ink-2)}
|
||
.wh-presets{display:flex;flex-wrap:wrap;gap:8px;margin-top:9px}
|
||
.wh-pre{font:inherit;font-size:12.5px;color:var(--ink-2);background:#fff;border:1px solid #EFE4DD;border-radius:12px;padding:7px 11px;text-align:left}
|
||
.wh-pre.on{color:#E5533A;border-color:#FFB7A3;background:#FFF3EE}
|
||
.wh-pre:active{transform:scale(.97)}
|
||
.wh-modal .modal-foot{margin-top:18px}
|
||
.wh-left{margin-top:8px;text-align:center;font-size:11.5px;color:var(--muted)}
|
||
@media (prefers-reduced-motion: reduce){.wh-hug.pop svg{animation:none}}
|
||
.wh-modal .modal-foot{flex-direction:column;align-items:stretch;gap:0}
|
||
|
||
/* ================= 来信卡 四版 + 盲盒横幅 素雅版(2026-10-02)=================
|
||
用户:「来信……简洁、素气一点,颜色不要太艳丽;盲盒……也不要太艳丽,有点太扎眼了」。
|
||
两条一起收:白底 + 一根很淡的暖色描边 + 低饱和陶土粉做唯一点缀;去掉大色块、渐变、发光和扫光,
|
||
动效只留盲盒礼物的轻摆(有可开的盒子时)。两张卡同一套语言,叠在一起像一组。 */
|
||
.letter-card{gap:12px;padding:12px 14px 12px 12px;overflow:hidden;background:#fff;
|
||
box-shadow:0 6px 18px rgba(120,80,60,.07),inset 0 0 0 1px #F1E6DF}
|
||
.lc-envwrap{align-self:center;flex:0 0 44px;width:44px;height:44px;border-radius:14px;background:#FAF1EC;display:grid;place-items:center}
|
||
.lc-envwrap::before,.lc-envwrap::after{display:none}
|
||
.lc-env,.lc-env-v{position:static;width:26px;height:20px;filter:none;animation:none!important;transform:none}
|
||
.lc-env-v rect{fill:none;stroke:#C98576;stroke-width:3.4}
|
||
.lc-env-v path{stroke:#C98576;stroke-width:3.4}
|
||
.lc-env-v path:nth-of-type(2){display:none}
|
||
.lc-env-v circle,.lc-env-v path:last-of-type{display:none}
|
||
.lc-num{position:absolute;top:-5px;right:-5px;bottom:auto;left:auto;min-width:17px;height:17px;line-height:17px;padding:0 4px;
|
||
border-radius:9px;font-size:10px;font-weight:700;color:#fff;background:#D9775F;box-shadow:0 0 0 2px #fff}
|
||
.lc-envwrap{position:relative}
|
||
.lc-body{padding-left:0}
|
||
.lc-title{font-size:15px;font-weight:700;color:var(--ink);letter-spacing:0}
|
||
.lc-desc{font-size:12px;color:#9C8F88;margin:3px 0 0}
|
||
.lc-link{display:none}
|
||
.lc-arrow{flex:0 0 auto;width:auto;height:auto;background:none;box-shadow:none;color:#C9BCB4;border-radius:0}
|
||
.lc-arrow svg{width:16px;height:16px}
|
||
|
||
.bb-banner{color:var(--ink);min-height:62px;padding:10px 14px 10px 12px;border:0;border-radius:20px;
|
||
background:#fff;box-shadow:0 6px 18px rgba(120,80,60,.07),inset 0 0 0 1px #F1E6DF}
|
||
.bb-gift{width:44px;height:44px;border-radius:14px;background:#FAF1EC}
|
||
.bb-gift svg{width:34px;height:34px;filter:saturate(.55) brightness(1.03)}
|
||
.bb-badge{left:40px;top:5px;background:#D9775F;box-shadow:0 0 0 2px #fff;animation:none;font-weight:700}
|
||
.bb-t{font-size:15px;font-weight:700;color:var(--ink);text-shadow:none;letter-spacing:0}
|
||
.bb-s{color:#9C8F88}
|
||
.bb-s b{color:#C96F58;font-weight:700}
|
||
.bb-cta,.bb-banner.is-calm .bb-cta{padding:6px 12px;font-size:12px;font-weight:700;color:#C2614A;background:#FBEEE8;box-shadow:none}
|
||
.bb-shine{display:none}
|
||
/* 四版:和下面的盲盒横幅同宽对齐(原来 249px 窄卡偏在右边,说明文字总被截断) */
|
||
.letter-card{width:auto;height:auto;min-height:68px;margin-left:26px;margin-right:26px;backdrop-filter:none;-webkit-backdrop-filter:none}
|
||
|
||
/* ================= 此刻 · 三改 + 同周悄悄话全屏页(2026-10-02)=================
|
||
用户:「此刻有一点点乱」→ 头像左、两行字右(人数 / 一句邀请),下面一条细入口;
|
||
悄悄话本身挪进 #whPage「深夜星河」全屏页。 */
|
||
.pp-crowd{align-items:center;gap:11px;margin-top:11px}
|
||
.pp-col{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
|
||
.pp-col .pp-crowd-t{font-size:12.5px}
|
||
.pp-col .pp-doing{margin:0}
|
||
.pp-col .pp-doing.hide{display:none}
|
||
.pp-col .pp-me{font-size:12.5px}
|
||
.pp-col .pp-me.todo i{width:15px;height:15px}
|
||
.pp-col .pp-me.todo i svg{width:10px;height:10px}
|
||
|
||
.wh-entry{display:flex;align-items:center;gap:10px;width:100%;margin-top:12px;padding:10px 12px 10px 10px;
|
||
border-radius:14px;background:linear-gradient(100deg,#2A2550 0%,#3E2F5E 60%,#53365F 100%);color:#fff;text-align:left;
|
||
box-shadow:0 6px 16px -8px rgba(52,36,92,.55);position:relative;overflow:hidden}
|
||
.wh-entry.hide{display:none}
|
||
.wh-entry::before{content:"";position:absolute;inset:0;pointer-events:none;opacity:.7;
|
||
background:radial-gradient(1px 1px at 22% 30%,#fff,transparent),radial-gradient(1px 1px at 61% 72%,#fff,transparent),
|
||
radial-gradient(1.2px 1.2px at 84% 22%,#fff,transparent),radial-gradient(1px 1px at 44% 14%,rgba(255,255,255,.7),transparent)}
|
||
.wh-entry:active{transform:scale(.985)}
|
||
.we-ico{flex:none;display:grid;place-items:center;width:32px;height:32px;border-radius:10px;background:rgba(255,255,255,.12);color:#FFD9A8}
|
||
.we-ico svg{width:18px;height:18px}
|
||
.we-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
|
||
.we-txt b{font-size:11px;font-weight:600;letter-spacing:1px;color:rgba(255,255,255,.6)}
|
||
.we-roll{font-size:13.5px;font-weight:600;color:#FFF4E8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:opacity .26s,transform .26s}
|
||
.we-roll.out{opacity:0;transform:translateY(5px)}
|
||
.we-go{flex:none;display:flex;align-items:center;gap:2px;font-size:12px;color:rgba(255,255,255,.72);font-variant-numeric:tabular-nums}
|
||
.we-go i{display:grid;width:14px;height:14px}
|
||
|
||
/* ---------- 全屏页 ---------- */
|
||
.wh-page{position:absolute;inset:0;z-index:110;color:#fff;overflow:hidden;
|
||
background:radial-gradient(120% 60% at 80% 0%,#5A3B72 0%,transparent 60%),radial-gradient(90% 50% at 0% 100%,#4A2C55 0%,transparent 70%),linear-gradient(180deg,#191634 0%,#221C40 45%,#2C1F45 100%);
|
||
opacity:0;visibility:hidden;transform:scale(1.04);transition:opacity .4s var(--ease),transform .5s var(--ease),visibility .4s}
|
||
.wh-page.show{opacity:1;visibility:visible;transform:none}
|
||
.whp-sky{position:absolute;inset:0;pointer-events:none}
|
||
.whp-sky i.s1,.whp-sky i.s2,.whp-sky i.s3{position:absolute;inset:0;animation:whTw 5s ease-in-out infinite alternate}
|
||
.whp-sky i.s1{background:radial-gradient(1.2px 1.2px at 12% 18%,#fff,transparent),radial-gradient(1px 1px at 35% 8%,#fff,transparent),radial-gradient(1.4px 1.4px at 72% 14%,#fff,transparent),radial-gradient(1px 1px at 90% 40%,#fff,transparent),radial-gradient(1px 1px at 8% 62%,#fff,transparent),radial-gradient(1.2px 1.2px at 55% 88%,#fff,transparent)}
|
||
.whp-sky i.s2{animation-delay:-2s;background:radial-gradient(1px 1px at 25% 34%,#fff,transparent),radial-gradient(1.3px 1.3px at 64% 46%,#fff,transparent),radial-gradient(1px 1px at 84% 70%,#fff,transparent),radial-gradient(1px 1px at 18% 84%,#fff,transparent),radial-gradient(1.5px 1.5px at 46% 24%,#FFE2B8,transparent)}
|
||
.whp-sky i.s3{animation-delay:-3.5s;opacity:.6;background:radial-gradient(1px 1px at 5% 30%,#fff,transparent),radial-gradient(1px 1px at 40% 58%,#fff,transparent),radial-gradient(1px 1px at 77% 30%,#fff,transparent),radial-gradient(1px 1px at 95% 92%,#fff,transparent),radial-gradient(1px 1px at 30% 96%,#fff,transparent)}
|
||
.whp-sky i.moon{position:absolute;top:58px;right:-36px;width:150px;height:150px;border-radius:50%;
|
||
background:radial-gradient(circle at 35% 35%,#FFE9C9 0%,#F6C893 45%,rgba(246,200,147,0) 72%);opacity:.28;filter:blur(2px)}
|
||
@keyframes whTw{from{opacity:.35}to{opacity:1}}
|
||
.whp-scroll{position:absolute;inset:0;overflow-y:auto;padding:calc(env(safe-area-inset-top) + 10px) 20px 150px;-webkit-overflow-scrolling:touch}
|
||
.whp-scroll::-webkit-scrollbar{display:none}
|
||
.whp-top{display:flex;align-items:center;justify-content:space-between;height:44px}
|
||
.whp-back{display:grid;place-items:center;width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,.1);color:#fff;backdrop-filter:blur(6px)}
|
||
.whp-tag{font-size:11.5px;padding:5px 10px;border-radius:99px;background:rgba(255,255,255,.08);color:rgba(255,255,255,.7);letter-spacing:.5px}
|
||
.whp-title{margin:26px 0 0;font-size:40px;line-height:1.12;font-weight:800;letter-spacing:1px;color:#fff}
|
||
.whp-title b{font-size:56px;font-weight:900;background:linear-gradient(120deg,#FFE3B5,#FF9E8A);-webkit-background-clip:text;background-clip:text;color:transparent;font-variant-numeric:tabular-nums;margin:0 2px}
|
||
.whp-sub{margin:12px 0 0;font-size:13px;line-height:1.7;color:rgba(255,255,255,.55)}
|
||
.whp-hero{position:relative;margin:34px 0 8px;padding:26px 22px 18px;border-radius:24px;
|
||
background:linear-gradient(150deg,rgba(255,226,190,.16),rgba(255,160,140,.06));border:1px solid rgba(255,226,190,.22);
|
||
box-shadow:0 20px 50px -20px rgba(255,170,130,.35)}
|
||
.whp-hero:empty{display:none}
|
||
.whp-hero::before{content:"“";position:absolute;top:-30px;left:14px;font-size:96px;line-height:1;font-family:Georgia,serif;color:#FFD9A8;opacity:.9}
|
||
.whp-hq{font-size:25px;line-height:1.45;font-weight:800;color:#FFF4E6;letter-spacing:.5px}
|
||
.whp-flow{display:flex;flex-direction:column;gap:14px;margin-top:22px}
|
||
.whp-b{position:relative;max-width:82%;padding:14px 16px 10px;border-radius:20px;
|
||
background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.1);backdrop-filter:blur(8px);
|
||
animation:whIn .6s var(--ease) both,whBob 6s ease-in-out infinite;animation-delay:calc(var(--i) * 60ms),var(--d)}
|
||
.whp-b.a{align-self:flex-start;border-bottom-left-radius:6px}
|
||
.whp-b.b{align-self:flex-end;border-bottom-right-radius:6px}
|
||
.whp-b.c{align-self:flex-start;margin-left:9%;border-bottom-left-radius:6px}
|
||
.whp-b p{margin:0;font-size:15px;line-height:1.55;color:rgba(255,255,255,.82);font-weight:500}
|
||
.whp-b.l2{background:rgba(255,255,255,.11);border-color:rgba(255,255,255,.16)}
|
||
.whp-b.l2 p{font-size:16.5px;color:#fff;font-weight:600}
|
||
.whp-b.l3{background:linear-gradient(140deg,rgba(255,180,160,.2),rgba(190,150,255,.14));border-color:rgba(255,200,180,.25);box-shadow:0 10px 30px -14px rgba(255,150,130,.5)}
|
||
.whp-b.l3 p{font-size:18px;color:#fff;font-weight:700}
|
||
.whp-b.mine{align-self:flex-end;max-width:86%;background:linear-gradient(140deg,rgba(255,214,150,.26),rgba(255,170,110,.14));border-color:rgba(255,214,150,.45);box-shadow:0 0 0 4px rgba(255,214,150,.06),0 12px 34px -12px rgba(255,190,120,.55)}
|
||
.whp-b.mine p{color:#FFF1DC;font-weight:700;font-size:16.5px}
|
||
.whp-mine{display:inline-block;margin-bottom:6px;font-size:10.5px;font-weight:700;letter-spacing:1px;padding:2px 8px;border-radius:99px;background:#FFD596;color:#5A3714}
|
||
@keyframes whIn{from{opacity:0;transform:translateY(16px)}}
|
||
@keyframes whBob{0%,100%{translate:0 0}50%{translate:0 -4px}}
|
||
.whp-meta{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px;font-size:11.5px;color:rgba(255,255,255,.45)}
|
||
.whp-hero .whp-meta{margin-top:18px;font-size:12px}
|
||
.whp-hug{position:relative;display:inline-flex;align-items:center;gap:4px;height:28px;padding:0 11px;border-radius:99px;background:rgba(255,255,255,.1);color:rgba(255,255,255,.85);font-size:12.5px;font-weight:700;font-variant-numeric:tabular-nums}
|
||
.whp-hug svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2}
|
||
.whp-hug b:empty{display:none}
|
||
.whp-hug.on{background:linear-gradient(120deg,#FF8E7A,#FF6F91);color:#fff}
|
||
.whp-hug.on svg{fill:#fff;stroke:#fff}
|
||
.whp-hug.pop svg{animation:whBeat .5s var(--ease)}
|
||
@keyframes whBeat{30%{transform:scale(1.5)}60%{transform:scale(.9)}}
|
||
.whp-got{display:inline-flex;align-items:center;gap:4px;color:#FFD596;font-weight:600}
|
||
.whp-got svg{width:13px;height:13px;fill:#FFD596}
|
||
.whp-fly{position:absolute;left:50%;bottom:60%;width:14px;height:14px;margin-left:-7px;pointer-events:none;animation:whFly 1.1s ease-out both}
|
||
.whp-fly svg{width:100%;height:100%;fill:#FF8FA3}
|
||
@keyframes whFly{from{opacity:1;transform:translate(0,0) scale(.6)}to{opacity:0;transform:translate(var(--x),-70px) rotate(var(--r)) scale(1.1)}}
|
||
.whp-end{margin:36px 0 0;text-align:center;font-size:11.5px;letter-spacing:2px;color:rgba(255,255,255,.3)}
|
||
.whp-bar{position:absolute;left:0;right:0;bottom:0;padding:30px 24px calc(14px + env(safe-area-inset-bottom));text-align:center;
|
||
background:linear-gradient(180deg,rgba(28,22,52,0),rgba(28,22,52,.92) 45%)}
|
||
.whp-say{position:relative;width:100%;height:52px;border-radius:99px;font-size:16px;font-weight:800;letter-spacing:2px;color:#3A2312;
|
||
background:linear-gradient(110deg,#FFE3B5,#FFB48F 55%,#FF9AA6);box-shadow:0 10px 30px -8px rgba(255,160,130,.7),inset 0 1px 0 rgba(255,255,255,.6)}
|
||
.whp-say::after{content:"";position:absolute;inset:-6px;border-radius:inherit;border:1.5px solid rgba(255,200,160,.5);animation:whRing 2.6s ease-out infinite}
|
||
@keyframes whRing{from{opacity:.9;transform:scale(.96)}to{opacity:0;transform:scale(1.08)}}
|
||
.whp-say:active{transform:scale(.98)}
|
||
.whp-left{margin:9px 0 0;font-size:11.5px;color:rgba(255,255,255,.5)}
|
||
@media (prefers-reduced-motion:reduce){
|
||
.whp-b,.whp-sky i,.whp-say::after{animation:none!important}
|
||
.wh-page{transition:opacity .2s}
|
||
}
|
||
.whp-say{display:grid;place-items:center;text-align:center;padding:0}
|
||
|
||
/* ================= 盲盒挪到页底 + 来信卡居中短版(2026-10-02)=================
|
||
用户:「盲盒放到首页下边,给一个位置就行,不用太明显;宝宝来信不要太长,居中展示」。 */
|
||
.home-body>.bb-banner{margin:22px 0 6px;min-height:52px;padding:8px 12px 8px 8px;gap:10px;border-radius:16px;
|
||
background:rgba(255,255,255,.6);box-shadow:inset 0 0 0 1px #F1E6DF}
|
||
.home-body>.bb-banner .bb-gift{width:36px;height:36px;border-radius:11px}
|
||
.home-body>.bb-banner .bb-gift svg{width:26px;height:26px;animation:none}
|
||
.home-body>.bb-banner .bb-badge{left:32px;top:3px}
|
||
.home-body>.bb-banner .bb-t{font-size:13.5px;font-weight:600}
|
||
.home-body>.bb-banner .bb-s{font-size:11.5px}
|
||
.home-body>.bb-banner .bb-cta{padding:0;background:none;font-size:12px;font-weight:600;color:#B7A69C}
|
||
.home-body>.bb-banner .bb-cta::after{content:" ›"}
|
||
|
||
.letter-card{width:fit-content;max-width:calc(100% - 64px);min-width:236px;margin-left:auto;margin-right:auto;
|
||
min-height:58px;padding:9px 14px 9px 9px;gap:10px;border-radius:18px}
|
||
.letter-card .lc-envwrap{flex-basis:38px;width:38px;height:38px;border-radius:12px}
|
||
.letter-card .lc-env-v{width:22px;height:17px}
|
||
.letter-card .lc-body{flex:0 1 auto}
|
||
.letter-card .lc-title{font-size:14.5px}
|
||
.letter-card .lc-desc{font-size:11.5px;max-width:170px}
|
||
|
||
/* ================= 标题去红 + 来信卡再短(2026-10-02)=================
|
||
用户:「孕 30 周的颜色不要变成红色,统一一下标题的颜色……整体页面的红色太多了,反而不突出」。
|
||
首页各模块标题里的孕周/数字一律跟标题同色(墨色),红色只留给真正要点的按钮和角标。 */
|
||
.pt-wk,.gift2 .sh-title [data-wk],.pulse .pl-title b{color:var(--ink)}
|
||
.pt-title .pt-wk::after{background:rgba(120,100,90,.3)}
|
||
.letter-card{min-width:0;max-width:250px}
|
||
.letter-card .lc-desc{max-width:150px}
|
||
/* 「此刻」两个字也回墨色,只留前面那颗跳动的小红点表示“正在发生” */
|
||
.pl-live{color:var(--ink)}
|
||
/* 兜豆图标换成统一的豆形金币(2026-10-02,「母婴作图」会话提供 assets/img/dou-coin.svg) */
|
||
.es-coin img{display:block;width:36px;height:36px}
|
||
|
||
/* ================= 兜豆兑好物:拆掉内层粉卡,和其它模块一样铺平(2026-10-02)=================
|
||
用户:「这个模块两边有空隙,别的模块是铺平的,保持一致」。原来是白色外壳里再套一张带阴影的粉卡,
|
||
左右各缩进 26px+6px;现在内层不再画底色/阴影/圆角,标题与「孕育工具」「孕期小知识」同一条 26px 栏线,
|
||
商品横滑像福利书架一样出血到屏幕边缘。 */
|
||
.exch-wrap .exch-mod{padding:0;border-radius:0;background:none;box-shadow:none}
|
||
.exch-wrap .exch-mod .exch-strip{padding:2px 0 4px}
|
||
.exch-wrap .ex-goods{margin:8px -26px 0;padding:6px 26px 4px;scroll-padding-left:26px}
|
||
.exch-wrap .ex-it{background:#FFF6F3;box-shadow:inset 0 0 0 1px #F6E6E0}
|
||
|
||
/* 好物价格:小金币 + 1,800 + 兜豆(对齐兜豆商城「本场好物」.price 的写法) */
|
||
.gi-pr{display:flex;align-items:center;gap:3px;margin-top:1px}
|
||
.gi-pr .gi-coin{flex:none;width:15px;height:15px;background:url(assets/img/dou-coin.svg?v=20261002) center/contain no-repeat}
|
||
.gi-pr span{font-family:"DIN Alternate","DIN Condensed","Bahnschrift","Arial Rounded MT Bold",Arial,sans-serif;font-variant-numeric:tabular-nums;letter-spacing:-.02em;font-size:15px;font-weight:800;color:var(--ink)}
|
||
.gi-pr small{font-size:10.5px;font-weight:600;color:var(--ink);opacity:.55}
|
||
|
||
/* ---------- 同孕周悄悄话 · 三改:星图 + 聚焦卡 + 清单(2026-10-02)----------
|
||
配色不变(用户:「配色没问题」),只换呈现:人多时不再是一堆左右乱飘、大小不一的气泡。 */
|
||
.whp-title{margin-top:18px;font-size:28px;line-height:1.2}
|
||
.whp-title b{font-size:40px}
|
||
.whp-sub{margin-top:8px;font-size:12.5px}
|
||
.whp-sky2{position:relative;height:190px;margin:18px -6px 0}
|
||
.whs-lines{position:absolute;inset:0;width:100%;height:100%;overflow:visible}
|
||
.whs-lines polyline{fill:none;stroke:rgba(255,226,190,.22);stroke-width:1;vector-effect:non-scaling-stroke;stroke-dasharray:3 4}
|
||
.whs-star{position:absolute;width:36px;height:36px;margin:-18px 0 0 -18px;display:grid;place-items:center;border-radius:50%}
|
||
.whs-star i{display:block;width:var(--s);height:var(--s);border-radius:50%;background:#FFF6E6;
|
||
box-shadow:0 0 calc(var(--s) * .8) calc(var(--s) * .2) rgba(255,226,190,.55);animation:whTw2 3.2s ease-in-out infinite alternate;animation-delay:calc(var(--tw) * -1)}
|
||
.whs-star.mine i{background:#FFD596;box-shadow:0 0 14px 4px rgba(255,200,120,.7)}
|
||
.whs-star.on i{background:#fff;animation:none;box-shadow:0 0 0 3px rgba(255,255,255,.18),0 0 18px 6px rgba(255,214,170,.75)}
|
||
.whs-star.on::after{content:"";position:absolute;inset:2px;border-radius:50%;border:1.5px solid rgba(255,226,190,.7);animation:whRing 2s ease-out infinite}
|
||
@keyframes whTw2{from{opacity:.55;transform:scale(.85)}to{opacity:1;transform:scale(1)}}
|
||
.whp-focus{position:relative;margin-top:14px;padding:16px 18px 14px;border-radius:22px;min-height:150px;
|
||
background:linear-gradient(150deg,rgba(255,226,190,.16),rgba(255,160,140,.06));border:1px solid rgba(255,226,190,.22);
|
||
box-shadow:0 20px 50px -20px rgba(255,170,130,.35)}
|
||
.whp-focus:empty{display:none}
|
||
.whf-top{display:flex;align-items:center;justify-content:space-between}
|
||
.whf-no{font-size:11px;letter-spacing:1px;color:rgba(255,226,190,.7);font-variant-numeric:tabular-nums}
|
||
.whf-no em,.whl-t em{font-style:normal;display:inline-block;margin-right:6px;font-size:10.5px;font-weight:700;letter-spacing:1px;padding:1px 7px;border-radius:99px;background:#FFD596;color:#5A3714;vertical-align:1px}
|
||
.whf-nav{display:flex;gap:6px}
|
||
.whf-nav button{width:28px;height:28px;border-radius:50%;background:rgba(255,255,255,.08);color:rgba(255,255,255,.75);font-size:18px;line-height:26px}
|
||
.whf-q{margin:12px 0 0;font-size:23px;line-height:1.45;font-weight:800;color:#FFF4E6;letter-spacing:.5px;min-height:66px}
|
||
.whf-q.in{animation:whFq .45s var(--ease) both}
|
||
@keyframes whFq{from{opacity:0;transform:translateY(8px);filter:blur(3px)}}
|
||
.whp-focus .whp-meta{margin-top:12px}
|
||
.whp-lh{display:flex;align-items:baseline;justify-content:space-between;margin:30px 2px 4px}
|
||
.whp-lh b{font-size:15px;font-weight:700;color:rgba(255,255,255,.9);letter-spacing:1px}
|
||
.whp-lh span{font-size:11.5px;color:rgba(255,255,255,.4)}
|
||
.whp-list{display:flex;flex-direction:column}
|
||
.whl{position:relative;padding:14px 0 12px 16px;border-bottom:1px solid rgba(255,255,255,.07)}
|
||
.whl::before{content:"";position:absolute;left:2px;top:22px;width:5px;height:5px;border-radius:50%;background:rgba(255,246,230,.45)}
|
||
.whl.l2::before{background:rgba(255,246,230,.8);box-shadow:0 0 6px rgba(255,226,190,.6)}
|
||
.whl.l3::before{width:7px;height:7px;left:1px;top:21px;background:#fff;box-shadow:0 0 10px 2px rgba(255,214,170,.8)}
|
||
.whl.mine{margin:6px 0;padding-right:12px;border-radius:16px;border-bottom:0;background:linear-gradient(140deg,rgba(255,214,150,.18),rgba(255,170,110,.08));box-shadow:inset 0 0 0 1px rgba(255,214,150,.35)}
|
||
.whl.mine::before{left:6px;background:#FFD596;box-shadow:0 0 8px rgba(255,200,120,.8)}
|
||
.whl.mine .whl-t{padding-left:4px}
|
||
.whl-t{display:block;width:100%;text-align:left;font-size:15.5px;line-height:1.55;font-weight:500;color:rgba(255,255,255,.86)}
|
||
.whl.l3 .whl-t,.whl.mine .whl-t{font-weight:700;color:#fff}
|
||
.whl .whp-meta{margin-top:6px}
|
||
.whl .whp-hug{height:26px;padding:0 10px;font-size:12px}
|
||
@media (prefers-reduced-motion:reduce){.whs-star i,.whs-star.on::after,.whf-q.in{animation:none!important}}
|
||
.whf-nav button{display:grid;place-items:center;padding:0;line-height:1}
|
||
|
||
/* ================= 「记一下」弹窗加厚(2026-10-02)=================
|
||
用户:「点记一下那个弹窗……现在有点单薄」。标题下加日期孕周;宫格上面加「今天卡」和「先记这件」两张大卡。 */
|
||
.sheet-head p.sk-sub{margin-top:6px;font-size:13px;color:#9C8F88;letter-spacing:.2px}
|
||
.sk-today{display:flex;align-items:center;gap:14px;margin:0 4px;padding:14px 16px;border-radius:20px;
|
||
background:linear-gradient(120deg,#FFF3EC,#FDEEF0);box-shadow:inset 0 0 0 1px #F6E2DA}
|
||
.sk-today.hide,.sk-next.hide{display:none}
|
||
.sk-ring{position:relative;flex:none;width:52px;height:52px}
|
||
.sk-ring svg{width:100%;height:100%;transform:rotate(-90deg)}
|
||
.sk-ring circle{fill:none;stroke:#F6DED5;stroke-width:4.5}
|
||
.sk-ring .sk-arc{stroke:#E8836B;stroke-linecap:round;stroke-dasharray:0 113.1;transition:stroke-dasharray .8s var(--ease)}
|
||
.sk-ring b{position:absolute;inset:0;display:grid;place-items:center;font-size:18px;font-weight:800;color:var(--ink);font-variant-numeric:tabular-nums}
|
||
.sk-tt{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}
|
||
.sk-tt>b{font-size:15.5px;font-weight:700;color:var(--ink)}
|
||
.sk-tt>span{display:flex;flex-wrap:wrap;gap:5px;font-size:12px;color:#9C8F88;line-height:1.5}
|
||
.sk-tt>span i{font-style:normal;font-size:11.5px;font-weight:600;color:#B0604C;background:#fff;padding:2px 8px 2px 18px;border-radius:99px;position:relative}
|
||
.sk-tt>span i::before{content:"";position:absolute;left:7px;top:50%;width:6px;height:3px;margin-top:-3px;border:solid #E8836B;border-width:0 0 1.6px 1.6px;transform:rotate(-45deg)}
|
||
.sk-next .apps-head{margin-top:20px;margin-bottom:10px}
|
||
.sk-hint{margin-left:8px;font-size:12px;font-weight:500;color:#B7A69C}
|
||
.sk-cards{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:0 4px}
|
||
.sk-card{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:3px;min-height:128px;padding:14px 14px 12px;border-radius:20px;text-align:left;
|
||
background:#fff;box-shadow:0 6px 18px rgba(120,80,60,.07),inset 0 0 0 1px #F1E6DF;overflow:hidden}
|
||
.sk-card.c0{background:linear-gradient(160deg,#FFF6F0,#fff 70%)}
|
||
.sk-card.c1{background:linear-gradient(160deg,#F3F6FF,#fff 70%)}
|
||
.sk-card img,.sk-card .sk-l{width:38px;height:38px;border-radius:12px;object-fit:contain;margin-bottom:6px}
|
||
.sk-card .sk-l{display:grid;place-items:center;background:#F4E5DE;color:#B0604C;font-weight:800}
|
||
.sk-card b{font-size:14.5px;font-weight:700;color:var(--ink);line-height:1.3}
|
||
.sk-card em{font-style:normal;font-size:11.5px;line-height:1.45;color:#9C8F88;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
|
||
.sk-go{margin-top:auto;padding-top:8px;font-size:12px;font-weight:700;color:#C2614A}
|
||
.sk-card:active{transform:scale(.98)}
|
||
/* 宫格:今天用过的打个小勾 */
|
||
.apps-grid .app{position:relative}
|
||
.apps-grid .app.is-done::after{content:"";position:absolute;top:-3px;right:calc(50% - 33px);width:18px;height:18px;border-radius:50%;
|
||
background:#5BB58A url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 8.3l2.6 2.5L12 5.4' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/12px no-repeat;box-shadow:0 0 0 2px #FAF5F1}
|
||
.apps-head.for-all{margin-top:22px}
|
||
|
||
/* 今日待办:前面的勾选框换成线性图标(墨绿线稿 + 浅薄荷底,和脚印卡的绿底同色系) */
|
||
.td-li{flex:0 0 36px;width:36px;height:36px;display:grid;place-items:center;border-radius:11px;
|
||
background:#E6F4EC;color:#2F8F68;box-shadow:inset 0 0 0 1px #CFE9DB}
|
||
.td-li svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
|
||
.td-row{gap:12px}
|
||
.td-row:active .td-li{background:#D5EEE1}
|
||
.td-li svg{width:22px;height:22px}
|
||
|
||
/* ===== 2026-10-02 悄悄话全屏页 · 四改:一屏一句竖滑沉浸式 ===== */
|
||
.whv-aura{position:absolute;inset:0;pointer-events:none;overflow:hidden}
|
||
.whv-aura i{position:absolute;width:120vw;height:120vw;max-width:560px;max-height:560px;border-radius:50%;filter:blur(70px);opacity:.55;
|
||
transition:background-color 1.2s ease;animation:whvDrift 14s ease-in-out infinite alternate}
|
||
.whv-aura i:first-child{left:-35%;top:8%}
|
||
.whv-aura i:last-child{right:-40%;bottom:6%;animation-delay:-7s;opacity:.45}
|
||
@keyframes whvDrift{from{transform:translate(0,0) scale(1)}to{transform:translate(12%,-8%) scale(1.15)}}
|
||
.wh-page .whp-sky i.moon{opacity:.5}
|
||
.whv-top{position:absolute;left:0;right:0;top:0;z-index:3;display:flex;align-items:center;gap:10px;padding:calc(12px + env(safe-area-inset-top)) 16px 10px;
|
||
background:linear-gradient(rgba(20,14,40,.55),transparent)}
|
||
.whv-bars{flex:1;display:flex;gap:3px;transition:opacity .3s}
|
||
.whv-bars.hide{opacity:0}
|
||
.whv-bars i{flex:1;height:3px;border-radius:2px;background:rgba(255,255,255,.18);overflow:hidden;position:relative}
|
||
.whv-bars i.done{background:rgba(255,255,255,.7)}
|
||
.whv-bars i.on{background:linear-gradient(90deg,#FFD9A8,#FF9E8A);box-shadow:0 0 6px rgba(255,190,150,.8)}
|
||
.whv-all{margin-left:auto;height:30px;padding:0 13px;border-radius:99px;background:rgba(255,255,255,.12);color:#fff;font-size:12.5px;font-weight:700;backdrop-filter:blur(6px)}
|
||
.whv{position:absolute;inset:0;z-index:1;overflow-y:auto;scroll-snap-type:y mandatory;overscroll-behavior:contain;scrollbar-width:none;-webkit-overflow-scrolling:touch}
|
||
.whv::-webkit-scrollbar{display:none}
|
||
.whv-s{position:relative;height:100%;scroll-snap-align:start;scroll-snap-stop:always;display:flex;align-items:center;
|
||
padding:70px 84px 130px 28px;box-sizing:border-box;user-select:none;-webkit-user-select:none}
|
||
.whv-in{width:100%}
|
||
.whv-cover,.whv-end{padding-right:28px}
|
||
.whv-cover{align-items:flex-start;padding-top:calc(64px + env(safe-area-inset-top))}
|
||
.whv-ct{margin-top:18px;font-size:34px;line-height:1.25;font-weight:900;letter-spacing:1px}
|
||
.whv-ct b{font-size:64px;font-family:"DIN Alternate","DIN",Helvetica,Arial,sans-serif;background:linear-gradient(120deg,#FFE2B8,#FF9E8A);-webkit-background-clip:text;background-clip:text;color:transparent}
|
||
.whv-ct.sm{font-size:28px}
|
||
.whv-cover .whp-sky2{height:200px;margin:14px -8px 0}
|
||
.whv-down{display:flex;flex-direction:column;align-items:center;gap:6px;margin-top:6px;font-size:12px;color:rgba(255,255,255,.6);letter-spacing:2px}
|
||
.whv-down i{width:18px;height:18px;border:solid rgba(255,255,255,.7);border-width:2px 2px 0 0;transform:rotate(-45deg);animation:whvUp 1.6s ease-in-out infinite}
|
||
@keyframes whvUp{0%,100%{transform:translateY(4px) rotate(-45deg);opacity:.4}50%{transform:translateY(-4px) rotate(-45deg);opacity:1}}
|
||
.whv-no{display:flex;align-items:baseline;gap:6px;font-family:"DIN Alternate","DIN",Helvetica,Arial,sans-serif;color:rgba(255,255,255,.45);letter-spacing:1px}
|
||
.whv-no b{font-size:22px;color:rgba(255,226,190,.9)}
|
||
.whv-no span{font-size:13px}
|
||
.whv-no em{margin-left:6px;font-style:normal;font-family:inherit;font-size:11.5px;font-weight:800;padding:3px 9px;border-radius:99px;background:#FFD596;color:#5A3510;letter-spacing:0}
|
||
.whv-q{margin:18px 0 0;font-weight:900;line-height:1.35;letter-spacing:1px;text-shadow:0 2px 24px rgba(0,0,0,.25)}
|
||
.whv-q.xl{font-size:40px}.whv-q.l{font-size:32px}.whv-q.m{font-size:26px}
|
||
.whv-q span{display:inline-block;opacity:0;filter:blur(8px);transform:translateY(10px)}
|
||
.whv-s.on .whv-q span{animation:whvCh .6s cubic-bezier(.2,.8,.2,1) forwards;animation-delay:calc(var(--c) * 55ms + 120ms)}
|
||
@keyframes whvCh{to{opacity:1;filter:blur(0);transform:none}}
|
||
.whv-s.mine .whv-q{background:linear-gradient(120deg,#FFF1D6,#FFC48A);-webkit-background-clip:text;background-clip:text;color:transparent;text-shadow:none}
|
||
.whv-meta{margin-top:18px;font-size:13px;color:rgba(255,255,255,.6);opacity:0;transition:opacity .6s .5s}
|
||
.whv-tip{display:inline-block;margin-top:22px;font-size:11.5px;padding:5px 11px;border-radius:99px;background:rgba(255,255,255,.08);color:rgba(255,255,255,.6);opacity:0;transition:opacity .6s 1s}
|
||
.whv-s.on .whv-meta,.whv-s.on .whv-tip{opacity:1}
|
||
.whv-rail{position:absolute;right:16px;bottom:150px;display:flex;flex-direction:column;align-items:center;gap:6px}
|
||
.whv-hug.whp-hug{flex-direction:column;justify-content:center;width:58px;height:58px;padding:0;gap:0;border-radius:50%;background:rgba(255,255,255,.12);backdrop-filter:blur(8px);box-shadow:inset 0 0 0 1px rgba(255,255,255,.15)}
|
||
.whv-hug.whp-hug svg{width:26px;height:26px}
|
||
.whv-hug.whp-hug b{font-size:11.5px;line-height:1.1}
|
||
.whv-hug.whp-hug.on{box-shadow:0 6px 22px rgba(255,111,145,.5)}
|
||
.whv-hl,.whv-got small{font-size:11px;color:rgba(255,255,255,.55)}
|
||
.whv-got{display:flex;flex-direction:column;align-items:center;gap:2px;color:#FFD596}
|
||
.whv-got svg{width:30px;height:30px;fill:#FFD596;filter:drop-shadow(0 0 10px rgba(255,200,120,.8))}
|
||
.whv-got b{font-size:18px;font-family:"DIN Alternate","DIN",Helvetica,Arial,sans-serif}
|
||
.whv-big{position:absolute;z-index:5;width:96px;height:96px;margin:-48px 0 0 -48px;pointer-events:none;animation:whvBig .9s cubic-bezier(.2,.8,.2,1) forwards}
|
||
.whv-big svg{width:100%;height:100%;fill:#FF6F91;filter:drop-shadow(0 0 18px rgba(255,111,145,.8))}
|
||
@keyframes whvBig{0%{transform:scale(.2) rotate(-12deg);opacity:0}25%{transform:scale(1.15) rotate(6deg);opacity:1}55%{transform:scale(1)}100%{transform:translateY(-70px) scale(1.3);opacity:0}}
|
||
.whd{position:absolute;inset:0;z-index:6;background:rgba(10,6,24,.5);opacity:0;visibility:hidden;transition:opacity .3s,visibility .3s}
|
||
.whd.show{opacity:1;visibility:visible}
|
||
.whd-panel{position:absolute;left:0;right:0;bottom:0;max-height:72%;overflow-y:auto;padding:18px 20px calc(20px + env(safe-area-inset-bottom));border-radius:22px 22px 0 0;
|
||
background:linear-gradient(#2A1F48,#1E1634);box-shadow:0 -10px 40px rgba(0,0,0,.4);transform:translateY(100%);transition:transform .35s cubic-bezier(.2,.8,.2,1)}
|
||
.whd.show .whd-panel{transform:none}
|
||
.whd-head{display:flex;align-items:baseline;gap:10px;margin-bottom:4px}
|
||
.whd-head b{font-size:17px}
|
||
.whd-head span{font-size:12px;color:rgba(255,255,255,.5)}
|
||
.whd-x{margin-left:auto;width:30px;height:30px;border-radius:50%;background:rgba(255,255,255,.1);color:#fff;font-size:13px}
|
||
.wh-page .whp-bar{z-index:2}
|
||
@media (prefers-reduced-motion:reduce){
|
||
.whv-aura i,.whv-down i{animation:none}
|
||
.whv-q span{opacity:1;filter:none;transform:none}
|
||
.whv-s.on .whv-q span{animation:none}
|
||
}
|
||
.whv-s.mine .whv-q{background:none;-webkit-background-clip:border-box;background-clip:border-box;color:#FFDDAE;text-shadow:0 0 22px rgba(255,190,120,.55)}
|
||
.whd-x{display:grid;place-items:center}
|
||
.whv-ct b{font-size:60px;margin-right:4px}
|
||
|
||
/* ===== 2026-10-02 悄悄话全屏页 · 五改:流星夜空 ===== */
|
||
.wsk{position:absolute;inset:0;z-index:1}
|
||
.wsk-deco{position:absolute;inset:0;pointer-events:none}
|
||
.wsk-deco i{position:absolute;border-radius:50%;background:#fff;opacity:var(--o);animation:wskTw 4s ease-in-out infinite alternate}
|
||
@keyframes wskTw{from{opacity:var(--o)}to{opacity:calc(var(--o) * .25)}}
|
||
.wsk-deco::before{content:"";position:absolute;left:-20%;right:-20%;top:18%;height:46%;transform:rotate(-24deg);
|
||
background:radial-gradient(ellipse at center,rgba(210,180,255,.13),rgba(255,190,200,.05) 45%,transparent 70%);filter:blur(10px)}
|
||
/* 偶尔划过的无字小流星,只是氛围 */
|
||
.wsk-shoot{position:absolute;top:12%;right:-10%;width:110px;height:1.5px;border-radius:2px;pointer-events:none;opacity:0;
|
||
background:linear-gradient(90deg,#fff,rgba(255,255,255,0));transform:rotate(-28deg);animation:wskShoot 9s linear infinite 2s}
|
||
.wsk-shoot.s2{top:34%;right:-20%;width:80px;animation-duration:13s;animation-delay:6.5s}
|
||
@keyframes wskShoot{0%{opacity:0;translate:0 0}2%{opacity:.9}8%{opacity:0;translate:-320px 170px}100%{opacity:0;translate:-320px 170px}}
|
||
.wsk-bright{position:absolute;inset:0}
|
||
.wsk-st{position:absolute;width:40px;height:40px;margin:-20px 0 0 -20px;display:grid;place-items:center;border-radius:50%;transition:opacity .6s}
|
||
.wsk-st i{display:block;width:var(--s);height:var(--s);border-radius:50%;background:#FFF8EC;
|
||
box-shadow:0 0 6px 2px rgba(255,240,220,.75),0 0 18px 4px rgba(200,180,255,.35);animation:wskGl var(--tw) ease-in-out infinite alternate}
|
||
.wsk-st i::before,.wsk-st i::after{content:"";position:absolute;left:50%;top:50%;width:calc(var(--s) * 3.4);height:1px;margin:-.5px 0 0 calc(var(--s) * -1.7);
|
||
background:linear-gradient(90deg,transparent,rgba(255,255,255,.8),transparent)}
|
||
.wsk-st i::after{transform:rotate(90deg)}
|
||
@keyframes wskGl{from{transform:scale(.8);opacity:.75}to{transform:scale(1.1);opacity:1}}
|
||
.wsk-st.mine i{background:#FFD596;box-shadow:0 0 8px 3px rgba(255,200,120,.85),0 0 22px 6px rgba(255,170,90,.4)}
|
||
.wsk-st.seen i{opacity:.4;animation:none;box-shadow:0 0 4px 1px rgba(255,240,220,.4)}
|
||
.wsk-st.seen i::before,.wsk-st.seen i::after{display:none}
|
||
.wsk-st.hint::after,.wsk-st.cur::after{content:"";position:absolute;inset:4px;border-radius:50%;border:1.5px solid rgba(255,226,190,.75);animation:whRing 2s ease-out infinite}
|
||
.wsk-st.flare i{animation:wskFlare .38s ease-out forwards;opacity:1}
|
||
@keyframes wskFlare{0%{transform:scale(1)}60%{transform:scale(2.6);box-shadow:0 0 20px 10px rgba(255,255,255,.9)}100%{transform:scale(1.6)}}
|
||
.wsk-st.gone{opacity:0}
|
||
.wsk-title{position:absolute;left:24px;right:24px;top:calc(62px + env(safe-area-inset-top));z-index:2;pointer-events:none}
|
||
.wsk-t{font-size:26px;font-weight:900;letter-spacing:1px}
|
||
.wsk-t b{font-size:40px;margin:0 3px;font-family:"DIN Alternate","DIN",Helvetica,Arial,sans-serif;background:linear-gradient(120deg,#FFE2B8,#FF9E8A);-webkit-background-clip:text;background-clip:text;color:transparent}
|
||
.wsk-title p{margin:6px 0 0;font-size:12.5px;color:rgba(255,255,255,.55);letter-spacing:.5px}
|
||
.wh-page .whv-top{background:none}
|
||
.wh-page .whv-top .whp-tag{margin-left:2px}
|
||
/* 流星:白色头 + 一条渐隐的光尾 + 字一个个拖在尾巴上 */
|
||
.wmt{position:absolute;inset:0;z-index:2;pointer-events:none;--bl:0px}
|
||
.wmt-h,.wmt-l,.wmt span{position:absolute;left:0;top:0;will-change:transform}
|
||
.wmt-h{width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;background:#fff;transform-origin:center;
|
||
box-shadow:0 0 10px 4px #fff,0 0 30px 12px rgba(220,200,255,.75),0 0 60px 22px rgba(255,180,200,.35)}
|
||
.wmt-l{height:3px;margin-top:-1.5px;transform-origin:0 50%;border-radius:2px;
|
||
background:linear-gradient(90deg,rgba(255,255,255,.95),rgba(225,205,255,.5) 25%,rgba(255,190,200,.15) 70%,transparent);filter:blur(.6px)}
|
||
.wmt span{font-size:var(--fs);font-weight:900;line-height:1;color:#fff;opacity:0;white-space:nowrap;filter:blur(var(--bl));
|
||
text-shadow:0 0 8px rgba(255,255,255,.7),0 0 18px rgba(210,180,255,.6)}
|
||
.wmt.mine .wmt-h{background:#FFF2D8;box-shadow:0 0 10px 4px #FFE2B0,0 0 30px 12px rgba(255,200,120,.75),0 0 60px 22px rgba(255,150,90,.35)}
|
||
.wmt.mine span{color:#FFE4BC;text-shadow:0 0 8px rgba(255,210,150,.8),0 0 18px rgba(255,160,90,.5)}
|
||
/* 内容卡:流星同时出现,保证整句看得清 */
|
||
.wsc{position:absolute;left:16px;right:16px;bottom:calc(132px + env(safe-area-inset-bottom));z-index:3;padding:16px 18px 14px;border-radius:20px;
|
||
background:linear-gradient(140deg,rgba(255,255,255,.13),rgba(255,255,255,.05));box-shadow:inset 0 0 0 1px rgba(255,255,255,.14),0 12px 30px rgba(10,5,30,.35);
|
||
backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);opacity:0;visibility:hidden;transform:translateY(16px);transition:opacity .4s,transform .45s cubic-bezier(.2,.8,.2,1),visibility .4s}
|
||
.wsc.show{opacity:1;visibility:visible;transform:none}
|
||
.wsc-q{margin:0;padding-right:64px;font-size:19px;line-height:1.5;font-weight:800}
|
||
.wsc-q em{display:inline-block;margin-right:6px;vertical-align:2px;font-style:normal;font-size:11px;font-weight:800;padding:2px 8px;border-radius:99px;background:#FFD596;color:#5A3510}
|
||
.wsc-m{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px;font-size:12px;color:rgba(255,255,255,.55)}
|
||
.wsc-next{position:absolute;right:12px;top:12px;display:flex;align-items:center;gap:2px;height:28px;padding:0 9px 0 11px;border-radius:99px;
|
||
background:rgba(255,255,255,.1);color:rgba(255,255,255,.85);font-size:12px;font-weight:700}
|
||
@media (prefers-reduced-motion:reduce){
|
||
.wsk-deco i,.wsk-st i,.wsk-shoot{animation:none}
|
||
}
|
||
/* 六改:头窄尾宽的光楔 + 特别亮的头 */
|
||
.wmt-l,.wmt-c{position:absolute;left:0;top:0;transform-origin:0 50%;border-radius:0;will-change:transform,width}
|
||
.wmt-l{clip-path:polygon(0 50%,100% 0,100% 100%);filter:blur(5px);
|
||
background:linear-gradient(90deg,rgba(255,255,255,.75),rgba(220,200,255,.38) 30%,rgba(255,180,200,.16) 70%,transparent)}
|
||
.wmt-c{height:6px;margin-top:-3px;clip-path:polygon(0 50%,100% 0,100% 100%);filter:blur(1px);
|
||
background:linear-gradient(90deg,#fff,rgba(255,255,255,.55) 35%,transparent)}
|
||
.wmt-h{width:16px;height:16px;margin:-8px 0 0 -8px;background:radial-gradient(circle,#fff 45%,rgba(255,255,255,.85) 60%,rgba(255,255,255,0) 72%);
|
||
box-shadow:0 0 12px 6px #fff,0 0 34px 16px rgba(230,215,255,.85),0 0 80px 30px rgba(255,190,210,.45)}
|
||
.wmt-h::before,.wmt-h::after{content:"";position:absolute;left:50%;top:50%;width:70px;height:2px;margin:-1px 0 0 -35px;border-radius:2px;
|
||
background:linear-gradient(90deg,transparent,#fff,transparent)}
|
||
.wmt-h::after{transform:rotate(90deg);width:40px;margin-left:-20px}
|
||
.wmt span{font-weight:900}
|
||
.wmt.mine .wmt-l{background:linear-gradient(90deg,rgba(255,240,210,.8),rgba(255,200,130,.4) 30%,rgba(255,150,90,.16) 70%,transparent)}
|
||
.wsk-st.flare i{animation:wskFlare2 .42s ease-out forwards}
|
||
@keyframes wskFlare2{0%{transform:scale(1)}55%{transform:scale(3.4);box-shadow:0 0 26px 14px #fff,0 0 60px 24px rgba(230,210,255,.7)}100%{transform:scale(2);box-shadow:0 0 20px 10px #fff}}
|
||
.wsk-st.gone{opacity:0;transition:opacity .5s}
|
||
/* 七改:去掉中线;字改细体更清楚;首次提示一闪一闪;内容卡在流星划完才出、改小 */
|
||
.wmt span{font-weight:300;letter-spacing:.5px;text-shadow:0 0 6px rgba(255,255,255,.45),0 0 14px rgba(200,170,255,.45)}
|
||
.wmt.mine span{font-weight:300}
|
||
.wsk-tip{position:absolute;left:0;right:0;top:56%;z-index:3;margin:0;display:flex;align-items:center;justify-content:center;gap:8px;
|
||
font-size:14px;font-weight:300;letter-spacing:2px;color:#FFF3E2;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .4s,visibility .4s;
|
||
text-shadow:0 0 10px rgba(255,220,180,.7)}
|
||
.wsk-tip.show{visibility:visible;animation:wskBlink 1.8s ease-in-out infinite}
|
||
.wsk-tip i{width:6px;height:6px;border-radius:50%;background:#fff;box-shadow:0 0 8px 3px rgba(255,235,210,.9)}
|
||
@keyframes wskBlink{0%,100%{opacity:.25}50%{opacity:1}}
|
||
.wsc{padding:12px 16px 11px;border-radius:16px}
|
||
.wsc-k{display:block;font-size:11px;color:rgba(255,226,190,.7);letter-spacing:1px}
|
||
.wsc-q{margin-top:4px;font-size:15px;line-height:1.5;font-weight:400;color:rgba(255,255,255,.92);padding-right:70px}
|
||
.wsc-m{margin-top:6px;font-size:11.5px}
|
||
.wsc-next{top:10px;height:26px}
|
||
.wsc .whp-hug{height:26px;padding:0 10px;font-size:12px}
|
||
@media (prefers-reduced-motion:reduce){.wsk-tip.show{animation:none;opacity:1}}
|
||
.wmt-l{filter:blur(9px);background:linear-gradient(90deg,rgba(255,255,255,.5),rgba(220,200,255,.22) 30%,rgba(255,180,200,.08) 70%,transparent)}
|
||
|
||
/* 八改:满天四角星(不再是圆点),亮星同形更大;流星头 = 白色拉长的光滴,不圆、无十字 */
|
||
.wh-page .whp-sky i.s1,.wh-page .whp-sky i.s2,.wh-page .whp-sky i.s3{display:none}
|
||
.wsk-deco i{border-radius:0;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cdefs%3E%3CradialGradient id='g'%3E%3Cstop offset='0' stop-color='%23FFF4E6' stop-opacity='.85'/%3E%3Cstop offset='1' stop-color='%23FFF4E6' stop-opacity='0'/%3E%3C/radialGradient%3E%3C/defs%3E%3Ccircle cx='10' cy='10' r='10' fill='url(%23g)' opacity='.45'/%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:none;opacity:var(--o)}
|
||
.wsk-deco i.tw{animation:wskTw2 3s ease-in-out infinite}
|
||
@keyframes wskTw2{0%,100%{opacity:var(--o);transform:scale(1)}50%{opacity:calc(var(--o) * .2);transform:scale(.55)}}
|
||
.wsk-st i{width:var(--s);height:var(--s);border-radius:0;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cdefs%3E%3CradialGradient id='g'%3E%3Cstop offset='0' stop-color='%23FFF4E6' stop-opacity='.85'/%3E%3Cstop offset='1' stop-color='%23FFF4E6' stop-opacity='0'/%3E%3C/radialGradient%3E%3C/defs%3E%3Ccircle cx='10' cy='10' r='10' fill='url(%23g)' opacity='.45'/%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;box-shadow:none;
|
||
filter:drop-shadow(0 0 4px rgba(255,244,228,.9)) drop-shadow(0 0 10px rgba(210,190,255,.5));animation:wskGl2 var(--tw) ease-in-out infinite alternate}
|
||
.wsk-st i::before,.wsk-st i::after{display:none}
|
||
@keyframes wskGl2{from{transform:scale(.78) rotate(-6deg);opacity:.8}to{transform:scale(1.08) rotate(6deg);opacity:1}}
|
||
.wsk-st.mine i{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cdefs%3E%3CradialGradient id='g'%3E%3Cstop offset='0' stop-color='%23FFC27A' stop-opacity='.85'/%3E%3Cstop offset='1' stop-color='%23FFC27A' stop-opacity='0'/%3E%3C/radialGradient%3E%3C/defs%3E%3Ccircle cx='10' cy='10' r='10' fill='url(%23g)' opacity='.45'/%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='%23FFE2A8'/%3E%3C/svg%3E");box-shadow:none;filter:drop-shadow(0 0 5px rgba(255,210,140,.95)) drop-shadow(0 0 12px rgba(255,170,90,.5))}
|
||
.wsk-st.seen i{opacity:.35;animation:none;box-shadow:none;filter:none}
|
||
.wsk-st.flare i{animation:wskFlare3 .42s ease-out forwards}
|
||
@keyframes wskFlare3{0%{transform:scale(1)}55%{transform:scale(2.4) rotate(20deg);filter:brightness(1.6) drop-shadow(0 0 14px #fff)}100%{transform:scale(1.7) rotate(30deg);filter:drop-shadow(0 0 10px #fff)}}
|
||
.wsk-tip i{width:10px;height:10px;border-radius:0;box-shadow:none;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cdefs%3E%3CradialGradient id='g'%3E%3Cstop offset='0' stop-color='%23FFF4E6' stop-opacity='.85'/%3E%3Cstop offset='1' stop-color='%23FFF4E6' stop-opacity='0'/%3E%3C/radialGradient%3E%3C/defs%3E%3Ccircle cx='10' cy='10' r='10' fill='url(%23g)' opacity='.45'/%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}
|
||
.wmt-h{width:38px;height:9px;margin:-4.5px 0 0 -5px;transform-origin:5px 50%;border-radius:50%;
|
||
background:radial-gradient(ellipse 60% 50% at 18% 50%,#fff 0,#fff 35%,rgba(255,255,255,.55) 65%,rgba(255,255,255,0) 100%);
|
||
box-shadow:0 0 12px 3px rgba(255,255,255,.75),0 0 30px 8px rgba(225,210,255,.45)}
|
||
.wmt-h::before,.wmt-h::after{display:none}
|
||
.wmt.mine .wmt-h{background:radial-gradient(ellipse 60% 50% at 18% 50%,#FFF6E4 0,#FFF6E4 35%,rgba(255,220,160,.6) 65%,rgba(255,220,160,0) 100%);box-shadow:0 0 12px 3px rgba(255,226,180,.8),0 0 30px 8px rgba(255,180,110,.45)}
|
||
@media (prefers-reduced-motion:reduce){.wsk-deco i.tw,.wsk-st i{animation:none}}
|
||
.wsk-st.mine i{background-color:transparent}
|
||
.wsk-st i,.wsk-deco i{background-color:transparent}
|
||
/* 尾巴光楔:外层模糊、内层裁形,边缘才是软的 */
|
||
.wmt-l{clip-path:none;background:none;filter:blur(7px)}
|
||
.wmt-l::before{content:"";position:absolute;inset:0;clip-path:polygon(0 50%,100% 0,100% 100%);
|
||
background:linear-gradient(90deg,rgba(255,255,255,.55),rgba(220,200,255,.25) 30%,rgba(255,180,200,.08) 70%,transparent)}
|
||
.wmt.mine .wmt-l{background:none}
|
||
.wmt.mine .wmt-l::before{background:linear-gradient(90deg,rgba(255,240,210,.6),rgba(255,200,130,.28) 30%,rgba(255,150,90,.08) 70%,transparent)}
|
||
/* 九改(用户:「流星头是发光的白色,尾巴、也就是字的两边,也有白色的光,都要亮起来」) */
|
||
.wmt-h{width:44px;height:11px;margin:-5.5px 0 0 -6px;transform-origin:6px 50%;
|
||
background:radial-gradient(ellipse 60% 50% at 16% 50%,#fff 0,#fff 45%,rgba(255,255,255,.75) 70%,rgba(255,255,255,0) 100%);
|
||
box-shadow:0 0 10px 4px #fff,0 0 26px 10px rgba(255,255,255,.85),0 0 60px 22px rgba(235,225,255,.55)}
|
||
.wmt-l{filter:blur(6px)}
|
||
.wmt-l::before{background:linear-gradient(90deg,rgba(255,255,255,.95),rgba(255,255,255,.6) 30%,rgba(240,230,255,.3) 65%,rgba(255,255,255,.06) 92%,transparent)}
|
||
.wmt span{color:#fff;text-shadow:0 0 4px #fff,0 0 10px rgba(255,255,255,.9),0 0 22px rgba(255,255,255,.6)}
|
||
.wmt.mine .wmt-l::before{background:linear-gradient(90deg,rgba(255,248,230,.95),rgba(255,230,190,.6) 30%,rgba(255,210,150,.3) 65%,rgba(255,220,170,.06) 92%,transparent)}
|
||
.wmt.mine span{color:#FFF4E0;text-shadow:0 0 4px #FFF4E0,0 0 10px rgba(255,236,200,.9),0 0 22px rgba(255,210,150,.6)}
|
||
.wmt-h{background:linear-gradient(90deg,#fff 0,#fff 55%,rgba(255,255,255,.9) 100%);border-radius:50% 40% 40% 50%/50%;
|
||
clip-path:none;box-shadow:0 0 8px 3px #fff,0 0 22px 9px rgba(255,255,255,.85),0 0 55px 20px rgba(235,225,255,.6)}
|
||
.wmt.mine .wmt-h{background:#FFF8EA}
|
||
.wmt-l{filter:blur(4px)}
|
||
.wmt-l::before{background:linear-gradient(90deg,#fff,rgba(255,255,255,.75) 25%,rgba(245,238,255,.4) 60%,rgba(255,255,255,.08) 92%,transparent)}
|
||
.wmt span{text-shadow:0 0 1px rgba(60,30,110,.95),0 0 3px rgba(60,30,110,.7),0 0 12px rgba(255,255,255,.85),0 0 24px rgba(255,255,255,.5)}
|
||
.wmt.mine span{text-shadow:0 0 1px rgba(110,60,20,.9),0 0 3px rgba(110,60,20,.6),0 0 12px rgba(255,236,200,.85),0 0 24px rgba(255,210,150,.5)}
|
||
|
||
/* 十一改:划走的星消失;点星光波 + 碎星;飞行星尘;声音开关;全部落完 */
|
||
.wsk-st.used{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .6s,visibility .6s}
|
||
.wsk-st.flare,.wsk-st.flare.used{visibility:visible;opacity:1}
|
||
.wsk-st.flare.gone{opacity:0}
|
||
.wsk-bright.back .wsk-st{animation:wskBack .9s cubic-bezier(.2,.8,.2,1) both}
|
||
@keyframes wskBack{from{opacity:0;transform:translateY(-30px) scale(.3)}to{opacity:1;transform:none}}
|
||
.wfx-ring,.wfx-sp,.wfx-dust{position:absolute;z-index:2;pointer-events:none}
|
||
.wfx-ring{width:16px;height:16px;margin:-8px 0 0 -8px;border-radius:50%;border:2px solid rgba(255,255,255,.9);
|
||
box-shadow:0 0 12px rgba(255,255,255,.8),inset 0 0 8px rgba(255,255,255,.6);animation:wfxRing .8s cubic-bezier(.2,.8,.2,1) forwards}
|
||
.wfx-ring.gold{border-color:rgba(255,220,160,.95);box-shadow:0 0 12px rgba(255,200,120,.8),inset 0 0 8px rgba(255,200,120,.6)}
|
||
@keyframes wfxRing{0%{transform:scale(.4);opacity:1}100%{transform:scale(6);opacity:0;border-width:.5px}}
|
||
.wfx-sp{width:var(--z);height:var(--z);margin:calc(var(--z) / -2) 0 0 calc(var(--z) / -2);background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cdefs%3E%3CradialGradient id='g'%3E%3Cstop offset='0' stop-color='%23FFF4E6' stop-opacity='.85'/%3E%3Cstop offset='1' stop-color='%23FFF4E6' stop-opacity='0'/%3E%3C/radialGradient%3E%3C/defs%3E%3Ccircle cx='10' cy='10' r='10' fill='url(%23g)' opacity='.45'/%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;
|
||
filter:drop-shadow(0 0 3px #fff);animation:wfxSp .85s cubic-bezier(.15,.7,.3,1) both}
|
||
.wfx-sp.gold,.wfx-dust.gold{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cdefs%3E%3CradialGradient id='g'%3E%3Cstop offset='0' stop-color='%23FFC27A' stop-opacity='.85'/%3E%3Cstop offset='1' stop-color='%23FFC27A' stop-opacity='0'/%3E%3C/radialGradient%3E%3C/defs%3E%3Ccircle cx='10' cy='10' r='10' fill='url(%23g)' opacity='.45'/%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='%23FFE2A8'/%3E%3C/svg%3E")}
|
||
@keyframes wfxSp{0%{transform:translate(0,0) scale(.3) rotate(0);opacity:1}70%{opacity:1}100%{transform:translate(var(--x),var(--y)) scale(1) rotate(90deg);opacity:0}}
|
||
.wfx-dust{width:var(--z);height:var(--z);margin:calc(var(--z) / -2) 0 0 calc(var(--z) / -2);background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cdefs%3E%3CradialGradient id='g'%3E%3Cstop offset='0' stop-color='%23FFF4E6' stop-opacity='.85'/%3E%3Cstop offset='1' stop-color='%23FFF4E6' stop-opacity='0'/%3E%3C/radialGradient%3E%3C/defs%3E%3Ccircle cx='10' cy='10' r='10' fill='url(%23g)' opacity='.45'/%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:wfxDust 1s ease-out forwards}
|
||
@keyframes wfxDust{0%{opacity:.95;transform:scale(1)}100%{opacity:0;transform:translateY(var(--y)) scale(.3) rotate(60deg)}}
|
||
.whv-snd{display:grid;place-items:center;width:32px;height:32px;margin-left:auto;border-radius:50%;background:rgba(255,255,255,.12);color:#fff;backdrop-filter:blur(6px)}
|
||
.whv-snd .off,.whv-snd.off .on{display:none}
|
||
.whv-snd.off .off{display:inline}
|
||
.whv-snd.off{color:rgba(255,255,255,.55)}
|
||
.whv-snd+.whv-all{margin-left:8px}
|
||
.wsk-done{position:absolute;left:0;right:0;top:34%;z-index:3;text-align:center;opacity:0;visibility:hidden;transform:translateY(10px);transition:opacity .6s,transform .6s,visibility .6s}
|
||
.wsk-done.show{opacity:1;visibility:visible;transform:none}
|
||
.wsk-done p{margin:0;font-size:19px;font-weight:300;letter-spacing:2px;line-height:1.7;color:#FFF3E2;text-shadow:0 0 12px rgba(255,220,180,.6)}
|
||
.wsk-done p span{font-size:13px;color:rgba(255,255,255,.6)}
|
||
.wsk-done button{margin-top:16px;height:34px;padding:0 18px;border-radius:99px;font-size:13px;font-weight:600;color:#fff;
|
||
background:rgba(255,255,255,.12);box-shadow:inset 0 0 0 1px rgba(255,255,255,.3),0 0 18px rgba(255,230,200,.25)}
|
||
@media (prefers-reduced-motion:reduce){.wsk-bright.back .wsk-st{animation:none}}
|
||
/* 十二改:白光集中在头后一小段,字所在的尾巴段光变柔,小字不再被白光吃掉 */
|
||
.wmt-l::before{background:linear-gradient(90deg,#fff 0,rgba(255,255,255,.7) 8%,rgba(255,255,255,.32) 22%,rgba(240,230,255,.22) 55%,rgba(255,255,255,.06) 90%,transparent)}
|
||
.wmt.mine .wmt-l::before{background:linear-gradient(90deg,#FFF8EA 0,rgba(255,236,200,.7) 8%,rgba(255,226,180,.32) 22%,rgba(255,210,150,.22) 55%,rgba(255,220,170,.06) 90%,transparent)}
|
||
|
||
/* 首页悄悄话入口:条内一片小星空(四角星一闪一闪)+ 偶尔两道流星,频率很低 */
|
||
.wh-entry::before{display:none}
|
||
.we-ico,.we-txt,.we-go{position:relative;z-index:1}
|
||
.we-sky{position:absolute;inset:0;pointer-events:none;overflow:hidden}
|
||
.we-sky i{position:absolute;margin:-3px 0 0 -3px;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cdefs%3E%3CradialGradient id='g'%3E%3Cstop offset='0' stop-color='%23FFF4E6' stop-opacity='.85'/%3E%3Cstop offset='1' stop-color='%23FFF4E6' stop-opacity='0'/%3E%3C/radialGradient%3E%3C/defs%3E%3Ccircle cx='10' cy='10' r='10' fill='url(%23g)' opacity='.45'/%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;opacity:.75}
|
||
.we-sky i.tw{animation:weTw 2.6s ease-in-out infinite}
|
||
@keyframes weTw{0%,100%{opacity:.85;transform:scale(1)}50%{opacity:.15;transform:scale(.5)}}
|
||
.we-mt{position:absolute;top:-6px;left:62%;width:70px;height:1.5px;border-radius:2px;opacity:0;transform-origin:0 50%;
|
||
background:linear-gradient(90deg,#fff,rgba(255,255,255,.5) 30%,rgba(255,255,255,0));box-shadow:0 0 6px rgba(255,255,255,.7);
|
||
animation:weMt 7s linear infinite 1.5s}
|
||
.we-mt::before{content:"";position:absolute;left:-2px;top:-1.5px;width:5px;height:4.5px;border-radius:50%;background:#fff;box-shadow:0 0 6px 2px #fff}
|
||
.we-mt.m2{left:92%;width:54px;animation-duration:11s;animation-delay:5.2s}
|
||
@keyframes weMt{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){.we-sky i.tw,.we-mt{animation:none}}
|
||
.we-sky i{opacity:.95;filter:drop-shadow(0 0 2px rgba(255,255,255,.8));transform:scale(1.35)}
|
||
@keyframes weTw{0%,100%{opacity:1;transform:scale(1.35)}50%{opacity:.2;transform:scale(.6)}}
|
||
.we-mt{width:96px;height:2px;top:-4px}
|
||
.we-mt.m2{width:70px}
|
||
.we-mt{height:2px;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)}
|
||
|
||
/* 2026-10-02 3D 婴儿房整块可点:按下时整块轻微压暗 + 按钮跟着缩一下 */
|
||
.ny-peek{cursor:pointer;-webkit-tap-highlight-color:transparent}
|
||
.ny-peek .nyp-layer img{transition:filter .15s}
|
||
.ny-peek:active .nyp-layer img{filter:brightness(.92)}
|
||
.ny-peek:active .nyp-btn{transform:scale(.96)}
|
||
|
||
/* 2026-10-02 用户:入口星星小一点、少一点,别挡住「X周孕妈悄悄话」那行字 —— 星星只放在文字行之间 / 四周空处(见 index.html),不再放大 */
|
||
.we-sky i{transform:scale(1);opacity:.85;filter:drop-shadow(0 0 1.5px rgba(255,255,255,.6))}
|
||
@keyframes weTw{0%,100%{opacity:.9;transform:scale(1)}50%{opacity:.2;transform:scale(.55)}}
|
||
|
||
/* ================= 「记一下」弹窗压到半屏以内(2026-10-02 二改)=================
|
||
用户:「弹出的框尽量别超过 1/2」。标题一行、今天卡合成一条细条、宫格 5 列小图标;工具多了宫格自己滚。 */
|
||
.sheet{max-height:50%}
|
||
.sheet-grip{padding:8px 0 2px}
|
||
.sheet-head{align-items:center;padding:4px 18px 10px 22px}
|
||
.sheet-head>div{display:flex;align-items:baseline;gap:10px;min-width:0}
|
||
.sheet-head h2{font-size:19px;letter-spacing:0;flex:none}
|
||
.sheet-head p.sk-sub{margin:0;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.sheet-close{width:30px;height:30px;font-size:0}
|
||
.sheet-scroll{padding:0 16px calc(12px + env(safe-area-inset-bottom))}
|
||
.sk-today{gap:10px;margin:0 2px 14px;padding:9px 10px 9px 12px;border-radius:16px}
|
||
.sk-ring{width:36px;height:36px}
|
||
.sk-ring circle{stroke-width:5}
|
||
.sk-ring b{font-size:14px}
|
||
.sk-tt{gap:2px}
|
||
.sk-tt>b{font-size:14px}
|
||
.sk-tt>span{display:block;font-size:11.5px;line-height:1.4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.sk-today .sk-go{flex:none;margin:0;padding:0 14px;height:30px;border-radius:99px;font-size:12.5px;font-weight:700;color:#fff;
|
||
background:linear-gradient(135deg,#F09A80,#E07560);box-shadow:0 4px 10px rgba(224,117,96,.28)}
|
||
.sk-today .sk-go.hide{display:none}
|
||
.sk-today .sk-go:active{transform:scale(.94)}
|
||
.apps-grid{grid-template-columns:repeat(5,1fr);grid-auto-rows:auto;gap:14px 4px;align-content:start}
|
||
.apps-grid .app{gap:5px;font-size:11px;min-width:0;line-height:1.25}
|
||
.apps-grid .app .a-ico{width:42px;height:42px}
|
||
.apps-grid .a-ico-letter{width:42px;border-radius:14px;font-size:17px}
|
||
.apps-grid .a-n{display:block;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:10.5px;letter-spacing:-.4px}
|
||
.apps-grid .app.is-done::after{top:-4px;right:calc(50% - 27px);width:15px;height:15px;background-size:10px}
|
||
#appsGrid{grid-auto-rows:auto;max-height:none;overflow:visible;padding:6px 0 0}
|
||
/* 2026-10-02 修:关着的弹窗/弹层都停在屏幕下沿外(translateY(102%)),但向上的 box-shadow 会漏进屏幕底部约 30px,
|
||
六七个叠起来就是底部一条发灰发糊的带子(压在「记一下」最后一行字和首页底部上)。关着时不要阴影。 */
|
||
.modal:not(.show),.sheet:not(.show){box-shadow:none!important}
|
||
/* 2026-10-02 用户:记一下宫格一行还是摆 4 个(列宽够,图标和字回大一号) */
|
||
.apps-grid{grid-template-columns:repeat(4,1fr);gap:14px 6px}
|
||
.apps-grid .app .a-ico{width:48px;height:48px}
|
||
.apps-grid .a-ico-letter{width:48px;border-radius:16px;font-size:19px}
|
||
.apps-grid .a-n{font-size:11.5px;letter-spacing:-.2px}
|
||
.apps-grid .app.is-done::after{right:calc(50% - 30px)}
|
||
|
||
/* ================= 此刻 · 三行使用动态(2026-10-02)=================
|
||
用户:「此刻给我放 3 个使用应用记录」。常驻三行,不再给悄悄话让位;每 3 秒顶上一行淡出、底下补一行。 */
|
||
.pulse.has-wh .pl-feed.pl-feed3{display:block}
|
||
.pulse .pl-feed.pl-feed3.hide{display:none}
|
||
.pl-feed.pl-feed3{height:90px;margin:10px 0 2px;padding:0;-webkit-mask-image:none;mask-image:none}
|
||
.pl-feed3 .pl-row{height:30px;gap:8px;font-size:12.5px;padding:0 2px;border-radius:10px;transition:opacity .45s,background .15s}
|
||
.pl-feed3 .pl-row .pr-ava{width:22px;height:22px;box-shadow:0 0 0 1.5px #fff}
|
||
.pl-feed3 .pl-row .pr-who{font-size:11.5px}
|
||
.pl-feed3 .pl-row .pr-do{color:var(--ink)}
|
||
.pl-feed3 .pl-row .pr-do em{font-weight:700}
|
||
.pl-feed3 .pl-row .pr-go{flex:none;font-style:normal;font-size:15px;line-height:1;color:#D4B8AC;padding:0 4px}
|
||
.pl-feed3 .pl-row.is-go{cursor:pointer}
|
||
.pl-feed3 .pl-row.is-go:active{background:rgba(232,131,107,.08)}
|
||
.pl-feed3 .pl-row.is-out{opacity:0}
|
||
.pl-feed3 .pl-track>.pl-row:last-child:not(:nth-child(-n+3)){animation:plIn .55s var(--ease) both}
|
||
@keyframes plIn{from{opacity:0}to{opacity:1}}
|
||
.pulse.has-wh .wh-entry{margin-top:10px}
|
||
.pl-feed3 .pl-row .pr-ago{flex:none;font-size:11px;color:var(--muted)}
|
||
.pl-feed3 .pl-row .pr-go{padding:0 2px 0 0}
|
||
|
||
/* 2026-10-02 悄悄话页标题改成「每一颗星星,都是一位孕妈的一句话」:两行,字号收一点,「一位孕妈」用暖金渐变 */
|
||
.wsk-t{font-size:23px;line-height:1.38;letter-spacing:1.5px;font-weight:800}
|
||
.wsk-t b{font-size:inherit;margin:0 2px;font-family:inherit;font-weight:900}
|
||
.wsk-title p{margin-top:8px}
|
||
|
||
/* 2026-10-02 用户:slogan 换字体 → 站酷小薇(衬线、规整)。
|
||
字体文件仅含「全家都爱用的孕育平台」10 个字的子集,改文案需重新生成子集 */
|
||
@font-face{font-family:"SloganXiaoWei";src:url(assets/fonts/slogan-xiaowei.d5f456a3.woff2) format("woff2");font-display:swap}
|
||
.hero-slogan{font-family:"SloganXiaoWei",-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;font-size:14px;font-weight:400;letter-spacing:1.6px;opacity:1;text-shadow:0 1px 2px rgba(150,50,30,.25)}
|
||
|
||
/* 2026-10-02 用户:「孕育工具」「今日孕期小知识」标题的字体字号与「今日脚印」(.fp2 .tl-h-title)一致 */
|
||
.dock-title,.pt-title,.pt-title .pt-wk{font-family:inherit;font-size:18px;font-weight:900;letter-spacing:-.3px;color:var(--ink)}
|
||
.pt-title .pt-wk::after{height:15px}
|
||
|
||
/* 2026-10-02 用户:「记一下那个效果取消掉」→ 去掉中心圆钮外圈一直往外扩散的光环(fabHalo) */
|
||
.tab-fab .fab::after{display:none;animation:none}
|
||
/* 2026-10-02 用户:圆钮白边变小 4px → 2px(content-box,外径 60 → 56,margin-left 跟着取半宽居中) */
|
||
.tab-fab .fab{border-width:2px;margin-left:-28px;top:-20px}
|
||
/* 同日:白边大头其实在切图里(69818ea975da.png 的橙圆只占约 2/3 且偏左,四周一圈白)。
|
||
改成 CSS 画:橙色满圆 + 白色「+」,白边只剩上面那 2px border。切图 <img> 保留但隐藏。 */
|
||
.tab-fab .fab{background:linear-gradient(150deg,#FF8A6E,#F4593C)}
|
||
.tab-fab .fab img{display:none}
|
||
.tab-fab .fab::before{content:"";width:22px;height:22px;
|
||
background:linear-gradient(#fff,#fff) center/100% 3.5px no-repeat,linear-gradient(#fff,#fff) center/3.5px 100% no-repeat;border-radius:2px}
|
||
|
||
/* 2026-10-02 用户:首页兑换模块商品「热门/新品」角标用「去兑换」按钮同款玫红渐变 */
|
||
#homeExchGoods .gi-badge{background:linear-gradient(135deg,#E8708F,#D9577A 60%,#B83F62);box-shadow:0 2px 5px rgba(184,63,98,.3)}
|
||
/* 2026-10-02 用户:首页兑换模块副标题「做孕期任务就能攒兜豆」用灰色字 */
|
||
#homeExchSub{color:#9A8D86;font-weight:600}
|
||
/* 2026-10-02 用户:「记一下」加号变小 22px → 17px,线宽 3.5 → 3 */
|
||
.tab-fab .fab::before{width:17px;height:17px;background:linear-gradient(#fff,#fff) center/100% 3px no-repeat,linear-gradient(#fff,#fff) center/3px 100% no-repeat}
|
||
/* 同日:外圈也缩小 52 → 44(外径含 2px 白边 56 → 48),底边位置不变;加号 17 → 15 */
|
||
.tab-fab .fab{width:44px;height:44px;margin-left:-24px;top:-12px}
|
||
.tab-fab .fab::before{width:15px;height:15px;background:linear-gradient(#fff,#fff) center/100% 2.6px no-repeat,linear-gradient(#fff,#fff) center/2.6px 100% no-repeat}
|
||
|
||
/* ================= 底部导航「推荐版」(2026-10-02)=================
|
||
用户要的方向:图标和页面同一套语言(圆头线稿,同「今日待办」)、只留一个焦点、「记一下」被底栏托住、底栏暖白 + 内容淡出。
|
||
⚠️ 选中态仍按 2026-10-01 用户要求:不加背景胶囊,只靠颜色 + 加粗 + 弹一下 + 下方小圆点;本版只多了「线稿 → 实心」。
|
||
· 缺口:底色挪到 ::before 上用 mask 挖一个圆;阴影改成父级 filter:drop-shadow,才会沿着缺口走(box-shadow 会被 mask 切掉)。
|
||
代价:父级有 filter 后子元素的 backdrop-filter 失效,所以底色改成近不透明的暖白,不再磨砂。
|
||
· 圆钮中心在底栏顶边下 6px,直径 46;缺口半径 = 23 + 5 留白。改圆钮尺寸/位置要同步改 mask 的圆心和半径。 */
|
||
.tabbar{background:none!important;box-shadow:none!important;backdrop-filter:none;-webkit-backdrop-filter:none;
|
||
filter:drop-shadow(0 6px 14px rgba(170,90,60,.12)) drop-shadow(0 0 1px rgba(170,90,60,.18))}
|
||
.tabbar::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;
|
||
background:linear-gradient(180deg,#FFFDFB,#FFF8F3);box-shadow:inset 0 0 0 1px rgba(255,214,196,.55);
|
||
-webkit-mask:radial-gradient(circle 28px at 50% 6px,transparent 27.5px,#000 28.5px);
|
||
mask:radial-gradient(circle 28px at 50% 6px,transparent 27.5px,#000 28.5px)}
|
||
.tabbar{isolation:isolate}
|
||
.tab-fade{position:absolute;left:0;right:0;bottom:0;z-index:59;pointer-events:none;
|
||
height:calc(96px + env(safe-area-inset-bottom));
|
||
background:linear-gradient(180deg,rgba(248,243,239,0),rgba(248,243,239,.88) 55%,rgba(248,243,239,.96))}
|
||
|
||
/* 线稿图标:.tf 主体(选中时实心填色)、.td 小细节(选中时反白)、.tl 只在主体上的折线(选中时反白) */
|
||
.tab{color:#A3958D}
|
||
.t-ico.t-line{background:none;-webkit-mask:none;mask:none;width:25px;height:25px}
|
||
.t-svg{display:block;width:100%;height:100%;overflow:visible}
|
||
.t-svg .tf,.t-svg .tl{fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;transition:fill .25s}
|
||
.t-svg .td{fill:currentColor;stroke:none;transition:fill .25s}
|
||
.tab.is-active .t-svg .tf{fill:currentColor}
|
||
.tab.is-active .t-svg .tl{stroke:#fff}
|
||
.tab.is-active .t-svg .td{fill:#fff}
|
||
|
||
/* 「我的」:有头像就用头像(圆形;未选中不描边——2026-10-03 用户要求去掉那圈灰圈;选中时描一圈橙) */
|
||
.t-ava{display:none;position:absolute;inset:0;width:100%;height:100%;border-radius:50%;object-fit:cover;
|
||
background:#F3ECE7}
|
||
.tab.has-ava .t-ava{display:block}
|
||
.tab.has-ava .t-svg{visibility:hidden}
|
||
.tab.has-ava.is-active .t-ava{box-shadow:0 0 0 2px currentColor}
|
||
|
||
/* 「宝宝来信」有新信:信封每 4 秒轻晃一下 */
|
||
#tabLetter.has-new .t-ico{animation:letterWiggle 4s ease-in-out infinite;transform-origin:50% 80%}
|
||
@keyframes letterWiggle{0%,76%,100%{transform:rotate(0)}80%{transform:rotate(-12deg)}84%{transform:rotate(10deg)}88%{transform:rotate(-6deg)}92%{transform:rotate(3deg)}}
|
||
#tabLetter.has-new{color:#8E7F78}
|
||
|
||
/* 「记一下」:圆钮去掉白圈,坐进缺口;文字平时和其它 tab 同色,弹层打开时才变橙 → 底栏只有一个焦点 */
|
||
.tab-fab .fab{border:0;width:46px;height:46px;margin-left:-23px;top:-17px;
|
||
box-shadow:0 3px 8px rgba(244,89,60,.26),inset 0 1px 0 rgba(255,255,255,.25)}
|
||
.tab-fab .t-txt{color:inherit;font-weight:600}
|
||
.phone.sheet-open .tab-fab .t-txt{color:#F4593C;font-weight:800}
|
||
@media (prefers-reduced-motion:reduce){#tabLetter.has-new .t-ico{animation:none}}
|
||
/* 档案的小脚丫:脚趾圆点在脚掌外面,选中时不反白、跟主体同色 */
|
||
.tab[data-tab="archive"].is-active .t-svg .td{fill:currentColor}
|
||
|
||
/* ================= 悄悄话 · 每周话题(2026-10-02)=================
|
||
首页入口三行:小字「30周孕妈悄悄话」/ 本周话题(金色小签 + 话题名)/ 一句轮播;右边「去说一句」。
|
||
全屏页标题下一张话题签;「说一句」弹窗顶上一行话题。话题表在 app.js WH_THEMES。 */
|
||
.we-topic{display:none;align-items:center;gap:6px;min-width:0}
|
||
.wh-entry.has-topic .we-topic{display:flex}
|
||
.we-topic em{flex:none;font-style:normal;font-size:10px;font-weight:800;letter-spacing:.5px;color:#4A2E1E;
|
||
background:linear-gradient(120deg,#FFE2B8,#FFB98F);padding:1px 6px;border-radius:5px;line-height:15px}
|
||
.we-topic strong{font-size:15px;font-weight:900;letter-spacing:.5px;color:#FFE7C7;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||
.wh-entry.has-topic .we-txt{gap:3px}
|
||
.wh-entry.has-topic .we-roll{font-size:12.5px;font-weight:500;color:rgba(255,244,232,.78)}
|
||
.wh-entry.has-topic .we-go{color:#FFE2B8;font-weight:700}
|
||
|
||
.wsk-topic{display:inline-flex;flex-wrap:wrap;align-items:center;justify-content:flex-start;gap:4px 8px;margin-top:12px;padding:8px 14px;
|
||
border-radius:14px;background:rgba(255,255,255,.08);box-shadow:inset 0 0 0 1px rgba(255,226,184,.25)}
|
||
.wsk-topic em{font-style:normal;font-size:11px;font-weight:800;color:#4A2E1E;background:linear-gradient(120deg,#FFE2B8,#FFB98F);padding:1px 7px;border-radius:6px}
|
||
.wsk-topic b{font-size:16px;font-weight:900;color:#FFE7C7;letter-spacing:1px}
|
||
.wsk-topic span{flex-basis:100%;font-size:12px;color:rgba(255,255,255,.6);letter-spacing:.5px}
|
||
|
||
.wh-m-topic{margin:0 0 6px;font-size:13px;font-weight:800;color:#C2667A}
|
||
|
||
/* 2026-10-02 用户:悄悄话页上半部分文字太占地方、挡住星星 → 标题一行 + 话题一行胶囊,整块高度约减半 */
|
||
.wsk-title{top:calc(66px + env(safe-area-inset-top))}
|
||
.wsk-t{font-size:18px;line-height:1.4;letter-spacing:.5px;font-weight:800;white-space:nowrap;text-shadow:0 1px 8px rgba(20,10,40,.5)}
|
||
.wsk-t b{margin:0 1px}
|
||
.wsk-topic{display:inline-flex;flex-wrap:nowrap;gap:7px;margin-top:9px;padding:4px 12px 4px 4px;border-radius:99px;
|
||
background:rgba(255,255,255,.08);box-shadow:inset 0 0 0 1px rgba(255,226,184,.22)}
|
||
.wsk-topic em{padding:2px 8px;border-radius:99px;font-size:10.5px}
|
||
.wsk-topic b{font-size:13.5px;letter-spacing:.5px}
|
||
.wsk-topic span{display:none}
|
||
.wh-m-topic{line-height:1.5}
|
||
.wsk-t b{text-shadow:none}
|
||
.wh-m-topic span{display:block;margin-top:2px;font-size:12px;font-weight:600;color:#B59A92}
|
||
|
||
/* 2026-10-02 用户:点黄色大星星(自己的)飞出去时黄色要更亮、往外发光,像流星 → 头改金色多层外发光,尾巴金光加浓,静态星和点击闪光也换暖金 */
|
||
.wsk-st.mine i{filter:brightness(1.12) drop-shadow(0 0 5px rgba(255,220,140,1)) drop-shadow(0 0 14px rgba(255,185,90,.75))}
|
||
.wsk-st.mine.seen i{filter:none}
|
||
.wsk-st.mine.flare i{animation-name:wskFlareGold}
|
||
@keyframes wskFlareGold{0%{transform:scale(1)}55%{transform:scale(2.6) rotate(20deg);filter:brightness(1.7) drop-shadow(0 0 10px #FFE7B0) drop-shadow(0 0 26px rgba(255,180,80,.95))}
|
||
100%{transform:scale(1.8) rotate(30deg);filter:brightness(1.3) drop-shadow(0 0 10px #FFE2A0) drop-shadow(0 0 22px rgba(255,170,70,.8))}}
|
||
.wmt.mine .wmt-h{background:linear-gradient(90deg,#FFFEF6 0,#FFF0C6 45%,#FFD27A 100%);
|
||
box-shadow:0 0 6px 3px #FFF3CC,0 0 18px 8px rgba(255,214,120,.95),0 0 42px 18px rgba(255,180,80,.7),0 0 80px 34px rgba(255,150,60,.32)}
|
||
.wmt.mine .wmt-l{filter:blur(3px) drop-shadow(0 0 8px rgba(255,196,100,.85))}
|
||
.wmt.mine .wmt-l::before{background:linear-gradient(90deg,#FFF6D6 0,rgba(255,220,130,.95) 8%,rgba(255,196,96,.6) 24%,rgba(255,176,80,.32) 55%,rgba(255,160,80,.1) 88%,transparent)}
|
||
.wmt.mine span{color:#FFF3D6;text-shadow:0 0 1px rgba(110,60,20,.9),0 0 3px rgba(110,60,20,.55),0 0 10px rgba(255,220,140,.95),0 0 24px rgba(255,180,90,.65)}
|
||
|
||
/* 2026-10-03 用户:消消乐 banner 左右留白太大 → 和上面「豆豆今天想说」卡片对齐(距屏幕边 16px) */
|
||
.game-promo{padding-left:16px;padding-right:16px}
|
||
|
||
/* ================= 底部导航 · 暖色毛玻璃(2026-10-03)=================
|
||
用户:「按孕期档案(chengzhang-dangan/v7)底部 Tab 的毛玻璃风格改」。对照它的 .anc .ain:
|
||
rgba(255,255,255,.55) + blur(18px) saturate(170%) + 内描白边 + 顶部 1px 高光 + 暖色投影;下方淡出层减弱到 .55,让内容透上来可「磨」。
|
||
· 父级 .tabbar 去掉 filter(filter 会让子元素 backdrop-filter 失效);玻璃放在 ::before(仍带 mask 缺口),
|
||
投影挪到不带 mask 的 ::after 上用 box-shadow(外投影只画在盒子外面,不会透进玻璃里)。
|
||
· 选中态仍按 2026-10-01 用户要求不加背景胶囊。 */
|
||
.tabbar{filter:none}
|
||
.tabbar::before{background:rgba(255,255,255,.55);
|
||
-webkit-backdrop-filter:blur(18px) saturate(170%);backdrop-filter:blur(18px) saturate(170%);
|
||
box-shadow:inset 0 0 0 1px rgba(255,255,255,.85),inset 0 1px 0 #fff}
|
||
.tabbar::after{content:"";position:absolute;inset:0;z-index:-2;border-radius:inherit;pointer-events:none;
|
||
box-shadow:0 14px 34px rgba(200,100,70,.2),0 2px 6px rgba(200,100,70,.06)}
|
||
.tab-fade{background:linear-gradient(180deg,rgba(255,240,232,0),rgba(255,240,232,.55))}
|
||
.tab-fab .fab{box-shadow:0 6px 14px rgba(244,89,60,.32),inset 0 1px 0 rgba(255,255,255,.3)}
|
||
@media (prefers-reduced-transparency:reduce){.tabbar::before{background:#FFF9F5}}
|
||
|
||
/* 2026-10-03 用户:「进去布置」和下面兑换模块的「去兑换」都是粉玫红,靠色 → 换成和婴儿房外景草坪同色系的青草绿 */
|
||
.nyp-btn{background:linear-gradient(135deg,#8FCF8A,#5DAE6B 60%,#46985A);box-shadow:0 4px 10px rgba(70,152,90,.3)}
|
||
.ny-peek.is-night .nyp-btn{background:linear-gradient(135deg,#9AD69A,#62B474);box-shadow:0 4px 12px rgba(0,0,0,.3)}
|
||
/* 同日:左上角「进去看看」角标也跟按钮统一成青草绿 */
|
||
.nyp-chip{color:#3F8F52;box-shadow:0 2px 8px rgba(70,152,90,.18)}
|
||
/* 2026-10-03 用户选定「B 磨砂颗粒」:首页各白底板块加毛玻璃质感,其他不变。
|
||
半透白 + 左上斜向高光 + 亮白细边 + 极细磨砂颗粒(assets/img/glass-noise.png,白点为主、极少量淡灰点)。
|
||
婴儿房(满幅图)和小游戏(彩色卡)不是白底,不动。
|
||
没加 backdrop-filter:页面底是纯米色,模糊了也看不出来;而且它会让板块里 position:fixed 的子元素改以板块为参照,风险大于收益。 */
|
||
#homeBody>section:not(.ny-peek):not(.game-promo){
|
||
background:url(assets/img/glass-noise.png) repeat,
|
||
linear-gradient(155deg,rgba(255,255,255,1) 0%,rgba(255,255,255,0) 38%),
|
||
linear-gradient(180deg,rgba(255,255,255,.7),rgba(255,251,248,.58))!important;
|
||
border:1px solid rgba(255,255,255,.95);
|
||
box-shadow:0 10px 30px rgba(190,110,80,.10),inset 0 1px 0 #fff,inset 0 -1px 0 rgba(255,255,255,.6)!important}
|
||
/* 2026-10-03 用户参考图(中间「+」改成「发情报!」贴纸字):「记一下」圆钮改成文字贴纸——
|
||
大「记」+ 右下小「一下」+「!」(竖排小字时「一」压在「下」上像「二」,改横排),深色字描白边、略歪,字溢出圆钮一点点像贴上去的。
|
||
圆钮 46 → 52,圆心仍在底栏顶边下 6px(top = 6 - 26),缺口 mask 半径同步 28 → 31。
|
||
下面那行「记一下」文字收起(屏幕阅读器仍可读);转圈动效对文字不合适,改成按下缩一下、弹层打开时放大一点。 */
|
||
.tab-fab .fab{width:52px;height:52px;margin-left:-26px;top:-20px;overflow:visible}
|
||
.tab-fab .fab::before{display:none}
|
||
.tabbar::before{-webkit-mask:radial-gradient(circle 31px at 50% 6px,transparent 30.5px,#000 31.5px);
|
||
mask:radial-gradient(circle 31px at 50% 6px,transparent 30.5px,#000 31.5px)}
|
||
.fab-w{position:absolute;left:50%;top:50%;transform:translate(-50%,-52%) rotate(-8deg);display:flex;align-items:center;
|
||
white-space:nowrap;font-weight:900;font-style:normal;color:#4A1E14;line-height:1;pointer-events:none;
|
||
text-shadow:1.6px 0 #fff,-1.6px 0 #fff,0 1.6px #fff,0 -1.6px #fff,1.2px 1.2px #fff,-1.2px 1.2px #fff,1.2px -1.2px #fff,-1.2px -1.2px #fff,0 3px 4px rgba(120,30,10,.25)}
|
||
.fab-w i{font-style:normal;font-size:26px}
|
||
.fab-w em{font-style:normal;font-size:12.5px;line-height:1;margin:9px 0 0 0;letter-spacing:-.5px}
|
||
.fab-w s{text-decoration:none;font-size:20px;margin-left:0;transform:skewX(-8deg)}
|
||
/* 2026-10-04 用户:「记一下」后面的叹号隔 3~5 秒动一下 —— 每 4 秒一轮:前 0.6 秒跳起来晃两下,其余时间静止 */
|
||
.fab-w s{display:inline-block;transform-origin:50% 90%;animation:fabBang 4s ease-in-out 1.5s infinite}
|
||
@keyframes fabBang{
|
||
0%,15%,100%{transform:skewX(-8deg)}
|
||
3%{transform:skewX(-8deg) translateY(-4px) rotate(-14deg) scale(1.15)}
|
||
7%{transform:skewX(-8deg) translateY(-2px) rotate(12deg) scale(1.08)}
|
||
11%{transform:skewX(-8deg) rotate(-5deg)}
|
||
}
|
||
@media (prefers-reduced-motion:reduce){.fab-w s{animation:none}}
|
||
.tab-fab .t-txt{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
|
||
.tab-fab:active .fab{transform:scale(.9)}
|
||
.phone.sheet-open .tabbar .fab{transform:scale(1.08)}
|
||
/* 2026-10-03 用户:「记一下」背后隐约留一个低透明度的加号;「记」再大一点、向左多探出一点 */
|
||
.tab-fab .fab::before{display:block;content:"";width:30px;height:30px;opacity:.26;border-radius:2px;
|
||
background:linear-gradient(#fff,#fff) center/100% 4px no-repeat,linear-gradient(#fff,#fff) center/4px 100% no-repeat}
|
||
.fab-w{transform:translate(calc(-50% - 5px),-54%) rotate(-8deg)}
|
||
.fab-w i{font-size:31px}
|
||
/* 2026-10-03 用户:背景加号再小一点。(描边试过浅橙/深橙两版,用户都不要,回到 v26100215 的白色描边) */
|
||
.tab-fab .fab::before{width:20px;height:20px;opacity:.28;
|
||
background:linear-gradient(#fff,#fff) center/100% 3px no-repeat,linear-gradient(#fff,#fff) center/3px 100% no-repeat}
|
||
|
||
/* 2026-10-03 用户:顶部 slogan「全家都爱用的孕育平台」字间距拉近(1.6px → .4px) */
|
||
.hero-slogan{letter-spacing:.4px}
|
||
|
||
/* 2026-10-03 用户:消消乐推广「上下不要占那么大,高度不要那么高,重新设计一版」。
|
||
原来是 ~110px 高的三行大卡(角标 / 名字 / 玩法 / 开始玩胶囊竖着堆,右边 30px 格子的大棋盘),外框白底上下再各留 16/18px。
|
||
改成单行矮条(约 60px):左小棋盘(15px 格,动画照旧)· 中间名字 + 一句玩法 · 右「开始玩」胶囊;玩法缩成「三连就消掉,边玩边备待产包」免得单行被截断;
|
||
「兜爸旗下小游戏」缩成右上角小角标。index.html 里 .gp-cta 从 .gp-text 里挪到了卡片最后,好单独靠右。 */
|
||
.game-promo{padding-top:8px;padding-bottom:8px}
|
||
.gp-card{gap:10px;padding:9px 12px 9px 10px;border-radius:18px;box-shadow:0 6px 16px rgba(130,100,240,.26)}
|
||
.gp-card::before{width:90px;height:90px;left:-30px;bottom:-50px}
|
||
.gp-card::after{width:110px;height:110px;right:-20px;top:-46px}
|
||
.gp-board{order:-1;grid-template-columns:repeat(3,14px);gap:2px;padding:4px;border-radius:10px;transform:rotate(-6deg)}
|
||
.gp-board i{width:14px;height:14px;border-radius:4px;font-size:9px;box-shadow:0 1px 0 rgba(110,80,210,.28)}
|
||
.gp-board i.is-hint{box-shadow:0 0 0 1.5px #FFD36E}
|
||
.gp-new{left:auto;right:0;top:0;font-size:9px;padding:2px 8px;border-radius:0 0 0 10px;letter-spacing:0}
|
||
.gp-text{padding-top:0}
|
||
.gp-name{font-size:16px;line-height:1.25;letter-spacing:.3px}
|
||
.gp-sub{margin-top:2px;font-size:11px;line-height:1.35}
|
||
.gp-cta{flex:0 0 auto;margin:6px 0 0;padding:5px 11px;font-size:12px}
|
||
.gp-spark.s1{right:auto;left:62px;top:5px}.gp-spark.s2{right:96px;top:6px}.gp-spark.s3{right:auto;left:4px;bottom:4px}
|
||
|
||
/* 2026-10-03 用户:底部「首页」小房子里的爱心去掉,换成兜爸的「兜」字(SVG <text>,沿用 .td:未选中实色、选中反白)。同日用户:再细一点、小一点 → 400 / 7.6px */
|
||
.t-svg .t-dou{font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei","Noto Sans SC",sans-serif;font-size:7.6px;font-weight:400}
|
||
|
||
/* 2026-10-03 用户:「把最底部那个盲盒先隐藏起来」。先用 CSS 盖掉(JS renderBanner 照常跑),恢复时删这一条即可 */
|
||
#bbBanner{display:none!important}
|
||
|
||
/* 2026-10-03 用户:福利卡片左上角黄色「孕N周专属」角标去掉(抬头「孕N周专属福利」保留)。恢复删这条 */
|
||
.sb-tag{display:none!important}
|
||
|
||
/* 2026-10-03 用户:「专属福利」标题左边的小图标换个好看的。出了 A/B/C 三版,先上 A:
|
||
珊瑚渐变圆角底 + 白色礼盒(珊瑚色丝带)+ 右上一颗淡黄小星光,和页面主色、底部「记一下」圆钮同一套珊瑚橙 */
|
||
.gb-gift{background:linear-gradient(145deg,#FF9C7C,#F4574A);box-shadow:0 6px 12px rgba(244,87,74,.28),inset 0 1px 0 rgba(255,255,255,.35)}
|
||
|
||
/* ================= 今日脚印 · 精简版(2026-10-03)=================
|
||
用户:「今日脚印重新设计一下,现在不简洁、有点乱,只保留核心内容」。
|
||
只留三样:标题 + 日期 / 今天的记录(时间 + 一句话)/ 宝宝的一句话小结。
|
||
去掉:撕页日历、小诗副标题、每行的脚丫圆点和虚线、每行的小卡片、来源标签和明细、
|
||
便签的胶带、信纸横线、落款。数据和 JS 结构不变(只多写了一个 #fpDate)。 */
|
||
.today-line.fp2 .fp-cal{display:none}
|
||
.today-line.fp2 .fp-head{align-items:flex-start}
|
||
.today-line.fp2 .fp-date{margin-top:3px;font-family:inherit;font-size:12px;color:#8FA89D}
|
||
.today-line.fp2 .fp-all{margin-top:3px}
|
||
/* 记录:时间 | 一句话,细分隔线 */
|
||
.today-line.fp2 .fp-steps{margin-top:10px}
|
||
.today-line.fp2 .fp-steps::before{display:none}
|
||
.today-line.fp2 .step{display:block;padding:0}
|
||
.today-line.fp2 .step + .step{border-top:1px solid rgba(90,160,130,.12)}
|
||
.today-line.fp2 .st-dot{display:none}
|
||
.today-line.fp2 .st-card{flex-direction:row;align-items:baseline;gap:12px;padding:10px 0;border-radius:0;background:none;box-shadow:none;border:0}
|
||
.today-line.fp2 .st-meta{order:-1;flex:0 0 38px}
|
||
.today-line.fp2 .st-time{font-size:12px;font-weight:600;color:#9DB3A9;font-variant-numeric:tabular-nums}
|
||
.today-line.fp2 .st-from,.today-line.fp2 .st-det{display:none}
|
||
.today-line.fp2 .st-txt{flex:1;min-width:0;font-size:14px;font-weight:600;line-height:1.5}
|
||
.today-line.fp2 .st-txt b{font-size:15px;margin:0 1px}
|
||
/* 宝宝的一句话:浅绿底小块,标题行右侧带「往期 ›」 */
|
||
.today-line.fp2 .fp-note{margin-top:10px;padding:12px 14px;border-radius:14px;background:rgba(225,243,234,.75);box-shadow:none}
|
||
.today-line.fp2 .fp-note::after{display:none}
|
||
.today-line.fp2 .fn-top::after{content:"往期 ›";margin-left:auto;font-size:12px;font-weight:600;color:#5E9580}
|
||
.today-line.fp2 .ab-tag{font-size:12px;font-weight:700;color:#2C8E6B}
|
||
.today-line.fp2 .ab-say{margin-top:5px;font-family:inherit;font-size:14px;font-weight:500;line-height:1.6;color:#3A2C27;background:none;
|
||
display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
|
||
.today-line.fp2 .fn-foot{display:none}
|
||
|
||
/* ================= 首页卡片 · 轻毛玻璃 + 标题区光晕(2026-10-03 v26100229)=================
|
||
用户:「卡片有点素、没设计感;标题那块做点效果,别太重,干净整洁;整卡毛玻璃像底部 Tab 那样,但不要太重;
|
||
卡片底下要有点东西才显得出毛玻璃」。三层:
|
||
① 卡片底下:#homeBody 铺几团很淡的彩色光斑(左右交替,按整列高度的百分比定位),只为让玻璃「磨」出颜色;
|
||
卡片几乎通栏,光斑大部分藏在卡片后面,透过玻璃看到的是一层柔和的色雾。
|
||
② 卡片本身:照底部 Tab 的配方减一档 —— 半透白 .62→.5 + blur(16px) saturate(160%) + 白细边 + 顶部 1px 高光 + 暖色淡投影。
|
||
去掉 v26100213 的磨砂颗粒(要干净)。卡片里没有 fixed/sticky 子元素,backdrop-filter 改参照系的风险已核对过。
|
||
③ 标题区:左上角一团该模块主题色的淡光晕 + 顶边一道很淡的主题色细线(v26100231 用户要求加回并弱化:透明度 .55→.28),只在标题那一带,往下就是纯玻璃。
|
||
恢复上一版(纯毛玻璃颗粒):删掉这一整段即可。 */
|
||
#homeBody{position:relative;background:
|
||
radial-gradient(260px 220px at 8% 6%,rgba(255,190,165,.55),rgba(255,190,165,0) 70%),
|
||
radial-gradient(240px 220px at 96% 20%,rgba(255,196,214,.5),rgba(255,196,214,0) 70%),
|
||
radial-gradient(260px 240px at 4% 40%,rgba(255,224,150,.5),rgba(255,224,150,0) 70%),
|
||
radial-gradient(260px 240px at 98% 60%,rgba(186,232,210,.55),rgba(186,232,210,0) 70%),
|
||
radial-gradient(250px 230px at 6% 78%,rgba(214,200,255,.45),rgba(214,200,255,0) 70%),
|
||
radial-gradient(260px 230px at 94% 94%,rgba(255,206,160,.5),rgba(255,206,160,0) 70%)}
|
||
#homeBody>section:not(.ny-peek):not(.game-promo){
|
||
--gt:255,155,120;
|
||
background:
|
||
linear-gradient(90deg,rgba(var(--gt),.28),rgba(var(--gt),0) 60%) top/100% 2px no-repeat,
|
||
radial-gradient(240px 110px at 0 0,rgba(var(--gt),.20),rgba(var(--gt),0) 72%),
|
||
linear-gradient(180deg,rgba(255,255,255,.62),rgba(255,255,255,.5))!important;
|
||
-webkit-backdrop-filter:blur(16px) saturate(160%);backdrop-filter:blur(16px) saturate(160%);
|
||
border:1px solid rgba(255,255,255,.85);
|
||
box-shadow:0 12px 30px rgba(190,110,80,.10),0 2px 6px rgba(190,110,80,.04),inset 0 1px 0 #fff!important}
|
||
#homeBody>section.tool-dock{--gt:255,150,112}
|
||
#homeBody>section.preg-tips{--gt:255,140,175}
|
||
#homeBody>section.exch-wrap{--gt:240,178,60}
|
||
#homeBody>section.today-line{--gt:70,190,145}
|
||
#homeBody>section.shelf{--gt:255,160,90}
|
||
@media (prefers-reduced-transparency:reduce){#homeBody>section:not(.ny-peek):not(.game-promo){background:#FFFCFA!important;backdrop-filter:none;-webkit-backdrop-filter:none}}
|
||
|
||
/* 底部 Tab 往下挪一点(2026-10-03 v26100232,用户:「底部的Tab签稍微往下移一点点」):离底 14px → 8px,安全区照旧叠加 */
|
||
.tabbar{bottom:calc(8px + env(safe-area-inset-bottom))}
|
||
/* 「我的」页兜豆兑换横条(2026-10-04 由大卡收起,和心选商城横条同款,图标底换粉色) */
|
||
.mall-strip.exch .ms-ico{background:linear-gradient(140deg,#FFEEF2,#FFD6E0)}
|
||
.mall-strip.exch + .mall-strip{margin-top:10px}
|
||
|
||
/* ================= 「我的」页毛玻璃(2026-10-04 用户:「卡片毛玻璃一点,更有设计感,现在都是白色背景平铺」)=================
|
||
底:页面铺一层很淡的粉→杏→薰衣草渐变,page-body 里再垫四团彩色光斑(.me-orbs),跟着内容一起滚;
|
||
卡:半透明白 + backdrop-filter 模糊提饱和 + 顶边一条高光 + 1px 白描边,光斑从卡片底下透出来。
|
||
⚠️ 写在文件末尾覆盖前面的白底规则;不支持 backdrop-filter 的机型退回 .72 白,仍然看得清。 */
|
||
#screen-me{background:linear-gradient(180deg,#FBF1EC 0%,#FCEFF1 45%,#F4EFFA 100%)}
|
||
#screen-me .page-body.no-top{isolation:isolate}
|
||
.me-orbs{position:absolute;inset:0;z-index:-1;pointer-events:none;overflow:hidden;font-style:normal}
|
||
.me-orbs b{position:absolute;border-radius:50%;filter:blur(6px)}
|
||
.me-orbs .o1{width:170px;height:170px;right:-50px;top:60px;background:radial-gradient(circle at 35% 35%,#FFB79A,#FF7F63 70%);opacity:.7}
|
||
.me-orbs .o2{width:180px;height:180px;left:-60px;top:290px;background:radial-gradient(circle at 40% 35%,#FFC6D6,#FF86A8 70%);opacity:.75}
|
||
.me-orbs .o3{width:150px;height:150px;right:-50px;top:380px;background:radial-gradient(circle at 40% 35%,#FFE3A6,#FFB84D 70%);opacity:.75}
|
||
.me-orbs .o4{width:130px;height:130px;left:36%;top:400px;background:radial-gradient(circle at 40% 35%,#DCD0FF,#A68DF5 70%);opacity:.6}
|
||
#screen-me .preg-card,#screen-me .mall-strip,#screen-me .svc-grid,#screen-me .me-logout,#screen-me .list-card{
|
||
background:linear-gradient(140deg,rgba(255,255,255,.7) 0%,rgba(255,255,255,.36) 100%);
|
||
-webkit-backdrop-filter:blur(20px) saturate(170%);backdrop-filter:blur(20px) saturate(170%);
|
||
box-shadow:inset 0 1px 0 rgba(255,255,255,.95),inset 0 0 0 1px rgba(255,255,255,.6),0 10px 28px rgba(176,96,80,.12)}
|
||
#screen-me .page-body.no-top>.preg-card:first-of-type{
|
||
box-shadow:inset 0 1px 0 rgba(255,255,255,.95),inset 0 0 0 1px rgba(255,255,255,.65),0 16px 34px rgba(140,56,34,.16)}
|
||
#screen-me .pc-ico,#screen-me .ms-ico,#screen-me .sv-ico{box-shadow:inset 0 0 0 1px rgba(255,255,255,.7)}
|
||
#screen-me .pc-bar{background:rgba(244,140,110,.16)}
|
||
#screen-me .sec-title{position:relative}
|
||
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
|
||
#screen-me .preg-card,#screen-me .mall-strip,#screen-me .svc-grid,#screen-me .me-logout,#screen-me .list-card{background:rgba(255,255,255,.82)}
|
||
}
|
||
|
||
/* ============ 2026-10-04 头图 ↔ 第一块卡片的衔接 ============
|
||
问题:衔接原本全靠「宝宝来信」卡的 margin-top:-16 压进头图;来信卡一收起来(大多数用户),
|
||
工具卡就改成往下空 30px,头图大弧底和平顶卡片之间露出一条米色缝,两块各管各的。
|
||
改法:不管谁是第一块,都压进头图。
|
||
· 头图 250 → 262,底边改平(弧线整个藏在卡片下面,不再有两套形状对拼)。
|
||
背景图高度钉死在 250,宝宝/孕囊/文字的竖向账一律不动;多出的 12px 用图底边的颜色补。
|
||
· 无来信时第一块 margin-top:-26(= 卡片圆角),卡顶 236:
|
||
天数卡底 218 → 留 18;孕囊下缘 229.5 → 留 6.5;卡片两个圆角 236~262 全落在橙色里。
|
||
· 有来信时头图回到原来的 250 + 弧底(app.js 给 .home-hero 同步切 .no-letter),来信卡仍 -16,跟以前一模一样。
|
||
· #homeBody 建层叠上下文(z-index:1),否则头图里 z-index:2/3 的子元素会盖到卡片上面。
|
||
· #homeBody 的彩色光斑往下错 26px 不平铺,免得盖到头图底上把橙色洗白。
|
||
· 第一块卡片:顶部向上一层淡投影(浮在头图上)、顶部改成更实的白(压在橙上也是干净的白)、
|
||
左上角主题色光晕减半;水印往下挪 10px,不再被右上圆角切掉。 */
|
||
.home-hero.no-letter{
|
||
height:calc(262px + env(safe-area-inset-top));
|
||
border-radius:0;
|
||
background:
|
||
linear-gradient(90deg,rgba(150,55,35,.20) 0%,rgba(150,55,35,.07) 38%,rgba(150,55,35,0) 58%),
|
||
url(assets/img/6a268e7269b7.jpg) right top/auto calc(250px + env(safe-area-inset-top)) no-repeat,
|
||
linear-gradient(90deg,#CE8069 0%,#D8886F 30%,#DB9073 100%);
|
||
}
|
||
#homeBody{z-index:1;background-position:0 26px;background-repeat:no-repeat}
|
||
.home-body.no-letter>:first-child,
|
||
.home-body.no-letter>.bb-banner.hide+.tool-dock{margin-top:-26px}
|
||
#homeBody.no-letter>section.tool-dock{
|
||
background:
|
||
linear-gradient(90deg,rgba(var(--gt),.28),rgba(var(--gt),0) 60%) top/100% 2px no-repeat,
|
||
radial-gradient(240px 110px at 0 0,rgba(var(--gt),.10),rgba(var(--gt),0) 72%),
|
||
linear-gradient(180deg,rgba(255,255,255,.95) 0,rgba(255,255,255,.7) 70px,rgba(255,255,255,.5) 160px)!important;
|
||
box-shadow:0 -6px 18px rgba(150,60,40,.10),0 12px 30px rgba(190,110,80,.10),0 2px 6px rgba(190,110,80,.04),inset 0 1px 0 #fff!important}
|
||
.tool-dock .wm{top:10px}
|
||
|
||
/* 2026-10-04 宝宝来信不再上首页卡,只在底 tab 提示:红点改成带数字的红圈(1 / 2 / … / 99+) */
|
||
.t-badge{min-width:17px;width:auto;height:17px;padding:0 4.5px;box-sizing:border-box;top:2px;left:calc(50% + 6px);
|
||
border-radius:999px;border:1.5px solid #fff;color:#fff;font:700 10.5px/14px -apple-system,"PingFang SC",sans-serif;text-align:center;
|
||
box-shadow:0 2px 6px rgba(255,59,48,.35)}
|
||
|
||
/* ============ 2026-10-04 头图文字层次(用户:「LOGO 不明显,不一定用彩色;天数、孕周全是大白字有点单调」) ============
|
||
· (同日撤回)LOGO 深棕白描边、倒计时白胶囊 —— 用户:「太扎眼」「加背景框也不好」。LOGO 回白字;倒计时去掉框,见下一段。
|
||
· 大孕周:白字加一道棕色实投影(贴纸厚度感);「周」「像西葫芦」换奶油色;「+6天」放进深色小胶囊。 */
|
||
.hi-week b{color:#fff;text-shadow:0 2px 0 rgba(140,50,28,.35),0 6px 14px rgba(120,30,10,.25)}
|
||
.hi-unit em{color:#FFE6BF}
|
||
.hi-unit span{display:inline-block;margin-top:4px;padding:1px 6px;border-radius:999px;font-size:11px;opacity:1;background:rgba(110,35,18,.28);color:#FFF1DC;text-shadow:none}
|
||
.hi-unit span:empty{display:none}
|
||
.hi-size{color:#FFE6BF}
|
||
|
||
/* 2026-10-04 再调:倒计时去掉背景框,只留一行字(♥ + 文案 + 奶油色加大的天数);孕囊整体轻轻上下浮,配合满幅羊水光影
|
||
(只是平移,宝宝形状不变;水波遮罩在 hero-fx.js 里每帧现读位置跟着走)。 */
|
||
.hi-due{background:none;border:0;padding:0;height:22px;gap:6px;font-size:12.5px}
|
||
.hi-due b{color:#FFE6BF;font-size:16px}
|
||
.hero-baby{animation:hbFloat 6s ease-in-out infinite}
|
||
@keyframes hbFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
|
||
@media (prefers-reduced-motion:reduce){.hero-baby{animation:none}}
|
||
|
||
/* 2026-10-04 羊水深度层:在宝宝下面(z1),正常混合,能压暗也能提亮;画满后盖住 CSS 背景(CSS 背景留作降级/首帧) */
|
||
.hero-water{position:absolute;z-index:1;left:0;top:0;width:100%;height:100%;pointer-events:none;opacity:0;transition:opacity 1s ease}
|
||
.hero-water.is-on{opacity:1}
|
||
|
||
/* ============ 2026-10-04 意见反馈(「我的」常用服务 → #modalFeedback) ============ */
|
||
.sv-ico.g{background:#E6F5EE;color:#2F9A6A}
|
||
.fb-modal{max-height:88vh;overflow-y:auto;-webkit-overflow-scrolling:touch}
|
||
.fb-lead{margin:6px 0 14px;font-size:13px;line-height:1.6;color:var(--muted)}
|
||
.fb-kinds{display:flex;gap:8px}
|
||
.fb-kind{flex:1;display:flex;align-items:center;justify-content:center;height:36px;border-radius:12px;border:1.5px solid #EFE3DA;background:#fff;color:var(--ink-2);font-size:13.5px;font-weight:700}
|
||
.fb-kind.on{border-color:var(--brand);background:#FFF1EC;color:var(--brand)}
|
||
.fb-ta-wrap{position:relative;margin-top:12px}
|
||
.fb-ta{display:block;width:100%;box-sizing:border-box;height:128px;resize:none;padding:13px 15px 26px;border-radius:14px;border:1.5px solid #EFE3DA;
|
||
background:#fff;font:inherit;font-size:14.5px;line-height:1.6;color:var(--ink)}
|
||
.fb-ta:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(244,89,60,.12)}
|
||
.fb-count{position:absolute;right:12px;bottom:8px;font-size:11.5px;color:#B9AAA0}
|
||
.fb-imgs{display:flex;align-items:center;gap:8px;margin-top:12px;flex-wrap:wrap}
|
||
.fb-add{width:64px;height:64px;border-radius:12px;border:1.5px dashed #E2CFC2;background:#fff;color:#B49A8A;
|
||
display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;font-size:11px}
|
||
.fb-add.hide{display:none}
|
||
.fb-thumb{position:relative;width:64px;height:64px;border-radius:12px;overflow:hidden;background:#F2E8E1}
|
||
.fb-thumb img{width:100%;height:100%;object-fit:cover;display:block}
|
||
.fb-thumb.up::after{content:"上传中";position:absolute;inset:0;display:grid;place-items:center;background:rgba(0,0,0,.35);color:#fff;font-size:11px}
|
||
.fb-thumb button{position:absolute;top:3px;right:3px;width:18px;height:18px;border-radius:50%;border:0;background:rgba(0,0,0,.5);color:#fff;font-size:12px;line-height:18px;padding:0}
|
||
.fb-imgs-tip{font-size:12px;color:#B9AAA0}
|
||
.fb-contact{margin-top:12px}
|
||
.fb-mine{margin-top:18px;padding-top:14px;border-top:1px solid #EFE3DA}
|
||
.fb-mine h4{margin:0 0 8px;font-size:13.5px;color:var(--ink-2)}
|
||
.fb-item{padding:10px 12px;border-radius:12px;background:#fff;margin-top:8px;font-size:13px;line-height:1.55;color:var(--ink)}
|
||
.fb-item-h{display:flex;align-items:center;gap:6px;margin-bottom:3px;font-size:11.5px;color:var(--muted)}
|
||
.fb-item-h b{font-weight:700;color:var(--ink-2)}
|
||
.fb-st{margin-left:auto;padding:1px 7px;border-radius:999px;background:#F3ECE6;color:#A08D80;font-size:11px}
|
||
.fb-st.done{background:#E6F5EE;color:#2F9A6A}
|
||
.fb-reply{margin-top:6px;padding:7px 9px;border-radius:9px;background:#FFF6EF;color:#9A5A3C;font-size:12.5px}
|