diff --git a/apps/admin/src/views/match-form.ts b/apps/admin/src/views/match-form.ts index 8a5d055..b406955 100644 --- a/apps/admin/src/views/match-form.ts +++ b/apps/admin/src/views/match-form.ts @@ -81,6 +81,8 @@ export interface AdminMarket { lineValue: number | null; paramsJson?: Record | null; status: string; + allowSingle?: boolean; + allowParlay?: boolean; showOnPlayer: boolean; promoLabel: string; promoLabelI18n?: Record; diff --git a/apps/admin/src/views/matches/MatchMarketsPanel.vue b/apps/admin/src/views/matches/MatchMarketsPanel.vue index afa8c0d..1c20c00 100644 --- a/apps/admin/src/views/matches/MatchMarketsPanel.vue +++ b/apps/admin/src/views/matches/MatchMarketsPanel.vue @@ -198,8 +198,8 @@ function mapMarkets(detail: AdminMatchDetail) { lineValue: m.lineValue, paramsJson: m.paramsJson ?? null, status: m.status, - allowSingle: true, - allowParlay: true, + allowSingle: m.allowSingle ?? true, + allowParlay: m.allowParlay ?? true, showOnPlayer: m.showOnPlayer ?? true, sortOrder: m.sortOrder ?? index, promoLabel: m.promoLabel ?? '', diff --git a/apps/api/src/domains/catalog/matches.service.ts b/apps/api/src/domains/catalog/matches.service.ts index 9b24b97..179a8c1 100644 --- a/apps/api/src/domains/catalog/matches.service.ts +++ b/apps/api/src/domains/catalog/matches.service.ts @@ -871,6 +871,8 @@ export class MatchesService { lineValue: m.lineValue != null ? Number(m.lineValue) : null, paramsJson: m.paramsJson ?? null, status: m.status, + allowSingle: m.allowSingle, + allowParlay: m.allowParlay, showOnPlayer: m.showOnPlayer, promoLabel: m.promoLabel ?? '', promoLabelI18n: sanitizeLocalizedText(m.promoLabelI18n), diff --git a/apps/player/index.html b/apps/player/index.html index c799e95..0499639 100644 --- a/apps/player/index.html +++ b/apps/player/index.html @@ -3,13 +3,13 @@ - + TheBet365 diff --git a/apps/player/src/components/BetSuccessOverlay.vue b/apps/player/src/components/BetSuccessOverlay.vue index 8c82f30..3eacebe 100644 --- a/apps/player/src/components/BetSuccessOverlay.vue +++ b/apps/player/src/components/BetSuccessOverlay.vue @@ -16,7 +16,7 @@ interface Particle { color: string; shape: number; } -const COLORS = ['#D4AF37', '#FFD700', '#F0C040', '#C8A02E', '#E6C84C', '#B8960C']; +const COLORS = ['#FFFFFF', '#FFD700', '#F0C040', '#C8A02E', '#E6C84C', '#B8960C']; let w = 0; let h = 0; @@ -111,8 +111,8 @@ onUnmounted(stop);
- - + +

{{ t('bet.place_success') }}

@@ -151,6 +151,7 @@ onUnmounted(stop); .check { width: 72px; height: 72px; + color: var(--primary); } .check-circle { diff --git a/apps/player/src/components/CashBalanceChip.vue b/apps/player/src/components/CashBalanceChip.vue index d104b25..b048b63 100644 --- a/apps/player/src/components/CashBalanceChip.vue +++ b/apps/player/src/components/CashBalanceChip.vue @@ -112,12 +112,12 @@ onUnmounted(() => { align-items: center; gap: 4px; height: 36px; - padding: 0 8px 0 8px; + padding: 0 10px; min-width: 0; cursor: pointer; border: 1px solid var(--border); - border-radius: 6px; - background: #141414; + border-radius: var(--radius-sm); + background: var(--bg-card); box-sizing: border-box; } @@ -130,8 +130,8 @@ onUnmounted(() => { .chip-label { font-size: 8px; - color: var(--text-muted); - font-weight: 600; + color: var(--text-dim); + font-weight: 500; letter-spacing: 0.02em; white-space: nowrap; overflow: hidden; @@ -142,15 +142,16 @@ onUnmounted(() => { .chip-amount { font-size: 11px; - font-weight: 800; - color: var(--primary-light); + font-weight: 600; + color: var(--text); white-space: nowrap; line-height: 1.15; + font-variant-numeric: tabular-nums; } .chevron { font-size: 10px; - color: var(--primary-light); + color: var(--text-muted); transition: transform 0.2s; margin-left: 0; } @@ -166,9 +167,11 @@ onUnmounted(() => { width: min(260px, 78vw); padding: 12px 14px; z-index: 130; - border: 1px solid var(--border); + border: 1px solid var(--border-strong); border-radius: var(--radius-sm); - background: #141414; + background: var(--dropdown-bg); + backdrop-filter: none; + -webkit-backdrop-filter: none; box-shadow: var(--shadow); } @@ -181,8 +184,9 @@ onUnmounted(() => { justify-content: space-between; gap: 12px; font-size: 13px; - font-weight: 600; + font-weight: 500; padding: 6px 0; + font-variant-numeric: tabular-nums; } .panel-row.muted { @@ -190,14 +194,14 @@ onUnmounted(() => { } .panel-row.highlight { - color: var(--primary-light); - font-weight: 800; + color: var(--text); + font-weight: 600; font-size: 14px; } .panel-divider { height: 1px; - background: linear-gradient(90deg, transparent, var(--border-gold-soft), transparent); + background: var(--border); margin: 4px 0; } @@ -205,18 +209,18 @@ onUnmounted(() => { width: 100%; padding: 8px 0; margin-top: 4px; - border-radius: 6px; - border: 1px solid var(--primary, #c8a84e); - background: rgba(200, 168, 78, 0.12); - color: var(--primary-light, #c8a84e); + border-radius: var(--radius-sm); + border: none; + background: var(--primary); + color: var(--on-primary); font-size: 13px; - font-weight: 700; + font-weight: 600; cursor: pointer; - transition: background 0.2s; + transition: opacity 0.15s ease; } .panel-recharge-btn:active { - background: rgba(200, 168, 78, 0.24); + opacity: 0.88; } .backdrop { diff --git a/apps/player/src/components/CustomerServiceModal.vue b/apps/player/src/components/CustomerServiceModal.vue index fb1886d..f00bd7f 100644 --- a/apps/player/src/components/CustomerServiceModal.vue +++ b/apps/player/src/components/CustomerServiceModal.vue @@ -87,11 +87,11 @@ function close() { flex-direction: column; width: min(100%, 420px); height: min(82vh, 680px); - background: #141414; - border: 1px solid var(--border-gold-soft, rgba(200, 168, 78, 0.25)); - border-radius: 12px; + background: var(--bg-card); + border: 1px solid var(--border-gold-soft); + border-radius: var(--radius); overflow: hidden; - box-shadow: 0 16px 48px rgba(0, 0, 0, 0.55); + box-shadow: var(--shadow); } .cs-header { @@ -101,21 +101,21 @@ function close() { justify-content: space-between; gap: 12px; padding: 14px 16px; - border-bottom: 1px solid var(--border, #2a2a2a); - background: rgba(26, 26, 26, 0.98); + border-bottom: 1px solid var(--border); + background: var(--bg-elevated); } .cs-title { margin: 0; font-size: 16px; font-weight: 800; - color: var(--primary-light, #c8a84e); + color: var(--primary-light); } .close-btn { background: none; border: none; - color: #666; + color: var(--text-muted); font-size: 18px; cursor: pointer; padding: 4px; @@ -123,13 +123,13 @@ function close() { } .close-btn:hover { - color: #aaa; + color: var(--text); } .cs-body { flex: 1; min-height: 0; - background: #0d0d0d; + background: var(--bg-body); } .cs-frame { @@ -150,7 +150,7 @@ function close() { text-align: center; font-size: 14px; line-height: 1.6; - color: #888; + color: var(--text-muted); } .fade-enter-active, diff --git a/apps/player/src/components/GoldSpinner.vue b/apps/player/src/components/GoldSpinner.vue index cf6186e..29cb828 100644 --- a/apps/player/src/components/GoldSpinner.vue +++ b/apps/player/src/components/GoldSpinner.vue @@ -1,102 +1,114 @@ + + + + + diff --git a/apps/player/src/components/LeagueAccordionItem.vue b/apps/player/src/components/LeagueAccordionItem.vue index a3e1526..909bb94 100644 --- a/apps/player/src/components/LeagueAccordionItem.vue +++ b/apps/player/src/components/LeagueAccordionItem.vue @@ -49,7 +49,7 @@ const openCount = computed(() => props.matches.filter(m => m.matchPhase === 'ope