diff --git a/src/components/call/CallWindow.vue b/src/components/call/CallWindow.vue
index b740e64..7ff3caa 100644
--- a/src/components/call/CallWindow.vue
+++ b/src/components/call/CallWindow.vue
@@ -281,6 +281,7 @@ watch(() => props.remoteStream, (stream) => {
position: absolute;
inset: 0;
overflow: hidden;
+ background: #0f172a; // 设计稿: 来电背景
.blur-img {
width: 100%;
@@ -294,7 +295,35 @@ watch(() => props.remoteStream, (stream) => {
.blur-overlay {
position: absolute;
inset: 0;
- background: linear-gradient(180deg, rgba(0,0,0,0.4) 0%, transparent 30%, rgba(0,0,0,0.9) 100%);
+ background: rgba(15, 23, 42, 0.8); // 设计稿: bg-[#0f172a]/80
+ backdrop-filter: blur(48px);
+ -webkit-backdrop-filter: blur(48px);
+ }
+
+ // 设计稿: 呼吸光球动画
+ &::before, &::after {
+ content: '';
+ position: absolute;
+ width: 600rpx;
+ height: 600rpx;
+ border-radius: 50%;
+ filter: blur(160rpx);
+ opacity: 0.4;
+ animation: glow-breathe 8s ease-in-out infinite;
+ }
+
+ &::before {
+ top: 10%;
+ left: -100rpx;
+ background: #9333ea; // purple-600
+ animation-delay: 0s;
+ }
+
+ &::after {
+ bottom: 10%;
+ right: -100rpx;
+ background: #2563eb; // blue-600
+ animation-delay: 4s;
}
}
@@ -366,23 +395,36 @@ watch(() => props.remoteStream, (stream) => {
position: relative;
margin-bottom: 48rpx;
+ // 设计稿: 头像波纹效果
.avatar-ring {
position: absolute;
+ inset: -20rpx;
border-radius: 50%;
- border: 2rpx solid rgba(255, 255, 255, 0.1);
+ border: 2rpx solid rgba(255, 255, 255, 0.3); // 设计稿: border-white/30
+
+ &.ring-1 {
+ animation: ripple 2s cubic-bezier(0, 0, 0.2, 1) infinite;
+ }
+
+ &.ring-2 {
+ animation: ripple 2s cubic-bezier(0, 0, 0.2, 1) infinite;
+ animation-delay: 1s;
+ }
&.ring-ping {
inset: -4rpx;
- border: 2rpx solid rgba(255, 255, 255, 0.2);
+ border: 2rpx solid rgba(255, 255, 255, 0.3);
animation: ping 2s cubic-bezier(0, 0, 0.2, 1) infinite;
}
}
.avatar-container {
+ position: relative;
border: 4rpx solid rgba(255, 255, 255, 0.1);
border-radius: 50%;
padding: 4rpx;
box-shadow: 0 40rpx 100rpx rgba(0, 0, 0, 0.4);
+ z-index: 1;
}
}
@@ -527,4 +569,16 @@ watch(() => props.remoteStream, (stream) => {
from { transform: translateY(40rpx); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
+
+// 设计稿: 呼吸光球动画
+@keyframes glow-breathe {
+ 0%, 100% { transform: scale(1); opacity: 0.3; }
+ 50% { transform: scale(1.2); opacity: 0.5; }
+}
+
+// 设计稿: 头像波纹动画
+@keyframes ripple {
+ 0% { transform: scale(1); opacity: 0.4; }
+ 100% { transform: scale(2.5); opacity: 0; }
+}
diff --git a/src/components/common/AppDrawer.vue b/src/components/common/AppDrawer.vue
index 55b7b27..6757934 100644
--- a/src/components/common/AppDrawer.vue
+++ b/src/components/common/AppDrawer.vue
@@ -15,15 +15,12 @@
{{ tab.label }}
@@ -74,11 +86,12 @@ const { isDark } = useTheme()
const conversationStore = useConversationStore()
const unreadCount = computed(() => conversationStore.totalUnread)
-// 底部导航只有3个: 消息/联系人/发现 (无"我的")
+// 底部导航4个: 消息/联系人/发现/我的
const tabs = [
{ name: 'messages', label: '消息', path: '/pages/index/index' },
{ name: 'contacts', label: '联系人', path: '/pages/contact/index' },
- { name: 'moments', label: '发现', path: '/pages/moment/index' }
+ { name: 'moments', label: '发现', path: '/pages/moment/index' },
+ { name: 'profile', label: '我的', path: '/pages/profile/index' }
]
function switchTab(name: string) {
diff --git a/src/pages/chat/index.vue b/src/pages/chat/index.vue
index dfbeef6..fbf679a 100644
--- a/src/pages/chat/index.vue
+++ b/src/pages/chat/index.vue
@@ -75,15 +75,12 @@
-
-
- {{ msg.isSelf ? (currentUser?.name?.charAt(0) || '?') : (getMessageSenderName(msg)?.charAt(0) || '?') }}
-
diff --git a/src/pages/contact/add.vue b/src/pages/contact/add.vue
index 6e460e6..e2d296f 100644
--- a/src/pages/contact/add.vue
+++ b/src/pages/contact/add.vue
@@ -1,112 +1,65 @@
-
-
-
+
+
+
+
+
+ 正在搜索...
+
+
+
+
+
+
+
+
+
+ 未找到该用户
+
+
+
+
+
+
+ 搜索结果
+
+
+
+
+ {{ user.name }}
+ ID: {{ user.id }}
+
+
+ {{ addedIds.includes(user.id) ? '已发送' : '添加' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/contact/detail.vue b/src/pages/contact/detail.vue
index d527fb0..d64d773 100644
--- a/src/pages/contact/detail.vue
+++ b/src/pages/contact/detail.vue
@@ -191,25 +191,33 @@ async function deleteFriend() { try { await messageBox.confirm({ title: '提示'