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;