From 9daf919d8897909825e4ac0a24a53da0256d397f Mon Sep 17 00:00:00 2001 From: Mars <3361409208a@gmail.com> Date: Wed, 1 Jul 2026 17:59:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(player):=20=E4=BC=98=E5=8C=96=E6=A1=8C?= =?UTF-8?q?=E9=9D=A2=E7=AB=AF=E4=BC=98=E8=83=9C=E5=86=A0=E5=86=9B=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=BB=84=E4=BB=B6=E4=B8=8E=E4=BE=A7=E8=BE=B9=E6=A0=8F?= =?UTF-8?q?=E5=B8=83=E5=B1=80=EF=BC=8C=E9=80=82=E9=85=8D=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/player/src/components/AppToast.vue | 8 +- .../src/components/LeagueAccordionItem.vue | 3 - .../src/components/desktop/DesktopShell.vue | 9 +- .../src/components/desktop/LeagueSidebar.vue | 95 +++++-- .../components/desktop/OutrightSidebar.vue | 265 ++++++++++++++++++ .../components/outright/OutrightBetModal.vue | 6 +- .../outright/OutrightEventSection.vue | 13 - .../outright/OutrightOptionCard.vue | 43 ++- .../src/views/desktop/DesktopHomeView.vue | 6 + .../desktop/DesktopOutrightDetailView.vue | 11 - 10 files changed, 370 insertions(+), 89 deletions(-) create mode 100644 apps/player/src/components/desktop/OutrightSidebar.vue diff --git a/apps/player/src/components/AppToast.vue b/apps/player/src/components/AppToast.vue index 6b68d8c..ebbe787 100644 --- a/apps/player/src/components/AppToast.vue +++ b/apps/player/src/components/AppToast.vue @@ -24,10 +24,10 @@ const { visible, message } = useAppToast(); max-width: min(90vw, 360px); padding: 10px 18px; border-radius: 8px; - border: 1px solid var(--border-gold-soft); - background: rgba(22, 22, 22, 0.96); - box-shadow: 0 8px 28px rgba(0, 0, 0, 0.45); - color: var(--primary-light); + border: 1px solid var(--primary); + background: var(--bg-card); + box-shadow: 0 8px 28px rgba(0, 0, 0, 0.15); + color: var(--primary); font-size: 13px; font-weight: 700; text-align: center; diff --git a/apps/player/src/components/LeagueAccordionItem.vue b/apps/player/src/components/LeagueAccordionItem.vue index 05409fb..dfcd0de 100644 --- a/apps/player/src/components/LeagueAccordionItem.vue +++ b/apps/player/src/components/LeagueAccordionItem.vue @@ -3,9 +3,6 @@ import { computed } from 'vue'; import { useI18n } from 'vue-i18n'; import MatchBetCard from './MatchBetCard.vue'; import saishiImg from '../assets/images/saishi.webp'; -import cardBg from '../assets/images/card-bg.webp'; - -const matchCardBg = `url(${cardBg})`; const props = defineProps<{ leagueId: string; diff --git a/apps/player/src/components/desktop/DesktopShell.vue b/apps/player/src/components/desktop/DesktopShell.vue index 9027081..c5fc215 100644 --- a/apps/player/src/components/desktop/DesktopShell.vue +++ b/apps/player/src/components/desktop/DesktopShell.vue @@ -7,6 +7,7 @@ import DesktopOddsBetPopover from './DesktopOddsBetPopover.vue'; import SportsCategoryBar from './SportsCategoryBar.vue'; import LeagueSidebar from './LeagueSidebar.vue'; import MatchSidebar from './MatchSidebar.vue'; +import OutrightSidebar from './OutrightSidebar.vue'; import DesktopBetSlipRail from './DesktopBetSlipRail.vue'; import FloatingMailbox from '../FloatingMailbox.vue'; import AnnouncementMarquee from '../AnnouncementMarquee.vue'; @@ -43,6 +44,9 @@ const layoutMode = computed<'betting' | 'account' | 'hub' | 'marketing'>(() => { }); const isMatchDetail = computed(() => route.path.startsWith('/match/')); +const isDetailPage = computed( + () => route.path.startsWith('/match/') || route.path.startsWith('/outright/'), +); const isBettingDetail = computed( () => route.path.startsWith('/match/') || route.path.startsWith('/outright/'), ); @@ -98,8 +102,9 @@ watch(
diff --git a/apps/player/src/components/desktop/LeagueSidebar.vue b/apps/player/src/components/desktop/LeagueSidebar.vue index 24e54e1..2aac451 100644 --- a/apps/player/src/components/desktop/LeagueSidebar.vue +++ b/apps/player/src/components/desktop/LeagueSidebar.vue @@ -1,21 +1,37 @@ + + + + diff --git a/apps/player/src/components/outright/OutrightBetModal.vue b/apps/player/src/components/outright/OutrightBetModal.vue index 96fc290..0106269 100644 --- a/apps/player/src/components/outright/OutrightBetModal.vue +++ b/apps/player/src/components/outright/OutrightBetModal.vue @@ -545,7 +545,7 @@ function formatOdds(odds: string) { align-items: center; padding: 8px 10px; margin-bottom: 12px; - background: rgba(0, 0, 0, 0.35); + background: var(--bg-hover); border: 1px solid var(--border); border-radius: 6px; } @@ -646,7 +646,7 @@ function formatOdds(odds: string) { .btn-cancel { padding: 10px; border-radius: 6px; - background: #1a1a1a; + background: var(--bg-card); border: 1px solid var(--border); color: var(--text-muted); font-size: 14px; @@ -687,7 +687,7 @@ function formatOdds(odds: string) { .summary { margin: 12px 0 14px; padding: 10px; - background: rgba(0, 0, 0, 0.35); + background: var(--bg-hover); border: 1px solid var(--border); border-radius: 6px; } diff --git a/apps/player/src/components/outright/OutrightEventSection.vue b/apps/player/src/components/outright/OutrightEventSection.vue index 3692f22..09779d0 100644 --- a/apps/player/src/components/outright/OutrightEventSection.vue +++ b/apps/player/src/components/outright/OutrightEventSection.vue @@ -3,9 +3,6 @@ import { computed } from 'vue'; import { useI18n } from 'vue-i18n'; import OutrightOptionCard from './OutrightOptionCard.vue'; import saishiImg from '../../assets/images/saishi.webp'; -import cardBg from '../../assets/images/card-bg.webp'; - -const matchCardBg = `url(${cardBg})`; export interface OutrightSelection { id: string; @@ -117,16 +114,6 @@ const isSettled = computed(() => props.event.bettingOpen === false || props.even cursor: pointer; } -.event-head::before { - content: ''; - position: absolute; - inset: 0; - background: v-bind(matchCardBg) center / 100% 100% no-repeat; - opacity: 0.25; - z-index: -1; - pointer-events: none; -} - .toggle-icon { flex-shrink: 0; width: 26px; diff --git a/apps/player/src/components/outright/OutrightOptionCard.vue b/apps/player/src/components/outright/OutrightOptionCard.vue index d987974..223701d 100644 --- a/apps/player/src/components/outright/OutrightOptionCard.vue +++ b/apps/player/src/components/outright/OutrightOptionCard.vue @@ -86,42 +86,37 @@ onUnmounted(() => { position: relative; width: 100%; min-width: 0; - padding: 8px 4px 6px; - border-radius: 6px; - background: linear-gradient(180deg, #1a1a1a 0%, #0d0d0d 100%); - border: 1px solid rgba(140, 140, 140, 0.35); + padding: 10px 4px 8px; + border-radius: 8px; + background: var(--bg-card); + border: 1px solid var(--border); display: flex; flex-direction: column; align-items: center; - gap: 4px; + gap: 6px; text-align: center; overflow: hidden; + transition: all 0.2s ease; + cursor: pointer; } -.option-card::before { - content: ''; - position: absolute; - inset: 0; - background: linear-gradient(135deg, rgba(100, 100, 100, 0.08) 0%, transparent 50%, rgba(80, 80, 80, 0.05) 100%); - pointer-events: none; +.option-card:hover:not(.option-card--disabled) { + border-color: var(--border-active); + background: var(--bg-hover) !important; } -.option-card:active { - border-color: var(--border-gold-soft); +.option-card:active:not(.option-card--disabled) { + border-color: var(--primary); } .option-card--disabled { cursor: default; - opacity: 0.72; -} - -.option-card--disabled:active { - border-color: rgba(140, 140, 140, 0.35); + opacity: 0.6; } .option-card--winner { - border-color: rgba(201, 162, 39, 0.75); - box-shadow: 0 0 0 1px rgba(201, 162, 39, 0.25); + border-color: var(--primary); + box-shadow: 0 0 0 1px var(--primary); } .flag { @@ -143,8 +138,8 @@ onUnmounted(() => { .name { font-size: 11px; - font-weight: 800; - color: var(--primary-light); + font-weight: 700; + color: var(--text); line-height: 1.2; width: 100%; overflow: hidden; @@ -153,8 +148,8 @@ onUnmounted(() => { } .odds { - font-size: 11px; + font-size: 12px; font-weight: 800; - color: var(--primary-light); + color: var(--odds-accent); } diff --git a/apps/player/src/views/desktop/DesktopHomeView.vue b/apps/player/src/views/desktop/DesktopHomeView.vue index cb3a604..2680d1f 100644 --- a/apps/player/src/views/desktop/DesktopHomeView.vue +++ b/apps/player/src/views/desktop/DesktopHomeView.vue @@ -797,12 +797,14 @@ function setFeaturedIndex(index: number) { justify-content: space-between; align-items: center; gap: 8px; + min-width: 0; } .top-meta { display: flex; align-items: center; gap: 6px; + flex-shrink: 0; } .league-tag { @@ -816,6 +818,8 @@ function setFeaturedIndex(index: number) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; + flex: 1; + min-width: 0; } .live-indicator { @@ -839,6 +843,7 @@ function setFeaturedIndex(index: number) { display: flex; flex-direction: column; gap: 4px; + min-width: 0; } .vs-text { @@ -855,6 +860,7 @@ function setFeaturedIndex(index: number) { display: flex; align-items: center; gap: 8px; + min-width: 0; } .team-name { diff --git a/apps/player/src/views/desktop/DesktopOutrightDetailView.vue b/apps/player/src/views/desktop/DesktopOutrightDetailView.vue index 6fc519a..2d2b263 100644 --- a/apps/player/src/views/desktop/DesktopOutrightDetailView.vue +++ b/apps/player/src/views/desktop/DesktopOutrightDetailView.vue @@ -9,10 +9,8 @@ import OutrightBetModal, { type OutrightPick } from '../../components/outright/O import { useAuthStore } from '../../stores/auth'; import GoldSpinner from '../../components/GoldSpinner.vue'; import saishiImg from '../../assets/images/saishi.webp'; -import cardBg from '../../assets/images/card-bg.webp'; import { useDesktopBetLocate, scrollToBetSelection } from '../../composables/useDesktopBetLocate'; -const matchCardBg = `url(${cardBg})`; const ODDS_POLL_MS = 15000; const route = useRoute(); @@ -241,15 +239,6 @@ onUnmounted(stopPolling); overflow: hidden; } -.event-hero::before { - content: ''; - position: absolute; - inset: 0; - background: v-bind(matchCardBg) center / 100% 100% no-repeat; - opacity: 0.22; - pointer-events: none; -} - .hero-text { position: relative; z-index: 1;