Files
wxapp_escort/pages/ai/aichat.wxss
T

420 lines
12 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 配色令牌来自 app.wxss(全站唯一来源),本页不留副本。
整体沿用首页的「暖白纸面 + 白卡 + 浅橙衬底」语言:
AI 气泡走白卡(白面 + 2rpx 发丝边),用户气泡走浅橙衬底,避免实心橙泛滥。 */
.chat-container {
display: flex;
flex-direction: column;
height: 100vh;
box-sizing: border-box;
/* 页面自身不滚,滚动只交给中间的消息区;
overflow: hidden 是兜底,避免任何子项溢出到视口外变成"看得见滑不到" */
overflow: hidden;
/* 给 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 把整行右对齐 */
.tool-bar {
align-self: flex-end;
display: flex;
align-items: center;
gap: 16rpx;
flex-shrink: 0;
/* 上 12 贴住输入区,右 32 对齐页面页边距;下不留边距,底部空气统一交给容器 */
margin: 12rpx 32rpx 0;
}
.tool-btn {
display: flex;
align-items: center;
gap: 8rpx;
padding: 10rpx 26rpx;
border-radius: 20rpx;
border: 2rpx solid var(--brand-strong);
transition: transform 0.15s ease;
}
.tool-btn:active {
transform: scale(0.96);
}
.tool-btn-text {
font-size: 24rpx;
font-weight: 500;
color: var(--brand-ink);
letter-spacing: 1rpx;
}
/* ===== 消息列表 ===== */
.message-list {
flex: 1;
/* 关键:flex 子项的自动最小高度是「内容高度」,消息多于一屏后它就不肯收缩,
会把 100vh 的容器撑破、把下方输入区顶出视口(且因容器锁死高度而滑不回来)。
置 0 后它才能正确收缩到剩余空间,并触发 scroll-view 自身滚动 */
min-height: 0;
padding: 20rpx 0;
}
/* ===== 欢迎区 ===== */
.welcome-area {
display: flex;
flex-direction: column;
align-items: center;
/* 上方留白收小:消息区本身已有 20rpx 内距,这里 80rpx 会显得图标吊得太低 */
padding: 40rpx 40rpx 80rpx;
text-align: center;
}
/* 空态图标:浅橙衬底 + 暖陶土图标,替代原橙/绿渐变与彩色辉光 */
.welcome-icon {
width: 140rpx;
height: 140rpx;
margin-bottom: 32rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 40rpx;
background: var(--brand-soft);
border: 2rpx solid var(--brand-line);
}
/* 空态图标改为 ai-ink.png(暖墨线稿的 AI 气泡):与头像区的 home-ink.png 同源,
落在浅橙衬底上仍清晰(暖陶土线稿约 6.8:1)。
88rpx 略大于原 t-icon 的 72rpx,因为该图是满画布的气泡轮廓,缩小会显弱 */
.welcome-icon-img {
width: 88rpx;
height: 88rpx;
}
.welcome-title {
margin-bottom: 12rpx;
font-size: 40rpx;
font-weight: 700;
color: var(--ink);
}
.welcome-desc {
margin-bottom: 56rpx;
font-size: 28rpx;
line-height: 1.6;
color: var(--muted);
}
/* 常见问题清单:整块收成一张白卡,行与行之间只用横线分隔、不留间隙。
空会话的欢迎区与会话流里由「常见问题」按钮唤起的清单共用同一套语言——
都是一份"可点的清单",不该一处是散卡、一处才收成块 */
.question-list {
width: 100%;
display: flex;
flex-direction: column;
background: var(--white);
border: 2rpx solid var(--line);
border-radius: 20rpx;
box-shadow: var(--shadow-card);
/* 裁掉行的直角与点按底色,保住卡片自身的圆角 */
overflow: hidden;
}
/* 清单行:文字 + 右侧 chevron 做点击暗示 */
.quick-item {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16rpx;
padding: 26rpx 28rpx;
font-size: 28rpx;
color: var(--ink-2);
text-align: left;
transition: background 0.15s ease;
}
/* 行分隔线用 --sep(比 --line 深一档,白面上才看得见) */
.quick-item + .quick-item {
border-top: 2rpx solid var(--sep);
}
/* 行嵌在整块里,不能像独立卡那样整体缩放(会撕裂分隔线),
点按反馈改由底色承担 */
.quick-item:active {
background: var(--brand-soft);
}
/* ===== 消息项 ===== */
/* 头像在上、气泡在下;用户消息整条靠右 */
.message-item {
display: flex;
flex-direction: column;
padding: 16rpx 24rpx;
}
.message-item.user {
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 {
width: 64rpx;
height: 64rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 20rpx;
background: var(--brand-soft);
border: 2rpx solid var(--brand-line);
flex-shrink: 0;
}
/* AI 的品牌标记用暖墨版 home-ink.png:白色版 home-w.png 只能压在实心色块上,
落在浅橙底会看不见。
36rpx 与用户侧的 t-icon 同尺寸(两个图形的笔画都约占画布 95%),视觉齐平 */
.avatar-img {
width: 36rpx;
height: 36rpx;
}
/* 头像行里的时间:放头像右侧 */
.message-time {
font-size: 22rpx;
color: var(--muted);
}
/* 头像已移到气泡上方,气泡不再被头像占位挤压,版心随之放宽:
84% → 92%(约 646rpx),仍留一档余量不顶到屏幕边缘 */
.message-content {
display: flex;
flex-direction: column;
min-width: 0;
max-width: 92%;
}
.message-item.user .message-content {
align-items: flex-end;
}
/* ===== 气泡 ===== */
.message-bubble {
padding: 20rpx 24rpx;
border-radius: 20rpx;
word-wrap: break-word;
word-break: break-all;
}
/* AI:白卡(白面 + 发丝边),安静、不与用户消息争色 */
.message-item.ai .message-bubble {
background: var(--white);
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 {
background: var(--brand-soft);
border: 2rpx solid var(--brand-line);
border-top-right-radius: 6rpx;
}
/* 气泡正文 28 → 30rpx(15px):长回答连续阅读时 14px 偏吃力,上调一号。
markdown 与纯文本两条路径同步,避免同一气泡里两种字号 */
.message-text {
font-size: 30rpx;
line-height: 1.6;
}
.message-item.ai .message-text {
color: var(--ink-2);
}
.message-item.user .message-text {
color: var(--brand-ink);
}
/* Markdown 渲染区:字号与 .message-text 对齐(30rpx) */
.message-markdown {
width: 100%;
font-size: 30rpx;
line-height: 1.6;
color: var(--ink-2);
}
/* 表格在聊天气泡中的样式覆盖 */
.message-markdown .t-chat-markdown-table {
width: 100%;
max-width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
border: 2rpx solid var(--line);
border-radius: 8rpx;
}
.message-markdown .t-chat-markdown-table__container {
display: table;
min-width: 100%;
max-width: max-content;
border-collapse: collapse;
white-space: normal;
table-layout: fixed;
word-break: break-word;
}
.message-markdown .t-chat-markdown-table__th,
.message-markdown .t-chat-markdown-table__td {
padding: 8rpx 12rpx;
font-size: 24rpx;
line-height: 1.4;
white-space: normal;
word-break: break-word;
word-wrap: break-word;
overflow-wrap: break-word;
max-width: 240rpx;
}
.message-markdown .t-chat-markdown-table__th {
background-color: var(--brand-soft);
font-weight: 600;
color: var(--ink);
}
.message-markdown .t-chat-markdown-table__tr:nth-child(2n) {
background-color: var(--paper);
}
/* 代码块 */
.message-markdown .t-chat-markdown-codespan,
.message-markdown .t-chat-markdown-code {
font-size: 24rpx;
word-break: break-all;
}
.message-image {
max-width: 400rpx;
border-radius: 12rpx;
}
/* ===== 正在输入 ===== */
.typing-bubble {
padding: 24rpx 32rpx;
}
.typing-indicator {
display: flex;
align-items: center;
gap: 12rpx;
}
.dot {
width: 14rpx;
height: 14rpx;
border-radius: 50%;
background-color: var(--brand-ink);
animation: typing 1.4s infinite ease-in-out both;
}
.dot:nth-child(1) {
animation-delay: -0.32s;
}
.dot:nth-child(2) {
animation-delay: -0.16s;
}
@keyframes typing {
0%, 80%, 100% {
transform: scale(0.6);
opacity: 0.5;
}
40% {
transform: scale(1);
opacity: 1;
}
}
/* ===== 输入区 ===== */
.input-area {
display: flex;
align-items: center;
gap: 16rpx;
/* 钉在容器底部,不被消息区挤压 */
flex-shrink: 0;
padding: 16rpx 24rpx;
background: var(--white);
border-top: 2rpx solid var(--line);
}
.message-input {
flex: 1;
height: 76rpx;
padding: 0 28rpx;
background: var(--paper);
border: 2rpx solid var(--line);
/* 20rpx = 10px:与气泡、常见问题卡、用户徽记的统一圆角档,
比原 999rpx 胶囊更贴合"输入条"的体量(76rpx 高≈38px,10px 圆角约占四分之一) */
border-radius: 20rpx;
font-size: 28rpx;
color: var(--ink);
}
.input-placeholder {
color: var(--muted);
}
/* 发送按钮:默认浅橙底 + 描边,有内容时转实心暖橙(全页唯一的实心橙块)。
默认态落在白面输入区上,浅橙底同样靠 --brand-line 描边托形。
圆角由正圆(50%)改为 20rpx,与左侧输入框、上方气泡同档,成对出现 */
.action-btn {
width: 76rpx;
height: 76rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 20rpx;
background: var(--brand-soft);
border: 2rpx solid var(--brand-line);
flex-shrink: 0;
transition: all 0.15s ease;
}
.send-btn.active {
background: var(--brand-strong);
border-color: var(--brand-strong);
}
/* ===== AI 声明注释 ===== */
/* 原为页面底部一行常驻声明,改为挂在每条 AI 回复的气泡正下方:
既省下底部固定高度,又让声明紧贴它要限定的内容。
无背景无边框,靠 muted 小字安静收尾;
24rpx 是中文最小可用字号下限(12px),不能再小 */
.message-note {
margin-top: 8rpx;
font-size: 24rpx;
line-height: 1.5;
color: var(--muted);
}