/* 🎨 现代化聊天页面样式 - 深色主题 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; }