Files
wxapp_escort/pages/ai/aichat.wxss
T

395 lines
10 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 右对齐,不必再套一层行容器 */
.clear-btn {
align-self: flex-end;
display: flex;
align-items: center;
gap: 8rpx;
flex-shrink: 0;
/* 上 12 贴住输入区,右 32 对齐页面页边距;下不留边距,底部空气统一交给容器 */
margin: 12rpx 32rpx 0;
padding: 10rpx 26rpx;
border-radius: 20rpx;
border: 2rpx solid var(--brand-strong);
transition: transform 0.15s ease;
}
.clear-btn:active {
transform: scale(0.96);
}
.clear-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;
padding: 80rpx 40rpx;
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);
}
.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);
}
.quick-questions {
width: 100%;
display: flex;
flex-direction: column;
gap: 20rpx;
}
/* 常见问题:首页白卡语言 + 右侧 chevron 做点击暗示 */
.quick-item {
display: flex;
align-items: center;
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;
color: var(--ink-2);
text-align: left;
transition: transform 0.15s ease;
}
.quick-item:active {
transform: scale(0.98);
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);
}