diff --git a/app/router/nav_tracking_template_test.go b/app/router/nav_tracking_template_test.go index ab99d7c..e3fabc2 100644 --- a/app/router/nav_tracking_template_test.go +++ b/app/router/nav_tracking_template_test.go @@ -19,7 +19,7 @@ func TestNavigationPageUsesDedicatedVerificationAndAnalytics(t *testing.T) { t.Fatalf("navigation SEO output does not contain %q", want) } } - for _, unwanted := range []string{"112387687", "G-TZQS2NZ3TN", "6bb06ed5659790d0"} { + for _, unwanted := range []string{"112967594", "G-B5KGM8S5J1", "6bb06ed5659790d0"} { if strings.Contains(navHTML, unwanted) { t.Fatalf("navigation SEO output unexpectedly contains main-site id %q", unwanted) } @@ -31,8 +31,8 @@ func TestMainSiteKeepsMainVerificationAndAnalytics(t *testing.T) { for _, want := range []string{ "r7geXn5kBugzOSLZzyw4v3NBDMQwAmzFCVkqp92odh0", "6bb06ed5659790d0", - "112387687", - "G-TZQS2NZ3TN", + "112967594", + "G-B5KGM8S5J1", } { if !strings.Contains(mainHTML, want) { t.Fatalf("main-site SEO output does not contain %q", want) diff --git a/app/static/css/detail.css b/app/static/css/detail.css index aa3c9a5..dd95c3e 100644 --- a/app/static/css/detail.css +++ b/app/static/css/detail.css @@ -8,11 +8,6 @@ .detail-h5-bg, .detail-h5-top, .detail-h5-bar, -.detail-meta-h5, -.detail-intro-title, -.detail-episodes-status, -.detail-episode-ranges, -.detail-episode--preview, .detail-related-title-h5, .detail-related-refresh { display: none; @@ -50,169 +45,6 @@ line-height: 20px; } -.detail-hero { - align-self: stretch; - width: 100%; - padding: 24px 48px 24px 24px; - background: rgba(255, 255, 255, 0.05); - overflow: hidden; - border-radius: 16px; - border: 1px solid rgba(255, 255, 255, 0.10); - justify-content: flex-start; - align-items: center; - gap: 24px; - display: flex; - box-sizing: border-box; -} - -.detail-cover { - width: 300px; - height: 400px; - border-radius: 18px; - object-fit: cover; - flex-shrink: 0; -} - -.detail-hero-main { - flex: 1 1 0; - min-width: 0; - min-height: 400px; - overflow: hidden; - flex-direction: column; - justify-content: center; - align-items: flex-start; - gap: 30px; - display: flex; -} - -.detail-hero-info { - width: 100%; - overflow: hidden; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - gap: 30px; - display: flex; -} - -.detail-tags { - align-self: stretch; - height: auto; - min-height: 26px; - overflow: visible; - justify-content: flex-start; - align-items: flex-start; - gap: 9px; - display: flex; - flex-wrap: wrap; -} - -.detail-tag { - height: 26px; - max-width: 100%; - padding: 0 11px; - background: rgba(255, 255, 255, 0.10); - overflow: hidden; - border-radius: 13px; - justify-content: center; - align-items: center; - display: inline-flex; - color: #8A8A8A; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - box-sizing: border-box; - flex-shrink: 0; - white-space: nowrap; - text-overflow: ellipsis; - text-decoration: none; -} - -.detail-tag--primary { - background: #ec237f; - color: #fff; -} - -.detail-title { - margin: 0; - color: white; - font-size: 34px; - font-family: PingFang SC; - font-weight: 400; - line-height: 40px; - word-wrap: break-word; -} - -.detail-meta { - color: #8A8A8A; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - word-wrap: break-word; -} - -.detail-meta-pc { - display: flex; - align-items: center; - gap: 18px; -} - -.detail-intro-block { - width: 100%; -} - -.detail-intro { - margin: 0; - width: 100%; - color: #8A8A8A; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - word-wrap: break-word; - display: -webkit-box; - -webkit-line-clamp: 6; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.detail-intro-prefix-pc { - display: inline; -} - -.detail-actions { - width: 100%; - height: 45px; - overflow: hidden; - justify-content: space-between; - align-items: center; - display: flex; - gap: 16px; - flex-wrap: wrap; -} - -.detail-play-btn { - height: 45px; - padding: 0 12px; - background: #ec237f; - overflow: hidden; - border-radius: 23px; - justify-content: center; - align-items: center; - display: flex; - border: none; - cursor: pointer; - color: #181818; - font-size: 16px; - font-family: PingFang SC; - font-weight: 400; - line-height: 22px; - text-decoration: none; - box-sizing: border-box; -} - .detail-action-group { justify-content: flex-start; align-items: center; @@ -274,78 +106,6 @@ background: rgba(255, 255, 255, 0.05); } -.detail-episodes { - align-self: stretch; - width: 100%; - overflow: hidden; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - gap: 16px; - display: flex; -} - -.detail-episodes-head { - width: 100%; - display: flex; - justify-content: space-between; - align-items: center; -} - -.detail-section-label { - color: #F5F5F5; - font-size: 18px; - font-family: PingFang SC; - font-weight: 600; - line-height: 27px; -} - -.detail-episode-list { - width: 100%; - justify-content: flex-start; - align-items: flex-start; - gap: 14px; - display: flex; - flex-wrap: wrap; -} - -.detail-episode-lock { - position: absolute; - top: 0; - right: 0; - padding: 0 4px; - border-radius: 0 7px 0 7px; - background: #ec237f; - color: #fff; - font-size: 9px; - font-family: PingFang SC; - font-weight: 500; - line-height: 14px; - pointer-events: none; -} - -.detail-episode { - flex: 0 0 calc((100% - 98px) / 8); - width: calc((100% - 98px) / 8); - height: 54px; - position: relative; - background: rgba(255, 255, 255, 0.10); - overflow: hidden; - border-radius: 7px; - justify-content: center; - align-items: center; - display: flex; - border: none; - cursor: pointer; - color: #808080; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - text-decoration: none; - box-sizing: border-box; -} - .detail-comments { align-self: stretch; width: 100%; @@ -750,220 +510,19 @@ box-sizing: border-box; } - .detail-meta-pc, - .detail-actions, .detail-comments, - .detail-related-desc, - .detail-related-title-pc, - .detail-episode-pc, - .detail-episodes-status-icon, - .detail-breadcrumb { +.detail-related-desc, +.detail-related-title-pc, +.detail-breadcrumb { display: none !important; } - .detail-meta-h5, - .detail-intro-title, - .detail-episodes-status, - .detail-episode-ranges, - .detail-episode--preview, .detail-related-title-h5, - .detail-related-refresh, - .detail-h5-bar { +.detail-related-refresh, +.detail-h5-bar { display: flex; } - .detail-hero { - width: 100%; - padding: 0; - background: transparent; - border-radius: 0; - border: none; - display: grid; - grid-template-columns: 76px 1fr; - gap: 18px 12px; - align-items: start; - } - - .detail-hero-main { - display: contents; - } - - .detail-cover { - width: 76px; - height: 106px; - border-radius: 6px; - grid-column: 1; - grid-row: 1; - background: #D4D4D4; - } - - .detail-hero-info { - grid-column: 2; - grid-row: 1; - width: auto; - gap: 12px; - min-width: 0; - } - - .detail-title { - order: 1; - width: 100%; - max-width: 220px; - font-size: 16px; - font-weight: 500; - line-height: 22px; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; - } - - .detail-meta { - order: 2; - } - - .detail-meta-h5 { - align-items: flex-start; - gap: 6px; - color: white; - font-size: 12px; - line-height: 18px; - } - - .detail-meta-dot { - flex-shrink: 0; - } - - .detail-tags { - order: 3; - height: auto; - gap: 6px; - flex-wrap: wrap; - } - - .detail-tag { - height: auto; - padding: 2px 6px; - background: rgba(255, 255, 255, 0.10); - border-radius: 3px; - color: white; - } - - .detail-tag--primary { - background: rgba(255, 255, 255, 0.10); - color: white; - } - - .detail-intro-block { - grid-column: 1 / -1; - max-width: none; - display: flex; - flex-direction: column; - gap: 12px; - } - - .detail-intro-title { - color: white; - font-size: 16px; - font-weight: 500; - line-height: 22px; - } - - .detail-intro { - color: white; - -webkit-line-clamp: 3; - } - - .detail-intro-prefix-pc { - display: none; - } - - .detail-episodes { - width: 100%; - gap: 12px; - } - - .detail-episodes-head { - width: 100%; - } - - .detail-section-label { - color: white; - font-size: 14px; - font-weight: 400; - line-height: 20px; - } - - .detail-episodes-status { - align-items: center; - gap: 2px; - color: rgba(255, 255, 255, 0.35); - font-size: 12px; - line-height: 18px; - } - - .detail-episode-ranges { - width: 100%; - align-items: center; - gap: 24px; - } - - .detail-episode-range { - background: none; - border: none; - padding: 0; - cursor: pointer; - color: rgba(255, 255, 255, 0.55); - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; - } - - .detail-episode-range--active { - color: white; - } - - .detail-episode-list { - width: 100%; - display: flex; - flex-wrap: nowrap; - justify-content: flex-start; - align-items: center; - gap: 6px; - overflow-x: auto; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - scrollbar-width: none; - } - - .detail-episode-list::-webkit-scrollbar { - display: none; - } - - .detail-episode.is-range-hidden { - display: none !important; - } - - .detail-episode { - flex: 0 0 58px; - width: 58px; - min-width: 58px; - height: 58px; - border-radius: 10px; - background: rgba(255, 255, 255, 0.10); - color: white; - font-size: 18px; - font-weight: 400; - line-height: 24px; - } - - .detail-episode::before { - content: attr(data-ep); - width: 24px; - text-align: center; - } - .detail-related { width: 100%; gap: 12px; @@ -1265,90 +824,6 @@ flex-shrink: 0; } - .detail-hero { - min-height: 0; - padding: calc(24px * var(--detail-s)) calc(48px * var(--detail-s)) calc(24px * var(--detail-s)) calc(24px * var(--detail-s)); - background: rgba(255, 255, 255, 0.05); - border: 0; - outline: 1px solid rgba(255, 255, 255, 0.10); - outline-offset: -1px; - border-radius: calc(16px * var(--detail-s)); - gap: calc(24px * var(--detail-s)); - } - - .detail-cover { - width: calc(300px * var(--detail-s)); - height: calc(400px * var(--detail-s)); - border-radius: calc(18px * var(--detail-s)); - } - - .detail-hero-main { - min-height: calc(400px * var(--detail-s)); - gap: calc(30px * var(--detail-s)); - } - - .detail-hero-info { gap: calc(30px * var(--detail-s)); } - - .detail-tags { - gap: calc(9px * var(--detail-s)); - height: calc(26px * var(--detail-s)); - overflow: hidden; - } - - .detail-tag { - height: calc(26px * var(--detail-s)); - padding: 0 calc(11px * var(--detail-s)); - border-radius: calc(6px * var(--detail-s)); - background: rgba(255, 255, 255, 0.10); - color: rgba(255, 255, 255, 0.55); - font-size: calc(12px * var(--detail-s)); - line-height: calc(18px * var(--detail-s)); - } - - .detail-tag--primary { background: #ec237f; color: #fff; } - - .detail-title { - font-size: calc(24px * var(--detail-s)); - font-weight: 600; - line-height: calc(32px * var(--detail-s)); - } - - .detail-meta { - color: rgba(255, 255, 255, 0.55); - font-size: calc(16px * var(--detail-s)); - line-height: calc(22px * var(--detail-s)); - } - - .detail-meta-pc { gap: calc(18px * var(--detail-s)); } - - .detail-intro { - color: rgba(255, 255, 255, 0.55); - font-size: calc(14px * var(--detail-s)); - line-height: calc(20px * var(--detail-s)); - } - - .detail-actions { - height: calc(45px * var(--detail-s)); - justify-content: space-between; - } - - .detail-play-btn { - height: calc(45px * var(--detail-s)); - padding: 0 calc(12px * var(--detail-s)); - gap: calc(4px * var(--detail-s)); - border-radius: calc(23px * var(--detail-s)); - background: #ec237f; - color: #fff; - font-size: calc(16px * var(--detail-s)); - line-height: calc(22px * var(--detail-s)); - } - - .detail-play-btn img { - width: calc(16px * var(--detail-s)); - height: calc(17px * var(--detail-s)); - filter: brightness(0) invert(1); - } - .detail-action-group { gap: calc(16px * var(--detail-s)); } .detail-action { @@ -1379,52 +854,6 @@ background: rgba(255, 255, 255, 0.05); } - .detail-episodes { gap: calc(14px * var(--detail-s)); } - - .detail-section-label { - font-size: calc(24px * var(--detail-s)); - font-weight: 500; - line-height: calc(32px * var(--detail-s)); - } - - .detail-episode-pc { - display: none !important; - } - - .detail-episode-list { - display: grid; - grid-template-columns: repeat(auto-fill, calc(58px * var(--detail-s))); - justify-content: space-between; - align-items: center; - gap: calc(12px * var(--detail-s)) calc(7px * var(--detail-s)); - overflow: hidden; - } - - .detail-episode { - flex: none; - width: calc(58px * var(--detail-s)); - min-width: calc(58px * var(--detail-s)); - height: calc(58px * var(--detail-s)); - border-radius: calc(10px * var(--detail-s)); - background: rgba(255, 255, 255, 0.10); - color: #fff; - font-size: calc(18px * var(--detail-s)); - font-weight: 400; - line-height: calc(24px * var(--detail-s)); - } - - .detail-episode.is-active, - .detail-episode.detail-episode--active { - background: rgba(255, 74, 74, 0.08); - color: #ec237f; - } - - .detail-episode::before { - content: attr(data-ep); - width: calc(24px * var(--detail-s)); - text-align: center; - } - .content-official-info { padding: calc(24px * var(--detail-s)) calc(30px * var(--detail-s)); border-radius: calc(18px * var(--detail-s)); @@ -1579,7 +1008,6 @@ .detail-main, .detail-sidebar { display: contents; } - .detail-episodes, .detail-related { padding-top: 18px; border-top: 1px solid rgba(255, 255, 255, .1); diff --git a/app/static/css/detailHero.css b/app/static/css/detailHero.css new file mode 100644 index 0000000..34907b7 --- /dev/null +++ b/app/static/css/detailHero.css @@ -0,0 +1,557 @@ +/* 详情页:信息卡(海报 + 剧集信息)与选集卡,结构参考 huangguoai.com 详情页,配色沿用品牌粉。 */ + +.dh-card { + width: 100%; + padding: 32px; + background: #1A1A1A; + border: 1px solid rgba(255, 255, 255, 0.08); + border-radius: 20px; + box-sizing: border-box; + font-family: PingFang SC, sans-serif; +} + +/* ---------- 信息卡 ---------- */ +.dh-hero { + display: flex; + align-items: flex-start; + gap: 28px; +} + +.dh-poster { + position: relative; + flex: 0 0 210px; + aspect-ratio: 3 / 4; + display: block; + overflow: hidden; + border-radius: 12px; + background: #111; +} + +.dh-poster-img { + width: 100%; + height: 100%; + display: block; + object-fit: cover; + transition: transform 0.3s ease; +} + +.dh-poster:hover .dh-poster-img { + transform: scale(1.04); +} + +.dh-poster-badge { + position: absolute; + top: 8px; + left: 8px; + padding: 2px 8px; + background: #EC237F; + border-radius: 6px; + color: #FFFFFF; + font-size: 12px; + font-weight: 600; + line-height: 18px; +} + +.dh-poster-eps { + position: absolute; + right: 8px; + bottom: 8px; + padding: 2px 8px; + background: rgba(0, 0, 0, 0.65); + border-radius: 6px; + color: #FFFFFF; + font-size: 12px; + font-weight: 600; + line-height: 18px; +} + +.dh-poster-play { + position: absolute; + top: 50%; + left: 50%; + width: 56px; + height: 56px; + display: flex; + align-items: center; + justify-content: center; + background: rgba(236, 35, 127, 0.88); + border-radius: 50%; + box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4); + transform: translate(-50%, -50%); + transition: transform 0.2s ease, background 0.2s ease; +} + +.dh-poster-play img { + width: 22px; + height: 22px; + margin-left: 3px; +} + +/* player.svg 本身是黑色填充,粉底上统一显示为白色 */ +.dh-poster-play img, +.dh-btn--primary img { + filter: brightness(0) invert(1); +} + +.dh-poster:hover .dh-poster-play { + background: #EC237F; + transform: translate(-50%, -50%) scale(1.08); +} + +.dh-info { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 12px; +} + +.dh-brand { + display: flex; + align-items: center; + gap: 8px; + color: #FFFFFF; + font-size: 14px; + line-height: 20px; +} + +.dh-brand-avatar { + width: 28px; + height: 28px; + border-radius: 50%; +} + +.dh-title { + margin: 0; + color: #FFFFFF; + font-size: 32px; + font-weight: 600; + line-height: 42px; +} + +.dh-meta { + display: flex; + flex-wrap: wrap; + align-items: center; + color: rgba(255, 255, 255, 0.6); + font-size: 14px; + line-height: 20px; +} + +.dh-meta span + span::before { + content: "·"; + margin: 0 8px; + color: rgba(255, 255, 255, 0.35); +} + +.dh-intro-title { + margin: 6px 0 0; + color: #FFFFFF; + font-size: 16px; + font-weight: 600; + line-height: 24px; +} + +.dh-intro { + margin: 0; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + overflow: hidden; + color: rgba(255, 255, 255, 0.72); + font-size: 14px; + line-height: 22px; +} + +.dh-intro.is-expanded { + display: block; + -webkit-line-clamp: unset; +} + +.dh-intro-toggle { + margin-top: -6px; + padding: 0; + background: none; + border: 0; + color: #EC237F; + font-size: 13px; + line-height: 20px; + cursor: pointer; +} + +.dh-tags, +.dh-themes { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 8px; +} + +.dh-tag { + padding: 4px 12px; + background: rgba(255, 255, 255, 0.08); + border-radius: 999px; + color: rgba(255, 255, 255, 0.85); + font-size: 12px; + line-height: 18px; + text-decoration: none; + transition: background 0.18s ease, color 0.18s ease; +} + +a.dh-tag:hover { + background: rgba(236, 35, 127, 0.16); + color: #EC237F; +} + +.dh-themes-label { + color: rgba(255, 255, 255, 0.5); + font-size: 13px; + line-height: 20px; +} + +.dh-theme { + padding: 3px 12px; + border: 1px solid rgba(236, 35, 127, 0.6); + border-radius: 999px; + color: #EC237F; + font-size: 13px; + line-height: 18px; + text-decoration: none; +} + +a.dh-theme:hover { + background: rgba(236, 35, 127, 0.12); +} + +.dh-actions { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-top: 6px; +} + +.dh-btn { + height: 48px; + padding: 0 24px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + background: transparent; + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 999px; + box-sizing: border-box; + color: #FFFFFF; + font-family: inherit; + font-size: 16px; + font-weight: 600; + line-height: 22px; + text-decoration: none; + white-space: nowrap; + cursor: pointer; + transition: border-color 0.18s ease, background 0.18s ease, filter 0.18s ease; +} + +.dh-btn img { + width: 18px; + height: 18px; +} + +.dh-btn:hover { + border-color: rgba(255, 255, 255, 0.45); + background: rgba(255, 255, 255, 0.04); +} + +.dh-btn--primary { + padding: 0 32px; + background: #EC237F; + border-color: #EC237F; +} + +.dh-btn--primary:hover { + background: #EC237F; + border-color: #EC237F; + filter: brightness(1.08); +} + +/* ---------- 选集卡 ---------- */ +.dh-episodes-head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; +} + +.dh-episodes-title { + margin: 0; + color: #FFFFFF; + font-size: 20px; + font-weight: 600; + line-height: 28px; +} + +.dh-episodes-sub { + margin-top: 4px; + color: rgba(255, 255, 255, 0.5); + font-size: 13px; + line-height: 20px; +} + +.dh-episodes-hint { + flex-shrink: 0; + color: #EC237F; + font-size: 13px; + line-height: 28px; +} + +.dh-ranges { + display: flex; + gap: 8px; + margin-top: 16px; + overflow-x: auto; + scrollbar-width: none; +} + +.dh-ranges::-webkit-scrollbar { + display: none; +} + +.dh-range { + flex: 0 0 auto; + height: 32px; + padding: 0 14px; + background: rgba(255, 255, 255, 0.06); + border: 0; + border-radius: 8px; + color: rgba(255, 255, 255, 0.7); + font-family: inherit; + font-size: 13px; + cursor: pointer; +} + +.dh-range.is-active { + background: rgba(236, 35, 127, 0.16); + color: #EC237F; +} + +.dh-ep-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(88px, 1fr)); + gap: 12px 10px; + margin-top: 16px; +} + +.dh-ep { + position: relative; + height: 44px; + display: flex; + align-items: center; + justify-content: center; + background: rgba(255, 255, 255, 0.06); + border-radius: 10px; + color: #FFFFFF; + font-size: 15px; + font-weight: 500; + text-decoration: none; + transition: background 0.18s ease, color 0.18s ease; +} + +.dh-ep:hover { + background: rgba(236, 35, 127, 0.18); + color: #EC237F; +} + +.dh-ep.is-range-hidden { + display: none; +} + +.dh-ep-lock { + position: absolute; + top: -6px; + right: -4px; + padding: 0 5px; + background: #EC237F; + border-radius: 6px 6px 6px 0; + color: #FFFFFF; + font-size: 10px; + font-weight: 600; + line-height: 15px; +} + +/* ---------- 官方地址卡(详情页内,含手机端) ---------- */ +body.is-detail-page .content-official-info { + display: grid !important; + grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); + gap: 14px 24px; + padding: 24px 32px; + background: #1A1A1A; + outline: 1px solid rgba(255, 255, 255, 0.08); + border-radius: 20px; + color: rgba(255, 255, 255, 0.55); + font-size: 13px; + line-height: 20px; +} + +body.is-detail-page .content-official-info::before { + content: "官方地址 · 请收藏,防止迷路"; + grid-column: 1 / -1; + color: #FFFFFF; + font-size: 16px; + font-weight: 600; + line-height: 24px; +} + +body.is-detail-page .content-official-info a { + color: #EC237F; + font-size: 14px; + word-break: break-all; +} + +/* ---------- 平板:信息卡缩小海报 ---------- */ +@media (min-width: 768px) and (max-width: 1023px) { + .dh-card { + padding: 24px; + } + + .dh-poster { + flex-basis: 170px; + } + + .dh-title { + font-size: 26px; + line-height: 36px; + } +} + +/* ---------- 手机 ---------- */ +@media (max-width: 767px) { + .dh-card { + padding: 16px; + background: rgba(26, 26, 26, 0.82); + border-radius: 16px; + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + } + + .dh-hero { + flex-direction: column; + gap: 16px; + } + + .dh-poster { + flex: none; + width: 48%; + max-width: 190px; + } + + .dh-poster-play { + width: 46px; + height: 46px; + } + + .dh-poster-play img { + width: 18px; + height: 18px; + } + + .dh-info { + width: 100%; + gap: 10px; + } + + .dh-brand { + font-size: 13px; + } + + .dh-brand-avatar { + width: 24px; + height: 24px; + } + + .dh-title { + font-size: 22px; + line-height: 30px; + } + + .dh-meta { + font-size: 12px; + line-height: 18px; + } + + .dh-meta span + span::before { + margin: 0 6px; + } + + .dh-intro-title { + font-size: 15px; + line-height: 22px; + } + + .dh-intro { + font-size: 13px; + line-height: 20px; + } + + .dh-actions { + width: 100%; + gap: 10px; + } + + .dh-actions { + flex-wrap: nowrap; + } + + .dh-btn { + height: 42px; + padding: 0 14px; + gap: 6px; + font-size: 15px; + } + + .dh-btn img { + width: 16px; + height: 16px; + } + + .dh-btn--primary { + flex: 1; + padding: 0 16px; + } + + .dh-episodes-title { + font-size: 17px; + line-height: 24px; + } + + .dh-episodes-sub, + .dh-episodes-hint { + font-size: 12px; + } + + .dh-episodes-hint { + line-height: 24px; + } + + .dh-ep-grid { + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 10px 8px; + } + + .dh-ep { + height: 42px; + font-size: 14px; + } + + body.is-detail-page .content-official-info { + grid-template-columns: 1fr; + gap: 12px; + padding: 16px; + border-radius: 16px; + } + + body.is-detail-page .content-official-info::before { + font-size: 15px; + line-height: 22px; + } +} diff --git a/app/static/css/downloadAppFloat.css b/app/static/css/downloadAppFloat.css index aa7f484..dc61041 100644 --- a/app/static/css/downloadAppFloat.css +++ b/app/static/css/downloadAppFloat.css @@ -100,7 +100,6 @@ line-height: 20px; } - body[class].is-detail-page .download-fab, body[class].is-play-page .download-fab { display: none !important; } diff --git a/app/static/css/footer.css b/app/static/css/footer.css index 2d8b6ae..05e821e 100644 --- a/app/static/css/footer.css +++ b/app/static/css/footer.css @@ -29,18 +29,10 @@ a.footer-social-home-item { gap: min(12px, 0.625vw); } - body.home-page .footer-main { - gap: min(32px, 1.666667vw); - } - body.home-page .footer-product { gap: min(18px, 0.9375vw); } - body.home-page .footer-brand { - gap: min(18px, 0.9375vw); - } - body.home-page .footer-logo { width: min(178px, 9.270833vw); height: min(49px, 2.552083vw); @@ -52,28 +44,12 @@ a.footer-social-home-item { line-height: clamp(20px, 1.25vw, 24px); } - body.home-page .footer-contact { - gap: min(4px, 0.208333vw); - } - body.home-page .footer-contact-line, body.home-page .footer-links { - font-size: clamp(12px, 0.833333vw, 16px); + font-size: clamp(13px, 0.833333vw, 16px); line-height: clamp(18px, 1.145833vw, 22px); } - body.home-page .footer-links { - gap: min(15px, 0.78125vw); - } - - body.home-page .footer-links a + a { - padding-left: min(16px, 0.833333vw); - } - - body.home-page .footer-links a + a::before { - height: min(18px, 0.9375vw); - } - body.home-page .footer-bottom { min-height: min(38px, 1.979167vw); gap: min(24px, 1.25vw); @@ -968,3 +944,214 @@ body.site-shell.list-page-body { display: none; } } + +/* ===== 页脚改版:品牌 / 访问地址 / 帮助与支持 三栏 ===== */ +.footer-col-title { + color: #FFFFFF; + font-size: 15px; + font-weight: 500; + line-height: 22px; +} + +.footer-contact-label { + flex: 0 0 auto; + min-width: 6.5em; + color: rgba(255, 255, 255, 0.45); +} + +.footer-contact-url { + min-width: 0; + color: #EC237F; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +a.footer-contact-line:hover .footer-contact-url, +a.footer-contact-line:focus-visible .footer-contact-url { + text-decoration: underline; +} + +@media (min-width: 768px) { + .footer-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + align-items: start; + column-gap: 48px; + row-gap: 28px; + } + + .footer-brand { + grid-column: 1 / -1; + grid-row: 1; + flex-direction: column; + align-items: flex-start; + gap: 14px; + max-width: 640px; + } + + .footer-logo { + height: 44px; + } + + .footer-brand .footer-muted-text { + color: rgba(255, 255, 255, 0.55); + font-size: 14px; + line-height: 22px; + } + + .footer-contact { + grid-column: 1; + grid-row: 2; + display: flex; + flex-direction: column; + gap: 10px; + min-width: 0; + max-width: 100%; + } + + .footer-contact-line { + flex-direction: row; + align-items: baseline; + gap: 12px; + max-width: 100%; + font-size: 14px; + line-height: 20px; + } + + .footer-nav-col { + grid-column: 2; + grid-row: 2; + display: flex; + flex-direction: column; + gap: 10px; + } + + .footer-links { + display: grid; + grid-template-columns: repeat(2, max-content); + column-gap: 40px; + row-gap: 10px; + justify-self: start; + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + line-height: 20px; + } + + .footer-links a + a { + padding-left: 0; + } + + .footer-links a + a::before { + display: none; + } + + .footer-divider { + margin-top: 10px; + } +} + +@media (min-width: 1024px) { + .footer-main { + grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr) auto; + column-gap: 64px; + } + + .footer-brand { + grid-column: 1; + grid-row: 1; + max-width: 560px; + } + + .footer-contact { + grid-column: 2; + grid-row: 1; + } + + .footer-nav-col { + grid-column: 3; + grid-row: 1; + } +} + +@media (max-width: 767px) { + .footer-col-title { + display: none; + } + + .footer-nav-col { + width: 100%; + } + + /* 链接换行时行首不再挂分隔线:改成 3 列网格 */ + .footer-links { + display: grid; + grid-template-columns: repeat(3, 1fr); + row-gap: 10px; + text-align: center; + } + + .footer-links a + a { + padding-left: 0; + } + + .footer-links a + a::before { + display: none; + } + + .site-shell .home-mobile-footer-links { + display: grid; + grid-template-columns: repeat(3, 1fr); + row-gap: 10px; + column-gap: 8px; + text-align: center; + } + + .site-shell .home-mobile-footer-links a { + padding-left: 0; + } + + .site-shell .home-mobile-footer-links a::before { + display: none; + } +} + +/* 页脚进入视口时,悬浮按钮随之上移,不压住页脚(--footer-lift 由 footer.js 维护) */ +.download-fab, +.floating-action { + translate: 0 calc(var(--footer-lift, 0px) * -1); +} + +/* 手机页脚卡片底部:访问地址 */ +@media (max-width: 767px) { + .site-shell .home-mobile-footer-addrs { + width: 100%; + padding-top: 14px; + border-top: 1px solid rgba(255, 255, 255, 0.1); + display: flex; + flex-direction: column; + gap: 8px; + box-sizing: border-box; + } + + .site-shell .home-mobile-footer-addr { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 12px; + color: rgba(255, 255, 255, 0.55); + font: 400 12px/18px "PingFang SC", sans-serif; + text-decoration: none; + } + + .site-shell .home-mobile-footer-addr span:first-child { + flex: 0 0 auto; + } + + .site-shell .home-mobile-footer-addr-url { + min-width: 0; + color: #EC237F; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} diff --git a/app/static/css/header.css b/app/static/css/header.css index 2baafa3..993b11d 100644 --- a/app/static/css/header.css +++ b/app/static/css/header.css @@ -1569,3 +1569,33 @@ nav[aria-label="面包屑"] a:hover, nav[aria-label="面包屑"] a:focus-visible { color: #EC237F !important; } + +/* 手机页头:下载 App / 商务 TG 图标,样式同搜索按钮 */ +.header-mobile-icon-link { + display: none; +} + +@media (max-width: 767px) { + .header-mobile-icon-link { + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + flex: 0 0 24px; + border-radius: 50%; + background: rgba(255, 255, 255, 0.05); + } + + .header-mobile-icon-link img { + width: 16px; + height: 16px; + display: block; + filter: brightness(0) invert(1); + } + + .header-mobile-icon-link .header-mobile-icon-img--lg { + width: 18px; + height: 18px; + } +} diff --git a/app/static/css/index.css b/app/static/css/index.css index bffb761..5300aa2 100644 --- a/app/static/css/index.css +++ b/app/static/css/index.css @@ -422,6 +422,15 @@ line-height: 23px; } + body.home-page .card-grid .poster-card-tags { + height: 29px; + } + + body.home-page .poster-card-episode { + font-size: 16px; + line-height: 23px; + } + body.home-page .poster-card-tag, body.home-page .ranking-card-tag { padding: 2px 9px; @@ -911,6 +920,21 @@ line-height: 20px; } +/* 集数占了标签行右侧:放不下的标签整颗换行并被隐藏,而不是每颗都截成省略号 */ +.home-page .card-grid .poster-card-tags { + flex-wrap: wrap; + height: 26px; +} + +.home-page .poster-card-episode { + flex-shrink: 0; + margin-left: 8px; + color: rgba(255, 255, 255, 0.55); + font-size: 14px; + line-height: 20px; + white-space: nowrap; +} + .home-page .poster-card-tag, .home-page .ranking-card-tag { width: max-content; @@ -1287,6 +1311,15 @@ line-height: 18px; } + .home-page .card-grid .poster-card-tags { + height: 24px; + } + + .home-page .poster-card-episode { + font-size: 12px; + line-height: 18px; + } + .home-page .episode-badge, .home-page .ranking-episode-badge { right: 8px; @@ -3451,3 +3484,13 @@ body.site-shell .theme-index-card:focus-visible > img { animation: none; } } + +/* 跑马灯里的官方地址链接 */ +.home-page .home-announcement-link { + color: #EC237F; + text-decoration: none; +} + +.home-page .home-announcement-link:hover { + text-decoration: underline; +} diff --git a/app/static/images/header-download.svg b/app/static/images/header-download.svg new file mode 100644 index 0000000..0fc8ac2 --- /dev/null +++ b/app/static/images/header-download.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/static/js/pages/detail.js b/app/static/js/pages/detail.js index 9965ab2..8663d7f 100644 --- a/app/static/js/pages/detail.js +++ b/app/static/js/pages/detail.js @@ -1,9 +1,9 @@ (function () { - var section = document.querySelector(".detail-episodes"); + var section = document.querySelector("[data-dh-episodes]"); if (!section) return; - var ranges = section.querySelectorAll(".detail-episode-range"); - var episodes = section.querySelectorAll(".detail-episode-list .detail-episode"); + var ranges = section.querySelectorAll(".dh-range"); + var episodes = section.querySelectorAll(".dh-ep"); if (!episodes.length) return; if (!ranges.length) return; @@ -17,7 +17,7 @@ function activate(btn) { ranges.forEach(function (item) { - item.classList.toggle("detail-episode-range--active", item === btn); + item.classList.toggle("is-active", item === btn); }); applyRange(Number(btn.dataset.rangeStart), Number(btn.dataset.rangeEnd)); } @@ -28,10 +28,29 @@ }); }); - var active = section.querySelector(".detail-episode-range--active") || ranges[0]; + var active = section.querySelector(".dh-range.is-active") || ranges[0]; activate(active); })(); +// 简介超出行数时显示「展开 / 收起」 +(function () { + var intro = document.querySelector("[data-dh-intro]"); + var toggle = document.querySelector("[data-dh-intro-toggle]"); + if (!intro || !toggle) return; + + function sync() { + if (intro.classList.contains("is-expanded")) return; + toggle.hidden = intro.scrollHeight <= intro.clientHeight + 1; + } + + toggle.addEventListener("click", function () { + var expanded = intro.classList.toggle("is-expanded"); + toggle.textContent = expanded ? "收起" : "展开"; + }); + window.addEventListener("resize", sync); + sync(); +})(); + (function () { var shareBtns = document.querySelectorAll("[data-detail-share]"); if (!shareBtns.length) return; diff --git a/app/static/js/pages/footer.js b/app/static/js/pages/footer.js index f6dbd93..ae2cd0a 100644 --- a/app/static/js/pages/footer.js +++ b/app/static/js/pages/footer.js @@ -5,4 +5,41 @@ window.scrollTo({ top: 0, behavior: "smooth" }); }); }); + + // 页脚进入视口后,把悬浮按钮(下载 App / 回到顶部)顶到页脚上方,避免遮住页脚内容。 + var footers = document.querySelectorAll(".footer-box, .home-mobile-footer"); + if (!footers.length) return; + var root = document.documentElement; + var ticking = false; + var lastLift = -1; + + function visibleFooter() { + for (var i = 0; i < footers.length; i++) { + if (footers[i].offsetHeight > 0) return footers[i]; + } + return null; + } + + function update() { + ticking = false; + var footer = visibleFooter(); + var lift = 0; + if (footer) { + var top = footer.getBoundingClientRect().top; + lift = Math.max(0, Math.round((window.innerHeight || 0) - top)); + } + if (lift === lastLift) return; + lastLift = lift; + root.style.setProperty("--footer-lift", lift + "px"); + } + + function schedule() { + if (ticking) return; + ticking = true; + window.requestAnimationFrame(update); + } + + window.addEventListener("scroll", schedule, { passive: true }); + window.addEventListener("resize", schedule); + schedule(); })(); diff --git a/app/static/js/pages/header.js b/app/static/js/pages/header.js index 33e0037..4ec2c8f 100644 --- a/app/static/js/pages/header.js +++ b/app/static/js/pages/header.js @@ -108,7 +108,7 @@ el = el.parentElement; } if (!el || !el.closest) return; - var tag = el.closest(".poster-card-tag[data-tag-href], .ranking-card-tag[data-tag-href], .detail-tag[data-tag-href]"); + var tag = el.closest(".poster-card-tag[data-tag-href], .ranking-card-tag[data-tag-href]"); if (!tag) return; var href = tag.getAttribute("data-tag-href"); if (!href) return; diff --git a/app/templates/base/analytics.html b/app/templates/base/analytics.html index 51cf12d..300e68c 100644 --- a/app/templates/base/analytics.html +++ b/app/templates/base/analytics.html @@ -6,18 +6,18 @@ m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a) - })(window, document,'script','https://mc.yandex.ru/metrika/tag.js?id={{if .isNavPage}}112390883{{else}}112387687{{end}}', 'ym'); + })(window, document,'script','https://mc.yandex.ru/metrika/tag.js?id={{if .isNavPage}}112390883{{else}}112967594{{end}}', 'ym'); - ym({{if .isNavPage}}112390883{{else}}112387687{{end}}, 'init', {ssr:true, webvisor:true, clickmap:true, ecommerce:"dataLayer", referrer: document.referrer, url: location.href, accurateTrackBounce:true, trackLinks:true}); + ym({{if .isNavPage}}112390883{{else}}112967594{{end}}, 'init', {ssr:true, webvisor:true, clickmap:true, ecommerce:"dataLayer", referrer: document.referrer, url: location.href, accurateTrackBounce:true, trackLinks:true}); - + {{end}} diff --git a/app/templates/base/downloadAppFloat.html b/app/templates/base/downloadAppFloat.html index 6793abf..737def0 100644 --- a/app/templates/base/downloadAppFloat.html +++ b/app/templates/base/downloadAppFloat.html @@ -1,5 +1,5 @@ {{define "downloadAppFloat"}} {{if .appConfig.AppAddr}} - + +