miniprogramme/pages/message/chat/chat.wxss
2025-09-12 16:08:17 +08:00

1020 lines
26 KiB
Text
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.

/* 🎨 现代化聊天页面样式 - 深色主题 2025 */
/* 🎨 CSS变量定义 - 黑色主题(本文件局部覆盖) */
page {
--primary-color: #0A84FF; /* accent */
--primary-light: #3EA8FF;
--primary-dark: #0056CC;
--background-color: #070709; /* 页面背景主色(几乎黑) */
--surface-color: #0F0F11; /* 气泡/卡片背景 */
--text-primary: #ECECEC; /* 主要文字-浅色 */
--text-secondary: #A8A8A8; /* 次要文字 */
--text-tertiary: #7A7A7A;
--border-color: rgba(255,255,255,0.06);
--shadow-light: 0 1rpx 6rpx rgba(0, 0, 0, 0.6);
--shadow-medium: 0 6rpx 18rpx rgba(0, 0, 0, 0.7);
--radius-small: 8rpx;
--radius-medium: 12rpx;
--radius-large: 20rpx;
}
/* ===== 浅色主题覆盖(当根元素包含 .theme-light 时生效) ===== */
.theme-light {
--primary-color: #007AFF;
--primary-light: #5AC8FA;
--primary-dark: #0051D5;
--background-color: #F2F2F7;
--surface-color: #FFFFFF;
--text-primary: #000000;
--text-secondary: #8E8E93;
--text-tertiary: #C7C7CC;
--border-color: #E5E5EA;
--shadow-light: 0 1rpx 3rpx rgba(0,0,0,0.1);
--shadow-medium: 0 4rpx 12rpx rgba(0,0,0,0.15);
}
/* 关键覆盖,修正本文件中使用硬编码深色的选择器 */
.theme-light .message-wrapper.other .message-content {
background: var(--surface-color);
color: var(--text-primary);
border: 1rpx solid var(--border-color);
box-shadow: var(--shadow-medium);
}
.theme-light .message-wrapper.self .message-content {
background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-light) 100%);
color: #FFFFFF;
box-shadow: 0 4rpx 16rpx rgba(0, 122, 255, 0.3);
}
.theme-light .avatar-placeholder {
background: #C8C8CD;
color: #FFFFFF;
}
.theme-light .message-wrapper.self .avatar-placeholder {
background: #576B95;
color: #FFFFFF;
font-size: 36rpx;
}
.theme-light .input-area {
background: linear-gradient(180deg, rgba(255,255,255,0.95) 0%, rgba(248,248,248,0.95) 100%);
border-top: 1rpx solid var(--border-color);
box-shadow: 0 -4rpx 20rpx rgba(0,0,0,0.1);
}
.theme-light .text-input {
background: rgba(0,0,0,0.02);
border: 1rpx solid var(--border-color);
color: var(--text-primary);
width: 100%;
word-wrap: break-word;
word-break: break-word;
white-space: pre-wrap;
overflow-y: auto;
overflow-x: hidden;
box-sizing: border-box;
vertical-align: top;
}
.theme-light .text-input:focus {
border-color: var(--primary-color);
box-shadow: 0 0 0 6rpx rgba(10,132,255,0.06);
}
.theme-light .tool-btn {
border: 1rpx solid var(--border-color);
background: rgba(0,0,0,0.02);
}
.theme-light .tool-btn:active {
background: rgba(0,0,0,0.05);
}
.theme-light .emoji-panel,
.theme-light .more-panel {
background: linear-gradient(180deg, rgba(255,255,255,0.95) 0%, rgba(248,248,248,0.95) 100%);
border-top: 1rpx solid var(--border-color);
box-shadow: 0 -4rpx 20rpx rgba(0,0,0,0.1);
color: var(--text-primary);
}
.theme-light .emoji-item {
background: rgba(0,0,0,0.03);
}
.theme-light .emoji-item:active {
background: rgba(0,0,0,0.08);
}
.theme-light .loading-container {
background: rgba(255,255,255,0.95);
color: #333;
box-shadow: 0 8rpx 32rpx rgba(0,0,0,0.15);
}
.theme-light .time-text {
background: var(--surface-color);
color: var(--text-secondary);
box-shadow: var(--shadow-light);
}
/* 主题覆盖:当 chat container 同时有 .theme-light 时,强制浅色背景覆盖 */
.chat-container.theme-light {
background: linear-gradient(180deg, var(--background-color) 0%, #F8F8F8 100%);
color: var(--text-primary);
}
/* 反向:确保 theme-dark 明确覆盖(保守写法) */
.chat-container.theme-dark {
background: linear-gradient(180deg, var(--background-color) 0%, #0B0B0D 100%);
color: var(--text-primary);
}
/* === 主题切换过渡(类 Telegram=== */
.chat-container {
transition: background-color 280ms ease, color 280ms ease, background 280ms ease;
}
.chat-container.theme-transitioning {
/* 轻微的亮度过渡,模拟 Telegram 的柔和切换 */
transition: background 320ms ease, color 320ms ease, filter 320ms ease;
}
/* 消息气泡、输入区等关键区域同步过渡,避免突变 */
.message-content,
.input-area,
.emoji-panel,
.more-panel,
.time-text,
.tool-btn,
.message-wrapper.self .message-content,
.message-wrapper.other .message-content {
transition: background-color 280ms ease, color 280ms ease, border-color 280ms ease, box-shadow 280ms ease;
}
/* 现代化导航栏 */
.custom-navbar {
background: linear-gradient(135deg, var(--primary-dark) 0%, var(--primary-color) 100%);
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1000;
box-shadow: var(--shadow-medium);
backdrop-filter: blur(12rpx);
}
.navbar-content {
display: flex;
align-items: center;
justify-content: space-between;
height: 44px;
padding: 0 32rpx;
position: relative;
}
.navbar-left, .navbar-right {
display: flex;
align-items: center;
gap: 16rpx;
}
.navbar-left {
width: 80rpx;
height: 80rpx;
justify-content: center;
border-radius: var(--radius-medium);
transition: all 0.3s ease;
}
.navbar-right {
justify-content: flex-end;
}
.navbar-left:active, .navbar-right:active {
background: rgba(255, 255, 255, 0.02);
transform: scale(0.95);
}
.navbar-center {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin: 0 20rpx;
}
.navbar-title {
font-size: 36rpx;
font-weight: 600;
color: white;
max-width: 400rpx;
overflow: hidden;
text-overflow: ellipsis;
text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.4);
white-space: nowrap;
}
.navbar-subtitle {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.85);
margin-top: 4rpx;
}
.icon-back {
font-size: 44rpx;
color: white;
font-weight: bold;
}
.icon-search, .icon-more {
width: 64rpx;
height: 64rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: var(--radius-medium);
transition: all 0.3s ease;
font-size: 32rpx;
color: white;
font-weight: bold;
}
.icon-search:active, .icon-more:active {
background: rgba(255, 255, 255, 0.02);
transform: scale(0.95);
}
/* 🎨 现代化消息列表 */
.message-list {
flex: 1;
padding: 20rpx 0;
margin-bottom: 200rpx;
background: transparent;
position: relative;
}
.message-item {
margin-bottom: 32rpx;
padding: 0 32rpx;
animation: messageSlideIn 0.3s ease-out;
}
@keyframes messageSlideIn {
from {
opacity: 0;
transform: translateY(20rpx);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* 现代化时间分隔线 */
.time-divider {
display: flex;
justify-content: center;
margin: 40rpx 0 32rpx 0;
}
.time-text {
background: rgba(255,255,255,0.03);
color: var(--text-secondary);
font-size: 24rpx;
font-weight: 600;
padding: 12rpx 24rpx;
border-radius: 999rpx;
letter-spacing: 0.5rpx;
box-shadow: none;
backdrop-filter: blur(6rpx);
}
/* 消息容器 - 布局 */
.message-wrapper {
display: flex;
margin-bottom: 20rpx;
position: relative;
width: 100%;
}
/* 对方消息:头像在左 */
.message-wrapper.other {
flex-direction: row !important;
justify-content: flex-start;
}
/* 我的消息:头像在右 */
.message-wrapper.self {
flex-direction: row;
justify-content: flex-end;
}
/* 头像样式 */
.avatar {
width: 88rpx;
height: 88rpx;
border-radius: 50%;
overflow: hidden;
flex-shrink: 0;
}
.message-wrapper.other .avatar {
margin: 0 20rpx 0 0;
}
.message-wrapper.self .avatar {
margin: 0 0 0 20rpx;
}
.avatar-image {
width: 100%;
height: 100%;
border-radius: 50%;
}
.avatar-image image {
width: 100%;
height: 100%;
border-radius: 50%;
}
.avatar-placeholder {
width: 100%;
height: 100%;
background: linear-gradient(135deg,#1B1B1D 0%, #101012 100%);
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
font-weight: 600;
color: var(--text-primary);
border-radius: 50%;
}
.message-wrapper.self .avatar-placeholder {
background: linear-gradient(135deg,#0A274E 0%, #05203A 100%);
color: #FFFFFF;
font-weight: 700;
font-size: 36rpx;
}
/* 消息主体 */
.message-body {
flex: 1;
max-width: 480rpx;
display: flex;
flex-direction: column;
}
.message-wrapper.other .message-body {
align-items: flex-start;
}
.message-wrapper.self .message-body {
align-items: flex-end;
}
/* 发送者名称(群聊) */
.sender-name {
font-size: 24rpx;
color: var(--text-secondary);
margin-bottom: 8rpx;
padding: 0 16rpx;
}
/* 消息气泡 */
.message-content {
border-radius: var(--radius-large);
padding: 20rpx 28rpx 36rpx 28rpx; /* 为气泡内时间预留底部空间 */
position: relative;
word-wrap: break-word;
word-break: break-all;
max-width: 520rpx;
line-height: 1.6;
font-size: 32rpx;
box-shadow: none;
backdrop-filter: blur(6rpx);
transition: all 0.15s ease;
}
/* 对方消息气泡(深色) */
.message-wrapper.other .message-content {
background: #141416;
color: var(--text-primary);
border: 1rpx solid rgba(255,255,255,0.03);
border-top-left-radius: var(--radius-small);
}
.message-wrapper.other .message-content:hover {
box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.45);
}
/* 我的消息气泡(偏蓝) */
.message-wrapper.self .message-content {
background: linear-gradient(135deg, var(--primary-dark) 0%, var(--primary-color) 100%);
color: #FFFFFF;
border-top-right-radius: var(--radius-small);
box-shadow: 0 6rpx 20rpx rgba(10,132,255,0.18);
}
.message-wrapper.self .message-content:hover {
box-shadow: 0 8rpx 28rpx rgba(10,132,255,0.14);
}
/* 为气泡内时间/状态预留右侧空间,避免短消息换行抖动 */
.message-wrapper.self .message-content { padding-right: 120rpx; }
.message-wrapper.other .message-content { padding-right: 88rpx; }
/* 气泡内时间与状态(右下角) */
.bubble-meta {
position: absolute;
right: 20rpx;
bottom: 12rpx;
display: flex;
align-items: center;
gap: 10rpx;
opacity: 0.75;
}
.bubble-meta { white-space: nowrap; }
.bubble-time {
font-size: 22rpx;
color: rgba(255,255,255,0.75);
}
.message-wrapper.other .bubble-time { color: var(--text-secondary); }
.meta-status { font-size: 22rpx; line-height: 1; }
.meta-read { color: #B2E5FF; }
.meta-delivered { color: rgba(255,255,255,0.9); }
.meta-sending { color: var(--text-tertiary); animation: pulse 1.5s ease-in-out infinite; }
.meta-failed { color: #ff6b6b; font-weight: 700; }
/* 强制把自己消息的头像固定在右侧 */
.message-wrapper.self {
position: relative;
}
.message-wrapper.self .avatar {
position: absolute;
right: 16rpx;
top: 8rpx;
width: 88rpx;
height: 88rpx;
}
.message-wrapper.self .message-body {
margin-right: 120rpx;
}
/* 失败重发行:显示在自己消息气泡下方靠右 */
.resend-row {
display: flex;
width: 100%;
justify-content: flex-end;
margin-top: 8rpx;
padding-right: 120rpx; /* 与头像空隙对齐 */
}
.resend-action {
display: inline-flex;
align-items: center;
gap: 10rpx;
padding: 8rpx 14rpx;
border-radius: 999rpx;
color: #ff6b6b;
background: rgba(255,107,107,0.1);
border: 1rpx solid rgba(255,107,107,0.2);
}
.resend-action:active { transform: scale(0.98); background: rgba(255,107,107,0.14); }
.resend-icon { font-size: 22rpx; font-weight: 700; }
.resend-text { font-size: 24rpx; color: #ff7b7b; }
.theme-light .resend-action { color: #c62828; background: rgba(198,40,40,0.08); border-color: rgba(198,40,40,0.2); }
.theme-light .resend-text { color: #d32f2f; }
/* 文本、图片等样式保持,但颜色适配深色 */
.text-content {
font-size: 32rpx;
line-height: 1.6;
font-weight: 400;
letter-spacing: 0.5rpx;
color: inherit;
}
/* 撤回消息样式 */
.recalled-content {
display: flex;
align-items: center;
justify-content: center;
gap: 12rpx;
font-size: 28rpx;
color: var(--text-tertiary);
text-align: center;
padding: 20rpx 30rpx;
background: transparent;
border: 1rpx dashed var(--border-color);
border-radius: var(--radius-medium);
opacity: 0.7;
}
/* 上传进度条样式 */
.upload-progress {
margin-top: 8rpx;
display: flex;
align-items: center;
gap: 12rpx;
}
.upload-progress-bar {
width: 240rpx;
height: 8rpx;
background: rgba(255,255,255,0.1);
border-radius: 8rpx;
overflow: hidden;
}
.theme-light .upload-progress-bar {
background: rgba(0,0,0,0.08);
}
.upload-progress-fill {
height: 100%;
background: var(--primary-color);
}
.upload-progress-text {
font-size: 22rpx;
color: var(--text-primary);
}
.recalled-icon {
font-size: 24rpx;
opacity: 0.8;
}
.recalled-text {
font-style: italic;
}
.message-content.recalled {
background: transparent !important;
box-shadow: none !important;
border: none !important;
min-width: 240rpx;
}
.theme-light .recalled-content {
color: var(--text-secondary);
border-color: var(--border-color);
}
.image-content {
max-width: 420rpx; /* 缩小图片显示宽度 */
max-height: 360rpx; /* 限制图片高度,避免占满屏 */
border-radius: var(--radius-medium);
background: linear-gradient(45deg, #151515, #222);
box-shadow: var(--shadow-light);
transition: all 0.3s ease;
}
.image-content:active {
transform: scale(0.98);
}
.error-content {
padding: 20rpx;
background: rgba(255, 60, 60, 0.08);
border: 1px solid rgba(255,60,60,0.12);
border-radius: 12rpx;
max-width: 400rpx;
}
.error-text { color: #ff6b6b; }
.error-detail { color: #ffb86b; }
.error-original { color: var(--text-secondary); }
/* 文件消息 */
.file-content {
display: flex;
align-items: center;
min-width: 240rpx;
padding: 20rpx;
background: rgba(255,255,255,0.02);
border-radius: var(--radius-medium);
backdrop-filter: blur(6rpx);
border: 1rpx solid rgba(255,255,255,0.03);
transition: all 0.2s ease;
}
.file-content:active {
transform: scale(0.98);
background: rgba(255,255,255,0.03);
}
/* 卡片、贴纸等 */
.card-content { background: rgba(255,255,255,0.02); }
.card-name, .file-name { color: var(--text-primary); }
.card-phone, .file-size { color: var(--text-secondary); }
.system-content { background: rgba(255,255,255,0.02); color: var(--text-secondary); }
.video-content { max-width: 420rpx; max-height: 360rpx; border-radius: 12rpx; }
/* 音频、视频、位置等适配 */
.audio-content, .location-content { background: rgba(255,255,255,0.02); border: 1rpx solid rgba(255,255,255,0.03); }
.audio-icon, .file-icon { color: var(--text-secondary); }
@keyframes pulse { 0%,100%{transform:scale(1)}50%{transform:scale(1.05)} }
/* Telegram风格的消息状态指示器 */
.message-status {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 6rpx;
margin-right: 8rpx;
font-size: 24rpx;
line-height: 1;
}
/* 发送中状态 */
.status-sending {
color: var(--text-tertiary);
animation: pulse 1.5s ease-in-out infinite;
}
/* 发送失败状态 */
.status-failed {
color: #ff6b6b;
background: rgba(255,107,107,0.1);
border-radius: 50%;
width: 32rpx;
height: 32rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 20rpx;
font-weight: bold;
}
/* 已送达状态(单勾) */
.status-delivered {
color: var(--text-secondary);
font-size: 28rpx;
font-weight: 600;
}
/* 已读状态(双勾) */
.status-read {
color: var(--primary-color);
font-size: 28rpx;
font-weight: 600;
}
/* 等待状态 */
.status-pending {
color: var(--text-tertiary);
font-size: 20rpx;
}
/* 浅色主题下的状态样式 */
.theme-light .status-delivered {
color: var(--text-secondary);
}
.theme-light .status-read {
color: var(--primary-color);
}
.theme-light .status-sending,
.theme-light .status-pending {
color: var(--text-tertiary);
}
.loading-dots .dot { background: var(--text-secondary); }
.load-more-top {
text-align: center;
padding: 18rpx 28rpx;
background: rgba(255,255,255,0.02);
margin-bottom: 18rpx;
border-radius: 12rpx;
margin: 0 16rpx 18rpx 16rpx;
}
.load-more-text { color: var(--text-secondary); font-size: 26rpx; }
/* 输入区域 */
.input-area {
background: linear-gradient(180deg, rgba(12,12,14,0.98) 0%, rgba(10,10,12,0.98) 100%);
border-top: 1rpx solid rgba(255,255,255,0.03);
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 1000;
backdrop-filter: blur(10rpx);
box-shadow: 0 -8rpx 30rpx rgba(0, 0, 0, 0.7);
max-height: 30vh; /* 限制最大高度为屏幕的30% */
overflow: hidden;
}
.input-row {
display: flex;
align-items: flex-end;
padding: 20rpx 24rpx;
min-height: 100rpx;
max-height: 200rpx;
width: 100%;
box-sizing: border-box;
}
.tool-btn {
width: 80rpx;
height: 80rpx;
min-height: 80rpx;
display: flex;
align-items: center;
justify-content: center;
background: transparent;
border-radius: var(--radius-medium);
margin-right: 16rpx;
flex-shrink: 0;
transition: all 0.2s ease;
border: 1rpx solid rgba(255,255,255,0.03);
}
.tool-btn:active { transform: scale(0.95); background: rgba(255,255,255,0.02); }
.text-input-wrapper {
flex: 1;
margin-right: 16rpx;
min-width: 0; /* 确保能够收缩 */
max-width: calc(100% - 160rpx); /* 为左右按钮预留空间 */
overflow: hidden;
display: flex;
align-items: flex-end;
}
.text-input {
background: rgba(255,255,255,0.02);
border: 1rpx solid rgba(255,255,255,0.03);
border-radius: var(--radius-large);
padding: 18rpx 24rpx;
font-size: 32rpx;
min-height: 44rpx;
max-height: 120rpx;
width: 100%;
color: var(--text-primary);
transition: all 0.18s ease;
resize: none;
line-height: 1.4;
word-wrap: break-word;
word-break: break-word;
white-space: pre-wrap;
overflow-y: auto;
overflow-x: hidden;
box-sizing: border-box;
vertical-align: top;
}
.text-input:focus { border-color: var(--primary-color); box-shadow: 0 0 0 6rpx rgba(10,132,255,0.06); }
/* 语音输入容器与文本输入保持同样的伸展规则 */
.voice-input-wrapper {
flex: 1;
margin-right: 16rpx;
min-width: 0; /* 允许收缩,避免被按钮挤出 */
max-width: calc(100% - 160rpx); /* 为左右按钮预留空间,和 text-input-wrapper 保持一致 */
overflow: hidden;
display: flex;
align-items: flex-end;
}
.voice-btn {
background: rgba(255,255,255,0.02);
color: var(--text-primary);
flex-shrink: 0;
min-height: 76rpx;
border-radius: var(--radius-medium);
border: none;
font-size: 28rpx;
align-self: flex-end;
width: 100%; /* 占满容器宽度 */
box-sizing: border-box;
padding: 18rpx 24rpx; /* 与文本输入视觉统一 */
}
.voice-btn.recording { background: linear-gradient(135deg, #FF6B6B 0%, #FF8E8E 100%); color: white; }
.send-btn {
background: linear-gradient(135deg, var(--primary-dark) 0%, var(--primary-color) 100%);
color: white;
padding: 18rpx 30rpx;
border-radius: var(--radius-medium);
border: none;
font-size: 28rpx;
align-self: flex-end;
margin-bottom: 2rpx;
flex-shrink: 0;
min-height: 76rpx;
}
/* 表情面板 */
.emoji-panel {
background: linear-gradient(180deg, rgba(16,16,18,0.98) 0%, rgba(12,12,14,0.98) 100%);
border-top: 1rpx solid rgba(255,255,255,0.03);
padding: 24rpx 20rpx;
max-height: 400rpx;
backdrop-filter: blur(12rpx);
box-shadow: 0 -4rpx 20rpx rgba(0, 0, 0, 0.6);
}
.emoji-scroll {
height: 100%;
max-height: 352rpx; /* 400rpx - 48rpx padding */
}
.emoji-list {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
gap: 16rpx;
padding: 8rpx 0 calc(env(safe-area-inset-bottom) + 20rpx) 0; /* 为底部安全区留白,避免被遮挡 */
}
.emoji-item {
width: 88rpx;
height: 88rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 52rpx;
border-radius: var(--radius-medium);
background: rgba(255,255,255,0.02);
transition: all 0.2s ease;
}
.emoji-item:active {
background: rgba(255,255,255,0.08);
transform: scale(0.95);
}
/* 表情滚动底部占位,提供安全区滚动空间 */
.emoji-bottom-spacer { height: env(safe-area-inset-bottom); }
/* 更多面板 */
.more-panel-overlay {
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
display: flex;
align-items: flex-end; /* panel at bottom */
justify-content: center;
background: rgba(0,0,0,0.6);
z-index: 2300; /* above input-area (1000) and other floating widgets */
}
.more-panel {
background: var(--surface-color, #0B0B0D);
color: var(--text-primary);
border-radius: 24rpx 24rpx 0 0;
padding: 12rpx 0 24rpx 0;
width: 100%;
max-height: 60vh;
box-shadow: 0 -8rpx 32rpx rgba(0,0,0,0.6);
z-index: 2400; /* ensure panel sits above overlay and any page floats */
}
/* theme-light overrides for panel */
.theme-light .more-panel-overlay { background: rgba(0,0,0,0.35); }
.theme-light .more-panel { background: linear-gradient(180deg, var(--background-color) 0%, #F8F8F8 100%); color: var(--text-primary); box-shadow: 0 -8rpx 32rpx rgba(0,0,0,0.08); }
.more-panel-header { display:flex; justify-content:space-between; align-items:center; padding:24rpx 28rpx; border-bottom:1rpx solid rgba(255,255,255,0.03); }
.more-panel-title { font-size:36rpx; font-weight:600; color:var(--text-primary); }
.more-panel-header { position: relative; }
.more-panel-close { width:56rpx; height:56rpx; position:absolute; right:16rpx; top:12rpx; display:flex; align-items:center; justify-content:center; background: rgba(0,0,0,0.12); border-radius:28rpx; font-size:28rpx; color:var(--text-secondary); }
.more-panel-close:active { background: rgba(0,0,0,0.16); transform:scale(0.96); }
/* small drag handle */
.more-panel-handle {
width: 64rpx;
height: 8rpx;
background: rgba(255,255,255,0.06);
border-radius: 8rpx;
margin: 8rpx auto 12rpx auto;
}
/* more panel content layout */
.more-list {
display: flex;
flex-wrap: wrap;
gap: 20rpx 24rpx;
padding: 8rpx 20rpx 12rpx 20rpx;
justify-content: space-around; /* center items evenly */
align-items: center;
}
.more-item {
min-width: 84rpx;
width: 22%;
max-width: 120rpx;
height: 96rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: rgba(255,255,255,0.02);
border-radius: 16rpx;
box-shadow: var(--shadow-light);
color: var(--text-primary);
text-align: center;
padding: 6rpx;
}
.more-item:active { transform: scale(0.96); background: rgba(255,255,255,0.03); }
.more-icon { font-size: 44rpx; margin-bottom: 6rpx; }
.more-text { font-size: 22rpx; color: var(--text-secondary); line-height: 1.1; }
/* ensure panel respects safe-area at bottom */
.more-panel { padding-bottom: calc(env(safe-area-inset-bottom) + 16rpx); }
/* 录音提示 */
.recording-tips { position:fixed; top:50%; left:50%; transform:translate(-50%,-50%); background: rgba(0,0,0,0.85); color:var(--text-primary); padding:28rpx 36rpx; border-radius:12rpx; font-size:30rpx; z-index:2000; }
/* 加载 */
.loading-container { position:fixed; top:50%; left:50%; transform:translate(-50%,-50%); display:flex; flex-direction:column; align-items:center; justify-content:center; z-index:2000; background: rgba(0,0,0,0.75); border-radius:16rpx; padding:28rpx; box-shadow:0 12rpx 36rpx rgba(0,0,0,0.7); backdrop-filter: blur(12rpx); }
.loading-spinner { width:56rpx; height:56rpx; border:4rpx solid rgba(255,255,255,0.08); border-top:4rpx solid var(--primary-color); border-radius:50%; animation:spin 1s linear infinite; margin-bottom:12rpx; }
.loading-text { font-size:26rpx; color:var(--text-secondary); font-weight:500; }
@keyframes spin { 0%{transform:rotate(0deg)} 100%{transform:rotate(360deg)} }
/* 滚动到底部按钮 */
/* === 主题切换径向遮罩动画 === */
.theme-overlay {
position: fixed;
left: 0; top: 0; right: 0; bottom: 0;
pointer-events: none;
z-index: 3000;
}
.theme-overlay-circle {
position: absolute;
border-radius: 50%;
background: var(--background-color);
transform: scale(0.001);
opacity: 0;
}
.theme-overlay-circle.play {
animation: themeExpand 380ms ease forwards;
}
@keyframes themeExpand {
0% { transform: scale(0.001); opacity: 0; }
20% { opacity: 1; }
100% { transform: scale(1); opacity: 1; }
}
.scroll-to-bottom-btn { position:fixed; right:32rpx; bottom:240rpx; width:88rpx; height:88rpx; background: rgba(255,255,255,0.06); border-radius:50%; display:flex; align-items:center; justify-content:center; z-index:1000; opacity:0; transform:translateY(20rpx) scale(0.8); transition:all 0.3s cubic-bezier(0.4,0,0.2,1); backdrop-filter: blur(10rpx); box-shadow: 0 8rpx 24rpx rgba(0,0,0,0.6); }
.scroll-to-bottom-btn.show { opacity:1; transform:translateY(0) scale(1); }
.scroll-to-bottom-btn:active { transform: translateY(0) scale(0.95); background: rgba(255,255,255,0.08); }
.btn-icon { color: var(--text-primary); font-size:36rpx; font-weight:bold; text-shadow: 0 1rpx 2rpx rgba(0,0,0,0.6); }
/* 其他小节样式保持原逻辑,颜色使用变量或深色背景 */
/* ===== 兼容性修正:避免底部白色撕裂条 ===== */
/* 将容器改为 column flex使 scroll-view 能正确填满剩余高度(避免 calc(100vh - px) 的子像素或安全区差异) */
.chat-container {
display: flex;
flex-direction: column;
height: 100vh; /* fixed viewport height so absolute child heights compute */
position: relative; /* make absolute children position relative to this container */
box-sizing: border-box;
}
/* message-list 使用 flex 布局,自行保留底部内边距以避开固定的 input-area */
.message-list {
/* Use flex so scroll-view fills remaining space and supports touch scrolling */
position: relative;
flex: 1 1 auto;
height: 100%;
padding: 20rpx 0 240rpx 0; /* 保留底部空间给输入区 */
margin: 0;
background: transparent;
box-sizing: border-box;
}
/* 当表情面板展开时,给消息列表增加额外底部留白,避免被表情面板遮挡 */
.with-emoji .message-list {
/* 输入区保留 40rpx + 表情面板大约 400rpx + 安全区 */
padding-bottom: calc(40rpx + 400rpx + env(safe-area-inset-bottom));
}
/* 确保输入区域视觉上与页面背景融合,避免产生可见缝隙 */
.input-area {
background: linear-gradient(180deg, rgba(12,12,14,0.98) 0%, rgba(10,10,12,0.98) 100%);
border-top: 1rpx solid rgba(255,255,255,0.03);
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 1000;
backdrop-filter: blur(10rpx);
box-shadow: 0 -8rpx 30rpx rgba(0, 0, 0, 0.7);
background-clip: padding-box;
}