93fc9bc5da
- 头像改圆形 + 白边(和保存的图一致) - 周期做成小胶囊;数据清单每行「绿勾 + 项目 + 数值右对齐」,更整齐 - 健康状态做成绿色徽章;生成自弱化 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
552 lines
26 KiB
Plaintext
552 lines
26 KiB
Plaintext
/* ===== 全局设计令牌 + 通用样式 =====
|
||
规则:任何页面/组件都不要再写死色值、圆角、字号,一律用下面的 token。
|
||
收敛前的现状是 22 种圆角、26 档字号、9 种近似浅橙、7 处一次性阴影,
|
||
font-weight 900 到处都是——什么都在喊,于是什么都不突出。 */
|
||
page{
|
||
/* ── 底色与文字 ── */
|
||
--bg:#F8F6F2;
|
||
--bg2:#FBF8F3;
|
||
--card:#FFFFFF;
|
||
--surface-2:#FBFAF8; /* 卡片内的次级底色(原本硬编码出现 10+ 次) */
|
||
--text:#2D2925;
|
||
--text-2:#5F554D; /* 正文次级灰(原本有 7 种近似值散落各处) */
|
||
--muted:#8D8277;
|
||
--muted2:#B5A99D;
|
||
--line:#EEE6DC;
|
||
|
||
/* ── 主色 ── */
|
||
--primary:#F5A947;
|
||
--primary2:#FFBF68;
|
||
--primary-dark:#DD8420;
|
||
--primary-soft:#FFF4E4; /* 唯一的浅橙底(收编了 9 种近似值) */
|
||
--primary-line:#FFD6A1; /* 浅橙块的描边 */
|
||
--primary-ink:#A96500; /* 浅橙底上的文字 */
|
||
/* 门面品牌色带(首页/记录页顶部,方案 A)*/
|
||
--band-a:#FFC768;
|
||
--band-b:#F5A947;
|
||
--band-ink:#7A4A08; /* 色带上的深棕文字 */
|
||
|
||
/* ── 语义色:soft 底 / base 主体 / ink 文字,三件套配齐 ── */
|
||
--green:#73BE9D; --green-soft:#EAF7F1; --green-ink:#2E7D5B;
|
||
--red:#EE7D73; --red-soft:#FFF0EE; --red-ink:#C95348;
|
||
--blue:#78A6E8; --blue-soft:#EEF5FF; --blue-ink:#3C6EBA;
|
||
--purple:#A993E8; --purple-soft:#F4F0FF; --purple-ink:#765AC5;
|
||
--yellow-soft:#FFF6E4;
|
||
|
||
/* ── 深色主 CTA。全页最多一个,用来指明「这一步该点哪」 ── */
|
||
--cta:#2D2925;
|
||
|
||
/* ── 圆角 5 档 ── */
|
||
--r-xs:12rpx;
|
||
--r-sm:20rpx;
|
||
--r-md:28rpx;
|
||
--r-lg:40rpx; /* 卡片 */
|
||
--r-full:999rpx;
|
||
--radius:var(--r-lg); /* 兼容旧名,页面里还有引用 */
|
||
|
||
/* ── 字号 6 档 ── */
|
||
--fs-cap:22rpx;
|
||
--fs-sm:24rpx;
|
||
--fs-md:28rpx;
|
||
--fs-lg:32rpx;
|
||
--fs-xl:40rpx;
|
||
--fs-2xl:48rpx;
|
||
|
||
/* ── 字重只留两档。强调靠颜色和字号,不靠把所有东西都加粗 ── */
|
||
--fw:400;
|
||
--fw-b:600;
|
||
|
||
/* ── 间距 6 档 ── */
|
||
--sp-1:8rpx; --sp-2:12rpx; --sp-3:16rpx;
|
||
--sp-4:24rpx; --sp-5:32rpx; --sp-6:40rpx;
|
||
|
||
/* ── 控件高度 3 档 ── */
|
||
--h-sm:68rpx;
|
||
--h-md:80rpx;
|
||
--h-lg:96rpx;
|
||
|
||
/* ── 阴影 3 档(原来 7 处一次性阴影,且都偏重) ── */
|
||
--sd-1:0 12rpx 32rpx rgba(70,48,25,.06);
|
||
--sd-2:0 20rpx 48rpx rgba(70,48,25,.10);
|
||
--sd-3:0 -20rpx 60rpx rgba(70,48,25,.14);
|
||
--shadow:var(--sd-1); /* 兼容旧名 */
|
||
--shadow2:var(--sd-2);
|
||
|
||
/* 页面留白。FAB 固定在 bottom:190rpx、高 116rpx,上沿距底 306rpx,
|
||
内容必须让开这段距离,否则最后一张卡会被它压住。 */
|
||
--pad-x:40rpx;
|
||
--pad-b-fab:calc(330rpx + env(safe-area-inset-bottom));
|
||
--pad-b-plain:calc(60rpx + env(safe-area-inset-bottom));
|
||
/* tab 页底下有原生 tabBar(高 108rpx)。报告页/我的没有 FAB,用 no-fab 的
|
||
60rpx 让不开 tabBar,最后一张卡会被 tabBar 压住 —— 这两页要用这个 */
|
||
--pad-b-tab:calc(150rpx + env(safe-area-inset-bottom));
|
||
|
||
color:var(--text);
|
||
font-weight:var(--fw);
|
||
font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","PingFang SC","Microsoft YaHei",sans-serif;
|
||
/* 整页暖橘竖向淡出:顶部品牌橘暖调 → 约半屏处褪到米白。
|
||
渐变铺在 page 上(不滚),内容在 .page-scroll 里滚过它,顶部常暖。 */
|
||
background:
|
||
linear-gradient(180deg,
|
||
#FFC66E 0%,
|
||
#FFD489 10%,
|
||
#FCE6C4 28%,
|
||
var(--bg) 48%,
|
||
var(--bg) 100%);
|
||
|
||
/* 页面自身不滚,滚动交给 .page-scroll,这样 nav-bar 和 tabBar 才能固定住。
|
||
这 4 行原本在 9 个页面的 wxss 里逐字重复。 */
|
||
height:100vh;
|
||
overflow:hidden;
|
||
display:flex;
|
||
flex-direction:column;
|
||
position:relative; /* 门面色带 .brand-band 绝对定位锚在页面上 */
|
||
}
|
||
view,text{box-sizing:border-box}
|
||
|
||
/* 页面骨架:nav-bar → .page-scroll(承载滚动) → .page-body(内容留白) */
|
||
.page-scroll{flex:1;min-height:0}
|
||
.page-body{padding:var(--sp-1) var(--pad-x) var(--pad-b-fab)}
|
||
/* 没挂 FAB 的页面(目前只有文章详情)不需要给它让位 */
|
||
.page-body.no-fab{padding-bottom:var(--pad-b-plain)}
|
||
.page-body.tab-nofab{padding-bottom:var(--pad-b-tab)}
|
||
|
||
/* 全局隐藏滚动条(页面级 + 组件级),保留正常滚动 */
|
||
::-webkit-scrollbar{
|
||
width:0 !important;
|
||
height:0 !important;
|
||
display:none;
|
||
-webkit-appearance:none;
|
||
background:transparent;
|
||
color:transparent;
|
||
}
|
||
page{scrollbar-width:none;-ms-overflow-style:none}
|
||
|
||
/* 文本 */
|
||
.muted{color:var(--muted)}
|
||
.tiny{font-size:var(--fs-sm);color:var(--muted)}
|
||
.bold{font-weight:var(--fw-b)}
|
||
|
||
/* 区块标题 */
|
||
.section-head{
|
||
display:flex;align-items:center;justify-content:space-between;margin:var(--sp-1) 0 var(--sp-4);
|
||
}
|
||
.section-head .sh-title{font-size:var(--fs-lg);letter-spacing:-.4rpx;font-weight:var(--fw-b)}
|
||
.link{color:var(--primary-dark);font-weight:var(--fw-b);font-size:var(--fs-md)}
|
||
/* 一组 .link 当「切换」用时:未选中压成灰,不然两个都是橙的、看不出当前在哪。
|
||
单独一个 .link-tabs 而不是挂在 .head-links 上——首页的「管理 / 全部完成」
|
||
也用 head-links,那是两个并列动作,不该有一个是灰的 */
|
||
.link-tabs{display:flex;gap:var(--sp-4)}
|
||
.link-tabs .link{color:var(--muted)}
|
||
.link-tabs .link.on{color:var(--primary-dark)}
|
||
.head-links{display:flex;align-items:center;gap:var(--sp-4)}
|
||
|
||
/* 页面标题。
|
||
小程序没有 h2/p/b/span 标签,从 preview.html 迁移来的标签选择器全是死规则,
|
||
各页当初都自建了替身 class(.pt-h2 在 5 个文件里逐字重复),这里统一收编。 */
|
||
.page-title{margin:4rpx 0 var(--sp-4)}
|
||
.pt-h2{font-size:var(--fs-2xl);letter-spacing:-.6rpx;font-weight:var(--fw-b)}
|
||
.pt-p{color:var(--muted);font-size:var(--fs-md);margin-top:10rpx}
|
||
|
||
/* 按钮 */
|
||
.btn{
|
||
border:0;height:var(--h-lg);border-radius:var(--r-md);padding:0 var(--sp-5);
|
||
display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-2);
|
||
font-weight:var(--fw-b);font-size:var(--fs-lg);line-height:1.3;transition:.16s ease;
|
||
min-height:var(--h-lg);height:auto;padding-top:var(--sp-2);padding-bottom:var(--sp-2);
|
||
}
|
||
.btn::after{border:none}
|
||
.btn:active{transform:scale(.98)}
|
||
/* 主按钮保持暖橙:它在 36 处被使用,绝大多数是弹层里的「保存」,
|
||
把它改成深色会让整个 App 的主色消失。深色 CTA 走 .btn-dark。 */
|
||
.btn-primary{color:#fff;background:var(--primary);box-shadow:0 12rpx 28rpx rgba(245,169,71,.24)}
|
||
.btn-dark{color:#fff;background:var(--cta)}
|
||
.btn-ghost{color:var(--text);background:#fff;border:1rpx solid var(--line)}
|
||
.btn-soft{color:var(--primary-ink);background:var(--primary-soft)}
|
||
.btn-green{color:#fff;background:var(--green)}
|
||
.btn-block{width:100%;display:flex}
|
||
.btn-small{min-height:var(--h-sm);border-radius:var(--r-sm);padding:0 var(--sp-4);font-size:var(--fs-sm)}
|
||
|
||
/* 卡片 */
|
||
.card{
|
||
background:var(--card);border-radius:var(--r-lg);box-shadow:var(--sd-1);
|
||
padding:var(--sp-5);margin-bottom:var(--sp-4);position:relative;overflow:hidden;
|
||
}
|
||
.card.no-shadow{box-shadow:none;border:1rpx solid var(--line)}
|
||
|
||
/* 标签 */
|
||
.tag{
|
||
display:inline-flex;align-items:center;height:48rpx;border-radius:var(--r-full);padding:0 var(--sp-3);
|
||
font-size:var(--fs-sm);font-weight:var(--fw-b);background:var(--green-soft);color:var(--green-ink);white-space:nowrap;
|
||
}
|
||
.tag.warn{background:var(--primary-soft);color:var(--primary-ink)}
|
||
.tag.red{background:var(--red-soft);color:var(--red-ink)}
|
||
.tag.blue{background:var(--blue-soft);color:var(--blue-ink)}
|
||
.tag.purple{background:var(--purple-soft);color:var(--purple-ink)}
|
||
|
||
/* 状态 chip:比 tag 矮,可带图标,用于「体重稳定」「驱虫将到期」这类瞬时状态 */
|
||
.chip{
|
||
display:inline-flex;align-items:center;gap:var(--sp-1);height:44rpx;padding:0 var(--sp-3);
|
||
border-radius:var(--r-full);font-size:var(--fs-cap);font-weight:var(--fw-b);
|
||
background:var(--primary-soft);color:var(--primary-ink);white-space:nowrap;
|
||
}
|
||
.chip.green{background:var(--green-soft);color:var(--green-ink)}
|
||
.chip.red{background:var(--red-soft);color:var(--red-ink)}
|
||
.chip.blue{background:var(--blue-soft);color:var(--blue-ink)}
|
||
|
||
/* 4 色分类块。用在快速记录入口这类并列的功能格上,靠颜色区分类别而不是靠 emoji */
|
||
.tone-1{background:var(--primary-soft);color:var(--primary-ink)}
|
||
.tone-2{background:var(--green-soft);color:var(--green-ink)}
|
||
.tone-3{background:var(--blue-soft);color:var(--blue-ink)}
|
||
.tone-4{background:var(--purple-soft);color:var(--purple-ink)}
|
||
|
||
/* 记录入口宫格。首页(4 列 8 个)和记录页(3 列 9 个)原本是同一个东西的两个副本,
|
||
高度/圆角/阴影/字号全不一样,这里合成一套。 */
|
||
.quick-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sp-2)}
|
||
.quick-grid.cols-3{grid-template-columns:repeat(3,1fr)}
|
||
.quick{
|
||
border-radius:var(--r-md);min-height:128rpx;
|
||
display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-1);
|
||
font-weight:var(--fw-b);font-size:var(--fs-sm);
|
||
}
|
||
|
||
/* 空态。原本有 6 套长得差不多的写法散在各页 */
|
||
.empty{padding:56rpx var(--sp-1);text-align:center;color:var(--muted);font-size:var(--fs-sm)}
|
||
.empty.lg{padding:96rpx 0}
|
||
|
||
/* 表单 */
|
||
.field{margin-bottom:var(--sp-4)}
|
||
.field:last-child{margin-bottom:0}
|
||
.field label{display:block;font-size:var(--fs-md);color:var(--muted);font-weight:var(--fw-b);margin-bottom:var(--sp-3)}
|
||
.input,input,textarea,.picker-box{
|
||
width:100%;border:1rpx solid var(--line);background:var(--surface-2);height:88rpx;border-radius:var(--r-md);
|
||
padding:0 var(--sp-4);color:var(--text);font-size:var(--fs-lg);outline:none;box-sizing:border-box;
|
||
display:flex;align-items:center;
|
||
}
|
||
.textarea{
|
||
width:100%;border:1rpx solid var(--line);background:var(--surface-2);height:184rpx;border-radius:var(--r-md);
|
||
padding:var(--sp-4);color:var(--text);font-size:var(--fs-lg);box-sizing:border-box;
|
||
}
|
||
/* 上面那条共用规则的 flex+align-items:center 是给单行 input 竖向居中用的,
|
||
但选择器带了 textarea,导致多行输入的占位/文字被竖向居中、不从第一行开始。
|
||
这里把 textarea 改回块级顶部对齐,各自的高度仍由具体 class 决定 */
|
||
textarea{display:block;padding:var(--sp-4);line-height:1.6}
|
||
.placeholder{color:var(--muted2)}
|
||
|
||
/* 分段选择 */
|
||
.seg{display:flex;gap:var(--sp-3)}
|
||
.seg .seg-btn{
|
||
flex:1;height:var(--h-md);line-height:var(--h-md);text-align:center;border-radius:var(--r-md);
|
||
border:1rpx solid var(--line);background:#fff;color:var(--muted);font-weight:var(--fw-b);font-size:var(--fs-md);
|
||
}
|
||
.seg .seg-btn.selected{color:var(--primary-dark);background:var(--primary-soft);border-color:var(--primary-line)}
|
||
|
||
/* 多选 check */
|
||
.check-list{display:flex;flex-direction:column;gap:var(--sp-3);margin:var(--sp-5) 0}
|
||
.check{
|
||
display:flex;align-items:center;gap:var(--sp-3);background:#fff;box-shadow:var(--sd-1);
|
||
border-radius:var(--r-md);padding:var(--sp-4);border:1rpx solid transparent;font-size:var(--fs-md);font-weight:var(--fw-b);
|
||
}
|
||
.box{
|
||
width:44rpx;height:44rpx;border-radius:var(--r-xs);border:4rpx solid #DDCEC1;
|
||
display:flex;align-items:center;justify-content:center;color:#fff;flex:none;
|
||
font-size:var(--fs-md);font-weight:var(--fw-b);
|
||
}
|
||
.check.selected{background:var(--primary-soft);border-color:var(--primary-line)}
|
||
.check.selected .box{background:var(--primary);border-color:var(--primary)}
|
||
|
||
/* 圆形/条形选项 */
|
||
.mini-options{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin:var(--sp-3) 0 var(--sp-4)}
|
||
.option{
|
||
border:1rpx solid var(--line);background:#fff;border-radius:var(--r-full);height:var(--h-sm);line-height:var(--h-sm);
|
||
padding:0 var(--sp-4);color:var(--text-2);font-weight:var(--fw-b);font-size:var(--fs-sm);
|
||
}
|
||
.option.selected{background:var(--primary-soft);color:var(--primary-dark);border-color:var(--primary-line)}
|
||
|
||
/* 进度条 */
|
||
.progress-row{
|
||
display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--sp-3);
|
||
font-size:var(--fs-md);color:var(--text-2);font-weight:var(--fw-b);
|
||
}
|
||
.bar{height:var(--sp-3);border-radius:var(--r-full);background:#F0E7DD;overflow:hidden}
|
||
.bar .bar-fill{
|
||
height:100%;border-radius:var(--r-full);
|
||
background:linear-gradient(90deg,var(--primary),#FFD57F);display:block;transition:.25s ease;
|
||
}
|
||
|
||
/* 头像 */
|
||
.avatar{
|
||
width:120rpx;height:120rpx;border-radius:var(--r-lg);
|
||
background:linear-gradient(135deg,#FFE5B7,#FFC06B);
|
||
display:flex;align-items:center;justify-content:center;font-size:64rpx;
|
||
box-shadow:var(--sd-1);flex:none;
|
||
}
|
||
|
||
/* 多宠切换 */
|
||
.pet-switch{display:flex;gap:var(--sp-3);overflow-x:auto;padding:0 0 var(--sp-4);white-space:nowrap}
|
||
.pet-switch::-webkit-scrollbar{display:none}
|
||
.pet-chip{
|
||
flex:none;display:inline-flex;border:1rpx solid var(--line);background:#fff;border-radius:var(--r-full);
|
||
padding:var(--sp-2) var(--sp-4);align-items:center;gap:var(--sp-2);color:var(--muted);font-weight:var(--fw-b);font-size:var(--fs-md);
|
||
}
|
||
.pet-chip.active{color:var(--primary-dark);background:var(--primary-soft);border-color:var(--primary-line)}
|
||
|
||
/* 任务列表 */
|
||
.task-list{display:flex;flex-direction:column;gap:var(--sp-2)}
|
||
.task{display:flex;gap:var(--sp-3);align-items:flex-start;background:var(--surface-2);border-radius:var(--r-md);padding:var(--sp-4);transition:.15s ease}
|
||
.circle{
|
||
width:44rpx;height:44rpx;border-radius:50%;border:4rpx solid #DED1C4;display:flex;
|
||
align-items:center;justify-content:center;color:#fff;font-size:var(--fs-sm);flex:none;margin-top:2rpx;
|
||
}
|
||
.task.done{opacity:.55}
|
||
.task.done .circle{background:var(--green);border-color:var(--green)}
|
||
.task-text{flex:1}
|
||
.tt-b{font-size:var(--fs-md);font-weight:var(--fw-b)}
|
||
.tt-p{font-size:var(--fs-sm);color:var(--muted);margin-top:var(--sp-1);line-height:1.45}
|
||
.priority{
|
||
font-size:var(--fs-cap);color:var(--primary-ink);background:var(--primary-soft);
|
||
border-radius:var(--r-full);padding:6rpx var(--sp-2);font-weight:var(--fw-b);flex:none;
|
||
}
|
||
|
||
/* 记录行 */
|
||
.record-row{
|
||
display:flex;justify-content:space-between;align-items:center;padding:var(--sp-4) 0;
|
||
border-bottom:1rpx solid var(--line);font-size:var(--fs-md);
|
||
}
|
||
.record-row:last-child{border-bottom:0}
|
||
|
||
/* 统计格 */
|
||
.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-3);margin:var(--sp-4) 0}
|
||
.stat{background:#fff;border:1rpx solid var(--line);border-radius:var(--r-md);padding:var(--sp-4) var(--sp-2);text-align:center}
|
||
.stat-b{display:block;font-size:var(--fs-xl);margin-bottom:6rpx;font-weight:var(--fw-b)}
|
||
.stat-s{font-size:var(--fs-cap);color:var(--muted)}
|
||
|
||
/* 文章卡 */
|
||
.article-card{
|
||
display:flex;gap:var(--sp-4);background:#fff;border-radius:var(--r-lg);padding:var(--sp-4);box-shadow:var(--sd-1);margin-bottom:var(--sp-4);
|
||
}
|
||
.article-icon{
|
||
width:104rpx;height:104rpx;border-radius:var(--r-md);flex:none;display:flex;align-items:center;
|
||
justify-content:center;background:var(--primary-soft);color:var(--primary-ink);font-size:48rpx;
|
||
}
|
||
.ac-b{font-size:var(--fs-lg);font-weight:var(--fw-b)}
|
||
.ac-p{color:var(--muted);font-size:var(--fs-sm);line-height:1.45;margin-top:10rpx}
|
||
|
||
/* 海报 */
|
||
.poster{
|
||
background:
|
||
radial-gradient(circle at 100% 0%, rgba(245,169,71,.24), transparent 35%),
|
||
linear-gradient(160deg,#FFF7E8,#FFFFFF);
|
||
border:1rpx solid #F2DFC3;border-radius:var(--r-lg);padding:var(--sp-5);text-align:center;overflow:hidden;position:relative;
|
||
}
|
||
/* 圆头像 + 白边,和保存的图一致 */
|
||
.poster-avatar{
|
||
width:160rpx;height:160rpx;margin:var(--sp-4) auto var(--sp-3);border-radius:50%;
|
||
background:linear-gradient(135deg,#FFE5B7,#FFC06B);display:flex;align-items:center;justify-content:center;
|
||
font-size:80rpx;box-shadow:var(--sd-1);overflow:hidden;border:6rpx solid #fff;
|
||
}
|
||
.poster-avatar-img{width:100%;height:100%;display:block}
|
||
.poster-meta{font-size:var(--fs-md);color:var(--muted)}
|
||
/* 周期做成小胶囊 */
|
||
.poster-period{
|
||
display:inline-block;margin-top:12rpx;padding:4rpx var(--sp-3);border-radius:var(--r-full);
|
||
background:var(--primary-soft);color:var(--primary-ink);
|
||
font-size:var(--fs-cap);font-weight:var(--fw-b);
|
||
}
|
||
/* 数据清单:每行 打勾 + 项目 + 数值 右对齐 */
|
||
.poster-list{
|
||
background:rgba(255,255,255,.78);border-radius:var(--r-md);
|
||
padding:var(--sp-3) var(--sp-4);margin:var(--sp-5) 0 var(--sp-4);
|
||
}
|
||
.poster-row{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-2) 0}
|
||
.poster-tick{
|
||
width:36rpx;height:36rpx;flex:none;border-radius:50%;
|
||
background:var(--green-soft);color:var(--green-ink);
|
||
display:flex;align-items:center;justify-content:center;
|
||
}
|
||
.poster-rt{flex:1;text-align:left;font-size:var(--fs-md);color:var(--text-2)}
|
||
.poster-rn{font-size:var(--fs-md);font-weight:var(--fw-b);color:var(--text)}
|
||
/* 健康状态徽章 */
|
||
.poster-status{
|
||
display:flex;align-items:center;justify-content:center;gap:var(--sp-2);
|
||
font-size:var(--fs-md);font-weight:var(--fw-b);color:var(--text);margin-top:var(--sp-2);
|
||
}
|
||
.poster-badge{
|
||
padding:4rpx var(--sp-3);border-radius:var(--r-full);
|
||
background:var(--green-soft);color:var(--green-ink);font-size:var(--fs-sm);
|
||
}
|
||
.poster-from{margin-top:var(--sp-4);font-size:var(--fs-cap);color:var(--muted2)}
|
||
|
||
/* 风险盒 */
|
||
.risk-box{
|
||
background:var(--primary-soft);color:var(--primary-ink);padding:var(--sp-4);border-radius:var(--r-md);font-weight:var(--fw-b);
|
||
display:flex;gap:var(--sp-3);margin-bottom:var(--sp-4);align-items:center;
|
||
}
|
||
|
||
/* 弹层内动作行 */
|
||
.sheet-actions{display:flex;gap:var(--sp-3);margin-top:var(--sp-4)}
|
||
.sheet-actions .btn{flex:1}
|
||
|
||
/* 聊天气泡 */
|
||
.plan-chat{display:flex;flex-direction:column;gap:var(--sp-3);margin-bottom:var(--sp-4)}
|
||
.msg{max-width:88%;border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);font-size:var(--fs-md);line-height:1.55}
|
||
.msg.ai{background:var(--green-soft);align-self:flex-start}
|
||
.msg.user{background:var(--primary-soft);align-self:flex-end}
|
||
|
||
/* 没有宠物时的引导块。四个主页面都会 currentPetId 为空直接 return,
|
||
留下一堆空卡片却不解释为什么——用户以为是坏了。 */
|
||
.no-pet{
|
||
background:#fff;border-radius:var(--r-lg);box-shadow:var(--sd-1);
|
||
padding:var(--sp-6) var(--sp-5);text-align:center;margin-bottom:var(--sp-4);
|
||
}
|
||
.no-pet-ic{
|
||
width:104rpx;height:104rpx;border-radius:var(--r-md);margin:0 auto var(--sp-3);
|
||
display:flex;align-items:center;justify-content:center;
|
||
background:var(--primary-soft);color:var(--primary-ink);
|
||
}
|
||
.no-pet-b{font-size:var(--fs-lg);font-weight:var(--fw-b)}
|
||
.no-pet-p{color:var(--muted);font-size:var(--fs-sm);margin:var(--sp-2) 0 var(--sp-4);line-height:1.6}
|
||
|
||
/* 顶部固定条:宠物切换 / 社区分类。
|
||
它在文档流里而不是浮层——内容永远不会滚到它下面,所以不需要任何背景。
|
||
之前给了不透明底色 + 分隔线,等于在页面渐变上贴了块补丁,
|
||
屏幕上就出现三条颜色不搭的横带。 */
|
||
.top-bar{flex:none;padding:var(--sp-2) var(--pad-x) 0}
|
||
.top-bar .pet-switch{padding-bottom:var(--sp-2)}
|
||
.top-bar .st-pill{padding-bottom:var(--sp-2)}
|
||
|
||
/* 切换条压在暖色顶部:chip 改成半透明白 + 深棕字,选中的实白 */
|
||
.top-bar.on-band .pet-chip{
|
||
background:rgba(255,255,255,.42);border-color:transparent;color:var(--band-ink);
|
||
}
|
||
.top-bar.on-band .pet-chip.active{background:#fff;color:var(--text);border-color:transparent}
|
||
.top-bar.on-band .pet-chip-add{color:rgba(122,74,8,.75)}
|
||
|
||
/* 帖子卡。社区和用户主页都要用,页面级 wxss 不跨页生效,所以放全局 */
|
||
.post-card{background:#fff;border-radius:var(--r-lg);box-shadow:var(--sd-1);padding:var(--sp-4);margin-bottom:var(--sp-4)}
|
||
.post-head{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3)}
|
||
.post-avatar{
|
||
width:80rpx;height:80rpx;border-radius:var(--r-sm);background:var(--primary-soft);
|
||
display:flex;align-items:center;justify-content:center;font-size:40rpx;flex:none;
|
||
}
|
||
.post-user{flex:1;min-width:0}
|
||
.pu-b{font-size:var(--fs-md);display:block;font-weight:var(--fw-b)}
|
||
.ai-tag{
|
||
display:inline-block;margin-left:var(--sp-1);padding:0 var(--sp-1);border-radius:var(--r-xs);
|
||
background:var(--blue-soft);color:var(--blue-ink);font-size:var(--fs-cap);font-weight:var(--fw-b);vertical-align:1rpx;
|
||
}
|
||
.pu-s{font-size:var(--fs-sm);color:var(--muted)}
|
||
.post-content{font-size:var(--fs-md);line-height:1.62;color:var(--text-2);margin-bottom:var(--sp-3)}
|
||
|
||
.photo-grid{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-bottom:var(--sp-3)}
|
||
.photo-tile{
|
||
/* 固定尺寸小缩略图,正方形。不用 aspect-ratio(微信渲染不生效,竖图会被撑长),
|
||
显式 width/height 最稳;mode=aspectFill 裁成正方,点击再走 previewImage 放大 */
|
||
width:210rpx;height:210rpx;flex:none;overflow:hidden;
|
||
border-radius:var(--r-sm);background:var(--primary-soft);
|
||
display:flex;align-items:center;justify-content:center;font-size:56rpx;
|
||
}
|
||
|
||
/* 三等分。原来是 space-around 排三个宽度不一的项,点赞数一变宽度就跳 */
|
||
.post-actions{display:flex;border-top:1rpx solid var(--line);padding-top:var(--sp-2)}
|
||
.pa-btn{
|
||
flex:1;height:72rpx;
|
||
display:flex;align-items:center;justify-content:center;gap:var(--sp-1);
|
||
color:var(--muted);font-weight:var(--fw);font-size:var(--fs-sm);
|
||
}
|
||
.pa-n{line-height:1}
|
||
.pa-btn.liked{color:var(--red-ink)}
|
||
.pa-btn:active{background:var(--surface-2);border-radius:var(--r-sm)}
|
||
/* 分享用微信原生 open-type=share,得抹掉 button 默认外观 */
|
||
.pa-share{background:transparent;border:none;padding:0;margin:0;line-height:inherit}
|
||
.pa-share::after{border:none}
|
||
|
||
/* ===== 设置项列表 =====
|
||
settings 和 mine 都在用。页面级 wxss 跨不了页,放在任一页里另一页就是裸的 */
|
||
.profile-list{background:#fff;border-radius:var(--r-lg);box-shadow:var(--sd-1);overflow:hidden;margin-bottom:var(--sp-4)}
|
||
.profile-row{
|
||
display:flex;align-items:center;gap:var(--sp-3);min-height:104rpx;padding:0 var(--sp-4);
|
||
border-bottom:1rpx solid var(--line);font-size:var(--fs-md);font-weight:var(--fw-b);
|
||
}
|
||
.profile-row:last-child{border-bottom:0}
|
||
.pr-ic{
|
||
width:56rpx;height:56rpx;border-radius:var(--r-xs);flex:none;
|
||
display:flex;align-items:center;justify-content:center;
|
||
background:var(--primary-soft);color:var(--primary-ink);
|
||
}
|
||
.pr-label{flex:1;min-width:0}
|
||
.pr-val{color:var(--muted);font-weight:var(--fw);font-size:var(--fs-sm)}
|
||
.pr-arrow{color:var(--muted2);display:flex;align-items:center;flex:none}
|
||
|
||
/* ===== 关注按钮 =====
|
||
社区列表和关注/粉丝列表都在用。同上:两页共用的就不能留在任一页的 wxss 里 */
|
||
.follow-btn{
|
||
flex:none;font-size:var(--fs-cap);font-weight:var(--fw-b);padding:6rpx var(--sp-3);border-radius:var(--r-full);
|
||
color:var(--primary-dark);background:var(--primary-soft);border:1rpx solid var(--primary-line);
|
||
}
|
||
.follow-btn.on{color:var(--muted);background:#F4F1EC;border-color:var(--line)}
|
||
|
||
/* ===== 关注按钮 =====
|
||
社区列表和关注/粉丝列表都在用。同上:两页共用的就不能留在任一页的 wxss 里 */
|
||
.follow-btn{
|
||
flex:none;font-size:var(--fs-cap);font-weight:var(--fw-b);padding:6rpx var(--sp-3);border-radius:var(--r-full);
|
||
color:var(--primary-dark);background:var(--primary-soft);border:1rpx solid var(--primary-line);
|
||
}
|
||
.follow-btn.on{color:var(--muted);background:#F4F1EC;border-color:var(--line)}
|
||
|
||
/* ===== 记录类型分组宫格 =====
|
||
记录页和历史页都在用。页面级 wxss 跨不了页,所以放全局。
|
||
组的着色走 g-1..g-4,不要复用 tone-N —— tone-N 自带背景色,
|
||
套在分组外层会把整块涂成色块。 */
|
||
.tg{margin-bottom:var(--sp-5)}
|
||
.tg:last-of-type{margin-bottom:0}
|
||
.tg-head{
|
||
display:flex;align-items:center;gap:var(--sp-2);
|
||
font-size:var(--fs-md);font-weight:var(--fw-b);margin-bottom:var(--sp-3);
|
||
}
|
||
.tg-bar{width:6rpx;height:26rpx;border-radius:3rpx;background:currentColor}
|
||
.g-1 .tg-head{color:var(--primary-ink)}
|
||
.g-2 .tg-head{color:var(--green-ink)}
|
||
.g-3 .tg-head{color:var(--blue-ink)}
|
||
.g-4 .tg-head{color:var(--purple-ink)}
|
||
|
||
/* ===== 关注按钮 =====
|
||
社区列表和关注/粉丝列表都在用。同上:两页共用的就不能留在任一页的 wxss 里 */
|
||
.follow-btn{
|
||
flex:none;font-size:var(--fs-cap);font-weight:var(--fw-b);padding:6rpx var(--sp-3);border-radius:var(--r-full);
|
||
color:var(--primary-dark);background:var(--primary-soft);border:1rpx solid var(--primary-line);
|
||
}
|
||
.follow-btn.on{color:var(--muted);background:#F4F1EC;border-color:var(--line)}
|
||
|
||
/* ===== 记录类型分组宫格 =====
|
||
记录页和「快速记录」弹层都在用,页面级 wxss 跨不了页
|
||
四组各一个色系,色值全走 token 的 soft/ink 二件套,没有新色。
|
||
.quick 的配色由 .tone-N 决定(app.wxss 里已有),这里只管组标题和留白 */
|
||
.tg{margin-bottom:var(--sp-4)}
|
||
.tg:last-of-type{margin-bottom:0}
|
||
.tg-head{
|
||
display:flex;align-items:center;gap:var(--sp-2);
|
||
font-size:var(--fs-md);font-weight:var(--fw-b);margin-bottom:var(--sp-3);
|
||
}
|
||
.tg-bar{width:6rpx;height:26rpx;border-radius:3rpx;background:currentColor}
|
||
.tg-n{margin-left:auto;font-size:var(--fs-cap);font-weight:var(--fw);color:var(--muted2)}
|
||
.tg.tone-1 .tg-head{color:var(--primary-ink)}
|
||
.tg.tone-2 .tg-head{color:var(--green-ink)}
|
||
.tg.tone-3 .tg-head{color:var(--blue-ink)}
|
||
.tg.tone-4 .tg-head{color:var(--purple-ink)}
|
||
|
||
/* ===== 日历网格 =====
|
||
首页(可展开日历)和计划页(30 天计划日历)都在用 */
|
||
.cal-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--sp-3);font-weight:var(--fw-b);font-size:var(--fs-lg)}
|
||
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:var(--sp-2);text-align:center}
|
||
.cal-w{font-size:var(--fs-cap);color:var(--muted);padding:var(--sp-1) 0}
|
||
.cal-cell{
|
||
height:76rpx;border-radius:var(--r-sm);display:flex;align-items:center;justify-content:center;
|
||
font-weight:var(--fw-b);font-size:var(--fs-sm);background:var(--surface-2);position:relative;
|
||
}
|
||
.cal-cell.blank{background:transparent}
|
||
.cal-cell.today{background:var(--primary-soft);color:var(--primary-dark)}
|
||
.cal-cell.tasked::after{content:"";position:absolute;bottom:8rpx;width:8rpx;height:8rpx;border-radius:50%;background:var(--green)}
|
||
.cal-cell.sel{background:var(--primary);color:#fff}
|
||
.cal-cell.sel.tasked::after{background:#fff}
|