/* app.wxss — 全局共享样式 */ /* ========== CSS 变量 ========== */ page { --color-price: #ff4444; --color-text-main: #333; --color-text-gray: #999; --color-border-light: #f0f0f0; --bg-white: #ffffff; --bg-gray-hover: #f5f5f5; --radius-lg: 30rpx; --radius-normal: 25rpx; --radius-full: 50%; --padding-base: 40rpx; --shadow-modal: 0 20rpx 60rpx rgba(0, 0, 0, 0.2); box-sizing: border-box; } /* ========== 动画 ========== */ @keyframes spin { to { transform: rotate(360deg); } } @keyframes pulse { 0%, 100% { opacity: 0.8; transform: scale(1); } 50% { opacity: 1; transform: scale(1.2); } } @keyframes modalShow { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } } @keyframes marquee { 0% { transform: translateX(100%); } 100% { transform: translateX(-100%); } } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } @keyframes slideUp { from { transform: translateY(100%); } to { transform: translateY(0); } } @keyframes slideDown { from { transform: translateY(0); } to { transform: translateY(100%); } } /* ========== 加载提示 ========== */ .loading-toast { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: rgba(0, 0, 0, 0.7); backdrop-filter: blur(10px); padding: 30rpx 50rpx; border-radius: var(--radius-normal); display: flex; flex-direction: column; align-items: center; z-index: 999; } .loading-spinner { width: 60rpx; height: 60rpx; border: 6rpx solid rgba(255, 255, 255, 0.3); border-top-color: #fff; border-radius: var(--radius-full); animation: spin 1s linear infinite; margin-bottom: 20rpx; } .loading-text { font-size: 26rpx; color: #fff; } /* ========== 价格组件 ========== */ .price-wrap { color: var(--color-price); font-weight: bold; } .price-icon { font-size: 24rpx; margin-right: 2rpx; } .price-integer { font-size: 32rpx; } .price-decimal { font-size: 24rpx; } /* ========== 弹窗基础 ========== */ .modal-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(5px); z-index: 1000; display: flex; align-items: center; justify-content: center; } .modal-content { width: 600rpx; background: var(--bg-white); border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-modal); z-index: 1001; animation: modalShow 0.3s ease-out; } .modal-header { padding: var(--padding-base); border-bottom: 2rpx solid var(--color-border-light); display: flex; justify-content: space-between; align-items: center; } .modal-title { font-size: 32rpx; font-weight: bold; color: var(--color-text-main); } .modal-close { font-size: 40rpx; color: var(--color-text-gray); width: 60rpx; height: 60rpx; display: flex; justify-content: center; align-items: center; border-radius: var(--radius-full); flex-shrink: 0; } .modal-close:active { background: var(--bg-gray-hover); } .modal-body { max-height: 600rpx; padding: var(--padding-base); overflow-y: auto; } .modal-text { font-size: 28rpx; color: var(--color-text-main); line-height: 1.6; white-space: normal; word-break: break-word; } /* ========== Flex 工具类 ========== */ .flex-center { display: flex; align-items: center; justify-content: center; } .flex-between { display: flex; align-items: center; justify-content: space-between; } .flex-column { display: flex; flex-direction: column; } .flex-column-center { display: flex; flex-direction: column; align-items: center; justify-content: center; } .flex-1 { flex: 1; min-width: 0; } .flex-shrink-0 { flex-shrink: 0; } .flex-wrap { flex-wrap: wrap; } /* ========== 文本工具类 ========== */ .text-ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .text-ellipsis-2 { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; text-overflow: ellipsis; } .text-ellipsis-3 { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; text-overflow: ellipsis; } .text-center { text-align: center; } .text-right { text-align: right; } .text-bold { font-weight: bold; } .text-gray { color: var(--color-text-gray); } .text-main { color: var(--color-text-main); } /* ========== 安全区域 ========== */ .safe-bottom { padding-bottom: env(safe-area-inset-bottom); } .safe-bottom-fixed { position: fixed; bottom: 0; left: 0; right: 0; padding-bottom: env(safe-area-inset-bottom); } /* ========== 通用卡片 ========== */ .card { background: var(--bg-white); border-radius: var(--radius-lg); box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05); overflow: hidden; } .card-padding { padding: var(--padding-base); } /* ========== 毛玻璃 ========== */ .glass { background: rgba(255, 255, 255, 0.72); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); } .glass-dark { background: rgba(0, 0, 0, 0.55); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); } /* ========== 圆形头像 ========== */ .avatar-circle { border-radius: var(--radius-full); border: 2rpx solid #fff; object-fit: cover; flex-shrink: 0; } .avatar-sm { width: 64rpx; height: 64rpx; } .avatar-md { width: 88rpx; height: 88rpx; } .avatar-lg { width: 120rpx; height: 120rpx; } /* ========== 红点/角标 ========== */ .badge-dot { position: absolute; top: -6rpx; right: -6rpx; width: 16rpx; height: 16rpx; background: #fa5151; border-radius: var(--radius-full); border: 2rpx solid #fff; } .badge-num { position: absolute; top: -10rpx; right: -10rpx; min-width: 32rpx; height: 32rpx; line-height: 32rpx; padding: 0 8rpx; background: #fa5151; color: #fff; font-size: 20rpx; font-weight: 600; border-radius: 16rpx; text-align: center; border: 2rpx solid #fff; } /* ========== 空状态 ========== */ .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 120rpx 40rpx; } .empty-icon { width: 200rpx; height: 200rpx; margin-bottom: 30rpx; opacity: 0.5; } .empty-text { font-size: 30rpx; color: var(--color-text-gray); margin-bottom: 10rpx; } .empty-subtext { font-size: 26rpx; color: #ccc; } /* ========== 分割线 ========== */ .divider { height: 2rpx; background: var(--color-border-light); margin: 20rpx 0; } .divider-light { height: 1rpx; background: rgba(0, 0, 0, 0.04); margin: 16rpx 0; } .divider-gradient { height: 2rpx; background: linear-gradient(90deg, transparent, rgba(0, 0, 0, 0.1), transparent); margin: 20rpx 0; } /* ========== 固定底部按钮区 ========== */ .fixed-bottom { position: fixed; left: 0; right: 0; bottom: 0; padding: 20rpx 30rpx; padding-bottom: calc(20rpx + env(safe-area-inset-bottom)); background: linear-gradient(transparent, rgba(255, 255, 255, 0.95) 30%); z-index: 100; } /* ========== 列表项 ========== */ .list-item { display: flex; align-items: center; padding: 24rpx 28rpx; border-bottom: 1rpx solid rgba(0, 0, 0, 0.04); } .list-item:last-child { border-bottom: none; } .list-icon { width: 36rpx; height: 36rpx; margin-right: 16rpx; flex-shrink: 0; } .list-text { flex: 1; font-size: 28rpx; color: var(--color-text-main); } .list-arrow { width: 20rpx; height: 20rpx; opacity: 0.4; flex-shrink: 0; } /* ========== 标签 ========== */ .tag { display: inline-flex; align-items: center; padding: 4rpx 14rpx; border-radius: 999rpx; font-size: 20rpx; font-weight: 600; line-height: 1.4; } .tag-primary { background: rgba(64, 156, 255, 0.1); color: #409cff; } .tag-success { background: rgba(82, 196, 26, 0.1); color: #52c41a; } .tag-warning { background: rgba(250, 173, 20, 0.1); color: #faad14; } .tag-danger { background: rgba(255, 77, 79, 0.1); color: #ff4d4f; } .tag-gold { background: rgba(201, 169, 98, 0.1); color: #C9A962; } /* ========== 页面容器 ========== */ .page-container { min-height: 100vh; position: relative; } .page-bg { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 0; pointer-events: none; } /* ========== 按钮 ========== */ .btn { display: flex; align-items: center; justify-content: center; border-radius: 48rpx; font-weight: 600; text-align: center; border: none; position: relative; overflow: hidden; transition: all 0.2s ease; } .btn:active { transform: scale(0.98); } /* 主按钮(全宽) */ .btn-primary { width: 100%; height: 96rpx; line-height: 96rpx; font-size: 34rpx; color: #fff; } .btn-primary--gold { background: linear-gradient(135deg, #C9A962, #D4B56A); box-shadow: 0 8rpx 20rpx rgba(201, 169, 98, 0.3); } .btn-primary--green { background: linear-gradient(135deg, #52c41a, #389e0d); box-shadow: 0 8rpx 20rpx rgba(82, 196, 26, 0.3); } .btn-primary--blue { background: linear-gradient(135deg, #409cff, #3080e0); box-shadow: 0 8rpx 20rpx rgba(64, 156, 255, 0.3); } .btn-primary--orange { background: linear-gradient(135deg, #ffb347, #ff8c1a); box-shadow: 0 8rpx 20rpx rgba(255, 140, 26, 0.3); } .btn-primary--purple { background: linear-gradient(135deg, #6a11cb, #2575fc); box-shadow: 0 8rpx 20rpx rgba(106, 17, 203, 0.3); } .btn-primary--red { background: linear-gradient(135deg, #ff4d4f, #cf1322); box-shadow: 0 8rpx 20rpx rgba(255, 77, 79, 0.3); } /* 次要按钮 */ .btn-secondary { background: rgba(0, 0, 0, 0.04); color: var(--color-text-main); font-size: 28rpx; padding: 16rpx 32rpx; } .btn-secondary:active { background: rgba(0, 0, 0, 0.08); } /* 小型按钮 */ .btn-sm { padding: 14rpx 32rpx; font-size: 26rpx; color: #fff; border-radius: 40rpx; } .btn-sm--gold { background: linear-gradient(135deg, #ffcc00, #ffaa00); box-shadow: 0 6rpx 16rpx rgba(255, 170, 0, 0.3); } .btn-sm--green { background: linear-gradient(135deg, #52c41a, #389e0d); box-shadow: 0 6rpx 16rpx rgba(82, 196, 26, 0.3); } .btn-sm--blue { background: linear-gradient(135deg, #409cff, #3080e0); box-shadow: 0 6rpx 16rpx rgba(64, 156, 255, 0.3); } .btn-sm--red { background: linear-gradient(135deg, #ff4d4f, #cf1322); box-shadow: 0 6rpx 16rpx rgba(255, 77, 79, 0.3); } .btn-sm--dark { background: linear-gradient(135deg, #3d4f66, #2c3e50); box-shadow: 0 6rpx 16rpx rgba(44, 62, 80, 0.3); } /* 幽灵按钮(描边) */ .btn-ghost { background: transparent; border: 2rpx solid currentColor; padding: 14rpx 32rpx; font-size: 26rpx; font-weight: 600; } .btn-ghost--primary { color: #409cff; border-color: #409cff; } .btn-ghost--gold { color: #C9A962; border-color: #C9A962; } /* 禁用状态 */ .btn[disabled], .btn-disabled { opacity: 0.5; pointer-events: none; } /* ========== 输入框 ========== */ .input-rounded { width: 100%; height: 88rpx; background: #fff; border-radius: 44rpx; padding: 0 32rpx; font-size: 28rpx; color: var(--color-text-main); box-sizing: border-box; border: none; } .input-rounded--dark { background: rgba(255, 255, 255, 0.15); color: #fff; border: 1rpx solid rgba(255, 255, 255, 0.3); } .input-rounded--dark::placeholder { color: rgba(255, 255, 255, 0.5); } .input-inline { flex: 1; font-size: 32rpx; color: var(--color-text-main); height: 50rpx; line-height: 50rpx; border: none; background: transparent; } .input-box { background: #F7F3ED; border-radius: 24rpx; padding: 0 24rpx; } /* ========== 搜索框 ========== */ .search-box { display: flex; align-items: center; background: #f0f0f0; border-radius: 40rpx; padding: 0 20rpx; height: 68rpx; } .search-box--glass { background: rgba(255, 255, 255, 0.85); backdrop-filter: blur(20px); border: 1rpx solid rgba(255, 255, 255, 0.3); box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06); height: 84rpx; border-radius: 50rpx; padding: 0 28rpx; } .search-input { flex: 1; height: 100%; font-size: 28rpx; margin-left: 10rpx; } .search-icon { width: 32rpx; height: 32rpx; opacity: 0.5; flex-shrink: 0; } /* ========== Tab 标签栏 ========== */ .tab-bar { display: flex; background: #fff; border-bottom: 1rpx solid #f0f0f0; } .tab-item { flex: 1; display: flex; justify-content: center; align-items: center; padding: 24rpx 0; position: relative; color: #666; font-size: 28rpx; transition: color 0.3s; } .tab-item--active { color: var(--color-price); font-weight: 600; } .tab-indicator { position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); width: 60rpx; height: 6rpx; background: var(--color-price); border-radius: 3rpx; } /* 胶囊式 Tab */ .tab-capsule { display: inline-flex; flex-direction: column; align-items: center; justify-content: center; height: 60rpx; padding: 0 30rpx; margin-right: 20rpx; border-radius: 30rpx; background: #f5f5f5; color: #666; font-size: 28rpx; flex-shrink: 0; transition: all 0.3s ease; } .tab-capsule--active { background: #e8f5e9; color: #2e7d32; font-weight: 500; box-shadow: 0 4rpx 12rpx rgba(46, 125, 50, 0.1); } /* ========== 加载遮罩 ========== */ .loading-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; z-index: 9999; } .loading-mask--dark { background: rgba(0, 0, 0, 0.7); backdrop-filter: blur(10px); } .loading-mask--light { background: rgba(255, 255, 255, 0.85); } /* 旋转器尺寸变体 */ .spinner { border-radius: var(--radius-full); animation: spin 0.8s linear infinite; } .spinner--sm { width: 40rpx; height: 40rpx; border: 3rpx solid rgba(0, 0, 0, 0.08); border-top-color: var(--color-text-main); } .spinner--md { width: 60rpx; height: 60rpx; border: 5rpx solid rgba(0, 0, 0, 0.08); border-top-color: var(--color-text-main); } .spinner--lg { width: 80rpx; height: 80rpx; border: 6rpx solid rgba(0, 0, 0, 0.08); border-top-color: var(--color-text-main); } .spinner--white { border-color: rgba(255, 255, 255, 0.3); border-top-color: #fff; } /* ========== 刷新按钮 ========== */ .refresh-btn { position: fixed; top: 36rpx; right: 32rpx; width: 56rpx; height: 56rpx; border-radius: var(--radius-full); display: flex; align-items: center; justify-content: center; z-index: 20; } .refresh-btn--light { background: rgba(255, 255, 255, 0.8); backdrop-filter: blur(12rpx); border: 1rpx solid rgba(255, 255, 255, 0.6); box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05); } .refresh-btn--dark { background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(10rpx); } .refresh-icon { width: 28rpx; height: 28rpx; } /* ========== 状态标签 ========== */ .status-tag { display: inline-flex; align-items: center; padding: 6rpx 16rpx; border-radius: 20rpx; font-size: 24rpx; font-weight: 500; white-space: nowrap; } .status-tag--danger { background: #fff5f5; color: #ff6b6b; } .status-tag--success { background: #f0fff0; color: #52c41a; } .status-tag--warning { background: #fffbe6; color: #faad14; } .status-tag--info { background: #e6f7ff; color: #1890ff; } .status-tag--default { background: #f5f5f5; color: #999; } /* ========== 加载更多 ========== */ .load-more { display: flex; align-items: center; justify-content: center; padding: 40rpx 0; } .load-more-text { font-size: 26rpx; color: var(--color-text-gray); } .no-more { text-align: center; padding: 40rpx 0; font-size: 26rpx; color: #ccc; } /* ========== 更多动画 ========== */ @keyframes bounceIn { 0% { opacity: 0; transform: scale(0.3); } 50% { opacity: 1; transform: scale(1.05); } 70% { transform: scale(0.9); } 100% { transform: scale(1); } } @keyframes shake { 0%, 100% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-6rpx); } 20%, 40%, 60%, 80% { transform: translateX(6rpx); } } @keyframes slideInLeft { from { opacity: 0; transform: translateX(-60rpx); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInRight { from { opacity: 0; transform: translateX(60rpx); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInUp { from { opacity: 0; transform: translateY(40rpx); } to { opacity: 1; transform: translateY(0); } } @keyframes scaleIn { from { opacity: 0; transform: scale(0.8); } to { opacity: 1; transform: scale(1); } } @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-16rpx); } } @keyframes iconFloat { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-30rpx); } } @keyframes glowPulse { 0%, 100% { opacity: 0.5; } 50% { opacity: 0.8; } } @keyframes scanline { 0% { top: 0; } 100% { top: 100%; } } @keyframes streamFlow { 0% { top: -100rpx; opacity: 0; } 10% { opacity: 1; } 90% { opacity: 1; } 100% { top: 100%; opacity: 0; } } @keyframes particleFloat { 0%, 100% { transform: translate(0, 0); } 25% { transform: translate(100rpx, -100rpx); } 50% { transform: translate(-50rpx, 150rpx); } 75% { transform: translate(150rpx, 50rpx); } } @keyframes crownFloat { 0%, 100% { transform: translateY(0) rotate(5deg) scale(1); filter: drop-shadow(0 0 10rpx rgba(255, 215, 0, 0.8)); } 50% { transform: translateY(-15rpx) rotate(10deg) scale(1.1); filter: drop-shadow(0 0 25rpx rgba(255, 215, 0, 1)); } } @keyframes haloRotate { 0% { transform: translate(-50%, -50%) rotate(0deg); } 100% { transform: translate(-50%, -50%) rotate(360deg); } } @keyframes sparkleTwinkle { 0%, 100% { opacity: 0; transform: scale(0.5); } 50% { opacity: 1; transform: scale(1); } } @keyframes cardFlash { 0% { filter: brightness(1) drop-shadow(0 0 0 rgba(255, 255, 255, 0)); } 50% { filter: brightness(1.4) drop-shadow(0 0 40rpx rgba(255, 255, 255, 0.8)); } 100% { filter: brightness(1) drop-shadow(0 0 0 rgba(255, 255, 255, 0)); } } @keyframes spinOuter { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @keyframes spinInner { 0% { transform: rotate(0deg); } 100% { transform: rotate(-360deg); } } /* ========== 动画工具类 ========== */ .anim-bounce { animation: bounceIn 0.5s ease-out; } .anim-shake { animation: shake 0.5s ease; } .anim-slide-left { animation: slideInLeft 0.3s ease-out; } .anim-slide-right { animation: slideInRight 0.3s ease-out; } .anim-slide-up { animation: slideInUp 0.3s ease-out; } .anim-scale { animation: scaleIn 0.3s ease-out; } .anim-float { animation: float 3s ease-in-out infinite; } .anim-shimmer { background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); background-size: 200% 100%; animation: shimmer 1.5s infinite; } /* ========== 聊天公共样式 ========== */ .chat-page { width: 100%; height: 100vh; background: #f5f5f5; } .chat-msg-list { position: absolute; left: 0; right: 0; padding: 0 20rpx; box-sizing: border-box; overflow-y: auto; } .chat-loading-more { text-align: center; font-size: 24rpx; color: #999; padding: 20rpx 0; } .chat-time-tag { text-align: center; margin: 28rpx 0; font-size: 24rpx; color: #b0b0b0; } .chat-msg-wrapper { margin-bottom: 12rpx; animation: slideInUp 0.2s ease-out; } .chat-msg-row { display: flex; align-items: flex-start; margin-bottom: 4rpx; } .chat-msg-row--right { justify-content: flex-end; } .chat-msg-row--left { justify-content: flex-start; } .chat-avatar { width: 76rpx; height: 76rpx; border-radius: 50%; background: #e0e0e0; margin: 0 12rpx; flex-shrink: 0; } .chat-bubble { max-width: 70%; padding: 16rpx 20rpx; border-radius: 16rpx; position: relative; word-break: break-all; font-size: 30rpx; line-height: 1.5; animation: scaleIn 0.15s ease-out; } .chat-bubble--left { background: #fff; border-top-left-radius: 4rpx; } .chat-bubble--right { background: #00aaff; color: #fff; border-top-right-radius: 4rpx; } .chat-msg-text { color: inherit; } .chat-msg-image { max-width: 240rpx; border-radius: 10rpx; } .chat-read-tag { font-size: 20rpx; color: #888; text-align: right; padding: 4rpx 12rpx 0 0; } .chat-order-bubble { background: #fff7e0; padding: 12rpx; border-radius: 8rpx; } .chat-order-label { font-size: 24rpx; color: #e6a23c; font-weight: 600; } .chat-order-info { font-size: 24rpx; color: #333; margin: 6rpx 0; } .chat-input-area { position: fixed; left: 0; right: 0; background: #f7f7f7; border-top: 1rpx solid #ddd; z-index: 10; } .chat-plus-panel { position: absolute; bottom: 100%; left: 0; right: 0; background: #fff; border-top: 1rpx solid #e0e0e0; padding: 20rpx; transform: translateY(100%); opacity: 0; transition: transform 0.3s, opacity 0.3s; pointer-events: none; z-index: 9; } .chat-plus-panel.show { transform: translateY(0); opacity: 1; pointer-events: auto; } .chat-plus-grid { display: flex; justify-content: space-around; } .chat-plus-item { display: flex; flex-direction: column; align-items: center; width: 120rpx; } .chat-plus-icon { font-size: 60rpx; } .chat-plus-label { font-size: 24rpx; color: #666; margin-top: 8rpx; } .chat-emoji-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: transparent; z-index: 8; } .chat-emoji-panel { position: absolute; bottom: 100%; left: 0; right: 0; background: #fff; border-top: 1rpx solid #e0e0e0; height: 380rpx; transform: translateY(100%); opacity: 0; transition: 0.3s; pointer-events: none; z-index: 9; } .chat-emoji-panel.show { transform: translateY(0); opacity: 1; pointer-events: auto; } .chat-emoji-scroll { height: 100%; } .chat-emoji-grid { display: flex; flex-wrap: wrap; padding: 20rpx 10rpx; } .chat-emoji-item { width: 14.28%; text-align: center; padding: 16rpx 0; font-size: 44rpx; } .chat-pending-image { display: flex; align-items: center; padding: 10rpx 20rpx; background: #fff; } .chat-pending-thumb { width: 80rpx; height: 80rpx; border-radius: 8rpx; } .chat-pending-remove { font-size: 30rpx; color: #999; margin-left: 10rpx; } .chat-write-row { display: flex; padding: 0 20rpx 10rpx; align-items: center; } .chat-text-input { flex: 1; height: 76rpx; background: #fff; border-radius: 12rpx; padding: 0 20rpx; font-size: 30rpx; margin-right: 12rpx; } .chat-send-btn { width: 120rpx; height: 76rpx; background: #00aaff; color: #fff; font-size: 28rpx; font-weight: 500; border-radius: 12rpx; display: flex; align-items: center; justify-content: center; transition: opacity 0.2s; } .chat-send-btn:active { opacity: 0.8; } .chat-plus-btn { width: 56rpx; height: 56rpx; display: flex; align-items: center; justify-content: center; margin-left: 10rpx; } .chat-plus-icon-single { font-size: 46rpx; color: #00aaff; } .chat-detail-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.7); z-index: 999; display: flex; align-items: center; justify-content: center; animation: fadeIn 0.2s ease-out; } .chat-detail-content { width: 80%; max-height: 80%; background: #fff; border-radius: 16rpx; padding: 40rpx; animation: scaleIn 0.2s ease-out; } .chat-detail-text { font-size: 32rpx; line-height: 1.6; word-break: break-all; overflow-y: auto; } .chat-copy-btn { width: 100%; height: 80rpx; background: #00aaff; color: #fff; border-radius: 12rpx; margin-top: 20rpx; font-size: 30rpx; display: flex; align-items: center; justify-content: center; } /* ========== 排行榜公共样式 ========== */ .rank-page { min-height: 100vh; background: #000; color: #fff; position: relative; overflow-x: hidden; padding: 40rpx 30rpx; box-sizing: border-box; } .rank-cyber-bg { position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 1; pointer-events: none; } .rank-cyber-grid { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-image: linear-gradient(rgba(0, 255, 255, 0.05) 1px, transparent 1px), linear-gradient(90deg, rgba(0, 255, 255, 0.05) 1px, transparent 1px); background-size: 50rpx 50rpx; opacity: 0.3; } .rank-cyber-scanline { position: absolute; top: 0; left: 0; right: 0; height: 3rpx; background: linear-gradient(90deg, transparent 0%, #00ffff 30%, #ff00ff 50%, #00ffff 70%, transparent 100%); animation: scanline 3s linear infinite; filter: blur(1rpx); box-shadow: 0 0 20rpx #00ffff; z-index: 2; } .rank-data-streams { position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden; } .rank-stream { position: absolute; width: 1rpx; height: 100rpx; background: linear-gradient(to bottom, transparent, #00ffff, transparent); filter: blur(0.5rpx); animation: streamFlow 8s linear infinite; } .rank-stream--1 { left: 20%; animation-delay: 0s; } .rank-stream--2 { left: 50%; animation-delay: 2s; } .rank-stream--3 { left: 80%; animation-delay: 4s; } .rank-particle { position: absolute; width: 6rpx; height: 6rpx; background: #00ffff; border-radius: 50%; filter: blur(1rpx); box-shadow: 0 0 10rpx #00ffff; animation: particleFloat 20s infinite linear; } .rank-particle:nth-child(odd) { background: #ff00ff; box-shadow: 0 0 10rpx #ff00ff; } .rank-page-header { position: relative; z-index: 10; margin-bottom: 55rpx; margin-top: -40rpx; } .rank-title-container { text-align: center; margin-bottom: 40rpx; } .rank-main-title { display: block; font-size: 58rpx; font-weight: 900; background: linear-gradient(90deg, #00ffff, #ff00ff, #ffff00); -webkit-background-clip: text; -webkit-text-fill-color: transparent; letter-spacing: 4rpx; margin-bottom: 8rpx; } .rank-title-line { width: 220rpx; height: 3rpx; background: linear-gradient(90deg, transparent, #00ffff, #ff00ff, transparent); margin: 12rpx auto; position: relative; } .rank-sub-title { display: block; font-size: 22rpx; color: rgba(255, 255, 255, 0.6); letter-spacing: 6rpx; text-transform: uppercase; margin-top: 5rpx; } .rank-toggle-container { display: flex; background: rgba(10, 10, 30, 0.8); border-radius: 60rpx; padding: 6rpx; position: relative; border: 1rpx solid rgba(0, 255, 255, 0.2); backdrop-filter: blur(20rpx); max-width: 700rpx; width: 90%; margin: 0 auto; box-shadow: 0 10rpx 40rpx rgba(0, 0, 0, 0.8), inset 0 0 20rpx rgba(0, 255, 255, 0.05); } .rank-toggle-bg { position: absolute; top: 6rpx; bottom: 6rpx; width: 50%; background: linear-gradient(90deg, rgba(0, 255, 255, 0.2), rgba(255, 0, 255, 0.2)); border-radius: 54rpx; transition: transform 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55); z-index: 1; } .rank-toggle-btn { flex: 1; text-align: center; padding: 30rpx 0; font-size: 32rpx; font-weight: 600; color: rgba(255, 255, 255, 0.7); position: relative; z-index: 2; transition: all 0.3s ease; border-radius: 54rpx; min-width: 200rpx; } .rank-toggle-btn.active { color: #ffffff; text-shadow: 0 0 15rpx rgba(255, 255, 255, 0.5); } .rank-loading-state { display: flex; align-items: center; justify-content: center; height: 60vh; position: relative; z-index: 10; } .rank-loading-spinner { position: relative; width: 120rpx; height: 120rpx; margin: 0 auto 30rpx; } .rank-spinner-outer { position: absolute; top: 0; left: 0; right: 0; bottom: 0; border: 8rpx solid transparent; border-top-color: #00ffff; border-right-color: #ff00ff; border-radius: 50%; animation: spinOuter 2s linear infinite; } .rank-spinner-inner { position: absolute; top: 15rpx; left: 15rpx; right: 15rpx; bottom: 15rpx; border: 6rpx solid transparent; border-bottom-color: #ffff00; border-left-color: #00ffff; border-radius: 50%; animation: spinInner 1.5s linear infinite reverse; } .rank-spinner-core { position: absolute; top: 30rpx; left: 30rpx; right: 30rpx; bottom: 30rpx; background: radial-gradient(circle, rgba(0, 255, 255, 0.2) 0%, rgba(255, 0, 255, 0.1) 50%, transparent 100%); border-radius: 50%; } .rank-loading-text { display: block; font-size: 32rpx; color: #00ffff; margin-bottom: 10rpx; text-shadow: 0 0 10rpx rgba(0, 255, 255, 0.5); } .rank-loading-sub { display: block; font-size: 24rpx; color: rgba(255, 255, 255, 0.6); } .rank-top-three { display: flex; justify-content: center; align-items: flex-end; position: relative; z-index: 10; margin-bottom: 40rpx; gap: 20rpx; margin-top: 10rpx; } .rank-card { position: relative; display: flex; flex-direction: column; align-items: center; transition: all 0.3s ease; } .rank-card--1 { width: 280rpx; z-index: 30; margin-bottom: 30rpx; } .rank-card--2 { width: 220rpx; z-index: 20; margin-right: -20rpx; } .rank-card--3 { width: 220rpx; z-index: 20; margin-left: -20rpx; } .rank-card.flash { animation: cardFlash 0.4s ease-out; } .rank-podium-base { position: absolute; bottom: 0; left: 0; right: 0; height: 60rpx; border-radius: 30rpx 30rpx 0 0; display: flex; align-items: center; justify-content: center; z-index: 1; } .rank-card--1 .rank-podium-base { height: 80rpx; } .rank-podium-gold { background: linear-gradient(180deg, rgba(255, 215, 0, 0.3) 0%, rgba(255, 215, 0, 0.1) 100%); border: 1rpx solid rgba(255, 215, 0, 0.4); } .rank-podium-silver { background: linear-gradient(180deg, rgba(192, 192, 192, 0.3) 0%, rgba(192, 192, 192, 0.1) 100%); border: 1rpx solid rgba(192, 192, 192, 0.4); } .rank-podium-bronze { background: linear-gradient(180deg, rgba(205, 127, 50, 0.3) 0%, rgba(205, 127, 50, 0.1) 100%); border: 1rpx solid rgba(205, 127, 50, 0.4); } .rank-podium-number { font-size: 32rpx; font-weight: 900; color: rgba(255, 255, 255, 0.9); text-shadow: 0 0 10rpx currentColor; } .rank-crown-container { position: absolute; top: -55rpx; left: 55%; transform: translateX(20%) rotate(35deg) !important; width: 110rpx; height: 110rpx; z-index: 40; display: flex; align-items: center; justify-content: center; } .rank-crown-icon { font-size: 85rpx; position: relative; z-index: 2; filter: drop-shadow(0 0 10rpx rgba(255, 215, 0, 0.8)); animation: crownFloat 3s ease-in-out infinite; transform: rotate(5deg); } .rank-crown-glow { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 200rpx; height: 200rpx; background: radial-gradient(circle, rgba(255, 215, 0, 0.3) 0%, rgba(255, 215, 0, 0.1) 40%, transparent 70%); z-index: 0; animation: glowPulse 2s ease-in-out infinite; } .rank-avatar-frame { position: relative; width: 160rpx; height: 160rpx; margin: 0 auto 30rpx; display: flex; align-items: center; justify-content: center; } .rank-card--1 .rank-avatar-frame { width: 200rpx; height: 200rpx; } .rank-avatar-container { position: relative; width: 100%; height: 100%; border-radius: 50%; overflow: hidden; background: rgba(20, 20, 40, 0.8); display: flex; align-items: center; justify-content: center; border: 4rpx solid transparent; } .rank-card--1 .rank-avatar-container { border-width: 6rpx; } .rank-frame-gold .rank-avatar-container { border-color: rgba(255, 215, 0, 0.3); filter: drop-shadow(0 0 30rpx rgba(255, 215, 0, 0.5)); } .rank-frame-silver .rank-avatar-container { border-color: rgba(192, 192, 192, 0.3); filter: drop-shadow(0 0 25rpx rgba(192, 192, 192, 0.5)); } .rank-frame-bronze .rank-avatar-container { border-color: rgba(205, 127, 50, 0.3); filter: drop-shadow(0 0 25rpx rgba(205, 127, 50, 0.5)); } .rank-avatar-image { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; position: relative; z-index: 2; } .rank-avatar-halo { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); border-radius: 50%; z-index: 1; pointer-events: none; animation: haloRotate 10s linear infinite; } .rank-halo-gold { width: 220rpx; height: 220rpx; background: radial-gradient(circle, rgba(255, 215, 0, 0.4) 0%, rgba(255, 215, 0, 0.2) 30%, transparent 70%); } .rank-card--1 .rank-halo-gold { width: 260rpx; height: 260rpx; } .rank-halo-silver { width: 200rpx; height: 200rpx; background: radial-gradient(circle, rgba(192, 192, 192, 0.4) 0%, rgba(192, 192, 192, 0.2) 30%, transparent 70%); } .rank-halo-bronze { width: 200rpx; height: 200rpx; background: radial-gradient(circle, rgba(205, 127, 50, 0.4) 0%, rgba(205, 127, 50, 0.2) 30%, transparent 70%); } .rank-sparkle { position: absolute; width: 8rpx; height: 8rpx; background: #fff; border-radius: 50%; filter: blur(1rpx); opacity: 0; animation: sparkleTwinkle 3s ease-in-out infinite; } .rank-card--1 .rank-sparkle { width: 10rpx; height: 10rpx; } .rank-badge { position: absolute; bottom: -10rpx; right: -10rpx; width: 60rpx; height: 60rpx; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 28rpx; font-weight: 900; color: #fff; z-index: 10; border: 3rpx solid rgba(255, 255, 255, 0.3); box-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.5); } .rank-card--1 .rank-badge { width: 70rpx; height: 70rpx; font-size: 32rpx; bottom: -15rpx; right: -15rpx; } .rank-badge-gold { background: linear-gradient(135deg, #ffd700, #ff9800); } .rank-badge-silver { background: linear-gradient(135deg, #c0c0c0, #808080); } .rank-badge-bronze { background: linear-gradient(135deg, #cd7f32, #a0522d); } .rank-user-info-card { background: rgba(15, 15, 35, 0.95); border-radius: 25rpx; padding: 30rpx 25rpx; backdrop-filter: blur(20rpx); border: 1rpx solid rgba(255, 255, 255, 0.1); box-shadow: 0 20rpx 60rpx rgba(0, 0, 0, 0.8), inset 0 0 30rpx rgba(255, 255, 255, 0.05); position: relative; overflow: hidden; } .rank-card--1 .rank-user-info-card { border-color: rgba(255, 215, 0, 0.3); background: rgba(20, 15, 5, 0.95); } .rank-card--2 .rank-user-info-card { border-color: rgba(192, 192, 192, 0.3); background: rgba(25, 25, 35, 0.95); } .rank-card--3 .rank-user-info-card { border-color: rgba(205, 127, 50, 0.3); background: rgba(30, 20, 10, 0.95); } .rank-user-name { font-size: 32rpx; font-weight: 700; color: #fff; display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: center; } .rank-card--1 .rank-user-name { color: #ffd700; text-shadow: 0 0 15rpx rgba(255, 215, 0, 0.7); font-size: 34rpx; } .rank-card--2 .rank-user-name { color: #c0c0c0; text-shadow: 0 0 10rpx rgba(192, 192, 192, 0.7); } .rank-card--3 .rank-user-name { color: #cd7f32; text-shadow: 0 0 10rpx rgba(205, 127, 50, 0.7); } .rank-info-body { border-top: 1rpx solid rgba(255, 255, 255, 0.1); padding-top: 15rpx; } .rank-uid-row, .rank-income-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12rpx; } .rank-uid-label, .rank-income-label { font-size: 24rpx; color: rgba(255, 255, 255, 0.6); } .rank-uid-value { font-size: 24rpx; color: rgba(255, 255, 255, 0.9); font-family: 'Courier New', monospace; } .rank-income-value { display: flex; align-items: baseline; } .rank-currency { font-size: 26rpx; color: #4ade80; margin-right: 4rpx; } .rank-card--1 .rank-currency { color: #ffd700; } .rank-card--2 .rank-currency { color: #c0c0c0; } .rank-card--3 .rank-currency { color: #cd7f32; } .rank-amount { font-size: 32rpx; font-weight: 700; color: #4ade80; text-shadow: 0 0 10rpx rgba(74, 222, 128, 0.5); } .rank-card--1 .rank-amount { color: #ffd700; text-shadow: 0 0 15rpx rgba(255, 215, 0, 0.7); } .rank-card--2 .rank-amount { color: #c0c0c0; text-shadow: 0 0 10rpx rgba(192, 192, 192, 0.7); } .rank-card--3 .rank-amount { color: #cd7f32; text-shadow: 0 0 10rpx rgba(205, 127, 50, 0.7); } .rank-unit { font-size: 24rpx; color: rgba(255, 255, 255, 0.6); margin-left: 4rpx; } .rank-section-title { display: flex; align-items: center; justify-content: center; margin-bottom: 40rpx; } .rank-section-line { flex: 1; height: 2rpx; background: linear-gradient(90deg, transparent, #00ffff, #ff00ff, #00ffff, transparent); } .rank-section-text { font-size: 32rpx; font-weight: 700; color: #00ffff; margin: 0 30rpx; text-shadow: 0 0 15rpx rgba(0, 255, 255, 0.5); } .rank-list-item { display: flex; align-items: center; background: rgba(20, 20, 40, 0.8); border-radius: 25rpx; padding: 25rpx 30rpx; margin-bottom: 20rpx; border: 1rpx solid rgba(0, 255, 255, 0.1); backdrop-filter: blur(20rpx); position: relative; overflow: hidden; transition: all 0.3s ease; box-shadow: 0 10rpx 40rpx rgba(0, 0, 0, 0.6), inset 0 0 20rpx rgba(0, 255, 255, 0.05); } .rank-list-item.flash { animation: cardFlash 0.4s ease-out; } .rank-number { width: 80rpx; text-align: center; position: relative; margin-right: 30rpx; flex-shrink: 0; } .rank-number-text { font-size: 42rpx; font-weight: 900; color: rgba(255, 255, 255, 0.9); position: relative; z-index: 1; } .rank-number-glow { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 80rpx; height: 80rpx; background: radial-gradient(circle, rgba(0, 255, 255, 0.2) 0%, transparent 70%); z-index: 0; } .rank-list-avatar { position: relative; width: 100rpx; height: 100rpx; margin-right: 25rpx; flex-shrink: 0; } .rank-list-avatar-img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; position: relative; z-index: 2; border: 3rpx solid rgba(0, 255, 255, 0.2); } .rank-list-avatar-halo { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 120rpx; height: 120rpx; background: radial-gradient(circle, rgba(0, 255, 255, 0.2) 0%, rgba(0, 255, 255, 0.1) 30%, transparent 70%); z-index: 1; border-radius: 50%; } .rank-list-info { flex: 1; min-width: 0; } .rank-list-name { display: block; font-size: 32rpx; font-weight: 600; color: #ffffff; margin-bottom: 8rpx; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .rank-list-uid { display: block; font-size: 24rpx; color: rgba(255, 255, 255, 0.6); font-family: 'Courier New', monospace; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .rank-list-income { position: relative; flex-shrink: 0; display: flex; align-items: baseline; margin-left: 20rpx; } .rank-income-currency { font-size: 28rpx; color: #00ffff; margin-right: 4rpx; opacity: 0.9; } .rank-income-amount { font-size: 36rpx; font-weight: 700; color: #4ade80; text-shadow: 0 0 10rpx rgba(74, 222, 128, 0.5); white-space: nowrap; line-height: 1; } .rank-income-unit { font-size: 24rpx; color: rgba(255, 255, 255, 0.6); margin-left: 4rpx; } .rank-income-glow { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 140rpx; height: 70rpx; background: radial-gradient(ellipse, rgba(74, 222, 128, 0.2) 0%, transparent 70%); z-index: 0; } .rank-empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 120rpx 0; text-align: center; position: relative; z-index: 10; } .rank-empty-icon { font-size: 120rpx; margin-bottom: 30rpx; opacity: 0.5; animation: iconFloat 3s ease-in-out infinite; } .rank-empty-title { font-size: 36rpx; color: rgba(255, 255, 255, 0.8); margin-bottom: 15rpx; } .rank-empty-desc { font-size: 28rpx; color: rgba(255, 255, 255, 0.5); } .rank-content { position: relative; z-index: 5; margin-top: 10rpx; } .rank-demo-notice { background: rgba(15, 15, 35, 0.9); border-radius: 25rpx; padding: 30rpx; margin-bottom: 40rpx; position: relative; z-index: 10; border: 1rpx solid rgba(255, 0, 255, 0.3); backdrop-filter: blur(20rpx); display: flex; align-items: center; overflow: hidden; box-shadow: 0 10rpx 40rpx rgba(0, 0, 0, 0.8), 0 0 30rpx rgba(255, 0, 255, 0.2); } .rank-notice-icon { font-size: 60rpx; margin-right: 30rpx; background: linear-gradient(45deg, #ff00ff, #00ffff); -webkit-background-clip: text; -webkit-text-fill-color: transparent; flex-shrink: 0; } .rank-notice-content { flex: 1; } .rank-notice-title { display: block; font-size: 32rpx; font-weight: 700; color: #ff00ff; margin-bottom: 10rpx; text-shadow: 0 0 15rpx rgba(255, 0, 255, 0.5); } .rank-notice-desc { display: block; font-size: 26rpx; color: rgba(255, 255, 255, 0.7); line-height: 1.4; }