style(player): theme-3 全站 h5bg2 背景与首页账单 UI 优化

This commit is contained in:
2026-06-23 17:57:34 +08:00
parent dd7ca2f4e4
commit fee34feee8
6 changed files with 106 additions and 47 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 697 KiB

View File

@@ -221,7 +221,7 @@ watch(
height: 100%; height: 100%;
min-height: 100dvh; min-height: 100dvh;
overflow: hidden; overflow: hidden;
background: var(--bg-body); background: transparent;
} }
.header { .header {
flex-shrink: 0; flex-shrink: 0;

View File

@@ -66,9 +66,19 @@
} }
/* ── Global resets ── */ /* ── Global resets ── */
html, body, #app { height: 100%; } html, body, #app { height: 100%; min-height: 100%; }
html {
-webkit-text-size-adjust: 100%;
text-size-adjust: 100%;
height: -webkit-fill-available;
}
body { body {
position: relative;
isolation: isolate;
min-height: 100%;
min-height: -webkit-fill-available;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
background-color: var(--bg-body); background-color: var(--bg-body);
color: var(--text); color: var(--text);
@@ -77,6 +87,36 @@ body {
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
body::before {
content: '';
position: fixed;
inset: 0;
z-index: -2;
pointer-events: none;
background-image: url('./assets/images/h5bg2.webp');
background-repeat: no-repeat;
background-position: center 240px;
background-size: 84% auto;
opacity: 0.55;
filter: saturate(0.9);
}
body::after {
content: '';
position: fixed;
inset: 0;
z-index: -1;
pointer-events: none;
background:
radial-gradient(ellipse 120% 60% at 50% -10%, rgba(244, 162, 97, 0.08), transparent 55%),
linear-gradient(rgba(15, 32, 39, 0.72), rgba(15, 32, 39, 0.82));
}
#app {
min-height: 100%;
min-height: -webkit-fill-available;
}
a { color: inherit; text-decoration: none; } a { color: inherit; text-decoration: none; }
button { cursor: pointer; border: none; font-family: inherit; } button { cursor: pointer; border: none; font-family: inherit; }
@@ -197,7 +237,6 @@ input:-webkit-autofill:active {
.qa-item, .qa-item,
.qe-item, .qe-item,
.league-block, .league-block,
.tx-list.glass-card,
.drawer, .drawer,
.slip-item, .slip-item,
.hero, .hero,
@@ -211,12 +250,6 @@ input:-webkit-autofill:active {
-webkit-backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
} }
.tx-list.glass-card {
border: 1px solid var(--glass-border);
border-radius: var(--radius-lg);
overflow: hidden;
}
.ps-gold-input { .ps-gold-input {
background: var(--bg-input) !important; background: var(--bg-input) !important;
border: 1px solid var(--border) !important; border: 1px solid var(--border) !important;

View File

@@ -66,36 +66,37 @@ function formatKickoff(startTime: string) {
<BannerCarousel :banners="banners" :fallback-to="bannerFallbackTo" /> <BannerCarousel :banners="banners" :fallback-to="bannerFallbackTo" />
<div class="hot-tabs" role="tablist" :aria-label="t('home.hot_matches')"> <section class="hot-panel">
<button <div class="hot-tabs" role="tablist" :aria-label="t('home.hot_matches')">
type="button" <button
role="tab" type="button"
class="hot-tab" role="tab"
:class="{ active: activeTab === 'hot' }" class="hot-tab"
:aria-selected="activeTab === 'hot'" :class="{ active: activeTab === 'hot' }"
@click="activeTab = 'hot'" :aria-selected="activeTab === 'hot'"
> @click="activeTab = 'hot'"
{{ t('home.hot_tab') }} >
</button> {{ t('home.hot_tab') }}
<button </button>
type="button" <button
role="tab" type="button"
class="hot-tab" role="tab"
:class="{ active: activeTab === 'upcoming' }" class="hot-tab"
:aria-selected="activeTab === 'upcoming'" :class="{ active: activeTab === 'upcoming' }"
@click="activeTab = 'upcoming'" :aria-selected="activeTab === 'upcoming'"
> @click="activeTab = 'upcoming'"
{{ t('home.upcoming_tab') }} >
</button> {{ t('home.upcoming_tab') }}
</div> </button>
</div>
<div <div
v-for="(match, index) in displayedMatches" v-for="(match, index) in displayedMatches"
:key="match.id" :key="match.id"
class="match-card" class="match-card"
:class="{ 'match-card--live-anim': activeTab === 'hot' && index < 3 }" :class="{ 'match-card--live-anim': activeTab === 'hot' && index < 3 }"
@click="goMatch(match.id)" @click="goMatch(match.id)"
> >
<div class="match-info"> <div class="match-info">
<div class="match-teams">{{ match.homeTeamName }} vs {{ match.awayTeamName }}</div> <div class="match-teams">{{ match.homeTeamName }} vs {{ match.awayTeamName }}</div>
<div class="match-time">{{ formatKickoff(match.startTime) }}</div> <div class="match-time">{{ formatKickoff(match.startTime) }}</div>
@@ -141,10 +142,11 @@ function formatKickoff(startTime: string) {
</div> </div>
</div> </div>
<div v-if="!loading && !displayedMatches.length" class="empty"> <div v-if="!loading && !displayedMatches.length" class="empty">
<img :src="emptyMatchesImg" alt="" class="empty-icon" /> <img :src="emptyMatchesImg" alt="" class="empty-icon" />
<p>{{ emptyMessage }}</p> <p>{{ emptyMessage }}</p>
</div> </div>
</section>
</div> </div>
</template> </template>
@@ -157,10 +159,20 @@ function formatKickoff(startTime: string) {
transition: height 0.15s ease; transition: height 0.15s ease;
} }
.hot-panel {
background: var(--glass-bg);
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
border: 1px solid var(--glass-border);
border-radius: var(--radius-lg);
overflow: hidden;
}
.hot-tabs { .hot-tabs {
display: flex; display: flex;
gap: 0; gap: 0;
margin-bottom: 12px; margin-bottom: 0;
background: rgba(15, 32, 39, 0.55);
border-bottom: 1px solid var(--border); border-bottom: 1px solid var(--border);
} }
@@ -287,6 +299,15 @@ function formatKickoff(startTime: string) {
line-height: 1.3; line-height: 1.3;
} }
.hot-panel .match-card {
background: transparent;
border: none;
border-bottom: 1px solid var(--border);
box-shadow: none;
backdrop-filter: none;
-webkit-backdrop-filter: none;
}
.match-card { .match-card {
position: relative; position: relative;
isolation: isolate; isolation: isolate;
@@ -294,15 +315,19 @@ function formatKickoff(startTime: string) {
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
gap: 8px; gap: 8px;
margin-bottom: 8px; margin-bottom: 0;
padding: 10px 12px; padding: 10px 12px;
min-height: 60px; min-height: 60px;
border-radius: var(--radius-lg); border-radius: 0;
cursor: pointer; cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s; transition: transform 0.2s, box-shadow 0.2s;
overflow: hidden; overflow: hidden;
} }
.hot-panel .match-card:last-of-type {
border-bottom: none;
}
.match-card::before { .match-card::before {
content: ''; content: '';
position: absolute; position: absolute;
@@ -538,6 +563,7 @@ function formatKickoff(startTime: string) {
color: var(--text-muted); color: var(--text-muted);
padding: 28px 16px; padding: 28px 16px;
font-weight: 600; font-weight: 600;
border-top: 1px solid var(--border);
} }
.empty-icon { .empty-icon {

View File

@@ -187,7 +187,7 @@ const pullIndicatorStyle = () => ({
</button> </button>
</div> </div>
<div v-if="items.length" class="tx-list glass-card"> <div v-if="items.length" class="tx-list">
<button <button
v-for="tx in items" v-for="tx in items"
:key="tx.transactionId" :key="tx.transactionId"

View File

@@ -110,7 +110,7 @@ const pullIndicatorStyle = () => ({
>{{ t('wallet.view_all') }} &#x203A;</button> >{{ t('wallet.view_all') }} &#x203A;</button>
</div> </div>
<div v-if="items.length" class="tx-list glass-card"> <div v-if="items.length" class="tx-list">
<button <button
v-for="tx in items" v-for="tx in items"
:key="tx.transactionId" :key="tx.transactionId"