diff --git a/pwuniapp/App.vue b/pwuniapp/App.vue
index d17cfc1..3e928e8 100644
--- a/pwuniapp/App.vue
+++ b/pwuniapp/App.vue
@@ -13,27 +13,34 @@ export default {
diff --git a/pwuniapp/pages/activity/detail.vue b/pwuniapp/pages/activity/detail.vue
index f13f78e..4b75821 100644
--- a/pwuniapp/pages/activity/detail.vue
+++ b/pwuniapp/pages/activity/detail.vue
@@ -161,7 +161,7 @@ const handleJoin = () => {
.detail-container {
min-height: 100vh;
background-color: #0A0F1D;
- padding: 24rpx 32rpx 160rpx;
+ padding: 24rpx 32rpx calc(160rpx + env(safe-area-inset-bottom));
}
.hero-card {
@@ -433,13 +433,14 @@ const handleJoin = () => {
bottom: 0;
left: 0;
right: 0;
- height: 120rpx;
+ height: calc(120rpx + env(safe-area-inset-bottom));
+ padding: 0 32rpx env(safe-area-inset-bottom);
+ box-sizing: border-box;
background-color: rgba(21, 29, 48, 0.95);
backdrop-filter: blur(12px);
border-top: 1px solid rgba(255, 255, 255, 0.08);
display: flex;
align-items: center;
- padding: 0 32rpx;
gap: 24rpx;
z-index: 100;
max-width: 450px;
@@ -474,6 +475,7 @@ const handleJoin = () => {
line-height: 80rpx;
box-shadow: 0 4rpx 20rpx rgba(16, 185, 129, 0.35);
margin: 0;
+ font-variant-numeric: tabular-nums;
}
}
diff --git a/pwuniapp/pages/activity/list.vue b/pwuniapp/pages/activity/list.vue
index 09019b0..0be5b86 100644
--- a/pwuniapp/pages/activity/list.vue
+++ b/pwuniapp/pages/activity/list.vue
@@ -74,7 +74,7 @@
组队进度
- {{ act.currentParticipants }} / {{ act.maxParticipants }}人
+ {{ act.currentParticipants }} / {{ act.maxParticipants }}人
房主:{{ act.creatorNickname }}
-
+
人均预估
¥{{ act.aaFee }}
@@ -105,7 +105,7 @@
-
+
+
发起组队
@@ -149,7 +149,7 @@ const createActivity = () => {
.activity-container {
min-height: 100vh;
background-color: #0A0F1D;
- padding: 20rpx 32rpx 140rpx;
+ padding: 20rpx 32rpx calc(180rpx + env(safe-area-inset-bottom));
}
.tab-header {
@@ -169,6 +169,7 @@ const createActivity = () => {
padding: 18rpx 0;
position: relative;
border-radius: 14rpx;
+ transition: all 0.2s ease;
.tab-svg {
width: 26rpx;
@@ -343,6 +344,7 @@ const createActivity = () => {
height: 100%;
background: linear-gradient(90deg, #10B981, #059669);
border-radius: 5rpx;
+ box-shadow: 0 0 10rpx rgba(16, 185, 129, 0.5);
}
}
}
@@ -396,15 +398,16 @@ const createActivity = () => {
.fab-btn {
position: fixed;
right: 36rpx;
- bottom: 160rpx;
+ bottom: calc(140rpx + env(safe-area-inset-bottom));
background: linear-gradient(135deg, #6366F1 0%, #8B5CF6 100%);
border-radius: 44rpx;
- padding: 18rpx 32rpx;
+ padding: 18rpx 34rpx;
display: flex;
align-items: center;
- box-shadow: 0 8rpx 28rpx rgba(99, 102, 241, 0.5);
+ box-shadow: 0 8rpx 28rpx rgba(99, 102, 241, 0.55);
border: 1px solid rgba(255, 255, 255, 0.2);
z-index: 100;
+ animation: fabPulse 3s infinite ease-in-out;
.fab-icon {
font-size: 32rpx;
@@ -418,4 +421,9 @@ const createActivity = () => {
font-weight: 600;
}
}
+
+@keyframes fabPulse {
+ 0%, 100% { box-shadow: 0 8rpx 24rpx rgba(99, 102, 241, 0.45); }
+ 50% { box-shadow: 0 8rpx 36rpx rgba(99, 102, 241, 0.75); }
+}
diff --git a/pwuniapp/pages/activity/my-ticket.vue b/pwuniapp/pages/activity/my-ticket.vue
index a8d5571..02982bb 100644
--- a/pwuniapp/pages/activity/my-ticket.vue
+++ b/pwuniapp/pages/activity/my-ticket.vue
@@ -124,7 +124,7 @@ const goBack = () => {
.ticket-container {
min-height: 100vh;
background-color: #0A0F1D;
- padding: 40rpx 36rpx;
+ padding: 40rpx 36rpx calc(60rpx + env(safe-area-inset-bottom));
}
.ticket-card {
@@ -158,12 +158,14 @@ const goBack = () => {
color: #F59E0B;
border: 1px solid rgba(245, 158, 11, 0.3);
font-weight: 700;
+ transition: all 0.3s ease;
&.verified {
background: rgba(16, 185, 129, 0.15);
color: #10B981;
- border-color: rgba(16, 185, 129, 0.4);
- transform: rotate(-4deg);
+ border-color: rgba(16, 185, 129, 0.5);
+ box-shadow: 0 0 16rpx rgba(16, 185, 129, 0.3);
+ animation: stampIn 0.35s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
}
}
}
@@ -244,19 +246,21 @@ const goBack = () => {
.digit-box {
width: 110rpx;
height: 130rpx;
- background: rgba(10, 15, 29, 0.8);
+ background: rgba(10, 15, 29, 0.85);
border: 2rpx solid #10B981;
border-radius: 16rpx;
display: flex;
align-items: center;
justify-content: center;
- box-shadow: 0 0 24rpx rgba(16, 185, 129, 0.45);
+ box-shadow: 0 0 24rpx rgba(16, 185, 129, 0.4), inset 0 0 16rpx rgba(16, 185, 129, 0.15);
+ animation: slotPulse 2.5s ease-in-out infinite alternate;
.digit-text {
font-size: 64rpx;
font-weight: 800;
color: #10B981;
font-family: 'Courier New', Courier, monospace;
+ font-variant-numeric: tabular-nums;
text-shadow: 0 0 16rpx rgba(16, 185, 129, 0.7);
}
}
@@ -311,7 +315,9 @@ const goBack = () => {
.time-text {
font-size: 20rpx;
color: #94A3B8;
- font-family: monospace;
+ font-family: 'Courier New', monospace;
+ font-variant-numeric: tabular-nums;
+ letter-spacing: 1rpx;
}
}
@@ -358,4 +364,28 @@ const goBack = () => {
0% { background-position: 0% 50%; }
100% { background-position: 200% 50%; }
}
+
+@keyframes stampIn {
+ 0% {
+ transform: scale(2.4) rotate(-22deg);
+ opacity: 0;
+ }
+ 70% {
+ transform: scale(0.92) rotate(-6deg);
+ opacity: 1;
+ }
+ 100% {
+ transform: scale(1) rotate(-4deg);
+ opacity: 1;
+ }
+}
+
+@keyframes slotPulse {
+ 0% {
+ box-shadow: 0 0 16rpx rgba(16, 185, 129, 0.3), inset 0 0 10rpx rgba(16, 185, 129, 0.1);
+ }
+ 100% {
+ box-shadow: 0 0 28rpx rgba(16, 185, 129, 0.6), inset 0 0 18rpx rgba(16, 185, 129, 0.25);
+ }
+}
diff --git a/pwuniapp/pages/expert/detail.vue b/pwuniapp/pages/expert/detail.vue
index 692c70c..c18ded2 100644
--- a/pwuniapp/pages/expert/detail.vue
+++ b/pwuniapp/pages/expert/detail.vue
@@ -26,7 +26,10 @@
- ⭐ {{ expert.rating }}
+
+
+ {{ expert.rating }}
+
已陪玩 {{ expert.orderCount }} 次
@@ -204,7 +207,7 @@ const goToOrder = () => {
.expert-detail-container {
min-height: 100vh;
background-color: #0A0F1D;
- padding-bottom: 140rpx;
+ padding-bottom: calc(160rpx + env(safe-area-inset-bottom));
}
.hero-header {
@@ -321,13 +324,26 @@ const goToOrder = () => {
.data-row {
display: flex;
+ align-items: center;
gap: 20rpx;
font-size: 22rpx;
color: #94A3B8;
- .rating-val {
- color: #F59E0B;
- font-weight: 600;
+ .rating-box {
+ display: flex;
+ align-items: center;
+ gap: 6rpx;
+
+ .star-svg {
+ width: 24rpx;
+ height: 24rpx;
+ }
+
+ .rating-val {
+ color: #F59E0B;
+ font-weight: 700;
+ font-variant-numeric: tabular-nums;
+ }
}
}
}
@@ -450,8 +466,9 @@ const goToOrder = () => {
padding: 20rpx 24rpx;
&.selected {
- background: rgba(99, 102, 241, 0.15);
+ background: rgba(99, 102, 241, 0.16);
border-color: #6366F1;
+ box-shadow: 0 0 16rpx rgba(99, 102, 241, 0.35);
}
.srv-left {
@@ -469,6 +486,7 @@ const goToOrder = () => {
.srv-right {
color: #10B981;
+ font-variant-numeric: tabular-nums;
.price-sym { font-size: 22rpx; }
.price-num { font-size: 34rpx; font-weight: 700; }
.price-unit { font-size: 20rpx; color: #64748B; }
@@ -562,13 +580,14 @@ const goToOrder = () => {
bottom: 0;
left: 0;
right: 0;
- height: 120rpx;
+ height: calc(120rpx + env(safe-area-inset-bottom));
+ padding: 0 32rpx env(safe-area-inset-bottom);
+ box-sizing: border-box;
background-color: rgba(21, 29, 48, 0.95);
backdrop-filter: blur(12px);
border-top: 1px solid rgba(255, 255, 255, 0.08);
display: flex;
align-items: center;
- padding: 0 32rpx;
gap: 20rpx;
z-index: 100;
max-width: 450px;
@@ -605,6 +624,7 @@ const goToOrder = () => {
font-weight: 700;
color: #10B981;
margin-left: 6rpx;
+ font-variant-numeric: tabular-nums;
}
}
diff --git a/pwuniapp/pages/index/index.vue b/pwuniapp/pages/index/index.vue
index 3326ee8..5fdb550 100644
--- a/pwuniapp/pages/index/index.vue
+++ b/pwuniapp/pages/index/index.vue
@@ -1,6 +1,6 @@
-
+
-
+
-
+
@@ -36,7 +36,7 @@
-
+
@@ -68,7 +68,7 @@
-
+
@@ -80,6 +80,7 @@
+
-
+
@@ -107,8 +108,8 @@
{{ expert.rankTag }}
-
-
+
+
{{ playingId === expert.id ? '试听中...' : expert.voiceDuration + 's 原声试听' }}
@@ -119,12 +120,12 @@
@@ -196,7 +197,7 @@ const navTo = (url) => {
.index-container {
min-height: 100vh;
background-color: #0A0F1D;
- padding-bottom: 140rpx;
+ padding-bottom: calc(160rpx + env(safe-area-inset-bottom));
}
.header-search {
@@ -214,6 +215,12 @@ const navTo = (url) => {
border-radius: 40rpx;
padding: 0 28rpx;
border: 1px solid rgba(255, 255, 255, 0.08);
+ transition: all 0.2s ease;
+
+ &:focus-within {
+ border-color: #6366F1;
+ box-shadow: 0 0 16rpx rgba(99, 102, 241, 0.35);
+ }
.search-icon-img {
width: 32rpx;
@@ -256,6 +263,7 @@ const navTo = (url) => {
border-radius: 32rpx;
border: 1px solid rgba(255, 255, 255, 0.06);
position: relative;
+ transition: all 0.15s ease-out;
.cat-icon-svg {
width: 28rpx;
@@ -277,12 +285,13 @@ const navTo = (url) => {
padding: 2rpx 8rpx;
border-radius: 12rpx;
font-weight: 700;
+ box-shadow: 0 2rpx 6rpx rgba(239, 68, 68, 0.4);
}
&.active {
background: linear-gradient(135deg, #6366F1 0%, #8B5CF6 100%);
border-color: #818CF8;
- box-shadow: 0 4rpx 16rpx rgba(99, 102, 241, 0.4);
+ box-shadow: 0 4rpx 16rpx rgba(99, 102, 241, 0.45);
.cat-name {
color: #FFFFFF;
@@ -303,7 +312,7 @@ const navTo = (url) => {
display: flex;
flex-direction: column;
justify-content: center;
- box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.4);
+ box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.45);
.banner-tag {
align-self: flex-start;
@@ -351,6 +360,7 @@ const navTo = (url) => {
align-items: center;
justify-content: center;
margin-bottom: 12rpx;
+ transition: transform 0.15s ease;
.quick-svg {
width: 40rpx;
@@ -434,6 +444,7 @@ const navTo = (url) => {
position: relative;
height: 260rpx;
overflow: hidden;
+ background-color: #1E2942;
.card-cover {
width: 100%;
@@ -445,7 +456,7 @@ const navTo = (url) => {
.cover-gradient {
position: absolute;
inset: 0;
- background: linear-gradient(180deg, rgba(0,0,0,0.1) 0%, rgba(21, 29, 48, 0.8) 100%);
+ background: linear-gradient(180deg, rgba(0,0,0,0.05) 0%, rgba(21, 29, 48, 0.85) 100%);
}
.status-tag {
@@ -548,6 +559,13 @@ const navTo = (url) => {
align-items: center;
padding: 0 16rpx;
margin-bottom: 16rpx;
+ transition: all 0.2s ease;
+
+ &.playing {
+ background: rgba(99, 102, 241, 0.3);
+ border-color: #818CF8;
+ box-shadow: 0 0 14rpx rgba(99, 102, 241, 0.4);
+ }
.voice-icon-svg {
width: 20rpx;
diff --git a/pwuniapp/pages/order/create.vue b/pwuniapp/pages/order/create.vue
index afd8d41..a9eb43e 100644
--- a/pwuniapp/pages/order/create.vue
+++ b/pwuniapp/pages/order/create.vue
@@ -170,7 +170,7 @@ const handlePay = () => {
.create-order-container {
min-height: 100vh;
background-color: #0A0F1D;
- padding: 24rpx 32rpx 160rpx;
+ padding: 24rpx 32rpx calc(160rpx + env(safe-area-inset-bottom));
}
.order-card {
@@ -225,6 +225,7 @@ const handlePay = () => {
font-size: 26rpx;
font-weight: 600;
color: #10B981;
+ font-variant-numeric: tabular-nums;
}
}
}
@@ -258,23 +259,29 @@ const handlePay = () => {
padding: 6rpx;
.step-btn {
- width: 60rpx;
- height: 60rpx;
- line-height: 56rpx;
+ width: 72rpx;
+ height: 72rpx;
+ line-height: 68rpx;
padding: 0;
background: #1E2942;
color: #FFF;
font-size: 32rpx;
- border-radius: 12rpx;
+ border-radius: 14rpx;
border: none;
margin: 0;
+ transition: transform 0.1s ease;
+
+ &:active {
+ transform: scale(0.92);
+ }
}
.step-val {
- font-size: 28rpx;
+ font-size: 30rpx;
color: #F8FAFC;
font-weight: 600;
margin: 0 24rpx;
+ font-variant-numeric: tabular-nums;
}
}
}
@@ -425,14 +432,15 @@ const handlePay = () => {
bottom: 0;
left: 0;
right: 0;
- height: 120rpx;
+ height: calc(120rpx + env(safe-area-inset-bottom));
+ padding: 0 32rpx env(safe-area-inset-bottom);
+ box-sizing: border-box;
background-color: rgba(21, 29, 48, 0.95);
backdrop-filter: blur(12px);
border-top: 1px solid rgba(255, 255, 255, 0.08);
display: flex;
justify-content: space-between;
align-items: center;
- padding: 0 32rpx;
z-index: 100;
max-width: 450px;
margin: 0 auto;
@@ -449,6 +457,7 @@ const handlePay = () => {
font-size: 40rpx;
font-weight: 700;
color: #10B981;
+ font-variant-numeric: tabular-nums;
}
}
diff --git a/pwuniapp/pages/order/list.vue b/pwuniapp/pages/order/list.vue
index 93e1af5..a0faf79 100644
--- a/pwuniapp/pages/order/list.vue
+++ b/pwuniapp/pages/order/list.vue
@@ -179,7 +179,7 @@ const rateExpert = (id) => {
.order-list-container {
min-height: 100vh;
background-color: #0A0F1D;
- padding: 20rpx 32rpx 140rpx;
+ padding: 20rpx 32rpx calc(160rpx + env(safe-area-inset-bottom));
}
.tab-header {
@@ -333,6 +333,7 @@ const rateExpert = (id) => {
font-weight: 700;
color: #10B981;
display: block;
+ font-variant-numeric: tabular-nums;
}
.quantity-text {
font-size: 20rpx;
diff --git a/pwuniapp/pages/user/index.vue b/pwuniapp/pages/user/index.vue
index e814d4b..8fd5542 100644
--- a/pwuniapp/pages/user/index.vue
+++ b/pwuniapp/pages/user/index.vue
@@ -205,7 +205,7 @@ const navTo = (url) => {
.user-container {
min-height: 100vh;
background-color: #0A0F1D;
- padding: 24rpx 32rpx 140rpx;
+ padding: 24rpx 32rpx calc(160rpx + env(safe-area-inset-bottom));
}
.profile-card {
@@ -273,14 +273,32 @@ const navTo = (url) => {
.role-switch-card {
position: relative;
border-radius: 24rpx;
- background: linear-gradient(135deg, #1E1B4B 0%, #0F172A 100%);
- border: 2rpx solid #6366F1;
- box-shadow: 0 8rpx 28rpx rgba(99, 102, 241, 0.35);
- overflow: hidden;
padding: 28rpx;
margin-bottom: 28rpx;
+ overflow: hidden;
+ box-shadow: 0 8rpx 28rpx rgba(99, 102, 241, 0.35);
+
+ &::before {
+ content: '';
+ position: absolute;
+ inset: -50%;
+ background: conic-gradient(from 0deg, transparent 0%, #6366F1 25%, #10B981 50%, #6366F1 75%, transparent 100%);
+ animation: glowSpin 5s linear infinite;
+ z-index: 0;
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ inset: 2rpx;
+ background: linear-gradient(135deg, #1E1B4B 0%, #0F172A 100%);
+ border-radius: 22rpx;
+ z-index: 1;
+ }
.role-content {
+ position: relative;
+ z-index: 2;
display: flex;
justify-content: space-between;
align-items: center;
@@ -382,6 +400,7 @@ const navTo = (url) => {
font-size: 36rpx;
font-weight: 700;
margin-bottom: 14rpx;
+ font-variant-numeric: tabular-nums;
&.green-val {
color: #10B981;
@@ -503,4 +522,9 @@ const navTo = (url) => {
}
}
}
+
+@keyframes glowSpin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}