AI和Mine页面的样式改成新样式了。

This commit is contained in:
lik
2026-10-04 19:06:45 +08:00
parent 5844272762
commit 428fb7c52c
21 changed files with 643 additions and 584 deletions
-7
View File
@@ -1,7 +0,0 @@
Add-Type -AssemblyName System.Drawing
$bmp = [System.Drawing.Bitmap]::FromFile('d:\work\health\code\ws_health\ui\wxapp_escort\images\home-green.png')
$p = $bmp.GetPixel(64, 64)
Write-Host "home-green center: $($p.R),$($p.G),$($p.B)"
$bmp.Dispose()
Remove-Item 'd:\work\health\code\ws_health\ui\wxapp_escort\_reicon.ps1', 'd:\work\health\code\ws_health\ui\wxapp_escort\_sample.ps1' -ErrorAction SilentlyContinue
Write-Host 'temp scripts cleaned'
+1 -1
View File
@@ -27,7 +27,7 @@
"tabBar": { "tabBar": {
"custom": true, "custom": true,
"color": "#999999", "color": "#999999",
"selectedColor": "#C2410C", "selectedColor": "#B8520A",
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"borderStyle": "black", "borderStyle": "black",
"list": [ "list": [
+33 -1
View File
@@ -1,7 +1,39 @@
/**app.wxss**/ /**app.wxss**/
page { page {
/* 品牌翠绿:#22A45D 为基准色(第 7 档),向浅/深各展开数档。 /* ===== 全站配色令牌 · 唯一来源(改配色只改这里)=====
各页 page{} 不再重复定义这份色板。本文件先注入、页面 wxss 后注入,
同特异度下页面胜出,所以某页确需例外时仍可在自己的 page{} 里覆盖同名变量。
仍有四处硬编码走不了变量,改色时须一并手改(清单见 doc/DESIGN.md §7.3):
t-icon 的 color 属性、app.json 的 tabBar.selectedColor、
首页 base64 内嵌线图标的 stroke、images/ai-ink.png 位图。
主色沿革(#C2410C H18/L40 → #B8520A H25/L38)与逐文件回滚清单见 DESIGN.md §七 */
--brand-strong: #B8520A; /* 主按钮 / 选中态 / 实心强调块:白字 4.94:1、纸面 4.66:1、白卡 4.94:1,过 AA */
--brand-soft: #FFF4E8; /* 浅橙衬底:图标底、标签底、按钮按下态 */
--brand-line: #FFE0C2; /* 浅橙衬底的描边 */
--brand-ink: #9B4508; /* 浅橙底 / 纸面上的文字与线图标:浅橙底 5.96:1、纸面 6.10:1,过 AA */
/* 中性:暖灰阶,与暖白纸面同温(冷灰会让白卡边缘发青) */
--ink: #2B2521;
--ink-2: #4A4038;
--muted: #6F655C; /* 纸面 5.37:1 / 白卡 5.69:1 / 浅橙底 5.24:1,过 AA 正文。
历史值 #7A7068 落在纸面上只有 4.56:1,已废弃 */
--faint: #A79C92; /* 仅用于非文字装饰 */
--line: #ECE3D6; /* 米色发丝边。原 #F0E9E0 在纸面上只有 1.12:1,而白卡与纸面的
填充差本身只有 1.06:1——边界全靠这条边,故压深一档:
纸面 1.20:1 / 白卡 1.27:1 */
--sep: #E5DACC; /* 分隔线专用:比 --line 深一档,浅橙底上才看得见 */
--paper: #FAF8F5; /* 暖白纸面。原 #FAF6F0 的 R−B=10,黄度偏重、大面积铺开会被读成
"旧纸/发闷";压到 R−B=5 后黄度减半,明度反而略升
(L* 97.0 → 97.7),暖白身份保留 */
--white: #FFFFFF;
/* 阴影:偏移与模糊半径都保持"小偏移、小模糊"的锐利档 */
--shadow-card: 0 2rpx 10rpx rgba(63, 43, 25, 0.07); /* 白面一律走中性阴影 */
--shadow-cta: 0 2rpx 8rpx rgba(184, 82, 10, 0.16); /* 只给实心 CTA、品牌印记这类小体量元素 */
/* --- 以下与上面的色板无关,是待收口的历史遗留(见 DESIGN.md §5.2)---
品牌翠绿:#22A45D 为基准色(第 7 档),向浅/深各展开数档。
首页主视觉已确定该绿为品牌主色,全站令牌与之对齐, 首页主视觉已确定该绿为品牌主色,全站令牌与之对齐,
避免二级页沿用旧橙色造成首页与内页两套配色。 */ 避免二级页沿用旧橙色造成首页与内页两套配色。 */
--td-brand-color-1: #f0faf3; --td-brand-color-1: #f0faf3;
+7 -7
View File
@@ -1,11 +1,12 @@
// 自定义 tabBar:固定在底部,选中态只换颜色、不换图形。 // 自定义 tabBar:固定在底部,选中态只换颜色、不换图形。
// 「首页 / 我的」走 TDesign 线性图标字体;「AI客服」用品牌 AI 图标 // 三个 tab 统一走 TDesign 线性图标字体:home / chat-bubble / user。
// (气泡内 AI 字位图):灰色版 ai.png 为未选中态,暖橙版 ai-ink.png 为选中态, // 「AI客服」曾用位图(气泡内嵌 AI 字:灰色 ai.png、暖橙 ai-ink.png)当图标,
// 与文字颜色同步切换,保持选中可辨 // 其轮廓笔画比图标字体细一档,与另外两个并排时粗细不搭,故弃用。
// 位图文件仍留在 images/ 下未删(app.json 的 tabBar 项也在引用,见 DESIGN.md §5.2)
Component({ Component({
data: { data: {
selected: 0, // 当前选中项,由各 tab 页在 onShow 里同步 selected: 0, // 当前选中项,由各 tab 页在 onShow 里同步
activeColor: '#C2410C', // 选中:暖橙深一档,白底 4.69:1,过 WCAG AA 正文标准 activeColor: '#B8520A', // 选中:暖橙(色相 25°、保住原亮度),白底 4.94:1,过 WCAG AA 正文标准
inactiveColor: '#7A7068', // 未选中:暖灰,白底 4.83:1,过 WCAG AA 正文标准 inactiveColor: '#7A7068', // 未选中:暖灰,白底 4.83:1,过 WCAG AA 正文标准
list: [{ list: [{
pagePath: '/pages/home/index', pagePath: '/pages/home/index',
@@ -14,9 +15,8 @@ Component({
}, { }, {
pagePath: '/pages/ai/aichat', pagePath: '/pages/ai/aichat',
text: 'AI客服', text: 'AI客服',
// 图片图标:配置了 imgPath 时优先于 icon 渲染 // 标准「聊天」图标:线性,与 home / user 同族
imgPath: '/images/ai.png', icon: 'chat'
imgActivePath: '/images/ai-ink.png'
}, { }, {
pagePath: '/pages/mine/mine', pagePath: '/pages/mine/mine',
text: '我的', text: '我的',
+1 -9
View File
@@ -7,16 +7,8 @@
data-path="{{ item.pagePath }}" data-path="{{ item.pagePath }}"
bindtap="onTap" bindtap="onTap"
> >
<!-- 配置了 imgPath 的 tab(AI客服)走位图:灰色未选中 / 暖橙选中两态切换; <!-- 三个 tab 统一走 TDesign 线性图标字体,笔画同族;选中态只换颜色、不换图形 -->
其余 tab 走 TDesign 线性图标,选中态只换颜色 -->
<image
wx:if="{{ item.imgPath }}"
class="tab-icon-img"
src="{{ selected === index ? item.imgActivePath : item.imgPath }}"
mode="aspectFit"
/>
<t-icon <t-icon
wx:else
name="{{ item.icon }}" name="{{ item.icon }}"
size="44rpx" size="44rpx"
color="{{ selected === index ? activeColor : inactiveColor }}" color="{{ selected === index ? activeColor : inactiveColor }}"
+2 -7
View File
@@ -20,12 +20,6 @@
align-items: center; align-items: center;
} }
/* 位图图标(AI客服):与 t-icon 的 44rpx 视觉尺寸对齐 */
.tab-icon-img {
width: 44rpx;
height: 44rpx;
}
.tab-text { .tab-text {
margin-top: 6rpx; margin-top: 6rpx;
/* 与全局约束一致:中文正文不小于 24rpx(12px) */ /* 与全局约束一致:中文正文不小于 24rpx(12px) */
@@ -35,6 +29,7 @@
} }
.tab-item.is-active .tab-text { .tab-item.is-active .tab-text {
color: #C2410C; /* 选中文字:暖橙 --brand-strong 的硬编码(组件读不到 page 级变量),白底 4.94:1,过 AA */
color: #B8520A;
font-weight: 600; font-weight: 600;
} }
+103 -76
View File
@@ -1,59 +1,57 @@
# 陪诊小程序 配色规范 # 陪诊小程序 配色规范
本文件只规定**颜色**,不涉及布局、间距、圆角、触控尺寸。那些属于界面规范,另行处理。 适用范围:`ui/wxapp_escort/` 全部页面。本文只规定**颜色**;布局、间距、圆角、触控尺寸属界面规范,另行处理。
适用范围:`ui/wxapp_escort/` 下全部小程序页面。
--- ---
## 一、总原则 ## 一、总原则
**全站只有一个色相。** **全站只有一个色相**——暖橙,承载品牌、交互、强调。第二色不是新色相,而是**暖墨文字层**(暖偏棕的深灰),只用来拉开层级,不与暖橙争彩。浅橙三档(描边、浅底、深字)都是主色同色阶。状态色只在**表达状态**时出现,不做装饰。
- 第一色是暖橙,承载品牌、交互、强调。 判断一个颜色能否用:既不是暖橙同色阶、也不是暖墨、也不是明确状态色的,就不该出现。灰金 `#D4A853`、亮橙 `#FF8500`、青灰、翠绿均为违反项。
- 第二色不是另一个色相,是**暖墨文字层**(暖偏棕的深灰)。它的作用是把层级拉开,不与暖橙争彩。
- 浅橙三档(描边、浅底、深字)都是主色的同色阶,不是新颜色。
- 状态色只允许在**表达状态**时出现,不做装饰。
判断一个颜色是否该用:如果它既不是暖橙的同色阶、也不是暖墨、也不是明确的状态色,就不该出现在页面里。历史遗留的灰金 `#D4A853`、亮橙 `#FF8500`、青灰、翠绿都是这条原则的违反项。
--- ---
## 二、核心色板 ## 二、核心色板
令牌按项目惯例定义在各页面的 `page {}` 选择器内。技术上 `app.wxss` 的 `page {}` 也能全局定义变量,但各页自带可以让页面样式自包含、互不牵连,这是本项目的约定。 令牌集中在 `app.wxss` 的 `page{}` 内,是**全站唯一来源——改配色只改这一处**。注入顺序 app.wxss 先、页面 wxss 后,同特异度页面胜出,某页确需例外时可在自己 `page{}` 覆盖同名变量。
**四处硬编码走不了变量,改色须一并手改**(逐文件见 §7.3):`t-icon` 的 `color`、`app.json` 的 `tabBar.selectedColor`、首页 base64 线图标的 `stroke`、着色的位图(`images/home-ink.png`)。
迁移进度:`home/index`、`escort/itemlist` 两页副本已删;`itemdetail`、`attendantlist`、`guide`、`mine/contact` 四页仍各带副本(停在旧值 `#C2410C`),待重构时按同一方式删。
### 2.1 第一色:暖橙色阶 ### 2.1 第一色:暖橙色阶
主色于 2026-10-04 由 `#C2410C`(H18°)折中右移到下表值(H25°)。沿革与回滚见 §七。
| 令牌 | 色值 | 用途 | 对比度 | | 令牌 | 色值 | 用途 | 对比度 |
|---|---|---|---| |---|---|---|---|
| `--brand-strong` | `#C2410C` | 主按钮、价格数字、选中态、实心强调块 | 纸面 4.89:1,白卡 5.18:1 | | `--brand-strong` | `#B8520A` | 主按钮、价格数字、选中态、实心强调块 | 纸面 4.66:1,白卡 4.94:1;白字压其上 4.94:1 |
| `--brand-ink` | `#9A3412` | 标签文字、文字链、暖色小标题、图标 | 浅橙底 6.74:1,纸面 6.89:1 | | `--brand-ink` | `#9B4508` | 标签文字、文字链、暖色小标题、图标 | 浅橙底 5.96:1,纸面 6.10:1,白卡 6.46:1 |
| `--brand-line` | `#FFE0C2` | 浅橙块描边、浅橙档的状态描边 | 仅做描边 | | `--brand-line` | `#FFE0C2` | 浅橙块描边、浅橙档的状态描边 | 仅做描边 |
| `--brand-soft` | `#FFF4E8` | 浅橙底:说明砖、图标衬底、按钮按下态 | 仅做底 | | `--brand-soft` | `#FFF4E8` | 浅橙底:说明砖、图标衬底、按钮按下态 | 仅做底 |
用法边界: 用法边界:
- `--brand-strong` 是唯一可以当"实心大色块"用的值。全页同类实心块建议不超过一处,避免主色泛滥。 - `--brand-strong` 是唯一可当"实心大色块"的值;全页同类实心块不超过一处。
- `--brand-soft` 只能当底,不能当文字色,也不能当描边色(它做描边时等于没有描边)。 - `--brand-soft` 只能当底,不能当文字色或描边色。
- `--brand-ink` 是浅橙底上的首选强调字色。`--brand-strong` 落在 `--brand-soft` 上实测 4.77:1,过 AA 但余量小,浅橙底上的文字一律走 `--brand-ink`。 - 浅橙底上的文字一律走 `--brand-ink`(`--brand-strong` 落其上仅 4.56:1,余量小)。
- 例外(已登记):`escort/itemlist` 的价目单里,价格数字为弱化表达改走 `--muted` + 字重 500,不走 `--brand-strong`,让「预约」空心胶囊按钮独占焦点。同一页价格列必须只用这一个色值、一种字重,不得混用。 - 例外(已登记):`escort/itemlist` 价格数字改走 `--muted` + 字重 500,让「预约」空心胶囊独占焦点;同页价格列只用这一个色值、一种字重。
- `escort/itemlist` 的「预约」按钮走**空心胶囊**:3rpx `--brand-strong` 环 + 28rpx 满圆角(= 高 56rpx 的一半)+ `--brand-ink` 字 30rpx/500(纸面 6.89:1),无填充、无阴影,按下填 `--brand-line`。不用填充是因为它与同行的规格签撞形——签是「浅橙底 + 6rpx 圆角」,按钮若同族,一行里就是两个标签,分不清哪个能点。规则:**同一行只允许一个填充物(这里是签),按钮独占「环」这一形态**;可点性由环承担,字重因此可以降到 500(注意 500 在部分 Android 中文会落回常规)。该页因此不存在实心大色块,§2.1「同类实心块不超过一处」无需开口子。 - 例外(已登记):`escort/itemlist`「预约」按钮走**空心胶囊**——3rpx `--brand-strong` 环 + 28rpx 满圆角 + `--brand-ink` 字 30rpx/500,无填充无阴影,按下填 `--brand-line`。同行规格签已是"浅橙底 + 6rpx 圆角",按钮若同族会与之撞形;**同一行只允许一个填充物**,按钮独占"环"形态。该页因此无实心大色块。
### 2.2 第二色:暖墨文字层 ### 2.2 第二色:暖墨文字层
| 令牌 | 色值 | 用途 | 对比度 | | 令牌 | 色值 | 用途 | 对比度 |
|---|---|---|---| |---|---|---|---|
| `--ink` | `#2B2521` | 标题、需要最重的正文 | 纸面 14.26:1 | | `--ink` | `#2B2521` | 标题、需最重的正文 | 纸面 14.26:1 |
| `--ink-2` | `#4A4038` | 正文 | 纸面 9.52:1 | | `--ink-2` | `#4A4038` | 正文 | 纸面 9.52:1 |
| `--muted` | `#6F655C` | 次要文字、元信息、说明、未选中态 | 纸面 5.37:1,白卡 5.69:1,浅橙底 5.24:1 | | `--muted` | `#6F655C` | 次要文字、元信息、说明、未选中态 | 纸面 5.37:1,白卡 5.69:1,浅橙底 5.24:1 |
用法边界: 用法边界:
- 三档只表示文字层级,不表示状态,不表示可点击性。 - 三档只表示文字层级,不表示状态或可点击性。
- `--muted` 是最浅的一档,不得再浅。它是全站文字对比度的底线,任何比它更浅的文字色都视为不合格。 - `--muted` 是最浅一档,不得再浅——它是全站文字对比度底线。历史值 `#7A7068`(纸面 4.56:1,压线无余量)已废弃,硬编码需全部替换。
- `--muted` 是三元色里的关键值:它在暖白纸面、白卡、浅橙底上都能过 4.5:1。历史值 `#7A7068` 压线达标但无余量(纸面 4.56:1),已废弃,所有硬编码 `#7A7068` 都要替换。 - `t-icon` 的 `color` 读不到 CSS 变量,只能硬编码,且必须与令牌同步(当前为 `#9B4508`、`#6F655C`、`#B8520A` 三者之一)。
- 注意 `t-icon` 组件的 `color` 属性读不到 CSS 变量,只能用硬编码色值。这类硬编码必须与令牌同步(当前应为 `#9A3412`、`#6F655C`、`#C2410C` 三者之一)。
### 2.3 底与线 ### 2.3 底与线
@@ -66,107 +64,136 @@
用法边界: 用法边界:
- 这两组线不是装饰,是**切分工具**,本身不表意。不要给它们上主色或状态色。 - 线是切分工具,不表意,不上主色或状态色。浅橙底上必须用 `--sep`(`--brand-line` 落 `--brand-soft` 上仅 1.16:1,肉眼看不出)。
- `--line` 与 `--sep` 的分工是固定的:浅橙底上必须用 `--sep`,因为 `--brand-line` 落在 `--brand-soft` 上只有约 1.16:1,肉眼看不见;`--sep` 比 `--line` 深一档,专门负责在彩色底上还能被看到。 - `--paper` 与 `--brand-soft` 明度差仅约 1.03:1,浅橙块落纸面须靠 **2rpx `--brand-line` 描边**托形,不加阴影。
- `--paper` 与 `--brand-soft` 的明度差只有约 1.03:1。所以浅橙块落在纸面上时,形状必须靠 **2rpx `--brand-line` 描边**承担,不能用更大的色差去解决,也不加阴影——首页 `.intro-card` / `.quick-item-full` 与 `escort/itemlist` 的页脚收口卡都是"描边 + 去阴影"这一种做法。浅橙块靠大面自身可辨,不靠阴影托形。 - **白卡一律走中性阴影** `--shadow-card: 0 2rpx 10rpx rgba(63, 43, 25, 0.07)`,圆角 28rpx。彩色(暖橙)阴影不得用在 `--white` 面上;它只允许用于实心 CTA、品牌印记等小体量元素(`--shadow-cta: 0 2rpx 8rpx rgba(184, 82, 10, 0.16)`)。
- **白卡一律走中性阴影**(`--shadow-card: 0 2rpx 10rpx rgba(63, 43, 25, 0.07)`,首页与 `escort/itemlist` 同值),圆角 28rpx。彩色(暖橙)阴影**不得用在 `--white` 面上**——白面加暖橙阴影会在卡边泛出一圈暖晕,与全站白卡不是同一种东西;它只允许出现在实心 CTA、品牌印记这类小体量元素上(如首页 `--shadow-cta: 0 2rpx 8rpx rgba(194, 65, 12, 0.16)`)。 - 例外(已登记):`escort/itemlist` 三个服务分组做成**通栏白底块**——`--white` + 上下各 2rpx `--line` + `--shadow-card`,**圆角 0**;做法 `margin: 36rpx -32rpx 0` + `padding: 28rpx 32rpx`,行宽仍为 686rpx(若内缩,最长名称「VIP 5次 半天陪诊」会折行)。圆角必须为 0,否则满宽块的圆角会切在屏幕边上。页首 `.notice` 仍是内缩 28rpx 圆角白卡。
- 例外(已登记):`escort/itemlist` 的三个服务分组做成**通栏白底块**——`--white` 面 + 上下各 2rpx `--line` 发丝边 + 上述中性 `--shadow-card`,**圆角为 0**。做法是 `margin: 36rpx -32rpx 0` 加等量 `padding: 28rpx 32rpx`,白面顶到屏幕两侧而行宽仍落在容器原有的 686rpx 上。这是该页唯一可行的"白底卡"解法:卡内缩 32rpx 再自带 24rpx 内距会把内容宽压到 638rpx,最长服务名「VIP 5次 半天陪诊」(249rpx) 当场折行。圆角必须为 0,否则满宽块的圆角会切在屏幕边上、露出纸色缺口。页首 `.notice` 仍是内缩 28rpx 圆角白卡(同上中性阴影),两者是"提示卡 / 章节带"两种角色,形不同不算同类撞形。白底块内每组的末行不画分隔虚线,收口交给卡底发丝边。 - 例外(已登记):`escort/itemlist` 页脚做**浅橙收口卡**(`--brand-soft` + 2rpx `--brand-line` + 28rpx 圆角 + 去阴影),与首页 `.quick-item-full` 同源,补回该页"暖色只剩线、没有面"的那一档。
例外(已登记):`escort/itemlist` 的**页脚做成浅橙收口卡**——`--brand-soft` 底 + 2rpx `--brand-line` 描边 + 28rpx 圆角 + 去阴影,与首页 `.quick-item-full`(「联系我们」)同源。用途是把首页"每个区块都收在暖色卡上"的节奏带过来:该页其余四块都是白面,页脚若也走白,全页暖色就只剩"线"(竖条 / 按钮环 / 暖陶土字),比首页轻一档;这张"面"是补回来的暖色落点。
浅橙块不使用彩色阴影(按上条,靠描边托形)。以下值曾是"浅橙块托形阴影"的唯一候选,但首页与 `escort/itemlist` 实际都用描边,此值当前无使用位置,仅作登记——若将来确需给浅橙块托形,只能用它:
```css
box-shadow: 0 2rpx 10rpx rgba(194, 65, 12, 0.08);
```
--- ---
## 三、状态色 ## 三、状态色
状态色只在订单、记录这类**有明确状态字段**的地方使用,且同一个页面里同类状态只能有一种颜色。 状态色只用于订单、记录这类**有明确状态字段**处,同页同类状态只允许一种颜色。
| 状态 | 底色 | 描边 | 字色 | 对比度 | | 状态 | 底色 | 描边 | 字色 | 对比度 |
|---|---|---|---|---| |---|---|---|---|---|
| 待服务 | `#ECF7F4` | `#C7E5DF` | `#0F766E` | 5.00:1 | | 待服务 | `#ECF7F4` | `#C7E5DF` | `#0F766E` | 5.00:1 |
| 服务中 | `#FFF4E8` | `#FFE0C2` | `#C2410C` | 4.77:1 | | 服务中 | `#FFF4E8` | `#FFE0C2` | `#B8520A` | 4.56:1 |
| 已完成 | `#EAF6EE` | `#CDE9D7` | `#1F7A4D` | 4.79:1 | | 已完成 | `#EAF6EE` | `#CDE9D7` | `#1F7A4D` | 4.79:1 |
| 已取消 | `#FCF0EE` | `#F2D6D1` | `#B4231A` | 5.89:1 | | 已取消 | `#FCF0EE` | `#F2D6D1` | `#B4231A` | 5.89:1 |
用法边界: 用法边界:
- **不得仅用颜色传达状态。** 状态胶囊必须带文字,颜色只做强化。这条是 WCAG 1.4.1(Use of Color,Severity: High)的要求——将来任何"纯色圆点表示状态"的写法都视为违规。 - **不得仅用颜色传达状态**(WCAG 1.4.1):状态胶囊必须带文字,颜色只做强化。
- **青绿(待服务)是全站唯一的冷色**,也是唯一"反暖色"的特权。它只给"等你去处理"这一个语义。其他任何状态都不许用冷色,否则这个信号就废了。 - 青绿(待服务)是全站唯一冷色,只给"等你去处理"这一个语义。
- **服务中直接复用主色浅档**,不另立色相。服务中是一个正常中间态,不需要报警感。 - 服务中复用主色浅档,字色跟随该页 `--brand-strong`(已迁移页 `#B8520A`,未迁移页 `#C2410C`)。
- 已取消的红是状态色里唯一脱离暖色体系的。若后续想让全站色相更少,可把已取消收成 `--muted` 字 + 中性底(`#EFEFF2`),代价是列表里不易扫到。当前按上表执行。 - 状态色不得用于区块标题、图标衬底、按钮、装饰条,只包住状态文字本身。
- 状态色不得用在:区块标题、图标衬底、按钮、装饰条。它只包住状态文字本身。 - 表单错误复用已取消档(`#B4231A` 字 + `#FCF0EE` 底),错误必须带文字。
- 表单错误提示复用已取消档(`#B4231A` 字 + `#FCF0EE` 底),不新增令牌;错误必须带文字,不能只把输入框描红。 - 禁用态不用暖橙:`--muted` 字 + `--sep` 描边 + 透明底。
- 禁用态不使用暖橙(可点性由暖橙表达,禁用即收回):`--muted` 字 + `--sep` 描边 + 透明底。
--- ---
## 四、硬约束(可验证) ## 四、硬约束(可验证)
1. 所有文字对底色的对比度必须达到 WCAG AA 4.5:1;中文最小字号不低于 24rpx(12px)。 1. 所有文字对底色对比度 ≥ WCAG AA 4.5:1;中文最小字号不低于 24rpx(12px)。
2. 图标对衬底的对比度必须达到 WCAG 非文本 3:1。反例:`#22A45D` 落在 `#EBF8F0` 上只有 2.94:1,不达标;同位置的合格值是 `#19814A`(4.49:1)。 2. 图标对衬底对比度 ≥ WCAG 非文本 3:1。
3. 不得新增色相。需要区分时先改结构(分组、加留白、换线),不要加颜色。 3. 不得新增色相;需区分时先改结构(分组、留白、换线),不要加颜色。
4. 不得使用渐变色。历史遗留的 `#FF9B33 → #FF7A33`、`#4CAF50 → #45A049` 属于违反项。 4. 不得使用渐变色。
5. 卡片、面板、说明砖的**填充色必须中性**(`--white` / `--paper` / `--brand-soft`)。不得用 `--brand-strong` 或状态色做面填充,它们只做描边、图标、文字、mark。 5. 卡片、面板、说明砖的填充必须中性(`--white` / `--paper` / `--brand-soft`)。
6. 暖橙以外的暖色(灰金、亮橙)不得出现。金色 `#D4A853` 属于旧体系,已废弃。 6. 暖橙以外的暖色(灰金、亮橙)不得出现。
7. 每个页面内,同一种含义只能对应一个色值。同一页出现两种"次要文字灰"即为不合格。 7. 同页同一含义只能对应一个色值。
8. 不得仅用颜色传达信息(WCAG 1.4.1)。状态、错误、选中态都必须有文字或图标伴随,颜色只做强化。 8. 不得仅用颜色传达信息(WCAG 1.4.1)。
--- ---
## 五、历史遗留收口清单 ## 五、历史遗留收口清单
以下为当前与规范冲突的位置,**本文档阶段不执行**,仅登记,供后续代码阶段按表替换。 以下为当前与规范冲突的位置,**本文档阶段不执行**,仅登记供后续代码阶段按表替换。
### 5.1 页面级 ### 5.1 页面级
| 范围 | 现状色值 | 替换为 | | 范围 | 现状 | 替换为 |
|---|---|---| |---|---|---|
| `mine/mine.wxss`、`mine/about.wxss` | `#D4A853`、`#FF8500` | `--brand-strong` / `--brand-ink` | | `mine/about.wxss` | `#D4A853`、`#FF8500`、`#22A45D` | `--brand-strong` / `--brand-ink` |
| `mine/about.wxss`、`mine/mine.wxss` | `#22A45D` | `--brand-strong` | | `mine/comp_address.wxml`(`switch` 属性) | 旧金色 | `#B8520A`(属性值需硬编码) |
| `mine/comp_address.wxml`(`switch` 属性) | 旧金色 | `#C2410C`(属性值需硬编码) | | `health/profilelist.js`(`confirmColor`) | 旧金色 | `#B8520A` |
| `health/profilelist.js`(`confirmColor`) | 旧金色 | `#C2410C` |
| `health/profilelist.wxss`、`profileedit.wxss` | `#D4A853` 系 | 暖橙令牌 | | `health/profilelist.wxss`、`profileedit.wxss` | `#D4A853` 系 | 暖橙令牌 |
| `escort/recordlist.wxss` | `#D4A853` 系 | 暖橙令牌 + 状态四档 | | `escort/recordlist.wxss` | `#D4A853` 系 | 暖橙令牌 + 状态四档 |
| `escort/recorddetail.wxss`(12 处) | `#D4A853` 系 | 暖橙令牌 + 状态四档 | | `escort/recorddetail.wxss`(12 处) | `#D4A853` 系 | 暖橙令牌 + 状态四档 |
| `escort/agreement.wxss` | 底 `#FAF6F1`、`#D4A853` 系 | `--paper` / `--brand-soft` / 暖橙令牌 | | `escort/agreement.wxss` | 底 `#FAF6F1`、`#D4A853` 系 | `--paper` / `--brand-soft` / 暖橙令牌 |
| `hospital/contact.wxss`、`hospital/ranking.wxss` | 底 `#F5F7F6`,字 `#1F2937`,绿 `#6B8E7B` `#2D6A4F`,灰 `#6B7280` `#9CA3AF` `#F3F4F6` `#E5E7EB` | 整体并入暖橙体系 | | `hospital/contact.wxss`、`hospital/ranking.wxss` | 底 `#F5F7F6`、字 `#1F2937`、绿灰系 | 整体并入暖橙体系 |
| `pages/ai/aichat.wxss` | 金 `#D4A853`,橙渐变 `#FF9B33→#FF7A33`,绿渐变 `#4CAF50→#45A049`,中性 `#F5F5F5` `#EEEEEE` `#999999` `#333333` `#E5E5E5` | 去渐变,气泡改单色 + 浅底,中性色归入纸面与线 |
### 5.2 系统级(不在任何页面里,最容易漏) 已完成(2026-10-04):`mine/mine.wxss`、`pages/ai/aichat.wxss` 已按本节并入暖橙体系。
### 5.2 系统级(不在页面里,最易漏)
| 位置 | 现状 | 应改为 | | 位置 | 现状 | 应改为 |
|---|---|---| |---|---|---|
| `app.json` tabBar 选中图标 | `images/home-green.png`、`ai-green.png`、`mine-green.png`(绿色图片) | 暖橙 `#C2410C` 版本,与 `selectedColor` 一致 | | `app.json` tabBar 选中图标 | `home-green.png` / `ai-green.png` / `mine-green.png`(绿色图片) | 暖橙 `#B8520A` 版本,与 `selectedColor` 一致 |
| `app.json` tabBar `color` | `#999999` | `--muted` 等价色 `#6F655C` | | `app.json` tabBar `color` | `#999999` | `--muted` 等价色 `#6F655C` |
| `app.wxss` 全局变量 | `--td-brand-color-1..10` 整套翠绿(基准 `#22A45D`)、`--c-ink #1c1917` | 已确认业务页面零引用(页面只用了 `t-icon`),是死代码,可整体重写或删除 | | `app.wxss` 全局变量 | `--td-brand-color-1..10` 整套翠绿(基准 `#22A45D`)、`--c-ink #1c1917` | 已确认业务页面零引用,是死代码,可整体重写或删除 |
| `custom-tab-bar/index.wxss`、`index.js` | 未选中色硬编码 `#7A7068` | `#6F655C` | | `custom-tab-bar/index.wxss`、`index.js` | 未选中色硬编码 `#7A7068` | `#6F655C` |
### 5.3 通用色值映射表 ### 5.3 通用色值映射表
| 旧值 | 新值 | 说明 | | 旧值 | 新值 | 说明 |
|---|---|---| |---|---|---|
| `#D4A853` | `#9A3412` 或 `#C2410C` | 灰金转暖橙,按"文字/图标"或"实心"分 | | `#D4A853` | `#9B4508` 或 `#B8520A` | 灰金转暖橙,按"文字/图标"或"实心"分 |
| `#FF8500` | `#C2410C` | 亮橙转主色 | | `#FF8500` | `#B8520A` | 亮橙转主色 |
| `#FF9B33` / `#FF7A33` | `#C2410C` + `#FFF4E8` | 去渐变,拆成字色与底色 | | `#FF9B33` / `#FF7A33` | `#B8520A` + `#FFF4E8` | 去渐变,拆成字色与底色 |
| `#22A45D` / `#6B8E7B` / `#2D6A4F` / `#4CAF50` / `#45A049` | `#C2410C`;若语义是"已完成"则 `#1F7A4D` | 绿系全部转暖橙;仅状态语义保留绿 | | `#22A45D` / `#6B8E7B` / `#2D6A4F` / `#4CAF50` / `#45A049` | `#B8520A`;语义为"已完成"则 `#1F7A4D` | 绿系转暖橙,仅状态语义保留绿 |
| `#FAF6F1` / `#F5F7F6` / `#F5F5F5` | `#FAF8F5` 或 `#FFFFFF` | 旧底转纸面或卡片 | | `#FAF6F1` / `#F5F7F6` / `#F5F5F5` | `#FAF8F5` 或 `#FFFFFF` | 旧底转纸面或卡片 |
| `#F3F4F6` / `#EEEEEE` / `#E5E5E5` | `#ECE3D6` 或 `#E5DACC` | 冷灰线转暖线 | | `#F3F4F6` / `#EEEEEE` / `#E5E5E5` / `#E5E7EB` | `#ECE3D6`(浅橙底上用 `#E5DACC`) | 冷灰线转暖线 |
| `#E5E7EB` | `#ECE3D6`;浅橙底上用 `#E5DACC` | 同上 | | `#1F2937` / `#333333` | `#2B2521` | 冷黑转暖墨 |
| `#1F2937` | `#2B2521` | 冷黑转暖墨 |
| `#333333` | `#2B2521` | 同上 |
| `#6B7280` / `#9CA3AF` / `#999999` / `#7A7068` | `#6F655C` | 各版"次要灰"统一 | | `#6B7280` / `#9CA3AF` / `#999999` / `#7A7068` | `#6F655C` | 各版"次要灰"统一 |
--- ---
## 六、一句话检验 ## 六、一句话检验
改完任何页面后,用这三条自检: 1. 页面去色(灰度化)后层级还清楚吗?去掉颜色就散架 = 在用颜色凑层级。
2. 数一下色相:超过"暖橙 + 暖墨 + 至多一个状态色"就有问题。
3. 最浅的那行字是 `--muted` 或更深吗?比它更浅的要拉回来。
1. 把页面截图去色(灰度化),层级还清楚吗?如果去掉颜色就散架,说明是在用颜色凑层级。 ---
2. 数一下页面上有几个色相。超过"暖橙 + 暖墨 + 至多一个状态色",就有问题。
3. 页面里最浅的那行字,是 `--muted` 或更深吗?比它更浅的,都要拉回来。 ## 七、主题色沿革与回滚
主色做过一次色相右移。照 §7.3 倒着改即可整体回滚。
### 7.1 三套值
| 版本 | `--brand-strong` | HSL | `--brand-ink` | HSL | 状态 |
|---|---|---|---|---|---|
| **现行** | `#B8520A` | H25° · S90% · L38% | `#9B4508` | H25° · S90% · L32% | 首页、`escort/itemlist`、自定义 tabBar 已落地 |
| **之前** | `#C2410C` | H18° · S88% · L40% | `#9A3412` | H15° · S79% · L34% | 其余页面仍是此值 |
| 已否候选 | `#A85A00` | H32° · S100% · L33% | — | — | 为凑白字 AA 把明度压到 33% 致画面发闷,仅登记 |
`--brand-soft #FFF4E8`、`--brand-line #FFE0C2` 全程未动,回滚无需处理。
### 7.2 为什么离开旧值
旧值 `#C2410C`(H18° 偏红、饱和偏高)大面积铺开会读成"锈橙 ≈ 干血",与就医语境不合。折中右移到 H25°,明度只让 40%→38%、饱和 88%→90%,保住"眼前一亮"的抓力。若日后仍嫌血色,**正解是收缩橙色面积,不是继续调暗**。
### 7.3 回滚清单
回滚或再改主色只需改第 1 行(`app.wxss`);其余 10 处是 CSS 变量读不到的地方(`t-icon` color、base64 stroke、位图、`app.json`、自绘阴影),须一并手改。`--brand-soft` / `--brand-line` 未变,不在表内。
| # | 文件 | 位置 | 现行 | 回滚为 |
|---|---|---|---|---|
| 1 | `app.wxss` | `page{}` 内 `--brand-strong` / `--brand-ink`(全站唯一来源) | `#B8520A` / `#9B4508` | `#C2410C` / `#9A3412` |
| 2 | `app.wxss` | `page{}` 内 `--shadow-cta` | `rgba(184, 82, 10, 0.16)` | `rgba(194, 65, 12, 0.16)` |
| 3 | `pages/home/index.wxss` | `.brand-mark` 的 `box-shadow` | `rgba(184, 82, 10, 0.16)` | `rgba(194, 65, 12, 0.16)` |
| 4 | `pages/home/index.wxss` | 8 个 base64 线图标的 `stroke` | `#B8520A` | `#C2410C` |
| 5 | `pages/home/index.wxml` | 第 119 行 `t-icon` 的 `color` | `#9B4508` | `#9A3412` |
| 6 | `pages/escort/itemlist.wxml` | 第 25 / 30 / 96 行 `t-icon` 的 `color` | `#9B4508` | `#9A3412` |
| 7 | `custom-tab-bar/index.js` | 第 8 行 `activeColor` | `#B8520A` | `#C2410C` |
| 8 | `custom-tab-bar/index.wxss` | 第 39 行 `.tab-item.is-active .tab-text` | `#B8520A` | `#C2410C` |
| 9 | `app.json` | 第 30 行 `tabBar.selectedColor` | `#B8520A` | `#C2410C` |
| 10 | `images/ai-ink.png` | 整图纯色(AI客服选中态位图) | `#9B4508` | `#8A4B08`(位图需重上色,不能按文本替换) |
| 11 | `images/home-ink.png` | 整图纯色(「我的」默认头像位图,由灰色 `home.png` 重上色) | `#9B4508` | `#8A4B08`(同上) |
**无需回滚**:其余页面从未迁移。仍定义旧值 `#C2410C` / `#9A3412` 的是 `itemdetail`、`attendantlist`、`guide`、`mine/contact` 四页八文件(各含 `.wxss` 令牌与 `.wxml` 里 `t-icon` 硬编码),本就是回滚后的目标态;`agreement`、`recordlist`、`recorddetail`、`mine/*` 等页走更早的金色体系(`#D4A853`),见 §5.1。
注:`custom-tab-bar` 未选中灰硬编码 `#7A7068` 是独立历史遗留项(应改 `#6F655C`,见 §5.2),与本次主色调整无关。
+46 -81
View File
@@ -1,95 +1,60 @@
# 值班助手小程序 - 使用说明 # 暖橙陪诊小程序
## 项目介绍 陪诊服务的微信小程序,基于微信原生框架 + TDesign 组件库。
值班助手是一个基于微信小程序的值班管理应用,使用 TDesign 组件库构建。
## 技术栈 ## 技术栈
- 微信小程序原生框架 - 微信小程序原生框架
- TDesign 微信小程序组件库 - `tdesign-miniprogram` ^1.9.2(依赖 `package.json`,构建产物在 `miniprogram_npm/`)
- 基础库 3.15.2(`project.config.json`),最低 ≥ 2.12.0
## 安装步骤 ## 运行
### 1. 安装依赖 1. `npm install`
```bash 2. 微信开发者工具导入本项目目录 `ui/wxapp_escort`
npm install 3. 工具栏 `工具 → 构建 npm`
``` 4. 编译预览
### 2. 在微信开发者工具中配置 ## 目录结构
1. 打开微信开发者工具
2. 导入项目(选择本项目目录)
3. 在工具栏点击 `工具` -> `构建 npm`
4. 构建成功后,勾选 `将 JS 编译成 ES5`
### 3. 添加底部导航图标
需要在 `images` 目录下添加以下图标文件(PNG格式):
- `home.png` - 首页图标(未选中)
- `home-active.png` - 首页图标(选中)
- `mine.png` - 我的图标(未选中)
- `mine-active.png` - 我的图标(选中)
### 4. 添加默认头像
在 `images` 目录下添加 `default-avatar.png` 作为默认头像图片
## 项目结构
``` ```
attendant-wechat/ app.js / app.json / app.wxss 全局入口、页面与 tabBar 配置、色板令牌
├── app.js # 小程序主入口 custom-tab-bar/ 自定义底部导航(fixed 在底部,各 tab 页需自备底部占位)
├── app.json # 小程序全局配置 pages/ 页面(清单见下)
├── app.wxss # 小程序全局样式 utils/
├── sitemap.json # 站点地图配置 request.js HTTP 封装(基址、appId、token 头)
├── package.json # 项目依赖配置 api.js 接口定义
├── project.config.json # 项目配置文件 chatmsg.js AI 客服 WebSocket
├── pages/ # 页面目录 doc/
│ ├── index/ # 首页 DESIGN.md 配色规范(全站唯一色板来源)
│ │ ├── index.wxml # 页面结构 PROJECT_GUIDE.md 本文件
│ │ ├── index.wxss # 页面样式
│ │ ├── index.js # 页面逻辑
│ │ └── index.json # 页面配置
│ └── mine/ # 我的页面
│ ├── mine.wxml # 页面结构
│ ├── mine.wxss # 页面样式
│ ├── mine.js # 页面逻辑
│ └── mine.json # 页面配置
└── images/ # 图片资源目录
├── home.png # 首页图标
├── home-active.png # 首页图标(选中)
├── mine.png # 我的图标
├── mine-active.png # 我的图标(选中)
└── default-avatar.png # 默认头像
``` ```
## 页面说明 ## 页面
### 首页 (pages/index) | 路径 | 说明 |
- 欢迎卡片:显示应用名称和欢迎语 |---|---|
- 快捷功能:今日值班、值班表、值班记录 | `pages/home/index` | 首页 |
- 统计信息:显示值班相关统计数据 | `pages/ai/aichat` | AI 客服 |
| `pages/escort/itemlist` | 陪诊服务列表 |
| `pages/escort/itemdetail` | 服务详情 / 下单 |
| `pages/escort/attendantlist` | 陪诊师列表 |
| `pages/escort/recordlist` | 订单记录 |
| `pages/escort/recorddetail` | 订单详情 |
| `pages/escort/agreement` | 用户协议 |
| `pages/escort/guide` | 服务指南 |
| `pages/health/profilelist` | 健康档案列表 |
| `pages/health/profileedit` | 档案编辑 |
| `pages/mine/mine` | 我的 |
| `pages/mine/about` | 关于 |
| `pages/mine/contact` | 联系我们 |
| `pages/hospital/contact` | 医院联系 |
| `pages/hospital/ranking` | 医院排行 |
| `pages/home/webview` | 网页容器 |
### 我的 (pages/mine) ## 约定
- 用户信息卡片:显示用户头像和昵称
- 功能菜单:个人信息、我的值班、值班统计、设置、帮助与反馈、关于
- 退出登录:退出当前账号
## 使用的 TDesign 组件 - **配色**:见 `doc/DESIGN.md`。色板令牌集中在 `app.wxss` 的 `page{}`,改配色只改这一处。
- `t-button`: 按钮组件 - **接口**:统一走 `utils/request.js`,基址 `https://api.huashengtec.com`(本地调试可改用文件内注释的 `127.0.0.1:9004`);请求自动携带 `appId=wxapp-escort` 与登录 token。
- `t-cell`: 单元格组件 - **登录**:`app.js` 的 `onShow` 调 `wx.login` 换 token,存于 `globalData.user`。
- `t-cell-group`: 单元格组组件 - **全局数据**:服务列表 / 协议 / 医院信息 / 排行在 `onLaunch` 预取,挂到 `globalData` 供各页取用。
- `t-icon`: 图标组件
- `t-avatar`: 头像组件
- `t-card`: 卡片组件
- `t-divider`: 分割线组件
- `t-badge`: 徽标组件
## 注意事项
1. 确保微信开发者工具的基础库版本 >= 2.12.0
2. 安装依赖后必须执行"构建 npm"操作
3. 建议在真机上测试,部分功能可能与模拟器有差异
4. 图标文件尺寸建议:未选中状态 81x81px,选中状态 81x81px
## 下一步开发建议
1. 实现用户登录功能
2. 对接后端 API,获取真实的值班数据
3. 添加数据缓存机制,提升用户体验
4. 实现消息通知功能
5. 添加数据导出功能
+83
View File
@@ -0,0 +1,83 @@
# 页面重构进度台账
**用途**:记录哪些页面已并入暖橙体系、哪些还停在旧体系,以及下一步的推进顺序。
**分工**:配色标准、令牌表、状态色、回滚方法一律以 [DESIGN.md](./DESIGN.md) 为准(本文不重复);本文只管「进度 + 顺序 + 每页动作」。
---
## 一、已完成(4 页)
| 页面 | 完成 | 主要动作 |
|---|---|---|
| `home/index`(首页) | 更早 | 暖白纸面 + 白卡语言重建:hero(大标题 / 场景行 / 通栏主 CTA)→ 陪诊服务(白卡宫格 + 浅橙介绍卡)→ 常用功能(青绿待服务条 + 双列 / 通栏卡)→ 页脚文字链。页内旧令牌副本已删 |
| `escort/itemlist`(陪诊服务列表) | 更早 | 页首短横色标 + 引导,说明白卡(开通城市 / 费用披露 + 两个入口),三组「通栏白底 + 章线」价目表,空心环「预约」按钮,浅橙收口页脚卡。页内旧令牌副本已删 |
| `mine/mine`(我的) | 2026-10-04 | 并入暖橙体系 + 首页白卡语言:纸面底、头像与昵称直接落纸面、菜单白卡(图标走 `--brand-ink`)、页脚细竖线分隔。默认头像改用暖墨品牌标记 `images/home-ink.png`。删掉一批死样式(`.user-phone`、`.avatar-btn`、昵称输入等) |
| `ai/aichat`(AI 陪诊助手) | 2026-10-04 | 整页重设计:纸面底 + 消息列表(头像行在上、气泡在下,用户消息整条靠右并把时间镜像到头像左侧);AI 与用户头像统一底座(浅橙底 + 暖橙描边),身份只由图形区分(品牌标记 / 人像);AI 声明由页底常驻行改为挂在每条 AI 气泡下方;清空入口移到输入框下方做成空心描边小按钮;全页圆角统一 20rpx。附带修复滚动布局(`.message-list` 补 `min-height: 0`,消息超一屏后输入区不再被顶出视口) |
> DESIGN.md §5.1 已同步登记 `mine/mine.wxss`、`ai/aichat.wxss` 两页迁移完成。
---
## 二、待重构(13 页 / 22 个文件)
按"离规范的距离"分三档,**建议从上往下推进**——同档内先易后难。
### A. 旧暖橙副本(最接近,只差删副本 + 对值)|4 页 8 文件
页内各带一份 `page{}` 令牌副本,停在 `#C2410C` / `#9A3412`;结构基本可用。
| 页面 | 文件 | 动作 |
|---|---|---|
| `escort/itemdetail` | `.wxss` `.wxml` | 删页内令牌副本(改读 app.wxss),`t-icon` 的 `color` 手改 `#9B4508` |
| `escort/attendantlist` | `.wxss` `.wxml` | 同上 |
| `escort/guide` | `.wxss` `.wxml` | 同上 |
| `mine/contact` | `.wxss` `.wxml` | 同上 |
### B. 旧金色体系(`#D4A853` 系,改动最大)|9 页 + 3 组件/JS
| 页面 | 文件 | 动作 |
|---|---|---|
| `mine/about` | `.wxss` | 按 §5.3 映射表整体换色 |
| `mine/comp_address` | `.wxss` `.wxml`(`switch` 属性值需硬编码) | 同上 |
| `mine/comp_profile` | `.wxss` | 同上 |
| `health/profilelist` | `.wxss` `.wxml` `.js`(`confirmColor`) | 同上 |
| `health/profileedit` | `.wxss` | 同上 |
| `escort/recordlist` | `.wxss` | 换色 + 状态四档 |
| `escort/recorddetail` | `.wxss` `.wxml` | 换色 + 状态四档 |
| `escort/agreement` | `.wxss` | 底 `#FAF6F1` → `--paper`,其余按映射表 |
### C. 绿灰系(另一套冷色,需整体并入)|2 页
| 页面 | 文件 | 动作 |
|---|---|---|
| `hospital/contact` | `.wxss` | 底 `#F5F7F6`、字 `#1F2937`、绿灰线一并换成纸面 / 暖墨 / 暖线 |
| `hospital/ranking` | `.wxss` | 同上 |
### D. 无需处理
| 页面 | 说明 |
|---|---|
| `home/webview` | 仅一个 `<web-view>`,无色值 |
### 组件与 JS 里的硬编码(易漏)
`comp_address.wxml` 的 `switch` 属性、`profilelist.js` 的 `confirmColor` 走的是**属性值**,读不到 CSS 变量,必须硬编码暖橙。
---
## 三、系统级收口(不属任何页面)
沿用 DESIGN.md §5.2,共 4 项:`app.json` 的 tabBar 绿色选中图标、tabBar `color: #999999`、`app.wxss` 里整套翠绿死代码(`--td-brand-color-1..10`、`--c-ink`)、`custom-tab-bar` 未选中灰 `#7A7068`。建议放在页面重构全部完成后一次做完,避免边改边漏。
---
## 四、每页收工自检
1. 灰度化后层级是否仍清楚(去掉颜色不散架)。
2. 色相数量:暖橙 + 暖墨 + 至多一个状态色。
3. 最浅的那行字是否 `--muted` 或更深。
4. 中文最小 24rpx、正文对比度 ≥ 4.5:1(大字 ≥ 3:1)、图标 ≥ 3:1。
5. 可点项是否有显性暗示,热区是否 ≥ 56rpx。
6. 页面是否还有 `page{}` 级令牌副本;有则删掉,回归 app.wxss 唯一来源。
> 详细判据见 DESIGN.md「六、一句话检验」。
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

+66 -84
View File
@@ -1,93 +1,82 @@
<view class="chat-container"> <view class="chat-container">
<!-- 消息列表区域 --> <!-- 消息列表区域 -->
<scroll-view <scroll-view
class="message-list {{messages.length > 0 ? 'has-messages' : ''}}" class="message-list"
scroll-y scroll-y
scroll-into-view="{{scrollToMessage}}" scroll-into-view="{{scrollToMessage}}"
enhanced enhanced
show-scrollbar show-scrollbar
> >
<!-- 欢迎消息 --> <!-- 欢迎区:空会话时的落点 -->
<view class="welcome-area" wx:if="{{messages.length === 0}}"> <view class="welcome-area" wx:if="{{messages.length === 0}}">
<view class="welcome-icon"> <view class="welcome-icon">
<t-icon name="chat" size="80rpx" color="#FF9B33" /> <t-icon name="chat" size="72rpx" color="#9B4508" />
</view> </view>
<text class="welcome-title">AI陪诊助手</text> <text class="welcome-title">AI陪诊助手</text>
<text class="welcome-desc">我是您的智能陪诊助手,可以为您解答陪诊相关问题</text> <text class="welcome-desc">我是您的智能陪诊助手,可以为您解答陪诊相关问题</text>
<view class="quick-questions"> <view class="quick-questions">
<view <view
class="quick-item" class="quick-item"
wx:for="{{quickQuestions}}" wx:for="{{quickQuestions}}"
wx:key="index" wx:key="index"
bindtap="onQuickQuestionTap" bindtap="onQuickQuestionTap"
data-question="{{item}}" data-question="{{item}}"
> >
<text>{{item}}</text> <text>{{item}}</text>
<t-icon name="chevron-right" size="26rpx" color="#9B4508" />
</view> </view>
</view> </view>
</view> </view>
<!-- 消息气泡 --> <!-- 消息:头像在上、气泡在下,时间紧跟头像右侧;用户消息整条靠右 -->
<view <view
class="message-item {{item.type}}" class="message-item {{item.type}}"
wx:for="{{messages}}" wx:for="{{messages}}"
wx:key="id" wx:key="id"
id="msg-{{item.id}}" id="msg-{{item.id}}"
> >
<!-- AI消息:头像在上,内容在下 --> <view class="message-head">
<block wx:if="{{item.type === 'ai'}}"> <!-- AI:品牌标记(暖墨线稿);底色与用户侧同构,身份只由图形区分 -->
<image class="avatar ai-avatar" src="/images/home-w.png" mode="aspectFill" /> <view wx:if="{{item.type === 'ai'}}" class="avatar">
<view class="message-content"> <image class="avatar-img" src="/images/home-ink.png" mode="aspectFit" />
<view class="message-bubble">
<t-chat-markdown
wx:if="{{item.contentType === 'text' && item.type === 'ai'}}"
class="message-markdown"
content="{{item.content}}"
/>
<text class="message-text" wx:elif="{{item.contentType === 'text'}}">{{item.content}}</text>
<image
wx:if="{{item.contentType === 'image'}}"
class="message-image"
src="{{item.content}}"
mode="widthFix"
bindtap="previewImage"
data-src="{{item.content}}"
/>
</view>
<text class="message-time">{{item.time}}</text>
</view> </view>
</block> <!-- 用户:人像图标(暖陶土) -->
<view wx:else class="avatar">
<t-icon name="user-1" size="36rpx" color="#9B4508" />
</view>
<text class="message-time">{{item.time}}</text>
</view>
<!-- 用户消息:头像在上,内容在下 --> <view class="message-content">
<block wx:if="{{item.type === 'user'}}"> <view class="message-bubble">
<view class="avatar user-avatar"> <t-chat-markdown
<t-icon name="user-1" size="40rpx" color="#FFFFFF" /> wx:if="{{item.type === 'ai' && item.contentType === 'text'}}"
class="message-markdown"
content="{{item.content}}"
/>
<text wx:elif="{{item.contentType === 'text'}}" class="message-text">{{item.content}}</text>
<image
wx:if="{{item.contentType === 'image'}}"
class="message-image"
src="{{item.content}}"
mode="widthFix"
bindtap="previewImage"
data-src="{{item.content}}"
/>
</view> </view>
<view class="message-content"> <!-- AI 声明:挂在每条 AI 回复的气泡正下方,替掉原来页面底部那行常驻声明
<view class="message-bubble"> (它太占底部空间)。放在 .message-content 内,与气泡同宽同左边缘 -->
<t-chat-markdown <text wx:if="{{item.type === 'ai'}}" class="message-note">内容由AI生成,仅供参考</text>
wx:if="{{item.contentType === 'text' && item.type === 'ai'}}" </view>
class="message-markdown"
content="{{item.content}}"
/>
<text class="message-text" wx:elif="{{item.contentType === 'text'}}">{{item.content}}</text>
<image
wx:if="{{item.contentType === 'image'}}"
class="message-image"
src="{{item.content}}"
mode="widthFix"
bindtap="previewImage"
data-src="{{item.content}}"
/>
</view>
<text class="message-time">{{item.time}}</text>
</view>
</block>
</view> </view>
<!-- AI正在输入提示 --> <!-- AI 正在输入 -->
<view class="message-item ai" wx:if="{{isTyping}}"> <view class="message-item ai" wx:if="{{isTyping}}">
<image class="avatar ai-avatar" src="/images/home-yellow.png" mode="aspectFill" /> <view class="message-head">
<view class="avatar">
<image class="avatar-img" src="/images/home-ink.png" mode="aspectFit" />
</view>
</view>
<view class="message-content"> <view class="message-content">
<view class="message-bubble typing-bubble"> <view class="message-bubble typing-bubble">
<view class="typing-indicator"> <view class="typing-indicator">
@@ -103,36 +92,29 @@
<view style="height: 40rpx;"></view> <view style="height: 40rpx;"></view>
</scroll-view> </scroll-view>
<!-- 清空按钮 --> <!-- 输入区 -->
<view class="clear-btn" wx:if="{{messages.length > 0}}" bindtap="clearChat">
<t-icon name="delete" size="28rpx" color="#999999" />
<text class="clear-text">清空聊天</text>
</view>
<!-- 输入区域 -->
<view class="input-area"> <view class="input-area">
<view class="input-wrapper"> <input
<input class="message-input"
class="message-input" type="text"
type="text" value="{{inputValue}}"
value="{{inputValue}}" placeholder="请输入您的问题..."
placeholder="请输入您的问题..." placeholder-class="input-placeholder"
placeholder-class="input-placeholder" confirm-type="send"
confirm-type="send" bindinput="onInputChange"
bindinput="onInputChange" bindconfirm="sendMessage"
bindconfirm="sendMessage" focus="{{inputFocus}}"
focus="{{inputFocus}}" />
/> <view class="action-btn send-btn {{inputValue ? 'active' : ''}}" bindtap="sendMessage">
<view class="input-actions"> <t-icon name="send" size="40rpx" color="{{inputValue ? '#FFFFFF' : '#6F655C'}}" />
<view class="action-btn send-btn {{inputValue ? 'active' : ''}}" bindtap="sendMessage">
<t-icon name="send" size="40rpx" color="{{inputValue ? '#FFFFFF' : '#CCCCCC'}}" />
</view>
</view>
</view> </view>
</view> </view>
<!-- AI声明 --> <!-- 清空入口:紧贴输入区下方——拇指最容易够到的位置,操作方便。
<view class="ai-disclaimer"> 低频但破坏性,故做成只描边不填充的暖橙小按钮(圆角与输入框同为 20rpx),
<text>本服务为AI生成内容,结果仅供参考。</text> 与输入区右侧浅橙底的发送键区分开,不做成裸文字链 -->
<view class="clear-btn" wx:if="{{messages.length > 0}}" bindtap="clearChat">
<t-icon name="delete" size="26rpx" color="#9B4508" />
<text class="clear-btn-text">清空聊天</text>
</view> </view>
</view> </view>
+170 -124
View File
@@ -1,45 +1,65 @@
/* 配色令牌来自 app.wxss(全站唯一来源),本页不留副本。
整体沿用首页的「暖白纸面 + 白卡 + 浅橙衬底」语言:
AI 气泡走白卡(白面 + 2rpx 发丝边),用户气泡走浅橙衬底,避免实心橙泛滥。 */
.chat-container { .chat-container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: 100vh; height: 100vh;
box-sizing: border-box; box-sizing: border-box;
/* 给 fixed 的自定义 tabBar 留位;安全区由这里统一承担,输入区不再重复加 */ /* 页面自身不滚,滚动只交给中间的消息区;
padding-bottom: calc(140rpx + env(safe-area-inset-bottom)); overflow: hidden 是兜底,避免任何子项溢出到视口外变成"看得见滑不到" */
background-color: #F5F5F5; overflow: hidden;
position: relative; /* 给 fixed 的自定义 tabBar 留位;安全区由这里统一承担,输入区不再重复加。
tabBar 实测高度 = 12+12 内距 + 44 图标 + 6 间距 + 24 文字 + 2 边框 = 100rpx(+安全区)。
140 → 120 → 112rpx:按钮下边只剩 12rpx(6px) 空隙,已贴近下限——
再往下(<100rpx)胶囊就会被 tabBar 盖住;这 12rpx 同时是防微信字体放大
把 tabBar 撑高的缓冲,不宜再压 */
padding-bottom: calc(112rpx + env(safe-area-inset-bottom));
background-color: var(--paper);
} }
/* 清空按钮 */ /* ===== 清空入口(在输入区下方)===== */
/* 空心描边小按钮:2rpx 暖橙描边、无填充。
清空是低频破坏性动作,用"只描边"与输入区右侧那个浅橙底发送键区分开;
描边在纸面上 4.66:1、文字 6.10:1,均过线。
圆角 20rpx 与输入框、发送键、气泡同档——全页统一为圆角矩形,不再有胶囊
容器是 column,靠 align-self: flex-end 右对齐,不必再套一层行容器 */
.clear-btn { .clear-btn {
align-self: flex-end;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: flex-end; gap: 8rpx;
gap: 6rpx; flex-shrink: 0;
padding: 12rpx 24rpx; /* 上 12 贴住输入区,右 32 对齐页面页边距;下不留边距,底部空气统一交给容器 */
background-color: #FFFFFF; margin: 12rpx 32rpx 0;
border-top: 1rpx solid #EEEEEE; padding: 10rpx 26rpx;
border-radius: 20rpx;
border: 2rpx solid var(--brand-strong);
transition: transform 0.15s ease;
} }
.clear-btn:active { .clear-btn:active {
opacity: 0.7; transform: scale(0.96);
} }
.clear-text { .clear-btn-text {
font-size: 22rpx; font-size: 24rpx;
color: #999999; font-weight: 500;
color: var(--brand-ink);
letter-spacing: 1rpx;
} }
/* 消息列表区域 */ /* ===== 消息列表 ===== */
.message-list { .message-list {
flex: 1; flex: 1;
/* 关键:flex 子项的自动最小高度是「内容高度」,消息多于一屏后它就不肯收缩,
会把 100vh 的容器撑破、把下方输入区顶出视口(且因容器锁死高度而滑不回来)。
置 0 后它才能正确收缩到剩余空间,并触发 scroll-view 自身滚动 */
min-height: 0;
padding: 20rpx 0; padding: 20rpx 0;
} }
.message-list.has-messages { /* ===== 欢迎区 ===== */
padding-top: 20rpx;
}
/* 欢迎区域 */
.welcome-area { .welcome-area {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -48,30 +68,31 @@
text-align: center; text-align: center;
} }
/* 空态图标:浅橙衬底 + 暖陶土图标,替代原橙/绿渐变与彩色辉光 */
.welcome-icon { .welcome-icon {
width: 160rpx; width: 140rpx;
height: 160rpx; height: 140rpx;
border-radius: 50%; margin-bottom: 32rpx;
background: linear-gradient(135deg, #D4A853 0%, #D4A853 100%);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
margin-bottom: 40rpx; border-radius: 40rpx;
box-shadow: 0 8rpx 32rpx rgba(255, 155, 51, 0.3); background: var(--brand-soft);
border: 2rpx solid var(--brand-line);
} }
.welcome-title { .welcome-title {
margin-bottom: 12rpx;
font-size: 40rpx; font-size: 40rpx;
font-weight: 600; font-weight: 700;
color: #333333; color: var(--ink);
margin-bottom: 16rpx;
} }
.welcome-desc { .welcome-desc {
margin-bottom: 56rpx;
font-size: 28rpx; font-size: 28rpx;
color: #999999;
margin-bottom: 60rpx;
line-height: 1.6; line-height: 1.6;
color: var(--muted);
} }
.quick-questions { .quick-questions {
@@ -81,113 +102,142 @@
gap: 20rpx; gap: 20rpx;
} }
/* 常见问题:首页白卡语言 + 右侧 chevron 做点击暗示 */
.quick-item { .quick-item {
background-color: #FFFFFF; display: flex;
padding: 28rpx 32rpx; align-items: center;
border-radius: 16rpx; justify-content: space-between;
gap: 16rpx;
padding: 28rpx 28rpx 28rpx 32rpx;
background: var(--white);
border: 2rpx solid var(--line);
border-radius: 20rpx;
box-shadow: var(--shadow-card);
font-size: 28rpx; font-size: 28rpx;
color: #333333; color: var(--ink-2);
text-align: left; text-align: left;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06); transition: transform 0.15s ease;
transition: all 0.2s ease;
} }
.quick-item:active { .quick-item:active {
transform: scale(0.98); transform: scale(0.98);
background-color: #FFF8F0; background: var(--brand-soft);
} }
/* 消息项 */ /* ===== 消息项 ===== */
/* 头像在上、气泡在下;用户消息整条靠右 */
.message-item { .message-item {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 16rpx 24rpx; padding: 16rpx 24rpx;
} }
.message-item.ai {
align-items: flex-start;
}
.message-item.user { .message-item.user {
align-items: flex-end; align-items: flex-end;
} }
/* 头像 */ /* 头像行:头像在左,时间紧跟其右 */
.message-head {
display: flex;
align-items: center;
gap: 12rpx;
margin-bottom: 10rpx;
}
/* 用户侧镜像为「时间 → 头像」:整行仍贴右边缘,于是头像正好落在气泡右边缘上,
与 AI 侧头像对齐气泡左边缘形成对称;时间退到头像左侧,不再顶在最右 */
.message-item.user .message-head {
flex-direction: row-reverse;
}
/* 头像底座:AI 与用户同构——浅橙衬底 + 2rpx 暖橙描边
(浅橙块落在纸面上只有约 1.03:1,必须靠描边托形)。
身份只由图形区分:AI 是品牌标记,用户是人像图标;
左右位置本来就把两者分开了,不必再用"实心橙 vs 浅橙"区分,
否则同一列里两种底板并排出现会读成没做完 */
.avatar { .avatar {
width: 72rpx; width: 64rpx;
height: 72rpx; height: 64rpx;
border-radius: 40%;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
border-radius: 20rpx;
background: var(--brand-soft);
border: 2rpx solid var(--brand-line);
flex-shrink: 0; flex-shrink: 0;
} }
.ai-avatar { /* AI 的品牌标记用暖墨版 home-ink.png:白色版 home-w.png 只能压在实心色块上,
background: linear-gradient(135deg, #FF9B33 0%, #FF7A33 100%); 落在浅橙底会看不见。
margin-bottom: 12rpx; 36rpx 与用户侧的 t-icon 同尺寸(两个图形的笔画都约占画布 95%),视觉齐平 */
padding: 16rpx; .avatar-img {
width: 46rpx; width: 36rpx;
height: 46rpx; height: 36rpx;
} }
.user-avatar { /* 头像行里的时间:放头像右侧 */
background: linear-gradient(135deg, #4CAF50 0%, #45A049 100%); .message-time {
margin-bottom: 12rpx; font-size: 22rpx;
color: var(--muted);
} }
/* 消息内容 */ /* 头像已移到气泡上方,气泡不再被头像占位挤压,版心随之放宽:
84% → 92%(约 646rpx),仍留一档余量不顶到屏幕边缘 */
.message-content { .message-content {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
max-width: 95%; min-width: 0;
max-width: 92%;
} }
.message-item.user .message-content { .message-item.user .message-content {
align-items: flex-end; align-items: flex-end;
} }
.message-item.ai .message-content { /* ===== 气泡 ===== */
align-items: flex-start;
}
/* 消息气泡 */
.message-bubble { .message-bubble {
padding: 20rpx 24rpx; padding: 20rpx 24rpx;
border-radius: 16rpx; border-radius: 20rpx;
word-wrap: break-word; word-wrap: break-word;
word-break: break-all; word-break: break-all;
} }
/* AI:白卡(白面 + 发丝边),安静、不与用户消息争色 */
.message-item.ai .message-bubble { .message-item.ai .message-bubble {
background-color: #FFFFFF; background: var(--white);
border-top-left-radius: 4rpx; border: 2rpx solid var(--line);
border-top-left-radius: 6rpx;
} }
/* 用户:浅橙衬底 + 暖陶土字,避免一排实心橙(浅橙底 5.96:1,过 AA)。
气泡落在纸面上,浅橙底与纸面明度差仅约 1.03:1,必须靠 2rpx --brand-line 描边托形 */
.message-item.user .message-bubble { .message-item.user .message-bubble {
background: linear-gradient(135deg, #FF9B33 0%, #FF7A33 100%); background: var(--brand-soft);
border-top-right-radius: 4rpx; border: 2rpx solid var(--brand-line);
border-top-right-radius: 6rpx;
} }
/* 气泡正文 28 → 30rpx(15px):长回答连续阅读时 14px 偏吃力,上调一号。
markdown 与纯文本两条路径同步,避免同一气泡里两种字号 */
.message-text { .message-text {
font-size: 28rpx; font-size: 30rpx;
line-height: 1.6; line-height: 1.6;
} }
.message-item.ai .message-text { .message-item.ai .message-text {
color: #333333; color: var(--ink-2);
} }
.message-item.user .message-text { .message-item.user .message-text {
color: #FFFFFF; color: var(--brand-ink);
} }
/* Markdown 渲染区域 */ /* Markdown 渲染区:字号与 .message-text 对齐(30rpx) */
.message-markdown { .message-markdown {
width: 100%; width: 100%;
font-size: 28rpx; font-size: 30rpx;
color: #333333;
line-height: 1.6; line-height: 1.6;
color: var(--ink-2);
} }
/* 表格在聊天气泡中的样式覆盖 */ /* 表格在聊天气泡中的样式覆盖 */
@@ -196,7 +246,7 @@
max-width: 100%; max-width: 100%;
overflow-x: auto; overflow-x: auto;
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
border: 1rpx solid #E5E5E5; border: 2rpx solid var(--line);
border-radius: 8rpx; border-radius: 8rpx;
} }
@@ -223,16 +273,16 @@
} }
.message-markdown .t-chat-markdown-table__th { .message-markdown .t-chat-markdown-table__th {
background-color: #F5F5F5; background-color: var(--brand-soft);
font-weight: 600; font-weight: 600;
color: #333333; color: var(--ink);
} }
.message-markdown .t-chat-markdown-table__tr:nth-child(2n) { .message-markdown .t-chat-markdown-table__tr:nth-child(2n) {
background-color: #FAFAFA; background-color: var(--paper);
} }
/* 代码块样式覆盖 */ /* 代码块 */
.message-markdown .t-chat-markdown-codespan, .message-markdown .t-chat-markdown-codespan,
.message-markdown .t-chat-markdown-code { .message-markdown .t-chat-markdown-code {
font-size: 24rpx; font-size: 24rpx;
@@ -241,16 +291,10 @@
.message-image { .message-image {
max-width: 400rpx; max-width: 400rpx;
border-radius: 8rpx; border-radius: 12rpx;
} }
.message-time { /* ===== 正在输入 ===== */
font-size: 20rpx;
color: #999999;
margin-top: 8rpx;
}
/* 正在输入指示器 */
.typing-bubble { .typing-bubble {
padding: 24rpx 32rpx; padding: 24rpx 32rpx;
} }
@@ -262,10 +306,10 @@
} }
.dot { .dot {
width: 16rpx; width: 14rpx;
height: 16rpx; height: 14rpx;
border-radius: 50%; border-radius: 50%;
background-color: #CCCCCC; background-color: var(--brand-ink);
animation: typing 1.4s infinite ease-in-out both; animation: typing 1.4s infinite ease-in-out both;
} }
@@ -288,62 +332,64 @@
} }
} }
/* 输入区域 */ /* ===== 输入区 ===== */
.input-area { .input-area {
background-color: #FFFFFF;
padding: 20rpx 24rpx;
border-top: 1rpx solid #EEEEEE;
}
.input-wrapper {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 16rpx; gap: 16rpx;
/* 钉在容器底部,不被消息区挤压 */
flex-shrink: 0;
padding: 16rpx 24rpx;
background: var(--white);
border-top: 2rpx solid var(--line);
} }
.message-input { .message-input {
flex: 1; flex: 1;
height: 72rpx; height: 76rpx;
background-color: #F5F5F5;
border-radius: 16rpx;
padding: 0 28rpx; padding: 0 28rpx;
background: var(--paper);
border: 2rpx solid var(--line);
/* 20rpx = 10px:与气泡、常见问题卡、用户徽记的统一圆角档,
比原 999rpx 胶囊更贴合"输入条"的体量(76rpx 高≈38px,10px 圆角约占四分之一) */
border-radius: 20rpx;
font-size: 28rpx; font-size: 28rpx;
color: #333333; color: var(--ink);
} }
.input-placeholder { .input-placeholder {
color: #AAAAAA; color: var(--muted);
}
.input-actions {
display: flex;
align-items: center;
gap: 16rpx;
} }
/* 发送按钮:默认浅橙底 + 描边,有内容时转实心暖橙(全页唯一的实心橙块)。
默认态落在白面输入区上,浅橙底同样靠 --brand-line 描边托形。
圆角由正圆(50%)改为 20rpx,与左侧输入框、上方气泡同档,成对出现 */
.action-btn { .action-btn {
width: 72rpx; width: 76rpx;
height: 72rpx; height: 76rpx;
border-radius: 50%;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background-color: #F5F5F5; border-radius: 20rpx;
transition: all 0.2s ease; background: var(--brand-soft);
border: 2rpx solid var(--brand-line);
flex-shrink: 0;
transition: all 0.15s ease;
} }
.send-btn.active { .send-btn.active {
background: linear-gradient(135deg, #FF9B33 0%, #FF7A33 100%); background: var(--brand-strong);
border-color: var(--brand-strong);
} }
/* AI声明 */ /* ===== AI 声明注释 ===== */
.ai-disclaimer { /* 原为页面底部一行常驻声明,改为挂在每条 AI 回复的气泡正下方:
padding: 12rpx 24rpx; 既省下底部固定高度,又让声明紧贴它要限定的内容。
text-align: center; 无背景无边框,靠 muted 小字安静收尾;
background-color: #F5F5F5; 24rpx 是中文最小可用字号下限(12px),不能再小 */
} .message-note {
margin-top: 8rpx;
.ai-disclaimer text { font-size: 24rpx;
font-size: 22rpx; line-height: 1.5;
color: #CCCCCC; color: var(--muted);
} }
+3 -3
View File
@@ -13,13 +13,13 @@
const SERVICE_GROUPS = [{ const SERVICE_GROUPS = [{
key: 'accompany', key: 'accompany',
title: '陪同就医', title: '陪同就医',
note: '老人、异地就医,或不便独自就诊的情况都适合。陪诊师提前确认院区路线与科室位置,就诊当天全程在场。', note: '不熟悉医院流程、上班脱不开身、不便独自就诊的情况都适合,就诊当天有人全程陪着。',
ids: [1, 2] // 全天陪诊 / 半天陪诊 ids: [1, 2] // 全天陪诊 / 半天陪诊
}, },
{ {
key: 'errand', key: 'errand',
title: '就医代办', title: '就医代办',
note: '本人不必到场。排队取号、递送材料、取报告这些跑动的事都可以交给我们,办完的结果原样带回。', note: '代问诊、预约检查时间、取报告、办手续、开药等跑腿服务都可以代劳,本人不必到场。',
ids: [3, 4, 5, 6] // 代问诊 / 检查预约 / 出入院代办 / 跑腿服务 ids: [3, 4, 5, 6] // 代问诊 / 检查预约 / 出入院代办 / 跑腿服务
}, },
{ {
@@ -30,7 +30,7 @@ const SERVICE_GROUPS = [{
// 沿革:这里放过「打算长期使用」,因与另外两组的"要办的事"不同轴被改回口语, // 沿革:这里放过「打算长期使用」,因与另外两组的"要办的事"不同轴被改回口语,
// 现在三组标题统一改成 4 字短语,它也就不再是异类 // 现在三组标题统一改成 4 字短语,它也就不再是异类
title: '多次使用', title: '多次使用',
note: '需要多次复诊或长期治疗时,一次买多次,省去反复下单的麻烦,每次按次使用。', note: '需要多次复诊或长期治疗时,一次买多次,省去反复下单的麻烦。',
ids: [7, 8] // VIP 5次 半天陪诊 / VIP 5次代买药 ids: [7, 8] // VIP 5次 半天陪诊 / VIP 5次代买药
// 注:条目改单行横排后名称不再被半栏宽度挤压,这两个"VIP 5次 XXX"已恢复原名, // 注:条目改单行横排后名称不再被半栏宽度挤压,这两个"VIP 5次 XXX"已恢复原名,
// "买多次"由名称自己交代;组标题与副题仍负责讲清"什么情况选这一组" // "买多次"由名称自己交代;组标题与副题仍负责讲清"什么情况选这一组"
+4 -4
View File
@@ -22,12 +22,12 @@
<view class="notice-links"> <view class="notice-links">
<view class="notice-link" bindtap="goToGuide"> <view class="notice-link" bindtap="goToGuide">
<text class="notice-link-text">服务指南</text> <text class="notice-link-text">服务指南</text>
<t-icon name="chevron-right" size="26rpx" color="#9A3412" /> <t-icon name="chevron-right" size="26rpx" color="#9B4508" />
</view> </view>
<view class="notice-sep"></view> <view class="notice-sep"></view>
<view class="notice-link" bindtap="goToAgreement"> <view class="notice-link" bindtap="goToAgreement">
<text class="notice-link-text">用户协议</text> <text class="notice-link-text">用户协议</text>
<t-icon name="chevron-right" size="26rpx" color="#9A3412" /> <t-icon name="chevron-right" size="26rpx" color="#9B4508" />
</view> </view>
</view> </view>
</view> </view>
@@ -87,13 +87,13 @@
做成一张浅橙收口卡——与首页「常用功能」区块尾部的「联系我们」卡 做成一张浅橙收口卡——与首页「常用功能」区块尾部的「联系我们」卡
(.quick-item-full)同源:--brand-soft 底 + 2rpx --brand-line 描边 + 去阴影。 (.quick-item-full)同源:--brand-soft 底 + 2rpx --brand-line 描边 + 去阴影。
首页每个区块都收在暖色卡上,本页原先四张白面一张暖色面都没有, 首页每个区块都收在暖色卡上,本页原先四张白面一张暖色面都没有,
暖色只剩"线"(竖条 / 按钮环 / 暖陶土字),整页因此比首页轻一档; 暖色只剩"线"(竖条 / 按钮环 / 暖橙字),整页因此比首页轻一档;
这张卡就是补回来的那张"面",也是页尾唯一的暖色落点 --> 这张卡就是补回来的那张"面",也是页尾唯一的暖色落点 -->
<view class="page-footer"> <view class="page-footer">
<text class="footer-text">没有合适的?</text> <text class="footer-text">没有合适的?</text>
<view class="footer-link" bindtap="goToContact"> <view class="footer-link" bindtap="goToContact">
<text class="footer-link-text">联系人工客服</text> <text class="footer-link-text">联系人工客服</text>
<t-icon name="chevron-right" size="22rpx" color="#9A3412" /> <t-icon name="chevron-right" size="22rpx" color="#9B4508" />
</view> </view>
</view> </view>
+18 -32
View File
@@ -25,11 +25,11 @@
- 项间虚线挂在 .ledger-row 上、通栏到卡的内边缘;每组最后一行不画 - 项间虚线挂在 .ledger-row 上、通栏到卡的内边缘;每组最后一行不画
(.ledger-row:last-child)——卡的底边已经替它收了口,留着会叠出 (.ledger-row:last-child)——卡的底边已经替它收了口,留着会叠出
"虚线 + 28rpx + 卡边发丝线"的双线。章线开、卡边收,每章仍是一张闭合的表 "虚线 + 28rpx + 卡边发丝线"的双线。章线开、卡边收,每章仍是一张闭合的表
- 按钮走"空心胶囊":3rpx --brand-strong 环 + 满圆角 + 暖陶土字(纸面 6.89:1), - 按钮走"空心胶囊":3rpx --brand-strong 环 + 满圆角 + 暖橙字(纸面 6.10:1),
无填充无阴影,按下填 --brand-line。之所以不用填充,是因为按钮挪到价格左边后 无填充无阴影,按下填 --brand-line。之所以不用填充,是因为按钮挪到价格左边后
与规格签撞了形——签是"浅橙底 + 小圆角",按钮若也做成"浅橙底 + 圆角", 与规格签撞了形——签是"浅橙底 + 小圆角",按钮若也做成"浅橙底 + 圆角",
同一行就出现两个同形物体,读起来是两个标签,分不清哪个能点。 同一行就出现两个同形物体,读起来是两个标签,分不清哪个能点。
现在签 = 暖陶土小字、按钮 = 满圆角空心环,一行只剩一个填充物。 现在签 = 暖橙小字、按钮 = 满圆角空心环,一行只剩一个填充物。
字重也从 700 降到 500:可点性改由环承担,字不必再靠粗度喊话 字重也从 700 降到 500:可点性改由环承担,字不必再靠粗度喊话
(代价是 500 在部分 Android 上会落回常规,详见 .book-btn 注释) (代价是 500 在部分 Android 上会落回常规,详见 .book-btn 注释)
- 价格按用户要求弱化:--muted + 字重 500(本页对 §2.1「价格数字」的例外,已登记) - 价格按用户要求弱化:--muted + 字重 500(本页对 §2.1「价格数字」的例外,已登记)
@@ -49,25 +49,11 @@
落差只剩一处,且是分工使然:首页「立即预约」是实心 --brand-strong 胶囊(1 个主 CTA), 落差只剩一处,且是分工使然:首页「立即预约」是实心 --brand-strong 胶囊(1 个主 CTA),
本页「预约」是 3rpx 空心环(8 个并列动作)——8 个实心橙排一列会撞 §2.1,故不跟 */ 本页「预约」是 3rpx 空心环(8 个并列动作)——8 个实心橙排一列会撞 §2.1,故不跟 */
page { page {
--brand-strong: #C2410C; /* 按钮环、区块竖条:纸面上 4.89:1,过 AA 与非文本 3:1 */ /* 配色令牌已上移到 app.wxss(全站唯一来源,改配色只改那一处),本页不再留副本;
--brand-soft: #FFF4E8; /* 浅橙衬底,暖色的第二档;也是规格签的底 */ 以下两段注释只作沿革留档。
--brand-line: #FFE0C2; /* 浅橙衬底描边;也是按钮按下时的填充 */ 主色:暖橙(色相 25°、明度 38°)。
--brand-ink: #9A3412; /* 浅橙衬底/纸面上的文字链:6.8:1,过 AA */ 曾试过右移到琥珀 #A85A00 以避开"锈橙 ≈ 干血",但为凑白字 AA 压低了明度(40%→33%),
画面变闷、失掉醒目度;故折中定在 #B8520A——微出色相、保住原亮度与饱和 */
--ink: #2B2521;
--ink-2: #4A4038;
--muted: #6F655C; /* 纸面 5.28:1 / 白卡 5.69:1,过 AA 正文 */
--line: #ECE3D6; /* 米色发丝边:纸面 1.20:1 */
--sep: #E5DACC; /* 分隔线专用:竖分隔线
(比 --line 深一档才看得见) */
--paper: #FAF8F5;
--white: #FFFFFF;
/* 白卡托形阴影:与首页 --shadow-card 同值,全站一套。
用中性暖墨而不是暖橙——DESIGN.md §2.3 把彩色阴影登记给"浅橙块托形",
白面一律走中性;暖橙阴影会让白卡边缘泛出一圈暖晕,与首页的白卡不是同一种东西 */
--shadow-card: 0 2rpx 10rpx rgba(63, 43, 25, 0.07);
background-color: var(--paper); background-color: var(--paper);
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
} }
@@ -297,13 +283,13 @@ page {
color: var(--muted); color: var(--muted);
} }
/* ===== 规格签:暖陶土小字(按用户要求去掉左竖条) ===== /* ===== 规格签:暖橙小字(按用户要求去掉左竖条) =====
沿革:整圈描边 → 4rpx 左竖条 + 浅橙底(色标式)→ 现在只剩字 + 一层极浅的底。 沿革:整圈描边 → 4rpx 左竖条 + 浅橙底(色标式)→ 现在只剩字 + 一层极浅的底。
去竖条的原因:页面上已经有一套竖条语言——三个组头的 8×36rpx 实心竖条。 去竖条的原因:页面上已经有一套竖条语言——三个组头的 8×36rpx 实心竖条。
每行再插一道 4rpx 小竖条,全页竖向重音就从 3 处涨到 11 处,与组头抢同一个记号。 每行再插一道 4rpx 小竖条,全页竖向重音就从 3 处涨到 11 处,与组头抢同一个记号。
签退回纯文字后,每行的竖条只剩组头一处,记号重新变回"章"级。 签退回纯文字后,每行的竖条只剩组头一处,记号重新变回"章"级。
代价要记住:底仍是 --brand-soft,它落在白卡上只有 1.08:1(纸面上 1.02:1), 代价要记住:底仍是 --brand-soft,它落在白卡上只有 1.08:1(纸面上 1.02:1),
实际都看不出来——签现在是"暖陶土字 + 一层几乎不可见的暖底", 实际都看不出来——签现在是"暖橙字 + 一层几乎不可见的暖底",
辨识全部由字色承担。这也正是它当初选 --brand-ink(白卡 7.31:1)而不是 辨识全部由字色承担。这也正是它当初选 --brand-ink(白卡 7.31:1)而不是
--brand-strong 的原因。 --brand-strong 的原因。
若日后想要一个看得见的签形,两条路: 若日后想要一个看得见的签形,两条路:
@@ -406,30 +392,30 @@ page {
line-height: 1.7; line-height: 1.7;
} }
/* ===== 预约:空心胶囊(鲜橙环 + 暖陶土字) ===== /* ===== 预约:空心胶囊(暖橙环 + 暖橙字) =====
沿革:描边版 → 实心 --brand-strong → 软色块 → 现在这版空心胶囊,第四次调整。 沿革:描边版 → 实心 --brand-strong → 软色块 → 现在这版空心胶囊,第四次调整。
为什么又回到"无填充":上一版软色块本身没问题,问题是它挪到价格左边之后, 为什么又回到"无填充":上一版软色块本身没问题,问题是它挪到价格左边之后,
和紧邻的规格签撞了形——签是"浅橙底 + 暖陶土字 + 小圆角",按钮也是 和紧邻的规格签撞了形——签是"浅橙底 + 暖橙字 + 小圆角",按钮也是
"浅橙底 + 暖陶土字 + 圆角",两个同形物体在同一行相距 450rpx,读起来像两个标签。 "浅橙底 + 暖橙字 + 圆角",两个同形物体在同一行相距 450rpx,读起来像两个标签。
签和按钮的身份不同:签是标签(静态、可无边界),按钮是控件(必须一眼看出能点)。 签和按钮的身份不同:签是标签(静态、可无边界),按钮是控件(必须一眼看出能点)。
两者只能靠"形"分开,靠"深浅"分不开。于是这里把按钮做成一行里唯一的"环": 两者只能靠"形"分开,靠"深浅"分不开。于是这里把按钮做成一行里唯一的"环":
签 = 浅橙底 + 暖陶土字,无框,也不再有左竖条; 签 = 浅橙底 + 暖橙字,无框,也不再有左竖条;
按钮 = 满圆角空心环,无底。 按钮 = 满圆角空心环,无底。
同时它也不再是行内第二个浅色实心块,一行只剩一个填充物(签),主次不再打架。 同时它也不再是行内第二个浅色实心块,一行只剩一个填充物(签),主次不再打架。
为什么是满圆角:圆角 6rpx 是签的语言,12rpx 与签仍在同一族; 为什么是满圆角:圆角 6rpx 是签的语言,12rpx 与签仍在同一族;
28rpx(= 高度 56rpx 的一半)让它成为胶囊,轮廓与签一眼可分。 28rpx(= 高度 56rpx 的一半)让它成为胶囊,轮廓与签一眼可分。
为什么环 3rpx 而不是 2rpx:按钮是本页唯一的转化入口,56rpx 高度下 2rpx 的环 为什么环 3rpx 而不是 2rpx:按钮是本页唯一的转化入口,56rpx 高度下 2rpx 的环
在真机强光里发虚;3rpx 的 --brand-strong 在纸面上 4.89:1,稳稳过非文本 3:1。 在真机强光里发虚;3rpx 的 --brand-strong 在纸面上 4.66:1,稳稳过非文本 3:1。
字走 --brand-ink(纸面上 6.89:1),比环的 --brand-strong(4.89:1)再稳一档: 字走 --brand-ink(纸面上 6.10:1),比环的 --brand-strong(4.66:1)再稳一档:
环承担"这是动作"的色,字承担"读得清"的对比度。 环承担"这是动作"的色,字承担"读得清"的对比度。
去掉填充与阴影:原先的暖色紧阴影是为了把 1.02:1 的浅橙底托出形状, 去掉填充与阴影:原先的暖色紧阴影是为了把 1.02:1 的浅橙底托出形状,
没有底就不需要拖形,8 圈阴影一并撤掉,整页顺带更轻。 没有底就不需要拖形,8 圈阴影一并撤掉,整页顺带更轻。
按下把胶囊填上 --brand-line:同色阶、可感知(1.19:1→填充可见), 按下把胶囊填上 --brand-line:同色阶、可感知(1.19:1→填充可见),
暖陶土字在其上 5.80:1,仍过 AA。不引入新色。 暖橙字在其上 5.14:1,仍过 AA。不引入新色。
注意"淡"仍不能走"提亮填充 + 白字"——白字对 #EA6A2E 只剩约 3.2:1、 注意"淡"仍不能走"提亮填充 + 白字"——白字对 #EA6A2E 只剩约 3.2:1、
对 #F97316 约 2.8:1,都不达 AA。 对 #F97316 约 2.8:1,都不达 AA。
与 DESIGN.md §3 的禁用态不撞:禁用是 --muted 字 + --sep 描边 + 透明底, 与 DESIGN.md §3 的禁用态不撞:禁用是 --muted 字 + --sep 描边 + 透明底,
本按钮是暖陶土字 + 鲜橙环,字色与环色两个维度都不同,不会被读成不可点。 本按钮是暖橙字 + 暖橙环,字色与环色两个维度都不同,不会被读成不可点。
真机若觉得环太空、抓力不够,下一顺位是只把 background 换成 --brand-line 真机若觉得环太空、抓力不够,下一顺位是只把 background 换成 --brand-line
(就是现在的按下色),形不动——那是一步就能上的台阶,不必换风格。 (就是现在的按下色),形不动——那是一步就能上的台阶,不必换风格。
字重按用户要求 700 → 500。要记住 500 在中文里不稳定:iOS 的苹方有 Medium(500), 字重按用户要求 700 → 500。要记住 500 在中文里不稳定:iOS 的苹方有 Medium(500),
@@ -479,7 +465,7 @@ page {
同一套做法:--brand-soft 底 + 2rpx --brand-line 描边 + 去阴影 + 28rpx 圆角。 同一套做法:--brand-soft 底 + 2rpx --brand-line 描边 + 去阴影 + 28rpx 圆角。
为什么页尾要有一张暖色面:首页的节奏是"白卡 … 白卡 … 一张浅橙卡收口" 为什么页尾要有一张暖色面:首页的节奏是"白卡 … 白卡 … 一张浅橙卡收口"
(陪诊服务收在介绍卡上,常用功能收在联系我们上)。本页原先 4 张白面 (陪诊服务收在介绍卡上,常用功能收在联系我们上)。本页原先 4 张白面
一张暖色收口都没有,暖色只剩"线"——竖条、按钮环、暖陶土字, 一张暖色收口都没有,暖色只剩"线"——竖条、按钮环、暖橙字,
整页因此比首页轻一大截;这张卡就是补回来的那一张"面"。 整页因此比首页轻一大截;这张卡就是补回来的那一张"面"。
浅橙底与纸面的填充差只有约 1.03:1,但面积够大,大面积暖色自身可辨, 浅橙底与纸面的填充差只有约 1.03:1,但面积够大,大面积暖色自身可辨,
再配 --brand-line 描边就够,与首页那张一样不加阴影 */ 再配 --brand-line 描边就够,与首页那张一样不加阴影 */
+1 -1
View File
@@ -116,7 +116,7 @@
<view class="quick-item {{ item.full ? 'quick-item-full' : '' }}" wx:for="{{ quickEntries }}" wx:key="id" data-item="{{ item }}" bindtap="onQuickEntryTap"> <view class="quick-item {{ item.full ? 'quick-item-full' : '' }}" wx:for="{{ quickEntries }}" wx:key="id" data-item="{{ item }}" bindtap="onQuickEntryTap">
<!-- 入口统一走暖橙 + 浅橙衬底,不做色相区分;带 full 标记的卡通栏排布 --> <!-- 入口统一走暖橙 + 浅橙衬底,不做色相区分;带 full 标记的卡通栏排布 -->
<view class="quick-icon"> <view class="quick-icon">
<t-icon name="{{ item.icon }}" size="34rpx" color="#9A3412" /> <t-icon name="{{ item.icon }}" size="34rpx" color="#9B4508" />
</view> </view>
<view class="quick-info"> <view class="quick-info">
<text class="quick-name">{{ item.name }}</text> <text class="quick-name">{{ item.name }}</text>
+18 -49
View File
@@ -6,43 +6,12 @@
- 大字号标题直接落在纸面上,不用整块色面板压首屏 */ - 大字号标题直接落在纸面上,不用整块色面板压首屏 */
page { page {
/* 暖橙主色阶:strong 是实心块/按钮(白字需 ≥4.5:1、白图标需 ≥3:1), /* 配色令牌已上移到 app.wxss(全站唯一来源,改配色只改那一处),本页不再留副本。
soft 是衬底,ink 是浅衬底上的文字与线图标 */ 这里只剩本页专属的一样:「待服务订单」提醒条的状态色——全页唯一的冷色,
--brand: #F97316; /* 主色:仅装饰性小色块 */ 语义由 DESIGN.md §3 管,不随主色走 */
--brand-strong: #C2410C; /* 实心按钮 / 选中态:白字 4.69:1,过 AA 正文 */
--brand-soft: #FFF4E8; /* 图标衬底、标签底 */
--brand-line: #FFE0C2; /* 浅橙衬底的描边 */
--brand-ink: #9A3412; /* 浅橙衬底上的文字/图标:6.8:1,过 AA */
/* 状态色:全页唯一的冷色,只用在「待服务订单」提醒条上。
作用是制造唯一焦点——整页暖橙平铺时需要一个"该看这里"的落点 */
--status-soft: #ECF7F4; --status-soft: #ECF7F4;
--status-line: #C7E5DF; --status-line: #C7E5DF;
--status-ink: #0F766E; /* #ECF7F4 上 5.0:1,过 AA 正文 */ --status-ink: #0F766E; /* #ECF7F4 上 5.0:1,过 AA 正文 */
/* 中性:暖灰阶,与暖白纸面同温(冷灰会让白卡边缘发青) */
--ink: #2B2521;
--ink-2: #4A4038;
--muted: #6F655C; /* 纸面(--paper) 5.28:1 / 白卡 5.69:1,过 AA 正文。
原 #7A7068 在白卡上 4.83:1 达标,但落在暖白纸面上只有 4.49:1,压线不过 */
--faint: #A79C92; /* 仅用于非文字装饰 */
--line: #ECE3D6; /* 米色发丝边。原 #F0E9E0 落在纸面上只有 1.12:1,等于"看得见但看不清",
而白卡与纸面的填充差本身只有 1.08:1——边界全靠这条边,它必须站得住。
压深一档后:纸面 1.20:1 / 白卡 1.27:1 */
--paper: #FAF8F5; /* 暖白纸面。原 #FAF6F0 的 R−B=10,黄度偏重,大面积铺开会被读成
"旧纸/发闷"而不是"暖白干净"(感知亮度受色饱和度影响,
同明度下越黄越显沉)。压到 R−B=5,黄度减半,
明度反而略升(L* 97.0 → 97.7),暖白身份保留 */
--white: #FFFFFF;
/* 紧阴影:偏移与模糊半径不变(仍是"小偏移、小模糊"的锐利档),只提不透明度。
原因:上面的纸面去黄后,白卡与纸面的填充差从 1.08:1 降到 1.06:1,
卡片需要阴影来补回"浮在纸面上"的层级,否则整页更平。
0.04 时阴影几乎不可见,提到 0.07 后边缘压深约等于那道填充差本身 */
--shadow-card: 0 2rpx 10rpx rgba(63, 43, 25, 0.07);
/* 彩色阴影原为 0 6rpx 16rpx/22%:全页只有它与品牌印记两处彩色阴影,且都在首屏,
是首屏显重的主要来源,也与"小偏移、小模糊"的锐利阴影偏好相悖,故收小一档 */
--shadow-cta: 0 2rpx 8rpx rgba(194, 65, 12, 0.16);
} }
.page-bg { .page-bg {
@@ -78,7 +47,7 @@ page {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
box-shadow: 0 2rpx 8rpx rgba(194, 65, 12, 0.16); box-shadow: 0 2rpx 8rpx rgba(184, 82, 10, 0.16);
} }
.brand-logo { .brand-logo {
@@ -119,7 +88,7 @@ page {
两段合计 11 字 × (48rpx + 2rpx 字距) + 10rpx 间隔 ≈ 560rpx, 两段合计 11 字 × (48rpx + 2rpx 字距) + 10rpx 间隔 ≈ 560rpx,
小于容器内宽 686rpx(750 - 32×2 页边距),不会折行 */ 小于容器内宽 686rpx(750 - 32×2 页边距),不会折行 */
.hero-title-accent { .hero-title-accent {
color: var(--brand-strong); /* 暖白纸面上 5.0:1,过 AA */ color: var(--brand-strong); /* 暖白纸面上 4.66:1,过 AA(50rpx/700 属大字,3:1 门槛之上) */
} }
.hero-title-main { .hero-title-main {
@@ -128,7 +97,7 @@ page {
} }
/* 场景行:三项核心场景两行排布(场景词 + 补充),纯展示不点击。 /* 场景行:三项核心场景两行排布(场景词 + 补充),纯展示不点击。
场景词走暖陶土 --brand-ink 做暖色标签,与标题深墨半句靠色相拉开层级, 场景词走暖橙 --brand-ink 做暖色标签,与标题深墨半句靠色相拉开层级,
避免两条深色带叠在一起;补充走 muted 保持安静。 避免两条深色带叠在一起;补充走 muted 保持安静。
28 → 40rpx:补充语由 8 字收到 5 字后横向已有空气,纵向再拉开一档 */ 28 → 40rpx:补充语由 8 字收到 5 字后横向已有空气,纵向再拉开一档 */
.scene-row { .scene-row {
@@ -147,9 +116,9 @@ page {
.scene-name { .scene-name {
font-size: 30rpx; font-size: 30rpx;
font-weight: 700; font-weight: 700;
/* 暖陶土 --brand-ink:与标题深墨半句「让就医更省心」同屏时靠色相拉开层级, /* 暖橙 --brand-ink:与标题深墨半句「让就医更省心」同屏时靠色相拉开层级,
避免两段 ink+700 连排成"两条深色带";比标题的 --brand-strong 低一档分量, 避免两段 ink+700 连排成"两条深色带";比标题的 --brand-strong 低一档分量,
标题仍是首屏唯一的亮橙焦点。纸面上 6.8:1,过 AA */ 标题仍是首屏唯一的暖色焦点。纸面上 6.10:1,过 AA */
color: var(--brand-ink); color: var(--brand-ink);
letter-spacing: 1rpx; letter-spacing: 1rpx;
} }
@@ -231,7 +200,7 @@ page {
.intro-trust-item { .intro-trust-item {
font-size: 24rpx; font-size: 24rpx;
font-weight: 700; font-weight: 700;
color: var(--brand-ink); /* 浅橙底 6.8:1,过 AA */ color: var(--brand-ink); /* 浅橙底 5.96:1,过 AA */
letter-spacing: 1rpx; letter-spacing: 1rpx;
} }
@@ -344,7 +313,7 @@ page {
transform: scale(0.94); transform: scale(0.94);
} }
/* 纤细线图标:24x24 网格、stroke-width 1.5、暖橙 #C2410C,base64 内嵌避免引入图标字体。 /* 纤细线图标:24x24 网格、stroke-width 1.5、暖橙 #B8520A,base64 内嵌避免引入图标字体。
60rpx(30px) 是过 WCAG 非文本 3:1 后兼顾真机清晰度、减少白卡空荡感的尺寸。 60rpx(30px) 是过 WCAG 非文本 3:1 后兼顾真机清晰度、减少白卡空荡感的尺寸。
图标直接落在白卡上、不加衬底方块:衬底层级已让给上方主推卡,小宫格保持安静 */ 图标直接落在白卡上、不加衬底方块:衬底层级已让给上方主推卡,小宫格保持安静 */
.assist-icon { .assist-icon {
@@ -358,43 +327,43 @@ page {
/* 1 全天陪诊:整圈表盘 + 指针 */ /* 1 全天陪诊:整圈表盘 + 指针 */
.assist-icon-1 { .assist-icon-1 {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQzI0MTBDIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4LjUiLz48cGF0aCBkPSJNMTIgNi42VjEybDMuOCAyLjIiLz48L3N2Zz4="); background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQjg1MjBBIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4LjUiLz48cGF0aCBkPSJNMTIgNi42VjEybDMuOCAyLjIiLz48L3N2Zz4=");
} }
/* 2 半天陪诊:整圈表盘 + 右半实心填充,与 1 的"空心全圈"形成"全 / 半"对照, /* 2 半天陪诊:整圈表盘 + 右半实心填充,与 1 的"空心全圈"形成"全 / 半"对照,
避免原半月形在小尺寸下被误读为字母 D */ 避免原半月形在小尺寸下被误读为字母 D */
.assist-icon-2 { .assist-icon-2 {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQzI0MTBDIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4LjUiLz48cGF0aCBkPSJNMTIgMy41YTguNSA4LjUgMCAwIDEgMCAxN1oiIGZpbGw9IiNDMjQxMEMiIHN0cm9rZT0ibm9uZSIvPjwvc3ZnPg=="); background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQjg1MjBBIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4LjUiLz48cGF0aCBkPSJNMTIgMy41YTguNSA4LjUgMCAwIDEgMCAxN1oiIGZpbGw9IiNCODUyMEEiIHN0cm9rZT0ibm9uZSIvPjwvc3ZnPg==");
} }
/* 3 代问诊:对话气泡 + 医疗十字 */ /* 3 代问诊:对话气泡 + 医疗十字 */
.assist-icon-3 { .assist-icon-3 {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQzI0MTBDIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjAgMTQuNWEyLjUgMi41IDAgMCAxLTIuNSAyLjVIOGwtNCAzLjVWNmEyLjUgMi41IDAgMCAxIDIuNS0yLjVoMTFBMi41IDIuNSAwIDAgMSAyMCA2WiIvPjxwYXRoIGQ9Ik0xMiA3LjZ2NS4yTTkuNCAxMC4yaDUuMiIvPjwvc3ZnPg=="); background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQjg1MjBBIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjAgMTQuNWEyLjUgMi41IDAgMCAxLTIuNSAyLjVIOGwtNCAzLjVWNmEyLjUgMi41IDAgMCAxIDIuNS0yLjVoMTFBMi41IDIuNSAwIDAgMSAyMCA2WiIvPjxwYXRoIGQ9Ik0xMiA3LjZ2NS4yTTkuNCAxMC4yaDUuMiIvPjwvc3ZnPg==");
} }
/* 4 检查预约:日历 + 对勾 */ /* 4 检查预约:日历 + 对勾 */
.assist-icon-4 { .assist-icon-4 {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQzI0MTBDIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cmVjdCB4PSIzLjUiIHk9IjUiIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNS41IiByeD0iMi41Ii8+PHBhdGggZD0iTTggM3Y0TTE2IDN2NE0zLjUgOS41aDE3Ii8+PHBhdGggZD0ibTkuNCAxNSAxLjkgMS45IDMuNy00Ii8+PC9zdmc+"); background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQjg1MjBBIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cmVjdCB4PSIzLjUiIHk9IjUiIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNS41IiByeD0iMi41Ii8+PHBhdGggZD0iTTggM3Y0TTE2IDN2NE0zLjUgOS41aDE3Ii8+PHBhdGggZD0ibTkuNCAxNSAxLjkgMS45IDMuNy00Ii8+PC9zdmc+");
} }
/* 5 出入院代办:医院楼 + 地面 + 十字 */ /* 5 出入院代办:医院楼 + 地面 + 十字 */
.assist-icon-5 { .assist-icon-5 {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQzI0MTBDIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNNC41IDIwLjVWNi41YTIgMiAwIDAgMSAyLTJoMTFhMiAyIDAgMCAxIDIgMnYxNCIvPjxwYXRoIGQ9Ik0yLjUgMjAuNWgxOSIvPjxwYXRoIGQ9Ik0xMiA4LjZ2NU05LjUgMTEuMWg1Ii8+PC9zdmc+"); background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQjg1MjBBIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNNC41IDIwLjVWNi41YTIgMiAwIDAgMSAyLTJoMTFhMiAyIDAgMCAxIDIgMnYxNCIvPjxwYXRoIGQ9Ik0yLjUgMjAuNWgxOSIvPjxwYXRoIGQ9Ik0xMiA4LjZ2NU05LjUgMTEuMWg1Ii8+PC9zdmc+");
} }
/* 6 跑腿服务:包裹箱 */ /* 6 跑腿服务:包裹箱 */
.assist-icon-6 { .assist-icon-6 {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQzI0MTBDIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjAuNSA4LjJ2Ny42YTEuNiAxLjYgMCAwIDEtLjg0IDEuNDJsLTYuOSAzLjhhMS42IDEuNiAwIDAgMS0xLjUyIDBsLTYuOS0zLjhBMS42IDEuNiAwIDAgMSAzLjUgMTUuOFY4LjJhMS42IDEuNiAwIDAgMSAuODQtMS40Mmw2LjktMy44YTEuNiAxLjYgMCAwIDEgMS41MiAwbDYuOSAzLjhBMS42IDEuNiAwIDAgMSAyMC41IDguMloiLz48cGF0aCBkPSJNMy45IDcuMyAxMiAxMS43bDguMS00LjRNMTIgMTEuN1YyMSIvPjwvc3ZnPg=="); background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQjg1MjBBIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjAuNSA4LjJ2Ny42YTEuNiAxLjYgMCAwIDEtLjg0IDEuNDJsLTYuOSAzLjhhMS42IDEuNiAwIDAgMS0xLjUyIDBsLTYuOS0zLjhBMS42IDEuNiAwIDAgMSAzLjUgMTUuOFY4LjJhMS42IDEuNiAwIDAgMSAuODQtMS40Mmw2LjktMy44YTEuNiAxLjYgMCAwIDEgMS41MiAwbDYuOSAzLjhBMS42IDEuNiAwIDAgMSAyMC41IDguMloiLz48cGF0aCBkPSJNMy45IDcuMyAxMiAxMS43bDguMS00LjRNMTIgMTEuN1YyMSIvPjwvc3ZnPg==");
} }
/* 7 陪诊套餐:礼盒 */ /* 7 陪诊套餐:礼盒 */
.assist-icon-7 { .assist-icon-7 {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQzI0MTBDIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cmVjdCB4PSIzIiB5PSI3LjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSI0LjUiIHJ4PSIxLjIiLz48cGF0aCBkPSJNNC41IDEydjcuNUExLjUgMS41IDAgMCAwIDYgMjFoMTJhMS41IDEuNSAwIDAgMCAxLjUtMS41VjEyIi8+PHBhdGggZD0iTTEyIDcuNVYyMSIvPjxwYXRoIGQ9Ik0xMiA3LjVIOS4yYTIuMyAyLjMgMCAxIDEgMC00LjZDMTAuNyAyLjkgMTIgNy41IDEyIDcuNVoiLz48cGF0aCBkPSJNMTIgNy41aDIuOGEyLjMgMi4zIDAgMSAwIDAtNC42QzEzLjMgMi45IDEyIDcuNSAxMiA3LjVaIi8+PC9zdmc+"); background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQjg1MjBBIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cmVjdCB4PSIzIiB5PSI3LjUiIHdpZHRoPSIxOCIgaGVpZ2h0PSI0LjUiIHJ4PSIxLjIiLz48cGF0aCBkPSJNNC41IDEydjcuNUExLjUgMS41IDAgMCAwIDYgMjFoMTJhMS41IDEuNSAwIDAgMCAxLjUtMS41VjEyIi8+PHBhdGggZD0iTTEyIDcuNVYyMSIvPjxwYXRoIGQ9Ik0xMiA3LjVIOS4yYTIuMyAyLjMgMCAxIDEgMC00LjZDMTAuNyAyLjkgMTIgNy41IDEyIDcuNVoiLz48cGF0aCBkPSJNMTIgNy41aDIuOGEyLjMgMi4zIDAgMSAwIDAtNC42QzEzLjMgMi45IDEyIDcuNSAxMiA3LjVaIi8+PC9zdmc+");
} }
/* 8 买药套餐:45° 斜置胶囊 + 中缝,避免原横置胶囊被误读为"链接"图标 */ /* 8 买药套餐:45° 斜置胶囊 + 中缝,避免原横置胶囊被误读为"链接"图标 */
.assist-icon-8 { .assist-icon-8 {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQzI0MTBDIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cmVjdCB4PSI0LjIiIHk9IjguMiIgd2lkdGg9IjE1LjYiIGhlaWdodD0iNy42IiByeD0iMy44IiB0cmFuc2Zvcm09InJvdGF0ZSgtNDUgMTIgMTIpIi8+PHBhdGggZD0iTTkuMyA5LjNsNS40IDUuNCIvPjwvc3ZnPg=="); background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQjg1MjBBIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cmVjdCB4PSI0LjIiIHk9IjguMiIgd2lkdGg9IjE1LjYiIGhlaWdodD0iNy42IiByeD0iMy44IiB0cmFuc2Zvcm09InJvdGF0ZSgtNDUgMTIgMTIpIi8+PHBhdGggZD0iTTkuMyA5LjNsNS40IDUuNCIvPjwvc3ZnPg==");
} }
/* 宫格项名统一走 28rpx 标题档(与 .quick-name 同级)。 /* 宫格项名统一走 28rpx 标题档(与 .quick-name 同级)。
+4 -1
View File
@@ -3,7 +3,10 @@ const API = require('../../utils/api.js')
Page({ Page({
data: { data: {
userInfo: { userInfo: {
avatar: '/images/home-yellow.png', // 默认头像:暖墨色品牌标记(home-ink #9B4508)。
// home.png 本体是 tabBar 未选中态的灰色 #8A8A8A,故另存一份重上色位图;
// 与 ai-ink.png 同一做法(位图着色走不了 CSS 变量,改色须手改,见 DESIGN.md §7.3)
avatar: '/images/home-ink.png',
name: '用户', name: '用户',
phone: '', phone: '',
sex: '', sex: '',
+9 -4
View File
@@ -24,13 +24,18 @@
<!-- B 端合作入口:从首页移入,避免干扰患者/家属的主流程 --> <!-- B 端合作入口:从首页移入,避免干扰患者/家属的主流程 -->
<view class="footer-links"> <view class="footer-links">
<text class="footer-link" bindtap="onFooterTap">企业/机构合作</text> <text class="footer-link" bindtap="onFooterTap">企业/机构合作</text>
<text class="footer-sep">·</text> <view class="footer-sep"></view>
<text class="footer-link" bindtap="onFooterTap">陪诊师入驻</text> <text class="footer-link" bindtap="onFooterTap">陪诊师入驻</text>
<text class="footer-sep">·</text> <view class="footer-sep"></view>
<text class="footer-link" bindtap="onFooterTap">商务合作</text> <text class="footer-link" bindtap="onFooterTap">商务合作</text>
</view> </view>
<text class="version">版本号:V 1.1.3</text> <!-- 版本与版权合并为一行:两行元信息体量都很小,分行只制造空白;
<text class="copyright">© 2026 北京奕华盛科技 版权所有</text> 中间复用 .footer-sep 细竖线,与上方链接行同一分隔语言(不用中点字符) -->
<view class="footer-meta">
<text class="copyright">© 2026 北京奕华盛科技 版权所有</text>
<view class="footer-sep"></view>
<text class="version">版本号:V 1.1.3</text>
</view>
</view> </view>
<comp-profile <comp-profile
+74 -93
View File
@@ -1,114 +1,58 @@
page { page {
background-color: #F5F5F5; /* 配色令牌来自 app.wxss(全站唯一来源),本页不再留副本;
页面底色改用暖白纸面,与首页一致 */
background-color: var(--paper);
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
} }
.container { .container {
min-height: 100vh; min-height: 100vh;
box-sizing: border-box;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
/* 给 fixed 的自定义 tabBar 留位,避免底部版权被盖住 */ /* 给 fixed 的自定义 tabBar 留位,避免底部版权被盖住 */
padding-bottom: calc(140rpx + env(safe-area-inset-bottom)); padding: 0 32rpx calc(140rpx + env(safe-area-inset-bottom));
} }
/* 头部:头像 + 昵称,直接落在纸面上(与首页 hero 同一语言) */
.header-card { .header-card {
background: #FFFFFF;
padding: 150rpx 32rpx 48rpx;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
padding: 120rpx 0 40rpx;
} }
.avatar { .avatar {
width: 120rpx; width: 128rpx;
height: 120rpx; height: 128rpx;
border-radius: 32rpx;
} }
.user-name { .user-name {
margin-top: 24rpx;
font-size: 36rpx; font-size: 36rpx;
font-weight: 600; font-weight: 700;
color: #1A1A1A; color: var(--ink);
}
/* 菜单组:首页「白卡」语言——白面 + 2rpx 发丝边 + 紧阴影 */
.menu-section + .menu-section {
margin-top: 24rpx; margin-top: 24rpx;
} }
.user-phone {
font-size: 26rpx;
color: #999999;
margin-top: 12rpx;
}
.login-section {
padding: 32rpx;
display: flex;
flex-direction: column;
gap: 20rpx;
}
.login-btn {
background: linear-gradient(135deg, #D4A853 0%, #FF8500 100%);
color: #FFFFFF;
font-size: 30rpx;
font-weight: 600;
padding: 28rpx;
border-radius: 20rpx;
border: none;
line-height: 1.5;
}
.login-btn::after {
border: none;
}
.avatar-btn {
background: #FFFFFF;
color: #D4A853;
font-size: 28rpx;
font-weight: 500;
padding: 24rpx;
border-radius: 20rpx;
border: 1rpx solid #D4A853;
line-height: 1.5;
}
.avatar-btn::after {
border: none;
}
.nickname-input-wrap {
background: #FFFFFF;
border-radius: 20rpx;
padding: 24rpx 32rpx;
}
.nickname-input {
font-size: 28rpx;
color: #1F2937;
}
.menu-section {
padding: 24rpx 22rpx 0rpx 22rpx;
}
.menu-group-header {
font-size: 26rpx;
color: #999999;
padding: 16rpx 0;
margin-bottom: 16rpx;
}
.menu-list { .menu-list {
background: #FFFFFF; background: var(--white);
border-radius: 16rpx; border: 2rpx solid var(--line);
border-radius: 28rpx;
box-shadow: var(--shadow-card);
overflow: hidden; overflow: hidden;
box-shadow: 0 2rpx 16rpx rgba(0, 0, 0, 0.04);
} }
.menu-item { .menu-item {
display: flex; display: flex;
align-items: center; align-items: center;
padding: 32rpx; padding: 32rpx;
border-bottom: 1rpx solid #F5F5F5; border-bottom: 2rpx solid var(--line);
} }
.menu-item:last-child { .menu-item:last-child {
@@ -116,62 +60,99 @@ page {
} }
.menu-item-hover { .menu-item-hover {
background: #FAFAFA; background: var(--brand-soft);
} }
/* t-icon 未传 color 属性,这里用 CSS 变量着色即可 */
.menu-icon { .menu-icon {
color: #D4A853;
margin-right: 24rpx; margin-right: 24rpx;
color: var(--brand-ink);
} }
.menu-text { .menu-text {
flex: 1; flex: 1;
font-size: 30rpx; font-size: 30rpx;
color: #1A1A1A;
font-weight: 500; font-weight: 500;
color: var(--ink);
} }
.menu-arrow { .menu-arrow {
color: #CCCCCC; flex-shrink: 0;
color: var(--muted);
} }
/* 登录按钮:与首页主 CTA 同语言(实心暖橙胶囊 + 白字 + CTA 阴影) */
.login-section {
padding: 32rpx 0;
}
.login-btn {
width: 100%;
padding: 28rpx;
border: none;
border-radius: 999rpx;
background: var(--brand-strong);
box-shadow: var(--shadow-cta);
color: var(--white);
font-size: 30rpx;
font-weight: 700;
letter-spacing: 2rpx;
line-height: 1.4;
}
.login-btn::after {
border: none;
}
/* 页脚:B 端合作文字链 + 版本信息,低调可读 */
.footer-section { .footer-section {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
padding: 60rpx 32rpx;
margin-top: auto; margin-top: auto;
padding-top: 60rpx;
} }
/* B 端合作链接:从首页移入,样式沿用首页页脚的低调文字链 */
.footer-links { .footer-links {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 20rpx; margin-bottom: 20rpx;
} }
/* 文字只有 24rpx 高,用 padding 撑热区、等量负外边距抵消,不影响行距 */
.footer-link { .footer-link {
padding: 16rpx 0;
margin: -16rpx 0;
font-size: 24rpx; font-size: 24rpx;
color: #999999; color: var(--muted);
letter-spacing: 1rpx;
} }
.footer-link:active { .footer-link:active {
color: #22A45D; color: var(--brand-strong);
} }
/* 细竖线分隔:替代原中点字符,避免一行多点 */
.footer-sep { .footer-sep {
font-size: 24rpx; width: 2rpx;
color: #D4D4D8; height: 20rpx;
margin: 0 16rpx; margin: 0 24rpx;
background: var(--faint);
flex-shrink: 0;
}
/* 版本 + 版权同处一行,复用 .footer-sep 做竖线分隔 */
.footer-meta {
display: flex;
align-items: center;
} }
.version { .version {
font-size: 24rpx; font-size: 24rpx;
color: #B0B0B0; color: var(--muted);
margin-bottom: 12rpx;
} }
.copyright { .copyright {
font-size: 22rpx; font-size: 24rpx;
color: #B0B0B0; color: var(--muted);
} }