diff --git a/AGENTS.md b/AGENTS.md index c6a7f31..072603f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -90,6 +90,14 @@ - 管理端切页慢的分析与优化任务见 `docs/admin-page-switch-performance.md`。 - **不要**把 `apps/player/dist/` 提交进 Git;生产由 Docker 构建生成静态资源。 +### 玩家端主题生图约束 + +- 生成 `apps/player` 主题图片资源时,必须先查看并参考现有同场景资源,优先保持当前暗金足球主题一致,不要另起一套风格。 +- PC 首页/赛事详情/弹窗类赛事面板应优先对齐 `apps/player/src/assets/images/generated/pc-featured-match-bg-v1.webp`:暗金球场、中央 V 型光线、薄金色边框、低亮度背景、内容区域干净。 +- 弹窗资源必须是“带完整边框的面板图”,不能只是普通背景图;四边边框要在图片内完整可见,中心区域要足够暗且简洁,保证文字可读。 +- 避免生成过度写实、照片质感过重、厚重金属、强眩光、烟雾、人物、旗帜、logo、文字、数字;也不要生成与主题不一致的纯矢量科幻线框风。 +- 生成资源默认输出 WebP,控制体积,文件放在 `apps/player/src/assets/images/generated/`,命名带清晰场景和版本号(如 `modal-gold-frame-v4.webp`)。 + ## i18n 改文案流程 支持语言均为 **zh-CN / en-US / ms-MY**(马来语)。改文案须**三语同步**,不要只改中文。 @@ -209,4 +217,3 @@ - 不要提交 `.env`、`.env.docker`、镜像 tar、`apps/*/dist/`。 - 改 player 主题相关文件时,先确认当前分支是 `main` 还是 `theme-`*,避免用错 CSS 变量(如 theme-2 无 `--gold`)。 - 管理端改列表页性能时,参考 `docs/admin-page-switch-performance.md` 任务清单,优先 KeepAlive + 缓存而非盲目减 API 字段。 - diff --git a/apps/player/src/assets/images/generated/detail-ledger-ticket-bg-v1.webp b/apps/player/src/assets/images/generated/detail-ledger-ticket-bg-v1.webp new file mode 100644 index 0000000..c9868e9 Binary files /dev/null and b/apps/player/src/assets/images/generated/detail-ledger-ticket-bg-v1.webp differ diff --git a/apps/player/src/assets/images/generated/empty-matches-stadium-v1.webp b/apps/player/src/assets/images/generated/empty-matches-stadium-v1.webp new file mode 100644 index 0000000..7b98fc6 Binary files /dev/null and b/apps/player/src/assets/images/generated/empty-matches-stadium-v1.webp differ diff --git a/apps/player/src/assets/images/generated/floating-mailbox-fab-v1.webp b/apps/player/src/assets/images/generated/floating-mailbox-fab-v1.webp new file mode 100644 index 0000000..158de38 Binary files /dev/null and b/apps/player/src/assets/images/generated/floating-mailbox-fab-v1.webp differ diff --git a/apps/player/src/assets/images/generated/home-tab-frame-gold-v1.webp b/apps/player/src/assets/images/generated/home-tab-frame-gold-v1.webp new file mode 100644 index 0000000..5baa703 Binary files /dev/null and b/apps/player/src/assets/images/generated/home-tab-frame-gold-v1.webp differ diff --git a/apps/player/src/assets/images/generated/match-card-bg-gold-arena-v1.webp b/apps/player/src/assets/images/generated/match-card-bg-gold-arena-v1.webp new file mode 100644 index 0000000..1338bf6 Binary files /dev/null and b/apps/player/src/assets/images/generated/match-card-bg-gold-arena-v1.webp differ diff --git a/apps/player/src/assets/images/generated/match-card-bg-gold-stadium-v1.webp b/apps/player/src/assets/images/generated/match-card-bg-gold-stadium-v1.webp new file mode 100644 index 0000000..7ec3e4f Binary files /dev/null and b/apps/player/src/assets/images/generated/match-card-bg-gold-stadium-v1.webp differ diff --git a/apps/player/src/assets/images/generated/match-card-bg-gold-tunnel-v1.webp b/apps/player/src/assets/images/generated/match-card-bg-gold-tunnel-v1.webp new file mode 100644 index 0000000..0e22524 Binary files /dev/null and b/apps/player/src/assets/images/generated/match-card-bg-gold-tunnel-v1.webp differ diff --git a/apps/player/src/assets/images/generated/modal-gold-frame-v1.webp b/apps/player/src/assets/images/generated/modal-gold-frame-v1.webp new file mode 100644 index 0000000..8f1bd51 Binary files /dev/null and b/apps/player/src/assets/images/generated/modal-gold-frame-v1.webp differ diff --git a/apps/player/src/assets/images/generated/modal-gold-frame-v2.webp b/apps/player/src/assets/images/generated/modal-gold-frame-v2.webp new file mode 100644 index 0000000..ab0a52e Binary files /dev/null and b/apps/player/src/assets/images/generated/modal-gold-frame-v2.webp differ diff --git a/apps/player/src/assets/images/generated/modal-gold-frame-v3.webp b/apps/player/src/assets/images/generated/modal-gold-frame-v3.webp new file mode 100644 index 0000000..021e3e3 Binary files /dev/null and b/apps/player/src/assets/images/generated/modal-gold-frame-v3.webp differ diff --git a/apps/player/src/assets/images/generated/modal-gold-frame-v4.webp b/apps/player/src/assets/images/generated/modal-gold-frame-v4.webp new file mode 100644 index 0000000..a8fad75 Binary files /dev/null and b/apps/player/src/assets/images/generated/modal-gold-frame-v4.webp differ diff --git a/apps/player/src/assets/images/generated/outright-bet-modal-frame-v1.webp b/apps/player/src/assets/images/generated/outright-bet-modal-frame-v1.webp new file mode 100644 index 0000000..9b7f987 Binary files /dev/null and b/apps/player/src/assets/images/generated/outright-bet-modal-frame-v1.webp differ diff --git a/apps/player/src/assets/images/generated/outright-bet-modal-frame-v2.webp b/apps/player/src/assets/images/generated/outright-bet-modal-frame-v2.webp new file mode 100644 index 0000000..070829b Binary files /dev/null and b/apps/player/src/assets/images/generated/outright-bet-modal-frame-v2.webp differ diff --git a/apps/player/src/assets/images/generated/pc-betslip-btn-primary-pressed-v1.webp b/apps/player/src/assets/images/generated/pc-betslip-btn-primary-pressed-v1.webp new file mode 100644 index 0000000..a806cd5 Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-betslip-btn-primary-pressed-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-betslip-btn-primary-v1.webp b/apps/player/src/assets/images/generated/pc-betslip-btn-primary-v1.webp new file mode 100644 index 0000000..c9df9f9 Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-betslip-btn-primary-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-betslip-btn-secondary-pressed-v1.webp b/apps/player/src/assets/images/generated/pc-betslip-btn-secondary-pressed-v1.webp new file mode 100644 index 0000000..4d198e9 Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-betslip-btn-secondary-pressed-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-betslip-btn-secondary-v1.webp b/apps/player/src/assets/images/generated/pc-betslip-btn-secondary-v1.webp new file mode 100644 index 0000000..35c06df Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-betslip-btn-secondary-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-betslip-sidebar-bg-v1.webp b/apps/player/src/assets/images/generated/pc-betslip-sidebar-bg-v1.webp new file mode 100644 index 0000000..6f2f79b Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-betslip-sidebar-bg-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-featured-match-bg-v1.webp b/apps/player/src/assets/images/generated/pc-featured-match-bg-v1.webp new file mode 100644 index 0000000..b9e50ba Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-featured-match-bg-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-global-bg-v1.webp b/apps/player/src/assets/images/generated/pc-global-bg-v1.webp new file mode 100644 index 0000000..a17608c Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-global-bg-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-match-detail-bg-v1.webp b/apps/player/src/assets/images/generated/pc-match-detail-bg-v1.webp new file mode 100644 index 0000000..116f3fa Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-match-detail-bg-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-match-list-card-bg-v1.webp b/apps/player/src/assets/images/generated/pc-match-list-card-bg-v1.webp new file mode 100644 index 0000000..412656f Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-match-list-card-bg-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-outright-detail-bg-v1.webp b/apps/player/src/assets/images/generated/pc-outright-detail-bg-v1.webp new file mode 100644 index 0000000..7c7a188 Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-outright-detail-bg-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-outright-list-card-bg-v1.webp b/apps/player/src/assets/images/generated/pc-outright-list-card-bg-v1.webp new file mode 100644 index 0000000..a3ad37b Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-outright-list-card-bg-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-sidebar-bg-v1.webp b/apps/player/src/assets/images/generated/pc-sidebar-bg-v1.webp new file mode 100644 index 0000000..5e126e3 Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-sidebar-bg-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-top-nav-bg-v1.webp b/apps/player/src/assets/images/generated/pc-top-nav-bg-v1.webp new file mode 100644 index 0000000..cb0514f Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-top-nav-bg-v1.webp differ diff --git a/apps/player/src/assets/images/generated/pc-wallet-banner-v1.webp b/apps/player/src/assets/images/generated/pc-wallet-banner-v1.webp new file mode 100644 index 0000000..2e9067b Binary files /dev/null and b/apps/player/src/assets/images/generated/pc-wallet-banner-v1.webp differ diff --git a/apps/player/src/assets/images/generated/saishi-gold-trophy-v1.webp b/apps/player/src/assets/images/generated/saishi-gold-trophy-v1.webp new file mode 100644 index 0000000..33d0299 Binary files /dev/null and b/apps/player/src/assets/images/generated/saishi-gold-trophy-v1.webp differ diff --git a/apps/player/src/assets/images/generated/vs-gold-alpha-v1.webp b/apps/player/src/assets/images/generated/vs-gold-alpha-v1.webp new file mode 100644 index 0000000..71a2af6 Binary files /dev/null and b/apps/player/src/assets/images/generated/vs-gold-alpha-v1.webp differ diff --git a/apps/player/src/components/ConfirmDialog.vue b/apps/player/src/components/ConfirmDialog.vue index e2422ba..c2fba70 100644 --- a/apps/player/src/components/ConfirmDialog.vue +++ b/apps/player/src/components/ConfirmDialog.vue @@ -101,18 +101,33 @@ function onConfirm() { } .confirm-modal { + position: relative; width: 100%; - max-width: 340px; - background: linear-gradient(165deg, #1a1810 0%, #121212 45%, #0a0a0a 100%); - border: 1px solid var(--border-gold-soft, rgba(200, 168, 78, 0.25)); - border-radius: 12px; - padding: 22px 18px 16px; - box-shadow: 0 0 24px rgba(212, 175, 55, 0.08); + max-width: 374px; + overflow: hidden; + background: + linear-gradient(180deg, rgba(212, 175, 55, 0.08), transparent 38%), + rgba(14, 14, 12, 0.96); + border: 1px solid rgba(212, 175, 55, 0.34); + border-radius: 8px; + padding: 31px 28px 25px; + box-shadow: none; +} + +.confirm-modal::before { + content: ''; + position: absolute; + top: 0; + left: 24px; + right: 24px; + height: 1px; + background: linear-gradient(90deg, transparent, rgba(232, 200, 74, 0.65), transparent); + pointer-events: none; } .confirm-title { - margin: 0 0 10px; - font-size: 17px; + margin: 0 0 12px; + font-size: 18px; font-weight: 800; color: var(--gold, #c8a84e); text-align: center; @@ -120,7 +135,7 @@ function onConfirm() { } .confirm-message { - margin: 0 0 20px; + margin: 0 0 26px; font-size: 14px; line-height: 1.6; color: #c8c8c8; @@ -130,17 +145,17 @@ function onConfirm() { .confirm-actions { display: flex; - gap: 10px; + gap: 12px; } .confirm-btn { flex: 1; - min-height: 44px; - border-radius: 8px; + min-height: 49px; + border-radius: 0; font-size: 14px; font-weight: 700; cursor: pointer; - transition: opacity 0.15s; + transition: opacity 0.15s, filter 0.15s; } .confirm-btn:disabled { @@ -149,20 +164,30 @@ function onConfirm() { } .confirm-btn.cancel { - border: 1px solid #333; - background: transparent; - color: #888; + border: 0; + background: url('../assets/images/generated/pc-betslip-btn-secondary-v1.webp') center / 100% 100% no-repeat; + color: #9f9273; } .confirm-btn.confirm { border: none; - background: linear-gradient(135deg, #d4a017, #e8c84a); - color: #1a1a1a; + background: url('../assets/images/generated/pc-betslip-btn-primary-v1.webp') center / 100% 100% no-repeat; + color: #1b1200; } -.confirm-btn.confirm.danger { - background: linear-gradient(135deg, #c0392b, #e74c3c); - color: #fff; +.confirm-btn.cancel:not(:disabled):hover, +.confirm-btn.confirm:not(:disabled):hover { + filter: brightness(1.06); +} + +.confirm-btn.cancel:not(:disabled):active { + background-image: url('../assets/images/generated/pc-betslip-btn-secondary-pressed-v1.webp'); + filter: brightness(0.96); +} + +.confirm-btn.confirm:not(:disabled):active { + background-image: url('../assets/images/generated/pc-betslip-btn-primary-pressed-v1.webp'); + filter: brightness(0.98); } .confirm-fade-enter-active, diff --git a/apps/player/src/components/FloatingMailbox.vue b/apps/player/src/components/FloatingMailbox.vue index 27e3d48..537478c 100644 --- a/apps/player/src/components/FloatingMailbox.vue +++ b/apps/player/src/components/FloatingMailbox.vue @@ -317,47 +317,61 @@ onMounted(() => { } .fab-btn { - width: 56px; - height: 56px; + width: 48px; + height: 48px; border-radius: 50%; - background: var(--primary); - color: #fff; - border: none; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + background: url('../assets/images/generated/floating-mailbox-fab-v1.webp') center / cover no-repeat; + color: var(--primary-light); + border: 0; + box-shadow: + 0 8px 22px rgba(0, 0, 0, 0.42), + 0 0 16px rgba(212, 175, 55, 0.12); display: flex; align-items: center; justify-content: center; cursor: pointer; - transition: transform 0.2s, background 0.2s; + transition: transform 0.2s, box-shadow 0.2s, color 0.2s, filter 0.2s; position: relative; } .fab-btn:hover { - transform: scale(1.05); - background: var(--primary-light); + transform: translateY(-1px); + color: #fff1a8; + filter: brightness(1.08); + box-shadow: + 0 10px 26px rgba(0, 0, 0, 0.5), + 0 0 20px rgba(212, 175, 55, 0.18); } .fab-active { - transform: scale(0.95); + transform: scale(0.96); + color: #fff1a8; + filter: brightness(0.94); } .fab-icon { - width: 28px; - height: 28px; + width: 24px; + height: 24px; } .badge { position: absolute; - top: 0; - right: 0; + top: -3px; + right: -3px; background: var(--danger, #ff4d4f); color: #fff; - font-size: 11px; + font-size: 10px; font-weight: 700; - padding: 2px 6px; + min-width: 18px; + height: 18px; + padding: 0 5px; border-radius: 10px; - border: 2px solid var(--bg-card); + border: 1px solid rgba(255, 255, 255, 0.9); line-height: 1; + display: inline-flex; + align-items: center; + justify-content: center; + box-shadow: 0 2px 8px rgba(255, 69, 58, 0.42); } .popup-panel { diff --git a/apps/player/src/components/LeagueAccordionItem.vue b/apps/player/src/components/LeagueAccordionItem.vue index a3e1526..bdc967e 100644 --- a/apps/player/src/components/LeagueAccordionItem.vue +++ b/apps/player/src/components/LeagueAccordionItem.vue @@ -2,8 +2,8 @@ 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'; +import saishiImg from '../assets/images/generated/saishi-gold-trophy-v1.webp'; +import cardBg from '../assets/images/generated/pc-match-list-card-bg-v1.webp'; const matchCardBg = `url(${cardBg})`; diff --git a/apps/player/src/components/LoginPromptModal.vue b/apps/player/src/components/LoginPromptModal.vue index e669142..881993f 100644 --- a/apps/player/src/components/LoginPromptModal.vue +++ b/apps/player/src/components/LoginPromptModal.vue @@ -28,7 +28,7 @@ function continueBrowsing() {