From 91caac1b92ae79cb7ff2b33061c3850178918340 Mon Sep 17 00:00:00 2001 From: Blizzard Date: Wed, 29 Jul 2026 10:34:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(fe):=20=E5=BB=BA=E7=AB=8B=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=20token=20=E5=B1=82=EF=BC=8C=E6=94=B6=E6=95=9B?= =?UTF-8?q?=E5=9C=86=E8=A7=92/=E5=AD=97=E5=8F=B7/=E5=AD=97=E9=87=8D/?= =?UTF-8?q?=E9=98=B4=E5=BD=B1/=E9=85=8D=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 改的是 app.wxss 里既有 class 的「值」,类名一个没动——全局类被 28 种弹层 和 9 个页面共同依赖,改名要动约 180 处 class,漏一处的后果是元素完全 裸奔(无 padding 无背景),不报错、不在 diff 里,只在用户点开某个特定 弹层时才暴露。 token: - 圆角 22 种 → 5 档(xs12/sm20/md28/lg40/full) - 字号 26 档 → 6 档(22/24/28/32/40/48) - 字重 700/800/900 混用 → 只留 400/600,强调改靠颜色和字号 - 阴影 7 处一次性写法 → 3 档,且整体压轻(0 24rpx 60rpx .08 → 0 12rpx 32rpx .06) - 9 种近似浅橙 → 一个 --primary-soft;4 个语义色补齐 soft/base/ink 三件套 - 7 种硬编码正文灰 → --text-2;卡内次级底色 → --surface-2 新增(没有往旧类上塞,避免语义冲突): - .btn-dark 深色主 CTA。.btn-primary 保持暖橙不动——它有 36 处使用、 绝大多数是弹层里的「保存」,改成深色会让全站主色消失 - .tone-1~4 四色分类块、.chip 状态标、.empty 空态(原本 6 套写法散在各页) 按钮渐变改实色,主色更稳;圆角整体收小,视觉更利落。 preview-v2.html 由 app.wxss 自动翻译生成(rpx→px),已逐块截图核对。 Co-Authored-By: Claude Opus 5 --- pets-fe/app.wxss | 271 +++++++++++++--------- pets-fe/preview-v2.html | 502 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 631 insertions(+), 142 deletions(-) diff --git a/pets-fe/app.wxss b/pets-fe/app.wxss index 160b8a1..8ed0c48 100644 --- a/pets-fe/app.wxss +++ b/pets-fe/app.wxss @@ -1,35 +1,81 @@ -/* ===== 全局设计令牌 + 通用样式(由 preview.html 迁移,px→rpx ×2) ===== */ +/* ===== 全局设计令牌 + 通用样式 ===== + 规则:任何页面/组件都不要再写死色值、圆角、字号,一律用下面的 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; - --green:#73BE9D; - --green-soft:#EAF7F1; - --red:#EE7D73; - --red-soft:#FFF0EE; - --blue:#78A6E8; - --blue-soft:#EEF5FF; - --purple:#A993E8; - --purple-soft:#F4F0FF; + --primary-soft:#FFF4E4; /* 唯一的浅橙底(收编了 9 种近似值) */ + --primary-line:#FFD6A1; /* 浅橙块的描边 */ + --primary-ink:#A96500; /* 浅橙底上的文字 */ + + /* ── 语义色: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; - --shadow:0 24rpx 60rpx rgba(70,48,25,.08); - --shadow2:0 36rpx 88rpx rgba(70,48,25,.13); - --radius:44rpx; + + /* ── 深色主 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, - 内容必须让开这段距离,否则最后一张卡会被它压住(7 个挂 FAB 的页面都中过这个招)。 */ + 内容必须让开这段距离,否则最后一张卡会被它压住。 */ --pad-x:40rpx; --pad-b-fab:calc(330rpx + env(safe-area-inset-bottom)); --pad-b-plain:calc(60rpx + 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; background: radial-gradient(circle at 10% 8%, rgba(245,169,71,.26), transparent 30%), @@ -48,7 +94,7 @@ view,text{box-sizing:border-box} /* 页面骨架:nav-bar → .page-scroll(承载滚动) → .page-body(内容留白) */ .page-scroll{flex:1;min-height:0} -.page-body{padding:8rpx var(--pad-x) var(--pad-b-fab)} +.page-body{padding:var(--sp-1) var(--pad-x) var(--pad-b-fab)} /* 没挂 FAB 的页面(目前只有文章详情)不需要给它让位 */ .page-body.no-fab{padding-bottom:var(--pad-b-plain)} @@ -65,204 +111,223 @@ page{scrollbar-width:none;-ms-overflow-style:none} /* 文本 */ .muted{color:var(--muted)} -.tiny{font-size:24rpx;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:8rpx 0 24rpx; + display:flex;align-items:center;justify-content:space-between;margin:var(--sp-1) 0 var(--sp-4); } -.section-head .sh-title{font-size:36rpx;letter-spacing:-.4rpx;font-weight:700} -.link{ - color:var(--primary-dark);font-weight:900;font-size:26rpx; -} -.head-links{display:flex;align-items:center;gap:26rpx} +.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)} +.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 28rpx} -.pt-h2{font-size:46rpx;letter-spacing:-.6rpx;font-weight:800} -.pt-p{color:var(--muted);font-size:26rpx;margin-top:10rpx} + 小程序没有 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:96rpx;border-radius:34rpx;padding:0 32rpx; - display:inline-flex;align-items:center;justify-content:center;gap:16rpx; - font-weight:900;font-size:30rpx;line-height:96rpx;transition:.16s ease; + 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:var(--h-lg);transition:.16s ease; } .btn::after{border:none} .btn:active{transform:scale(.98)} -.btn-primary{ - color:#fff;background:linear-gradient(135deg,var(--primary),var(--primary2)); - box-shadow:0 24rpx 48rpx rgba(245,169,71,.28); -} +/* 主按钮保持暖橙:它在 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:#9E6200;background:var(--yellow-soft)} -.btn-green{color:#fff;background:linear-gradient(135deg,#69B991,#86CEB0)} +.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{height:68rpx;border-radius:24rpx;padding:0 22rpx;font-size:24rpx;line-height:68rpx} +.btn-small{height:var(--h-sm);border-radius:var(--r-sm);padding:0 var(--sp-4);font-size:var(--fs-sm);line-height:var(--h-sm)} /* 卡片 */ .card{ - background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow); - padding:32rpx;margin-bottom:28rpx;position:relative;overflow:hidden; + 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:999rpx;padding:0 18rpx; - font-size:24rpx;font-weight:900;background:var(--green-soft);color:#377A61;white-space:nowrap; + 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:#FFF0D7;color:#A96500} -.tag.red{background:var(--red-soft);color:#C95348} -.tag.blue{background:var(--blue-soft);color:#3C6EBA} -.tag.purple{background:var(--purple-soft);color:#765AC5} +.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)} + +/* 空态。原本有 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:28rpx} +.field{margin-bottom:var(--sp-4)} .field:last-child{margin-bottom:0} -.field label{display:block;font-size:26rpx;color:var(--muted);font-weight:800;margin-bottom:16rpx} +.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:#FBFAF8;height:88rpx;border-radius:30rpx; - padding:0 26rpx;color:var(--text);font-size:30rpx;outline:none;box-sizing:border-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:#FBFAF8;height:184rpx;border-radius:30rpx; - padding:24rpx 26rpx;color:var(--text);font-size:30rpx;box-sizing:border-box; + 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; } .placeholder{color:var(--muted2)} /* 分段选择 */ -.seg{display:flex;gap:16rpx} +.seg{display:flex;gap:var(--sp-3)} .seg .seg-btn{ - flex:1;height:80rpx;line-height:80rpx;text-align:center;border-radius:26rpx; - border:1rpx solid var(--line);background:#fff;color:var(--muted);font-weight:800;font-size:28rpx; + 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:#FFF2DC;border-color:#FFD39A} +.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:20rpx;margin:32rpx 0} +.check-list{display:flex;flex-direction:column;gap:var(--sp-3);margin:var(--sp-5) 0} .check{ - display:flex;align-items:center;gap:20rpx;background:#fff;box-shadow:var(--shadow); - border-radius:32rpx;padding:26rpx;border:1rpx solid transparent;font-size:28rpx;font-weight:700; + 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:16rpx;border:4rpx solid #DDCEC1; + 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:26rpx;font-weight:900; + font-size:var(--fs-md);font-weight:var(--fw-b); } -.check.selected{background:#FFF8EC;border-color:#FFD29A} +.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:16rpx;margin:20rpx 0 28rpx} +.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:999rpx;height:68rpx;line-height:68rpx; - padding:0 24rpx;color:#5F554D;font-weight:800;font-size:24rpx; + 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:#FFF2DC;color:var(--primary-dark);border-color:#FFD39A} +.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:16rpx; - font-size:26rpx;color:#6A5D52;font-weight:900; + 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:20rpx;border-radius:999rpx;background:#F0E7DD;overflow:hidden} +.bar{height:var(--sp-3);border-radius:var(--r-full);background:#F0E7DD;overflow:hidden} .bar .bar-fill{ - height:100%;border-radius:999rpx; + 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:44rpx; + 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:0 24rpx 52rpx rgba(245,169,71,.18);flex:none; + box-shadow:var(--sd-1);flex:none; } /* 多宠切换 */ -.pet-switch{display:flex;gap:20rpx;overflow-x:auto;padding:0 0 24rpx;white-space:nowrap} +.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:40rpx; - padding:18rpx 24rpx;align-items:center;gap:16rpx;color:var(--muted);font-weight:900;font-size:28rpx; - box-shadow:0 12rpx 36rpx rgba(70,48,25,.05); + 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:#FFF4E4;border-color:#FFD6A1} +.pet-chip.active{color:var(--primary-dark);background:var(--primary-soft);border-color:var(--primary-line)} .pet-chip .mini-avatar{ - width:56rpx;height:56rpx;border-radius:20rpx;display:flex;align-items:center; + width:52rpx;height:52rpx;border-radius:var(--r-sm);display:flex;align-items:center; justify-content:center;background:#FFE4B7;font-size:30rpx; } /* 任务列表 */ -.task-list{display:flex;flex-direction:column;gap:20rpx} -.task{display:flex;gap:20rpx;align-items:flex-start;background:#FBFAF8;border-radius:32rpx;padding:24rpx;transition:.15s ease} +.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:46rpx;height:46rpx;border-radius:50%;border:4rpx solid #DED1C4;display:flex; - align-items:center;justify-content:center;color:#fff;font-size:24rpx;flex:none;margin-top:2rpx;font-weight:900; + 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:28rpx;font-weight:700} -.tt-p{font-size:24rpx;color:var(--muted);margin-top:8rpx;line-height:1.45} +.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:22rpx;color:#A96500;background:#FFF0D7;border-radius:999rpx;padding:8rpx 14rpx;font-weight:900;flex:none; + 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:24rpx 0; - border-bottom:1rpx solid var(--line);font-size:26rpx; + 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:16rpx;margin:28rpx 0} -.stat{background:#fff;border:1rpx solid var(--line);border-radius:32rpx;padding:24rpx 14rpx;text-align:center} +.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} /* 文章卡 */ .article-card{ - display:flex;gap:24rpx;background:#fff;border-radius:40rpx;padding:26rpx;box-shadow:var(--shadow);margin-bottom:24rpx; + 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:116rpx;height:116rpx;border-radius:36rpx;flex:none;display:flex;align-items:center; - justify-content:center;background:#FFF1D8;font-size:56rpx; + 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:30rpx;font-weight:700} -.ac-p{color:var(--muted);font-size:24rpx;line-height:1.45;margin-top:10rpx} +.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:52rpx;padding:36rpx;text-align:center;overflow:hidden;position:relative; + border:1rpx solid #F2DFC3;border-radius:var(--r-lg);padding:var(--sp-5);text-align:center;overflow:hidden;position:relative; } .poster-avatar{ - width:152rpx;height:152rpx;margin:16rpx auto 20rpx;border-radius:54rpx; + width:152rpx;height:152rpx;margin:var(--sp-3) auto var(--sp-3);border-radius:var(--r-lg); background:linear-gradient(135deg,#FFE5B7,#FFC06B);display:flex;align-items:center;justify-content:center; - font-size:80rpx;box-shadow:0 24rpx 52rpx rgba(245,169,71,.20); + font-size:80rpx;box-shadow:var(--sd-1); } .poster-list{ - background:rgba(255,255,255,.78);border-radius:32rpx;padding:24rpx;margin:28rpx 0;text-align:left;line-height:1.8;font-size:26rpx; + background:rgba(255,255,255,.78);border-radius:var(--r-md);padding:var(--sp-4);margin:var(--sp-4) 0;text-align:left;line-height:1.8;font-size:var(--fs-md); } /* 风险盒 */ .risk-box{ - background:#FFF0D8;color:#A96500;padding:24rpx;border-radius:32rpx;font-weight:900; - display:flex;gap:18rpx;margin-bottom:24rpx;align-items:center; + 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:20rpx;margin-top:24rpx} +.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:20rpx;margin-bottom:24rpx} -.msg{max-width:88%;border-radius:36rpx;padding:22rpx 26rpx;font-size:26rpx;line-height:1.55} -.msg.ai{background:#F3F8F5;align-self:flex-start} -.msg.user{background:#FFF1D8;align-self:flex-end} +.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} diff --git a/pets-fe/preview-v2.html b/pets-fe/preview-v2.html index f825684..f74c8f8 100644 --- a/pets-fe/preview-v2.html +++ b/pets-fe/preview-v2.html @@ -2,32 +2,35 @@ 肉垫计划 · 设计预览 v2 -

1 · 图标全集(38 个,20px ≈ 40rpx)

-

来源 Tabler Icons (MIT)。用 mask-image + currentColor,不是字体——Tabler 是描边图标,转字体要先展开轮廓,漏了会生成空字形。

-
-
weight
poop
food
symptom
medicine
cost
vaccine
deworm
photo
home
plan
record
report
community
back
next
plus
check
close
trash
edit
share
comment
like
like-on
more
bell
settings
ai
warn
doc
note
book
trend
cat
dog
user
clock
+/* ===== 全局设计令牌 + 通用样式 ===== + 规则:任何页面/组件都不要再写死色值、圆角、字号,一律用下面的 token。 + 收敛前的现状是 22 种圆角、26 档字号、9 种近似浅橙、7 处一次性阴影, + font-weight 900 到处都是——什么都在喊,于是什么都不突出。 */ +.mp{ + /* ── 底色与文字 ── */ + --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; /* 浅橙底上的文字 */ + + /* ── 语义色: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:6px; + --r-sm:10px; + --r-md:14px; + --r-lg:20px; /* 卡片 */ + --r-full:499.5px; + --radius:var(--r-lg); /* 兼容旧名,页面里还有引用 */ + + /* ── 字号 6 档 ── */ + --fs-cap:11px; + --fs-sm:12px; + --fs-md:14px; + --fs-lg:16px; + --fs-xl:20px; + --fs-2xl:24px; + + /* ── 字重只留两档。强调靠颜色和字号,不靠把所有东西都加粗 ── */ + --fw:400; + --fw-b:600; + + /* ── 间距 6 档 ── */ + --sp-1:4px; --sp-2:6px; --sp-3:8px; + --sp-4:12px; --sp-5:16px; --sp-6:20px; + + /* ── 控件高度 3 档 ── */ + --h-sm:34px; + --h-md:40px; + --h-lg:48px; + + /* ── 阴影 3 档(原来 7 处一次性阴影,且都偏重) ── */ + --sd-1:0 6px 16px rgba(70,48,25,.06); + --sd-2:0 10px 24px rgba(70,48,25,.10); + --sd-3:0 -10px 30px rgba(70,48,25,.14); + --shadow:var(--sd-1); /* 兼容旧名 */ + --shadow2:var(--sd-2); + + /* 页面留白。FAB 固定在 bottom:95px、高 58px,上沿距底 153px, + 内容必须让开这段距离,否则最后一张卡会被它压住。 */ + --pad-x:20px; + --pad-b-fab:calc(165px + 0px); + --pad-b-plain:calc(30px + 0px); + + color:var(--text); + font-weight:var(--fw); + font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","PingFang SC","Microsoft YaHei",sans-serif; + background: + radial-gradient(circle at 10% 8%, rgba(245,169,71,.26), transparent 30%), + radial-gradient(circle at 88% 10%, rgba(115,190,157,.20), transparent 26%), + radial-gradient(circle at 72% 88%, rgba(120,166,232,.14), transparent 28%), + linear-gradient(135deg,#FBF5EA,#EEF6F1 55%,#F8F1E7); + + /* 页面自身不滚,滚动交给 .page-scroll,这样 nav-bar 和 tabBar 才能固定住。 + 这 4 行原本在 9 个页面的 wxss 里逐字重复。 */ + + display:flex; + flex-direction:column; +} +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)} + +/* 全局隐藏滚动条(页面级 + 组件级),保留正常滚动 */ +::-webkit-scrollbar{ + width:0 !important; + height:0 !important; + display:none; + -webkit-appearance:none; + background:transparent; + color:transparent; +} + + +/* 文本 */ +.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:-0.2px;font-weight:var(--fw-b)} +.link{color:var(--primary-dark);font-weight:var(--fw-b);font-size:var(--fs-md)} +.head-links{display:flex;align-items:center;gap:var(--sp-4)} + +/* 页面标题。 + 小程序没有 h2/p/b/span 标签,从 preview.html 迁移来的标签选择器全是死规则, + 各页当初都自建了替身 class(.pt-h2 在 5 个文件里逐字重复),这里统一收编。 */ +.page-title{margin:2px 0 var(--sp-4)} +.pt-h2{font-size:var(--fs-2xl);letter-spacing:-0.3px;font-weight:var(--fw-b)} +.pt-p{color:var(--muted);font-size:var(--fs-md);margin-top:5px} + +/* 按钮 */ +.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:var(--h-lg);transition:.16s ease; +} +.btn::after{border:none} +.btn:active{transform:scale(.98)} +/* 主按钮保持暖橙:它在 36 处被使用,绝大多数是弹层里的「保存」, + 把它改成深色会让整个 App 的主色消失。深色 CTA 走 .btn-dark。 */ +.btn-primary{color:#fff;background:var(--primary);box-shadow:0 6px 14px rgba(245,169,71,.24)} +.btn-dark{color:#fff;background:var(--cta)} +.btn-ghost{color:var(--text);background:#fff;border:0.5px 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{height:var(--h-sm);border-radius:var(--r-sm);padding:0 var(--sp-4);font-size:var(--fs-sm);line-height:var(--h-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:0.5px solid var(--line)} + +/* 标签 */ +.tag{ + display:inline-flex;align-items:center;height:24px;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:22px;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)} + +/* 空态。原本有 6 套长得差不多的写法散在各页 */ +.empty{padding:28px var(--sp-1);text-align:center;color:var(--muted);font-size:var(--fs-sm)} +.empty.lg{padding:48px 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:0.5px solid var(--line);background:var(--surface-2);height:44px;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:0.5px solid var(--line);background:var(--surface-2);height:92px;border-radius:var(--r-md); + padding:var(--sp-4);color:var(--text);font-size:var(--fs-lg);box-sizing:border-box; +} +.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:0.5px 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:0.5px solid transparent;font-size:var(--fs-md);font-weight:var(--fw-b); +} +.box{ + width:22px;height:22px;border-radius:var(--r-xs);border:2px 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:0.5px 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:60px;height:60px;border-radius:var(--r-lg); + background:linear-gradient(135deg,#FFE5B7,#FFC06B); + display:flex;align-items:center;justify-content:center;font-size:32px; + 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:0.5px 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)} +.pet-chip .mini-avatar{ + width:26px;height:26px;border-radius:var(--r-sm);display:flex;align-items:center; + justify-content:center;background:#FFE4B7;font-size:15px; +} + +/* 任务列表 */ +.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:22px;height:22px;border-radius:50%;border:2px solid #DED1C4;display:flex; + align-items:center;justify-content:center;color:#fff;font-size:var(--fs-sm);flex:none;margin-top:1px; +} +.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:3px 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:0.5px 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:0.5px solid var(--line);border-radius:var(--r-md);padding:var(--sp-4) var(--sp-2);text-align:center} + +/* 文章卡 */ +.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:52px;height:52px;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:24px; +} +.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:5px} + +/* 海报 */ +.poster{ + background: + radial-gradient(circle at 100% 0%, rgba(245,169,71,.24), transparent 35%), + linear-gradient(160deg,#FFF7E8,#FFFFFF); + border:0.5px solid #F2DFC3;border-radius:var(--r-lg);padding:var(--sp-5);text-align:center;overflow:hidden;position:relative; +} +.poster-avatar{ + width:76px;height:76px;margin:var(--sp-3) auto var(--sp-3);border-radius:var(--r-lg); + background:linear-gradient(135deg,#FFE5B7,#FFC06B);display:flex;align-items:center;justify-content:center; + font-size:40px;box-shadow:var(--sd-1); +} +.poster-list{ + background:rgba(255,255,255,.78);border-radius:var(--r-md);padding:var(--sp-4);margin:var(--sp-4) 0;text-align:left;line-height:1.8;font-size:var(--fs-md); +} + +/* 风险盒 */ +.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} + + + + +

1 · 图标全集(38 个)

+

来源 Tabler Icons (MIT)。mask-image + currentColor,不是字体——Tabler 是描边图标,转字体要先展开轮廓,漏了会生成空字形。

+
weight
poop
food
symptom
medicine
cost
vaccine
deworm
photo
home
plan
record
report
community
back
next
plus
check
close
trash
edit
share
comment
like
like-on
more
bell
settings
ai
warn
doc
note
book
trend
cat
dog
user
clock

2 · 尺寸可读性

32rpx(16px) 是正文里最常用的尺寸,重点看这一档描边够不够清楚。

- 16px / 32rpx - 20px / 40rpx - 24px / 48rpx - 28px / 56rpx + 16px / 32rpx + 20px / 40rpx + 24px / 48rpx + 28px / 56rpx
-

3 · currentColor 染色 · 4 色分类块

-

图标颜色跟随文字色,选中态只改一个 color 即可,emoji 做不到这点。

-
-
体重
-
饮食
-
异常
-
照片
-
- -

4 · 深色 CTA 上反白

-
问问 AI 养宠助手
- -

5 · tabBar(替换 🏠📅✍️📊🐾)

+

3 · tabBar

首页
计划
@@ -102,3 +427,102 @@ h2:first-of-type{margin-top:0}
报告
社区
+ +

4 · 圆角 5 档

+
+ xs 12 + sm 20 + md 28 + lg 40 + full +
+ +

5 · 字号 6 档 / 字重只留两档

+
+
2xl 48 · 页面大标题
+
xl 40 · 卡片主数值
+
lg 32 · 小标题与按钮
+
md 28 · 正文
+
sm 24 · 辅助说明
+
cap 22 · 角标
+
+ + +

6 · 按钮

+
+
保存记录
+
问问 AI
+
取消
+
开通 Pro
+
管理
+
+

主按钮保持暖橙:它有 36 处使用、绝大多数是弹层里的「保存」,改成深色会让全站主色消失。深色只给页面级首要 CTA。

+ +

7 · 标签 / 状态 chip / 4 色分类块

+
+ 已完成待处理 + 异常经验精选 +
+
+ 体重稳定 + 任务全清 + 驱虫将到期 +
+
+
体重
+
饮食
+
异常
+
照片
+
+ +

8 · 卡片 / 任务 / 统计 / 进度

+
+
+
今日任务管理
+
+
早餐喂食
已完成
+
记录体重
上次 4.2kg,建议每周一次
重要
+
+
+
+
本周完成度72%
+
+
+
9
记录
+
4.2
体重kg
+
12
距驱虫
+
+
疫苗进度3/4 已完成
+
驱虫状态12 天后到期
+
+
+ +

9 · 表单族(弹层里 28 种 type 全靠这几个类)

+
+
+
4.2
+
+
正常
软便
拉稀
+
+
+
呕吐拉稀精神差皮肤红
+
+
写点什么…
+
+
健康档案与体重趋势
+
AI 深度分析
+
+
取消
保存
+
+
+ +

10 · 其它公共块

+
+
+
风险中 · 建议观察 24 小时
+
幼猫疫苗怎么打
首免、二免、三免的时间点和注意事项
+
小橘最近体重稳定,继续保持现在的喂食量就好。
那驱虫呢?
+
还没有记录,来记第一笔吧
+
+
+