diff --git a/mini-program/src/App.vue b/mini-program/src/App.vue index 40070e6..bb33747 100644 --- a/mini-program/src/App.vue +++ b/mini-program/src/App.vue @@ -39,6 +39,37 @@ page { padding-bottom: 0; } +/* 星空背景 */ +.stars-container { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 0; +} + +.star { + position: absolute; + background: white; + border-radius: 50%; + opacity: var(--opacity); + animation: float-star var(--duration) ease-in-out infinite; + animation-delay: var(--delay); +} + +@keyframes float-star { + 0%, 100% { + transform: translate(0, 0) scale(1); + opacity: var(--opacity); + } + 50% { + transform: translate(var(--x), var(--y)) scale(1.5); + opacity: 1; + } +} + .status-bar-space { width: 100%; background: transparent; @@ -67,6 +98,7 @@ page { background: linear-gradient(135deg, rgba(168, 85, 247, 0.15), rgba(232, 121, 249, 0.1)); border: 1px solid rgba(168, 85, 247, 0.3); border-radius: 32rpx; + box-shadow: 0 0 20px rgba(168, 85, 247, 0.1); } .glass-input { @@ -91,6 +123,7 @@ page { font-size: 30rpx; border: none; box-shadow: 0 8rpx 32rpx rgba(168, 85, 247, 0.3); + transition: all 0.2s ease; } .btn-primary:active { @@ -98,6 +131,11 @@ page { opacity: 0.9; } +.btn-primary:disabled { + opacity: 0.5; + cursor: not-allowed; +} + .btn-secondary { background: rgba(255, 255, 255, 0.08); border: 1px solid rgba(255, 255, 255, 0.15); @@ -115,13 +153,14 @@ page { } .nav-item { - color: rgba(255, 255, 255, 0.4); - transition: all 0.3s ease; + color: rgba(255, 255, 255, 0.3); + transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1); } .nav-item.active { color: #C084FC; transform: translateY(-8rpx); + text-shadow: 0 0 15px rgba(168, 85, 247, 0.6); } .step-indicator { @@ -134,7 +173,7 @@ page { height: 8rpx; background: rgba(255, 255, 255, 0.1); border-radius: 4rpx; - transition: all 0.4s ease; + transition: all 0.7s ease; } .step-dot.active { @@ -150,11 +189,49 @@ page { padding: 12rpx 24rpx; font-size: 22rpx; color: rgba(243, 232, 255, 0.8); + box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.2); + backdrop-filter: blur(8rpx); + transition: all 0.2s ease; } .hint-chip:active { background: rgba(168, 85, 247, 0.2); border-color: rgba(168, 85, 247, 0.4); + transform: scale(1.05); + box-shadow: 0 8rpx 15rpx rgba(168, 85, 247, 0.3); +} + +.ai-reply-card { + background: rgba(168, 85, 247, 0.08); + border: 1px solid rgba(168, 85, 247, 0.2); + border-radius: 20rpx; + padding: 24rpx; + box-shadow: 0 0 20px rgba(168, 85, 247, 0.1); +} + +.typing-text { + overflow: hidden; + white-space: pre-wrap; + animation: reveal 2s steps(60, end); +} + +@keyframes reveal { + from { opacity: 0; transform: translateY(10rpx); } + to { opacity: 1; transform: translateY(0); } +} + +.starlight-loader { + width: 44rpx; + height: 44rpx; + border-radius: 50%; + border: 2rpx solid #A855F7; + border-top-color: transparent; + animation: spin 0.8s infinite linear; +} + +@keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } } ::-webkit-scrollbar { @@ -166,6 +243,10 @@ page { border-radius: 10rpx; } +::-webkit-scrollbar-track { + background: rgba(168, 85, 247, 0.05); +} + @keyframes fadeIn { from { opacity: 0; transform: translateY(20rpx); } to { opacity: 1; transform: translateY(0); } @@ -184,16 +265,38 @@ page { animation: pulse 6s ease-in-out infinite; } +@keyframes float { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-10rpx); } +} + +.animate-float { + animation: float 3s ease-in-out infinite; +} + .text-primary { color: #A855F7; } .text-primary-light { color: #C084FC; } .text-accent { color: #E879F9; } .text-muted { color: rgba(255, 255, 255, 0.4); } +.text-white-90 { color: rgba(255, 255, 255, 0.9); } +.text-white-70 { color: rgba(255, 255, 255, 0.7); } +.text-white-50 { color: rgba(255, 255, 255, 0.5); } .font-serif { font-family: 'Cinzel', serif; } .bg-dark { background-color: #0F071A; } .bg-gradient-purple { background: linear-gradient(180deg, #1A0B2E 0%, #0F071A 50%, #050208 100%); } +.bg-aurora-top { + background: rgba(168, 85, 247, 0.08); + filter: blur(120rpx); + border-radius: 50%; +} +.bg-aurora-bottom { + background: rgba(139, 92, 246, 0.05); + filter: blur(100rpx); + border-radius: 50%; +} .safe-area-bottom { padding-bottom: constant(safe-area-inset-bottom); diff --git a/mini-program/src/components/MusicPlayer.vue b/mini-program/src/components/MusicPlayer.vue new file mode 100644 index 0000000..b2d5d42 --- /dev/null +++ b/mini-program/src/components/MusicPlayer.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/mini-program/src/pages/main/RecordView.vue b/mini-program/src/pages/main/RecordView.vue index 8c4f874..0082cd9 100644 --- a/mini-program/src/pages/main/RecordView.vue +++ b/mini-program/src/pages/main/RecordView.vue @@ -189,8 +189,10 @@ onMounted(() => { .save-btn { width: 100%; height: 88rpx; - background: linear-gradient(90deg, rgba(147, 51, 234, 0.4), rgba(124, 58, 237, 0.4)); + background: linear-gradient(135deg, rgba(147, 51, 234, 0.4), rgba(124, 58, 237, 0.4)); border: 1px solid rgba(168, 85, 247, 0.3); + border-radius: 32rpx; + box-shadow: 0 8rpx 32rpx rgba(168, 85, 247, 0.2); } .save-btn.disabled { @@ -235,9 +237,11 @@ onMounted(() => { .ai-reply { background: rgba(168, 85, 247, 0.08); - border: 1px solid rgba(168, 85, 247, 0.2); + border: 1px solid rgba(168, 85, 247, 0.25); border-radius: 20rpx; padding: 24rpx; + box-shadow: 0 0 20px rgba(168, 85, 247, 0.1); + margin-top: 16rpx; } .ai-header { diff --git a/mini-program/src/pages/main/index.vue b/mini-program/src/pages/main/index.vue index ac2d93c..ffca606 100644 --- a/mini-program/src/pages/main/index.vue +++ b/mini-program/src/pages/main/index.vue @@ -1,17 +1,37 @@