From e7e2b77906fa0c7e9fb92332e37ceb4f3a64d573 Mon Sep 17 00:00:00 2001 From: mars <3361409208@qq.com> Date: Tue, 7 Jul 2026 17:07:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(player):=20theme-3=20=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=AB=AF/PC=20=E5=8F=8C=E7=AB=AF=E6=8B=86=E5=88=86=E4=B8=8E?= =?UTF-8?q?=E6=A1=8C=E9=9D=A2=E6=8A=95=E6=B3=A8=E5=B7=A5=E4=BD=9C=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 DesktopShell 及桌面端首页、赛事、钱包、记录等页面,原 H5 视图迁移至 Mobile* 并由路由 wrapper 按视口切换。补齐右侧投注单栏、赔率快捷浮层、联赛/赛事侧栏、串关与定位能力;桌面下注成功改为全局 Toast,修复侧栏成功遮罩被裁剪与底部汇总黑底。同步悬浮客服、公告卡片、三语 i18n、桌面样式体系,以及 API 赛事与 shared 包相关调整。 --- AGENTS.md | 7 +- apps/admin/components.d.ts | 2 - .../applications/player/player.controller.ts | 2 +- .../src/domains/catalog/matches.service.ts | 4 +- apps/player/scripts/check-desktop-i18n.mjs | 44 + apps/player/src/App.vue | 2 + apps/player/src/assets/images/banner.svg | 18 +- .../src/assets/images/empty-matches.svg | 12 +- apps/player/src/components/AppToast.vue | 49 + .../src/components/BetSuccessOverlay.vue | 4 +- .../player/src/components/FloatingMailbox.vue | 471 ++++ .../src/components/HomeAnnouncementCard.vue | 250 ++ apps/player/src/components/MatchBetCard.vue | 414 +++- apps/player/src/components/RobotVerify.vue | 4 +- .../src/components/desktop/AccountSideNav.vue | 121 + .../src/components/desktop/BetSlipPanel.vue | 2005 +++++++++++++++++ .../src/components/desktop/DataTable.vue | 123 + .../components/desktop/DesktopAuthLayout.vue | 199 ++ .../desktop/DesktopBanner3DCarousel.vue | 471 ++++ .../components/desktop/DesktopBetSlipRail.vue | 163 ++ .../desktop/DesktopOddsBetPopover.vue | 458 ++++ .../desktop/DesktopOutrightEventCard.vue | 332 +++ .../src/components/desktop/DesktopShell.vue | 169 ++ .../src/components/desktop/DesktopTopNav.vue | 243 ++ .../desktop/DesktopWalletSubNav.vue | 46 + .../src/components/desktop/LeagueSidebar.vue | 363 +++ .../src/components/desktop/MatchSidebar.vue | 343 +++ .../components/desktop/OutrightSidebar.vue | 265 +++ .../src/components/desktop/Pagination.vue | 172 ++ .../components/desktop/SportsCategoryBar.vue | 108 + .../match-detail/CorrectScorePanel.vue | 75 +- .../match-detail/MarketSelectionsPanel.vue | 140 +- apps/player/src/composables/useAppToast.ts | 23 + .../src/composables/useDesktopBetLocate.ts | 42 + .../src/composables/useDesktopBetPopover.ts | 98 + .../composables/useDesktopParlayMatches.ts | 67 + .../src/composables/useFloatingMailbox.ts | 24 + .../player/src/composables/useMatchFilters.ts | 33 + .../src/composables/useOutrightEvents.ts | 68 + apps/player/src/composables/usePlayerHome.ts | 90 +- apps/player/src/composables/useViewport.ts | 28 + apps/player/src/i18n/en-US.ts | 156 +- apps/player/src/i18n/ms-MY.ts | 144 +- apps/player/src/i18n/zh-CN.ts | 152 +- apps/player/src/layouts/MainLayout.vue | 7 +- apps/player/src/main.ts | 1 + apps/player/src/router/index.ts | 31 +- apps/player/src/stores/betSlip.ts | 266 ++- apps/player/src/styles.css | 9 + apps/player/src/styles/desktop/index.css | 4 + .../player/src/styles/desktop/interaction.css | 102 + apps/player/src/styles/desktop/layout.css | 205 ++ apps/player/src/styles/desktop/records.css | 314 +++ apps/player/src/styles/desktop/tokens.css | 48 + .../src/utils/betPlaceConfirmMessage.ts | 49 + .../src/views/AnnouncementDetailView.vue | 319 +-- .../player/src/views/AnnouncementListView.vue | 179 +- .../player/src/views/AnnouncementsHubView.vue | 13 + apps/player/src/views/BetDetailView.vue | 632 +----- apps/player/src/views/CashbackRecordsView.vue | 410 +--- apps/player/src/views/FootballView.vue | 758 +------ apps/player/src/views/ForgotPasswordView.vue | 97 +- .../src/views/ForgotPasswordWrapperView.vue | 10 + apps/player/src/views/HomeView.vue | 574 +---- apps/player/src/views/InboxHubView.vue | 297 +-- apps/player/src/views/LoginView.vue | 102 +- apps/player/src/views/LoginWrapperView.vue | 10 + apps/player/src/views/MatchDetailView.vue | 994 +------- apps/player/src/views/MessageDetailView.vue | 390 +--- apps/player/src/views/MessagesHubView.vue | 13 + .../views/MobileAnnouncementDetailView.vue | 356 +++ .../src/views/MobileAnnouncementListView.vue | 299 +++ apps/player/src/views/MobileBetDetailView.vue | 630 ++++++ .../src/views/MobileCashbackRecordsView.vue | 408 ++++ apps/player/src/views/MobileFootballView.vue | 758 +++++++ apps/player/src/views/MobileHomeView.vue | 574 +++++ apps/player/src/views/MobileInboxHubView.vue | 299 +++ .../src/views/MobileMatchDetailView.vue | 994 ++++++++ .../src/views/MobileMessageDetailView.vue | 476 ++++ apps/player/src/views/MobileMyBetsView.vue | 225 ++ .../src/views/MobileOutrightDetailView.vue | 166 ++ .../src/views/MobileProfileEditView.vue | 564 +++++ apps/player/src/views/MobileProfileView.vue | 752 +++++++ .../src/views/MobileRechargeDetailView.vue | 343 +++ .../src/views/MobileRechargeHistoryView.vue | 840 +++++++ apps/player/src/views/MobileRechargeView.vue | 683 ++++++ .../src/views/MobileWalletDetailView.vue | 387 ++++ .../MobileWalletTransactionDetailView.vue | 391 ++++ apps/player/src/views/MobileWalletView.vue | 263 +++ apps/player/src/views/MyBetsView.vue | 227 +- apps/player/src/views/OutrightDetailView.vue | 12 + apps/player/src/views/ProfileEditView.vue | 566 +---- apps/player/src/views/ProfileView.vue | 754 +------ apps/player/src/views/RechargeDetailView.vue | 12 + apps/player/src/views/RechargeHistoryView.vue | 842 +------ apps/player/src/views/RechargeView.vue | 685 +----- apps/player/src/views/RegisterView.vue | 105 +- apps/player/src/views/RegisterWrapperView.vue | 10 + apps/player/src/views/WalletDetailView.vue | 389 +--- .../src/views/WalletTransactionDetailView.vue | 393 +--- apps/player/src/views/WalletView.vue | 265 +-- .../desktop/DesktopAnnouncementDetailView.vue | 31 + .../desktop/DesktopAnnouncementListView.vue | 327 +++ .../desktop/DesktopAnnouncementsHubShell.vue | 44 + .../views/desktop/DesktopBetDetailView.vue | 215 ++ .../desktop/DesktopCashbackRecordsView.vue | 183 ++ .../src/views/desktop/DesktopFootballView.vue | 465 ++++ .../desktop/DesktopForgotPasswordView.vue | 10 + .../src/views/desktop/DesktopHomeView.vue | 1593 +++++++++++++ .../src/views/desktop/DesktopInboxHubView.vue | 264 +++ .../src/views/desktop/DesktopLoginView.vue | 10 + .../views/desktop/DesktopMatchDetailView.vue | 839 +++++++ .../views/desktop/DesktopMessagesHubShell.vue | 182 ++ .../src/views/desktop/DesktopMyBetsView.vue | 198 ++ .../desktop/DesktopOutrightDetailView.vue | 334 +++ .../views/desktop/DesktopProfileEditView.vue | 395 ++++ .../src/views/desktop/DesktopProfileView.vue | 439 ++++ .../desktop/DesktopRechargeDetailView.vue | 429 ++++ .../desktop/DesktopRechargeHistoryView.vue | 143 ++ .../src/views/desktop/DesktopRechargeView.vue | 912 ++++++++ .../src/views/desktop/DesktopRegisterView.vue | 10 + .../views/desktop/DesktopWalletDetailView.vue | 192 ++ .../DesktopWalletTransactionDetailView.vue | 201 ++ .../src/views/desktop/DesktopWalletView.vue | 154 ++ docs/四套主题Docker部署任务.md | 4 +- 125 files changed, 26393 insertions(+), 8687 deletions(-) create mode 100644 apps/player/scripts/check-desktop-i18n.mjs create mode 100644 apps/player/src/components/AppToast.vue create mode 100644 apps/player/src/components/FloatingMailbox.vue create mode 100644 apps/player/src/components/HomeAnnouncementCard.vue create mode 100644 apps/player/src/components/desktop/AccountSideNav.vue create mode 100644 apps/player/src/components/desktop/BetSlipPanel.vue create mode 100644 apps/player/src/components/desktop/DataTable.vue create mode 100644 apps/player/src/components/desktop/DesktopAuthLayout.vue create mode 100644 apps/player/src/components/desktop/DesktopBanner3DCarousel.vue create mode 100644 apps/player/src/components/desktop/DesktopBetSlipRail.vue create mode 100644 apps/player/src/components/desktop/DesktopOddsBetPopover.vue create mode 100644 apps/player/src/components/desktop/DesktopOutrightEventCard.vue create mode 100644 apps/player/src/components/desktop/DesktopShell.vue create mode 100644 apps/player/src/components/desktop/DesktopTopNav.vue create mode 100644 apps/player/src/components/desktop/DesktopWalletSubNav.vue create mode 100644 apps/player/src/components/desktop/LeagueSidebar.vue create mode 100644 apps/player/src/components/desktop/MatchSidebar.vue create mode 100644 apps/player/src/components/desktop/OutrightSidebar.vue create mode 100644 apps/player/src/components/desktop/Pagination.vue create mode 100644 apps/player/src/components/desktop/SportsCategoryBar.vue create mode 100644 apps/player/src/composables/useAppToast.ts create mode 100644 apps/player/src/composables/useDesktopBetLocate.ts create mode 100644 apps/player/src/composables/useDesktopBetPopover.ts create mode 100644 apps/player/src/composables/useDesktopParlayMatches.ts create mode 100644 apps/player/src/composables/useFloatingMailbox.ts create mode 100644 apps/player/src/composables/useMatchFilters.ts create mode 100644 apps/player/src/composables/useOutrightEvents.ts create mode 100644 apps/player/src/composables/useViewport.ts create mode 100644 apps/player/src/styles/desktop/index.css create mode 100644 apps/player/src/styles/desktop/interaction.css create mode 100644 apps/player/src/styles/desktop/layout.css create mode 100644 apps/player/src/styles/desktop/records.css create mode 100644 apps/player/src/styles/desktop/tokens.css create mode 100644 apps/player/src/utils/betPlaceConfirmMessage.ts create mode 100644 apps/player/src/views/AnnouncementsHubView.vue create mode 100644 apps/player/src/views/ForgotPasswordWrapperView.vue create mode 100644 apps/player/src/views/LoginWrapperView.vue create mode 100644 apps/player/src/views/MessagesHubView.vue create mode 100644 apps/player/src/views/MobileAnnouncementDetailView.vue create mode 100644 apps/player/src/views/MobileAnnouncementListView.vue create mode 100644 apps/player/src/views/MobileBetDetailView.vue create mode 100644 apps/player/src/views/MobileCashbackRecordsView.vue create mode 100644 apps/player/src/views/MobileFootballView.vue create mode 100644 apps/player/src/views/MobileHomeView.vue create mode 100644 apps/player/src/views/MobileInboxHubView.vue create mode 100644 apps/player/src/views/MobileMatchDetailView.vue create mode 100644 apps/player/src/views/MobileMessageDetailView.vue create mode 100644 apps/player/src/views/MobileMyBetsView.vue create mode 100644 apps/player/src/views/MobileOutrightDetailView.vue create mode 100644 apps/player/src/views/MobileProfileEditView.vue create mode 100644 apps/player/src/views/MobileProfileView.vue create mode 100644 apps/player/src/views/MobileRechargeDetailView.vue create mode 100644 apps/player/src/views/MobileRechargeHistoryView.vue create mode 100644 apps/player/src/views/MobileRechargeView.vue create mode 100644 apps/player/src/views/MobileWalletDetailView.vue create mode 100644 apps/player/src/views/MobileWalletTransactionDetailView.vue create mode 100644 apps/player/src/views/MobileWalletView.vue create mode 100644 apps/player/src/views/OutrightDetailView.vue create mode 100644 apps/player/src/views/RechargeDetailView.vue create mode 100644 apps/player/src/views/RegisterWrapperView.vue create mode 100644 apps/player/src/views/desktop/DesktopAnnouncementDetailView.vue create mode 100644 apps/player/src/views/desktop/DesktopAnnouncementListView.vue create mode 100644 apps/player/src/views/desktop/DesktopAnnouncementsHubShell.vue create mode 100644 apps/player/src/views/desktop/DesktopBetDetailView.vue create mode 100644 apps/player/src/views/desktop/DesktopCashbackRecordsView.vue create mode 100644 apps/player/src/views/desktop/DesktopFootballView.vue create mode 100644 apps/player/src/views/desktop/DesktopForgotPasswordView.vue create mode 100644 apps/player/src/views/desktop/DesktopHomeView.vue create mode 100644 apps/player/src/views/desktop/DesktopInboxHubView.vue create mode 100644 apps/player/src/views/desktop/DesktopLoginView.vue create mode 100644 apps/player/src/views/desktop/DesktopMatchDetailView.vue create mode 100644 apps/player/src/views/desktop/DesktopMessagesHubShell.vue create mode 100644 apps/player/src/views/desktop/DesktopMyBetsView.vue create mode 100644 apps/player/src/views/desktop/DesktopOutrightDetailView.vue create mode 100644 apps/player/src/views/desktop/DesktopProfileEditView.vue create mode 100644 apps/player/src/views/desktop/DesktopProfileView.vue create mode 100644 apps/player/src/views/desktop/DesktopRechargeDetailView.vue create mode 100644 apps/player/src/views/desktop/DesktopRechargeHistoryView.vue create mode 100644 apps/player/src/views/desktop/DesktopRechargeView.vue create mode 100644 apps/player/src/views/desktop/DesktopRegisterView.vue create mode 100644 apps/player/src/views/desktop/DesktopWalletDetailView.vue create mode 100644 apps/player/src/views/desktop/DesktopWalletTransactionDetailView.vue create mode 100644 apps/player/src/views/desktop/DesktopWalletView.vue diff --git a/AGENTS.md b/AGENTS.md index 1295739..efb4de8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,11 +2,6 @@ > 给 AI 编程助手(Cursor 等)看的项目速查手册,浓缩开发约定与易错点。 > 人类日常开发请优先看 `README.md` 与 `docs/`。 - -如果你是AI请每次读了这个文件就在已有的次数上+1 - -当前被读次数: 3 - ## 目录 @@ -162,7 +157,7 @@ | --------- | ----------- | ------------------------------------------------------------------- | | `main` | 暗金主题 | 生产默认发版分支 | | `theme-2` | Pinnacle 蓝白 | 玩家 UI 与 main 分叉,**禁止** `git checkout main -- apps/player/...` 整文件覆盖 | -| `theme-3` | 统一移动端视觉 | 同 theme-2 | +| `theme-3` | Dusk Coral 珊瑚玻璃(移动 + PC双端) | 同 theme-2 | | `theme-4` | 海军蓝暗色极简 | 含悬浮客服等独有组件 | diff --git a/apps/admin/components.d.ts b/apps/admin/components.d.ts index b2383bf..fd79dd9 100644 --- a/apps/admin/components.d.ts +++ b/apps/admin/components.d.ts @@ -37,8 +37,6 @@ declare module 'vue' { ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup'] ElCol: typeof import('element-plus/es')['ElCol'] - ElCollapse: typeof import('element-plus/es')['ElCollapse'] - ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'] diff --git a/apps/api/src/applications/player/player.controller.ts b/apps/api/src/applications/player/player.controller.ts index f2f52c4..7a900ab 100644 --- a/apps/api/src/applications/player/player.controller.ts +++ b/apps/api/src/applications/player/player.controller.ts @@ -189,7 +189,7 @@ export class PlayerController { const [banners, announcements, allMatches, upcomingMatches, inboxEnabled] = await Promise.all([ this.content.listActive('BANNER', locale), this.content.listActiveAnnouncements(locale), - this.matches.listPublished(locale, undefined, { includeMarkets: false }), + this.matches.listPublished(locale, undefined, { includeMarkets: true }), this.matches.listUpcomingPublished(locale), this.systemConfig.getInboxFeatureEnabled(), ]); diff --git a/apps/api/src/domains/catalog/matches.service.ts b/apps/api/src/domains/catalog/matches.service.ts index e0139e1..ed48587 100644 --- a/apps/api/src/domains/catalog/matches.service.ts +++ b/apps/api/src/domains/catalog/matches.service.ts @@ -1625,14 +1625,14 @@ export class MatchesService { homeTeam: true, awayTeam: true, score: true, - markets: this.playerMarketStatusInclude, + markets: this.playerMarketInclude, }, orderBy: [{ startTime: 'asc' }, { displayOrder: 'asc' }], take: limit, }); return Promise.all( - matches.map((m) => this.enrichMatch(m, locale, { omitMarkets: true })), + matches.map((m) => this.enrichMatch(m, locale, { omitMarkets: false })), ); } diff --git a/apps/player/scripts/check-desktop-i18n.mjs b/apps/player/scripts/check-desktop-i18n.mjs new file mode 100644 index 0000000..25c1455 --- /dev/null +++ b/apps/player/scripts/check-desktop-i18n.mjs @@ -0,0 +1,44 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const root = path.join(__dirname, '..'); + +function flatten(obj, prefix = '') { + const out = {}; + for (const [k, v] of Object.entries(obj)) { + const key = prefix ? `${prefix}.${k}` : k; + if (v && typeof v === 'object' && !Array.isArray(v)) Object.assign(out, flatten(v, key)); + else out[key] = v; + } + return out; +} + +function extractKeysFromDir(dir) { + const keys = new Set(); + const re = /\bt\s*\(\s*['"`]([^'"`]+)['"`]/g; + function walk(d) { + for (const ent of fs.readdirSync(d, { withFileTypes: true })) { + const p = path.join(d, ent.name); + if (ent.isDirectory()) walk(p); + else if (ent.name.endsWith('.vue')) { + const src = fs.readFileSync(p, 'utf8'); + let m; + while ((m = re.exec(src))) keys.add(m[1]); + } + } + } + walk(dir); + return keys; +} + +const zhMod = await import('../src/i18n/zh-CN.ts'); +const zh = flatten(zhMod.default); +const dirs = ['src/views/desktop', 'src/components/desktop'].map((d) => path.join(root, d)); +const used = new Set(); +for (const d of dirs) extractKeysFromDir(d).forEach((k) => used.add(k)); + +const missing = [...used].filter((k) => !(k in zh)).sort(); +console.log(`Missing keys (${missing.length}):`); +missing.forEach((k) => console.log(` ${k}`)); diff --git a/apps/player/src/App.vue b/apps/player/src/App.vue index f4ac569..4acb453 100644 --- a/apps/player/src/App.vue +++ b/apps/player/src/App.vue @@ -1,8 +1,10 @@ diff --git a/apps/player/src/assets/images/banner.svg b/apps/player/src/assets/images/banner.svg index 56d644a..b999fd0 100644 --- a/apps/player/src/assets/images/banner.svg +++ b/apps/player/src/assets/images/banner.svg @@ -1,19 +1,19 @@ - - - + + + - - + + - - + + TheBet365 - 足球赛事火热进行中 - + 足球赛事火热进行中 + diff --git a/apps/player/src/assets/images/empty-matches.svg b/apps/player/src/assets/images/empty-matches.svg index 0aa0aa0..59d6233 100644 --- a/apps/player/src/assets/images/empty-matches.svg +++ b/apps/player/src/assets/images/empty-matches.svg @@ -1,8 +1,8 @@ diff --git a/apps/player/src/components/AppToast.vue b/apps/player/src/components/AppToast.vue new file mode 100644 index 0000000..6a19925 --- /dev/null +++ b/apps/player/src/components/AppToast.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/apps/player/src/components/BetSuccessOverlay.vue b/apps/player/src/components/BetSuccessOverlay.vue index 5ae21d3..e2b257f 100644 --- a/apps/player/src/components/BetSuccessOverlay.vue +++ b/apps/player/src/components/BetSuccessOverlay.vue @@ -124,8 +124,10 @@ onUnmounted(stop); .bet-success-overlay { position: fixed; inset: 0; - z-index: 300; + z-index: 5000; background: rgba(15, 32, 39, 0.88); + backdrop-filter: blur(6px); + -webkit-backdrop-filter: blur(6px); display: flex; align-items: center; justify-content: center; diff --git a/apps/player/src/components/FloatingMailbox.vue b/apps/player/src/components/FloatingMailbox.vue new file mode 100644 index 0000000..978cf53 --- /dev/null +++ b/apps/player/src/components/FloatingMailbox.vue @@ -0,0 +1,471 @@ + + + + + diff --git a/apps/player/src/components/HomeAnnouncementCard.vue b/apps/player/src/components/HomeAnnouncementCard.vue new file mode 100644 index 0000000..00eb10b --- /dev/null +++ b/apps/player/src/components/HomeAnnouncementCard.vue @@ -0,0 +1,250 @@ + + + + + diff --git a/apps/player/src/components/MatchBetCard.vue b/apps/player/src/components/MatchBetCard.vue index da3bb7d..56e02d8 100644 --- a/apps/player/src/components/MatchBetCard.vue +++ b/apps/player/src/components/MatchBetCard.vue @@ -1,9 +1,14 @@ diff --git a/apps/player/src/components/RobotVerify.vue b/apps/player/src/components/RobotVerify.vue index bd66452..ae53c0d 100644 --- a/apps/player/src/components/RobotVerify.vue +++ b/apps/player/src/components/RobotVerify.vue @@ -48,8 +48,8 @@ function drawCaptcha() { const ctx = canvas.getContext('2d'); if (!ctx) return; - const bg = cssVar('--captcha-canvas-bg', '#0d0d0d'); - const charBase = cssVar('--captcha-char', '#f0d875'); + const bg = cssVar('--captcha-canvas-bg', '#162D36'); + const charBase = cssVar('--captcha-char', '#F4A261'); const noiseRgb = cssVar('--captcha-noise-rgb', '255, 255, 255'); ctx.fillStyle = bg; diff --git a/apps/player/src/components/desktop/AccountSideNav.vue b/apps/player/src/components/desktop/AccountSideNav.vue new file mode 100644 index 0000000..73a3441 --- /dev/null +++ b/apps/player/src/components/desktop/AccountSideNav.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/apps/player/src/components/desktop/BetSlipPanel.vue b/apps/player/src/components/desktop/BetSlipPanel.vue new file mode 100644 index 0000000..97ab63f --- /dev/null +++ b/apps/player/src/components/desktop/BetSlipPanel.vue @@ -0,0 +1,2005 @@ + + + + + diff --git a/apps/player/src/components/desktop/DataTable.vue b/apps/player/src/components/desktop/DataTable.vue new file mode 100644 index 0000000..100c19c --- /dev/null +++ b/apps/player/src/components/desktop/DataTable.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/apps/player/src/components/desktop/DesktopAuthLayout.vue b/apps/player/src/components/desktop/DesktopAuthLayout.vue new file mode 100644 index 0000000..0afda48 --- /dev/null +++ b/apps/player/src/components/desktop/DesktopAuthLayout.vue @@ -0,0 +1,199 @@ + + + + + diff --git a/apps/player/src/components/desktop/DesktopBanner3DCarousel.vue b/apps/player/src/components/desktop/DesktopBanner3DCarousel.vue new file mode 100644 index 0000000..bac25ed --- /dev/null +++ b/apps/player/src/components/desktop/DesktopBanner3DCarousel.vue @@ -0,0 +1,471 @@ + + + + + diff --git a/apps/player/src/components/desktop/DesktopBetSlipRail.vue b/apps/player/src/components/desktop/DesktopBetSlipRail.vue new file mode 100644 index 0000000..8aeae6d --- /dev/null +++ b/apps/player/src/components/desktop/DesktopBetSlipRail.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/apps/player/src/components/desktop/DesktopOddsBetPopover.vue b/apps/player/src/components/desktop/DesktopOddsBetPopover.vue new file mode 100644 index 0000000..85acd8d --- /dev/null +++ b/apps/player/src/components/desktop/DesktopOddsBetPopover.vue @@ -0,0 +1,458 @@ + + + + + diff --git a/apps/player/src/components/desktop/DesktopOutrightEventCard.vue b/apps/player/src/components/desktop/DesktopOutrightEventCard.vue new file mode 100644 index 0000000..6cb20d2 --- /dev/null +++ b/apps/player/src/components/desktop/DesktopOutrightEventCard.vue @@ -0,0 +1,332 @@ + + + + + diff --git a/apps/player/src/components/desktop/DesktopShell.vue b/apps/player/src/components/desktop/DesktopShell.vue new file mode 100644 index 0000000..d9c592f --- /dev/null +++ b/apps/player/src/components/desktop/DesktopShell.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/apps/player/src/components/desktop/DesktopTopNav.vue b/apps/player/src/components/desktop/DesktopTopNav.vue new file mode 100644 index 0000000..e455fa4 --- /dev/null +++ b/apps/player/src/components/desktop/DesktopTopNav.vue @@ -0,0 +1,243 @@ + + + + + diff --git a/apps/player/src/components/desktop/DesktopWalletSubNav.vue b/apps/player/src/components/desktop/DesktopWalletSubNav.vue new file mode 100644 index 0000000..db241ef --- /dev/null +++ b/apps/player/src/components/desktop/DesktopWalletSubNav.vue @@ -0,0 +1,46 @@ + + + diff --git a/apps/player/src/components/desktop/LeagueSidebar.vue b/apps/player/src/components/desktop/LeagueSidebar.vue new file mode 100644 index 0000000..8191c80 --- /dev/null +++ b/apps/player/src/components/desktop/LeagueSidebar.vue @@ -0,0 +1,363 @@ + + + + + diff --git a/apps/player/src/components/desktop/MatchSidebar.vue b/apps/player/src/components/desktop/MatchSidebar.vue new file mode 100644 index 0000000..6e5c7ec --- /dev/null +++ b/apps/player/src/components/desktop/MatchSidebar.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/apps/player/src/components/desktop/OutrightSidebar.vue b/apps/player/src/components/desktop/OutrightSidebar.vue new file mode 100644 index 0000000..4ccc005 --- /dev/null +++ b/apps/player/src/components/desktop/OutrightSidebar.vue @@ -0,0 +1,265 @@ + + + + + diff --git a/apps/player/src/components/desktop/Pagination.vue b/apps/player/src/components/desktop/Pagination.vue new file mode 100644 index 0000000..91aed17 --- /dev/null +++ b/apps/player/src/components/desktop/Pagination.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/apps/player/src/components/desktop/SportsCategoryBar.vue b/apps/player/src/components/desktop/SportsCategoryBar.vue new file mode 100644 index 0000000..c195093 --- /dev/null +++ b/apps/player/src/components/desktop/SportsCategoryBar.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/apps/player/src/components/match-detail/CorrectScorePanel.vue b/apps/player/src/components/match-detail/CorrectScorePanel.vue index b9e2391..1ad8373 100644 --- a/apps/player/src/components/match-detail/CorrectScorePanel.vue +++ b/apps/player/src/components/match-detail/CorrectScorePanel.vue @@ -2,6 +2,7 @@ import { computed } from 'vue'; import { useI18n } from 'vue-i18n'; import { groupCorrectScoreSelections, type CsSelection } from '../../utils/correctScoreLayout'; +import { useDesktopBetPopover } from '../../composables/useDesktopBetPopover'; const props = defineProps<{ marketType: string; @@ -15,13 +16,16 @@ const props = defineProps<{ }>; isSelected: (id: string) => boolean; locked?: boolean; + /** PC 全宽紧凑:更小单元格、三列均分 */ + dense?: boolean; }>(); const emit = defineEmits<{ - pick: [id: string]; + pick: [id: string, event?: MouseEvent]; }>(); const { t } = useI18n(); +const { cancelClose } = useDesktopBetPopover(); const columns = computed(() => groupCorrectScoreSelections( @@ -34,9 +38,9 @@ const columns = computed(() => ), ); -function onPick(sel: CsSelection) { +function onPick(sel: CsSelection, event?: MouseEvent) { if (props.locked) return; - emit('pick', sel.id); + emit('pick', sel.id, event); } function formatOdds(odds: string) { @@ -46,7 +50,11 @@ function formatOdds(odds: string) {