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}}
-
+
+